1 Introducción

El presente documento muestra los resultados de la estimación de reservas probadas del campo Cuitlahuac usando el sistema de pronóstico de producción con el objetivo de determinar, el valor remanente del campo.

El Área Contractual analizada corresponde al Área de Asignación A-0112-M - Campo Cuitláhuac y se ubica a 44.5 km al suroeste de la ciudad de Reynosa, Tamaulipas e incluye pozos de los campos Cuitláhuac y Torrecillas; campos sin Reserva: René, Orégano y Gomeño.

El documento se divide en las siguientes partes:

  • Análisis de datos disponibles
  • Resultados del modelo de pronostico de producción
  • Consideraciones finales
  • Conclusiones preliminares campo Cuitlahuac

2 Análisis de datos disponibles

2.1 Clasificación de los pozos

Los pozos perforados se clasifican en: exploratorios y desarrollo. Los siguientes mapas muestran la distribución de los pozos.

El sistema de coordenadas es UTM, los valores se muestran en miles de metros a fin de mejorar la apariencia gráfica de los mapas.

2.2 Estado de los pozos

A continuación se muestra: 1) una tabla con el número de pozos según su estado y 2) los mapas donde se puede observar la distribución geográfica de los pozos.

Los estados son:

  • Cerrado con posibilidades
  • Inyector
  • Operando
  • Programado para taponamiento
  • Taponado

2.3 Tipos de trayectorias

Adjunto se muestran los mapas de pozos según su tipo de trayectoria, las cuales comprenden:

  • Direccional
  • Horizontal
  • Vertical

2.4 Formaciones productoras principales

Los pozos producen de las formaciones Jackson (Eoceno) y Vickburg (Oligoceno), a continuación se muestran los mapas de los seis (6) intervalos con mayor producción.

Tambien se incluye una tabla con número de pozos según la formación productora.

2.5 Profundidad desarrollada

La figura siguiente muestra las profundidades desarrolladas de los pozos perforados.

2.6 Plan de desarrollo de Referencia

El Plan de Desarrollo de Referencia está compuesto por un programa de actividades, perfiles de producción de Condensado y Gas Netos y volúmenes acumulados de Hidrocarburos Netos totales.

2.6.1 Volumen acumulado

La siguiente tabla muestra los valores del volumen acumulado de gas y liquido del plan de desarrollo de Referencia.

  • Duración del plan de desarrollo de Referencia: 15 años
  • Gas natural (MMMpc)
  • Gas neto Km 19 (MMMpc)
  • Condensado neto Km 19 (MMb)
Field: CUITLAHUAC Plan de desarrollo de Referencia - Producción estimada acumulada del campo
Gas Natural Gas Neto Km 19 Condensado Km 19
218.2 173.5 3.9
Note:
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

2.6.2 Perfiles de producción

Las siguientes figuras muestran los perfiles de producción (tasa diaria) del plan de desarrollo de Referencia.

Unidades expresadas en millones de pies cúbicos por día (MMpcd) para la producción de gas y miles de barriles por día para condensado (Mbd).

2.6.2.1 Observaciones

A contiuación se indican los valores acumulados de hidrocarburos asociados al plan de desarrollo de Referencia:

  • Gas natural (MMpcd): 218.2
  • Gas neto Km 19 (MMpcd): 173.5
  • Condensado neto Km 19 (Mbd): 3.9

2.7 Reservas Oficiales

El volumen de Reservas certificadas al 1 de enero de 2020 del Área Contractual Cuitláhuac y la Reserva remanente certificada 3P se presentan en la siguiente tabla.

Categoría: Categoría de reservas (1P, 2P & 3P)
OGIP: Volumen original de gas en sitio
Fr: Factor de recuperación final (Gas natural)
Reservas: Reservas remanentes (Reservas certificadas al 1 de enero de 2020)
PCE: petróleo crudo equivalente
Ng: Producción acumulada Gas natural (Corte de producción a 31 de diciembre de 2019)

Field: CUITLAHUAC Reservas oficiales
Categoria Reservas OGIP Fr (%) Reservas PCE Ng
1P 1014.4 94 121.2 22.7 827.9
2P 1067.3 96 193.1 36.2
3P 1222.5 86 224.5 42.1
Note:
OGIP: Volumen original de gas en sitio
FR: Factor de recuperacion
Reservas: Reservas oficiales del campo (Reservas certificadas al 1 de enero de 2020)
PCE: Petroleo crudo equivalente
Ng: Produccion acumulada de gas natural (Corte de producción a 31 de diciembre de 2019)
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

3 Modelo de pronóstico de producción

El sistema de pronóstico de producción permite estimar el volumen de reservas probadas remanentes de un campo productor de aceite o gas.

Las reservas probadas representan el valor actual del campo, son los recursos que poseen el menor riesgo con respecto a las otras estimaciones de recursos y representan el valor remanente del campo.

El sistema emplea datos de producción de aceite o gas del campo o de pozos para hacer la estimación de los volúmenes.

En términos generales, el sistema reproduce la historia de producción mediante un algoritmo que inicialmente realiza una aproximación matemática de los datos de producción y posteriormente, mediante la modificación reiterada de los parámetros de ajuste, logra minimizar las diferencias entre los datos y la estimación.

El algoritmo “decide” la modificación de los parámetros usando criterios de optimización que son evaluados mediante estimaciones de mínimos cuadrados.

El sistema calcula el estimado de producción esperado final del campo “Estimated ultimate recovery (EUR)”. Al restar la producción acumulada del campo a la estimación EUR se obtiene las reservas probadas remanente del campo.

Visto que los datos usados en el cálculo provienen de pozos en producción y que esa producción es manejada a través de instalación existentes, las estimaciones realizadas por el sistema se clasifican como “reservas probadas desarrolladas”.

Por otra parte, el sistema clasifica los pozos según su estado en: “activos” y “cerrados”, tomando en consideración la fecha de la última producción del pozo, los activos corresponden a aquellos cuya fecha de producción coincide con el valor máximo de la fecha de los datos usados, en tanto que los pozos cerrados, corresponden al resto de los pozos que no cumplen el criterio anterior mencionado.

Visto que el sistema realiza la estimación de manera individual para cada pozo, las reservas se clasifican en: probadas desarrolladas en producción (pozos activos) y desarrolladas no en producción (pozos cerrados).

3.1 Datos de producción del campo

A continuación se presenta los datos de producción disponibles para los análisis subsecuentes.

3.1.1 Observaciones

A continuación se mencionan las fechas mas relevantes usadas por el sistema:

  • Data actual production date: 2021-03-01
  • Field actual production date: 2021-03-01
  • Production forecast model date: 2036-03-01

3.2 Sumario de datos de producción

La siguiente tabla muestra un sumario de los datos de producción de cada pozo.

  • pm: periodo de producción (meses)
  • spd: fecha de inicio de producción
  • apd: fecha actual de producción
  • Q: producción acumulada
  • Estatus: Active or Closed

3.3 Sumario del Modelo de Pronóstico de Producción

Se utilizó una ventada de pronóstico de producción de 15 años, similar a la duración del plan de desarrollo de Referencia.

La siguiente tabla muestra los resultados del modelo de pronóstico de producción para el campo byfield y los pozos bywells

Field: CUITLAHUAC Sumario Modelo Pronóstico de Producción
Id Parameters byField byWells
1 Production @ 2021-03-01 838 737
2 Forecast Production @ 2036-03-01 1058 982
3 Proved Developed Reserves 219 244
Note:
Resultados del modelo: byWells & byField
Production: producción acumulada de gas
Forecast Production: pronóstico de producción del sistema
Proved Developed Reserves: reservas probadas desarrolladas
Production data source: CNH
Todas las unidades están expresadas en miles de millones de píes cúbico (MMMcf)

3.4 Reservas probadas desarrolladas

Las Reservas probadas desarrolladas son cantidades que se esperan sean recuperadas de pozos e instalaciones de producción y tratamiento existentes.

La siguiente tabla muestra los resultados de sistema asociado a las reservas probadas y clasificadas según el estatus de los pozos.

  • Las Reservas Desarrolladas Produciendo se esperan sean recuperadas de intervalos completados que están abiertos y en producción al momento de la estimación

  • Las Reservas Desarrolladas No Produciendo incluyen las denominadas reservas temporalmente cerradas y las reservas en zonas no perforadas detrás de tubería, con costos de acceso menores

Field: CUITLAHUAC Proved Reserves @ 2036-03-01
Reserves.Status Wells Production Forecast.Production Reserves
1.Producing 173 407 528 121
2.Non-producing 175 313 437 124
3.Model 13 17 17 0
Note:
Producing: Proved Developed producing reserves
Non-producing: Proved Developed non-producing reserves
Wells: number of wells
Production: Accumulated gas production
Forecast Production: Accumulated forecast gas production
Reserves: Proved developed Reserves
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

3.5 Producción diaria del campo (Real & Modelo)

La siguiente figura muestra el perfil de producción del campo “q” (rojo) y los resultados del modelo “qf” (azul)

  • q: producción diaria (MMpcd)
  • qf: producción diaria generada por el modelo (MMpcd)

En términos generales, el modelo no luce estar haciendo muy buen trabajo, ello se debe esencialmente a que los datos de producción del campo muestran al menos dos periodos de desarrollo: el primero se ubica aproximadamente previo al año 2000 donde el campo tuvo una tasa de producción máxima aproximada de 15 MMpcd, en tanto que el segundo periodo, se ubica posterior al año 200 y donde se observa una tasa de producción cercana a los 150 MMpcd.

El sistema de pronóstico de producción permite “limitar” los datos de entrada al modelo, ello sin duda mejoraría los resultados del ajuste de los datos reales vs. los resultados del modelo. Ese ejercicio se hará en otra oportunidad.

3.6 Producción acumulada del campo (Real & Modelo)

La siguiente figura muestra la producción acumulada del campo “Q” (rojo) y los resultados del modelo “Qf” (azul)

  • Q: producción acumulada del campo (MMMpc)
  • Qf: producción acumulada generada por el modelo (MMMpc)

3.7 Perfiles de producción acumulada de pozos

En la siguiente figura se muestran los resultados del modelo en el dominio producción acumulada y se incluye los datos de producción de los pozos.

Se muestran solo 21 pozos “Activos” ordenados según la mayor reservas probadas calculadas por el sistema. El número de pozos activos Proved Developed producing reserves es de 173 y su volumen asociado es 120.7 MMMpc.

  • Color rojo corresponde a la producción real del pozo
  • Color azul corresponde al pronóstico de producción resultado del modelo

En general, se observa una muy buena correspondencia entre los datos de producción y la estimación realizada por el modelo.

3.8 Perfiles de producción diaria de pozos

En la siguiente figura se muestran los resultados del modelo en el dominio producción diaria y se incluye los datos de producción de los pozos.

Se muestran los pozos ordenados según la mayor reservas probadas calculadas por el sistema.

  • Color rojo corresponde a la producción real del pozo
  • Color azul corresponde al pronóstico de producción resultado del modelo

En general, se observa una muy buena correspondencia entre los datos de producción y la estimación realizada por el modelo.

3.9 Mapa de pozos de reservas probadas

El siguiente mapa muestra las reservas probadas desarrolladas en producción obtenidas como resultados del modelo de pronóstico de producción para los pozos activos.

Las reservas probadas desarrolladas en producción representan la mejor aproximación al valor actual remanente del campo, son los recursos que poseen el menor riesgo con respecto a las otras estimaciones de recursos y representan el valor remanente del campo y que está por el orden de los 120.7 MMMpc.

El sistema tiene dentro de sus opciones, permitir realizar una evaluación económica, los datos necesarios relacionados con el esquema impositivo (impuesto sobre la renta y otros) y los costos de operación (opex fijo y variable) no están disponibles en este momento para poder hacer la evaluación económica.

Finalmente, el diámetro del circulo en el mapa es proporcional al volumen asociado a cada pozo.

Se muestran solo 21 pozos “Activos” ordenados según la mayor reservas probadas calculadas por el sistema. El número de pozos activos Proved Developed producing reserves es de 173 y su volumen asociado es 120.7 MMMpc.

4 Consideraciones finales

A continuación se presenta una recopilación de los resultados previamente mostrados.

Se incluye el plan de desarrollo; la producción & reservas oficiales; los resultados del modelo de pronóstico de producción para el campo y los pozos.

4.1 Plan de desarrollo de Referencia

  • Duración: 15 años
  • Gas natural (MMMpc)
  • Gas neto Km 19 (MMMpc)
  • Condensado neto Km 19 (MMb)
Field: CUITLAHUAC Plan de desarrollo - Producción estimada acumulada del campo
Gas Natural Gas Neto Km 19 Condensado Km 19
218 174 4
Note:
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

4.2 Producción & reservas oficiales

Field: CUITLAHUAC Reservas oficiales
Categoria Reservas OGIP Fr (%) Reservas PCE Ng
1P 1014 94 121 23 827.9
2P 1067 96 193 36
3P 1222 86 224 42
Note:
OGIP: Volumen original de gas en sitio
FR: Factor de recuperación
Reservas: Reservas oficiales del campo
PCE: Petróleo crudo equivalente
Ng: Producción acumulada de gas natural
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

4.3 Pronostico de reservas (Campo & pozos)

Field: CUITLAHUAC Forecast Production Model Summary
Id Parameters byField byWells
1 Production @ 2021-03-01 838 737
2 Forecast Production @ 2036-03-01 1058 982
3 Proved Developed Reserves 219 244
Note:
Models Results: byWells & byField
Production: Accumulated gas production
Forecast Production: Forecast accumulated gas production
Proved Developed Reserves
Production data source: CNH
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

4.4 Pronostico de reservas por pozos (Producing & Non-producing)

Field: CUITLAHUAC Proved Reserves @ 2036-03-01
Reserves.Status Wells Production Forecast.Production Reserves
1.Producing 173 407 528 121
2.Non-producing 175 313 437 124
3.Model 13 17 17 0
Note:
Producing: Proved Developed producing reserves
Non-producing: Proved Developed non-producing reserves
Wells: number of wells
Production: Accumulated gas production
Forecast Production: Accumulated forecast gas production
Reserves: Proved Reserves
Todas las unidades están expresadas en miles de millones de pies cúbicos (MMMpc)

5 Conclusiones preliminares campo Cuitlahuac

