1. Introducción
En Colombia, el Registro Único Nacional de Tránsito (RUNT), funciona como una gran base de datos centralizada en la que se almacena información sobre todos los vehículos del país, los conductores, los seguros de estos, las infracciones entre muchos más. El presente reporte asume el ejercicio de crear un modelo estadístico para predecir el número de vehículos registrados diariamente en el RUNT durante el año 2018.
2. Datos
La base de datos inicial, registro_autos_entrenamiento, en formato .XLSX, contiene los registros diarios de autos en el RUNT, desde las fechas 1/01/2012 hasta 31/12/2017. Se usaron los software Excel y R para el procesamiento de la base de datos. Inicialmente, la base de datos contiene 2192 observaciones y 2 variables. Las variables Fecha y Unidades. Una vista previa de las primeras observaciones de la base de datos es la siguiente:
Tabla 1: Base de Datos Inicial
|
Fecha
|
Unidades
|
|
2012-01-01
|
0
|
|
2012-01-02
|
188
|
|
2012-01-03
|
482
|
|
2012-01-04
|
927
|
|
2012-01-05
|
1159
|
Con el objetivo de plantear un modelo más interesante, se propone la creación de cinco nuevas variables que permitirán desarrollar un modelo predictivo que arroje más información en sus resultados teniendo en cuenta el año, mes, días del mes, días de la semana y si el día tuvo o no alguna festividad. Las variables creadas son:
YEAR: año del registro.
DIA: día del mes del registro.
MES: mes del registro.
DIA_SEMANA: día del registro (lunes a domingo).
FESTIVIDAD: indica si el registro se realizó en alguna de las siguientes fechas especiales:
*a_nuevo: 1 de enero de cada año.
*día_habil: día en donde no es festivo no hay festividades.
*festivo: día festivo.
*sem_santa: día de semana santa, de sábado a domingo.
*madres: día de las madres.
*brujas: día de las brujas, 31 de octubre.
*navidad: 25 de diciembre.
*a_viejo: 31 de diciembre.
Todas las nuevas variables exceptuando FESTIVIDAD se obtienen de la variable Fecha. En el caso de la variable FESTIVIDAD, se obtiene a través una base de datos externa que se adiciona a la base de análisis original y abarca los días feriados en Colombia desde 2012 hasta 2018.
Para efectos practicos en la sección de modelo predictivo, se exportan dos bases de datos:
La primera, con 7 variables y 2192 observaciones que van desde el año 2012 hasta el año 2017.
La segunda, con 6 variables y 2575 observaciones que van desde el año 2012 hasta el año 2018. Esta base de datos no contiene la variable UNIDADES debido a que se borró intencionalmente para luego rellenarla con la predicción del modelo.
3. Análisis descriptivo
Aprecia que gradualmente van disminuyendo los registros diarios, se registran cada vez más vehículos los últimos días de cada mes durante todo el año, el promedio diario de vehículos registrados parece mantenerse ya que el último día del mes compensa la falta de registros del resto de días pero en realidad el registro de vehículos si disminuye año por año ya que esta compensación no es suficiente Además, en esta grafica se puede apreciar una gran cantidad de días en los cuales no se registran vehículos, en los cuales resaltar cada 1 de enero y 25 de diciembre.

Podemos apreciar que de miércoles a viernes se hace la mayoría de los registros, con el viernes como el día de la semana con mayor cantidad de vehículos registrados, se puede observar como hay menos registros en los fines de semana en comparación a los días de la semana, ademas de que el domingo es el día con menor cantidad de registros de vehículos(Nisbet, Miner, & Yale, 2018).

Diciembre es el mes con mayor cantidad de registros de vehículos y enero el mes con menor cantidad de registros, ignorando estos dos datos y solo tomando del mes febrero al mes de noviembre los registros de vehículos en el RUNT están entre 130000 y 150000, variando por unos cuantos miles de vehículos

El año 2014 es el año con más vehículos registrados, ignorando este dato podría decirse que cada año se registran menos vehículos.


