Secciones

Introducción


Introducción



El presente informe tiene como objetivo visibilizar las condiciones de trabajo, ingresos, y principales características de las trabajadoras que prestan servicio doméstico en hogares particulares. Para ello se presentan diversos indicadores, cuadros y gráficos de elaboración propia respondiendo a preguntas como ¿Cuántas personas se dedican a brindar servicios domésticos en hogares?, ¿Qué tan feminizado se encuentra el sector?, ¿Tienen jornadas completas de trabajo?, ¿Cuánto cobran por mes?¿Y por hora?, ¿Qué tanto se respetan sus derechos laborales?, ¿También son quienes realizan las tareas domésticas en su propio hogar?, ¿Son el principal sostén económico de sus hogares?, y también se realiza una comparación con otras ramas de ocupaciones.

Para realizar los cálculos se utilizan bases de datos publicadas por la Encuesta Permanente de Hogares del INDEC, en este caso referidas al 1er trimestre de 2021. Esta encuesta releva características demográficas, sociales, económicas, con especial atención a las formas de participación en el mercado laboral, entre hogares y personas de 31 aglomerados urbanos (pensémoslo como las grandes ciudades del país).

Respecto del impacto de la pandemia por COVID-19 y el aislamiento social preventivo y obligatorio (ASPO), tanto sobre los resultados como sobre la calidad de los datos, cabe aclarar que la encuesta pasó de la modalidad presencial a la telefónica para contactar y realizar la entrevista a los hogares. El propio INDEC advierte que ciertos datos no cuentan con la calidad con la que habitualmente la EPH presenta sus resultados.

El documento se realizó utilizando el lenguaje de programación R, y para les curioses todo el código se encuentra disponible para su descarga.

Este reporte puede volverse un poco técnico por momentos, pero desde EcoFeminita realizamos también otras notas de carácter divulgatorio. Obviamente, estás invitade a utilizar estos datos en notas, reflexiones, trabajos, infografías, etc. Además, si te gusta lo que hacemos podés apoyarnos potenciando nuestros proyectos, haciéndote socie del #ClubEcofeminita o realizando una donación.

Si necesitás citarnos en un trabajo, podés hacerlo como: “Shokida Natsumi, Serpa Daiana, Domenech Laia, Moure Julieta, Fernández Erlauer Micaela, Espiñeira Lucía, Santellán Celina, Pradier Carolina, Lee Justina. (2021). Ecofeminita/EcoFemiData: informes ecofemidata. Zenodo. http://doi.org/10.5281/zenodo.4540185

Trabajadoras de servicio doméstico


Trabajadoras de servicio doméstico



El interés por analizar distintas características de las trabajadoras de servicio doméstico radica principalmente en la magnitud que dicha ocupación presenta, en su estrecho vínculo con la división sexual del trabajo y la feminización de este sector y, como veremos luego, por las particularmente diferenciadas condiciones, acceso a derechos y bajos ingresos que perciben a cambio de su trabajo. Entre las grandes ciudades del país, pueden contarse casi 630 mil personas que componen al sector, lo cual representa una drástica disminución respecto de las cifras habitualmente observadas. A su vez, la tasa de feminidad del sector es del 99%. Es decir que casi en su totalidad se trata de trabajadoras mujeres. Es por esto que, a lo largo de todo el informe, utilizaremos pronombres femeninos a la hora de generalizar, aunque muchas veces estemos hablando del conjunto de les trabajadores que se dedican a esta actividad. A su vez, cabe destacar que el ejercicio debe ser realizado en términos cis-binarios por falta de información respecto de las identidades trans-travesti en las estadísticas oficiales.

Las trabajadoras que realizan tareas domésticas y de cuidado en hogares particulares representan un 12% dentro del total de ocupadas mujeres. Esto significa que una de cada 8 ocupadas en Argentina trabaja en este sector de la economía. Al mismo tiempo, estas trabajadoras representan un 16,8% dentro del total de ocupadas-asalariadas. O sea que dentro de las mujeres que trabajan en relación de dependencia, alrededor de 1 de cada 6 tiene como ocupación principal el trabajo en hogares particulares. Como veremos más adelante, se trata de la ocupación asalariada más popular entre las mujeres. Hay que tener en cuenta que estos indicadores también responden al contexto pandémico del trimestre estudiado.


Cantidad de personas que se dedican al servicio doméstico

632.266

Porcentaje de mujeres y de varones en el sector

Sexo Porcentaje
Mujeres 98,8
Varones 1,2

Porcentaje de la ocupación dentro de las ocupadas mujeres

¿Se dedica al servicio doméstico? Porcentaje
No 87,7
12,3

Porcentaje de la ocupación dentro de las asalariadas mujeres

¿Se dedica al servicio doméstico? Porcentaje
No 83,2
16,8

Características


Algunas características de las trabajadoras de servicio doméstico



En esta sección se presentan algunas métricas respecto a la distribución etaria, el lugar de nacimiento y características educativas de las trabajadoras del sector de servicio doméstico. Se destaca la sobrerrepresentación de migrantes en el sector.


Edad


Mientras que un 51,0% de estas trabajadoras tienen entre 30 y 49 años, un 30,1% tiene entre 50 y 64 años. Por su parte, hay un 4,4% que continúa trabajando a pesar de haber superar los 65 años, y un 14,5% está compuesto por jóvenes que no llegan a los 30 años.


Composicion por edad de las trabajadoras del servicio doméstico

Edad Cantidad Porcentaje
de 14 a 29 años 91.397 14,5
de 30 a 49 años 322.237 51,0
de 50 a 64 años 190.618 30,1
65 años y más 28.014 4,4
Lugar de nacimiento


Considerando a la población en general, un 11,1% se encuentra viviendo en una provincia distinta a la que tiene como lugar de nacimiento, y un 2,2% proviene de un país limítrofe. Por su parte, en el caso de las trabajadoras de servicio doméstico, un 16,4% ha migrado de provincia y más del 10,1% proviene de un país limítrofe, es decir que las personas migrantes se encuentran sobrerrepresentadas en dicho sector de la economía. Puede observarse entonces que la ocupación está estrechamente relacionada con los fenómenos migratorios.


Lugar de nacimiento de las trabajadoras de servicio doméstico y del total de la población

Trabajadoras de Servicio Doméstico
Población general
¿Dónde nació? 1. Cantidad 1. Porcentaje 2. Cantidad 2. Porcentaje
En esta localidad 400.852 63,4 22.786.250 79,1
En otra localidad de esta provincia 48.037 7,6 1.726.691 6,0
En otra provincia 103.747 16,4 3.203.707 11,1
En un país limítrofe 63.580 10,1 636.648 2,2

Nota: Las estimaciones correspondientes a aquellas personas que han nacido en otro país (no limítrofe) y aquellas que NS/NR la pregunta, no cuentan con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro las categorías. En este trimestre en particular, la categoría “En un país limítrofe” para el caso de las Trabajadoras de Servicio Doméstico cuenta con 46 casos muestrales.

Educación


Más de la mitad de las trabajadoras del sector finalizó el nivel primario de escolaridad, a lo que se suma un 42,2% que cuenta también con el nivel secundario, en tanto un 8,4% no posee instrucción formal.


Composicion por nivel educativo de las trabajadoras del servicio doméstico

Nivel educativo Cantidad Porcentaje
Sin Instrucción 53.405 8,4
Primaria 282.163 44,6
Secundaria 266.857 42,2

Nota: La estimación correspondiente a aquellas que han finalizado un nivel superior de formación no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría.

Intensidad del trabajo


Intensidad del trabajo de las trabajadoras de servicio doméstico



En relación a la cantidad de horas que trabajan semanalmente las empleadas domésticas, un 49,4% son ocupadas “plenas”, es decir que trabajan entre 35 y 45 horas semanales, o están conformes con la cantidad de horas que trabajan. Al mismo tiempo un 35,3% se encuentra sub-ocupada, trabaja menos de 35 horas semanales por causas involuntarias, estando dispuestas a trabajar más horas. Por su parte, un 7,2% está sobre-ocupada, trabaja más de 45 horas por semana. Respecto a las ocupadas que no se encontraban trabajando en la semana de referencia de la entrevista, son el 8,1%.

En cuanto a la cantidad de hogares en que se desempeñan, un 79% trabaja habitualmente en una sola casa, por lo que al mismo tiempo casi un 21% de ellas suele trabajar en más de una vivienda. Mientras que las que son contratadas por un sólo hogar trabajaron cerca de 20 horas semanales (jornada part-time), aquellas que trabajan en más de una casa trabajaron en promedio menos de 13 horas por semana en la ocupación principal, acercándose a las 22 horas semanales con las ocupaciones secundarias.


Trabajadoras de servicio doméstico según intensidad del trabajo

Intensidad Cantidad Porcentaje
Ocupadas plenas 312.649 49,4
Sobreocupadas 45.286 7,2
Subocupadas por insuficiencia horaria 222.890 35,3

Nota: La estimación correspondiente a aquellas que no trabajaron en la semana de referencia de la encuesta no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría


Trabajadoras del servicio doméstico según la cantidad de hogares en los que trabajan

Cantidad de hogares en que trabaja Cantidad Porcentaje hs/sem en ocup. princ. hs/sem con ocup. secund.
1 460.515 79,3 20,2 20,8
2 63.277 10,9 13,1 19,5
3 o más 57.033 9,8 12,8 23,1

Derechos laborales


Derechos laborales de las trabajadoras de servicio doméstico



Dentro del conjunto de asalariades, un 32,4% no se encuentra registrade en la seguridad social. El mismo indicador asciende al 33,4% cuando hablamos de las asalariadas mujeres (estas tasas fueron del 35,8% y del 37,5% en el primer trimestre del año, respectivamente).
Pero también puede observarse que la problemática es particularmente incisiva entre las trabajadoras domésticas: un 70,5% de ellas no percibe descuento jubilatorio. Asociado a esto, un 66,3% de estas trabajadoras no cuenta con vacaciones pagas, un 64,4% no percibe aguinaldos, un 67,9% no percibe el pago en caso de enfermedad, y un 70,4% no cuenta con cobertura de salud mediante obra social.


En ese trabajo tiene…

Indicador No
¿Tiene descuento jubilatorio? 29,5 70,5
¿Tiene vacaciones pagas? 33,7 66,3
¿Tiene aguinaldo? 35,6 64,4
¿Tiene días pagos por enfermedad? 32,1 67,9
¿Tiene obra social? 29,6 70,4

Ingresos


Ingresos de las trabajadoras de servicio doméstico



Las trabajadoras del sector perciben ingresos que, en promedio, rondan los $11300 pesos mensuales por su ocupación principal. Al mismo tiempo, un 50% de ellas cobra menos de $10000 por mes por dicho trabajo. Esto equivale a que en promedio cobran unos $171 por hora, y el 50% cobra menos de $145 por hora. En el primer cuadro también pueden apreciarse los ingresos mensuales totales de fuente laboral (incluyendo ingresos de ocupaciones secundarias), los totales individuales (incluyendo ingresos que no provienen de una fuente laboral), los ingresos totales familiares que tienen en promedio los hogares de estas trabajadoras, y el ingreso per cápita familiar de estos mismos hogares.

En el segundo cuadro puede apreciarse que hay una amplia diferencia entre los ingresos que perciben en promedio las trabajadoras que se encuentran registradas respecto de aquellas que no, tanto en términos mensuales como por hora trabajada. Además, aquellas que tienen descuento jubilatorio trabajan más horas en su ocupación principal respecto que aquellas que no.

Si ordenamos al total de las personas ocupadas de acuerdo al nivel de ingresos que perciben por su ocupación principal, y las agrupamos en 10 grupos de igual tamaño, obtenemos los denominados deciles de ingreso. En el gráfico se muestra claramente que aquellas personas que trabajan en el sector de servicio doméstico se encuentran concentradas en los deciles de menores ingresos.

Ojo! Debe tenerse en cuenta que todos los montos están expresados en pesos del 1er trimestre de 2021.


Promedio y mediana de los ingresos de las trabajadoras de servicio doméstico y sus familias

Ingresos Ingreso promedio 50% cobra menos de
Mensuales, de la ocupación principal $11.300,61 $10.000,00
Por hora, de la ocupación principal $170,82 $145,29
Mensuales, total de fuente laboral $14.718,17 $12.000,00
Mensuales, ingreso total individual $19.678,92 $16.018,16
Mensuales, ingreso total familiar $49.517,40 $44.000,00
Mensuales, ingreso per cápita familiar $14.686,19 $12.690,50

Nota: Las remuneraciones mensuales fueron calculadas sin incluir a las trabajadoras que no trabajaron en el período de referencia pero de todas formas percibieron un salario. Se trata de 46.876 trabajadoras, de acuerdo a 41 casos muestrales. De realizar el cálculo contemplandolas el salario promedio seria de $11900. Antes de la pandemia estos casos eran minoritarios y no modificaban el ingreso promedio.


Trabajadoras de servicio doméstico según si tienen descuento jubilatorio, sus ingresos y horas de trabajo promedio

¿Tiene descuento jubilatorio? Ingreso mensual promedio Ingreso por hora promedio hs/sem en ocup. princ.
$17.627,20 $196,22 24,9
No $9.125,65 $162,09 16,5

Trabajadoras de servicio domśtico según deciles de ingreso de la ocupación principal

Hogares


Algunas características referidas a los hogares de las trabajadoras de servicio doméstico



Si esta vez ordenamos al total de las personas de acuerdo a sus ingresos per cápita familiares (aquellos que surgen de dividir el total de ingresos de la familia por la cantidad de miembros de la misma), de menor a mayor, y las agrupamos en 10 grupos de igual tamaño, obtenemos otra escala de deciles. En este caso también se puede apreciar que las trabajadoras de servicio doméstico se concentran en los primeros deciles. Cabe destacar que los primeros tres deciles de esta escala suelen estar altamente relacionados con la situación de pobreza de los hogares (tomando como referencia la metodología oficial de cálculo de la misma).

Al mismo tiempo, mientras que un 55,7% no es el primer sostén económico del hogar, un 44,3% sí lo es. En ambos casos, la mayoría de ellas realizan las tareas domésticas en su hogar. Esto es así porque un 80,9% de quienes trabajan de forma remunerada realizando trabajo doméstico también están a cargo de la realización de este trabajo en sus hogares de manera no-asalariada, y por tanto no remunerada.


Trabajadoras de servicio doméstico según deciles de ingreso per cápita familiar


Trabajadoras de servicio doméstico según si perciben el ingreso principal de su grupo familiar y si son quienes realizan las tareas domésticas en su hogar

Comparación con otras ramas de la ocupación


Comparación con otras ramas de la ocupación



Es útil contextualizar muchos de los indicadores presentados realizando una comparación con otras ramas de ocupación. En esta sección se presenta una serie de gráficos que permiten realizar este ejercicio. En todos los casos se considera a la población asalariada, es decir a las personas que se desempeñan en el mercado laboral con una relación de dependencia, y teniendo en cuenta las características de la ocupación principal de estas personas.

Se destaca que el sector de servicio doméstico es uno de los más importantes del mercado laboral (aunque ha descendido en el “ranking” a la luz de una mayor ponderación de actividades como la administración pública o los servicios sociales y de salud en el marco de la crisis por COVID-19). También se trata de la rama más feminizada, una de las que más proporción ocupa dentro de las trabajadoras mujeres y la menos popular entre los varones. También es una de las ramas con tasa de no-registro más altas, y los ingresos promedios más bajos, tanto de bolsillo como por hora trabajada.


Cantidad de trabajadores

Tasa de feminización

Proporción entre las asalariadas mujeres

Proporción entre los asalariados varones

Tasa de no registro de la relación laboral

Ingresos mensuales promedio

Ingresos por hora promedio