Concurso: Contrato Servicios Integrales de Exploración y Extracción (CSIEE)

  • Las reservas oficiales del campo son: 1P (121), 2P (193) y 3P (225)

  • El plan de desarrollo de Referencia contempla producir 218, casi la totalidad de las reservas 3P (225)

  • Las reservas Probadas desarrolladas calculadas por el modelo son: campo (219) y pozos (244) y están dentro del rango de las reservas oficiales 3P (225)

  • Las reservas calculadas por el modelo Reservas Desarrolladas Produciendo son similares a las reservas oficiales del campo 1P: (121)

  • Las Reservas Desarrolladas No Produciendo calculadas por el modelo (124) corresponden a reservas temporalmente cerradas y/o asociada a pozos con diferentes estados (cerrado con posibilidades, programado para taponamiento y/o taponado)

6 Anexos

6.1 Definiciones

Todas las definiciones incluidas a continuación fueron tomadas del documento cuyas referencias se indican a continuación:

https://www.spe.org/media/filer_public/24/fe/24fe7cf3-7c23-485d-a966-e3243f1d20ce/2018_sistema_de_gerencia_de_los_recursos_de_petroleo_-_traduccion_en_espanol_-_vf.pdf

Sistema de Gerencia de los Recursos de Petróleo
(PRMS por sus siglas en inglés)
(Revisado junio 2018)
(Traducido septiembre 2019)
Patrocinado por:
Society of Petroleum Engineers (SPE)
World Petroleum Council (WPC)
American Association of Petroleum Geologists (AAPG)
Society of Petroleum Evaluation Engineers (SPEE)
Society of Exploration Geophysicists (SEG)
Society of Petrophysicists and Well Log Analysts (SPWLA)
European Association of Geoscientists & Engineers (EAGE)

6.1.1 Reservas probadas

“Reservas Probadas son aquellas cantidades de petróleo, que mediante el análisis de datos de geociencias y de ingeniería, pueden ser estimadas con certeza razonable, para ser comercialmente recuperadas de yacimientos conocidos y bajo condiciones técnicas y comerciales definidas. Si se usan métodos determinísticos, el término “certeza razonable” pretende expresar un alto grado de confianza de que las cantidades serán recuperadas. Si se usan métodos probabilísticos, debería existir una probabilidad de por lo menos 90% de que las cantidades realmente recuperadas igualarán o excederán las estimaciones."

6.1.2 Reservas Probables

“Reservas Probables son aquellas Reservas adicionales en las cuales el análisis de los datos de geociencias y de ingeniería indican que son menos probables de ser recuperadas que las Reservas Probadas, pero más seguro de recuperarse que las Reservas Posibles. Es igualmente probable, que las cantidades remanentes reales a recuperar serán mayores o menores que la suma de las Reservas Probadas más las Reservas Probables estimadas (2P).
En este contexto, cuando se utilizan métodos probabilísticos, debería existir una probabilidad de por lo menos 50% de que las cantidades reales recuperadas igualarán o excederán la estimación 2P.”

6.1.3 Reservas

“Reservas Posibles son aquellas Reservas adicionales que el análisis de los datos de geociencias y de ingeniería indican que son menos probables de ser recuperadas que las Reservas Probables. Las cantidades totales finalmente a ser recuperadas del proyecto tienen una baja probabilidad de superar la suma de Reservas Probadas más Reservas Probables más Reservas Posibles (3P), que es equivalente al escenario de estimación alto. Cuando se utilizan los métodos probabilísticos, debería existir una probabilidad de por lo menos 10% de que las cantidades reales recuperadas igualarán o superarán la estimación 3P. Reservas Posibles que se encuentren localizadas fuera del área 2P (no potencial adicional a las cantidades del escenario 2P) puede existir solo cuando se han cumplido los criterios de madurez comercial y técnica (que incorporan el posible alcance de desarrollo). Las Reservas Posibles independientes deben hacer referencia a un proyecto 2P comercial (por ejemplo, un Sistema de Gerencia de los Recursos de Petróleo. Versión 1.01 14 contrato de arrendamiento adyacente al proyecto comercial que puede ser propiedad de una entidad separada), de lo contrario, no se permiten Reservas Posibles independiente.”

6.1.4 Recuperación Final Estimada (EUR)

“Recuperación Final Estimada (EUR), no es una clase o categoría de recursos, sino un término que puede ser aplicado a una acumulación o grupo de acumulaciones (descubiertas o no descubiertas) para definir aquellas cantidades de petróleo estimadas, a una fecha dada, a ser potencialmente recuperables, más aquellas cantidades ya producidas de la acumulación o grupo de acumulaciones. Para mayor claridad, EUR (por sus siglas en inglés) debe referirse a las condiciones técnicas y económicas asociadas a los recursos, por ejemplo, el EUR probado son las Reservas Probadas más la producción acumulada.”

6.1.5 Reservas Desarrolladas

“Las Reservas Desarrolladas son cantidades que se esperan sean recuperadas de pozos e instalaciones de producción y tratamiento existentes.”

  1. “Las Reservas Desarrolladas Produciendo se esperan sean recuperadas de intervalos completados que están abiertos y en producción al momento de la estimación.”

  2. “Las Reservas Desarrolladas No Produciendo incluyen las denominadas Reservas temporalmente cerradas y las Reservas en zonas no perforadas detrás de tubería, con costos de acceso menores.”

6.1.6 Reservas No Desarrolladas

“Las Reservas No Desarrolladas son cantidades que se espera sean recuperadas a través de inversiones futuras significativas.”

6.2 Unidades usadas

Para los efectos del presente documento se utilizaran las siguiente unidades:

  • M: mil
  • MM: millones
  • MMM: miles de millones
  • pc: pies cúbicos
  • pcd: pies cúbicos por dia
  • bd: barriles por dia
  • b: barriles

7 Elapsed time

  • Elapsed time: 19.16 segundos