A comparación de los días hábiles, la suma de vehículos registrado en los días festivos y de festividades es muy poca. Los dos unicos días que no presentan ningún registro de vehículos en el RUNT de 2012 a 2017 son año nuevo(primero de enero) y navidad(25 de diciembre).
Siendo muchos menos los días festivos comunes que los días celebración de la semana santa se registran muchos más vehículos en semana santa, puede hacerse una comparación parecida con el día de madres y haloween, siendo solo un día hay una enorme diferencia en los registros siendo el día de madres 2 registros al ser día domingo y en haloween más de 11mil al ser casi siempre un día normal en semana(Leif, 2017).
4. Modelo Predictivo
Se lleva a cabo un Modelo lineal generalizado con la familia de distribución Poisson. Es decir, se utiliza un modelo de regresión Poisson ya que se emplea para modelar datos de recuento y tablas de contingencia, principalmente. Así, la salida Y o “recuento” es un valor que sigue la distribución de Poisson. Y cabe anotar que el logaritmo de los valores esperados (la media) pueden modelarse en forma lineal mediante algunos parámetros desconocidos(Johnson, 2021).
Es por esta razón que para transformar la relación no lineal en forma lineal, se utiliza una función de enlace que es el logaritmo de la regresión de Poisson. Por tanto, un modelo de regresión de Poisson también se denomina modelo Log-Lineal.
La forma general del modelo de regresión de Poisson es:
\(log(y) = \alpha+\beta_1X_1+\beta_2X_2+...+\beta_pX_p+\epsilon\)
donde,
\(y\) es la variable respuesta (variable dependiente), que sería “UNIDADES”.
\(\alpha\) y \(\beta\) son coeficientes numéricos, \(\alpha\) es la intersección que es equivalente a \(\beta_0\)
\(x\) es la variable predictora/explicativa, que en este caso serían las variables explicativas (variables independientes): FECHA, YEAR, DIA, MES, DIA_SEMANA, y FESTIVIDAD.
\(\epsilon\) es el término de error.
La media \(\mu\) para este modelo sería:
\(E(X)\) = \(\mu\)
Para este tipo de regresión se relaciona la media y la varianza de la siguiente forma:
\(var(X) = \sigma^2E(X)\)
donde,
- \(\sigma^2\) representa el parámetro de dispersión.
Nota: Si \(\sigma^2\) llega a ser igual a cero se presenta la siguiente relación \(var(X) = E(X)\) que implica que la media y la varianza para el modelo de Poisson se ajuste completamente. Asimismo, si llega a ser la varianza mayor a la media, se presentaría sobredispersión (\(\sigma^2\) mayor que 1). Y finalmente, si \(\sigma^2\) es menor que 1, tiene lugar a la subdispersión(James, Wittem, Hastie, & Tibshirani, 2013).
Donde se utilizarán los años desde 2012 hasta 2016 para la creación del modelo.
Se procede a hacer lectura de la base de datos en donde se almacenarán todas las predicciones, según el modelo anterior.
Se muestran las primeras 10 observaciones de las predicciones dadas. Almacenadas en la variable NRO_TOTAL_VEHICULOS, que representa el número de vehículos registrados.
Tabla 2:Primeras 10 observaciones de las predicciones
|
FECHA
|
YEAR
|
DIA
|
MES
|
DIA_SEMANA
|
FESTIVIDAD
|
Nro_Vehiculos
|
NRO_TOTAL_VEHICULOS
|
|
2012-01-01
|
2012
|
1
|
1
|
domingo
|
a_nuevo
|
0
|
0
|
|
2012-01-02
|
2012
|
2
|
1
|
lunes
|
dia_habil
|
656
|
656
|
|
2012-01-03
|
2012
|
3
|
1
|
martes
|
dia_habil
|
828
|
828
|
|
2012-01-04
|
2012
|
4
|
1
|
miercoles
|
dia_habil
|
949
|
949
|
|
2012-01-05
|
2012
|
5
|
1
|
jueves
|
dia_habil
|
972
|
972
|
|
2012-01-06
|
2012
|
6
|
1
|
viernes
|
dia_habil
|
1012
|
1012
|
|
2012-01-07
|
2012
|
7
|
1
|
sabado
|
dia_habil
|
300
|
300
|
|
2012-01-08
|
2012
|
8
|
1
|
domingo
|
dia_habil
|
3
|
3
|
|
2012-01-09
|
2012
|
9
|
1
|
lunes
|
festivo
|
41
|
41
|
|
2012-01-10
|
2012
|
10
|
1
|
martes
|
dia_habil
|
911
|
911
|
Luego, se observa el MSE, MAE y \(R^2\) para los datos de entrenamiento (que posee los días comprendidos entre el 01/01/2012 y el 31/12/2016).
## [1] "MSE: 55163.222770, MAE: 150.340449, R2 Score: 0.818973"
Por consiguiente, se observa el MSE, MAE y \(R^2\) para los datos de validación (que posee los días comprendidos entre el 01/01/2017 y el 31/12/2017).
## [1] "MSE: 82417.772603, MAE: 166.572603, R2 Score: 0.704797"
También se calcula el MSE, MAE y \(R^2\) para el primer semestre de 2017.
## [1] "MSE: 68703.745856, MAE: 145.447514, R2 Score: 0.705406"
Luego, el \(R^2\) del conjunto de validación que comprende el primer semestre del 2018 (01/01/2018 y el 30/06/2018), no se calcula ya que para el 2018 no se obtienen observaciones reales para dicho año.
A continuación, se aprecian las primeras 10 y las últimas 10 observaciones del primer archivo plano (01/01/2012 y el 31/12/2017), que contiene 1827 observaciones con dos variables.
Tabla 3: Primeras 10 observaciones del primer archivo plano
|
FECHA
|
NRO_TOTAL_VEHICULOS
|
|
2012-01-01
|
0
|
|
2012-01-02
|
656
|
|
2012-01-03
|
828
|
|
2012-01-04
|
949
|
|
2012-01-05
|
972
|
|
2012-01-06
|
1012
|
|
2012-01-07
|
300
|
|
2012-01-08
|
3
|
|
2012-01-09
|
41
|
|
2012-01-10
|
911
|
Tabla 4: Ultimas 10 observaciones del primer archivo plano
|
FECHA
|
NRO_TOTAL_VEHICULOS
|
|
2017-12-22
|
1338
|
|
2017-12-23
|
396
|
|
2017-12-24
|
4
|
|
2017-12-25
|
0
|
|
2017-12-26
|
1204
|
|
2017-12-27
|
1379
|
|
2017-12-28
|
1413
|
|
2017-12-29
|
1471
|
|
2017-12-30
|
435
|
|
2017-12-31
|
1
|
Después, se pueden observar las primeras 10 y las últimas 10 observaciones del segundo archivo plano, el cual contiene el primer semestre de 2018 (01/01/2018 y el 30/06/2018). que posee 181 observaciones con dos variables.
Tabla 5: Primeras 10 observaciones del segundo archivo plano
|
FECHA
|
NRO_TOTAL_VEHICULOS
|
|
2018-01-01
|
0
|
|
2018-01-02
|
611
|
|
2018-01-03
|
700
|
|
2018-01-04
|
717
|
|
2018-01-05
|
746
|
|
2018-01-06
|
221
|
|
2018-01-07
|
2
|
|
2018-01-08
|
30
|
|
2018-01-09
|
671
|
|
2018-01-10
|
770
|
Tabla 6: Ultimas 10 observaciones del segundo archivo plano
|
FECHA
|
NRO_TOTAL_VEHICULOS
|
|
2018-06-21
|
1082
|
|
2018-06-22
|
1127
|
|
2018-06-23
|
334
|
|
2018-06-24
|
3
|
|
2018-06-25
|
803
|
|
2018-06-26
|
1014
|
|
2018-06-27
|
1162
|
|
2018-06-28
|
1190
|
|
2018-06-29
|
1239
|
|
2018-06-30
|
367
|
Nota: Los dos archivos planos en formato .csv se pueden observar en el repositorio de Github:
https://github.com/daatoroag/PROYECTOS-TAE/tree/main/Segunda%20entrega
5. Referencias
B, Leif. (2017). Applied Underwater Acoustics (Pages 889-947). Ámsterdam: Elsevier.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2013). An Introduction to Statistical Learning. New York: Springer.
Johnson, D. (2021). GLM in R: Generalized Linear Model with Example. Guru99. Obtenido de https://www.guru99.com/r-generalized-linear-model.html
Nisbet, R., Miner, G., & Yale, K. (2018). Handbook of Statistical Analysis and Data Mining Applications (Second Edition). Ámsterdam: Elsevier.
LS0tDQp0aXRsZTogIlByZWRpY2Npw7NuIGRlbCBuw7ptZXJvIGRlIHZlaMOtY3Vsb3MgcmVnaXN0cmFkb3MgZW4gZWwgc2lzdGVtYSBkZSB0csOhbnNpdG8gbmFjaW9uYWwiDQphdXRob3I6ICJKZXN1cyBEYXZpZCBTYW50b3MgTW9udGVzLCBLbGVpZGVyIFN0aXZlbiBWw6FzcXVleiBHw7NtZXosIERhbmllbCBBbmRyw6lzIFRvcm8gQWd1aXJyZSwgSmVsc3NpbiBEb25ub3ZhbiBSb2JsZWRvIE1lbmEsIEp1YW4gRXN0ZWJhbiBDYXJ2YWphbCBNb2xpbmEuIg0KZGF0ZTogJzE3LzAxLzIwMjInDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGFwc2U6IGZhbHNlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZScsIGVjaG89RiAgfQ0KI0xpYnJlcmlhcw0KbGlicmFyeShkdW1taWVzKTtsaWJyYXJ5KHN0cmluZ3IpO2xpYnJhcnkocmVhZHhsKTtsaWJyYXJ5KHNmKQ0KbGlicmFyeShkcGx5cik7bGlicmFyeShsdWJyaWRhdGUpO2xpYnJhcnkoZ2dwbG90Mik7bGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGNhcik7bGlicmFyeShNTG1ldHJpY3MpO2xpYnJhcnkod29yZGNsb3VkKTtsaWJyYXJ5KGdwbG90cykNCmxpYnJhcnkoUi51dGlscyk7bGlicmFyeSh0bSk7bGlicmFyeShEZXNjVG9vbHMpO2xpYnJhcnkocmFzdGVyKQ0KbGlicmFyeShtY2x1c3QpO2xpYnJhcnkocmdkYWwpO2xpYnJhcnkocmFzdGVyKTtsaWJyYXJ5KGdlb3NwaGVyZSkNCmxpYnJhcnkoTmJDbHVzdCk7bGlicmFyeShmYWN0b2V4dHJhKTtsaWJyYXJ5KHZlZ2FuKTtsaWJyYXJ5KHFwY1IpDQpsaWJyYXJ5KGxlYWZsZXQpO2xpYnJhcnkocGxvdGx5KTtsaWJyYXJ5KHN0cmluZ2kpO2xpYnJhcnkocGx5cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KYGBgDQoNCg0KIyMgMS4gSW50cm9kdWNjacOzbg0KDQpFbiBDb2xvbWJpYSwgZWwgUmVnaXN0cm8gw5puaWNvIE5hY2lvbmFsIGRlIFRyw6Fuc2l0byBbKFJVTlQpXShodHRwczovL3NlcnZpY2lvc2RldHJhbnNpdG8uY29tL2luZGV4LnBocC9ub3RpY2lhcy8xMzktcXVlLWVzLXktY29tby1mdW5jaW9uYS1lbC1ydW50KSwgZnVuY2lvbmEgY29tbyB1bmEgZ3JhbiBiYXNlIGRlIGRhdG9zIGNlbnRyYWxpemFkYSBlbiBsYSBxdWUgc2UgYWxtYWNlbmEgaW5mb3JtYWNpw7NuIHNvYnJlIHRvZG9zIGxvcyB2ZWjDrWN1bG9zIGRlbCBwYcOtcywgbG9zIGNvbmR1Y3RvcmVzLCBsb3Mgc2VndXJvcyBkZSBlc3RvcywgbGFzIGluZnJhY2Npb25lcyBlbnRyZSBtdWNob3MgbcOhcy4gRWwgcHJlc2VudGUgcmVwb3J0ZSBhc3VtZSBlbCBlamVyY2ljaW8gZGUgY3JlYXIgdW4gbW9kZWxvIGVzdGFkw61zdGljbyBwYXJhIHByZWRlY2lyIGVsIG7Dum1lcm8gZGUgdmVow61jdWxvcyByZWdpc3RyYWRvcyBkaWFyaWFtZW50ZSBlbiBlbCBSVU5UIGR1cmFudGUgZWwgYcOxbyAyMDE4Lg0KDQojIyAyLiBEYXRvcyANCg0KDQpMYSBiYXNlIGRlIGRhdG9zIGluaWNpYWwsIHJlZ2lzdHJvX2F1dG9zX2VudHJlbmFtaWVudG8sIGVuIGZvcm1hdG8gLlhMU1gsIGNvbnRpZW5lIGxvcyByZWdpc3Ryb3MgZGlhcmlvcyBkZSBhdXRvcyBlbiBlbCBSVU5ULCBkZXNkZSBsYXMgZmVjaGFzIDEvMDEvMjAxMiBoYXN0YSAzMS8xMi8yMDE3LiBTZSB1c2Fyb24gbG9zIHNvZnR3YXJlIEV4Y2VsIHkgUiBwYXJhIGVsIHByb2Nlc2FtaWVudG8gZGUgbGEgYmFzZSBkZSBkYXRvcy4NCkluaWNpYWxtZW50ZSwgbGEgYmFzZSBkZSBkYXRvcyBjb250aWVuZSAyMTkyIG9ic2VydmFjaW9uZXMgeSAyIHZhcmlhYmxlcy4gTGFzIHZhcmlhYmxlcyBgRmVjaGFgIHkgYFVuaWRhZGVzYC4gIFVuYSB2aXN0YSBwcmV2aWEgZGUgbGFzIHByaW1lcmFzIG9ic2VydmFjaW9uZXMgZGUgbGEgYmFzZSBkZSBkYXRvcyBlcyBsYSBzaWd1aWVudGU6DQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89Rn0NCg0KZGF0b3MgPC0gcmVhZF9leGNlbCgicmVnaXN0cm9zX2F1dG9zX2VudHJlbmFtaWVudG8ueGxzeCIpICNjYXJnYXIgZGF0b3MNCg0KdGFibGExIDwtIGhlYWQoZGF0b3MsIG49NSkNCg0Ka2JsKHRhYmxhMSxjYXB0aW9uID0gIlRhYmxhIDE6IEJhc2UgZGUgRGF0b3MgSW5pY2lhbCIpICU+JSBrYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiY29uZGVuc2VkIiwiSE9MRF9wb3NpdGlvbiIpLCBwb3NpdGlvbiA9ICJjZW50ZXIiLGZ1bGxfd2lkdGggPSBGQUxTRSkNCg0KYGBgDQoNCkNvbiBlbCBvYmpldGl2byBkZSBwbGFudGVhciB1biBtb2RlbG8gbcOhcyBpbnRlcmVzYW50ZSwgc2UgcHJvcG9uZSBsYSBjcmVhY2nDs24gZGUgY2luY28gbnVldmFzIHZhcmlhYmxlcyBxdWUgcGVybWl0aXLDoW4gZGVzYXJyb2xsYXIgdW4gbW9kZWxvIHByZWRpY3Rpdm8gcXVlIGFycm9qZSBtw6FzIGluZm9ybWFjacOzbiBlbiBzdXMgcmVzdWx0YWRvcyB0ZW5pZW5kbyBlbiBjdWVudGEgZWwgYcOxbywgbWVzLCBkw61hcyBkZWwgbWVzLCBkw61hcyBkZSBsYSBzZW1hbmEgeSBzaSBlbCBkw61hIHR1dm8gbyBubyBhbGd1bmEgZmVzdGl2aWRhZC4gTGFzIHZhcmlhYmxlcyBjcmVhZGFzIHNvbjoNCg0KYFlFQVJgOiBhw7FvIGRlbCByZWdpc3Ryby4gDQoNCmBESUFgOiBkw61hIGRlbCBtZXMgZGVsIHJlZ2lzdHJvLg0KDQpgTUVTYDogbWVzIGRlbCByZWdpc3Ryby4NCg0KYERJQV9TRU1BTkFgOiBkw61hIGRlbCByZWdpc3RybyAobHVuZXMgYSBkb21pbmdvKS4NCg0KYEZFU1RJVklEQURgOiBpbmRpY2Egc2kgZWwgcmVnaXN0cm8gc2UgcmVhbGl6w7MgZW4gYWxndW5hIGRlIGxhcyBzaWd1aWVudGVzIGZlY2hhcyBlc3BlY2lhbGVzOg0KDQoqYV9udWV2bzogMSBkZSBlbmVybyBkZSBjYWRhIGHDsW8uDQoNCipkw61hX2hhYmlsOiBkw61hIGVuIGRvbmRlIG5vIGVzIGZlc3Rpdm8gbm8gaGF5IGZlc3RpdmlkYWRlcy4NCg0KKmZlc3Rpdm86IGTDrWEgZmVzdGl2by4NCg0KKnNlbV9zYW50YTogZMOtYSBkZSBzZW1hbmEgc2FudGEsIGRlIHPDoWJhZG8gYSBkb21pbmdvLg0KDQoqbWFkcmVzOiBkw61hIGRlIGxhcyBtYWRyZXMuDQoNCipicnVqYXM6IGTDrWEgZGUgbGFzIGJydWphcywgMzEgZGUgb2N0dWJyZS4NCg0KKm5hdmlkYWQ6IDI1IGRlIGRpY2llbWJyZS4NCg0KKmFfdmllam86IDMxIGRlIGRpY2llbWJyZS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GfQ0KDQpkYXRvcyRGZWNoYSA8LSBhcy5EYXRlKGRhdG9zJEZlY2hhLCBmb3JtYXQ9IiVkLyVtLyVZIikgI2Zvcm1hdG8gZmVjaGENCg0KY2xhc3MoZGF0b3MkRmVjaGEpDQoNCg0KI2FncmVnYW5kbyBudWV2YXMgdmFyaWFibGVzDQoNCmRhdG9zJHllYXIgPC0geWVhcihkYXRvcyRGZWNoYSkNCmRhdG9zJGRpYSA8LSBkYXkoZGF0b3MkRmVjaGEpDQpkYXRvcyRtZXMgPC0gbW9udGgoZGF0b3MkRmVjaGEpDQpkYXRvcyRkaWFfc2VtYW5hIDwtIHdlZWtkYXlzKGRhdG9zJEZlY2hhKQ0KDQoNCiNncsOhZmljYSBkZSB1bmlkYWRlcyB2cyBkw61hX3NlbWFuYQ0KDQoNCiNkYXRvcyRkaWFfc2VtYW5hIDwtIGFzLmZhY3RvcihkYXRvcyRkaWFfc2VtYW5hKSAjZGlhIHNlbWFuYSBjb21vIGZhY3Rvcg0KDQojQWdyZWdhbmRvIGZlY2hhcyBlc3BlY2lhbGVzDQoNCg0KI3F1aXRhciB0aWxkZXMNCg0KDQpkYXRvcyRkaWFfc2VtYW5hIDwtIHRvdXBwZXIoc3RyaV90cmFuc19nZW5lcmFsKGRhdG9zJGRpYV9zZW1hbmEsICJMYXRpbi1BU0NJSSIpKQ0KDQojTWF5dXNjdWxhcw0KDQpkYXRvcyA8LSBwbHlyOjpyZW5hbWUoZGF0b3MsICBjKCJGZWNoYSI9IkZFQ0hBIiwiVW5pZGFkZXMiPSJVTklEQURFUyIsInllYXIiPSJZRUFSIiwiZGlhIj0iRElBIiwibWVzIj0iTUVTIiwiZGlhX3NlbWFuYSI9IkRJQV9TRU1BTkEiKSkNCg0KDQojbWludXNjdWxhcyBESUFfU0VNQU5BDQoNCg0KDQpkYXRvcyRESUFfU0VNQU5BIDwtIHN0cl90b19sb3dlcihkYXRvcyRESUFfU0VNQU5BKQ0KDQpgYGANCg0KVG9kYXMgbGFzIG51ZXZhcyB2YXJpYWJsZXMgZXhjZXB0dWFuZG8gYEZFU1RJVklEQURgIHNlIG9idGllbmVuIGRlIGxhIHZhcmlhYmxlIGBGZWNoYWAuIEVuIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgYEZFU1RJVklEQURgLCBzZSBvYnRpZW5lIGEgdHJhdsOpcyB1bmEgYmFzZSBkZSBkYXRvcyBleHRlcm5hIHF1ZSBzZSBhZGljaW9uYSBhIGxhIGJhc2UgZGUgYW7DoWxpc2lzIG9yaWdpbmFsIHkgYWJhcmNhIGxvcyBkw61hcyBmZXJpYWRvcyBlbiBDb2xvbWJpYSBkZXNkZSAyMDEyIGhhc3RhIDIwMTguICANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GfQ0KDQojIHVuaXIgbGFzIGZlY2hhcyBlc3BlY2lhbGVzIGEgZGF0b3MsIGxvcyBxdWUgbm8gc29uIGZlY2hhcyBlc3BlY2lhbGVzIGxvcyBwb25lIGNvbW8gTkENCg0KZmVzdGl2b3MgPC0gcmVhZF9leGNlbCgiZmVzdGl2b3MueGxzeCIpDQoNCg0KZmVzdGl2b3MkRkVDSEEgPC0gYXMuRGF0ZShmZXN0aXZvcyRGRUNIQSwgZm9ybWF0PSIlZC8lbS8lWSIpICNmb3JtYXRvIGZlY2hhDQoNCg0KI3VuaWVuZG8gYmFzZXMNCg0KZGF0b3MyIDwtIG1lcmdlKHggPSBkYXRvcywgeSA9IGZlc3Rpdm9zLCBieSA9ICJGRUNIQSIsIGFsbC54ID0gVCkNCmRhdG9zMiRGRVNUSVZJREFEW2lzLm5hKGRhdG9zMiRGRVNUSVZJREFEKV0gPC0gImRpYV9oYWJpbCINCg0KI21pbnVzY3VsYXMgRElBX1NFTUFOQQ0KDQoNCg0KZGF0b3MyJEZFU1RJVklEQUQgPC0gc3RyX3RvX2xvd2VyKGRhdG9zMiRGRVNUSVZJREFEKQ0KDQoNCg0KZGF0b3MyJEZFU1RJVklEQUQgPC0gYXMuZmFjdG9yKGRhdG9zMiRGRVNUSVZJREFEKQ0KDQpzdW1tYXJ5KGRhdG9zMiRGRVNUSVZJREFEKQ0KDQoNCmBgYA0KDQpQYXJhIGVmZWN0b3MgcHJhY3RpY29zIGVuIGxhIHNlY2Npw7NuIGRlIG1vZGVsbyBwcmVkaWN0aXZvLCBzZSBleHBvcnRhbiBkb3MgYmFzZXMgZGUgZGF0b3M6DQoNCioqTGEgcHJpbWVyYSoqLCBjb24gNyB2YXJpYWJsZXMgeSAyMTkyIG9ic2VydmFjaW9uZXMgcXVlIHZhbiBkZXNkZSBlbCBhw7FvIDIwMTIgaGFzdGEgZWwgYcOxbyAyMDE3Lg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzID0gJ2hpZGUnLCBlY2hvPUZ9DQojQkFTRSAxDQpzYXZlKGRhdG9zMiwgZmlsZSA9ICJkYXRvcy5SRGF0YSIpICNyZ2RhdGENCndyaXRlLmNzdihkYXRvczIsICJkYXRvcy5jc3YiKSAgICAgICAgI2Nzdg0KDQpgYGANCg0KKipMYSBzZWd1bmRhKiosIGNvbiA2IHZhcmlhYmxlcyB5IDI1NzUgb2JzZXJ2YWNpb25lcyBxdWUgdmFuIGRlc2RlIGVsIGHDsW8gMjAxMiBoYXN0YSBlbCBhw7FvIDIwMTguIEVzdGEgYmFzZSBkZSBkYXRvcyBubyBjb250aWVuZSBsYSB2YXJpYWJsZSBgVU5JREFERVNgIGRlYmlkbyBhIHF1ZSBzZSBib3Jyw7MgaW50ZW5jaW9uYWxtZW50ZSBwYXJhIGx1ZWdvIHJlbGxlbmFybGEgY29uIGxhIHByZWRpY2Npw7NuIGRlbCBtb2RlbG8uDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSAnaGlkZScsIGVjaG89Rn0NCg0KIyBzZSBlbGFib3JhIGRpcmVjdGFtZW50ZSBlbiBleGNlbCwgc2ltcGxlbWVudGUgYWdyZWdhbmRvIGVsIGHDsW8gMjAxOCBhIGxhIGJhc2UgZGUgZGF0b3NfMSwgYm9ycmFuZG8gbGEgY29sdW1uYSB1bmlkYWRlcyB5IGNvbXBsZXRhbmRvIGxhcyBvdHJhcyBjb2x1bW5hcy4NCg0KYGBgDQoNCg0KIyMgMy4gQW7DoWxpc2lzIGRlc2NyaXB0aXZvDQoNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGdncHVicikNCmRlc2NyaXB0aXZvIDwtIGRhdG9zMg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZ9DQpwbG90X2x5KGRhdGEgPSBkZXNjcmlwdGl2bywgeCA9IH5GRUNIQSwgeSA9IH5VTklEQURFUywNCiAgICAgICAgdHlwZSA9ICJzY2F0dGVyIiwgbW9kZSA9ICJsaW5lcyIsIHNwbGl0ID0gfllFQVIsDQogICAgICAgIGxpbmUgPSBsaXN0KHdpZHRoID0gMSkpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAnR3JhZmljbyAxOiBSZWdpc3Ryb3MgZGUgdmVoaWN1bG9zIGRpYXJpb3MgZW4gZWwgUlVOVCBkZSAyMDEyLTIwMTcnLA0KICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQcOxbyIpLA0KICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTsO6bWVybyBkZSB2ZWhpY3Vsb3MiKSkNCmBgYA0KDQpBcHJlY2lhIHF1ZSBncmFkdWFsbWVudGUgdmFuIGRpc21pbnV5ZW5kbyBsb3MgcmVnaXN0cm9zIGRpYXJpb3MsIHNlIHJlZ2lzdHJhbiBjYWRhIHZleiBtw6FzIHZlaMOtY3Vsb3MgbG9zIMO6bHRpbW9zIGTDrWFzIGRlIGNhZGEgbWVzIGR1cmFudGUgdG9kbyBlbCBhw7FvLCBlbCBwcm9tZWRpbyBkaWFyaW8gZGUgdmVow61jdWxvcyByZWdpc3RyYWRvcyBwYXJlY2UgbWFudGVuZXJzZSB5YSBxdWUgZWwgw7psdGltbyBkw61hIGRlbCBtZXMgY29tcGVuc2EgbGEgZmFsdGEgZGUgcmVnaXN0cm9zIGRlbCByZXN0byBkZSBkw61hcyBwZXJvIGVuIHJlYWxpZGFkIGVsIHJlZ2lzdHJvIGRlIHZlaMOtY3Vsb3Mgc2kgZGlzbWludXllIGHDsW8gcG9yIGHDsW8geWEgcXVlIGVzdGEgY29tcGVuc2FjacOzbiBubyBlcyBzdWZpY2llbnRlDQpBZGVtw6FzLCBlbiBlc3RhIGdyYWZpY2Egc2UgcHVlZGUgYXByZWNpYXIgdW5hIGdyYW4gY2FudGlkYWQgZGUgZMOtYXMgZW4gbG9zIGN1YWxlcyBubyBzZSByZWdpc3RyYW4gdmVow61jdWxvcywgZW4gbG9zIGN1YWxlcyByZXNhbHRhciBjYWRhIDEgZGUgZW5lcm8geSAyNSBkZSBkaWNpZW1icmUuDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KZGVzY3JpcHRpdm8kRElBX1NFTUFOQSA8LSBhcy5mYWN0b3IoZGVzY3JpcHRpdm8kRElBX1NFTUFOQSkNCmRlc2NyaXB0aXZvJE1FUyA8LSBhcy5mYWN0b3IoZGVzY3JpcHRpdm8kTUVTKQ0KZGVzY3JpcHRpdm8kRElBIDwtIGFzLmZhY3RvcihkZXNjcmlwdGl2byRESUEpDQpkZXNjcmlwdGl2byRZRUFSIDwtIGFzLmZhY3RvcihkZXNjcmlwdGl2byRZRUFSKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89Rn0NCmRlc2NyaXB0aXZvJERJQV9TRU1BTkEgPC0gb3JkZXJlZChkZXNjcmlwdGl2byRESUFfU0VNQU5BLCBsZXZlbHMgPSBjKCJsdW5lcyIsIm1hcnRlcyIsIm1pZXJjb2xlcyIsImp1ZXZlcyIsInZpZXJuZXMiLCJzYWJhZG8iLCJkb21pbmdvIikpDQoNCg0KdG90YWxzNSA8LSBkZXNjcmlwdGl2byAlPiUNCiAgZ3JvdXBfYnkoRElBX1NFTUFOQSkgJT4lDQogIG11dGF0ZSh0b3RhbD1zdW0oVU5JREFERVMpKQ0KDQoNCmdncGxvdChkZXNjcmlwdGl2bywgYWVzKGZpbGwgPSBESUFfU0VNQU5BLCB4ID0gIERJQV9TRU1BTkEsIHkgPSBVTklEQURFUykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSB0b3RhbHM1LCBhZXMoIHkgPSB0b3RhbCwgbGFiZWwgPSB0b3RhbCksIHZqdXN0ID0gLTAuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKCAwLDQ1MDAwMCw1MDAwMCkpICsNCiAgeGxhYigiRMOtYXMiKSArIA0KICB5bGFiKCJOdW1lcm8gZGUgdmVoaWN1bG9zIikgKyANCiAgZ2d0aXRsZSgiR3JhZmljbyAyOiBSZWdpc3RybyBkZSB2ZWhpY3Vsb3MgcG9yIGTDrWEgZGUgbGEgc2VtYW5hIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KUG9kZW1vcyBhcHJlY2lhciBxdWUgZGUgbWnDqXJjb2xlcyBhIHZpZXJuZXMgc2UgaGFjZSBsYSBtYXlvcsOtYSBkZSBsb3MgcmVnaXN0cm9zLCBjb24gZWwgdmllcm5lcyBjb21vIGVsIGTDrWEgZGUgbGEgc2VtYW5hIGNvbiBtYXlvciBjYW50aWRhZCBkZSB2ZWjDrWN1bG9zIHJlZ2lzdHJhZG9zLCBzZSBwdWVkZSBvYnNlcnZhciBjb21vIGhheSBtZW5vcyByZWdpc3Ryb3MgZW4gbG9zIGZpbmVzIGRlIHNlbWFuYSBlbiBjb21wYXJhY2nDs24gYSBsb3MgZMOtYXMgZGUgbGEgc2VtYW5hLCBhZGVtYXMgZGUgcXVlIGVsIGRvbWluZ28gZXMgZWwgZMOtYSBjb24gbWVub3IgY2FudGlkYWQgZGUgcmVnaXN0cm9zIGRlIHZlaMOtY3Vsb3MoTmlzYmV0LCBNaW5lciwgJiBZYWxlLCAyMDE4KS4NCg0KYGBge3IsIGVjaG89Rn0NCnRvdGFsczQgPC0gZGVzY3JpcHRpdm8gJT4lDQogIGdyb3VwX2J5KE1FUykgJT4lDQogIG11dGF0ZSh0b3RhbD1zdW0oVU5JREFERVMpKQ0KDQoNCmdncGxvdChkZXNjcmlwdGl2bywgYWVzKGZpbGwgPSBNRVMsIHggPSBhcy5mYWN0b3IoTUVTKSwgeSA9IFVOSURBREVTKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSB0b3RhbHM0LCBhZXMoIHkgPSB0b3RhbCwgbGFiZWwgPSB0b3RhbCksIHZqdXN0ID0gLTAuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKCAwLDIwMDAwMCwyNTAwMCkpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoIG9wdGlvbiA9ICJHIikgKw0KICB4bGFiKCJNZXMiKSArDQogIHlsYWIoIk51bWVybyBkZSB2ZWhpY3Vsb3MiKSArDQogIGdndGl0bGUoIkdyYWZpY28gMzogUmVnaXN0cm8gZGUgdmVoaWN1bG9zIHBvciBtZXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQoNCkRpY2llbWJyZSBlcyBlbCBtZXMgY29uIG1heW9yIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyBkZSB2ZWjDrWN1bG9zIHkgZW5lcm8gZWwgbWVzIGNvbiBtZW5vciBjYW50aWRhZCBkZSByZWdpc3Ryb3MsIGlnbm9yYW5kbyBlc3RvcyBkb3MgZGF0b3MgeSBzb2xvIHRvbWFuZG8gZGVsIG1lcyBmZWJyZXJvIGFsIG1lcyBkZSBub3ZpZW1icmUgbG9zIHJlZ2lzdHJvcyBkZSB2ZWjDrWN1bG9zIGVuIGVsIFJVTlQgZXN0w6FuIGVudHJlIDEzMDAwMCB5IDE1MDAwMCwgdmFyaWFuZG8gcG9yIHVub3MgY3VhbnRvcyBtaWxlcyBkZSB2ZWjDrWN1bG9zIA0KDQoNCmBgYHtyLCBlY2hvPUZ9DQp0b3RhbHMzIDwtIGRlc2NyaXB0aXZvICU+JQ0KICBncm91cF9ieShZRUFSKSAlPiUNCiAgbXV0YXRlKHRvdGFsPXN1bShVTklEQURFUykpDQoNCg0KZ2dwbG90KGRlc2NyaXB0aXZvLCBhZXMoZmlsbCA9IFlFQVIsIHggPSBhcy5mYWN0b3IoWUVBUiksIHkgPSBVTklEQURFUykpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChkYXRhID0gdG90YWxzMywgYWVzKCB5ID0gdG90YWwsIGxhYmVsID0gdG90YWwpLCB2anVzdCA9IC0wLjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSggMCw0MDAwMDAsMjUwMDApKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKCBvcHRpb24gPSAiRSIpICsNCiAgeGxhYigiQcOxbyIpICsNCiAgeWxhYigiTnVtZXJvIGRlIHZlaGljdWxvcyIpICsNCiAgZ2d0aXRsZSgiR3JhZmljbyA0OiBSZWdpc3RybyBkZSB2ZWhpY3Vsb3MgIHBvciBhw7FvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpFbCBhw7FvIDIwMTQgZXMgZWwgYcOxbyBjb24gbcOhcyB2ZWjDrWN1bG9zIHJlZ2lzdHJhZG9zLCBpZ25vcmFuZG8gZXN0ZSBkYXRvIHBvZHLDrWEgZGVjaXJzZSBxdWUgY2FkYSBhw7FvIHNlIHJlZ2lzdHJhbiBtZW5vcyB2ZWjDrWN1bG9zLg0KDQoNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpkZXNjcmlwdGl2byRkaWFfaGFiaWwgPC0gaWZlbHNlKGRlc2NyaXB0aXZvJEZFU1RJVklEQUQgPT0gImRpYV9oYWJpbCIsICJTSSIsICJOTyIpDQpkZXNjcmlwdGl2byRkaWFfaGFiaWwgPC0gYXMuZmFjdG9yKGRlc2NyaXB0aXZvJGRpYV9oYWJpbCkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCk5PX2ZlcyA8LSBkZXNjcmlwdGl2byAlPiUNCiAgZmlsdGVyKEZFU1RJVklEQUQgPT0gImRpYV9oYWJpbCIpDQpOT19mZXMNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnNvbG9fdGlwb19mZXN0aXZpZGFkIDwtIGRlc2NyaXB0aXZvICU+JQ0KICBhbnRpX2pvaW4oTk9fZmVzKQ0Kc3VtbWFyeShzb2xvX3RpcG9fZmVzdGl2aWRhZCkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQgPC0gZ3N1YigiYV9udWV2byIsIkHDkU8gTlVFVk8iLCBzb2xvX3RpcG9fZmVzdGl2aWRhZCRGRVNUSVZJREFEKQ0Kc29sb190aXBvX2Zlc3RpdmlkYWQkRkVTVElWSURBRCA8LSBnc3ViKCJhX3ZpZWpvIiwiQcORTyBWSUVKTyIsIHNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQpDQpzb2xvX3RpcG9fZmVzdGl2aWRhZCRGRVNUSVZJREFEIDwtIGdzdWIoIm1hZHJlcyIsIkRJQSBERSBMQVMgTUFEUkVTIiwgc29sb190aXBvX2Zlc3RpdmlkYWQkRkVTVElWSURBRCkNCnNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQgPC0gZ3N1YigiYnJ1amFzIiwiSEFMTE9XRUVOIiwgc29sb190aXBvX2Zlc3RpdmlkYWQkRkVTVElWSURBRCkNCnNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQgPC0gZ3N1Yigic2VtX3NhbnRhIiwiU0VNQU5BIFNBTlRBIiwgc29sb190aXBvX2Zlc3RpdmlkYWQkRkVTVElWSURBRCkNCnNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQgPC0gZ3N1YigiZmVzdGl2byIsIkZFU1RJVk8iLCBzb2xvX3RpcG9fZmVzdGl2aWRhZCRGRVNUSVZJREFEKQ0Kc29sb190aXBvX2Zlc3RpdmlkYWQkRkVTVElWSURBRCA8LSBnc3ViKCJuYXZpZGFkIiwiTkFWSURBRCIsIHNvbG9fdGlwb19mZXN0aXZpZGFkJEZFU1RJVklEQUQpDQpgYGANCg0KYGBge3IsIGVjaG89Rn0NCnRvdGFsczIgPC0gZGVzY3JpcHRpdm8gJT4lDQogIGdyb3VwX2J5KGRpYV9oYWJpbCkgJT4lDQogIG11dGF0ZSh0b3RhbD1zdW0oVU5JREFERVMpKQ0KDQpnZmVzMSA8LSBnZ3Bsb3QoZGVzY3JpcHRpdm8sIGFlcyhmaWxsID0gZGlhX2hhYmlsLCB4ID0gZGlhX2hhYmlsLCB5ID0gVU5JREFERVMpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21fdGV4dChkYXRhID0gdG90YWxzMiwgYWVzKHggPSBkaWFfaGFiaWwsIHkgPSB0b3RhbCwgbGFiZWwgPSB0b3RhbCksIHZqdXN0ID0gLTAuNSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKCAwLDIyNTAwMDAsMjUwMDAwKSkgKw0KICB4bGFiKCJkaWEgaGFiaWwiKSArDQogIHlsYWIoIk51bWVybyBkZSB2ZWhpY3Vsb3MiKSArDQogIGdndGl0bGUoIkdyYWZpY28gNTogcmVnaXN0cm9zIGRlIGRpYXMgaGFiaWxlcyB5IG5vIGhhYmlsZXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQp0b3RhbHMgPC0gc29sb190aXBvX2Zlc3RpdmlkYWQgJT4lDQogIGdyb3VwX2J5KEZFU1RJVklEQUQpICU+JQ0KICBtdXRhdGUodG90YWw9c3VtKFVOSURBREVTKSkNCg0KDQoNCmdmZXMyIDwtIGdncGxvdChzb2xvX3RpcG9fZmVzdGl2aWRhZCwgYWVzKGZpbGwgPSBGRVNUSVZJREFELCB4ID0gcmVvcmRlcihGRVNUSVZJREFELCtVTklEQURFUyksIHkgPSBVTklEQURFUykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoIG9wdGlvbiA9ICJEIikgKw0KICBnZW9tX3RleHQoZGF0YSA9IHRvdGFscywgYWVzKHggPSBGRVNUSVZJREFELCB5ID0gdG90YWwsIGxhYmVsID0gdG90YWwpLCB2anVzdCA9IC0wLjUpICsNCiAgeGxhYigiZmVzdGl2aWRhZCIpICsNCiAgeWxhYigiTnVtZXJvIGRlIHZlaGljdWxvcyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSggMCwzMDAwMCwyNTAwKSkgKw0KICBnZ3RpdGxlKCJHcmFmaWNvIDY6IFJlZ2lzdHJvcyBlbiBsYXMgZmVzdGl2aWRhZGVzIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDApLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KZ2ZlczENCmdmZXMyDQpgYGANCg0KQSBjb21wYXJhY2nDs24gZGUgbG9zIGTDrWFzIGjDoWJpbGVzLCBsYSBzdW1hIGRlIHZlaMOtY3Vsb3MgcmVnaXN0cmFkbyBlbiBsb3MgZMOtYXMgZmVzdGl2b3MgeSBkZSBmZXN0aXZpZGFkZXMgZXMgbXV5IHBvY2EuDQpMb3MgZG9zIHVuaWNvcyBkw61hcyBxdWUgbm8gcHJlc2VudGFuIG5pbmfDum4gcmVnaXN0cm8gZGUgdmVow61jdWxvcyBlbiBlbCBSVU5UIGRlIDIwMTIgYSAyMDE3IHNvbiBhw7FvIG51ZXZvKHByaW1lcm8gZGUgZW5lcm8pIHkgbmF2aWRhZCgyNSBkZSBkaWNpZW1icmUpLiANCg0KU2llbmRvIG11Y2hvcyBtZW5vcyBsb3MgZMOtYXMgZmVzdGl2b3MgY29tdW5lcyBxdWUgbG9zIGTDrWFzIGNlbGVicmFjacOzbiBkZSBsYSBzZW1hbmEgc2FudGEgc2UgcmVnaXN0cmFuIG11Y2hvcyBtw6FzIHZlaMOtY3Vsb3MgZW4gc2VtYW5hIHNhbnRhLCBwdWVkZSBoYWNlcnNlIHVuYSBjb21wYXJhY2nDs24gcGFyZWNpZGEgY29uIGVsIGTDrWEgZGUgbWFkcmVzIHkgaGFsb3dlZW4sIHNpZW5kbyBzb2xvIHVuIGTDrWEgaGF5IHVuYSBlbm9ybWUgZGlmZXJlbmNpYSBlbiBsb3MgcmVnaXN0cm9zIHNpZW5kbyBlbCBkw61hIGRlIG1hZHJlcyAyIHJlZ2lzdHJvcyBhbCBzZXIgZMOtYSBkb21pbmdvIHkgZW4gaGFsb3dlZW4gbcOhcyBkZSAxMW1pbCBhbCBzZXIgY2FzaSBzaWVtcHJlIHVuIGTDrWEgbm9ybWFsIGVuIHNlbWFuYShMZWlmLCAyMDE3KS4NCg0KDQoNCg0KIyMgNC4gTW9kZWxvIFByZWRpY3Rpdm8NCg0KDQpTZSBsbGV2YSBhIGNhYm8gdW4gTW9kZWxvIGxpbmVhbCBnZW5lcmFsaXphZG8gY29uIGxhIGZhbWlsaWEgZGUgZGlzdHJpYnVjacOzbiBQb2lzc29uLiBFcyBkZWNpciwgc2UgdXRpbGl6YSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBQb2lzc29uIHlhIHF1ZSBzZSBlbXBsZWEgcGFyYSBtb2RlbGFyIGRhdG9zIGRlIHJlY3VlbnRvIHkgdGFibGFzIGRlIGNvbnRpbmdlbmNpYSwgcHJpbmNpcGFsbWVudGUuIEFzw60sIGxhIHNhbGlkYSAqKlkqKiBvICJyZWN1ZW50byIgZXMgdW4gdmFsb3IgcXVlIHNpZ3VlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgUG9pc3Nvbi4gWSBjYWJlIGFub3RhciBxdWUgZWwgbG9nYXJpdG1vIGRlIGxvcyB2YWxvcmVzIGVzcGVyYWRvcyAobGEgbWVkaWEpIHB1ZWRlbiBtb2RlbGFyc2UgZW4gZm9ybWEgbGluZWFsIG1lZGlhbnRlIGFsZ3Vub3MgcGFyw6FtZXRyb3MgZGVzY29ub2NpZG9zKEpvaG5zb24sIDIwMjEpLg0KDQpFcyBwb3IgZXN0YSByYXrDs24gcXVlIHBhcmEgdHJhbnNmb3JtYXIgbGEgcmVsYWNpw7NuIG5vIGxpbmVhbCBlbiBmb3JtYSBsaW5lYWwsIHNlIHV0aWxpemEgdW5hIGZ1bmNpw7NuIGRlIGVubGFjZSBxdWUgZXMgZWwgbG9nYXJpdG1vIGRlIGxhIHJlZ3Jlc2nDs24gZGUgUG9pc3Nvbi4gUG9yIHRhbnRvLCB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBkZSBQb2lzc29uIHRhbWJpw6luIHNlIGRlbm9taW5hIG1vZGVsbyBMb2ctTGluZWFsLg0KDQpMYSBmb3JtYSBnZW5lcmFsIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBkZSBQb2lzc29uIGVzOg0KDQokbG9nKHkpID0gXGFscGhhK1xiZXRhXzFYXzErXGJldGFfMlhfMisuLi4rXGJldGFfcFhfcCtcZXBzaWxvbiQNCg0KZG9uZGUsIA0KDQotICR5JCBlcyBsYSB2YXJpYWJsZSByZXNwdWVzdGEgKHZhcmlhYmxlIGRlcGVuZGllbnRlKSwgcXVlIHNlcsOtYSDigJxVTklEQURFU+KAnS4NCg0KLSAkXGFscGhhJCB5ICRcYmV0YSQgc29uIGNvZWZpY2llbnRlcyBudW3DqXJpY29zLCAkXGFscGhhJCBlcyBsYSBpbnRlcnNlY2Npw7NuIHF1ZSBlcyBlcXVpdmFsZW50ZSBhICRcYmV0YV8wJA0KDQotICR4JCBlcyBsYSB2YXJpYWJsZSBwcmVkaWN0b3JhL2V4cGxpY2F0aXZhLCBxdWUgZW4gZXN0ZSBjYXNvIHNlcsOtYW4gbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgKHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyk6IEZFQ0hBLCBZRUFSLCBESUEsIE1FUywgRElBX1NFTUFOQSwgeSBGRVNUSVZJREFELg0KDQotICRcZXBzaWxvbiQgZXMgZWwgdMOpcm1pbm8gZGUgZXJyb3IuDQoNCkxhIG1lZGlhICRcbXUkIHBhcmEgZXN0ZSBtb2RlbG8gc2Vyw61hOg0KDQokRShYKSQgPSAkXG11JA0KDQpQYXJhIGVzdGUgdGlwbyBkZSByZWdyZXNpw7NuIHNlIHJlbGFjaW9uYSBsYSBtZWRpYSB5IGxhIHZhcmlhbnphIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJHZhcihYKSA9IFxzaWdtYV4yRShYKSQNCg0KZG9uZGUsIA0KDQotICRcc2lnbWFeMiQgcmVwcmVzZW50YSBlbCBwYXLDoW1ldHJvIGRlIGRpc3BlcnNpw7NuLg0KDQoqKk5vdGE6KiogU2kgJFxzaWdtYV4yJCBsbGVnYSBhIHNlciBpZ3VhbCBhIGNlcm8gc2UgcHJlc2VudGEgbGEgc2lndWllbnRlIHJlbGFjacOzbiAkdmFyKFgpID0gRShYKSQgcXVlIGltcGxpY2EgcXVlIGxhIG1lZGlhIHkgbGEgdmFyaWFuemEgcGFyYSBlbCBtb2RlbG8gZGUgUG9pc3NvbiBzZSBhanVzdGUgY29tcGxldGFtZW50ZS4gQXNpbWlzbW8sIHNpIGxsZWdhIGEgc2VyIGxhIHZhcmlhbnphIG1heW9yIGEgbGEgbWVkaWEsIHNlIHByZXNlbnRhcsOtYSBzb2JyZWRpc3BlcnNpw7NuICgkXHNpZ21hXjIkIG1heW9yIHF1ZSAxKS4gWSBmaW5hbG1lbnRlLCBzaSAkXHNpZ21hXjIkIGVzIG1lbm9yIHF1ZSAxLCB0aWVuZSBsdWdhciBhIGxhIHN1YmRpc3BlcnNpw7NuKEphbWVzLCBXaXR0ZW0sIEhhc3RpZSwgJiBUaWJzaGlyYW5pLCAyMDEzKS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GIH0NCmxvc19kYXRvcyA8LSByZWFkLmNzdigiZGF0b3NfMS5jc3YiLCBzZXA9IjsiLCBlbmNvZGluZz0iVVRGLTgiKQ0KDQpsb3NfZGF0b3MkRkVDSEEgPC0gYXMuRGF0ZShsb3NfZGF0b3MkRkVDSEEsIGZvcm1hdD0iJWQvJW0vJVkiKQ0KDQpsb3NfZGF0b3MkVU5JREFERVMgPC0gYXMuaW50ZWdlcihsb3NfZGF0b3MkVU5JREFERVMpDQoNCmxvc19kYXRvcyRZRUFSIDwtIGFzLmludGVnZXIobG9zX2RhdG9zJFlFQVIpDQoNCmxvc19kYXRvcyRESUEgPC0gYXMuaW50ZWdlcihsb3NfZGF0b3MkRElBKQ0KDQpsb3NfZGF0b3MkTUVTIDwtIGFzLmludGVnZXIobG9zX2RhdG9zJE1FUykNCg0KbG9zX2RhdG9zJERJQV9TRU1BTkE8LSBhcy5mYWN0b3IobG9zX2RhdG9zJERJQV9TRU1BTkEpDQoNCmxvc19kYXRvcyRGRVNUSVZJREFEIDwtIGFzLmZhY3Rvcihsb3NfZGF0b3MkRkVTVElWSURBRCkNCg0KYGBgDQoNCkRvbmRlIHNlIHV0aWxpemFyw6FuIGxvcyBhw7FvcyBkZXNkZSAyMDEyIGhhc3RhIDIwMTYgcGFyYSBsYSBjcmVhY2nDs24gZGVsIG1vZGVsby4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GIH0NCiNEYXRvcyBwYXJhIGVsIG1vZGVsbyAyMDEyLTIwMTYNCg0KbG9zZGF0b3MgPC0gbG9zX2RhdG9zW2MoMToxODI3KSxdDQoNCmRhdG9zX2xtMiA8LSBsb3NkYXRvcyAlPiUgZ3JvdXBfYnkoRkVDSEEsIFlFQVIsIERJQSwgTUVTLCBESUFfU0VNQU5BLCBGRVNUSVZJREFEKQ0KDQpsbTIgPC0gZ2xtKFVOSURBREVTIH4gRkVDSEErWUVBUitESUErTUVTK0RJQV9TRU1BTkErRkVTVElWSURBRCwgZmFtaWx5ID0gInBvaXNzb24iLCBkYXRhID0gZGF0b3NfbG0yKQ0KDQpgYGANCg0KU2UgcHJvY2VkZSBhIGhhY2VyIGxlY3R1cmEgZGUgbGEgYmFzZSBkZSBkYXRvcyBlbiBkb25kZSBzZSBhbG1hY2VuYXLDoW4gdG9kYXMgbGFzIHByZWRpY2Npb25lcywgc2Vnw7puIGVsIG1vZGVsbyBhbnRlcmlvci4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cyA9ICdoaWRlJywgZWNobz1GIH0NCkJhc2VfcHJlZGljY2lvbiA8LSByZWFkLmNzdigicHJlZGljY2lvbl90MDIyXzEuY3N2Iiwgc2VwID0gIjsiLCBlbmNvZGluZyA9ICJVVEYtOCIpDQoNCkJhc2VfcHJlZGljY2lvbiRGRUNIQSA8LSBhcy5EYXRlKEJhc2VfcHJlZGljY2lvbiRGRUNIQSwgZm9ybWF0PSIlZC8lbS8lWSIpDQoNCkJhc2VfcHJlZGljY2lvbiRZRUFSIDwtIGFzLmludGVnZXIoQmFzZV9wcmVkaWNjaW9uJFlFQVIpDQoNCkJhc2VfcHJlZGljY2lvbiRESUEgPC0gYXMuaW50ZWdlcihCYXNlX3ByZWRpY2Npb24kRElBKQ0KDQpCYXNlX3ByZWRpY2Npb24kTUVTIDwtIGFzLmludGVnZXIoQmFzZV9wcmVkaWNjaW9uJE1FUykNCg0KQmFzZV9wcmVkaWNjaW9uJERJQV9TRU1BTkE8LSBhcy5mYWN0b3IoQmFzZV9wcmVkaWNjaW9uJERJQV9TRU1BTkEpDQoNCkJhc2VfcHJlZGljY2lvbiRGRVNUSVZJREFEIDwtIGFzLmZhY3RvcihCYXNlX3ByZWRpY2Npb24kRkVTVElWSURBRCkNCg0KYGBgDQoNClNlIG11ZXN0cmFuIGxhcyBwcmltZXJhcyAxMCBvYnNlcnZhY2lvbmVzIGRlIGxhcyBwcmVkaWNjaW9uZXMgZGFkYXMuIEFsbWFjZW5hZGFzIGVuIGxhIHZhcmlhYmxlIE5ST19UT1RBTF9WRUhJQ1VMT1MsIHF1ZSByZXByZXNlbnRhIGVsIG7Dum1lcm8gZGUgdmVow61jdWxvcyByZWdpc3RyYWRvcy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RiB9DQpwcmVkaWNjaW9uIDwtIHByZWRpY3Qob2JqZWN0ID0gbG0yLCBuZXdkYXRhID0gQmFzZV9wcmVkaWNjaW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gInJlc3BvbnNlIikNCg0KcHJlZGljY2lvbl9kaWFyaWE8LSBCYXNlX3ByZWRpY2Npb24gJT4lIA0KICBtdXRhdGUoTnJvX1ZlaGljdWxvcyA9IHJvdW5kKHByZWRpY2Npb24sMCkpDQoNCmRpYXJpb18yMF8wMiA8LSBwcmVkaWNjaW9uX2RpYXJpYSAlPiUNCiAgZ3JvdXBfYnkoRkVDSEEsIFlFQVIsIERJQSwgTUVTLCBESUFfU0VNQU5BLCBGRVNUSVZJREFEKSAlPiUNCiAgbXV0YXRlKE5ST19UT1RBTF9WRUhJQ1VMT1M9TnJvX1ZlaGljdWxvcykNCg0KZGlhcmlvXzIwXzAyJE5ST19UT1RBTF9WRUhJQ1VMT1MgPC0gYXMuaW50ZWdlcihkaWFyaW9fMjBfMDIkTlJPX1RPVEFMX1ZFSElDVUxPUykNCg0KdGFibGEyIDwtIGhlYWQoZGlhcmlvXzIwXzAyLCAxMCkNCg0Ka2JsKHRhYmxhMixjYXB0aW9uID0gIlRhYmxhIDI6UHJpbWVyYXMgMTAgb2JzZXJ2YWNpb25lcyBkZSBsYXMgcHJlZGljY2lvbmVzIikgJT4lIGthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJjb25kZW5zZWQiLCJIT0xEX3Bvc2l0aW9uIiksIHBvc2l0aW9uID0gImNlbnRlciIsZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCkx1ZWdvLCBzZSBvYnNlcnZhIGVsIE1TRSwgTUFFIHkgJFJeMiQgcGFyYSBsb3MgZGF0b3MgZGUgZW50cmVuYW1pZW50byAocXVlIHBvc2VlIGxvcyBkw61hcyBjb21wcmVuZGlkb3MgZW50cmUgZWwgMDEvMDEvMjAxMiB5IGVsIDMxLzEyLzIwMTYpLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GIH0NCiNFbnRyZW5hbW9zIGNvbiAyMDEyLTIwMTYNCg0KZGF0b3NfMDIgPC0gc3Vic2V0KGxvc19kYXRvcywgKFlFQVIgIT0gJzIwMTcnKSkNCg0KeV90cmFpbiA8LSByb3VuZChwcmVkaWN0KGxtMiwgbmV3ZGF0YT0gZGF0b3NfMDIsIHR5cGU9InJlc3BvbnNlIikpDQp5X2FjdHVhbCA8LSBkYXRvc18wMiRVTklEQURFUw0KbG03X3Rtc2UgPC0gTVNFKHlfdHJhaW4sIHlfYWN0dWFsKQ0KbG03X3RtYWUgPC0gIE1BRSh5X3RyYWluLCB5X2FjdHVhbCkNCmxtN19yMiA8LSBSMl9TY29yZSh5X3RyYWluLCB5X2FjdHVhbCkNCnNwcmludGYoIk1TRTogJWYsIE1BRTogJWYsIFIyIFNjb3JlOiAlZiIsIA0KICAgICAgICBsbTdfdG1zZSwgbG03X3RtYWUsIGxtN19yMikNCmBgYA0KUG9yIGNvbnNpZ3VpZW50ZSwgc2Ugb2JzZXJ2YSBlbCBNU0UsIE1BRSB5ICRSXjIkIHBhcmEgbG9zIGRhdG9zIGRlIHZhbGlkYWNpw7NuIChxdWUgcG9zZWUgbG9zIGTDrWFzIGNvbXByZW5kaWRvcyBlbnRyZSBlbCAwMS8wMS8yMDE3IHkgZWwgMzEvMTIvMjAxNykuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUYgfQ0KI1ZhbGlkYWNpw7NuIGNvbiAyMDE3DQoNCmRhdG9zX3ZsIDwtIHN1YnNldChsb3NfZGF0b3MsIChZRUFSID09ICcyMDE3JykpDQoNCnlfdHJhaW4gPC0gcm91bmQocHJlZGljdChsbTIsIG5ld2RhdGE9IGRhdG9zX3ZsLCB0eXBlPSJyZXNwb25zZSIpKQ0KeV9hY3R1YWwgPC0gZGF0b3NfdmwkVU5JREFERVMNCmxtN190bXNlIDwtIE1TRSh5X3RyYWluLCB5X2FjdHVhbCkNCmxtN190bWFlIDwtICBNQUUoeV90cmFpbiwgeV9hY3R1YWwpDQpsbTdfcjIgPC0gUjJfU2NvcmUoeV90cmFpbiwgeV9hY3R1YWwpDQpzcHJpbnRmKCJNU0U6ICVmLCBNQUU6ICVmLCBSMiBTY29yZTogJWYiLCBsbTdfdG1zZSwgbG03X3RtYWUsIGxtN19yMikNCmBgYA0KDQpUYW1iacOpbiBzZSBjYWxjdWxhIGVsIE1TRSwgTUFFIHkgJFJeMiQgcGFyYSBlbCBwcmltZXIgc2VtZXN0cmUgZGUgMjAxNy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RiB9DQojIFByaW1lciBzZW1lc3RyZSBkZWwgMjAxNw0KDQpkYXRvc192bCA8LSBzdWJzZXQobG9zX2RhdG9zLCAoWUVBUiA9PSAnMjAxNycpKQ0Kc2VtMjAxNzwtIGRhdG9zX3ZsW2MoMToxODEpLF0NCg0KeV90cmFpbiA8LSByb3VuZChwcmVkaWN0KGxtMiwgbmV3ZGF0YT0gc2VtMjAxNywgdHlwZT0icmVzcG9uc2UiKSkNCnlfYWN0dWFsIDwtIHNlbTIwMTckVU5JREFERVMNCmxtN190bXNlIDwtIE1TRSh5X3RyYWluLCB5X2FjdHVhbCkNCmxtN190bWFlIDwtICBNQUUoeV90cmFpbiwgeV9hY3R1YWwpDQpsbTdfcjIgPC0gUjJfU2NvcmUoeV90cmFpbiwgeV9hY3R1YWwpDQpzcHJpbnRmKCJNU0U6ICVmLCBNQUU6ICVmLCBSMiBTY29yZTogJWYiLCBsbTdfdG1zZSwgbG03X3RtYWUsIGxtN19yMikNCmBgYA0KDQpMdWVnbywgZWwgJFJeMiQgZGVsIGNvbmp1bnRvIGRlIHZhbGlkYWNpw7NuIHF1ZSBjb21wcmVuZGUgZWwgcHJpbWVyIHNlbWVzdHJlIGRlbCAyMDE4ICgwMS8wMS8yMDE4IHkgZWwgMzAvMDYvMjAxOCksIG5vIHNlIGNhbGN1bGEgeWEgcXVlIHBhcmEgZWwgMjAxOCBubyBzZSBvYnRpZW5lbiBvYnNlcnZhY2lvbmVzIHJlYWxlcyBwYXJhIGRpY2hvIGHDsW8uDQoNCkEgY29udGludWFjacOzbiwgc2UgYXByZWNpYW4gbGFzIHByaW1lcmFzIDEwIHkgbGFzIMO6bHRpbWFzIDEwIG9ic2VydmFjaW9uZXMgZGVsIHByaW1lciBhcmNoaXZvIHBsYW5vICgwMS8wMS8yMDEyIHkgZWwgMzEvMTIvMjAxNyksIHF1ZSBjb250aWVuZSAxODI3IG9ic2VydmFjaW9uZXMgY29uIGRvcyB2YXJpYWJsZXMuDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUYgfQ0KZGF0b3NfMTYgPC0gc3Vic2V0KGRpYXJpb18yMF8wMiwgKFlFQVIgIT0gJzIwMTgnKSkNCmRhdCA8LSBkYXRvc18xNlssLTJdDQpkYXQwMSA8LSBkYXRbLC0yXQ0KZGF0MDIgPC0gZGF0MDFbLC0yXQ0KZGF0MDMgPC0gZGF0MDJbLC0yXQ0KZGF0MDQgPC0gZGF0MDNbLC0yXQ0KZGF0b3NfcHJpbWVyX2FyY2hpdm9fcGxhbm8gPC0gZGF0MDRbLC0yXQ0KdGFibGEzIDwtIGhlYWQoZGF0b3NfcHJpbWVyX2FyY2hpdm9fcGxhbm8sIDEwKQ0KDQprYmwodGFibGEzLGNhcHRpb24gPSAiVGFibGEgMzogUHJpbWVyYXMgMTAgb2JzZXJ2YWNpb25lcyBkZWwgcHJpbWVyIGFyY2hpdm8gcGxhbm8iKSAlPiUga2FibGVfc3R5bGluZyhsYXRleF9vcHRpb25zID0gYygic3RyaXBlZCIsImNvbmRlbnNlZCIsIkhPTERfcG9zaXRpb24iKSwgcG9zaXRpb24gPSAiY2VudGVyIixmdWxsX3dpZHRoID0gRkFMU0UpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUYgfQ0KdGFibGE0IDwtIHRhaWwoZGF0b3NfcHJpbWVyX2FyY2hpdm9fcGxhbm8sIDEwKQ0KDQprYmwodGFibGE0LGNhcHRpb24gPSAiVGFibGEgNDogVWx0aW1hcyAxMCBvYnNlcnZhY2lvbmVzIGRlbCBwcmltZXIgYXJjaGl2byBwbGFubyIpICU+JSBrYWJsZV9zdHlsaW5nKGxhdGV4X29wdGlvbnMgPSBjKCJzdHJpcGVkIiwiY29uZGVuc2VkIiwiSE9MRF9wb3NpdGlvbiIpLCBwb3NpdGlvbiA9ICJjZW50ZXIiLGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFICwgZWNobz1GIH0NCndyaXRlLmNzdihkYXRvc19wcmltZXJfYXJjaGl2b19wbGFubywgInByaW1lcl9hcmNoaXZvX3BsYW5vLmNzdiIpDQpgYGANCg0KRGVzcHXDqXMsIHNlIHB1ZWRlbiBvYnNlcnZhciBsYXMgcHJpbWVyYXMgMTAgeSBsYXMgw7psdGltYXMgMTAgb2JzZXJ2YWNpb25lcyBkZWwgc2VndW5kbyBhcmNoaXZvIHBsYW5vLCBlbCBjdWFsIGNvbnRpZW5lIGVsIHByaW1lciBzZW1lc3RyZSBkZSAyMDE4ICgwMS8wMS8yMDE4IHkgZWwgMzAvMDYvMjAxOCkuIHF1ZSBwb3NlZSAxODEgb2JzZXJ2YWNpb25lcyBjb24gZG9zIHZhcmlhYmxlcy4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSAsIGVjaG89RiB9DQpkYXRvc18xNyA8LSBzdWJzZXQoZGlhcmlvXzIwXzAyLCAoWUVBUiA9PSAnMjAxOCcpKQ0Kc2VtMjAxOCA8LSBkYXRvc18xN1tjKDE6MTgxKSxdDQpkYXQwNCA8LSBzZW0yMDE4WywtMl0NCmRhdDA1IDwtIGRhdDA0WywtMl0NCmRhdDA2IDwtIGRhdDA1WywtMl0NCmRhdDA3IDwtIGRhdDA2WywtMl0NCmRhdDA4IDwtIGRhdDA3WywtMl0NCmRhdG9zX3NlZ3VuZG9fYXJjaGl2b19wbGFubyA8LSBkYXQwOFssLTJdDQp0YWJsYTUgPC0gaGVhZChkYXRvc19zZWd1bmRvX2FyY2hpdm9fcGxhbm8sIDEwKQ0KDQprYmwodGFibGE1LGNhcHRpb24gPSAiVGFibGEgNTogUHJpbWVyYXMgMTAgb2JzZXJ2YWNpb25lcyBkZWwgc2VndW5kbyBhcmNoaXZvIHBsYW5vIikgJT4lIGthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJjb25kZW5zZWQiLCJIT0xEX3Bvc2l0aW9uIiksIHBvc2l0aW9uID0gImNlbnRlciIsZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUYgfQ0KdGFibGE2IDwtIHRhaWwoZGF0b3Nfc2VndW5kb19hcmNoaXZvX3BsYW5vLCAxMCkNCg0Ka2JsKHRhYmxhNixjYXB0aW9uID0gIlRhYmxhIDY6IFVsdGltYXMgMTAgb2JzZXJ2YWNpb25lcyBkZWwgc2VndW5kbyBhcmNoaXZvIHBsYW5vIikgJT4lIGthYmxlX3N0eWxpbmcobGF0ZXhfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJjb25kZW5zZWQiLCJIT0xEX3Bvc2l0aW9uIiksIHBvc2l0aW9uID0gImNlbnRlciIsZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgLCBlY2hvPUYgfQ0Kd3JpdGUuY3N2KGRhdG9zX3NlZ3VuZG9fYXJjaGl2b19wbGFubywgInNlZ3VuZG9fYXJjaGl2b19wbGFuby5jc3YiKQ0KYGBgDQoNCioqTm90YToqKiBMb3MgZG9zIGFyY2hpdm9zIHBsYW5vcyBlbiBmb3JtYXRvIC5jc3Ygc2UgcHVlZGVuIG9ic2VydmFyIGVuIGVsIHJlcG9zaXRvcmlvIGRlIEdpdGh1YjoNCg0KaHR0cHM6Ly9naXRodWIuY29tL2RhYXRvcm9hZy9QUk9ZRUNUT1MtVEFFL3RyZWUvbWFpbi9TZWd1bmRhJTIwZW50cmVnYQ0KDQoNCiMjIDUuIFJlZmVyZW5jaWFzDQoNCg0KKyBCLCBMZWlmLiAoMjAxNykuICpBcHBsaWVkIFVuZGVyd2F0ZXIgQWNvdXN0aWNzIChQYWdlcyA4ODktOTQ3KS4gw4Ftc3RlcmRhbTogRWxzZXZpZXIuKg0KDQorIEphbWVzLCBHLiwgV2l0dGVuLCBELiwgSGFzdGllLCBULiwgJiBUaWJzaGlyYW5pLCBSLiAoMjAxMykuICpBbiBJbnRyb2R1Y3Rpb24gdG8gU3RhdGlzdGljYWwgTGVhcm5pbmcuIE5ldyBZb3JrOiBTcHJpbmdlci4qDQoNCisgSm9obnNvbiwgRC4gKDIwMjEpLiAqR0xNIGluIFI6IEdlbmVyYWxpemVkIExpbmVhciBNb2RlbCB3aXRoIEV4YW1wbGUuIEd1cnU5OS4gT2J0ZW5pZG8gZGUgaHR0cHM6Ly93d3cuZ3VydTk5LmNvbS9yLWdlbmVyYWxpemVkLWxpbmVhci1tb2RlbC5odG1sKg0KDQorIE5pc2JldCwgUi4sIE1pbmVyLCBHLiwgJiBZYWxlLCBLLiAoMjAxOCkuICpIYW5kYm9vayBvZiBTdGF0aXN0aWNhbCBBbmFseXNpcyBhbmQgRGF0YSBNaW5pbmcgQXBwbGljYXRpb25zIChTZWNvbmQgRWRpdGlvbikuIMOBbXN0ZXJkYW06IEVsc2V2aWVyLioNCg0KDQoNCg0KDQo=