LS0tDQp0aXRsZTogIkxhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBlbiBBcmdlbnRpbmEiDQpzdWJ0aXRsZTogIjFlciB0cmltZXN0cmUgZGUgMjAyMSINCmF1dGhvcjogIiNFY29GZW1pRGF0YSwgZXF1aXBvIGRlIGRhdG9zIGRlIEVjb25vbcOtYSBGZW1pbml0YSAtIEFnb3N0byBkZSAyMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0aGVtZTogZmxhdGx5DQp1cmxjb2xvcjogI0U1NjE2RQ0KLS0tDQoNCjxzdHlsZT4NCi5uYXY+bGk+YSB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIGRpc3BsYXk6IGJsb2NrOw0KICAgIHBhZGRpbmc6IDEwcHggMTVweDsNCiAgICBjb2xvcjogI0U1NjE2RTsNCn0NCg0KIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmEsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6aG92ZXIsIC5uYXYtcGlsbHM+bGkuYWN0aXZlPmE6Zm9jdXMgew0KICAgIGNvbG9yOiAjZmZmZmZmOw0KICAgIGJhY2tncm91bmQtY29sb3I6ICNFNTYxNkU7DQp9DQo8L3N0eWxlPg0KDQotLS0NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmRhdGUgPC0gIjFlciB0cmltZXN0cmUgZGUgMjAyMSIgICAgICAgICAgICAgICAgICAgICAgICAjIDwtLS0tLS0tLS0tLS0tLS0tLQ0KY2FwdGlvbiA8LSAiI0Vjb0ZlbWlEYXRhIHkgRWNvRmVtaW5pdGEgZW4gYmFzZSBhIEVQSC1JTkRFQyINCmBgYA0KDQojIyBTZWNjaW9uZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyBJbnRyb2R1Y2Npw7NuDQoNCi0tLQ0KDQojIyMjIEludHJvZHVjY2nDs24NCjxicj48YnI+DQpFbCBwcmVzZW50ZSBpbmZvcm1lIHRpZW5lIGNvbW8gb2JqZXRpdm8gdmlzaWJpbGl6YXIgbGFzIGNvbmRpY2lvbmVzIGRlIHRyYWJham8sIGluZ3Jlc29zLCB5IHByaW5jaXBhbGVzIGNhcmFjdGVyw61zdGljYXMgZGUgbGFzIHRyYWJhamFkb3JhcyBxdWUgcHJlc3RhbiBzZXJ2aWNpbyBkb23DqXN0aWNvIGVuIGhvZ2FyZXMgcGFydGljdWxhcmVzLiBQYXJhIGVsbG8gc2UgcHJlc2VudGFuIGRpdmVyc29zIGluZGljYWRvcmVzLCBjdWFkcm9zIHkgZ3LDoWZpY29zIGRlIGVsYWJvcmFjacOzbiBwcm9waWEgcmVzcG9uZGllbmRvIGEgcHJlZ3VudGFzIGNvbW8gX1/Cv0N1w6FudGFzIHBlcnNvbmFzIHNlIGRlZGljYW4gYSBicmluZGFyIHNlcnZpY2lvcyBkb23DqXN0aWNvcyBlbiBob2dhcmVzPywgwr9RdcOpIHRhbiBmZW1pbml6YWRvIHNlIGVuY3VlbnRyYSBlbCBzZWN0b3I/LCDCv1RpZW5lbiBqb3JuYWRhcyBjb21wbGV0YXMgZGUgdHJhYmFqbz8sIMK/Q3XDoW50byBjb2JyYW4gcG9yIG1lcz/Cv1kgcG9yIGhvcmE/LCDCv1F1w6kgdGFudG8gc2UgcmVzcGV0YW4gc3VzIGRlcmVjaG9zIGxhYm9yYWxlcz8sIMK/VGFtYmnDqW4gc29uIHF1aWVuZXMgcmVhbGl6YW4gbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBlbiBzdSBwcm9waW8gaG9nYXI/LCDCv1NvbiBlbCBwcmluY2lwYWwgc29zdMOpbiBlY29uw7NtaWNvIGRlIHN1cyBob2dhcmVzPywgeSB0YW1iacOpbiBzZSByZWFsaXphIHVuYSBjb21wYXJhY2nDs24gY29uIG90cmFzIHJhbWFzIGRlIG9jdXBhY2lvbmVzX18uDQo8YnI+PGJyPg0KUGFyYSByZWFsaXphciBsb3MgY8OhbGN1bG9zIHNlIHV0aWxpemFuIGJhc2VzIGRlIGRhdG9zIHB1YmxpY2FkYXMgcG9yIGxhIEVuY3Vlc3RhIFBlcm1hbmVudGUgZGUgSG9nYXJlcyBkZWwgSU5ERUMsIGVuIGVzdGUgY2FzbyByZWZlcmlkYXMgYWwgYHIgZGF0ZWAuIEVzdGEgZW5jdWVzdGEgcmVsZXZhIGNhcmFjdGVyw61zdGljYXMgZGVtb2dyw6FmaWNhcywgc29jaWFsZXMsIGVjb27Ds21pY2FzLCBjb24gZXNwZWNpYWwgYXRlbmNpw7NuIGEgbGFzIGZvcm1hcyBkZSBwYXJ0aWNpcGFjacOzbiBlbiBlbCBtZXJjYWRvIGxhYm9yYWwsIGVudHJlIGhvZ2FyZXMgeSBwZXJzb25hcyBkZSAzMSBhZ2xvbWVyYWRvcyB1cmJhbm9zIChwZW5zw6ltb3NsbyBjb21vIGxhcyBncmFuZGVzIGNpdWRhZGVzIGRlbCBwYcOtcykuDQo8YnI+PGJyPg0KUmVzcGVjdG8gZGVsIGltcGFjdG8gZGUgbGEgcGFuZGVtaWEgcG9yIENPVklELTE5IHkgZWwgYWlzbGFtaWVudG8gc29jaWFsIHByZXZlbnRpdm8geSBvYmxpZ2F0b3JpbyAoQVNQTyksIHRhbnRvIHNvYnJlIGxvcyByZXN1bHRhZG9zIGNvbW8gc29icmUgbGEgY2FsaWRhZCBkZSBsb3MgZGF0b3MsIGNhYmUgYWNsYXJhciBxdWUgbGEgZW5jdWVzdGEgcGFzw7MgZGUgbGEgbW9kYWxpZGFkIHByZXNlbmNpYWwgYSBsYSB0ZWxlZsOzbmljYSBwYXJhIGNvbnRhY3RhciB5IHJlYWxpemFyIGxhIGVudHJldmlzdGEgYSBsb3MgaG9nYXJlcy4gRWwgcHJvcGlvIElOREVDIGFkdmllcnRlIHF1ZSBjaWVydG9zIGRhdG9zIG5vIGN1ZW50YW4gY29uIGxhIGNhbGlkYWQgY29uIGxhIHF1ZSBoYWJpdHVhbG1lbnRlIGxhIEVQSCBwcmVzZW50YSBzdXMgcmVzdWx0YWRvcy4NCjxicj48YnI+DQpFbCBkb2N1bWVudG8gc2UgcmVhbGl6w7MgdXRpbGl6YW5kbyBlbCBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIFIsIHkgcGFyYSBsZXMgY3VyaW9zZXMgdG9kbyBlbCBjw7NkaWdvIHNlIGVuY3VlbnRyYSBkaXNwb25pYmxlIHBhcmEgc3UgZGVzY2FyZ2EuDQo8YnI+PGJyPg0KRXN0ZSByZXBvcnRlIHB1ZWRlIHZvbHZlcnNlIHVuIHBvY28gdMOpY25pY28gcG9yIG1vbWVudG9zLCBwZXJvIGRlc2RlIFtFY29GZW1pbml0YV0oaHR0cDovL2Vjb25vbWlhZmVtaW5pdGEuY29tLykgcmVhbGl6YW1vcyB0YW1iacOpbiBvdHJhcyBub3RhcyBkZSBjYXLDoWN0ZXIgZGl2dWxnYXRvcmlvLiBPYnZpYW1lbnRlLCBlc3TDoXMgaW52aXRhZGUgYSB1dGlsaXphciBlc3RvcyBkYXRvcyBlbiBub3RhcywgcmVmbGV4aW9uZXMsIHRyYWJham9zLCBpbmZvZ3JhZsOtYXMsIGV0Yy4gQWRlbcOhcywgc2kgdGUgZ3VzdGEgbG8gcXVlIGhhY2Vtb3MgcG9kw6lzIGFwb3lhcm5vcyBwb3RlbmNpYW5kbyBudWVzdHJvcyBwcm95ZWN0b3MsIGhhY2nDqW5kb3RlIHNvY2llIGRlbCBbI0NsdWJFY29mZW1pbml0YSBvIHJlYWxpemFuZG8gdW5hIGRvbmFjacOzbl0oaHR0cHM6Ly9kb25hcm9ubGluZS5vcmcvZWNvbm9taWEtZmVtaW5pLXMtdGEvY2x1Yi1lY29mZW1pbml0YSkuDQo8YnI+PGJyPg0KU2kgbmVjZXNpdMOhcyBjaXRhcm5vcyBlbiB1biB0cmFiYWpvLCBwb2TDqXMgaGFjZXJsbyBjb21vOiAiU2hva2lkYSBOYXRzdW1pLCBTZXJwYSBEYWlhbmEsIERvbWVuZWNoIExhaWEsIE1vdXJlIEp1bGlldGEsIEZlcm7DoW5kZXogRXJsYXVlciBNaWNhZWxhLCBFc3Bpw7FlaXJhIEx1Y8OtYSwgU2FudGVsbMOhbiBDZWxpbmEsIFByYWRpZXIgQ2Fyb2xpbmEsIExlZSBKdXN0aW5hLiAoMjAyMSkuIEVjb2ZlbWluaXRhL0Vjb0ZlbWlEYXRhOiBpbmZvcm1lcyBlY29mZW1pZGF0YS4gWmVub2RvLiBodHRwOi8vZG9pLm9yZy8xMC41MjgxL3plbm9kby40NTQwMTg1Ig0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBTZSBjYXJnYW4gbGlicmVyw61hcyDDunRpbGVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaHR0cikNCmxpYnJhcnkoc3RyaW5ncikNCiMgbGlicmFyeShvcGVueGxzeCkNCmxpYnJhcnkoaGF2ZW4pDQojIGxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdnYWx0KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShmb3JtYXR0YWJsZSkNCmxpYnJhcnkocXVlc3Rpb25yKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KI2luc3RhbGwucGFja2FnZXMoJ2h0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3NyYy9jb250cmliL0FyY2hpdmUvc3BhdHN0YXQvc3BhdHN0YXRfMS42NC0xLnRhci5neicsIHJlcG9zPU5VTEwsdHlwZT0ic291cmNlIiwgSU5TVEFMTF9vcHRzID0gIi0tbm8tbG9jayIpICNpbnN0YWxvIGxhIHZlcnNpw7NuIHZpZWphIGRlIHNwYXRzdGF0IHBvciBlbCBlcnJvciBlbiBsYSBsaW5lYSA1MDAgKGFudGVzIHR1dmUgcXVlIGRlc2luc3RhbGxhciBsYSB2ZXJzacOzbiBhY3R1YWxpemFkYSkNCmxpYnJhcnkoc3BhdHN0YXQpICNsbyBzdW3DqSB5byAoY2VsaSkgYWhvcmEgcG9ycXVlIG1lIGxvIHBlZMOtYSBlbiBsYSBsaW5lYSA1MDANCmxpYnJhcnkoZXBoKSAjIFVuIHBhcXVldGUgcGFyYSB0cmFiYWphciBjb24gbGFzIGJhc2VzIGRlIGxhIEVuY3Vlc3RhIHBlcm1hbmVudGUgZGUgSG9nYXJlcyENCiMgQ29tbyBmdWVudGUgdG9tYW1vcyB1biBzY3JpcHQgY29uIGZ1bmNpb25lcyBkZSBmb3JtYXRvIHBhcmEgbG9zIGRhdG9zLg0KIyBzb3VyY2UoIi4uLy4uL1IvZnVuY2lvbmVzIHJhbWEuUiIpIA0Kc291cmNlKCIuLi8uLi9SL2Z1bmNpb25lcyBmb3JtYXRvLlIiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIENhcmdvIGJhc2UgZGUgRVBIIGNvbiBlbCBwYXF1ZXRlIGVwaA0KYmFzZV9pbmRpdmlkdWFsIDwtIGVwaDo6Z2V0X21pY3JvZGF0YSh5ZWFyID0gMjAyMSwgdHJpbWVzdGVyID0gMSwgdHlwZSA9ICAiaW5kaXZpZHVhbCIpICMgPC0tLS0tLS0tLS0tLS0tLS0tDQpiYXNlX2hvZ2FyIDwtIGVwaDo6Z2V0X21pY3JvZGF0YSh5ZWFyID0gMjAyMSwgdHJpbWVzdGVyID0gMSwgdHlwZSA9ICAiaG9nYXIiKSAgICAgICAgICAgIyA8LS0tLS0tLS0tLS0tLS0tLS0NCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTW9kaWZpY2FjaW9uZXMgZW4gbGEgYmFzZSBkZSBpbmRpdmlkdW9zDQpiYXNlX2luZGl2aWR1YWwgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgbXV0YXRlKFNleG8gPSBhcy5jaGFyYWN0ZXIoQ0gwNCksDQogICAgICAgICBTZXhvID0gY2FzZV93aGVuKFNleG89PSIxIiB+ICJWYXJvbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4bz09IjIiIH4gIk11amVyZXMiKSwNCiAgICAgICAgIE5JVkVMX0VEVUNBVElWTyA9IGNhc2Vfd2hlbihOSVZFTF9FRCAlaW4lIGMoMSwgNykgfiAiU2luIEluc3RydWNjacOzbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQgJWluJSBjKDIsIDMpIH4gIlByaW1hcmlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCAlaW4lIGMoNCwgNSkgfiAiU2VjdW5kYXJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQgPT0gNiAgICAgICAgIH4gIlN1cGVyaW9yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCA9PSA5ICAgICAgICAgfiAiTlMvTlIiKSwNCiAgICAgICAgIE5JVkVMX0VEVUNBVElWTyA9IGZhY3RvcihOSVZFTF9FRFVDQVRJVk8sIGxldmVscyA9IGMoIlNpbiBJbnN0cnVjY2nDs24iLCAiUHJpbWFyaWEiLCAiU2VjdW5kYXJpYSIsICJTdXBlcmlvciIpKSwNCiAgICAgICAgIEdSVVBPX0VEQUQgPSBjYXNlX3doZW4oQ0gwNiA+PSAxNCAmIENIMDYgPD0gMjkgfiAiZGUgMTQgYSAyOSBhw7FvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMDYgPj0gMzAgJiBDSDA2IDw9IDQ5IH4gImRlIDMwIGEgNDkgYcOxb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDUwICYgQ0gwNiA8PSA2NCB+ICJkZSA1MCBhIDY0IGHDsW9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gwNiA+PSA2NSAgICAgICAgICAgICAgfiAiNjUgYcOxb3MgeSBtw6FzIiksDQogICAgICAgICBHUlVQT19FREFEID0gZmFjdG9yKEdSVVBPX0VEQUQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJkZSAxNCBhIDI5IGHDsW9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGUgMzAgYSA0OSBhw7FvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlIDUwIGEgNjQgYcOxb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NSBhw7FvcyB5IG3DoXMiKSksDQogICAgICAgICBET05ERV9OQUNJTyA9IGNhc2Vfd2hlbihDSDE1ID09IDEgfiAiRW4gZXN0YSBsb2NhbGlkYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gxNSA9PSAyIH4gIkVuIG90cmEgbG9jYWxpZGFkIGRlIGVzdGEgcHJvdmluY2lhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTUgPT0gMyB+ICJFbiBvdHJhIHByb3ZpbmNpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDE1ID09IDQgfiAiRW4gdW4gcGHDrXMgbGltw610cm9mZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDE1ID09IDUgfiAiRW4gb3RybyBwYcOtcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDE1ID09IDkgfiAiTlMvTlIiKSwNCiAgICAgICAgIERPTkRFX05BQ0lPID0gZmFjdG9yKERPTkRFX05BQ0lPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRW4gZXN0YSBsb2NhbGlkYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW4gb3RyYSBsb2NhbGlkYWQgZGUgZXN0YSBwcm92aW5jaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW4gb3RyYSBwcm92aW5jaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW4gdW4gcGHDrXMgbGltw610cm9mZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbiBvdHJvIHBhw61zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5TL05SIikpLA0KICAgICAgICAgVmFjYWNpb25lc19wYWdhcyA9IGNhc2Vfd2hlbihQUDA3RzEgPT0gMSB+ICJTw60iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA3RzEgPT0gMiB+ICJObyIpLA0KICAgICAgICAgQWd1aW5hbGRvID0gY2FzZV93aGVuKFBQMDdHMiA9PSAxIH4gIlPDrSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwN0cyID09IDIgfiAiTm8iKSwNCiAgICAgICAgIERpYXNfZW5mZXJtZWRhZCA9IGNhc2Vfd2hlbihQUDA3RzMgPT0gMSB+ICJTw60iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDdHMyA9PSAyIH4gIk5vIiksDQogICAgICAgICBPYnJhX3NvY2lhbCA9IGNhc2Vfd2hlbihQUDA3RzQgPT0gMSB+ICJTw60iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwN0c0ID09IDIgfiAiTm8iKSwNCiAgICAgICAgIERlc2N1ZW50b19qdWJpbGF0b3JpbyA9IGNhc2Vfd2hlbihQUDA3SCA9PSAxIH4gIlPDrSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwN0ggPT0gMiB+ICJObyIpKQ0KDQojIGNvbG9yZXMgPSBjKCIjYWExNjVhIiwiIzE2YWE2NiIpDQpjb2xvcmVzID0gYygiI0U1NjE2RSIsICIjYzljOWM5IikNCmBgYA0KDQojIyMgVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gDQoNCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBBcm1hbW9zIHVuYSBtaW5pIGJhc2UgZGUgc2VydmljaW8gZG9tw6lzdGljbyB1dGlsaXphbmRvIGxhIHByZWd1bnRhIFBQMDRCMSwgcXVlIGlkZW50aWZpY2EgYSBsYXMgcGVyc29uYXMgcXVlIHByZXN0YW4gc2VydmljaW8gZG9tw6lzdGljbyBlbiBob2dhcmVzIHBhcnRpY3VsYXJlcy4gDQoNCnNlcnYuZG9tIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihQUDA0QjEgPT0gMSkNCiMgQ29udGFtb3MgY29uIDEwMTIgY2Fzb3MgbXVlc3RyYWxlcw0KIyBMdWVnbywgYSBsYSBob3JhIGRlIHRyYWJhamFyIGNvbiBlbCBjbGFzaWZpY2Fkb3IgZGUgYWN0aXZpZGFkZXMsIHNlIGVuY3VlbnRyYW4gbcOhcyBjYXNvcyBlbiAiQWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyBkZSBwZXJzb25hbCBkb23DqXN0aWNvIiwgcGVybyBzZSB2ZXLDoSBxdWUgc2UgdHJhdGEgZGUgY2Fzb3MgcXVlIG5vIHJlc3BvbmRpZXJvbiBlbiBjdcOhbnRhcyBjYXNhcyB0cmFiYWphbi4NCg0KdGFibGUoc2Vydi5kb20kRVNUQURPLCBzZXJ2LmRvbSRDQVRfT0NVUCwgZXhjbHVkZSA9IE5VTEwpDQojIFRvZGFzIG9jdXBhZGFzIC0gYXNhbGFyaWFkYXMuIA0KDQogIHRybmNpbnQgPC0gZnVuY3Rpb24oeCwgbGVmdD0wLGxlbmd0aD0wKSAgKHggJSUgMTBeKGxlZnQpICkgJS8lICANCjEwXihsZWZ0LWxlbmd0aCkNCg0KaW5saW5lXzEgPC0gc2Vydi5kb20gJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSAgcm91bmQoYXMubnVtZXJpYyhzdW0oUE9OREVSQSkpLC00KSkgJT4lIA0KICB0cm5jaW50KC4sIDYsMykgJT4lIA0KICBwdWxsKC4pDQoNCmlubGluZV8yIDwtIHNlcnYuZG9tICU+JSANCiAgbXV0YXRlKFRvdGFsID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoc3VtKFBPTkRFUkEpL3VuaXF1ZShUb3RhbCkqMTAwLCAwKSkgJT4lIA0KICBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIpICU+JQ0KICBwdWxsKGBQb3JjZW50YWplYCkNCg0KaW5saW5lXzMgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgU2V4byA9PSAiTXVqZXJlcyIpICU+JSANCiAgbXV0YXRlKFNlcnZpY2lvX2RvbWVzdGljbyA9IGNhc2Vfd2hlbihQUDA0QjEgPT0gMSB+ICJTw60iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDRCMSAhPSAxIH4gIk5vIikpICU+JSANCiAgZ3JvdXBfYnkoU2VydmljaW9fZG9tZXN0aWNvKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCwgMCkpICU+JSANCiAgc2VsZWN0KFNlcnZpY2lvX2RvbWVzdGljbywNCiAgICAgICAgIFBvcmNlbnRhamUpICU+JSANCiAgZmlsdGVyKFNlcnZpY2lvX2RvbWVzdGljbyA9PSAiU8OtIikgJT4lDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KaW5saW5lXzQgPC0gcm91bmQoMTAwL2FzLm51bWVyaWMoaW5saW5lXzMpLDApDQoNCmlubGluZV81IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgIENBVF9PQ1VQID09IDMsDQogICAgICAgICBTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBtdXRhdGUoU2VydmljaW9fZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIxICE9IDEgfiAiTm8iKSkgJT4lIA0KICBncm91cF9ieShTZXJ2aWNpb19kb21lc3RpY28pICU+JSANCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIA0KICBzZWxlY3QoU2VydmljaW9fZG9tZXN0aWNvLA0KICAgICAgICAgUG9yY2VudGFqZSkgJT4lDQogIGZpbHRlcihTZXJ2aWNpb19kb21lc3RpY28gPT0gIlPDrSIpICU+JQ0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmlubGluZV81X2F1eCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICBDQVRfT0NVUCA9PSAzLA0KICAgICAgICAgU2V4byA9PSAiTXVqZXJlcyIpICU+JSANCiAgbXV0YXRlKFNlcnZpY2lvX2RvbWVzdGljbyA9IGNhc2Vfd2hlbihQUDA0QjEgPT0gMSB+ICJTw60iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDRCMSAhPSAxIH4gIk5vIikpICU+JSANCiAgZ3JvdXBfYnkoU2VydmljaW9fZG9tZXN0aWNvKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCwwKSkgJT4lICNsZSBzYXF1w6kgbG9zIGRlY2ltYWxlcyBwYXJhIHBvZGVyIHBhc2FybG8gYSBuw7ptZXJvDQogIHNlbGVjdChTZXJ2aWNpb19kb21lc3RpY28sDQogICAgICAgICBQb3JjZW50YWplKSAlPiUNCiAgZmlsdGVyKFNlcnZpY2lvX2RvbWVzdGljbyA9PSAiU8OtIikgJT4lDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KaW5saW5lXzYgPC0gcm91bmQoMTAwL2FzLm51bWVyaWMoaW5saW5lXzVfYXV4KSwwKQ0KDQpgYGANCg0KIyMjIyBUcmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyANCjxicj48YnI+DQpFbCBpbnRlcsOpcyBwb3IgYW5hbGl6YXIgZGlzdGludGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHJhZGljYSBwcmluY2lwYWxtZW50ZSBlbiBsYSBtYWduaXR1ZCBxdWUgZGljaGEgb2N1cGFjacOzbiBwcmVzZW50YSwgZW4gc3UgZXN0cmVjaG8gdsOtbmN1bG8gY29uIGxhIGRpdmlzacOzbiBzZXh1YWwgZGVsIHRyYWJham8geSBsYSBmZW1pbml6YWNpw7NuIGRlIGVzdGUgc2VjdG9yIHksIGNvbW8gdmVyZW1vcyBsdWVnbywgcG9yIGxhcyBwYXJ0aWN1bGFybWVudGUgZGlmZXJlbmNpYWRhcyBjb25kaWNpb25lcywgYWNjZXNvIGEgZGVyZWNob3MgeSBiYWpvcyBpbmdyZXNvcyBxdWUgcGVyY2liZW4gYSBjYW1iaW8gZGUgc3UgdHJhYmFqby4gRW50cmUgbGFzIGdyYW5kZXMgY2l1ZGFkZXMgZGVsIHBhw61zLCBwdWVkZW4gY29udGFyc2UgX19jYXNpIGByIGlubGluZV8xYCBtaWwgcGVyc29uYXMgcXVlIGNvbXBvbmVuIGFsIHNlY3Rvcl9fLCBsbyBjdWFsIHJlcHJlc2VudGEgdW5hIGRyw6FzdGljYSBkaXNtaW51Y2nDs24gcmVzcGVjdG8gZGUgbGFzIGNpZnJhcyBoYWJpdHVhbG1lbnRlIG9ic2VydmFkYXMuIEEgc3UgdmV6LCBsYSB0YXNhIGRlIGZlbWluaWRhZCBkZWwgc2VjdG9yIGVzIGRlbCBgciBpbmxpbmVfMmAlLiBFcyBkZWNpciBxdWUgX19jYXNpIGVuIHN1IHRvdGFsaWRhZCBzZSB0cmF0YSBkZSB0cmFiYWphZG9yYXMgbXVqZXJlc19fLiBFcyBwb3IgZXN0byBxdWUsIGEgbG8gbGFyZ28gZGUgdG9kbyBlbCBpbmZvcm1lLCB1dGlsaXphcmVtb3MgcHJvbm9tYnJlcyBmZW1lbmlub3MgYSBsYSBob3JhIGRlIGdlbmVyYWxpemFyLCBhdW5xdWUgbXVjaGFzIHZlY2VzIGVzdGVtb3MgaGFibGFuZG8gZGVsIGNvbmp1bnRvIGRlIGxlcyB0cmFiYWphZG9yZXMgcXVlIHNlIGRlZGljYW4gYSBlc3RhIGFjdGl2aWRhZC4gQSBzdSB2ZXosIGNhYmUgZGVzdGFjYXIgcXVlIGVsIGVqZXJjaWNpbyBkZWJlIHNlciByZWFsaXphZG8gZW4gdMOpcm1pbm9zIGNpcy1iaW5hcmlvcyBwb3IgZmFsdGEgZGUgaW5mb3JtYWNpw7NuIHJlc3BlY3RvIGRlIGxhcyBpZGVudGlkYWRlcyB0cmFucy10cmF2ZXN0aSBlbiBsYXMgZXN0YWTDrXN0aWNhcyBvZmljaWFsZXMuDQo8YnI+PGJyPg0KTGFzIHRyYWJhamFkb3JhcyBxdWUgcmVhbGl6YW4gdGFyZWFzIGRvbcOpc3RpY2FzIHkgZGUgY3VpZGFkbyBlbiBob2dhcmVzIHBhcnRpY3VsYXJlcyByZXByZXNlbnRhbiB1biBgciBpbmxpbmVfM2AlIGRlbnRybyBkZWwgdG90YWwgZGUgb2N1cGFkYXMgbXVqZXJlcy4gRXN0byBzaWduaWZpY2EgcXVlIF9fdW5hIGRlIGNhZGEgYHIgaW5saW5lXzRgIG9jdXBhZGFzIGVuIEFyZ2VudGluYSB0cmFiYWphIGVuIGVzdGUgc2VjdG9yIGRlIGxhIGVjb25vbcOtYV9fLiBBbCBtaXNtbyB0aWVtcG8sIGVzdGFzIHRyYWJhamFkb3JhcyByZXByZXNlbnRhbiB1biBgciBpbmxpbmVfNWAlIGRlbnRybyBkZWwgdG90YWwgZGUgb2N1cGFkYXMtYXNhbGFyaWFkYXMuIE8gc2VhIHF1ZSBkZW50cm8gZGUgbGFzIG11amVyZXMgcXVlIHRyYWJhamFuIGVuIHJlbGFjacOzbiBkZSBkZXBlbmRlbmNpYSwgYWxyZWRlZG9yIGRlIDEgZGUgY2FkYSBgciBpbmxpbmVfNmAgdGllbmUgY29tbyBvY3VwYWNpw7NuIHByaW5jaXBhbCBlbCB0cmFiYWpvIGVuIGhvZ2FyZXMgcGFydGljdWxhcmVzLiBDb21vIHZlcmVtb3MgbcOhcyBhZGVsYW50ZSwgc2UgdHJhdGEgZGUgX19sYSBvY3VwYWNpw7NuIGFzYWxhcmlhZGEgbcOhcyBwb3B1bGFyIGVudHJlIGxhcyBtdWplcmVzX18uIEhheSBxdWUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBlc3RvcyBpbmRpY2Fkb3JlcyB0YW1iacOpbiByZXNwb25kZW4gYWwgY29udGV4dG8gcGFuZMOpbWljbyBkZWwgdHJpbWVzdHJlIGVzdHVkaWFkby4NCg0KLS0tDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0NhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBzZSBkZWRpY2FuIGFsIHNlcnZpY2lvIGRvbcOpc3RpY29fXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXJ2LmRvbSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoc3VtKFBPTkRFUkEpKSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICJjIiwgIGNvbC5uYW1lcyA9IE5VTEwpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSA1MCkgJT4lIA0KICByb3dfc3BlYyhyb3cgPSAxLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNjOWM5YzkiKQ0KYGBgDQoNCi0tLQ0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19Qb3JjZW50YWplIGRlIG11amVyZXMgeSBkZSB2YXJvbmVzIGVuIGVsIHNlY3Rvcl9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNlcnYuZG9tICU+JSANCiAgbXV0YXRlKFRvdGFsID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoc3VtKFBPTkRFUkEpL3VuaXF1ZShUb3RhbCkqMTAwKSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0U1NjE2RSIpDQpgYGANCg0KLS0tDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1BvcmNlbnRhamUgZGUgbGEgb2N1cGFjacOzbiBkZW50cm8gZGUgbGFzIG9jdXBhZGFzIG11amVyZXNfXzwvcD4NCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBmaWx0ZXIoRVNUQURPID09IDEsDQogICAgICAgICBTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBtdXRhdGUoU2VydmljaW9fZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIxICE9IDEgfiAiTm8iKSkgJT4lIA0KICBncm91cF9ieShTZXJ2aWNpb19kb21lc3RpY28pICU+JSANCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIA0KICBzZWxlY3QoIsK/U2UgZGVkaWNhIGFsIHNlcnZpY2lvIGRvbcOpc3RpY28/IiA9IFNlcnZpY2lvX2RvbWVzdGljbywNCiAgICAgICAgIFBvcmNlbnRhamUpICU+JSANCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKQ0KYGBgDQoNCi0tLQ0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19Qb3JjZW50YWplIGRlIGxhIG9jdXBhY2nDs24gZGVudHJvIGRlIGxhcyBhc2FsYXJpYWRhcyBtdWplcmVzX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgQ0FUX09DVVAgPT0gMywNCiAgICAgICAgIFNleG8gPT0gIk11amVyZXMiKSAlPiUgDQogIG11dGF0ZShTZXJ2aWNpb19kb21lc3RpY28gPSBjYXNlX3doZW4oUFAwNEIxID09IDEgfiAiU8OtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA0QjEgIT0gMSB+ICJObyIpKSAlPiUgDQogIGdyb3VwX2J5KFNlcnZpY2lvX2RvbWVzdGljbykgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApKSAlPiUgDQogIHNlbGVjdCgiwr9TZSBkZWRpY2EgYWwgc2VydmljaW8gZG9tw6lzdGljbz8iID0gU2VydmljaW9fZG9tZXN0aWNvLA0KICAgICAgICAgUG9yY2VudGFqZSkgJT4lIA0KICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0U1NjE2RSIpDQpgYGANCg0KIyMjIENhcmFjdGVyw61zdGljYXMgDQoNCi0tLQ0KDQojIyMjIEFsZ3VuYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQo8YnI+PGJyPg0KRW4gZXN0YSBzZWNjacOzbiBzZSBwcmVzZW50YW4gYWxndW5hcyBtw6l0cmljYXMgcmVzcGVjdG8gYSBsYSBkaXN0cmlidWNpw7NuIGV0YXJpYSwgZWwgbHVnYXIgZGUgbmFjaW1pZW50byB5IGNhcmFjdGVyw61zdGljYXMgZWR1Y2F0aXZhcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlbCBzZWN0b3IgZGUgc2VydmljaW8gZG9tw6lzdGljby4gU2UgZGVzdGFjYSBsYSBzb2JyZXJyZXByZXNlbnRhY2nDs24gZGUgbWlncmFudGVzIGVuIGVsIHNlY3Rvci4NCg0KLS0tDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFRhYmxhIGludGVybWVkaWEuIFBvcmNlbnRhamVzIHBvciBFZGFkLg0KdGFibGExIDwtIHNlcnYuZG9tICU+JSANCiAgZ3JvdXBfYnkoR1JVUE9fRURBRCkgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLA0KICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIA0KICBzZWxlY3QoRWRhZCA9IEdSVVBPX0VEQUQsIENhbnRpZGFkLCBQb3JjZW50YWplKQ0KDQppbmxpbmVfNyA8LSB0YWJsYTEgJT4lIA0KICBmaWx0ZXIoRWRhZCA9PSAiZGUgMzAgYSA0OSBhw7FvcyIpICU+JQ0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmlubGluZV84IDwtIHRhYmxhMSAlPiUgDQogIGZpbHRlcihFZGFkID09ICJkZSA1MCBhIDY0IGHDsW9zIikgJT4lDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KaW5saW5lXzkgPC0gdGFibGExICU+JSANCiAgZmlsdGVyKEVkYWQgPT0gIjY1IGHDsW9zIHkgbcOhcyIpICU+JQ0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmlubGluZV8xMCA8LSB0YWJsYTEgJT4lIA0KICBmaWx0ZXIoRWRhZCA9PSAiZGUgMTQgYSAyOSBhw7FvcyIpICU+JQ0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmBgYA0KDQojIyMjIyBFZGFkDQo8YnI+DQpNaWVudHJhcyBxdWUgdW4gYHIgaW5saW5lXzdgJSBkZSBlc3RhcyB0cmFiYWphZG9yYXMgdGllbmVuIGVudHJlIDMwIHkgNDkgYcOxb3MsIHVuIGByIGlubGluZV84YCUgdGllbmUgZW50cmUgNTAgeSA2NCBhw7Fvcy4gUG9yIHN1IHBhcnRlLCBoYXkgdW4gYHIgaW5saW5lXzlgJSBxdWUgY29udGluw7phIHRyYWJhamFuZG8gYSBwZXNhciBkZSBoYWJlciBzdXBlcmFyIGxvcyA2NSBhw7FvcywgeSB1biBgciBpbmxpbmVfMTBgJSBlc3TDoSBjb21wdWVzdG8gcG9yIGrDs3ZlbmVzIHF1ZSBubyBsbGVnYW4gYSBsb3MgMzAgYcOxb3MuDQoNCi0tLQ0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19Db21wb3NpY2lvbiBwb3IgZWRhZCBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlbCBzZXJ2aWNpbyBkb23DqXN0aWNvX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFibGExICU+JSANCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTEpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVGFibGEgaW50ZXJtZWRpYS4gQ2Fzb3MgZGUgc2VydmljaW8gZG9tw6lzdGljby4gQ2hlcXVlbyBjYW50aWRhZGVzIG11ZXN0cmFsZXMuDQp0YWJsYTIgPC0gc2Vydi5kb20gJT4lIA0KICBncm91cF9ieShET05ERV9OQUNJTykgJT4lIA0KICBzdW1tYXJpc2Uobj1uKCksDQogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCksDQogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUgDQogIHNlbGVjdChET05ERV9OQUNJTywgQ2FudGlkYWQsIFBvcmNlbnRhamUpDQoNCiMgVGFibGEgaW50ZXJtZWRpYS4gVG9kb3MgbG9zIGNhc29zLiBDaGVxdWVvIGNhbnRpZGFkZXMgbXVlc3RyYWxlcy4NCnRhYmxhMyA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIA0KICBncm91cF9ieShET05ERV9OQUNJTykgJT4lIA0KICBzdW1tYXJpc2Uobj1uKCksDQogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCksDQogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUgDQogIHNlbGVjdChET05ERV9OQUNJTywgQ2FudGlkYWQsIFBvcmNlbnRhamUpDQoNCmlubGluZV8xMSA8LSB0YWJsYTMgJT4lDQogIGZpbHRlcihET05ERV9OQUNJTyA9PSAiRW4gb3RyYSBwcm92aW5jaWEiKSAlPiUNCiAgcHVsbChQb3JjZW50YWplKQ0KDQppbmxpbmVfMTIgPC0gdGFibGEzICU+JQ0KICBmaWx0ZXIoRE9OREVfTkFDSU8gPT0gIkVuIHVuIHBhw61zIGxpbcOtdHJvZmUiKSAlPiUNCiAgcHVsbChQb3JjZW50YWplKQ0KDQoNCmlubGluZV8xMyA8LSB0YWJsYTIgJT4lDQogIGZpbHRlcihET05ERV9OQUNJTyA9PSAiRW4gb3RyYSBwcm92aW5jaWEiKSAlPiUNCiAgcHVsbChQb3JjZW50YWplKQ0KDQppbmxpbmVfMTQgPC0gdGFibGEyICU+JQ0KICBmaWx0ZXIoRE9OREVfTkFDSU8gPT0gIkVuIHVuIHBhw61zIGxpbcOtdHJvZmUiKSAlPiUNCiAgcHVsbChQb3JjZW50YWplKQ0KDQpgYGANCg0KIyMjIyMgTHVnYXIgZGUgbmFjaW1pZW50bw0KPGJyPg0KQ29uc2lkZXJhbmRvIGEgbGEgcG9ibGFjacOzbiBlbiBnZW5lcmFsLCB1biBgciBpbmxpbmVfMTFgJSBzZSBlbmN1ZW50cmEgdml2aWVuZG8gZW4gdW5hIHByb3ZpbmNpYSBkaXN0aW50YSBhIGxhIHF1ZSB0aWVuZSBjb21vIGx1Z2FyIGRlIG5hY2ltaWVudG8sIHkgdW4gYHIgaW5saW5lXzEyYCUgcHJvdmllbmUgZGUgdW4gcGHDrXMgbGltw610cm9mZS4gUG9yIHN1IHBhcnRlLCBfX2VuIGVsIGNhc28gZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvX18sIHVuIGByIGlubGluZV8xM2AlIGhhIG1pZ3JhZG8gZGUgcHJvdmluY2lhIHkgbcOhcyBkZWwgYHIgaW5saW5lXzE0YCUgcHJvdmllbmUgZGUgdW4gcGHDrXMgbGltw610cm9mZSwgZXMgZGVjaXIgcXVlIF9fbGFzIHBlcnNvbmFzIG1pZ3JhbnRlcyBzZSBlbmN1ZW50cmFuIHNvYnJlcnJlcHJlc2VudGFkYXMgZW4gZGljaG8gc2VjdG9yIGRlIGxhIGVjb25vbcOtYV9fLiBQdWVkZSBvYnNlcnZhcnNlIGVudG9uY2VzIHF1ZSBsYSBvY3VwYWNpw7NuIGVzdMOhIGVzdHJlY2hhbWVudGUgcmVsYWNpb25hZGEgY29uIGxvcyBmZW7Ds21lbm9zIG1pZ3JhdG9yaW9zLg0KDQotLS0NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fTHVnYXIgZGUgbmFjaW1pZW50byBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28geSBkZWwgdG90YWwgZGUgbGEgcG9ibGFjacOzbl9fPC9wPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgVGFibGEgaW50ZXJtZWRpYS4gQ2Fzb3MgZGUgc2VydmljaW8gZG9tw6lzdGljby4gQ2hlcXVlbyBjYW50aWRhZGVzIG11ZXN0cmFsZXMuDQp0YWJsZShzZXJ2LmRvbSRET05ERV9OQUNJTywgZXhjbHVkZSA9IE5VTEwpDQoNCmlubGluZV8xNSA8LSBzZXJ2LmRvbSAlPiUNCiAgc2VsZWN0KERPTkRFX05BQ0lPKSAlPiUgDQogIGNvdW50KERPTkRFX05BQ0lPKSAlPiUgDQogIGZpbHRlcihET05ERV9OQUNJTyA9PSAiRW4gdW4gcGHDrXMgbGltw610cm9mZSIpICU+JQ0KICBwdWxsKG4pICU+JSANCiAgYXMubnVtZXJpYyguKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsZWZ0X2pvaW4odGFibGEyLCB0YWJsYTMsIGJ5ID0gIkRPTkRFX05BQ0lPIikgJT4lIA0KICBmaWx0ZXIoRE9OREVfTkFDSU8gIT0gIkVuIG90cm8gcGHDrXMiLA0KICAgICAgICAgRE9OREVfTkFDSU8gIT0gIk5TL05SIikgJT4lIA0KICBzZWxlY3QoIsK/RMOzbmRlIG5hY2nDsz8iID0gRE9OREVfTkFDSU8sDQogICAgICAgICAiMS4gQ2FudGlkYWQiID0gQ2FudGlkYWQueCwNCiAgICAgICAgICIxLiBQb3JjZW50YWplIiA9IFBvcmNlbnRhamUueCwNCiAgICAgICAgICIyLiBDYW50aWRhZCIgPSBDYW50aWRhZC55LA0KICAgICAgICAgIjIuIFBvcmNlbnRhamUiID0gUG9yY2VudGFqZS55KSAlPiUgDQogIGthYmxlKGFsaWduID0gImMiKSAlPiUgDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICAgICAgIiA9IDEsICJUcmFiYWphZG9yYXMgZGUgU2VydmljaW8gRG9tw6lzdGljbyIgPSAyLCAiUG9ibGFjacOzbiBnZW5lcmFsIiA9IDIpLCANCiAgICAgICAgICAgICAgICAgICBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRTU2MTZFIikNCmBgYA0KDQpfTm90YTogTGFzIGVzdGltYWNpb25lcyBjb3JyZXNwb25kaWVudGVzIGEgYXF1ZWxsYXMgcGVyc29uYXMgcXVlIGhhbiBuYWNpZG8gZW4gb3RybyBwYcOtcyAobm8gbGltw610cm9mZSkgeSBhcXVlbGxhcyBxdWUgTlMvTlIgbGEgcHJlZ3VudGEsIG5vIGN1ZW50YW4gY29uIHN1ZmljaWVudGVzIGNhc29zIG11ZXN0cmFsZXMgY29tbyBwYXJhIGdhcmFudGl6YXIgc2lnbmlmaWNhdGl2aWRhZCBkZWwgZGF0bywgcG9yIGxvIHF1ZSBzZSBoYSByZXRpcmFkbyBkZWwgY3VhZHJvIGxhcyBjYXRlZ29yw61hcy4gRW4gZXN0ZSB0cmltZXN0cmUgZW4gcGFydGljdWxhciwgbGEgY2F0ZWdvcsOtYSAiRW4gdW4gcGHDrXMgbGltw610cm9mZSIgcGFyYSBlbCBjYXNvIGRlIGxhcyBUcmFiYWphZG9yYXMgZGUgU2VydmljaW8gRG9tw6lzdGljbyBjdWVudGEgY29uIGByIGlubGluZV8xNWAgY2Fzb3MgbXVlc3RyYWxlcy5fICAgICANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJtKHRhYmxhMiwgdGFibGEzKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQppbmxpbmVfMTYgPC0gc2Vydi5kb20gJT4lIA0KICBncm91cF9ieShOSVZFTF9FRFVDQVRJVk8pICU+JSANCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSwNCiAgICAgICAgIENhbnRpZGFkID0gZm9ybWF0b19jYW50aWRhZChDYW50aWRhZCkpICU+JQ0KICBmaWx0ZXIoTklWRUxfRURVQ0FUSVZPID09ICJTZWN1bmRhcmlhIikgJT4lIA0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmlubGluZV8xNyA8LSBzZXJ2LmRvbSAlPiUgDQogIGdyb3VwX2J5KE5JVkVMX0VEVUNBVElWTykgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLA0KICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lDQogIGZpbHRlcihOSVZFTF9FRFVDQVRJVk8gPT0gIlNpbiBJbnN0cnVjY2nDs24iKSAlPiUgDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KYGBgDQoNCiMjIyMjIEVkdWNhY2nDs24NCjxicj4NCk3DoXMgZGUgbGEgbWl0YWQgZGUgbGFzIHRyYWJhamFkb3JhcyBkZWwgc2VjdG9yIGZpbmFsaXrDsyBlbCBuaXZlbCBwcmltYXJpbyBkZSBlc2NvbGFyaWRhZCwgYSBsbyBxdWUgc2Ugc3VtYSB1biBgciBpbmxpbmVfMTZgJSBxdWUgY3VlbnRhIHRhbWJpw6luIGNvbiBlbCBuaXZlbCBzZWN1bmRhcmlvLCBlbiB0YW50byB1biBgciBpbmxpbmVfMTdgJSBubyBwb3NlZSBpbnN0cnVjY2nDs24gZm9ybWFsLg0KDQotLS0NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnRhYmxlKHNlcnYuZG9tJE5JVkVMX0VEVUNBVElWTykNCmBgYA0KDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX0NvbXBvc2ljaW9uIHBvciBuaXZlbCBlZHVjYXRpdm8gZGUgbGFzIHRyYWJhamFkb3JhcyBkZWwgc2VydmljaW8gZG9tw6lzdGljb19fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNlcnYuZG9tICU+JSANCiAgZ3JvdXBfYnkoTklWRUxfRURVQ0FUSVZPKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCksDQogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUNCiAgZmlsdGVyKE5JVkVMX0VEVUNBVElWTyAhPSAiU3VwZXJpb3IiKSAlPiUgDQogIHNlbGVjdCgiTml2ZWwgZWR1Y2F0aXZvIiA9IE5JVkVMX0VEVUNBVElWTywgQ2FudGlkYWQsIFBvcmNlbnRhamUpICU+JSANCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKQ0KYGBgDQoNCl9Ob3RhOiBMYSBlc3RpbWFjacOzbiBjb3JyZXNwb25kaWVudGUgYSBhcXVlbGxhcyBxdWUgaGFuIGZpbmFsaXphZG8gdW4gbml2ZWwgc3VwZXJpb3IgZGUgZm9ybWFjacOzbiBubyBjdWVudGEgY29uIHN1ZmljaWVudGVzIGNhc29zIG11ZXN0cmFsZXMgY29tbyBwYXJhIGdhcmFudGl6YXIgc2lnbmlmaWNhdGl2aWRhZCBkZWwgZGF0bywgcG9yIGxvIHF1ZSBzZSBoYSByZXRpcmFkbyBkZWwgY3VhZHJvIGxhIGNhdGVnb3LDrWEuXw0KDQojIyMgSW50ZW5zaWRhZCBkZWwgdHJhYmFqbw0KDQotLS0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhYmxhMSA8LSBzZXJ2LmRvbSAlPiUgDQogIG11dGF0ZShJbnRlbnNpZGFkID0gY2FzZV93aGVuKElOVEVOU0kgPT0gMSB+ICJTdWJvY3VwYWRhcyBwb3IgaW5zdWZpY2llbmNpYSBob3JhcmlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5TSSA9PSAyIH4gIk9jdXBhZGFzIHBsZW5hcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOU0kgPT0gMyB+ICJTb2JyZW9jdXBhZGFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5TSSA9PSA0IH4gIk9jdXBhZGEgcXVlIG5vIHRyYWJhasOzIGVuIGxhIHNlbWFuYSIpKSAlPiUgDQogIGdyb3VwX2J5KEludGVuc2lkYWQpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBuKCksDQogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCksDQogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUgDQogIHNlbGVjdChJbnRlbnNpZGFkLCBDYW50aWRhZCwgUG9yY2VudGFqZSkgDQoNCmlubGluZV8xOCA8LSB0YWJsYTEgJT4lIA0KICBmaWx0ZXIoSW50ZW5zaWRhZCA9PSAiT2N1cGFkYXMgcGxlbmFzIikgJT4lIA0KICBwdWxsKFBvcmNlbnRhamUpDQoNCmlubGluZV8xOSA8LSB0YWJsYTEgJT4lIA0KICBmaWx0ZXIoSW50ZW5zaWRhZCA9PSAiU3Vib2N1cGFkYXMgcG9yIGluc3VmaWNpZW5jaWEgaG9yYXJpYSIpICU+JSANCiAgcHVsbChQb3JjZW50YWplKQ0KDQppbmxpbmVfMjAgPC0gdGFibGExICU+JSANCiAgZmlsdGVyKEludGVuc2lkYWQgPT0gIlNvYnJlb2N1cGFkYXMiKSAlPiUgDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KaW5saW5lXzIxIDwtIHRhYmxhMSAlPiUgDQogIGZpbHRlcihJbnRlbnNpZGFkID09ICJPY3VwYWRhIHF1ZSBubyB0cmFiYWrDsyBlbiBsYSBzZW1hbmEiKSAlPiUgDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KdGFibGEyIDwtIHNlcnYuZG9tICU+JSANCiAgZmlsdGVyKFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5LA0KICAgICAgICAgUFAzRl9UT1QgIT0gOTk5KSAlPiUgDQogIG11dGF0ZShjYW50aWRhZF9ob2dhcmVzID0gY2FzZV93aGVuKFBQMDRCMiA9PSAxIH4gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA0QjIgPT0gMiB+ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIyID49IDMgfiAiMyBvIG3DoXMiKSkgJT4lIA0KICBncm91cF9ieShjYW50aWRhZF9ob2dhcmVzKSAlPiUgDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSksDQogICAgICAgICAgICBoc19vY3VwX3ByaW5jID0gZm9ybWF0b19wb3JjKHdlaWdodGVkLm1lYW4oUFAzRV9UT1QsIFBPTkRFUkEpLDApLA0KICAgICAgICAgICAgaHNfdG90YWxlcyA9IGZvcm1hdG9fcG9yYyh3ZWlnaHRlZC5tZWFuKFBQM0VfVE9UICsgUFAzRl9UT1QsIFBPTkRFUkEpLDApKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwLCAwKSkgJT4lICNsZSBzYXF1w6kgbG9zIGRlY2ltYWxlcyBwb3JxdWUgZGFiYSBlbnRlcm8gIA0KICBzZWxlY3QoIkNhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamEiID0gY2FudGlkYWRfaG9nYXJlcywNCiAgICAgICAgIENhbnRpZGFkLCBQb3JjZW50YWplLCANCiAgICAgICAgICJocy9zZW0gZW4gb2N1cC4gcHJpbmMuIiA9IGhzX29jdXBfcHJpbmMsIA0KICAgICAgICAgImhzL3NlbSBjb24gb2N1cC4gc2VjdW5kLiIgPSBoc190b3RhbGVzKQ0KDQppbmxpbmVfMjIgPC0gdGFibGEyICU+JSANCiAgZmlsdGVyKGBDYW50aWRhZCBkZSBob2dhcmVzIGVuIHF1ZSB0cmFiYWphYCA9PSAxKSAlPiUgDQogIHB1bGwoUG9yY2VudGFqZSkNCg0KaW5saW5lXzIzYSA8LSB0YWJsYTIgJT4lIA0KICBmaWx0ZXIoYENhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamFgID09IDIpICU+JQ0KICBwdWxsKFBvcmNlbnRhamUpICU+JSANCiAgYXMubnVtZXJpYyguKQ0KDQppbmxpbmVfMjNiIDwtIHRhYmxhMiAlPiUgDQogIGZpbHRlcihgQ2FudGlkYWQgZGUgaG9nYXJlcyBlbiBxdWUgdHJhYmFqYWAgPT0gIjMgbyBtw6FzIikgJT4lDQogIHB1bGwoUG9yY2VudGFqZSkgJT4lIA0KICBhcy5udW1lcmljKC4pDQoNCmlubGluZV8yMyA8LSByb3VuZCgoaW5saW5lXzIzYSArIGlubGluZV8yM2IpLDApDQoNCmlubGluZV8yNCA8LSB0YWJsYTIgJT4lIA0KICBmaWx0ZXIoYENhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamFgID09IDEpICU+JSANCiAgcHVsbChgaHMvc2VtIGVuIG9jdXAuIHByaW5jLmApDQogIA0KaW5saW5lXzI1YSA8LSB0YWJsYTIgJT4lIA0KICBmaWx0ZXIoYENhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamFgID09IDIpICU+JQ0KICBwdWxsKGBocy9zZW0gZW4gb2N1cC4gcHJpbmMuYCkgJT4lIA0KICBhcy5udW1lcmljKC4pDQoNCmlubGluZV8yNWIgPC0gdGFibGEyICU+JSANCiAgZmlsdGVyKGBDYW50aWRhZCBkZSBob2dhcmVzIGVuIHF1ZSB0cmFiYWphYCA9PSAiMyBvIG3DoXMiKSAlPiUNCiAgcHVsbChgaHMvc2VtIGVuIG9jdXAuIHByaW5jLmApICU+JSANCiAgYXMubnVtZXJpYyguKQ0KDQppbmxpbmVfMjUgPC0gcm91bmQoKGlubGluZV8yNWEraW5saW5lXzI1YikvMikNCg0KaW5saW5lXzI2YSA8LSB0YWJsYTIgJT4lIA0KICBmaWx0ZXIoYENhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamFgID09IDIpICU+JQ0KICBwdWxsKGBocy9zZW0gY29uIG9jdXAuIHNlY3VuZC5gKSAlPiUgDQogIGFzLm51bWVyaWMoLikNCg0KaW5saW5lXzI2YiA8LSB0YWJsYTIgJT4lIA0KICBmaWx0ZXIoYENhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamFgID09ICIzIG8gbcOhcyIpICU+JQ0KICBwdWxsKGBocy9zZW0gY29uIG9jdXAuIHNlY3VuZC5gKSAlPiUgDQogIGFzLm51bWVyaWMoLikgDQoNCmlubGluZV8yNiA8LSByb3VuZCgoaW5saW5lXzI2YStpbmxpbmVfMjZiKS8yKQ0KYGBgDQoNCiMjIyMgSW50ZW5zaWRhZCBkZWwgdHJhYmFqbyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28NCjxicj48YnI+DQpFbiByZWxhY2nDs24gYSBsYSBjYW50aWRhZCBkZSBob3JhcyBxdWUgdHJhYmFqYW4gc2VtYW5hbG1lbnRlIGxhcyBlbXBsZWFkYXMgZG9tw6lzdGljYXMsIHVuIGByIGlubGluZV8xOGAlIHNvbiBvY3VwYWRhcyAicGxlbmFzIiwgZXMgZGVjaXIgcXVlIHRyYWJhamFuIGVudHJlIDM1IHkgNDUgaG9yYXMgc2VtYW5hbGVzLCBvIGVzdMOhbiBjb25mb3JtZXMgY29uIGxhIGNhbnRpZGFkIGRlIGhvcmFzIHF1ZSB0cmFiYWphbi4gQWwgbWlzbW8gdGllbXBvIF9fdW4gYHIgaW5saW5lXzE5YCUgc2UgZW5jdWVudHJhIHN1Yi1vY3VwYWRhX18sIHRyYWJhamEgbWVub3MgZGUgMzUgaG9yYXMgc2VtYW5hbGVzIHBvciBjYXVzYXMgaW52b2x1bnRhcmlhcywgZXN0YW5kbyBkaXNwdWVzdGFzIGEgdHJhYmFqYXIgbcOhcyBob3Jhcy4gUG9yIHN1IHBhcnRlLCBfX3VuIGByIGlubGluZV8yMGAlIGVzdMOhIHNvYnJlLW9jdXBhZGFfXywgdHJhYmFqYSBtw6FzIGRlIDQ1IGhvcmFzIHBvciBzZW1hbmEuIFJlc3BlY3RvIGEgbGFzIG9jdXBhZGFzIHF1ZSBubyBzZSBlbmNvbnRyYWJhbiB0cmFiYWphbmRvIGVuIGxhIHNlbWFuYSBkZSByZWZlcmVuY2lhIGRlIGxhIGVudHJldmlzdGEsIHNvbiBlbCBgciBpbmxpbmVfMjFgJS4NCjxicj48YnI+DQpFbiBjdWFudG8gYSBsYSBjYW50aWRhZCBkZSBob2dhcmVzIGVuIHF1ZSBzZSBkZXNlbXBlw7FhbiwgdW4gYHIgaW5saW5lXzIyYCUgdHJhYmFqYSBoYWJpdHVhbG1lbnRlIGVuIHVuYSBzb2xhIGNhc2EsIHBvciBsbyBxdWUgYWwgbWlzbW8gdGllbXBvIGNhc2kgdW4gYHIgaW5saW5lXzIzYCUgZGUgZWxsYXMgc3VlbGUgdHJhYmFqYXIgZW4gbcOhcyBkZSB1bmEgdml2aWVuZGEuIF9fTWllbnRyYXMgcXVlIGxhcyBxdWUgc29uIGNvbnRyYXRhZGFzIHBvciB1biBzw7NsbyBob2dhciB0cmFiYWphcm9uIGNlcmNhIGRlIGByIGlubGluZV8yNGAgaG9yYXMgc2VtYW5hbGVzIChqb3JuYWRhIHBhcnQtdGltZSksIGFxdWVsbGFzIHF1ZSB0cmFiYWphbiBlbiBtw6FzIGRlIHVuYSBjYXNhIHRyYWJhamFyb24gZW4gcHJvbWVkaW8gbWVub3MgZGUgYHIgaW5saW5lXzI1YCBob3JhcyBwb3Igc2VtYW5hIGVuIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsLCBhY2VyY8OhbmRvc2UgYSBsYXMgYHIgaW5saW5lXzI2YCBob3JhcyBzZW1hbmFsZXMgY29uIGxhcyBvY3VwYWNpb25lcyBzZWN1bmRhcmlhc19fLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGExLCB0YWJsYTIpDQpgYGANCg0KLS0tDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpzZXJ2LmRvbSAlPiUgDQogIG11dGF0ZShJbnRlbnNpZGFkID0gY2FzZV93aGVuKElOVEVOU0kgPT0gMSB+ICJTdWJvY3VwYWRhcyBwb3IgaW5zdWZpY2llbmNpYSBob3JhcmlhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5TSSA9PSAyIH4gIk9jdXBhZGFzIHBsZW5hcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOU0kgPT0gMyB+ICJTb2JyZW9jdXBhZGFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5TSSA9PSA0IH4gIk9jdXBhZGEgcXVlIG5vIHRyYWJhasOzIGVuIGxhIHNlbWFuYSIpKSAlPiUgDQogIGdyb3VwX2J5KEludGVuc2lkYWQpICU+JSANCiAgc3VtbWFyaXNlKG4gPSBuKCksDQogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkNCmBgYA0KDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1RyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHNlZ8O6biBpbnRlbnNpZGFkIGRlbCB0cmFiYWpvX188L3A+DQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc2Vydi5kb20gJT4lIA0KICBtdXRhdGUoSW50ZW5zaWRhZCA9IGNhc2Vfd2hlbihJTlRFTlNJID09IDEgfiAiU3Vib2N1cGFkYXMgcG9yIGluc3VmaWNpZW5jaWEgaG9yYXJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOU0kgPT0gMiB+ICJPY3VwYWRhcyBwbGVuYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlNJID09IDMgfiAiU29icmVvY3VwYWRhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOU0kgPT0gNCB+ICJPY3VwYWRhIHF1ZSBubyB0cmFiYWrDsyBlbiBsYSBzZW1hbmEiKSkgJT4lIA0KICBncm91cF9ieShJbnRlbnNpZGFkKSAlPiUgDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLA0KICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIA0KICBmaWx0ZXIoSW50ZW5zaWRhZCAhPSAiT2N1cGFkYSBxdWUgbm8gdHJhYmFqw7MgZW4gbGEgc2VtYW5hIikgJT4lIA0KICBzZWxlY3QoSW50ZW5zaWRhZCwgQ2FudGlkYWQsIFBvcmNlbnRhamUpICU+JSANCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKQ0KYGBgDQoNCl9Ob3RhOiBMYSBlc3RpbWFjacOzbiBjb3JyZXNwb25kaWVudGUgYSBhcXVlbGxhcyBxdWUgbm8gdHJhYmFqYXJvbiBlbiBsYSBzZW1hbmEgZGUgcmVmZXJlbmNpYSBkZSBsYSBlbmN1ZXN0YSBubyBjdWVudGEgY29uIHN1ZmljaWVudGVzIGNhc29zIG11ZXN0cmFsZXMgY29tbyBwYXJhIGdhcmFudGl6YXIgc2lnbmlmaWNhdGl2aWRhZCBkZWwgZGF0bywgcG9yIGxvIHF1ZSBzZSBoYSByZXRpcmFkbyBkZWwgY3VhZHJvIGxhIGNhdGVnb3LDrWFfDQoNCi0tLQ0KDQo8cCBzdHlsZT0iY29sb3I6I0U1NjE2RSI+X19UcmFiYWphZG9yYXMgZGVsIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIGxhIGNhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gbG9zIHF1ZSB0cmFiYWphbl9fPC9wPg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNlcnYuZG9tICU+JSANCiAgZmlsdGVyKFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcw0KICAgICAgICAgUFAzRV9UT1QgIT0gOTk5LA0KICAgICAgICAgUFAzRl9UT1QgIT0gOTk5KSAlPiUgDQogIG11dGF0ZShjYW50aWRhZF9ob2dhcmVzID0gY2FzZV93aGVuKFBQMDRCMiA9PSAxIH4gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA0QjIgPT0gMiB+ICIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIyID49IDMgfiAiMyBvIG3DoXMiKSkgJT4lIA0KICBncm91cF9ieShjYW50aWRhZF9ob2dhcmVzKSAlPiUgDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSksDQogICAgICAgICAgICBoc19vY3VwX3ByaW5jID0gZm9ybWF0b19wb3JjKHdlaWdodGVkLm1lYW4oUFAzRV9UT1QsIFBPTkRFUkEpKSwNCiAgICAgICAgICAgIGhzX3RvdGFsZXMgPSBmb3JtYXRvX3BvcmMod2VpZ2h0ZWQubWVhbihQUDNFX1RPVCArIFBQM0ZfVE9ULCBQT05ERVJBKSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLA0KICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIA0KICBzZWxlY3QoIkNhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHRyYWJhamEiID0gY2FudGlkYWRfaG9nYXJlcywNCiAgICAgICAgIENhbnRpZGFkLCBQb3JjZW50YWplLCANCiAgICAgICAgICJocy9zZW0gZW4gb2N1cC4gcHJpbmMuIiA9IGhzX29jdXBfcHJpbmMsIA0KICAgICAgICAgImhzL3NlbSBjb24gb2N1cC4gc2VjdW5kLiIgPSBoc190b3RhbGVzKSAlPiUgDQogIGthYmxlKGFsaWduID0gImMiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRTU2MTZFIikNCmBgYA0KDQojIyMgRGVyZWNob3MgbGFib3JhbGVzDQoNCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBUb3RhbCBkZSBhc2FsYXJpYWRlcy4gRW1wbGVvIHNpbiBkZXNjdWVudG8ganViaWxhdG9yaW8NCmlubGluZV8yOCA8LWJhc2VfaW5kaXZpZHVhbCAlPiUgDQogIGZpbHRlcihFU1RBRE8gPT0gMSwNCiAgICAgICAgIENBVF9PQ1VQPT0zKSAlPiUgDQogIHN1bW1hcmlzZSgiVGFzYSBkZSBubyByZWdpc3RybyIgPSBmb3JtYXRvX3BvcmMoc3VtKFBPTkRFUkFbUFAwN0g9PTJdKS9zdW0oUE9OREVSQSkqMTAwKSkgJT4lIA0KICBwdWxsKC4pDQoNCiMgVG90YWwgZGUgYXNhbGFyaWFkZXMuIEVtcGxlbyBzaW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvIHBvciBzZXhvDQppbmxpbmVfMjkgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSANCiAgZmlsdGVyKEVTVEFETz09MSwNCiAgICAgICAgIENBVF9PQ1VQPT0zKSAlPiUgDQogIGdyb3VwX2J5KFNleG8pICU+JSANCiAgc3VtbWFyaXNlKCJUYXNhIGRlIG5vIHJlZ2lzdHJvIiA9IGZvcm1hdG9fcG9yYyhzdW0oUE9OREVSQVtQUDA3SD09Ml0pL3N1bShQT05ERVJBKSoxMDApKSAlPiUgDQogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBwdWxsKGBUYXNhIGRlIG5vIHJlZ2lzdHJvYCkNCg0KdGFibGExIDwtIHNlcnYuZG9tICU+JSANCiAgZ3JvdXBfYnkoRGVzY3VlbnRvX2p1YmlsYXRvcmlvKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkpICU+JSANCiAgc2VsZWN0KERlc2N1ZW50b19qdWJpbGF0b3JpbywgUG9yY2VudGFqZSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gRGVzY3VlbnRvX2p1YmlsYXRvcmlvLCB2YWx1ZXNfZnJvbSA9IFBvcmNlbnRhamUpICU+JSANCiAgbXV0YXRlKEluZGljYWRvciA9ICLCv1RpZW5lIGRlc2N1ZW50byBqdWJpbGF0b3Jpbz8iKQ0KDQp0YWJsYTIgPC0gc2Vydi5kb20gJT4lIA0KICBncm91cF9ieShWYWNhY2lvbmVzX3BhZ2FzKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIA0KICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkpICU+JSANCiAgc2VsZWN0KFZhY2FjaW9uZXNfcGFnYXMsIFBvcmNlbnRhamUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFZhY2FjaW9uZXNfcGFnYXMsIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIA0KICBtdXRhdGUoSW5kaWNhZG9yID0gIsK/VGllbmUgdmFjYWNpb25lcyBwYWdhcz8iKQ0KDQp0YWJsYTMgPC0gc2Vydi5kb20gJT4lIA0KICBncm91cF9ieShBZ3VpbmFsZG8pICU+JSANCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIA0KICBzZWxlY3QoQWd1aW5hbGRvLCBQb3JjZW50YWplKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBBZ3VpbmFsZG8sIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIA0KICBtdXRhdGUoSW5kaWNhZG9yID0gIsK/VGllbmUgYWd1aW5hbGRvPyIpDQoNCnRhYmxhNCA8LSBzZXJ2LmRvbSAlPiUgDQogIGdyb3VwX2J5KERpYXNfZW5mZXJtZWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApKSAlPiUgDQogIHNlbGVjdChEaWFzX2VuZmVybWVkYWQsIFBvcmNlbnRhamUpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IERpYXNfZW5mZXJtZWRhZCwgdmFsdWVzX2Zyb20gPSBQb3JjZW50YWplKSAlPiUgDQogIG11dGF0ZShJbmRpY2Fkb3IgPSAiwr9UaWVuZSBkw61hcyBwYWdvcyBwb3IgZW5mZXJtZWRhZD8iKQ0KDQp0YWJsYTUgPC0gc2Vydi5kb20gJT4lIA0KICBncm91cF9ieShPYnJhX3NvY2lhbCkgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApKSAlPiUgDQogIHNlbGVjdChPYnJhX3NvY2lhbCwgUG9yY2VudGFqZSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gT2JyYV9zb2NpYWwsIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIA0KICBtdXRhdGUoSW5kaWNhZG9yID0gIsK/VGllbmUgb2JyYSBzb2NpYWw/IikNCg0KaW5saW5lXzMwIDwtIHRhYmxhMSAlPiUgDQogIHB1bGwoTm8pDQoNCmlubGluZV8zMSA8LSB0YWJsYTIgJT4lIA0KICBwdWxsKE5vKQ0KDQppbmxpbmVfMzIgPC0gdGFibGEzICU+JSANCiAgcHVsbChObykNCg0KaW5saW5lXzMzIDwtIHRhYmxhNCAlPiUgDQogIHB1bGwoTm8pDQoNCmlubGluZV8zNCA8LSB0YWJsYTUgJT4lIA0KICBwdWxsKE5vKQ0KDQpgYGANCg0KIyMjIyBEZXJlY2hvcyBsYWJvcmFsZXMgZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvDQo8YnI+PGJyPg0KRGVudHJvIGRlbCBjb25qdW50byBkZSBhc2FsYXJpYWRlcywgdW4gYHIgaW5saW5lXzI4YCUgbm8gc2UgZW5jdWVudHJhIHJlZ2lzdHJhZGUgZW4gbGEgc2VndXJpZGFkIHNvY2lhbC4gRWwgbWlzbW8gaW5kaWNhZG9yIGFzY2llbmRlIGFsIGByIGlubGluZV8yOWAlIGN1YW5kbyBoYWJsYW1vcyBkZSBsYXMgYXNhbGFyaWFkYXMgbXVqZXJlcyAoZXN0YXMgdGFzYXMgZnVlcm9uIGRlbCAzNSw4JSB5IGRlbCAzNyw1JSBlbiBlbCBwcmltZXIgdHJpbWVzdHJlIGRlbCBhw7FvLCByZXNwZWN0aXZhbWVudGUpLiAgIA0KUGVybyB0YW1iacOpbiBwdWVkZSBvYnNlcnZhcnNlIHF1ZSBsYSBwcm9ibGVtw6F0aWNhIGVzIHBhcnRpY3VsYXJtZW50ZSBpbmNpc2l2YSBlbnRyZSBsYXMgdHJhYmFqYWRvcmFzIGRvbcOpc3RpY2FzOiBfX3VuIGByIGlubGluZV8zMGAlIGRlIGVsbGFzIG5vIHBlcmNpYmUgZGVzY3VlbnRvIGp1YmlsYXRvcmlvLiBBc29jaWFkbyBhIGVzdG8sIHVuIGByIGlubGluZV8zMWAlIGRlIGVzdGFzIHRyYWJhamFkb3JhcyBubyBjdWVudGEgY29uIHZhY2FjaW9uZXMgcGFnYXMsIHVuIGByIGlubGluZV8zMmAlIG5vIHBlcmNpYmUgYWd1aW5hbGRvcywgdW4gYHIgaW5saW5lXzMzYCUgbm8gcGVyY2liZSBlbCBwYWdvIGVuIGNhc28gZGUgZW5mZXJtZWRhZCwgeSB1biBgciBpbmxpbmVfMzRgJSBubyBjdWVudGEgY29uIGNvYmVydHVyYSBkZSBzYWx1ZCBtZWRpYW50ZSBvYnJhIHNvY2lhbF9fLg0KDQotLS0NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPl9fRW4gZXNlIHRyYWJham8gdGllbmUuLi5fXzwvcD4gICAgIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmluZF9yb3dzKHRhYmxhMSwgdGFibGEyLCB0YWJsYTMsIHRhYmxhNCwgdGFibGE1KSAlPiUgDQogIHNlbGVjdChJbmRpY2Fkb3IsIFPDrSwgTm8pICU+JSANCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSANCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksDQogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIA0KICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNFNTYxNkUiKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpybSh0YWJsYTEsIHRhYmxhMiwgdGFibGEzLCB0YWJsYTQsIHRhYmxhNSkNCmBgYA0KICANCiMjIyBJbmdyZXNvcw0KDQotLS0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSW5ncmVzb3MgbWVuc3VhbGVzLCBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbA0KdGFibGExYSA8LSBzZXJ2LmRvbSAlPiUgDQogIGZpbHRlcihQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gd2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBzcGF0c3RhdDo6d2VpZ2h0ZWQubWVkaWFuKFAyMSwgUE9ORElJTykpICU+JSANCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIikNCg0KdGFibGExIDwtIHRhYmxhMWEgJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gZm9ybWF0b19wZXNvcyhgSW5ncmVzbyBwcm9tZWRpb2ApLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBmb3JtYXRvX3Blc29zKGA1MCUgY29icmEgbWVub3MgZGVgKSwNCiAgICAgICAgICAgIEluZ3Jlc29zKQ0KICANCg0KIyBJbmdyZXNvcyBwb3IgaG9yYSwgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwNCnRhYmxhMmEgPC0gc2Vydi5kb20gJT4lIA0KICBmaWx0ZXIoUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzDQogICAgICAgICBQUDNFX1RPVCAhPSA5OTkpICU+JSANCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSAoc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTykpKSAlPiUgDQogIG11dGF0ZShJbmdyZXNvcyA9ICAiUG9yIGhvcmEsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIikNCg0KdGFibGEyIDwtIHRhYmxhMmEgJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gZm9ybWF0b19wZXNvcyhgSW5ncmVzbyBwcm9tZWRpb2ApLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBmb3JtYXRvX3Blc29zKGA1MCUgY29icmEgbWVub3MgZGVgKSwNCiAgICAgICAgICAgIEluZ3Jlc29zKQ0KDQojIEluZ3Jlc29zIG1lbnN1YWxlcywgdG90YWwgZGUgZnVlbnRlIGxhYm9yYWwNCnRhYmxhM2EgPC0gc2Vydi5kb20gJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gd2VpZ2h0ZWQubWVhbihQNDdUIC0gVF9WSSwgUE9ORElJKSwNCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihQNDdUIC0gVF9WSSwgUE9ORElJKSkgJT4lIA0KICBtdXRhdGUoSW5ncmVzb3MgPSAgIk1lbnN1YWxlcywgdG90YWwgZGUgZnVlbnRlIGxhYm9yYWwiKQ0KDQp0YWJsYTMgPC0gdGFibGEzYSAlPiUgDQogICAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3MoYEluZ3Jlc28gcHJvbWVkaW9gKSwNCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gZm9ybWF0b19wZXNvcyhgNTAlIGNvYnJhIG1lbm9zIGRlYCksDQogICAgICAgICAgICBJbmdyZXNvcykNCiAgDQojIEluZ3Jlc29zIG1lbnN1YWxlcywgdG90YWxlcyBpbmRpdmlkdWFsZXMNCnRhYmxhNGEgPC0gc2Vydi5kb20gJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gd2VpZ2h0ZWQubWVhbihQNDdULCBQT05ESUkpLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBzcGF0c3RhdDo6d2VpZ2h0ZWQubWVkaWFuKFA0N1QsIFBPTkRJSSkpICU+JSANCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGluZ3Jlc28gdG90YWwgaW5kaXZpZHVhbCIpDQoNCnRhYmxhNCA8LSB0YWJsYTRhICU+JSANCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3MoYEluZ3Jlc28gcHJvbWVkaW9gKSwNCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gZm9ybWF0b19wZXNvcyhgNTAlIGNvYnJhIG1lbm9zIGRlYCksDQogICAgICAgICAgICBJbmdyZXNvcykNCg0KIyBJbmdyZXNvcyBtZW5zdWFsZXMsIHRvdGFsZXMgZmFtaWxpYXJlcw0KdGFibGE1YSA8LSBzZXJ2LmRvbSAlPiUgDQogIHN1bW1hcmlzZSgiSW5ncmVzbyBwcm9tZWRpbyIgPSB3ZWlnaHRlZC5tZWFuKElURiwgUE9ORElIKSwNCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihJVEYsIFBPTkRJSCkpICU+JSANCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGluZ3Jlc28gdG90YWwgZmFtaWxpYXIiKQ0KDQp0YWJsYTUgPC0gIHRhYmxhNWEgJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gZm9ybWF0b19wZXNvcyhgSW5ncmVzbyBwcm9tZWRpb2ApLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBmb3JtYXRvX3Blc29zKGA1MCUgY29icmEgbWVub3MgZGVgKSwNCiAgICAgICAgICAgIEluZ3Jlc29zKQ0KDQojIEluZ3Jlc29zIG1lbnN1YWxlcywgcGVyIGNhcGl0YSBmYW1pbGlhcg0KdGFibGE2YSA8LSBzZXJ2LmRvbSAlPiUgDQogIHN1bW1hcmlzZSgiSW5ncmVzbyBwcm9tZWRpbyIgPSB3ZWlnaHRlZC5tZWFuKElQQ0YsIFBPTkRJSCwgbmEucm0gPSBUUlVFKSwgI3NhcXXDqSBsb3MgTkEgcGVybyBubyBlc3RveSBzZWd1cmEgZGUgcXVlIGVzdMOpIGJpZW4gDQogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IHNwYXRzdGF0Ojp3ZWlnaHRlZC5tZWRpYW4oSVBDRiwgUE9ORElIKSkgJT4lIA0KICBtdXRhdGUoSW5ncmVzb3MgPSAgIk1lbnN1YWxlcywgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhciIpDQoNCnRhYmxhNiA8LSB0YWJsYTZhICU+JSANCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3MoYEluZ3Jlc28gcHJvbWVkaW9gKSwNCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gZm9ybWF0b19wZXNvcyhgNTAlIGNvYnJhIG1lbm9zIGRlYCksDQogICAgICAgICAgICBJbmdyZXNvcykNCg0KaW5saW5lXzM1IDwtIHRhYmxhMWEgJT4lIA0KICBwdWxsKGBJbmdyZXNvIHByb21lZGlvYCkgJT4lIA0KICBhcy5udW1lcmljKC4pICU+JSANCiAgcm91bmQoLiwgLTIpDQoNCmlubGluZV8zNiA8LSB0YWJsYTFhICU+JSANCiAgcHVsbChgNTAlIGNvYnJhIG1lbm9zIGRlYCkgJT4lIA0KICBhcy5udW1lcmljKC4pICU+JSANCiAgcm91bmQoLiwgLTIpDQoNCmlubGluZV8zNyA8LSB0YWJsYTJhICU+JSANCiAgcHVsbChgSW5ncmVzbyBwcm9tZWRpb2ApICU+JSANCiAgYXMubnVtZXJpYyguKSAlPiUgDQogIHJvdW5kKC4sIDApDQoNCmlubGluZV8zOCA8LSB0YWJsYTJhICU+JSANCiAgcHVsbChgNTAlIGNvYnJhIG1lbm9zIGRlYCkgJT4lIA0KICBhcy5udW1lcmljKC4pICU+JSANCiAgcm91bmQoLiwgMCkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENPUlJFTU9TIExPUyBJTkdSRVNPUyBNRU5TVUFMRVMgREUgTEEgT0NVUEFDScOTTiBQUklOQ0lQQUwgU0lOIEVMIEZJTFRSTyBERSBIUyBUUkFCQUpBREFTIFBPU0lUSVZBUyBQQVJBIEFDTEFSQVIgTEEgRElGRVJFTkNJQQ0KDQojIEluZ3Jlc29zIG1lbnN1YWxlcywgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwNCnRhYmxhMWFiIDwtIHNlcnYuZG9tICU+JSANCiAgZmlsdGVyKFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gd2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLA0KICAgICAgICAgICAgIjUwJSBjb2JyYSBtZW5vcyBkZSIgPSBzcGF0c3RhdDo6d2VpZ2h0ZWQubWVkaWFuKFAyMSwgUE9ORElJTykpICU+JSANCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIikNCg0KdGFibGExYiA8LSB0YWJsYTFhYiAlPiUgDQogIHN1bW1hcmlzZSgiSW5ncmVzbyBwcm9tZWRpbyIgPSBmb3JtYXRvX3Blc29zKGBJbmdyZXNvIHByb21lZGlvYCksDQogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IGZvcm1hdG9fcGVzb3MoYDUwJSBjb2JyYSBtZW5vcyBkZWApLA0KICAgICAgICAgICAgSW5ncmVzb3MpDQoNCiMgQ2FsY3VsbyBsYSBjYW50aWRhZCBkZSBjYXNvcyBtdWVzdHJhbGVzIHkgbGEgZXhwYW5zacOzbiBkZSBsb3MgY2Fzb3MgcXVlIG5vIHRpZW5lbiBob3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcyBwZXJvIHNpIGluZ3Jlc29zID4gMA0KDQojIFRhYmxhIGludGVybWVkaWEuIENhc29zIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28uIENoZXF1ZW8gY2FudGlkYWRlcyBtdWVzdHJhbGVzLg0KdGFibGE3IDwtIHNlcnYuZG9tICU+JQ0KICBmaWx0ZXIoUFAzRV9UT1QgIT0gOTk5ICYgUFAzRV9UT1QgPD0gMCwNCiAgICAgICAgIFAyMSA+IDApICU+JSANCiAgc3VtbWFyaXNlKG49bigpLA0KICAgICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKHN1bShQT05ERVJBKSkpDQoNCmlubGluZV8zOSA8LSB0YWJsYTFhYiAlPiUgDQogIHB1bGwoYEluZ3Jlc28gcHJvbWVkaW9gKSAlPiUgDQogIGFzLm51bWVyaWMoLikgJT4lIA0KICByb3VuZCguLCAtMikNCg0KaW5saW5lXzQwIDwtIHRhYmxhNyAlPiUgDQogIHB1bGwoYG5gKQ0KDQppbmxpbmVfNDEgPC0gdGFibGE3ICU+JSANCiAgcHVsbChgQ2FudGlkYWRgKQ0KDQpgYGANCg0KIyMjIyBJbmdyZXNvcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28NCjxicj48YnI+DQpMYXMgdHJhYmFqYWRvcmFzIGRlbCBzZWN0b3IgcGVyY2liZW4gaW5ncmVzb3MgcXVlLCBlbiBwcm9tZWRpbywgcm9uZGFuIGxvcyBfJGByIGlubGluZV8zNWBfIHBlc29zIG1lbnN1YWxlcyBwb3Igc3Ugb2N1cGFjacOzbiBwcmluY2lwYWwuIEFsIG1pc21vIHRpZW1wbywgdW4gNTAlIGRlIGVsbGFzIGNvYnJhIG1lbm9zIGRlIF8kYHIgaW5saW5lXzM2YF8gcG9yIG1lcyBwb3IgZGljaG8gdHJhYmFqby4gRXN0byBlcXVpdmFsZSBhIHF1ZSBlbiBwcm9tZWRpbyBjb2JyYW4gdW5vcyBfJGByIGlubGluZV8zN2BfIHBvciBob3JhLCB5IGVsIDUwJSBjb2JyYSBtZW5vcyBkZSBfJGByIGlubGluZV8zOGBfIHBvciBob3JhLiBFbiBlbCBwcmltZXIgY3VhZHJvIHRhbWJpw6luIHB1ZWRlbiBhcHJlY2lhcnNlIGxvcyBpbmdyZXNvcyBtZW5zdWFsZXMgdG90YWxlcyBkZSBmdWVudGUgbGFib3JhbCAoaW5jbHV5ZW5kbyBpbmdyZXNvcyBkZSBvY3VwYWNpb25lcyBzZWN1bmRhcmlhcyksIGxvcyB0b3RhbGVzIGluZGl2aWR1YWxlcyAoaW5jbHV5ZW5kbyBpbmdyZXNvcyBxdWUgbm8gcHJvdmllbmVuIGRlIHVuYSBmdWVudGUgbGFib3JhbCksIGxvcyBpbmdyZXNvcyB0b3RhbGVzIGZhbWlsaWFyZXMgcXVlIHRpZW5lbiBlbiBwcm9tZWRpbyBsb3MgaG9nYXJlcyBkZSBlc3RhcyB0cmFiYWphZG9yYXMsIHkgZWwgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhciBkZSBlc3RvcyBtaXNtb3MgaG9nYXJlcy4NCjxicj48YnI+DQpFbiBlbCBzZWd1bmRvIGN1YWRybyBwdWVkZSBhcHJlY2lhcnNlIHF1ZSBoYXkgdW5hIGFtcGxpYSBkaWZlcmVuY2lhIGVudHJlIGxvcyBpbmdyZXNvcyBxdWUgcGVyY2liZW4gZW4gcHJvbWVkaW8gbGFzIHRyYWJhamFkb3JhcyBxdWUgc2UgZW5jdWVudHJhbiByZWdpc3RyYWRhcyByZXNwZWN0byBkZSBhcXVlbGxhcyBxdWUgbm8sIHRhbnRvIGVuIHTDqXJtaW5vcyBtZW5zdWFsZXMgY29tbyBwb3IgaG9yYSB0cmFiYWphZGEuIEFkZW3DoXMsIGFxdWVsbGFzIHF1ZSB0aWVuZW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvIHRyYWJhamFuIG3DoXMgaG9yYXMgZW4gc3Ugb2N1cGFjacOzbiBwcmluY2lwYWwgcmVzcGVjdG8gcXVlIGFxdWVsbGFzIHF1ZSBuby4NCjxicj48YnI+DQpTaSBvcmRlbmFtb3MgYWwgdG90YWwgZGUgbGFzIHBlcnNvbmFzIG9jdXBhZGFzIGRlIGFjdWVyZG8gYWwgbml2ZWwgZGUgaW5ncmVzb3MgcXVlIHBlcmNpYmVuIHBvciBzdSBvY3VwYWNpw7NuIHByaW5jaXBhbCwgeSBsYXMgYWdydXBhbW9zIGVuIDEwIGdydXBvcyBkZSBpZ3VhbCB0YW1hw7FvLCBvYnRlbmVtb3MgbG9zIGRlbm9taW5hZG9zIGRlY2lsZXMgZGUgaW5ncmVzby4gRW4gZWwgZ3LDoWZpY28gc2UgbXVlc3RyYSBjbGFyYW1lbnRlIHF1ZSBhcXVlbGxhcyBwZXJzb25hcyBxdWUgdHJhYmFqYW4gZW4gZWwgc2VjdG9yIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2UgZW5jdWVudHJhbiBjb25jZW50cmFkYXMgZW4gbG9zIGRlY2lsZXMgZGUgbWVub3JlcyBpbmdyZXNvcy4NCjxicj48YnI+DQpPam8hIERlYmUgdGVuZXJzZSBlbiBjdWVudGEgcXVlIHRvZG9zIGxvcyBtb250b3MgZXN0w6FuIGV4cHJlc2Fkb3MgZW4gcGVzb3MgZGVsIGByIGRhdGVgLiANCg0KLS0tDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1Byb21lZGlvIHkgbWVkaWFuYSBkZSBsb3MgaW5ncmVzb3MgZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHkgc3VzIGZhbWlsaWFzX188L3A+IA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmJpbmRfcm93cyh0YWJsYTEsIHRhYmxhMiwgdGFibGEzLCB0YWJsYTQsIHRhYmxhNSwgdGFibGE2KSAlPiUgDQogIHNlbGVjdChJbmdyZXNvcywgZXZlcnl0aGluZygpKSAlPiUgDQogIGthYmxlKGFsaWduID0gImMiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLA0KICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSANCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRTU2MTZFIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kcm0odGFibGExLCB0YWJsYTIsIHRhYmxhMywgdGFibGE0LCB0YWJsYTUsIHRhYmxhNiwgdGFibGE3LCB0YWJsYTFhLCB0YWJsYTFhYiwgdGFibGExYiwgdGFibGEyYSwgdGFibGEzYSwgdGFibGE0YSwgdGFibGE1YSwgdGFibGE2YSkNCmBgYA0KDQpfTm90YTogTGFzIHJlbXVuZXJhY2lvbmVzIG1lbnN1YWxlcyBmdWVyb24gY2FsY3VsYWRhcyBzaW4gaW5jbHVpciBhIGxhcyB0cmFiYWphZG9yYXMgcXVlIG5vIHRyYWJhamFyb24gZW4gZWwgcGVyw61vZG8gZGUgcmVmZXJlbmNpYSBwZXJvIGRlIHRvZGFzIGZvcm1hcyBwZXJjaWJpZXJvbiB1biBzYWxhcmlvLiBTZSB0cmF0YSBkZSBgciBpbmxpbmVfNDFgIHRyYWJhamFkb3JhcywgZGUgYWN1ZXJkbyBhIGByIGlubGluZV80MGAgY2Fzb3MgbXVlc3RyYWxlcy4gRGUgcmVhbGl6YXIgZWwgY8OhbGN1bG8gY29udGVtcGxhbmRvbGFzIGVsIHNhbGFyaW8gcHJvbWVkaW8gc2VyaWEgZGUgJGByIGlubGluZV8zOWAuIEFudGVzIGRlIGxhIHBhbmRlbWlhIGVzdG9zIGNhc29zIGVyYW4gbWlub3JpdGFyaW9zIHkgbm8gbW9kaWZpY2FiYW4gZWwgaW5ncmVzbyBwcm9tZWRpby5fICANCg0KLS0tDQogICANCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1RyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHNlZ8O6biBzaSB0aWVuZW4gZGVzY3VlbnRvIGp1YmlsYXRvcmlvLCBzdXMgaW5ncmVzb3MgeSBob3JhcyBkZSB0cmFiYWpvIHByb21lZGlvX188L3A+IA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSW5ncmVzb3MgbWVuc3VhbGVzIHkgcG9yIGhvcmEsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsDQpzZXJ2LmRvbSAlPiUgDQogIGZpbHRlcihQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBncm91cF9ieShEZXNjdWVudG9fanViaWxhdG9yaW8pICU+JSANCiAgc3VtbWFyaXNlKEluZ3Jlc29zID0gZm9ybWF0b19wZXNvcyh3ZWlnaHRlZC5tZWFuKFAyMSwgUE9ORElJTykpLA0KICAgICAgICAgICAgSW5ncmVzb3NfaHMgPSBmb3JtYXRvX3Blc29zKHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pKSwNCiAgICAgICAgICAgIGhzX29jdXBfcHJpbmMgPSBmb3JtYXRvX3BvcmMod2VpZ2h0ZWQubWVhbihQUDNFX1RPVCwgUE9OREVSQSkpKSAlPiUgDQogIGFycmFuZ2UoSW5ncmVzb3MpICU+JSANCiAgc2VsZWN0KCLCv1RpZW5lIGRlc2N1ZW50byBqdWJpbGF0b3Jpbz8iID0gRGVzY3VlbnRvX2p1YmlsYXRvcmlvLA0KICAgICAgICAgIkluZ3Jlc28gbWVuc3VhbCBwcm9tZWRpbyIgPSBJbmdyZXNvcywNCiAgICAgICAgICJJbmdyZXNvIHBvciBob3JhIHByb21lZGlvIiA9IEluZ3Jlc29zX2hzLA0KICAgICAgICAgImhzL3NlbSBlbiBvY3VwLiBwcmluYy4iID0gaHNfb2N1cF9wcmluYykgJT4lIA0KICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwNCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgDQogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0U1NjE2RSIpDQpgYGANCg0KLS0tDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj5fX1RyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23Fm3RpY28gc2Vnw7puIGRlY2lsZXMgZGUgaW5ncmVzbyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbF9fPC9wPiANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpvcHRpb25zKHNjaXBlbj05OTk5OTkpDQoNCiMgRGVjaWxlcyBkZSBJbmdyZXNvIGRlIGxhIE9jdXAgUHJpbmNpcGFsDQpzZXJ2LmRvbSAlPiUgDQogIG11dGF0ZShERUNPQ1VSID0gYXMuaW50ZWdlcihERUNPQ1VSKSkgJT4lIA0KICBmaWx0ZXIoREVDT0NVUiAlaW4lIGMoMToxMCkpICU+JSANCiAgZ3JvdXBfYnkoREVDT0NVUikgJT4lIA0KICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9ORElIKSkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKHggPSBERUNPQ1VSLCB5ID0gQ2FudGlkYWQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0U1NjE2RSIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTApICsNCiAgbGFicyh0aXRsZSA9ICJUcmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBzZWfDum4gZGVjaWxlcyIsDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkRlY2lsZXMgZGUgaW5ncmVzbyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbC4gIiwgZGF0ZSksDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IE5hdHN1bWkgU2hva2lkYSBlbiBiYXNlIGEgRVBILUlOREVDIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQojIyMgSG9nYXJlcw0KDQotLS0NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgU29uIGVsIGluZ3Jlc28gcHJpbmNpcGFsIGRlbCBob2dhcj8NCmluZ3Jlc29zX3ByaW5jaXBhbGVzIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUNCiAgZ3JvdXBfYnkoQ09EVVNVLCBOUk9fSE9HQVIpICU+JSANCiAgbXV0YXRlKGVzX3ByaW5jaXBhbCA9IGNhc2Vfd2hlbihQNDdUID09IG1heChQNDdUKSB+ICAiU8OtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk5vIikpICU+JSANCiAgc2VsZWN0KENPRFVTVSwgTlJPX0hPR0FSLCBDT01QT05FTlRFLCBlc19wcmluY2lwYWwpDQoNCnNlcnYuZG9tIDwtIGxlZnRfam9pbihzZXJ2LmRvbSwgaW5ncmVzb3NfcHJpbmNpcGFsZXMsIGJ5ID0gYygiQ09EVVNVIiwgIk5ST19IT0dBUiIsICJDT01QT05FTlRFIikpDQoNCnNlcnYuZG9tICU+JSANCiAgZ3JvdXBfYnkoZXNfcHJpbmNpcGFsKSAlPiUgDQogIHN1bW1hcmlzZShuID0gbigpLA0KICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSANCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBSZWFsaXphY2nDs24gZGUgbGFzIHRhcmVhcyBkZSBsYSBjYXNhDQpzZXJ2LmRvbSA8LSBzZXJ2LmRvbSAlPiUgDQogIGxlZnRfam9pbiguLCBiYXNlX2hvZ2FyICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KENPRFVTVSwgTlJPX0hPR0FSLCBWSUkxXzEsIFZJSTFfMiksIGJ5ID0gYygiQ09EVVNVIiwgIk5ST19IT0dBUiIpKSAlPiUgDQogIG11dGF0ZShyZWFsaXphID0gY2FzZV93aGVuKFZJSTFfMSA9PSBDT01QT05FTlRFIHwgVklJMV8yID09IENPTVBPTkVOVEUgfiAiU8OtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTm8iKSkgDQoNCnNlcnYuZG9tICU+JSANCiAgZ3JvdXBfYnkocmVhbGl6YSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IG4oKSwNCiAgICAgICAgICAgIENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCm1hdHJpeiA8LSBzZXJ2LmRvbSAlPiUgDQogIGdyb3VwX2J5KGVzX3ByaW5jaXBhbCwgcmVhbGl6YSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IG4oKSwNCiAgICAgICAgICAgIENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShQb3JjZW50YWplID0gQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApICU+JSANCiAgc2VsZWN0KGVzX3ByaW5jaXBhbCwgcmVhbGl6YSwgUG9yY2VudGFqZSkgJT4lIA0KICBhcnJhbmdlKC1Qb3JjZW50YWplKQ0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQppbmxpbmVfNDIgPC0gbWF0cml6ICU+JSANCiAgZmlsdGVyKGVzX3ByaW5jaXBhbCA9PSAiTm8iKSAlPiUgDQogIHN1bW1hcmlzZShQb3JjZW50YWplID0gc3VtKFBvcmNlbnRhamUpKSAlPiUgDQogIHB1bGwoLikgJT4lIA0KICBmb3JtYXRvX3BvcmMoLikNCg0KaW5saW5lXzQzIDwtIG1hdHJpeiAlPiUgDQogIGZpbHRlcihlc19wcmluY2lwYWwgPT0gIlPDrSIpICU+JSANCiAgc3VtbWFyaXNlKFBvcmNlbnRhamUgPSBzdW0oUG9yY2VudGFqZSkpICU+JSANCiAgcHVsbCguKSAlPiUgDQogIGZvcm1hdG9fcG9yYyguKQ0KDQppbmxpbmVfNDQgPC0gbWF0cml6ICU+JSANCiAgZmlsdGVyKHJlYWxpemEgPT0gIlPDrSIpICU+JSANCiAgc3VtbWFyaXNlKFBvcmNlbnRhamUgPSBzdW0oUG9yY2VudGFqZSkpICU+JSANCiAgcHVsbCguKSAlPiUgDQogIGZvcm1hdG9fcG9yYyguKQ0KDQpgYGANCg0KIyMjIyBBbGd1bmFzIGNhcmFjdGVyw61zdGljYXMgcmVmZXJpZGFzIGEgbG9zIGhvZ2FyZXMgZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvDQo8YnI+PGJyPg0KU2kgZXN0YSB2ZXogb3JkZW5hbW9zIGFsIHRvdGFsIGRlIGxhcyBwZXJzb25hcyBkZSBhY3VlcmRvIGEgc3VzIGluZ3Jlc29zIHBlciBjw6FwaXRhIGZhbWlsaWFyZXMgKGFxdWVsbG9zIHF1ZSBzdXJnZW4gZGUgZGl2aWRpciBlbCB0b3RhbCBkZSBpbmdyZXNvcyBkZSBsYSBmYW1pbGlhIHBvciBsYSBjYW50aWRhZCBkZSBtaWVtYnJvcyBkZSBsYSBtaXNtYSksIGRlIG1lbm9yIGEgbWF5b3IsIHkgbGFzIGFncnVwYW1vcyBlbiAxMCBncnVwb3MgZGUgaWd1YWwgdGFtYcOxbywgb2J0ZW5lbW9zIG90cmEgZXNjYWxhIGRlIGRlY2lsZXMuIEVuIGVzdGUgY2FzbyB0YW1iacOpbiBzZSBwdWVkZSBhcHJlY2lhciBxdWUgX19sYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2UgY29uY2VudHJhbiBlbiBsb3MgcHJpbWVyb3MgZGVjaWxlcy4gQ2FiZSBkZXN0YWNhciBxdWUgbG9zIHByaW1lcm9zIHRyZXMgZGVjaWxlcyBkZSBlc3RhIGVzY2FsYSBzdWVsZW4gZXN0YXIgYWx0YW1lbnRlIHJlbGFjaW9uYWRvcyBjb24gbGEgc2l0dWFjacOzbiBkZSBwb2JyZXphIGRlIGxvcyBob2dhcmVzX18gKHRvbWFuZG8gY29tbyByZWZlcmVuY2lhIGxhIG1ldG9kb2xvZ8OtYSBvZmljaWFsIGRlIGPDoWxjdWxvIGRlIGxhIG1pc21hKS4NCjxicj48YnI+DQpBbCBtaXNtbyB0aWVtcG8sIG1pZW50cmFzIHF1ZSBfX3VuIGByIGlubGluZV80MmAlIG5vIGVzIGVsIHByaW1lciBzb3N0w6luIGVjb27Ds21pY28gZGVsIGhvZ2FyLCB1biBgciBpbmxpbmVfNDNgJSBzw60gbG8gZXNfXy4gRW4gYW1ib3MgY2Fzb3MsIGxhIG1heW9yw61hIGRlIGVsbGFzIHJlYWxpemFuIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZW4gc3UgaG9nYXIuIEVzdG8gZXMgYXPDrSBwb3JxdWUgX191biBgciBpbmxpbmVfNDRgJSBkZSBxdWllbmVzIHRyYWJhamFuIGRlIGZvcm1hIHJlbXVuZXJhZGEgcmVhbGl6YW5kbyB0cmFiYWpvIGRvbcOpc3RpY28gdGFtYmnDqW4gZXN0w6FuIGEgY2FyZ28gZGUgbGEgcmVhbGl6YWNpw7NuIGRlIGVzdGUgdHJhYmFqbyBlbiBzdXMgaG9nYXJlc19fIGRlIG1hbmVyYSBuby1hc2FsYXJpYWRhLCB5IHBvciB0YW50byBubyByZW11bmVyYWRhLg0KDQotLS0NCg0KPHAgc3R5bGU9ImNvbG9yOiNFNTYxNkUiPg0KX19UcmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBzZWfDum4gZGVjaWxlcyBkZSBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyX18NCjwvcD4gDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW49OTk5OTk5KQ0KDQojIERlY2lsZXMgZGUgSW5ncmVzbyBQZXIgQ2FwaXRhIEZhbWlsaWFyDQpzZXJ2LmRvbSAlPiUgDQogIG11dGF0ZShERUNDRlIgPSBhcy5pbnRlZ2VyKERFQ0NGUikpICU+JSANCiAgZmlsdGVyKERFQ0NGUiAlaW4lIGMoMToxMCkpICU+JSANCiAgZ3JvdXBfYnkoREVDQ0ZSKSAlPiUgDQogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ESUgpKSAlPiUgDQogIGdncGxvdCguLCBhZXMoeCA9IERFQ0NGUiwgeSA9IENhbnRpZGFkKSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNFNTYxNkUiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEwKSArDQogIGxhYnModGl0bGUgPSAiVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIGRlY2lsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJEZWNpbGVzIGRlIGluZ3Jlc28gcGVyIGPDoXBpdGEgZmFtaWxpYXIuICIsIGRhdGUpLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KLS0tDQoNCjxwIHN0eWxlPSJjb2xvcjojRTU2MTZFIj4NCl9fVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIHNpIHBlcmNpYmVuIGVsIGluZ3Jlc28gcHJpbmNpcGFsIGRlIHN1IGdydXBvIGZhbWlsaWFyIHkgc2kgc29uIHF1aWVuZXMgcmVhbGl6YW4gbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBlbiBzdSBob2dhcl9fDQo8L3A+IA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KG1hdHJpeiwgYWVzKGVzX3ByaW5jaXBhbCwgcmVhbGl6YSwgZmlsbCA9IFBvcmNlbnRhamUpKSArDQogIGdlb21fdGlsZSgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0cl9jKHJvdW5kKFBvcmNlbnRhamUsIDEpLCAiJSIpKSwgc2l6ZSA9IDgpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNFNTYxNkUiKSArDQogIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKw0KICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gImJsYWNrIiwgYWxwaGEgPSAwKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKCkgKw0KICBsYWJzKHggPSAnwr9QZXJjaWJlIGVsIGluZ3Jlc28gcHJpbmNpcGFsIGRlbCBob2dhcj8nLA0KICAgICAgIHkgPSAnwr9SZWFsaXphIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZW4gc3UgaG9nYXI/JywNCiAgICAgICB0aXRsZSA9IHBhc3RlMCgiVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28uICIsIGRhdGUpLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpICsNCiAgZ3VpZGVzKGZpbGwgPSBGQUxTRSkNCmBgYA0KDQojIyMgQ29tcGFyYWNpw7NuIGNvbiBvdHJhcyByYW1hcyBkZSBsYSBvY3VwYWNpw7NuDQoNCi0tLQ0KDQojIyMjIENvbXBhcmFjacOzbiBjb24gb3RyYXMgcmFtYXMgZGUgbGEgb2N1cGFjacOzbiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCjxicj48YnI+DQpFcyDDunRpbCBjb250ZXh0dWFsaXphciBtdWNob3MgZGUgbG9zIGluZGljYWRvcmVzIHByZXNlbnRhZG9zIHJlYWxpemFuZG8gdW5hIGNvbXBhcmFjacOzbiBjb24gb3RyYXMgcmFtYXMgZGUgb2N1cGFjacOzbi4gRW4gZXN0YSBzZWNjacOzbiBzZSBwcmVzZW50YSB1bmEgc2VyaWUgZGUgZ3LDoWZpY29zIHF1ZSBwZXJtaXRlbiByZWFsaXphciBlc3RlIGVqZXJjaWNpby4gRW4gdG9kb3MgbG9zIGNhc29zIHNlIGNvbnNpZGVyYSBhIGxhIHBvYmxhY2nDs24gYXNhbGFyaWFkYSwgZXMgZGVjaXIgYSBsYXMgcGVyc29uYXMgcXVlIHNlIGRlc2VtcGXDsWFuIGVuIGVsIG1lcmNhZG8gbGFib3JhbCBjb24gdW5hIHJlbGFjacOzbiBkZSBkZXBlbmRlbmNpYSwgeSB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwgZGUgZXN0YXMgcGVyc29uYXMuDQo8YnI+PGJyPg0KU2UgZGVzdGFjYSBxdWUgX19lbCBzZWN0b3IgZGUgc2VydmljaW8gZG9tw6lzdGljbyBlcyB1bm8gZGUgbG9zIG3DoXMgaW1wb3J0YW50ZXMgZGVsIG1lcmNhZG8gbGFib3JhbCAoYXVucXVlIGhhIGRlc2NlbmRpZG8gZW4gZWwgInJhbmtpbmciIGEgbGEgbHV6IGRlIHVuYSBtYXlvciBwb25kZXJhY2nDs24gZGUgYWN0aXZpZGFkZXMgY29tbyBsYSBhZG1pbmlzdHJhY2nDs24gcMO6YmxpY2EgbyBsb3Mgc2VydmljaW9zIHNvY2lhbGVzIHkgZGUgc2FsdWQgZW4gZWwgbWFyY28gZGUgbGEgY3Jpc2lzIHBvciBDT1ZJRC0xOSkuIFRhbWJpw6luIHNlIHRyYXRhIGRlIGxhIHJhbWEgbcOhcyBmZW1pbml6YWRhLCB1bmEgZGUgbGFzIHF1ZSBtw6FzIHByb3BvcmNpw7NuIG9jdXBhIGRlbnRybyBkZSBsYXMgdHJhYmFqYWRvcmFzIG11amVyZXMgeSBsYSBtZW5vcyBwb3B1bGFyIGVudHJlIGxvcyB2YXJvbmVzLiBUYW1iacOpbiBlcyB1bmEgZGUgbGFzIHJhbWFzIGNvbiB0YXNhIGRlIG5vLXJlZ2lzdHJvIG3DoXMgYWx0YXMsIHkgbG9zIGluZ3Jlc29zIHByb21lZGlvcyBtw6FzIGJham9zLCB0YW50byBkZSBib2xzaWxsbyBjb21vIHBvciBob3JhIHRyYWJhamFkYV9fLg0KDQotLS0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVXNvIGxhIGZ1bmNpw7NuIHF1ZSBjb25zdHJ1eWUgbGEgcmFtYSBFUEggY29uIG5vbWJyZXMgZGVzY3JpcHRpdm9zDQpiYXNlX2luZGl2aWR1YWwgPC0gb3JnYW5pemVfY2FlcyhiYXNlX2luZGl2aWR1YWwpICU+JSANCiAgbXV0YXRlKHJhbWEubm9tYnJlID0gY2Flc19lcGhfbGFiZWwpDQoNCiNiYXNlX2luZGl2aWR1YWwgPC0gYmFzZV9pbmRpdmlkdWFsICU+JQ0KIyAgbXV0YXRlKHJhbWEubm9tYnJlID0gZW50cmEuY3VjaGlsbG8uc2FsZW4ubGFzLnJhbWFzKFBQMDRCX0NPRCkpDQpgYGANCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgQXNhbGFyaWFkZXMNCmFzYWxhcmlhZGVzIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUNCiAgZmlsdGVyKEVTVEFETyA9PSAxLA0KICAgICAgICAgQ0FUX09DVVAgPT0gMykNCg0KYXNhbGFyaWFkZXMgJT4lIA0KICBncm91cF9ieShyYW1hLm5vbWJyZSkgJT4lIA0KICBzdW1tYXJpc2UobiA9IG4oKSwNCiAgICAgICAgICAgIENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKQ0KDQp0YWJsZShhc2FsYXJpYWRlcyRyYW1hLm5vbWJyZSwgYXNhbGFyaWFkZXMkUFAwNEIxLCBleGNsdWRlID0gTlVMTCkNCiMgSGF5IGNhc29zIGRlIFNlcnZpY2lvIGRvbWVzdGljbyBlbiBsYSByYW1hIHBlcm8gcXVlIG5vIHRpZW5lbiBtYXJjYWRhIGxhIHZhcmlhYmxlIHF1ZSBsYXMgaWRlbnRpZmljYSBjb21vIHByZXN0YWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gZW4gaG9nYXJlcywgc29uIDI3IGNhc29zIG11ZXN0cmFsZXMNCg0KcHJ1ZWJhIDwtIGFzYWxhcmlhZGVzICU+JSANCiAgZmlsdGVyKHJhbWEubm9tYnJlID09ICJTZXJ2aWNpbyBkb21lc3RpY28iLCANCiAgICAgICAgIFBQMDRCMSA9PSAyKQ0KDQp0YWJsZShwcnVlYmEkUFAwNEJfQ09ELCBleGNsdWRlID0gTlVMTCkNCnRhYmxlKHBydWViYSRQUDA0QjIsIGV4Y2x1ZGUgPSBOVUxMKQ0KIyBMb3MgMjEgY2Fzb3MgdGllbmVuIHJhbWEgIjk3MDAiLCBxdWUgZW4gQ0FFUyBNZXJjb3N1ciBlcyAiQWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyBkZSBwZXJzb25hbCBkb23DqXN0aWNvIiwgbGEgbWlzbWEgcmFtYSBxdWUgZWwgcmVzdG8sIHBlcm8gcmVzcG9uZGVuIHRyYWJhamFyIGVuICIwIGNhc2FzIiB5IHBvciBlc28gbm8gc2UgdGllbmVuIGVuIGN1ZW50YSBoYXN0YSBhaG9yYSwgZW4gbGEgYmFzZSBzZXJ2LmRvbS4NCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KYXNhbC5yYW1hcyA8LSBhc2FsYXJpYWRlcyAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShQT05ERVJBKSwNCiAgICAgICAgIHRvdGFsX211amVyZXMgPSBzdW0oUE9OREVSQVtTZXhvID09ICJNdWplcmVzIl0pLA0KICAgICAgICAgdG90YWxfdmFyb25lcyA9IHN1bShQT05ERVJBW1NleG8gPT0gIlZhcm9uZXMiXSkpICU+JSANCiAgZ3JvdXBfYnkoIlJhbWEiID0gcmFtYS5ub21icmUpICU+JSANCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpLA0KICAgICAgICAgICAgUHJvcG9yY2lvbiA9IHJvdW5kKHN1bShQT05ERVJBKS91bmlxdWUodG90YWwpKjEwMCwgMSksDQogICAgICAgICAgICB0YXNhX2ZlbWluaXphY2lvbiA9IHJvdW5kKHN1bShQT05ERVJBW1NleG8gPT0gIk11amVyZXMiXSkvc3VtKFBPTkRFUkEpKjEwMCwgMSksDQogICAgICAgICAgICBwcm9wX2VuX211amVyZXMgPSByb3VuZChzdW0oUE9OREVSQVtTZXhvID09ICJNdWplcmVzIl0pL3VuaXF1ZSh0b3RhbF9tdWplcmVzKSoxMDAsIDEpLA0KICAgICAgICAgICAgcHJvcF9lbl92YXJvbmVzID0gcm91bmQoc3VtKFBPTkRFUkFbU2V4byA9PSAiVmFyb25lcyJdKS91bmlxdWUodG90YWxfdmFyb25lcykqMTAwLCAxKSwNCiAgICAgICAgICAgIHRhc2Ffbm9fcmVnaXN0cm8gPSByb3VuZChzdW0oUE9OREVSQVtQUDA3SCA9PSAyXSkvc3VtKFBPTkRFUkEpKjEwMCwgMSksDQogICAgICAgICAgICBpbmdyZXNvX21lbnN1YWwgPSB3ZWlnaHRlZC5tZWFuKFAyMSwgUE9ORElJTy9zdW0oUE9ORElJTykpKQ0KDQphc2FsLnJhbWFzMiA8LSBhc2FsYXJpYWRlcyAlPiUgDQogIGZpbHRlcihQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMNCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIA0KICBncm91cF9ieSgiUmFtYSIgPSByYW1hLm5vbWJyZSkgJT4lIA0KICBzdW1tYXJpc2UoaW5ncmVzb19ociA9IHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pKQ0KDQphc2FsLnJhbWFzIDwtIGFzYWwucmFtYXMgJT4lIA0KICBsZWZ0X2pvaW4oLiwgYXNhbC5yYW1hczIsIGJ5ID0gIlJhbWEiKQ0KDQpybShhc2FsLnJhbWFzMikNCmBgYA0KDQojIyMjIyBDYW50aWRhZCBkZSB0cmFiYWphZG9yZXMNCg0KYGBge3IgZmlnLmFsaWduPSJjZW50ZXIiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aCA9IDl9DQojIFJlb3JkZXIgdGhlIGRhdGENCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUNCiAgc2VsZWN0KHg9UmFtYSwgeT1DYW50aWRhZCkgJT4lIA0KICBhcnJhbmdlKHkpICU+JQ0KICBtdXRhdGUoeD1mYWN0b3IoeCx4KSkNCiAgDQojIFBsb3QNCmdncGxvdChkYXRhLCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgDQogICAgICAgICAgICAgICBjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjYzljOWM5IiwgIiNFNTYxNkUiKSwgDQogICAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgMS4zLCAwLjcpICkgKw0KICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgNSwgMikgKSArDQogIHRoZW1lX2lwc3VtKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIHhsYWIoIiIpICsNCiAgeWxhYigiIikgKw0KICBsYWJzKHRpdGxlID0gIkNhbnRpZGFkIGRlIHRyYWJhamFkb3JlcyIsDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIixkYXRlKSwNCiAgICAgICBjYXB0aW9uID0gY2FwdGlvbikNCg0KYGBgDQoNCiMjIyMjIFRhc2EgZGUgZmVtaW5pemFjacOzbg0KDQpgYGB7ciBmaWcuYWxpZ249ImNlbnRlciIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoID0gOX0NCiMgUmVvcmRlciB0aGUgZGF0YQ0KZGF0YSA8LSBhc2FsLnJhbWFzICU+JQ0KICBzZWxlY3QoeD1SYW1hLCB5PXRhc2FfZmVtaW5pemFjaW9uKSAlPiUgDQogIGFycmFuZ2UoeSkgJT4lDQogIG11dGF0ZSh4PWZhY3Rvcih4LHgpKQ0KICANCiMgUGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4PXgsIHk9eSkpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXgsIHhlbmQ9eCwgeT0wLCB5ZW5kPXkpLCANCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAxLjMsIDAuNykgKSArDQogIGdlb21fcG9pbnQoY29sb3I9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAiI2M5YzljOSIsICIjRTU2MTZFIiksIA0KICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsNCiAgdGhlbWVfaXBzdW0oKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsNCiAgZ2d0aXRsZSgiVGFzYSBkZSBmZW1pbml6YWNpw7NuIikgKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlBvcmNlbnRhamUiKSArDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIiwgZGF0ZSksDQogICAgICAgY2FwdGlvbiA9IGNhcHRpb24pDQpgYGANCg0KIyMjIyMgUHJvcG9yY2nDs24gZW50cmUgbGFzIGFzYWxhcmlhZGFzIG11amVyZXMNCg0KYGBge3IgZmlnLmFsaWduPSJjZW50ZXIiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aCA9IDl9DQojIFJlb3JkZXIgdGhlIGRhdGENCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUNCiAgc2VsZWN0KHg9UmFtYSwgeT1wcm9wX2VuX211amVyZXMpICU+JSANCiAgYXJyYW5nZSh5KSAlPiUNCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpDQogIA0KIyBQbG90DQpnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHg9eCwgeGVuZD14LCB5PTAsIHllbmQ9eSksIA0KICAgICAgICAgICAgICAgY29sb3I9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAiI2M5YzljOSIsICIjRTU2MTZFIiksIA0KICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsNCiAgZ2VvbV9wb2ludChjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjYzljOWM5IiwgIiNFNTYxNkUiKSwgDQogICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDUsIDIpICkgKw0KICB0aGVtZV9pcHN1bSgpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKw0KICBnZ3RpdGxlKCJQcm9wb3JjacOzbiBlbnRyZSBtdWplcmVzIikgKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlBvcmNlbnRhamUiKSArDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIiwgZGF0ZSksDQogICAgICAgY2FwdGlvbiA9IGNhcHRpb24pDQpgYGANCg0KIyMjIyMgUHJvcG9yY2nDs24gZW50cmUgbG9zIGFzYWxhcmlhZG9zIHZhcm9uZXMNCg0KYGBge3IgZmlnLmFsaWduPSJjZW50ZXIiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aCA9IDl9DQojIFJlb3JkZXIgdGhlIGRhdGENCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUNCiAgc2VsZWN0KHg9UmFtYSwgeT1wcm9wX2VuX3Zhcm9uZXMpICU+JSANCiAgYXJyYW5nZSh5KSAlPiUNCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpDQogDQojIFBsb3QNCmdncGxvdChkYXRhLCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgDQogICAgICAgICAgICAgICBjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjYzljOWM5IiwgIiNFNTYxNkUiKSwgDQogICAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgMS4zLCAwLjcpICkgKw0KICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgNSwgMikgKSArDQogIHRoZW1lX2lwc3VtKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIGdndGl0bGUoIlByb3BvcmNpw7NuIGVudHJlIHZhcm9uZXMiKSArDQogIHhsYWIoIiIpICsNCiAgeWxhYigiUG9yY2VudGFqZSIpICsNCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiUG9ibGFjacOzbiBhc2FsYXJpYWRhIHBvciByYW1hLiAiLCBkYXRlKSwNCiAgICAgICBjYXB0aW9uID0gY2FwdGlvbikNCmBgYA0KDQojIyMjIyBUYXNhIGRlIG5vIHJlZ2lzdHJvIGRlIGxhIHJlbGFjacOzbiBsYWJvcmFsDQoNCmBgYHtyIGZpZy5hbGlnbj0iY2VudGVyIiwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGggPSA5fSAgDQojIFJlb3JkZXIgdGhlIGRhdGENCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUNCiAgc2VsZWN0KHg9UmFtYSwgeT10YXNhX25vX3JlZ2lzdHJvKSAlPiUgDQogIGFycmFuZ2UoeSkgJT4lDQogIG11dGF0ZSh4PWZhY3Rvcih4LHgpKQ0KICANCiMgUGxvdA0KZ2dwbG90KGRhdGEsIGFlcyh4PXgsIHk9eSkpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXgsIHhlbmQ9eCwgeT0wLCB5ZW5kPXkpLCANCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAxLjMsIDAuNykgKSArDQogIGdlb21fcG9pbnQoY29sb3I9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAiI2M5YzljOSIsICIjRTU2MTZFIiksIA0KICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsNCiAgdGhlbWVfaXBzdW0oKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsNCiAgZ2d0aXRsZSgiTm8gcmVnaXN0cm8gZGUgbGEgcmVsYWNpw7NuIGxhYm9yYWwiKSArDQogIHhsYWIoIiIpICsNCiAgeWxhYigiUG9yY2VudGFqZSIpICsNCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiUG9ibGFjacOzbiBhc2FsYXJpYWRhIHBvciByYW1hLiAiLCBkYXRlKSwNCiAgICAgICBjYXB0aW9uID0gY2FwdGlvbikNCmBgYA0KDQojIyMjIyBJbmdyZXNvcyBtZW5zdWFsZXMgcHJvbWVkaW8NCg0KYGBge3IgZmlnLmFsaWduPSJjZW50ZXIiLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aCA9IDl9ICANCiMgUmVvcmRlciB0aGUgZGF0YQ0KZGF0YSA8LSBhc2FsLnJhbWFzICU+JQ0KICBzZWxlY3QoeD1SYW1hLCB5PWluZ3Jlc29fbWVuc3VhbCkgJT4lIA0KICBhcnJhbmdlKHkpICU+JQ0KICBtdXRhdGUoeD1mYWN0b3IoeCx4KSkNCiAgDQojIFBsb3QNCmdncGxvdChkYXRhLCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgDQogICAgICAgICAgICAgICBjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjYzljOWM5IiwgIiNFNTYxNkUiKSwgDQogICAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgMS4zLCAwLjcpICkgKw0KICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgNSwgMikgKSArDQogIHRoZW1lX2lwc3VtKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIGdndGl0bGUoIkluZ3Jlc29zIG1lbnN1YWxlcyBwcm9tZWRpbyIpICsNCiAgeGxhYigiIikgKw0KICB5bGFiKCJQZXNvcyIpICsNCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiUG9ibGFjacOzbiBhc2FsYXJpYWRhIHBvciByYW1hLiAiLCBkYXRlKSwNCiAgICAgICBjYXB0aW9uID0gY2FwdGlvbikNCmBgYA0KDQojIyMjIyBJbmdyZXNvcyBwb3IgaG9yYSBwcm9tZWRpbw0KDQpgYGB7ciBmaWcuYWxpZ249ImNlbnRlciIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoID0gOX0gIA0KIyBSZW9yZGVyIHRoZSBkYXRhDQpkYXRhIDwtIGFzYWwucmFtYXMgJT4lDQogIHNlbGVjdCh4PVJhbWEsIHk9aW5ncmVzb19ocikgJT4lIA0KICBhcnJhbmdlKHkpICU+JQ0KICBtdXRhdGUoeD1mYWN0b3IoeCx4KSkNCiAgDQojIFBsb3QNCmdncGxvdChkYXRhLCBhZXMoeD14LCB5PXkpKSArDQogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgDQogICAgICAgICAgICAgICBjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjYzljOWM5IiwgIiNFNTYxNkUiKSwgDQogICAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgMS4zLCAwLjcpICkgKw0KICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiNjOWM5YzkiLCAiI0U1NjE2RSIpLCANCiAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgNSwgMikgKSArDQogIHRoZW1lX2lwc3VtKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArDQogIGdndGl0bGUoIkluZ3Jlc29zIHBvciBob3JhIHByb21lZGlvIikgKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIlBlc29zIikgKw0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJQb2JsYWNpw7NuIGFzYWxhcmlhZGEgcG9yIHJhbWEuICIsIGRhdGUpLA0KICAgICAgIGNhcHRpb24gPSBjYXB0aW9uKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=