LS0tCnRpdGxlOiAiQ3VpdGxhaHVhYzogTW9kZWxvIGRlIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuIgphdXRob3I6ICJFdWxlckVuZXJneUBnbWFpbC5jb20iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgaGlnaGxpZ2h0OiBrYXRlCiAgICB0aGVtZTogdW5pdGVkCiAgICBjc3M6IH4vRG9jdW1lbnRzL3BmbV9tYXN0ZXIvc3JjL3N0eWxlLmNzcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEYsIG1lc3NhZ2UgPSBGLCByZXN1bHRzID0gJ2hpZGUnLCB3YXJuaW5nID0gRikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpybShsaXN0ID0gbHMoKSkKIwojIGxvYWQgZnVuY3Rpb25zIAojCnNldHdkKCJ+L0RvY3VtZW50cy9wZm1fbWFzdGVyL1IiKQpmaWxlcy5zb3VyY2VzID0gbGlzdC5maWxlcygpCnNhcHBseShmaWxlcy5zb3VyY2VzLCBzb3VyY2UpCgojIGRlZmluZSBDYXB0aW9uIG9iamVjdCAgCkNhcHRpb24gPSBwYXN0ZSgiRXVsZXJFbmVyZ3kiLCBTeXMuRGF0ZSgpKSAKYGBgCgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2V0d2QoIn4vRG9jdW1lbnRzL3BmbV9tYXN0ZXIvZGF0YS9wcm9jZXNzZWQvbXgiKQp3cGQgPC0gcmVhZFJEUygid3BkLlJEUyIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kc2V0d2QoIn4vRG9jdW1lbnRzL3BmbV9tYXN0ZXIvNTAwLkN1aXRsYWh1YWMvZG9jLzAyX0Jhc2VzX1BFUC1DQVQtUy1HQ1AtNTAxLTkxMDM1LTIxLTEgUGFydGUgMS9TZWNjacKibiAyIEluZm9ybWFjacKibiB0w4djbmljYSBkZWwgcHJveWVjdG8iKQp3ZCA8LSByZWFkX2V4Y2VsKCIyLjEuLSBBcGVuZGljZSAyLjEgRm9ybWF0byAxMCBDTklIICBDdWl0bOKAoGh1YWMueGxzeCIpCmNvbG5hbWVzKHdkKQoKcGQgPC0gcmVhZF9leGNlbCgifi9Eb2N1bWVudHMvcGZtX21hc3Rlci81MDAuQ3VpdGxhaHVhYy9kYXRhL3BkX2N1aXRsYWh1YWMueGxzeCIsIAogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJza2lwIiksIHNraXAgPSAxKQpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmNvbG4gPC0gYygibnVtIiwgIm5pcGVwIiwgInV3aSIsICJ3ZWxsX25hbWUiLCAiYWxpYXMiLCAidHQiLCAiY2xhcyIsICJmaXAiLCAicGZwIiwKICAgICAgICAgICJwaXQiLCAicGZ0IiwgInB2IiwgInBkIiwgInhjIiwgInljIiwgIngiLCAieSIsICJ6dXRtIiwgImZ2YyIsIAogICAgICAgICAgImVzdCIsICJhc2lnIiwgIm1pZyIsICJjb20iLCAiZnAiKQpjb2xuYW1lcyh3ZCkgPC0gY29sbgpgYGAKCmBgYHtyfQpmaWVsZF9hbmFseXplIDwtICJjdWl0bGFodWFjIgoKIyBkZWZpbmUgVGl0bGUgb2JqZWN0ClRpdGxlID0gcGFzdGUoIkZpZWxkOiIsIHRvdXBwZXIoZmllbGRfYW5hbHl6ZSkpCgpmcHQgPSAxODAKeW1tZCA9IDMwLjQxNjY3CmBgYAoKIyBJbnRyb2R1Y2Npw7NuICAKCkVsIHByZXNlbnRlIGRvY3VtZW50byBtdWVzdHJhIGxvcyByZXN1bHRhZG9zIGRlIGxhIGVzdGltYWNpw7NuIGRlIHJlc2VydmFzIHByb2JhZGFzIGRlbCBjYW1wbyAqKkN1aXRsYWh1YWMqKiB1c2FuZG8gZWwgc2lzdGVtYSBkZSBwcm9uw7NzdGljbyBkZSBwcm9kdWNjacOzbiBjb24gZWwgb2JqZXRpdm8gZGUgZGV0ZXJtaW5hciwgZWwgdmFsb3IgcmVtYW5lbnRlIGRlbCBjYW1wby4KCkVsIMOBcmVhIENvbnRyYWN0dWFsIGFuYWxpemFkYSBjb3JyZXNwb25kZSBhbCDDgXJlYSBkZSBBc2lnbmFjacOzbiBBLTAxMTItTSAtIENhbXBvIEN1aXRsw6FodWFjIHkgc2UgdWJpY2EgYSA0NC41IGttIGFsIHN1cm9lc3RlIGRlIGxhIGNpdWRhZCBkZSBSZXlub3NhLCBUYW1hdWxpcGFzIGUgaW5jbHV5ZSBwb3pvcyBkZSBsb3MgY2FtcG9zIEN1aXRsw6FodWFjIHkgVG9ycmVjaWxsYXM7IGNhbXBvcyBzaW4gUmVzZXJ2YTogUmVuw6ksIE9yw6lnYW5vIHkgR29tZcOxby4KCkVsIGRvY3VtZW50byBzZSBkaXZpZGUgZW4gbGFzIHNpZ3VpZW50ZXMgcGFydGVzOiAgCgotIEFuw6FsaXNpcyBkZSBkYXRvcyBkaXNwb25pYmxlcyAgCi0gUmVzdWx0YWRvcyBkZWwgbW9kZWxvIGRlIHByb25vc3RpY28gZGUgcHJvZHVjY2nDs24gIAotIENvbnNpZGVyYWNpb25lcyBmaW5hbGVzICAKLSBDb25jbHVzaW9uZXMgcHJlbGltaW5hcmVzIGNhbXBvIEN1aXRsYWh1YWMgIAoKIyBBbsOhbGlzaXMgZGUgZGF0b3MgZGlzcG9uaWJsZXMgIAoKIyMgQ2xhc2lmaWNhY2nDs24gZGUgbG9zIHBvem9zICAKCkxvcyBwb3pvcyBwZXJmb3JhZG9zIHNlIGNsYXNpZmljYW4gZW46IGV4cGxvcmF0b3Jpb3MgeSBkZXNhcnJvbGxvLiAgTG9zIHNpZ3VpZW50ZXMgbWFwYXMgbXVlc3RyYW4gbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcG96b3MuCgpFbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGVzIFVUTSwgbG9zIHZhbG9yZXMgc2UgbXVlc3RyYW4gZW4gbWlsZXMgZGUgbWV0cm9zIGEgZmluIGRlIG1lam9yYXIgbGEgYXBhcmllbmNpYSBncsOhZmljYSBkZSBsb3MgbWFwYXMuCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQpnZ3Bsb3Qod2QpICsgCiAgZ2VvbV9wb2ludChhZXMoeC8xMDAwLCB5LzEwMDAsIGNvbCA9IGNsYXMpKSArIAogIGNvb3JkX2VxdWFsKCkgKyAgCiAgZmFjZXRfd3JhcCggfiBjbGFzLCBuY29sID0gMykgICsKICBsYWJzKHRpdGxlID0gcGFzdGUoVGl0bGUsICJcbkNsYXNpZmljYWNpb24gZGUgbG9zIHBvem9zIFxuTnVtZXJvIGRlIHBvem9zOiIsIG5yb3cod2QpKSwKICAgICAgIHggPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgeSA9ICJVVE0gKG1pbGVzIGRlIG1ldHJvcykiLCAKICAgICAgIGNhcHRpb24gPSBDYXB0aW9uKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSkgKwogIGd1aWRlcyh4ID0gZ3VpZGVfYXhpcyhhbmdsZSA9IDkwKSkKYGBgCgojIyBFc3RhZG8gZGUgbG9zIHBvem9zICAKCkEgY29udGludWFjacOzbiBzZSBtdWVzdHJhOiAxKSB1bmEgdGFibGEgY29uIGVsIG7Dum1lcm8gZGUgcG96b3Mgc2Vnw7puIHN1IGVzdGFkbyB5IDIpIGxvcyBtYXBhcyBkb25kZSBzZSBwdWVkZSBvYnNlcnZhciBsYSBkaXN0cmlidWNpw7NuIGdlb2dyw6FmaWNhIGRlIGxvcyBwb3pvcy4gIAoKTG9zIGVzdGFkb3Mgc29uOgoKLSBDZXJyYWRvIGNvbiBwb3NpYmlsaWRhZGVzICAKLSBJbnllY3RvciAgCi0gT3BlcmFuZG8gIAotIFByb2dyYW1hZG8gcGFyYSB0YXBvbmFtaWVudG8gIAotIFRhcG9uYWRvICAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CndkICU+JSBncm91cF9ieShlc3QpICU+JSBzdW1tYXJpc2UobndlbGxzID0gbigpKQpnZ3Bsb3Qod2QpICsgCiAgZ2VvbV9wb2ludChhZXMoeC8xMDAwLCB5LzEwMDAsIGNvbCA9IGVzdCkpICsgCiAgY29vcmRfZXF1YWwoKSArICAKICBmYWNldF93cmFwKCB+IGVzdCwgbmNvbCA9IDMpICArCiAgbGFicyh0aXRsZSA9IHBhc3RlKFRpdGxlLCAiXG5NYXBhIGRlIHBvem9zIFxuRXN0YWRvIERpY2llbWJyZSAyMDE5IiksCiAgICAgICB4ID0gIlVUTSAobWlsZXMgZGUgbWV0cm9zKSIsIHkgPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgCiAgICAgICBjYXB0aW9uID0gQ2FwdGlvbikgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpICsKICBndWlkZXMoeCA9IGd1aWRlX2F4aXMoYW5nbGUgPSA5MCkpCmBgYAoKIyMgVGlwb3MgZGUgdHJheWVjdG9yaWFzICAKCkFkanVudG8gc2UgbXVlc3RyYW4gbG9zIG1hcGFzIGRlIHBvem9zIHNlZ8O6biBzdSB0aXBvIGRlIHRyYXllY3RvcmlhLCBsYXMgY3VhbGVzIGNvbXByZW5kZW46ICAKCi0gRGlyZWNjaW9uYWwgIAotIEhvcml6b250YWwgIAotIFZlcnRpY2FsICAKCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CmdncGxvdCh3ZCkgKyAKICBnZW9tX3BvaW50KGFlcyh4LzEwMDAsIHkvMTAwMCwgY29sID0gdHQpKSArIAogIGNvb3JkX2VxdWFsKCkgKyAgCiAgZmFjZXRfd3JhcCggfiB0dCwgbmNvbCA9IDMpICArCiAgbGFicyh0aXRsZSA9IHBhc3RlKFRpdGxlLCAiXG5NYXBhIGRlIHBvem9zIFxuVGlwb3MgZGUgdHJheWVjdG9yaWFzIiksCiAgICAgICB4ID0gIlVUTSAobWlsZXMgZGUgbWV0cm9zKSIsIHkgPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgCiAgICAgICBjYXB0aW9uID0gQ2FwdGlvbikgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpICsKICBndWlkZXMoeCA9IGd1aWRlX2F4aXMoYW5nbGUgPSA5MCkpCmBgYAoKIyMgRm9ybWFjaW9uZXMgcHJvZHVjdG9yYXMgcHJpbmNpcGFsZXMgCgpMb3MgcG96b3MgcHJvZHVjZW4gZGUgbGFzIGZvcm1hY2lvbmVzIEphY2tzb24gKEVvY2VubykgeSBWaWNrYnVyZyAoT2xpZ29jZW5vKSwgYSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmFuIGxvcyBtYXBhcyBkZSBsb3Mgc2VpcyAoNikgaW50ZXJ2YWxvcyBjb24gbWF5b3IgcHJvZHVjY2nDs24uICAKClRhbWJpZW4gc2UgaW5jbHV5ZSB1bmEgdGFibGEgY29uIG7Dum1lcm8gZGUgcG96b3Mgc2Vnw7puIGxhIGZvcm1hY2nDs24gcHJvZHVjdG9yYS4KCmBgYHtyIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9CmRmIDwtIHdkICU+JSBncm91cF9ieShmcCkgJT4lIHN1bW1hcmlzZShuZnAgPSBuKCkpICU+JSBhcnJhbmdlKGRlc2MobmZwKSkgCmRmCmRmIDwtIGRmICU+JSBmaWx0ZXIobmZwID4gMTUpCgp2ZWN0IDwtIGRmJGZwCmRmIDwtIHdkICU+JSBmaWx0ZXIoZnAgJWluJSB2ZWN0KQpnZ3Bsb3QoZGYpICsgCiAgZ2VvbV9wb2ludChhZXMoeC8xMDAwLCB5LzEwMDAsIGNvbCA9IGZwKSkgKyAKICBjb29yZF9lcXVhbCgpICsgIAogIGZhY2V0X3dyYXAoIH4gZnAsIG5jb2wgPSAzKSAgKwogIGxhYnModGl0bGUgPSBwYXN0ZShUaXRsZSwgIlxuRm9ybWFjaW9uZXMgcHJvZHVjdG9yYXMgcHJpbmNpcGFsZXMiKSwKICAgICAgIHggPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgeSA9ICJVVE0gKG1pbGVzIGRlIG1ldHJvcykiLCAKICAgICAgIGNhcHRpb24gPSBDYXB0aW9uKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSkgKwogIGd1aWRlcyh4ID0gZ3VpZGVfYXhpcyhhbmdsZSA9IDkwKSkKYGBgCgojIyBQcm9mdW5kaWRhZCBkZXNhcnJvbGxhZGEgIAoKTGEgZmlndXJhIHNpZ3VpZW50ZSBtdWVzdHJhIGxhcyBwcm9mdW5kaWRhZGVzIGRlc2Fycm9sbGFkYXMgZGUgbG9zIHBvem9zIHBlcmZvcmFkb3MuICAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHdkLCBhZXMocGQpKSArIAogIGdlb21faGlzdG9ncmFtKGJyZWFrcyA9IHNlcSgxNTAwLCA0NTAwLCBieSA9IDI1MCksCiAgICAgICAgICAgICAgICAgY29sID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgICAgYWVzKGZpbGwgPSAuLmNvdW50Li4pKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudCgiQ291bnQiLCBsb3cgPSAiIzAwRkYwMCIsIGhpZ2ggPSAiIzAwNjYzMyIpICArCiAgbGFicyh0aXRsZSA9IHBhc3RlKFRpdGxlLCAiXG5Qcm9mdW5kaWRhZCBkZXNhcnJvbGxhZGEgKG1ldHJvcykiKSwgCiAgICAgICB4ID0gIlVUTSAobWlsZXMgZGUgbWV0cm9zKSIsIHkgPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgCiAgICAgICBjYXB0aW9uID0gQ2FwdGlvbikgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpICsKICBndWlkZXMoeCA9IGd1aWRlX2F4aXMoYW5nbGUgPSA5MCkpCmBgYAoKIyMgUGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWEgICAgCgpFbCBQbGFuIGRlIERlc2Fycm9sbG8gZGUgUmVmZXJlbmNpYSBlc3TDoSBjb21wdWVzdG8gcG9yIHVuIHByb2dyYW1hIGRlIGFjdGl2aWRhZGVzLCBwZXJmaWxlcyBkZSBwcm9kdWNjacOzbiBkZSBDb25kZW5zYWRvIHkgR2FzIE5ldG9zIHkgdm9sw7ptZW5lcyBhY3VtdWxhZG9zIGRlIEhpZHJvY2FyYnVyb3MgTmV0b3MgdG90YWxlcy4gIAoKIyMjIFZvbHVtZW4gYWN1bXVsYWRvICAKCkxhIHNpZ3VpZW50ZSB0YWJsYSBtdWVzdHJhIGxvcyB2YWxvcmVzIGRlbCB2b2x1bWVuIGFjdW11bGFkbyBkZSBnYXMgeSBsaXF1aWRvIGRlbCBwbGFuIGRlIGRlc2Fycm9sbG8gZGUgUmVmZXJlbmNpYS4KCi0gRHVyYWNpw7NuIGRlbCBwbGFuIGRlIGRlc2Fycm9sbG8gZGUgUmVmZXJlbmNpYTogKioxNSBhw7FvcyoqICAKLSBHYXMgbmF0dXJhbCAoTU1NcGMpICAKLSBHYXMgbmV0byBLbSAxOSAoTU1NcGMpICAKLSBDb25kZW5zYWRvIG5ldG8gS20gMTkgKE1NYikgIAoKYGBge3J9CnBkIDwtIHBkICU+JSBtdXRhdGUodCA9IDE6bigpKQpwZG8gPC0gcGQgJT4lIAogIHN1bW1hcmlzZShnbiA9IHN1bShnbiwgbmEucm0gPSBUKSAqIHltbWQvMTAwMCwKICAgICAgICAgICAgICAgICBnbjE5ID0gc3VtKGduMTksIG5hLnJtID0gVCkgKiB5bW1kLzEwMDAsCiAgICAgICAgICAgICAgICAgY29uMTkgPSBzdW0oY29uMTksIG5hLnJtID0gVCkgKiB5bW1kLzEwMDApICU+JQogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkKdGl0bGUgPC0gcGFzdGUoVGl0bGUsICJcblBsYW4gZGUgZGVzYXJyb2xsbyBkZSBSZWZlcmVuY2lhIC0gUHJvZHVjY2nDs24gZXN0aW1hZGEgYWN1bXVsYWRhIGRlbCBjYW1wbyIpCnBkbyA8LSBwZG8gJT4lIHJlbmFtZSgiR2FzIE5hdHVyYWwiID0gZ24sICJHYXMgTmV0byBLbSAxOSIgPSBnbjE5LCAiQ29uZGVuc2FkbyBLbSAxOSIgPSBjb24xOSkKcHJpbnQudGFibGUocGRvLCB0aXRsZSwgMSwgCiAgICAgICAgICAgICJUb2RhcyBsYXMgdW5pZGFkZXMgZXN0w6FuIGV4cHJlc2FkYXMgZW4gbWlsZXMgZGUgbWlsbG9uZXMgZGUgcGllcyBjw7piaWNvcyAoTU1NcGMpIikgCmBgYAoKIyMjIFBlcmZpbGVzIGRlIHByb2R1Y2Npw7NuICAKCkxhcyBzaWd1aWVudGVzIGZpZ3VyYXMgbXVlc3RyYW4gbG9zIHBlcmZpbGVzIGRlIHByb2R1Y2Npw7NuICh0YXNhIGRpYXJpYSkgZGVsIHBsYW4gZGUgZGVzYXJyb2xsbyBkZSBSZWZlcmVuY2lhLgoKVW5pZGFkZXMgZXhwcmVzYWRhcyBlbiBtaWxsb25lcyBkZSBwaWVzIGPDumJpY29zIHBvciBkw61hIChNTXBjZCkgcGFyYSBsYSBwcm9kdWNjacOzbiBkZSBnYXMgeSBtaWxlcyBkZSBiYXJyaWxlcyBwb3IgZMOtYSBwYXJhIGNvbmRlbnNhZG8gKE1iZCkuICAKCmBgYHtyIH0KZ2dwbG90KHBkKSArIAogIGdlb21fbGluZShhZXModCwgZ24pKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZShUaXRsZSwgIlxuUGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWFcbkdhcyBuYXR1cmFsXG5Wb2x1bWVuIGFjdW11bGFkbzoiLCAKICAgICAgICAgICAgICAgICAgICAgcGRvW1sxXV0sICJNTU1wYyIpLAogICAgICAgeCA9ICJtZXNlcyIsIHkgPSAiTU1wY2QiLAogICAgICAgY2FwdGlvbiA9IENhcHRpb24pICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsdWUiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpKSAKCmdncGxvdChwZCkgKyAKICBnZW9tX2xpbmUoYWVzKHQsIGduMTkpKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZShUaXRsZSwgIlxuUGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWEgXG5HYXMgbmV0byBLbSAxOVxuVm9sdW1lbiBhY3VtdWxhZG86IiwgCiAgICAgICAgICAgICAgICAgICAgIHBkb1tbMl1dLCAiTU1NcGMiKSwKICAgICAgIHggPSAibWVzZXMiLCB5ID0gIk1NcGNkIiwgCiAgICAgICBjYXB0aW9uID0gQ2FwdGlvbikgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpIAoKZ2dwbG90KHBkKSArIAogIGdlb21fbGluZShhZXModCwgY29uMTkpKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZShUaXRsZSwgIlxuUGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWEgXG5Db25kZW5zYWRvIG5ldG8gS20gMTlcblZvbHVtZW4gYWN1bXVsYWRvOiIsIAogICAgICAgICAgICAgICAgICAgICBwZG9bWzNdXSwgIk1NTXBjIiksCiAgICAgICB4ID0gIk1lc2VzIiwgeSA9ICJNYmQiLCAKICAgICAgIGNhcHRpb24gPSBDYXB0aW9uKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSkKYGBgCgojIyMjIE9ic2VydmFjaW9uZXMgICAgIAoKQSBjb250aXVhY2nDs24gc2UgaW5kaWNhbiBsb3MgdmFsb3JlcyBhY3VtdWxhZG9zIGRlIGhpZHJvY2FyYnVyb3MgYXNvY2lhZG9zIGFsIHBsYW4gZGUgZGVzYXJyb2xsbyBkZSBSZWZlcmVuY2lhOgoKLSBHYXMgbmF0dXJhbCAoTU1wY2QpOiAgKipgciBwZG9bWzFdXWAqKgotIEdhcyBuZXRvIEttIDE5IChNTXBjZCk6ICAqKmByIHBkb1tbMl1dYCoqIAotIENvbmRlbnNhZG8gbmV0byBLbSAxOSAoTWJkKTogICoqYHIgcGRvW1szXV1gKioKCiMjIFJlc2VydmFzIE9maWNpYWxlcyAgCgpFbCB2b2x1bWVuIGRlIFJlc2VydmFzIGNlcnRpZmljYWRhcyBhbCAqKjEgZGUgZW5lcm8gZGUgMjAyMCoqIGRlbCDDgXJlYSBDb250cmFjdHVhbCBDdWl0bMOhaHVhYyB5IGxhIFJlc2VydmEgcmVtYW5lbnRlIGNlcnRpZmljYWRhIDNQIHNlIHByZXNlbnRhbiBlbiBsYSBzaWd1aWVudGUgdGFibGEuCgpDYXRlZ29yw61hOiBDYXRlZ29yw61hIGRlIHJlc2VydmFzICgxUCwgMlAgJiAzUCkgIApPR0lQOiBWb2x1bWVuIG9yaWdpbmFsIGRlIGdhcyBlbiBzaXRpbyAgICAKRnI6IEZhY3RvciBkZSByZWN1cGVyYWNpw7NuIGZpbmFsICoqKEdhcyBuYXR1cmFsKSoqICAgIApSZXNlcnZhczogUmVzZXJ2YXMgcmVtYW5lbnRlcyAqKihSZXNlcnZhcyBjZXJ0aWZpY2FkYXMgYWwgMSBkZSBlbmVybyBkZSAyMDIwKSoqICAKUENFOiBwZXRyw7NsZW8gY3J1ZG8gZXF1aXZhbGVudGUgIApOZzogUHJvZHVjY2nDs24gYWN1bXVsYWRhIEdhcyBuYXR1cmFsICoqKENvcnRlIGRlIHByb2R1Y2Npw7NuIGEgMzEgZGUgZGljaWVtYnJlIGRlIDIwMTkpKiogIAoKYGBge3J9CnJlYyA8LSB0aWJibGUoIkNhdGVnb3JpYSBSZXNlcnZhcyIgPSBjKCIxUCIsICIyUCIsICIzUCIpLCAKICAgICAgICAgICAgICAiT0dJUCIgPSBjKDEwMTQuNCwgMTA2Ny4zLCAxMjIyLjUpLAogICAgICAgICAgICAgICJGciAoJSkiID0gYyg5NCwgOTYsIDg2KSwKICAgICAgICAgICAgICAiUmVzZXJ2YXMiID0gYygxMjEuMiwgMTkzLjEsIDIyNC41KSwKICAgICAgICAgICAgICAiUENFIiA9IGMoMjIuNywgMzYuMiwgNDIuMSksCiAgICAgICAgICAgICAgIk5nIiA9IGMoODI3LjksICIgIiwgIiAiKSkKCnRpdGxlIDwtIHBhc3RlKFRpdGxlLCAiXG5SZXNlcnZhcyBvZmljaWFsZXMiKQpwcmludC50YWJsZShyZWMsIHRpdGxlLCAxLCAKICAgICAgICAgICAgIk9HSVA6IFZvbHVtZW4gb3JpZ2luYWwgZGUgZ2FzIGVuIHNpdGlvCiAgICAgICAgICAgIEZSOiBGYWN0b3IgZGUgcmVjdXBlcmFjaW9uCiAgICAgICAgICAgIFJlc2VydmFzOiBSZXNlcnZhcyBvZmljaWFsZXMgZGVsIGNhbXBvIChSZXNlcnZhcyBjZXJ0aWZpY2FkYXMgYWwgMSBkZSBlbmVybyBkZSAyMDIwKQogICAgICAgICAgICBQQ0U6IFBldHJvbGVvIGNydWRvIGVxdWl2YWxlbnRlCiAgICAgICAgICAgIE5nOiBQcm9kdWNjaW9uIGFjdW11bGFkYSBkZSBnYXMgbmF0dXJhbCAoQ29ydGUgZGUgcHJvZHVjY2nDs24gYSAzMSBkZSBkaWNpZW1icmUgZGUgMjAxOSkKICAgICAgICAgICAgVG9kYXMgbGFzIHVuaWRhZGVzIGVzdMOhbiBleHByZXNhZGFzIGVuIG1pbGVzIGRlIG1pbGxvbmVzIGRlIHBpZXMgY8O6Ymljb3MgKE1NTXBjKSIpIApgYGAKCiMgTW9kZWxvIGRlIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuICAKCkVsIHNpc3RlbWEgZGUgcHJvbsOzc3RpY28gZGUgcHJvZHVjY2nDs24gcGVybWl0ZSBlc3RpbWFyIGVsIHZvbHVtZW4gZGUgcmVzZXJ2YXMgcHJvYmFkYXMgcmVtYW5lbnRlcyBkZSB1biBjYW1wbyBwcm9kdWN0b3IgZGUgYWNlaXRlIG8gZ2FzLiAgCgpMYXMgKipyZXNlcnZhcyBwcm9iYWRhcyoqIHJlcHJlc2VudGFuIGVsIHZhbG9yIGFjdHVhbCBkZWwgY2FtcG8sIHNvbiBsb3MgcmVjdXJzb3MgcXVlIHBvc2VlbiBlbCBtZW5vciByaWVzZ28gY29uIHJlc3BlY3RvIGEgbGFzIG90cmFzIGVzdGltYWNpb25lcyBkZSByZWN1cnNvcyB5IHJlcHJlc2VudGFuIGVsIHZhbG9yIHJlbWFuZW50ZSBkZWwgY2FtcG8uICAKCkVsIHNpc3RlbWEgZW1wbGVhIGRhdG9zIGRlIHByb2R1Y2Npw7NuIGRlIGFjZWl0ZSBvIGdhcyBkZWwgY2FtcG8gbyBkZSBwb3pvcyBwYXJhIGhhY2VyIGxhIGVzdGltYWNpw7NuIGRlIGxvcyB2b2zDum1lbmVzLiAgCgpFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBlbCBzaXN0ZW1hIHJlcHJvZHVjZSBsYSBoaXN0b3JpYSBkZSBwcm9kdWNjacOzbiBtZWRpYW50ZSB1biBhbGdvcml0bW8gcXVlIGluaWNpYWxtZW50ZSByZWFsaXphIHVuYSBhcHJveGltYWNpw7NuIG1hdGVtw6F0aWNhIGRlIGxvcyBkYXRvcyBkZSBwcm9kdWNjacOzbiB5IHBvc3Rlcmlvcm1lbnRlLCBtZWRpYW50ZSBsYSBtb2RpZmljYWNpw7NuIHJlaXRlcmFkYSBkZSBsb3MgcGFyw6FtZXRyb3MgZGUgYWp1c3RlLCBsb2dyYSBtaW5pbWl6YXIgbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBkYXRvcyB5IGxhIGVzdGltYWNpw7NuLiAgCgpFbCBhbGdvcml0bW8g4oCcZGVjaWRl4oCdIGxhIG1vZGlmaWNhY2nDs24gZGUgbG9zIHBhcsOhbWV0cm9zIHVzYW5kbyBjcml0ZXJpb3MgZGUgb3B0aW1pemFjacOzbiBxdWUgc29uIGV2YWx1YWRvcyBtZWRpYW50ZSBlc3RpbWFjaW9uZXMgZGUgbcOtbmltb3MgY3VhZHJhZG9zLgoKRWwgc2lzdGVtYSBjYWxjdWxhIGVsIGVzdGltYWRvIGRlIHByb2R1Y2Npw7NuIGVzcGVyYWRvIGZpbmFsIGRlbCBjYW1wbyDigJxFc3RpbWF0ZWQgdWx0aW1hdGUgcmVjb3ZlcnkgKEVVUinigJ0uIEFsIHJlc3RhciBsYSBwcm9kdWNjacOzbiBhY3VtdWxhZGEgZGVsIGNhbXBvIGEgbGEgZXN0aW1hY2nDs24gRVVSIHNlIG9idGllbmUgbGFzIHJlc2VydmFzIHByb2JhZGFzIHJlbWFuZW50ZSBkZWwgY2FtcG8uICAKClZpc3RvIHF1ZSBsb3MgZGF0b3MgdXNhZG9zIGVuIGVsIGPDoWxjdWxvIHByb3ZpZW5lbiBkZSBwb3pvcyBlbiBwcm9kdWNjacOzbiB5IHF1ZSBlc2EgcHJvZHVjY2nDs24gZXMgbWFuZWphZGEgYSB0cmF2w6lzIGRlIGluc3RhbGFjacOzbiBleGlzdGVudGVzLCBsYXMgZXN0aW1hY2lvbmVzIHJlYWxpemFkYXMgcG9yIGVsIHNpc3RlbWEgc2UgY2xhc2lmaWNhbiBjb21vIOKAnCoqcmVzZXJ2YXMgcHJvYmFkYXMgZGVzYXJyb2xsYWRhcyoq4oCdLgoKUG9yIG90cmEgcGFydGUsIGVsIHNpc3RlbWEgY2xhc2lmaWNhIGxvcyBwb3pvcyBzZWfDum4gc3UgZXN0YWRvIGVuOiDigJxhY3Rpdm9z4oCdIHkg4oCcY2VycmFkb3PigJ0sIHRvbWFuZG8gZW4gY29uc2lkZXJhY2nDs24gbGEgZmVjaGEgZGUgbGEgw7psdGltYSBwcm9kdWNjacOzbiBkZWwgcG96bywgbG9zICoqYWN0aXZvcyoqIGNvcnJlc3BvbmRlbiBhIGFxdWVsbG9zIGN1eWEgZmVjaGEgZGUgcHJvZHVjY2nDs24gY29pbmNpZGUgY29uIGVsIHZhbG9yIG3DoXhpbW8gZGUgbGEgZmVjaGEgZGUgbG9zIGRhdG9zIHVzYWRvcywgZW4gdGFudG8gcXVlIGxvcyBwb3pvcyAqKmNlcnJhZG9zKiosIGNvcnJlc3BvbmRlbiBhbCByZXN0byBkZSBsb3MgcG96b3MgcXVlIG5vIGN1bXBsZW4gZWwgY3JpdGVyaW8gYW50ZXJpb3IgbWVuY2lvbmFkby4KClZpc3RvIHF1ZSBlbCBzaXN0ZW1hIHJlYWxpemEgbGEgZXN0aW1hY2nDs24gZGUgbWFuZXJhIGluZGl2aWR1YWwgcGFyYSBjYWRhIHBvem8sIGxhcyByZXNlcnZhcyBzZSBjbGFzaWZpY2FuIGVuOiAqKnByb2JhZGFzIGRlc2Fycm9sbGFkYXMgZW4gcHJvZHVjY2nDs24qKiAocG96b3MgYWN0aXZvcykgeSAqKmRlc2Fycm9sbGFkYXMgbm8gZW4gcHJvZHVjY2nDs24qKiAocG96b3MgY2VycmFkb3MpLgoKIyMgRGF0b3MgZGUgcHJvZHVjY2nDs24gZGVsIGNhbXBvICAKCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YSBsb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gZGlzcG9uaWJsZXMgcGFyYSBsb3MgYW7DoWxpc2lzIHN1YnNlY3VlbnRlcy4gIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMgMS4gZnVuX3dlbGxzLmZpZWxkLmRhdGEKd2VsbHMuZmllbGQuZGF0YSA8LSBmdW5jdGlvbihkYXRhLCBGaWVsZCkgCnsKICBkYXRhICU+JQogICAgZHBseXI6OmZpbHRlcihmaWVsZF9hbmFseXplID09IGZpZWxkKSAlPiUKICAgIGRwbHlyOjpzZWxlY3QoZmllbGQsIHdlbGxfbmFtZSA9IHdlbGwsIGRhdGUgPSB3cGQsIHllYXIsIAogICAgICAgICAgICAgICAgICBtb250aCA9IG1vbnRocywgZGF5cywgcSA9IGRuYWdwLCBkd3ApICU+JQogICAgZHBseXI6OmFycmFuZ2Uod2VsbF9uYW1lLCBkYXRlKQp9CgojIHJlbW92ZSB3ZWxsIApkZiA8LSB3ZWxscy5maWVsZC5kYXRhKHdwZCwgZmllbGRfYW5hbHl6ZSkgJT4lCiAgZ3JvdXBfYnkod2VsbF9uYW1lKSAlPiUKICBmaWx0ZXIoIWFueSh3ZWxsX25hbWUgPT0gIkNVSVRMQUhVQUMtNjgyIikpICU+JQogIHVuZ3JvdXAoKQoKZGFkIDwtIG1heCh3cGQkd3BkLCBuYS5ybSA9IFQpICAjIGRhdGEgYWN0dWFsIGRhdGUgCmZhZCA8LSBtYXgoZGYkZGF0ZSwgbmEucm0gPSBUKSAjIEZpZWxkIGFjdHVhbCBwcm9kdWN0aW9uIGRhdGUKcGZtZCA8LSBmYWQgKyBtb250aHMoZnB0KSAgICAgICMgUHJvZHVjdGlvbiBmb3JlY2FzdCBtb2RlbCBkYXRlCgojIHdwZCAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQpgYGAKCiMjIyBPYnNlcnZhY2lvbmVzICAgICAKCkEgY29udGludWFjacOzbiBzZSBtZW5jaW9uYW4gbGFzIGZlY2hhcyBtYXMgcmVsZXZhbnRlcyB1c2FkYXMgcG9yIGVsIHNpc3RlbWE6CgotIERhdGEgYWN0dWFsIHByb2R1Y3Rpb24gZGF0ZTogICoqYHIgZGFkYCoqCi0gRmllbGQgYWN0dWFsIHByb2R1Y3Rpb24gZGF0ZTogICoqYHIgZmFkYCoqIAotIFByb2R1Y3Rpb24gZm9yZWNhc3QgbW9kZWwgZGF0ZTogICoqYHIgcGZtZGAqKgoKIyMgU3VtYXJpbyBkZSBkYXRvcyBkZSBwcm9kdWNjacOzbiAgCgpMYSBzaWd1aWVudGUgdGFibGEgbXVlc3RyYSB1biBzdW1hcmlvIGRlIGxvcyBkYXRvcyBkZSBwcm9kdWNjacOzbiBkZSBjYWRhIHBvem8uICAKCi0gcG06IHBlcmlvZG8gZGUgcHJvZHVjY2nDs24gKG1lc2VzKSAgCi0gc3BkOiBmZWNoYSBkZSBpbmljaW8gZGUgcHJvZHVjY2nDs24gIAotIGFwZDogZmVjaGEgYWN0dWFsIGRlIHByb2R1Y2Npw7NuCi0gUTogcHJvZHVjY2nDs24gYWN1bXVsYWRhICAKLSBFc3RhdHVzOiBBY3RpdmUgb3IgQ2xvc2VkICAKCmBgYHtyfQp3ZWxsX3N0YXR1cyA8LSBkZiAlPiUgZ3JvdXBfYnkod2VsbF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKHBtID0gbigpLCAKICAgICAgICAgICAgc3BkID0gbWluKGRhdGUsIG5hLnJtID0gVCksCiAgICAgICAgICAgIGFwZCA9IG1heChkYXRlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBRID0gcm91bmQoc3VtKHEgKiBkYXlzLCBuYS5ybSA9IFQpLCAwKSAvIDEwMDAKICAgICAgICAgICAgKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHN0YXR1cyA9IGlmX2Vsc2UoYXBkID09IGZhZCwgIkFjdGl2ZSIsICJDbG9zZWQiKSkgJT4lCiAgYXJyYW5nZShkZXNjKFEpLCBzdGF0dXMsIHdlbGxfbmFtZSkKCndlbGxfc3RhdHVzCmBgYAoKIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyBQRk0gcmVzdWx0cyAKc3RhcnRfdGltZSA8LSBTeXMudGltZSgpCiMgcmVtb3ZlIHdlbGwgCmRmIDwtIHdwZCAlPiUgZmlsdGVyKCFhbnkod2VsbCA9PSAiQ1VJVExBSFVBQy02ODIiKSkKb3V0IDwtIHdlbGxzLmZpZWxkLm1vZGVsKGRmKQpmdHd2IDwtIG91dCRmdHd2CndxUWYgPC0gb3V0JHdxUWYKZmFwZCA8LSBvdXQkZmFwZApmZG1lIDwtIG91dCRmZG1lCnFlIDwtIG91dCRxZQp3ZWxsX3N0YXR1c19zdW0gPC0gb3V0JHdlbGxfc3RhdHVzX3N1bQpgYGAKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CndxUWYgJT4lIGdyb3VwX2J5KHdlbGxfbmFtZSkgJT4lIAogIHN1bW1hcmlzZShtUWYgPSBtYXgoUWYsIG5hLnJtID0gVCkpICU+JSAKICBhcnJhbmdlKGRlc2MobVFmKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAyKQpgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGZ1bmN0aW9uIHRvIHB1dCBOQSB2YWx1ZSB0byBkYXRlIGlmIHEgdmFsdWUgaXMgTkEKbmFfZGF0ZSA8LSBmdW5jdGlvbihkYXRlLCBxKSB7CiAgeCA9IGlmX2Vsc2UoaXMubmEocSksIHltZChOQSksIHltZChkYXRlKSkgIAp9CgojIHJlbW92ZSB3cm9uZyBkYXRlIApkMiA8LSB3cVFmICU+JSAKICBncm91cF9ieSh3ZWxsX25hbWUpICU+JSAKICBtdXRhdGUoZGF0ZSA9IG5hX2RhdGUoZGF0ZSwgcSkpCm5hbWVzKGQyKQoKIyBmaWx0ZXIgb3V0IHEgZXF1YWwgTkEKZDMgPC0gZDIgJT4lIAogIGdyb3VwX2J5KHdlbGxfbmFtZSkgJT4lIAogIGZpbHRlcihpcy5uYShxKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3Qod2VsbF9uYW1lLCB0biA9IHQpCgojIGZ1bmN0aW9uIHRvIGV4dHJhY3QgbGFzdCBkYXRlIHByb2R1Y3Rpb24gCmV4dHJhY3RfbGFzdF9wcm9kX2RhdGUgPC0gZnVuY3Rpb24oeCkgewogIHggPSBtYXgoeCwgbmEucm0gPSBUKQp9CgojIGV4dHJhY3QgbGFzdCBkYXRlIHByb2R1Y3Rpb24gCmQ0IDwtIGQyICU+JSAKICBncm91cF9ieSh3ZWxsX25hbWUpICU+JSAKICBtdXRhdGUoZGFfbWF4ID0gZXh0cmFjdF9sYXN0X3Byb2RfZGF0ZShkYXRlKSkgJT4lCiAgdW5ncm91cCgpICU+JSAKICBzZWxlY3Qod2VsbF9uYW1lLCBkYV9tYXgsIHQsIHEpCgojIGFkZCBudW1iZXIgb2YgbW9udGhzIHRvIGRhdGUgCmQ1IDwtIGQ0ICU+JSAKICBncm91cF9ieSh3ZWxsX25hbWUpICU+JQogIGZpbHRlcihpcy5uYShxKSkgJT4lCiAgbXV0YXRlKHRwID0gMTpuKCkpICU+JSAKICBtdXRhdGUoZGF0ZTEgPSBkYV9tYXggJW0rJSBtb250aHModHApKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc2VsZWN0KHdlbGxfbmFtZSwgdCwgZGF0ZTEpCgojIGpvaW4gZDIgJiBkNQpkNiA8LSAKICBmdWxsX2pvaW4oZDIsIGQ1KSAlPiUKICBkaXN0aW5jdCh0LCAua2VlcF9hbGwgPSBUKSAlPiUKICBhcnJhbmdlKHdlbGxfbmFtZSwgdCkKCiMgY29ycmVjdGVkIGRhdGUgIApkNyA8LSBkNiAlPiUgCiAgbXV0YXRlKGRhdGUyID0gaWZfZWxzZShpcy5uYShkYXRlKSwgZGF0ZTEsIGRhdGUpKSAlPiUKICBzZWxlY3QoLWRhdGUsIC1kYXRlMSkgJT4lCiAgcmVuYW1lKGRhdGUgPSBkYXRlMikKCiMgY2hhbmdlIG5hbWUgIAp3cVFmIDwtIGQ3CmBgYAoKIyMgU3VtYXJpbyBkZWwgTW9kZWxvIGRlIFByb27Ds3N0aWNvIGRlIFByb2R1Y2Npw7NuICAKClNlIHV0aWxpesOzIHVuYSB2ZW50YWRhIGRlIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuIGRlICoqMTUgYcOxb3MqKiwgc2ltaWxhciBhIGxhIGR1cmFjacOzbiBkZWwgcGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWEuIAoKTGEgc2lndWllbnRlIHRhYmxhIG11ZXN0cmEgbG9zIHJlc3VsdGFkb3MgZGVsICoqbW9kZWxvIGRlIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuKiogcGFyYSBlbCBjYW1wbyAqKmJ5ZmllbGQqKiB5IGxvcyBwb3pvcyAqKmJ5d2VsbHMqKiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp3cVFmIDwtIHdxUWYgJT4lCiAgZ3JvdXBfYnkod2VsbF9uYW1lKSAlPiUKICBmaWx0ZXIoIWFueSh3ZWxsX25hbWUgPT0gIkNVSVRMQUhVQUMtNjgyIikpICU+JQogIHVuZ3JvdXAoKQoKIyMgMjIuMiBydW4uc3VtbWFyaXplLm1vZGVsCiMgc3QgPC0gc3VtbWFyaXplLm1vZGVsKGZ0d3YsIHdxUWYpCnN0IDwtIHN1bW1hcml6ZS5tb2RlbChmdHd2LCB3cVFmKQojIGNyZWF0ZSBwcmludCByZXN1bHRzIG9iamVjdCAgCiMgVGl0bGUKdGl0bGUgPC0gcGFzdGUoVGl0bGUsIAogICAgICAgICAgICAgICAiU3VtYXJpbyBNb2RlbG8gUHJvbsOzc3RpY28gZGUgUHJvZHVjY2nDs24iKQoKcHJpbnQudGFibGUoc3QsIHRpdGxlLCAwLCAKICAgICAgICAgICAgIlJlc3VsdGFkb3MgZGVsIG1vZGVsbzogYnlXZWxscyAmIGJ5RmllbGQgCiAgICAgICAgICAgIFByb2R1Y3Rpb246IHByb2R1Y2Npw7NuIGFjdW11bGFkYSBkZSBnYXMKICAgICAgICAgICAgRm9yZWNhc3QgUHJvZHVjdGlvbjogcHJvbsOzc3RpY28gZGUgcHJvZHVjY2nDs24gZGVsIHNpc3RlbWEgICAKICAgICAgICAgICAgUHJvdmVkIERldmVsb3BlZCBSZXNlcnZlczogcmVzZXJ2YXMgcHJvYmFkYXMgZGVzYXJyb2xsYWRhcyAgCiAgICAgICAgICAgIFByb2R1Y3Rpb24gZGF0YSBzb3VyY2U6IENOSAogICAgICAgICAgICBUb2RhcyBsYXMgdW5pZGFkZXMgZXN0w6FuIGV4cHJlc2FkYXMgZW4gbWlsZXMgZGUgbWlsbG9uZXMgZGUgcMOtZXMgY8O6YmljbyAoTU1NY2YpIikgICAgIApgYGAKCiMjIFJlc2VydmFzIHByb2JhZGFzIGRlc2Fycm9sbGFkYXMgIAoKTGFzIFJlc2VydmFzIHByb2JhZGFzIGRlc2Fycm9sbGFkYXMgc29uIGNhbnRpZGFkZXMgcXVlIHNlIGVzcGVyYW4gc2VhbiByZWN1cGVyYWRhcyBkZSBwb3pvcyBlIGluc3RhbGFjaW9uZXMgZGUgcHJvZHVjY2lvzIFuIHkgdHJhdGFtaWVudG8gZXhpc3RlbnRlcy4gIAoKTGEgc2lndWllbnRlIHRhYmxhIG11ZXN0cmEgbG9zIHJlc3VsdGFkb3MgZGUgc2lzdGVtYSBhc29jaWFkbyBhIGxhcyByZXNlcnZhcyBwcm9iYWRhcyB5IGNsYXNpZmljYWRhcyBzZWfDum4gZWwgZXN0YXR1cyBkZSBsb3MgcG96b3MuICAKCi0gTGFzICoqUmVzZXJ2YXMgRGVzYXJyb2xsYWRhcyBQcm9kdWNpZW5kbyoqIHNlIGVzcGVyYW4gc2VhbiByZWN1cGVyYWRhcyBkZSBpbnRlcnZhbG9zIGNvbXBsZXRhZG9zIHF1ZSBlc3RhzIFuIGFiaWVydG9zIHkgZW4gcHJvZHVjY2lvzIFuIGFsIG1vbWVudG8gZGUgbGEgZXN0aW1hY2nDs24KCi0gTGFzICoqUmVzZXJ2YXMgRGVzYXJyb2xsYWRhcyBObyBQcm9kdWNpZW5kbyoqIGluY2x1eWVuIGxhcyBkZW5vbWluYWRhcyByZXNlcnZhcyB0ZW1wb3JhbG1lbnRlIGNlcnJhZGFzIHkgbGFzIHJlc2VydmFzIGVuIHpvbmFzIG5vIHBlcmZvcmFkYXMgZGV0cmHMgXMgZGUgdHViZXJpzIFhLCBjb24gY29zdG9zIGRlIGFjY2VzbyBtZW5vcmVzICAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyAyMi4zIHByaW50LndlbGwuc3RhdHVzLnN1bQp0aXRsZSA8LSBwYXN0ZShUaXRsZSwgIlByb3ZlZCBSZXNlcnZlcyIsICJAIiwgZmRtZSkKcHJpbnQudGFibGUod2VsbF9zdGF0dXNfc3VtLCAKICAgICAgICAgICAgdGl0bGUsIDAsIAogICAgICAgICAgICAiUHJvZHVjaW5nOiBQcm92ZWQgRGV2ZWxvcGVkIHByb2R1Y2luZyByZXNlcnZlcyAKICAgICAgICAgICAgTm9uLXByb2R1Y2luZzogUHJvdmVkIERldmVsb3BlZCBub24tcHJvZHVjaW5nIHJlc2VydmVzIAogICAgICAgICAgICBXZWxsczogbnVtYmVyIG9mIHdlbGxzCiAgICAgICAgICAgIFByb2R1Y3Rpb246IEFjY3VtdWxhdGVkIGdhcyBwcm9kdWN0aW9uCiAgICAgICAgICAgIEZvcmVjYXN0IFByb2R1Y3Rpb246IEFjY3VtdWxhdGVkIGZvcmVjYXN0IGdhcyBwcm9kdWN0aW9uCiAgICAgICAgICAgIFJlc2VydmVzOiBQcm92ZWQgZGV2ZWxvcGVkIFJlc2VydmVzCiAgICAgICAgICAgIFRvZGFzIGxhcyB1bmlkYWRlcyBlc3TDoW4gZXhwcmVzYWRhcyBlbiBtaWxlcyBkZSBtaWxsb25lcyBkZSBwaWVzIGPDumJpY29zIChNTU1wYykiKQpgYGAKCiMjIFByb2R1Y2Npw7NuIGRpYXJpYSBkZWwgY2FtcG8gKFJlYWwgJiBNb2RlbG8pICAKCkxhIHNpZ3VpZW50ZSBmaWd1cmEgbXVlc3RyYSBlbCBwZXJmaWwgZGUgcHJvZHVjY2nDs24gZGVsIGNhbXBvICJxIiAoKipyb2pvKiopIHkgbG9zIHJlc3VsdGFkb3MgZGVsIG1vZGVsbyAicWYiICgqKmF6dWwqKikgCgotIHE6IHByb2R1Y2Npw7NuIGRpYXJpYSAoTU1wY2QpCi0gcWY6IHByb2R1Y2Npw7NuIGRpYXJpYSBnZW5lcmFkYSBwb3IgZWwgbW9kZWxvIChNTXBjZCkgCgpFbiB0w6lybWlub3MgZ2VuZXJhbGVzLCBlbCBtb2RlbG8gbm8gbHVjZSBlc3RhciBoYWNpZW5kbyBtdXkgYnVlbiB0cmFiYWpvLCBlbGxvIHNlIGRlYmUgZXNlbmNpYWxtZW50ZSBhIHF1ZSBsb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gZGVsIGNhbXBvIG11ZXN0cmFuIGFsIG1lbm9zIGRvcyBwZXJpb2RvcyBkZSBkZXNhcnJvbGxvOiBlbCBwcmltZXJvIHNlIHViaWNhIGFwcm94aW1hZGFtZW50ZSBwcmV2aW8gYWwgYcOxbyAyMDAwIGRvbmRlIGVsIGNhbXBvIHR1dm8gdW5hIHRhc2EgZGUgcHJvZHVjY2nDs24gbcOheGltYSBhcHJveGltYWRhIGRlIDE1IE1NcGNkLCBlbiB0YW50byBxdWUgZWwgc2VndW5kbyBwZXJpb2RvLCBzZSB1YmljYSBwb3N0ZXJpb3IgYWwgYcOxbyAyMDAgeSBkb25kZSBzZSBvYnNlcnZhIHVuYSB0YXNhIGRlIHByb2R1Y2Npw7NuIGNlcmNhbmEgYSBsb3MgMTUwIE1NcGNkLgoKRWwgc2lzdGVtYSBkZSBwcm9uw7NzdGljbyBkZSBwcm9kdWNjacOzbiBwZXJtaXRlICJsaW1pdGFyIiBsb3MgZGF0b3MgZGUgZW50cmFkYSBhbCBtb2RlbG8sIGVsbG8gc2luIGR1ZGEgbWVqb3JhcsOtYSBsb3MgcmVzdWx0YWRvcyBkZWwgYWp1c3RlIGRlIGxvcyBkYXRvcyByZWFsZXMgdnMuIGxvcyByZXN1bHRhZG9zIGRlbCBtb2RlbG8uICBFc2UgZWplcmNpY2lvIHNlIGhhcsOhIGVuIG90cmEgb3BvcnR1bmlkYWQuCgpgYGB7ciBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aXRsZSA8LSBwYXN0ZShUaXRsZSwgIlxuRm9yZWNhc3QgUHJvZHVjdGlvbiBNb2RlbCIpCgpnZ3Bsb3RseShmdHd2ICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGFlcyhkYXRlLCBxLCBjb2wgPSAicSIpKSArCiAgZ2VvbV9saW5lKGFlcyhkYXRlLCBxZiwgY29sID0gInFmIikpICsKICBsYWJzKHRpdGxlID0gdGl0bGUsIHggPSAiZmVjaGEiLCB5ID0gIk1NcGNkIiwgY2FwdGlvbiA9IENhcHRpb24pICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsdWUiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpKSkKYGBgCgojIyBQcm9kdWNjacOzbiBhY3VtdWxhZGEgZGVsIGNhbXBvIChSZWFsICYgTW9kZWxvKSAgIAoKTGEgc2lndWllbnRlIGZpZ3VyYSBtdWVzdHJhIGxhIHByb2R1Y2Npw7NuIGFjdW11bGFkYSBkZWwgY2FtcG8gIlEiICgqKnJvam8qKikgeSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvICJRZiIgKCoqYXp1bCoqKSAKCi0gUTogcHJvZHVjY2nDs24gYWN1bXVsYWRhIGRlbCBjYW1wbyAoTU1NcGMpICAKLSBRZjogcHJvZHVjY2nDs24gYWN1bXVsYWRhIGdlbmVyYWRhIHBvciBlbCBtb2RlbG8gKE1NTXBjKQoKYGBge3IgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dwbG90bHkoZnR3diAlPiUgCiAgZ2dwbG90KCkgKwogIGdlb21fbGluZShhZXMoZGF0ZSwgUSwgY29sID0gIlEiKSkgKwogIGdlb21fbGluZShhZXMoZGF0ZSwgUWYsIGNvbCA9ICJRZiIpKSArCiAgbGFicyh0aXRsZSA9IHRpdGxlLCB4ID0iZGF0ZSIsIHkgPSAiTU1NY2YiKSkKYGBgCgojIyBQZXJmaWxlcyBkZSBwcm9kdWNjacOzbiBhY3VtdWxhZGEgZGUgcG96b3MgCgpFbiBsYSBzaWd1aWVudGUgZmlndXJhIHNlIG11ZXN0cmFuIGxvcyByZXN1bHRhZG9zIGRlbCBtb2RlbG8gZW4gZWwgZG9taW5pbyAqKnByb2R1Y2Npw7NuIGFjdW11bGFkYSoqIHkgc2UgaW5jbHV5ZSBsb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gZGUgbG9zIHBvem9zLgoKU2UgbXVlc3RyYW4gc29sbyAyMSBwb3pvcyAiQWN0aXZvcyIgb3JkZW5hZG9zIHNlZ8O6biBsYSBtYXlvciAqKnJlc2VydmFzIHByb2JhZGFzKiogY2FsY3VsYWRhcyBwb3IgZWwgc2lzdGVtYS4gIEVsIG7Dum1lcm8gZGUgcG96b3MgYWN0aXZvcyAqKlByb3ZlZCBEZXZlbG9wZWQgcHJvZHVjaW5nIHJlc2VydmVzKiogZXMgZGUgKipgciB3ZWxsX3N0YXR1c19zdW1bWzEsMl1dYCoqIHkgc3Ugdm9sdW1lbiBhc29jaWFkbyBlcyAqKmByIHdlbGxfc3RhdHVzX3N1bVtbMSw1XV1gKiogTU1NcGMuIAoKLSBDb2xvciByb2pvIGNvcnJlc3BvbmRlIGEgbGEgcHJvZHVjY2nDs24gcmVhbCBkZWwgcG96byAgCi0gQ29sb3IgYXp1bCBjb3JyZXNwb25kZSBhbCBwcm9uw7NzdGljbyBkZSBwcm9kdWNjacOzbiByZXN1bHRhZG8gZGVsIG1vZGVsbyAgCgpFbiBnZW5lcmFsLCBzZSBvYnNlcnZhIHVuYSBtdXkgYnVlbmEgY29ycmVzcG9uZGVuY2lhIGVudHJlIGxvcyBkYXRvcyBkZSBwcm9kdWNjacOzbiB5IGxhIGVzdGltYWNpw7NuIHJlYWxpemFkYSBwb3IgZWwgbW9kZWxvLgoKYGBge3IgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbHcgPC0gYygiQ1VJVExBSFVBQy04MDYiLCJDVUlUTEFIVUFDLTYxNiIsIkNVSVRMQUhVQUMtODczIiwiQ1VJVExBSFVBQy05NzIiLAogICAgICAgICAgICAgICAgIkNVSVRMQUhVQUMtMTA4NyIsCiAgICAgICAgICAgICAgICAiQ1VJVExBSFVBQy00NzIiLCJDVUlUTEFIVUFDLTEwMzAiLCAiQ1VJVExBSFVBQy01MTciLCJDVUlUTEFIVUFDLTcwMCIsCiAgICAgICAgICAgICAgICAiQ1VJVExBSFVBQy02NzYiICwKICAgICAgICAgICAgICAgICJDVUlUTEFIVUFDLTYzNyIsIkNVSVRMQUhVQUMtOTczIiwiQ1VJVExBSFVBQy01MTkiLCJDVUlUTEFIVUFDLTg3NiIsCiAgICAgICAgICAgICAgICAiQ1VJVExBSFVBQy01MjciLCAKICAgICAgICAgICAgICAgICJDVUlUTEFIVUFDLTUyNyIsIkNVSVRMQUhVQUMtODg5IiwiQ1VJVExBSFVBQy03ODciLCJDVUlUTEFIVUFDLTk1NSIsCiAgICAgICAgICAgICAgICAiQ1VJVExBSFVBQy01NjAiLCAKICAgICAgICAgICAgICAgICJDVUlUTEFIVUFDLTYyNSIsIkNVSVRMQUhVQUMtNTYxIiwiQ1VJVExBSFVBQy02NzYiLCJDVUlUTEFIVUFDLTY1NyIpIAoKZGYgPC0gd3FRZiAlPiUgCiAgZ3JvdXBfYnkod2VsbF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKFFmID0gbWF4KFFmLCBuYS5ybSA9IFQpKSAlPiUKICBmdWxsX2pvaW4od2VsbF9zdGF0dXMsIGJ5ID0gIndlbGxfbmFtZSIpCgpsdyA8LSBkZiAlPiUgCiAgZmlsdGVyKHN0YXR1cyA9PSAiQWN0aXZlIikgJT4lIAogIG11dGF0ZShSID0gUWYgLSBRKSAlPiUgIAogIGFycmFuZ2UoZGVzYyhSKSkgJT4lIAogIGhlYWQoMjEpCgpsdyA8LSBsdyR3ZWxsX25hbWUKZHVtbXkgPC0gd3FRZiAlPiUgZmlsdGVyKHdlbGxfbmFtZSAlaW4lIGx3KQoKdGl0bGUgPC0gcGFzdGUoVGl0bGUsIAogICAgICAgICAgICAgICAiXG5SYW5rZWQgYWNjb3JkaW5nIHRvIGZvcmVjYXN0IHByb3ZlbiByZXNlcnZlcyIpCgpnZ3Bsb3QoZHVtbXkpICArIAogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBRLCBjb2wgPSAiUSIpLCBzaXplID0gMS4yKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0gZGF0ZSwgeSA9IFFmLCBjb2wgPSAiUWYiKSkgICsgCiAgZmFjZXRfd3JhcCggfiB3ZWxsX25hbWUsIG5jb2wgPSAzLCBzY2FsZXMgPSAiZnJlZSIpICArCiAgbGFicyh0aXRsZSA9IHRpdGxlLCAKICAgICAgIHggPSJkYXRlIiwgCiAgICAgICB5ID0gIk1NTWNmIiwgY2FwdGlvbiA9IENhcHRpb24pICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsdWUiLCBzaXplID0gMTMsIGZhY2UgPSAiYm9sZCIpKQpgYGAKCiMjIFBlcmZpbGVzIGRlIHByb2R1Y2Npw7NuIGRpYXJpYSBkZSBwb3pvcyAKCkVuIGxhIHNpZ3VpZW50ZSBmaWd1cmEgc2UgbXVlc3RyYW4gbG9zIHJlc3VsdGFkb3MgZGVsIG1vZGVsbyBlbiBlbCBkb21pbmlvICoqcHJvZHVjY2nDs24gZGlhcmlhKiogeSBzZSBpbmNsdXllIGxvcyBkYXRvcyBkZSBwcm9kdWNjacOzbiBkZSBsb3MgcG96b3MuCgpTZSBtdWVzdHJhbiBsb3MgcG96b3Mgb3JkZW5hZG9zIHNlZ8O6biBsYSBtYXlvciByZXNlcnZhcyBwcm9iYWRhcyBjYWxjdWxhZGFzIHBvciBlbCBzaXN0ZW1hLiAgCgotIENvbG9yIHJvam8gY29ycmVzcG9uZGUgYSBsYSBwcm9kdWNjacOzbiByZWFsIGRlbCBwb3pvICAKLSBDb2xvciBhenVsIGNvcnJlc3BvbmRlIGFsIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuIHJlc3VsdGFkbyBkZWwgbW9kZWxvICAKCkVuIGdlbmVyYWwsIHNlIG9ic2VydmEgdW5hIG11eSBidWVuYSBjb3JyZXNwb25kZW5jaWEgZW50cmUgbG9zIGRhdG9zIGRlIHByb2R1Y2Npw7NuIHkgbGEgZXN0aW1hY2nDs24gcmVhbGl6YWRhIHBvciBlbCBtb2RlbG8uCgpgYGB7ciBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoZHVtbXkpICArIAogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBxLCBjb2wgPSAicSIpLCBzaXplID0gMSkgKwogIGdlb21fbGluZShhZXMoeCA9IGRhdGUsIHkgPSBxZiwgY29sID0gInFmIikpICArIAogIGZhY2V0X3dyYXAoIH4gd2VsbF9uYW1lLCBuY29sID0gMywgc2NhbGVzID0gImZyZWUiKSAgKwogIGxhYnModGl0bGUgPSB0aXRsZSwgCiAgICAgICB4ID0gImRhdGUiLCAKICAgICAgIHkgPSAiTU1jZmQiLCBjYXB0aW9uID0gQ2FwdGlvbikgKyAKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxMywgZmFjZSA9ICJib2xkIikpCmBgYAoKIyMgTWFwYSBkZSBwb3pvcyBkZSByZXNlcnZhcyBwcm9iYWRhcyAgICAgCgpFbCBzaWd1aWVudGUgbWFwYSBtdWVzdHJhIGxhcyByZXNlcnZhcyBwcm9iYWRhcyBkZXNhcnJvbGxhZGFzIGVuIHByb2R1Y2Npw7NuIG9idGVuaWRhcyBjb21vIHJlc3VsdGFkb3MgZGVsICoqbW9kZWxvIGRlIHByb27Ds3N0aWNvIGRlIHByb2R1Y2Npw7NuKiogcGFyYSBsb3MgcG96b3MgKiphY3Rpdm9zLioqIAoKTGFzICoqcmVzZXJ2YXMgcHJvYmFkYXMgZGVzYXJyb2xsYWRhcyBlbiBwcm9kdWNjacOzbioqIHJlcHJlc2VudGFuIGxhIG1lam9yIGFwcm94aW1hY2nDs24gYWwgdmFsb3IgYWN0dWFsIHJlbWFuZW50ZSBkZWwgY2FtcG8sIHNvbiBsb3MgcmVjdXJzb3MgcXVlIHBvc2VlbiBlbCBtZW5vciByaWVzZ28gY29uIHJlc3BlY3RvIGEgbGFzIG90cmFzIGVzdGltYWNpb25lcyBkZSByZWN1cnNvcyB5IHJlcHJlc2VudGFuIGVsICoqdmFsb3IgcmVtYW5lbnRlIGRlbCBjYW1wbyoqIHkgcXVlIGVzdMOhIHBvciBlbCBvcmRlbiBkZSBsb3MgKipgciB3ZWxsX3N0YXR1c19zdW1bWzEsNV1dYCoqIE1NTXBjLgoKRWwgc2lzdGVtYSB0aWVuZSBkZW50cm8gZGUgc3VzIG9wY2lvbmVzLCBwZXJtaXRpciByZWFsaXphciB1bmEgKipldmFsdWFjacOzbiBlY29uw7NtaWNhKiosIGxvcyBkYXRvcyBuZWNlc2FyaW9zIHJlbGFjaW9uYWRvcyBjb24gZWwgZXNxdWVtYSBpbXBvc2l0aXZvIChpbXB1ZXN0byBzb2JyZSBsYSByZW50YSB5IG90cm9zKSB5IGxvcyBjb3N0b3MgZGUgb3BlcmFjacOzbiAob3BleCBmaWpvIHkgdmFyaWFibGUpIG5vIGVzdMOhbiBkaXNwb25pYmxlcyBlbiBlc3RlIG1vbWVudG8gcGFyYSBwb2RlciBoYWNlciBsYSBldmFsdWFjacOzbiBlY29uw7NtaWNhLgoKRmluYWxtZW50ZSwgZWwgZGnDoW1ldHJvIGRlbCBjaXJjdWxvIGVuIGVsIG1hcGEgZXMgcHJvcG9yY2lvbmFsIGFsIHZvbHVtZW4gYXNvY2lhZG8gYSBjYWRhIHBvem8uCgpTZSBtdWVzdHJhbiBzb2xvIDIxIHBvem9zICJBY3Rpdm9zIiBvcmRlbmFkb3Mgc2Vnw7puIGxhIG1heW9yICoqcmVzZXJ2YXMgcHJvYmFkYXMqKiBjYWxjdWxhZGFzIHBvciBlbCBzaXN0ZW1hLiAgRWwgbsO6bWVybyBkZSBwb3pvcyBhY3Rpdm9zICoqUHJvdmVkIERldmVsb3BlZCBwcm9kdWNpbmcgcmVzZXJ2ZXMqKiBlcyBkZSAqKmByIHdlbGxfc3RhdHVzX3N1bVtbMSwyXV1gKiogeSBzdSB2b2x1bWVuIGFzb2NpYWRvIGVzICoqYHIgd2VsbF9zdGF0dXNfc3VtW1sxLDVdXWAqKiBNTU1wYy4gCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkMSA8LSB3ZCAlPiUgCiAgZnVsbF9qb2luKGRmLCAgYnkgPSAid2VsbF9uYW1lIikgJT4lIAogIG11dGF0ZShSZXNlcnZlcyA9IFFmIC0gUSkKCmR1bW15IDwtIGQxICU+JSBmaWx0ZXIoc3RhdHVzID09ICJBY3RpdmUiKQpnZ3Bsb3QoZHVtbXkpICsgCiAgZ2VvbV9wb2ludChhZXMoeC8xMDAwLCB5LzEwMDAsIGNvbCA9IFJlc2VydmVzLCBzaXplID0gUmVzZXJ2ZXMpLCBhbHBoYSA9IDAuNSkgKyAKICBjb29yZF9lcXVhbCgpICsgIAogIGxhYnModGl0bGUgPSBwYXN0ZShUaXRsZSwgIlxuUHJvdmVkIERldmVsb3BlZCBwcm9kdWNpbmcgcmVzZXJ2ZXNcblBvem9zIEFjdGl2b3M6Iix3ZWxsX3N0YXR1c19zdW1bWzEsMl1dLCAiXG5SZXNlcnZhczoiLCB3ZWxsX3N0YXR1c19zdW1bWzEsNV1dLCAiTU1NcGMiKSwKICAgICAgIHggPSAiVVRNIChtaWxlcyBkZSBtZXRyb3MpIiwgeSA9ICJVVE0gKG1pbGVzIGRlIG1ldHJvcykiLCAKICAgICAgIGNhcHRpb24gPSBDYXB0aW9uKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEzLCBmYWNlID0gImJvbGQiKSkgKwogIHNjYWxlX3NpemUocmFuZ2UgPSBjKC4xLCA5KSwgbmFtZSA9ICJSZXNlcnZlcyAoTU1NY2YpIikgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudChsb3cgPSAiIzAwRkYwMCIsIGhpZ2ggPSAiIzAwNjYzMyIpICsgIAogIGd1aWRlcyh4ID0gZ3VpZGVfYXhpcyhhbmdsZSA9IDkwKSkKICAKCmBgYAoKIyBDb25zaWRlcmFjaW9uZXMgZmluYWxlcyAgCgpBIGNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGEgdW5hIHJlY29waWxhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3MgcHJldmlhbWVudGUgbW9zdHJhZG9zLiAKClNlIGluY2x1eWUgZWwgcGxhbiBkZSBkZXNhcnJvbGxvOyBsYSBwcm9kdWNjacOzbiAmIHJlc2VydmFzIG9maWNpYWxlczsgbG9zIHJlc3VsdGFkb3MgZGVsIG1vZGVsbyBkZSBwcm9uw7NzdGljbyBkZSBwcm9kdWNjacOzbiBwYXJhIGVsIGNhbXBvIHkgbG9zIHBvem9zLgoKIyMgUGxhbiBkZSBkZXNhcnJvbGxvIGRlIFJlZmVyZW5jaWEgICAgCgotIER1cmFjacOzbjogMTUgYcOxb3MgIAotIEdhcyBuYXR1cmFsIChNTU1wYykgIAotIEdhcyBuZXRvIEttIDE5IChNTU1wYykgIAotIENvbmRlbnNhZG8gbmV0byBLbSAxOSAoTU1iKSAgCgpgYGB7cn0KdGl0bGUgPC0gcGFzdGUoVGl0bGUsICJcblBsYW4gZGUgZGVzYXJyb2xsbyAtIFByb2R1Y2Npw7NuIGVzdGltYWRhIGFjdW11bGFkYSBkZWwgY2FtcG8iKQpwcmludC50YWJsZShwZG8sIHRpdGxlLCAwLCAKICAgICAgICAgICAgIlRvZGFzIGxhcyB1bmlkYWRlcyBlc3TDoW4gZXhwcmVzYWRhcyBlbiBtaWxlcyBkZSBtaWxsb25lcyBkZSBwaWVzIGPDumJpY29zIChNTU1wYykiKSAKYGBgCgojIyAqKlByb2R1Y2Npw7NuICYgcmVzZXJ2YXMgb2ZpY2lhbGVzKiogICAKCmBgYHtyfQp0aXRsZSA8LSBwYXN0ZShUaXRsZSwgIlxuUmVzZXJ2YXMgb2ZpY2lhbGVzIikKcHJpbnQudGFibGUocmVjLCB0aXRsZSwgMCwgCiAgICAgICAgICAgICJPR0lQOiBWb2x1bWVuIG9yaWdpbmFsIGRlIGdhcyBlbiBzaXRpbwogICAgICAgICAgICBGUjogRmFjdG9yIGRlIHJlY3VwZXJhY2nDs24KICAgICAgICAgICAgUmVzZXJ2YXM6IFJlc2VydmFzIG9maWNpYWxlcyBkZWwgY2FtcG8KICAgICAgICAgICAgUENFOiBQZXRyw7NsZW8gY3J1ZG8gZXF1aXZhbGVudGUKICAgICAgICAgICAgTmc6IFByb2R1Y2Npw7NuIGFjdW11bGFkYSBkZSBnYXMgbmF0dXJhbAogICAgICAgICAgICBUb2RhcyBsYXMgdW5pZGFkZXMgZXN0w6FuIGV4cHJlc2FkYXMgZW4gbWlsZXMgZGUgbWlsbG9uZXMgZGUgcGllcyBjw7piaWNvcyAoTU1NcGMpIikgCmBgYAoKIyMgKipQcm9ub3N0aWNvIGRlIHJlc2VydmFzIChDYW1wbyAmIHBvem9zKSoqICAKCmBgYHtyfQp0aXRsZSA8LSBwYXN0ZShUaXRsZSwgCiAgICAgICAgICAgICAgICJGb3JlY2FzdCBQcm9kdWN0aW9uIE1vZGVsIFN1bW1hcnkiKQpwcmludC50YWJsZShzdCwgdGl0bGUsIDAsIAogICAgICAgICAgICAiTW9kZWxzIFJlc3VsdHM6IGJ5V2VsbHMgJiBieUZpZWxkIAogICAgICAgICAgICBQcm9kdWN0aW9uOiBBY2N1bXVsYXRlZCBnYXMgcHJvZHVjdGlvbgogICAgICAgICAgICBGb3JlY2FzdCBQcm9kdWN0aW9uOiBGb3JlY2FzdCBhY2N1bXVsYXRlZCBnYXMgcHJvZHVjdGlvbiAKICAgICAgICAgICAgUHJvdmVkIERldmVsb3BlZCBSZXNlcnZlcwogICAgICAgICAgICBQcm9kdWN0aW9uIGRhdGEgc291cmNlOiBDTkgKICAgICAgICAgICAgVG9kYXMgbGFzIHVuaWRhZGVzIGVzdMOhbiBleHByZXNhZGFzIGVuIG1pbGVzIGRlIG1pbGxvbmVzIGRlIHBpZXMgY8O6Ymljb3MgKE1NTXBjKSIpIApgYGAKCiMjICoqUHJvbm9zdGljbyBkZSByZXNlcnZhcyBwb3IgcG96b3MgKFByb2R1Y2luZyAmIE5vbi1wcm9kdWNpbmcpKiogIAoKYGBge3J9CnRpdGxlIDwtIHBhc3RlKFRpdGxlLCAiUHJvdmVkIFJlc2VydmVzIiwgIkAiLCBmZG1lKQpwcmludC50YWJsZSh3ZWxsX3N0YXR1c19zdW0sIAogICAgICAgICAgICB0aXRsZSwgMCwgCiAgICAgICAgICAgICJQcm9kdWNpbmc6IFByb3ZlZCBEZXZlbG9wZWQgcHJvZHVjaW5nIHJlc2VydmVzIAogICAgICAgICAgICBOb24tcHJvZHVjaW5nOiBQcm92ZWQgRGV2ZWxvcGVkIG5vbi1wcm9kdWNpbmcgcmVzZXJ2ZXMgCiAgICAgICAgICAgIFdlbGxzOiBudW1iZXIgb2Ygd2VsbHMKICAgICAgICAgICAgUHJvZHVjdGlvbjogQWNjdW11bGF0ZWQgZ2FzIHByb2R1Y3Rpb24KICAgICAgICAgICAgRm9yZWNhc3QgUHJvZHVjdGlvbjogQWNjdW11bGF0ZWQgZm9yZWNhc3QgZ2FzIHByb2R1Y3Rpb24KICAgICAgICAgICAgUmVzZXJ2ZXM6IFByb3ZlZCBSZXNlcnZlcwogICAgICAgICAgICBUb2RhcyBsYXMgdW5pZGFkZXMgZXN0w6FuIGV4cHJlc2FkYXMgZW4gbWlsZXMgZGUgbWlsbG9uZXMgZGUgcGllcyBjw7piaWNvcyAoTU1NcGMpIikKYGBgCgojIENvbmNsdXNpb25lcyBwcmVsaW1pbmFyZXMgY2FtcG8gQ3VpdGxhaHVhYyAgCgpDb25jdXJzbzogQ29udHJhdG8gU2VydmljaW9zIEludGVncmFsZXMgZGUgRXhwbG9yYWNpw7NuIHkgRXh0cmFjY2nDs24gKENTSUVFKQoKLSBMYXMgcmVzZXJ2YXMgb2ZpY2lhbGVzIGRlbCBjYW1wbyBzb246ICoqMVAgKDEyMSkqKiwgKioyUCAoMTkzKSoqIHkgKiozUCAoMjI1KSoqICAgCgotIEVsIHBsYW4gZGUgZGVzYXJyb2xsbyBkZSBSZWZlcmVuY2lhIGNvbnRlbXBsYSBwcm9kdWNpciAqKjIxOCoqLCBjYXNpIGxhIHRvdGFsaWRhZCBkZSBsYXMgcmVzZXJ2YXMgKiozUCAoMjI1KSoqICAKCi0gTGFzIHJlc2VydmFzICoqUHJvYmFkYXMgZGVzYXJyb2xsYWRhcyoqIGNhbGN1bGFkYXMgcG9yIGVsIG1vZGVsbyBzb246IGNhbXBvICoqKDIxOSkqKiB5IHBvem9zICoqKDI0NCkqKiB5IGVzdMOhbiBkZW50cm8gZGVsIHJhbmdvIGRlIGxhcyByZXNlcnZhcyBvZmljaWFsZXMgKiozUCAoMjI1KSoqICAgIAoKLSBMYXMgcmVzZXJ2YXMgY2FsY3VsYWRhcyBwb3IgZWwgbW9kZWxvICoqUmVzZXJ2YXMgRGVzYXJyb2xsYWRhcyBQcm9kdWNpZW5kbyoqIHNvbiBzaW1pbGFyZXMgYSBsYXMgcmVzZXJ2YXMgb2ZpY2lhbGVzIGRlbCBjYW1wbyAxUDogKiooMTIxKSoqICAKCi0gTGFzICoqUmVzZXJ2YXMgRGVzYXJyb2xsYWRhcyBObyBQcm9kdWNpZW5kbyoqIGNhbGN1bGFkYXMgcG9yIGVsIG1vZGVsbyAqKigxMjQpKiogY29ycmVzcG9uZGVuIGEgcmVzZXJ2YXMgdGVtcG9yYWxtZW50ZSBjZXJyYWRhcyB5L28gYXNvY2lhZGEgYSBwb3pvcyBjb24gZGlmZXJlbnRlcyBlc3RhZG9zIChjZXJyYWRvIGNvbiBwb3NpYmlsaWRhZGVzLCBwcm9ncmFtYWRvIHBhcmEgdGFwb25hbWllbnRvIHkvbyB0YXBvbmFkbykKCiMgQW5leG9zICAKCiMjIERlZmluaWNpb25lcyAgCgpUb2RhcyBsYXMgZGVmaW5pY2lvbmVzIGluY2x1aWRhcyBhIGNvbnRpbnVhY2nDs24gZnVlcm9uIHRvbWFkYXMgZGVsIGRvY3VtZW50byBjdXlhcyByZWZlcmVuY2lhcyBzZSBpbmRpY2FuIGEgY29udGludWFjacOzbjoKCmh0dHBzOi8vd3d3LnNwZS5vcmcvbWVkaWEvZmlsZXJfcHVibGljLzI0L2ZlLzI0ZmU3Y2YzLTdjMjMtNDg1ZC1hOTY2LWUzMjQzZjFkMjBjZS8yMDE4X3Npc3RlbWFfZGVfZ2VyZW5jaWFfZGVfbG9zX3JlY3Vyc29zX2RlX3BldHJvbGVvXy1fdHJhZHVjY2lvbl9lbl9lc3Bhbm9sXy1fdmYucGRmCgoqKlNpc3RlbWEgZGUgR2VyZW5jaWEgZGUgbG9zIFJlY3Vyc29zIGRlIFBldHLDs2xlbyoqICAgIAooUFJNUyBwb3Igc3VzIHNpZ2xhcyBlbiBpbmdsw6lzKSAgCihSZXZpc2FkbyBqdW5pbyAyMDE4KSAgCihUcmFkdWNpZG8gc2VwdGllbWJyZSAyMDE5KSAgClBhdHJvY2luYWRvIHBvcjogIApTb2NpZXR5IG9mIFBldHJvbGV1bSBFbmdpbmVlcnMgKFNQRSkgIApXb3JsZCBQZXRyb2xldW0gQ291bmNpbCAoV1BDKSAgCkFtZXJpY2FuIEFzc29jaWF0aW9uIG9mIFBldHJvbGV1bSBHZW9sb2dpc3RzIChBQVBHKSAgClNvY2lldHkgb2YgUGV0cm9sZXVtIEV2YWx1YXRpb24gRW5naW5lZXJzIChTUEVFKSAgClNvY2lldHkgb2YgRXhwbG9yYXRpb24gR2VvcGh5c2ljaXN0cyAoU0VHKSAgClNvY2lldHkgb2YgUGV0cm9waHlzaWNpc3RzIGFuZCBXZWxsIExvZyBBbmFseXN0cyAoU1BXTEEpICAKRXVyb3BlYW4gQXNzb2NpYXRpb24gb2YgR2Vvc2NpZW50aXN0cyAmIEVuZ2luZWVycyAoRUFHRSkgIAoKIyMjIFJlc2VydmFzIHByb2JhZGFzICAKCiJSZXNlcnZhcyBQcm9iYWRhcyBzb24gYXF1ZWxsYXMgY2FudGlkYWRlcyBkZSBwZXRyw7NsZW8sIHF1ZSBtZWRpYW50ZSBlbCBhbsOhbGlzaXMgZGUgZGF0b3MKZGUgZ2VvY2llbmNpYXMgeSBkZSBpbmdlbmllcsOtYSwgcHVlZGVuIHNlciBlc3RpbWFkYXMgY29uIGNlcnRlemEgcmF6b25hYmxlLCBwYXJhIHNlcgpjb21lcmNpYWxtZW50ZSByZWN1cGVyYWRhcyBkZSB5YWNpbWllbnRvcyBjb25vY2lkb3MgeSBiYWpvIGNvbmRpY2lvbmVzIHTDqWNuaWNhcyB5CmNvbWVyY2lhbGVzIGRlZmluaWRhcy4gU2kgc2UgdXNhbiBtw6l0b2RvcyBkZXRlcm1pbsOtc3RpY29zLCBlbCB0w6lybWlubyDigJxjZXJ0ZXphIHJhem9uYWJsZeKAnQpwcmV0ZW5kZSBleHByZXNhciB1biBhbHRvIGdyYWRvIGRlIGNvbmZpYW56YSBkZSBxdWUgbGFzIGNhbnRpZGFkZXMgc2Vyw6FuIHJlY3VwZXJhZGFzLiBTaSBzZQp1c2FuIG3DqXRvZG9zIHByb2JhYmlsw61zdGljb3MsIGRlYmVyw61hIGV4aXN0aXIgdW5hIHByb2JhYmlsaWRhZCBkZSBwb3IgbG8gbWVub3MgOTAlIGRlIHF1ZQpsYXMgY2FudGlkYWRlcyByZWFsbWVudGUgcmVjdXBlcmFkYXMgaWd1YWxhcsOhbiBvIGV4Y2VkZXLDoW4gbGFzIGVzdGltYWNpb25lcy4iICAKCiMjIyBSZXNlcnZhcyBQcm9iYWJsZXMgIAoKIlJlc2VydmFzIFByb2JhYmxlcyBzb24gYXF1ZWxsYXMgUmVzZXJ2YXMgYWRpY2lvbmFsZXMgZW4gbGFzIGN1YWxlcyBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zCmRlIGdlb2NpZW5jaWFzIHkgZGUgaW5nZW5pZXLDrWEgaW5kaWNhbiBxdWUgc29uIG1lbm9zIHByb2JhYmxlcyBkZSBzZXIgcmVjdXBlcmFkYXMgcXVlIGxhcwpSZXNlcnZhcyBQcm9iYWRhcywgcGVybyBtw6FzIHNlZ3VybyBkZSByZWN1cGVyYXJzZSBxdWUgbGFzIFJlc2VydmFzIFBvc2libGVzLiAgRXMKaWd1YWxtZW50ZSBwcm9iYWJsZSwgcXVlIGxhcyBjYW50aWRhZGVzIHJlbWFuZW50ZXMgcmVhbGVzIGEgcmVjdXBlcmFyIHNlcsOhbiBtYXlvcmVzIG8KbWVub3JlcyBxdWUgbGEgc3VtYSBkZSBsYXMgUmVzZXJ2YXMgUHJvYmFkYXMgbcOhcyBsYXMgUmVzZXJ2YXMgUHJvYmFibGVzIGVzdGltYWRhcyAoMlApLiAgCkVuIGVzdGUgY29udGV4dG8sIGN1YW5kbyBzZSB1dGlsaXphbiBtw6l0b2RvcyBwcm9iYWJpbMOtc3RpY29zLCBkZWJlcsOtYSBleGlzdGlyIHVuYSBwcm9iYWJpbGlkYWQKZGUgcG9yIGxvIG1lbm9zIDUwJSBkZSBxdWUgbGFzIGNhbnRpZGFkZXMgcmVhbGVzIHJlY3VwZXJhZGFzIGlndWFsYXLDoW4gbyBleGNlZGVyw6FuIGxhCmVzdGltYWNpw7NuIDJQLiIKCiMjIyBSZXNlcnZhcyAgCgoiUmVzZXJ2YXMgUG9zaWJsZXMgc29uIGFxdWVsbGFzIFJlc2VydmFzIGFkaWNpb25hbGVzIHF1ZSBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGRlCmdlb2NpZW5jaWFzIHkgZGUgaW5nZW5pZXLDrWEgaW5kaWNhbiBxdWUgc29uIG1lbm9zIHByb2JhYmxlcyBkZSBzZXIgcmVjdXBlcmFkYXMgcXVlIGxhcwpSZXNlcnZhcyBQcm9iYWJsZXMuIExhcyBjYW50aWRhZGVzIHRvdGFsZXMgZmluYWxtZW50ZSBhIHNlciByZWN1cGVyYWRhcyBkZWwgcHJveWVjdG8gdGllbmVuCnVuYSBiYWphIHByb2JhYmlsaWRhZCBkZSBzdXBlcmFyIGxhIHN1bWEgZGUgUmVzZXJ2YXMgUHJvYmFkYXMgbcOhcyBSZXNlcnZhcyBQcm9iYWJsZXMKbcOhcyBSZXNlcnZhcyBQb3NpYmxlcyAoM1ApLCBxdWUgZXMgZXF1aXZhbGVudGUgYWwgZXNjZW5hcmlvIGRlIGVzdGltYWNpw7NuIGFsdG8uIEN1YW5kbyBzZQp1dGlsaXphbiBsb3MgbcOpdG9kb3MgcHJvYmFiaWzDrXN0aWNvcywgZGViZXLDrWEgZXhpc3RpciB1bmEgcHJvYmFiaWxpZGFkIGRlIHBvciBsbyBtZW5vcyAxMCUgZGUKcXVlIGxhcyBjYW50aWRhZGVzIHJlYWxlcyByZWN1cGVyYWRhcyBpZ3VhbGFyw6FuIG8gc3VwZXJhcsOhbiBsYSBlc3RpbWFjacOzbiAzUC4gUmVzZXJ2YXMKUG9zaWJsZXMgcXVlIHNlIGVuY3VlbnRyZW4gbG9jYWxpemFkYXMgZnVlcmEgZGVsIMOhcmVhIDJQIChubyBwb3RlbmNpYWwgYWRpY2lvbmFsIGEgbGFzCmNhbnRpZGFkZXMgZGVsIGVzY2VuYXJpbyAyUCkgcHVlZGUgZXhpc3RpciBzb2xvIGN1YW5kbyBzZSBoYW4gY3VtcGxpZG8gbG9zIGNyaXRlcmlvcyBkZQptYWR1cmV6IGNvbWVyY2lhbCB5IHTDqWNuaWNhIChxdWUgaW5jb3Jwb3JhbiBlbCBwb3NpYmxlIGFsY2FuY2UgZGUgZGVzYXJyb2xsbykuIExhcyBSZXNlcnZhcwpQb3NpYmxlcyBpbmRlcGVuZGllbnRlcyBkZWJlbiBoYWNlciByZWZlcmVuY2lhIGEgdW4gcHJveWVjdG8gMlAgY29tZXJjaWFsIChwb3IgZWplbXBsbywgdW4KU2lzdGVtYSBkZSBHZXJlbmNpYSBkZSBsb3MgUmVjdXJzb3MgZGUgUGV0csOzbGVvLiBWZXJzacOzbiAxLjAxIDE0CmNvbnRyYXRvIGRlIGFycmVuZGFtaWVudG8gYWR5YWNlbnRlIGFsIHByb3llY3RvIGNvbWVyY2lhbCBxdWUgcHVlZGUgc2VyIHByb3BpZWRhZCBkZSB1bmEKZW50aWRhZCBzZXBhcmFkYSksIGRlIGxvIGNvbnRyYXJpbywgbm8gc2UgcGVybWl0ZW4gUmVzZXJ2YXMgUG9zaWJsZXMgaW5kZXBlbmRpZW50ZS4iCgojIyMgUmVjdXBlcmFjacOzbiBGaW5hbCBFc3RpbWFkYSAoRVVSKSAgCgoiUmVjdXBlcmFjacOzbiBGaW5hbCBFc3RpbWFkYSAoRVVSKSwgbm8gZXMgdW5hIGNsYXNlIG8gY2F0ZWdvcsOtYSBkZSByZWN1cnNvcywgc2lubyB1biB0w6lybWlubwpxdWUgcHVlZGUgc2VyIGFwbGljYWRvIGEgdW5hIGFjdW11bGFjacOzbiBvIGdydXBvIGRlIGFjdW11bGFjaW9uZXMgKGRlc2N1YmllcnRhcyBvIG5vCmRlc2N1YmllcnRhcykgcGFyYSBkZWZpbmlyIGFxdWVsbGFzIGNhbnRpZGFkZXMgZGUgcGV0csOzbGVvIGVzdGltYWRhcywgYSB1bmEgZmVjaGEgZGFkYSwgYSBzZXIKcG90ZW5jaWFsbWVudGUgcmVjdXBlcmFibGVzLCBtw6FzIGFxdWVsbGFzIGNhbnRpZGFkZXMgeWEgcHJvZHVjaWRhcyBkZSBsYSBhY3VtdWxhY2nDs24gbwpncnVwbyBkZSBhY3VtdWxhY2lvbmVzLiBQYXJhIG1heW9yIGNsYXJpZGFkLCBFVVIgKHBvciBzdXMgc2lnbGFzIGVuIGluZ2zDqXMpIGRlYmUgcmVmZXJpcnNlIGEKbGFzIGNvbmRpY2lvbmVzIHTDqWNuaWNhcyB5IGVjb27Ds21pY2FzIGFzb2NpYWRhcyBhIGxvcyByZWN1cnNvcywgcG9yIGVqZW1wbG8sIGVsIEVVUiBwcm9iYWRvCnNvbiBsYXMgUmVzZXJ2YXMgUHJvYmFkYXMgbcOhcyBsYSBwcm9kdWNjacOzbiBhY3VtdWxhZGEuIgoKIyMjIFJlc2VydmFzIERlc2Fycm9sbGFkYXMgIAoKIkxhcyBSZXNlcnZhcyBEZXNhcnJvbGxhZGFzIHNvbiBjYW50aWRhZGVzIHF1ZSBzZSBlc3BlcmFuIHNlYW4gcmVjdXBlcmFkYXMgZGUgcG96b3MgZQppbnN0YWxhY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHkgdHJhdGFtaWVudG8gZXhpc3RlbnRlcy4iCgogIDEuICJMYXMgKipSZXNlcnZhcyBEZXNhcnJvbGxhZGFzIFByb2R1Y2llbmRvKiogc2UgZXNwZXJhbiBzZWFuIHJlY3VwZXJhZGFzIGRlIGludGVydmFsb3MKICBjb21wbGV0YWRvcyBxdWUgZXN0w6FuIGFiaWVydG9zIHkgZW4gcHJvZHVjY2nDs24gYWwgbW9tZW50byBkZSBsYSBlc3RpbWFjacOzbi4iICAKICAKICAyLiAiTGFzICoqUmVzZXJ2YXMgRGVzYXJyb2xsYWRhcyBObyBQcm9kdWNpZW5kbyoqIGluY2x1eWVuIGxhcyBkZW5vbWluYWRhcyBSZXNlcnZhcwogIHRlbXBvcmFsbWVudGUgY2VycmFkYXMgeSBsYXMgUmVzZXJ2YXMgZW4gem9uYXMgbm8gcGVyZm9yYWRhcyBkZXRyw6FzIGRlIHR1YmVyw61hLCBjb24gY29zdG9zCiAgZGUgYWNjZXNvIG1lbm9yZXMuIiAgCiAgCiMjIyBSZXNlcnZhcyBObyBEZXNhcnJvbGxhZGFzICAKCiJMYXMgUmVzZXJ2YXMgTm8gRGVzYXJyb2xsYWRhcyBzb24gY2FudGlkYWRlcyBxdWUgc2UgZXNwZXJhIHNlYW4gcmVjdXBlcmFkYXMgYSB0cmF2w6lzIGRlCmludmVyc2lvbmVzIGZ1dHVyYXMgc2lnbmlmaWNhdGl2YXMuIgoKIyMgVW5pZGFkZXMgdXNhZGFzICAgCgpQYXJhIGxvcyBlZmVjdG9zIGRlbCBwcmVzZW50ZSBkb2N1bWVudG8gc2UgdXRpbGl6YXJhbiBsYXMgc2lndWllbnRlIHVuaWRhZGVzOgoKLSBNOiBtaWwgICAKLSBNTTogbWlsbG9uZXMgICAKLSBNTU06IG1pbGVzIGRlIG1pbGxvbmVzICAKLSBwYzogcGllcyBjw7piaWNvcyAgCi0gcGNkOiBwaWVzIGPDumJpY29zIHBvciBkaWEgIAotIGJkOiBiYXJyaWxlcyBwb3IgZGlhICAKLSBiOiBiYXJyaWxlcyAgCgojIEVsYXBzZWQgdGltZSAgIAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZW5kX3RpbWUgPC0gU3lzLnRpbWUoKQplbGFwc2VkX3RpbWUgPC0gcm91bmQoZW5kX3RpbWUgLSBzdGFydF90aW1lLCAyKQpgYGAKCi0gKipFbGFwc2VkIHRpbWU6KiogIGByIGVsYXBzZWRfdGltZWAgc2VndW5kb3MK