¿REALMENTE SOMOS LA CIUDAD CAPITAL DEL TURISMO?



Universidad Distrital Francisco José De Caldas
Probabilidad y estadística
Proyecto: Parte II

Laura Daniela Urrego Díaz
Juan Esteban Perez Jimenez

Docente: Sindy Tatiana Cordoba Cordoba


Introducción


Colombia es reconocido como uno de los países que atrae a sus tierras infinidad de visitantes provenientes de todas partes del mundo debido a que se sienten atraídos por el encanto de la gente, las historias, la cautivadora belleza de los paisajes y las diversas actividades que permiten ser realizadas al ser un país tan diverso y multicultural.

La fascinación por conocer este país trae consigo muchos viajeros quienes curiosos de todo lo que Colombia tiene por ofrecer eligen a este como un principal destino turístico a conocer comenzando con la capital del país, la cual cuenta con una ubicación privilegiada en el centro del territorio colombiano en el altiplano cundiboyacense, ubicado en la cordillera oriental de los Andes conocida oficialmente como Bogotá Distrito Capital.

Bogotá tiene una longitud de 33 km de sur a norte y 16 km de oriente a occidente, está constituida por 20 localidades donde cada una tiene su propio alcalde menor y junta administrativa local encargados de la supervisión, ejecución y debido funcionamiento de los procesos internos de cada localidad; esta ciudad es el epicentro artístico, cultural, deportivo y turístico del país debido a que ofrece una gran variedad de gastronomía y arquitectura especializada con fines turísticos tales como museos, parques, teatros, casas culturales, centros comerciales y otros locaciones que acogen al viajero a vivir experiencias únicas dentro de la ciudad capital con una mezcla perfecta entre lo antiguo y lo moderno.

La finalidad de este proyecto es tomar como objeto de estudio un enfoque turístico de la ciudad de Bogotá y con ayuda de diferentes áreas del conocimiento como la estadística, la probabilidad y otras ciencias exactas realizar un análisis acerca de la inversión que se destina para estos intereses y la distribución por localidades de los recursos con ese fin, también se reconocerán otros factores que tienen relación tanto indirecta como directamente para así lograr visualizar como el turismo en la capital de la ciudad está presente en el desarrollo integral del país y brindando nuevas experiencias llamativas para los visitantes como también nuevas oportunidades de empleo, mejora de infraestructura y mejoramiento de la calidad de vida para los ciudadanos.



Problema Objetivo



El problema objetivo tratado a lo largo del desarrollo del proyecto es:


¿La inversión monetaria destinada al turismo en la ciudad de Bogotá se ve reflejada en la realidad para el gozo de los ciudadanos y visitantes?


Se realizará el estudio de los recursos que son destinados para la mejora y construcción de diferentes locaciones que promueven el turismo en la ciudad de Bogotá tales como casas de cultura, teatros, ciclo infraestructura, malla vial, espacios públicos y parques de la ciudad de Bogotá en las diferentes localidades, también se tendrá en cuenta el tipo de intervención que se esté realizando y el estado de esta para así poder visualizar cuantitativamente la cantidad de obras que realmente se han realizado y están disponibles para su uso colectivo como también la cantidad de obras están en su fase inicial, con incumplimientos o en suspensión.



Antecedentes Problemática



¿Qué se ha realizado hasta el momento?

El centro de gobierno local de Bogotá tiene a disposición de los ciudadanos información referente a los diferentes contratos existentes y obras ya que esta entidad es la encargada de llevar los seguimientos a la inversión de las diferentes infraestructuras y acciones de los espacios públicos de cada localidad, en esta información se puede evidenciar el mapa, las estadísticas de la ciudad, el estado de los procesos contractuales y el resumen de infraestructura local.

Lamentablemente este tipo de procesos la mayoría de veces no se ejecutan de la manera más eficaz y rápida posible de modo que, aunque la información se encuentra y se conocen las futuras intervenciones aun así en la mayoría de casos se evidencia una nula o lenta ejecución de estas.


La posible solución que se plantea es:

Realizar un análisis de la información que brida el centro de gobierno local de Bogotá para así poder identificar la inversión monetaria turística por localidad, adicionalmente identificar la jerarquización de los recursos entre las localidades y los avances que allí presentan para las infraestructuras que aportan al desarrollo turístico de la cuidad para luego poder comparar con visitas de campo si realmente se evidencia la respectiva intervención en la locación tal como lo presenta la información.

Gracias a este estudio se tendría la posibilidad de conocer en la actualidad las intervenciones que se están ejecutando y poder exigir la agilidad de los procesos a entidades como la secretaria de gobierno y la junta administrativa por localidad para que así tanto los ciudadanos como los visitantes de otros lugares puedan seguir disfrutando los espacios turísticos que se encuentran y que se planean construir en un futuro en la ciudad de Bogotá.



¿Cómo contribuye la estadística inferencial en la solución de esta problemática?

La estadística inferencial tiene un papel importante en cuanto al apoyo de la solución de esta problemática debido a que su aplicación nos permite estudiar diferentes factores que se relacionan tanto directa como indirectamente con el turismo y nos ayuda a comprenderlos para así realizar una toma de decisiones de una manera más fácil, basándonos así en los datos que nos muestran nuestras fuentes de información.

Otro aporte que nos brinda la estadística inferencial es el apoyo en la realización de deducciones para conocer el siguiente paso a seguir y dar la continuidad del estudio, implementando la solución a esta problemática basándonos en gran parte en la información numérica adquirida teniendo una base solida para la argumentación a la atención de la problemática.



Objetivos


Objetivo General


Analizar la eficiencia, cumplimiento e inversión de las construcciones como también de los espacios públicos que están destinados al ocio y gozo tanto de los habitantes de la ciudad de Bogotá como los visitantes de otras locaciones.


Objetivos Especificos


  • Compilar toda la información necesaria con el fin de conocer los factores de la problemática en su totalidad y realizar la interpretación de estos mismos.


  • Realizar un análisis especifico de la base de datos para conocer la inversión monetaria y ejecución de las obras referentes al turismo en la ciudad capital del país.


  • Comparar la información brindada por el análisis del estudio con trabajo en campo que rectifique la veracidad de la información por medio de evidencias.


  • Aprender a utilizar la estadística inferencial y sus aplicaciones como herramienta de trabajo en un ámbito real de la ingeniería civil.



Marco Teórico


  • Turismo: Término que define actividades que realizan las personas durante sus viajes y permanencias en lugares distintos a su entorno habitual durante un período de tiempo con fines de ocio, negocios u otros.


  • Ingeniería civil: Disciplina que emplea conocimientos de cálculo, mecánica, hidráulica y física para encargarse del diseño, construcción y mantenimiento de las infraestructuras reallizadas en el entorno.


  • Infraestructura: Realización humana diseñada y dirigida por profesionales de Ingeniería, Urbanismo, etc., que sirven de soporte para el desarrollo de otras actividades y su funcionamiento.


  • Estadística: Ciencia de dar sentido a los datos, proporcionando la teoría y los métodos para extraer información de estos y poder resolver problemas del mundo real.


  • Probabilidad:Valor numérico que nos sirve para determinar qué tan posible es que ocurra un evento determinado.


  • Localidad: División territorial o administrativa genérica para cualquier núcleo de población, con identidad propia. Puede ser tanto un núcleo de gran tamaño y con muchos habitantes o núcleo pequeño tamaño y pocos habitantes.


  • Contrato: Negocio jurídico bilateral en el cual dos o más partes expresan su consentimiento en la forma permitida por la ley, para crear, regular, modificar o extinguir obligaciones.


  • Invensión:Acto de asignar recursos para la compra o creación de activos o de capital.


  • Zona: Superficie de terreno determinada por consideraciones administrativas o estructurales.



Recopilación Datos


La recopilación de datos se llevó a cabo por medio de fuentes abiertas, la base de datos seleccionada con la cual se realizó el respectivo análisis de la información para estudiar la problemática de turismo en la ciudad de Bogotá anteriormente planteada fue obtenida de la página web correspondiente al gobierno local de Bogotá, esta información junto con la adición de otros datos obtenidos son la base del estudio en su totalidad.



Centro de Gobierno Local de Bogotá




Figura 1:Captura pantalla página web Centro gobierno local-Bogotá



# Librerias
library(readxl)
library(dplyr)
library(ggplot2)
library(univariateML)
library(nortest)
library(fitdistrplus)
library(MASS)
library(kableExtra)
library(leaflet)

Organización Datos


Los datos utilizados para el estudio están contenidos y organizados en formato de Excel (XLSX), estos se podrán observar en el siguiente enlace.

Base de datos Matriz Bogotá Turismo


Resumen base de datos

Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
USAQUÉN 286 Obra 215000000 Liquidado NA Sede 215000000 Mantenimiento Urbano Terminado
CHAPINERO 289 Obra 1141246181 Terminado 310200000 Parque 1141246181 Construcción Urbano Terminado
SANTA FE 273 Consultoría 140175457 Terminado 56113573 Acueductos 140175457 Estudios y Diseños Rural Terminado
SAN CRISTÓBAL 507 Obra 3263380489 Terminado 435269199 Malla Vial 2240424925 Construcción Urbano Terminado
USME 387 Obra 991276364 Terminado 89594303 Parque 991276364 Mantenimiento y dotación Urbano Terminado
TUNJUELITO 222 Obra 972278940 En ejecución 85819981 Parque 972278940 Construcción Urbano En ejecución
FONTIBÓN 313 Obra 1489318000 Terminado 166905670 Malla Vial 1407278914 Conservación Urbano Terminado
SUBA 541 Obra 7367292388 Terminado 537295500 Malla Vial 6427773659 Construcción Urbano Terminado
ENGATIVÁ 297 Suministro 1137801000 Terminado NA Malla Vial 1062526560 Mantenimiento Urbano Terminado
CIUDAD BOLÍVAR 572 Suministro 2032959607 Terminado NA Malla Vial 1355306607 Mantenimiento Rural Terminado
RAFAEL URIBE URIBE 315 Obra 1107812430 Terminado 130421589 Parque 1107812430 Construcción Urbano Terminado
BOSA 508 Obra 2121564275 Terminado 302637000 Malla Vial 2121564275 Construcción Urbano Terminado
PUENTE ARANDA 310 Obra 1518476451 Terminado 243346551 Espacio Público 1518476451 Conservación Urbano Terminado
KENNEDY 534 Convenio 4469130012 Terminado NA Malla Vial 715564834 Conservación Urbano Terminado
LOS MÁRTIRES 196 Obra 842821700 Suspendido 74440300 Malla Vial 390986961 Mantenimiento Urbano En ejecución
CANDELARIA 201 Obra 343587245 En ejecución NA Espacio Público 229058163 Mantenimiento Urbano Terminado
TEUSAQUILLO 224 Obra 1229310415 Terminado 149857192 Malla Vial 0 Conservación Urbano Terminado
BARRIOS UNIDOS 212 Obra 1168808480 Terminado 158741136 Sede 0 Mantenimiento Urbano Terminado
ANTONIO NARIÑO 212 Obra 1218523298 Terminado 183540840 Malla Vial 766220620 Conservación Urbano Terminado
SUMAPAZ 169 Suministro 3654576577 Terminado NA Malla Vial 871360083 Conservación Rural Terminado

Tabla 1:Resumen base de datos extraida del centro de gobierno local


En el siguiente mapa podemos observar la división de bogotá en sus respectivas localidades las cuales son el objeto de estudio del presente trabajo en el sector de turismo.

Recomendación : Descargar el documento para poder visualizar el mapa


leaflet() %>%
  addTiles() %>%
  setView(lng = -74.08175, lat = 4.60971, zoom = 12) %>%
  addMiniMap(width = 150, height = 150)



Identificación Variables



Para realizar el estudio se hizo uso de las siguientes variables dentro de la base de datos



##  [1] "Localidad"                          "Número Contrato"                   
##  [3] "Tipo de Contrato"                   "Valor Final Contrato"              
##  [5] "EGC"                                "Valor Final Contrato Interventoría"
##  [7] "Categoría Inversión"                "Valor Inversión Por Categoría"     
##  [9] "Tipo Intervención"                  "Zona"                              
## [11] "Estado Intervención"



A continuación se muestra el diccionario de datos de las variables para la compresión de las tablas de datos.



CAMPO TIPO DE DATO DESCRIPCIÓN
Localidad Carácter Localidad donde se encuentra la intervención
No. de contrato Numérico Número de contrato de la intervención
Tipo de Contrato Carácter Especificación general del tipo de intervención
Valor Final Contrato Numérico Valor monetario del contrato total de la intervención
Estado General Contrato Carácter Estado de avance del contrato de la intervención
Valor Final Contrato Interventoría Numérico Valor monetario del contrato de la interventoria
Categoría Inversión Carácter Tipo de construcción turistica
Valor Inversión Por Categoría Numérico Valor monetario total destinado a cada construcción turistica
Tipo Intervención Carácter Especificación detallada del tipo de intervención
Zona Carácter Especificación de especio rural o urbano
Estado Intervención Carácter Estado de avance de la intervención

Tabla 2:Diccionario de variables



Limpieza Datos


datos<-read_excel("matrizestadistica.xlsx")
datos1<-subset(datos,datos$`Valor Final Contrato`!=0)
VTC<-sum(datos1$`Valor Final Contrato`, na.rm=TRUE)
datos2<-subset(datos,datos$`Valor Final Contrato Interventoría`!=0)
VTCI<-sum(datos1$`Valor Final Contrato Interventoría`, na.rm=TRUE)
datos_limpios <- na.omit(datos[, "EGC", drop = FALSE])

En el proceso de limpieza de datos aplicado a las variables principales, se considera esencial eliminar aquellos valores que sean iguales a cero o que estén marcados como N/A (no disponibles). Esta práctica garantiza que estos valores no interfieran en los cálculos siguientes, especialmente durante la suma de los valores. En el análisis exploratorio de datos, se seguirá evidenciando este enfoque de limpieza, asegurando que los resultados proporcionados continúen excluyendo estos valores nulos o cero. Este procedimiento contribuirá a mantener la integridad y relevancia de los resultados obtenidos en los demás análisis.


Tablas de contingencia


Localidad y Zona


datos$Variable1 <- as.factor(datos$Localidad)
datos$Variable2 <- as.factor(datos$`Zona`)

# Tabla de contingencia
tabla_contingencia <- table(datos$Localidad, datos$`Zona`)

Tabla_proporciones<- prop.table(tabla_contingencia)
Tabla_P<- addmargins(round(tabla_contingencia*100,3))
Form.basic<-c("striped","bordered","hover","condensed","responsive")
kable(Tabla_P,format = "html")%>%
  kable_styling(bootstrap_options = Form.basic,full_width = F,font_size = 10)
Rural Urbano Sum
ANTONIO NARIÑO 0 6600 6600
BARRIOS UNIDOS 0 12600 12600
BOSA 0 26000 26000
CANDELARIA 0 1400 1400
CHAPINERO 300 1300 1600
CIUDAD BOLÍVAR 8500 25700 34200
ENGATIVÁ 0 89700 89700
FONTIBÓN 0 9100 9100
KENNEDY 0 40800 40800
LOS MÁRTIRES 0 6400 6400
PUENTE ARANDA 0 9400 9400
RAFAEL URIBE URIBE 0 18200 18200
SAN CRISTÓBAL 0 17200 17200
SANTA FE 6900 4900 11800
SUBA 200 54700 54900
SUMAPAZ 10300 0 10300
TEUSAQUILLO 0 4800 4800
TUNJUELITO 0 2900 2900
USAQUÉN 0 14900 14900
USME 10200 28700 38900
Sum 36400 375300 411700


Estado Genaral del Contrato y Estado de intervención


datos$Variable1 <- as.factor(datos$'EGC')
datos$Variable2 <- as.factor(datos$ 'Estado Intervención')

# Tabla de contingencia
tabla_contingencia <- table(datos$'EGC', datos$'Estado Intervención')

Tabla_proporciones<- prop.table(tabla_contingencia)
Tabla_P<- addmargins(round(tabla_contingencia*100,3))
Form.basic<-c("striped","bordered","hover","condensed","responsive")
kable(Tabla_P,format = "html")%>%
  kable_styling(bootstrap_options = Form.basic,full_width = F,font_size = 10)
En ejecución Incumplimiento Por iniciar Suspendido Terminado Sum
En ejecución 3600 0 2500 100 1200 7400
Incumplimiento 0 100 0 0 100 200
Liquidado 0 0 0 0 1600 1600
Por iniciar 100 0 400 0 0 500
Suspendido 700 0 200 800 100 1800
Terminado 0 0 0 0 9400 9400
Sum 4400 100 3100 900 12400 20900


Categoría de Inversión y tipo de contrato


datos$Variable1 <- as.factor(datos$'Categoría Inversión')
datos$Variable2 <- as.factor(datos$'Tipo de Contrato')

# Tabla de contingencia
tabla_contingencia <- table(datos$'Categoría Inversión', datos$'Tipo de Contrato')

Tabla_proporciones<- prop.table(tabla_contingencia)
Tabla_P<- addmargins(round(tabla_contingencia*100,3))
Form.basic<-c("striped","bordered","hover","condensed","responsive")
kable(Tabla_P,format = "html")%>%
  kable_styling(bootstrap_options = Form.basic,full_width = F,font_size = 10)
Compra de Maquinaria Consultoría Convenio Mantenimiento de Maquinaria Obra Suministro Sum
Acueductos 0 600 0 0 1000 0 1600
Bahía 0 0 500 0 500 100 1100
Casa de Cultura 0 100 0 0 900 0 1000
Cicloinfraestructura 0 14800 1300 0 10900 100 27100
Edificaciones 0 0 100 0 300 0 400
Espacio Público 0 26600 5800 0 47700 2000 82100
Malla Vial 0 36700 6100 0 110700 65000 218500
Obra de Bioingeniería 0 0 0 0 800 0 800
Obra de Mitigación 0 0 0 0 900 0 900
Parque 0 0 200 0 29100 0 29300
Puente 0 1000 0 0 6900 0 7900
Salón Comunal 0 1500 2000 0 13600 200 17300
Sede 0 100 0 0 2900 200 3200
Teatro 0 0 0 0 100 0 100
Vallado 0 0 0 0 3600 0 3600
Vivienda Rural 0 0 0 0 15500 1300 16800
Sum 0 81400 16000 0 245400 68900 411700


Relación Variables


Pruebas de Chi cuadrado


Localidad y Zona


datos$Variable1 <- as.factor(datos$'Localidad')
datos$Variable2 <- as.factor(datos$'Zona')

# Test de chi-cuadrado
resultado_chi_cuadrado <- chisq.test(table(datos$'Localidad', datos$'Zona'))
print(resultado_chi_cuadrado)
## 
##  Pearson's Chi-squared test
## 
## data:  table(datos$Localidad, datos$Zona)
## X-squared = 1980.3, df = 19, p-value < 2.2e-16


INTERPRETACIÓN: Dado que el valor p es muy pequeño, rechazamos la hipótesis nula de independencia entre las variables “Localidad” y “Tipo de Contrato”. En otras palabras, hay evidencia significativa para sugerir que existe una asociación entre estas dos variables. El valor del estadístico de chi-cuadrado (1980.3) es alto, lo que indica que hay una gran diferencia entre las frecuencias observadas y las frecuencias esperadas bajo la hipótesis nula de independencia.


Estado General Contrato y Estado Inversión

datos$Variable1 <- as.factor(datos$'EGC')
datos$Variable2 <- as.factor(datos$'Estado Intervención')

# Test de chi-cuadrado
resultado_chi_cuadrado <- chisq.test(table(datos$'EGC', datos$'Estado Intervención'))
print(resultado_chi_cuadrado)
## 
##  Pearson's Chi-squared test
## 
## data:  table(datos$EGC, datos$"Estado Intervención")
## X-squared = 345.09, df = 20, p-value < 2.2e-16


INTERPRETACIÓN:Asociación Significativa: Dado que el valor p es muy pequeño, rechazamos la hipótesis nula de independencia entre las variables “EGC” y “Estado Intervención”. Esto sugiere que hay una asociación significativa entre estas dos variables. El valor del estadístico de chi-cuadrado (345.09) es alto, indicando que hay una gran diferencia entre las frecuencias observadas y las frecuencias esperadas bajo la hipótesis nula de independencia.


Categoría Inversión y Tipo Contrato


datos$Variable1 <- as.factor(datos$'Categoría Inversión')
datos$Variable2 <- as.factor(datos$'Tipo de Contrato')

# Test de chi-cuadrado
resultado_chi_cuadrado <- chisq.test(table(datos$'Categoría Inversión', datos$'Tipo Intervención'))
print(resultado_chi_cuadrado)
## 
##  Pearson's Chi-squared test
## 
## data:  table(datos$"Categoría Inversión", datos$"Tipo Intervención")
## X-squared = 8086.5, df = 165, p-value < 2.2e-16

INTERPRETACIÓN:Dado que el valor p es muy pequeño, rechazamos la hipótesis nula de independencia entre las variables “Categoría Inversión” y “Tipo Intervención”. Esto sugiere que hay una asociación significativa entre estas dos variables.El valor del estadístico de chi-cuadrado (8086.5) es alto, indicando que hay una gran diferencia entre las frecuencias observadas y las frecuencias esperadas bajo la hipótesis nula de independencia

Coeficiente de correlación de Pearson


matrizestadistica <- readxl::read_excel("matrizestadistica.xlsx")

cuanti <- matrizestadistica[, c("Valor Final Contrato", "Valor Final Contrato Interventoría", "Valor Inversión Por Categoría", "Número Contrato")]

pairs(cuanti,col='red',pch = 18,labels = c("V.F.C.","V.F.C. Interventoría","V.I.Categoría","Número Contrato"),
      main = "Otras variables numéricas")

correlaciones <- cor(cuanti, use = "complete.obs")

print(correlaciones)
##                                    Valor Final Contrato
## Valor Final Contrato                        1.000000000
## Valor Final Contrato Interventoría          0.877241660
## Valor Inversión Por Categoría               0.964075126
## Número Contrato                            -0.001030257
##                                    Valor Final Contrato Interventoría
## Valor Final Contrato                                       0.87724166
## Valor Final Contrato Interventoría                         1.00000000
## Valor Inversión Por Categoría                              0.88888823
## Número Contrato                                            0.06360459
##                                    Valor Inversión Por Categoría
## Valor Final Contrato                                  0.96407513
## Valor Final Contrato Interventoría                    0.88888823
## Valor Inversión Por Categoría                         1.00000000
## Número Contrato                                      -0.01803976
##                                    Número Contrato
## Valor Final Contrato                  -0.001030257
## Valor Final Contrato Interventoría     0.063604592
## Valor Inversión Por Categoría         -0.018039761
## Número Contrato                        1.000000000


Valor Final Contrato con otras variables


  • Valor Final Contrato Interventoría: Hay una fuerte correlación positiva de aproximadamente 0.88 entre “Valor Final Contrato” y “Valor Final Contrato Interventoría”. Esto sugiere que cuando el valor de un contrato aumenta, el valor de la interventoría también tiende a aumentar de manera proporcional.


  • Valor Inversión Por Categoría: Hay una fuerte correlación positiva de aproximadamente 0.96 entre “Valor Final Contrato” y “Valor Inversión Por Categoría”. Esto indica una fuerte relación positiva entre el valor final del contrato y la inversión por categoría.


Valor Final Contrato Interventoría con otras variables


  • Valor Inversión Por Categoría: Hay una fuerte correlación positiva de aproximadamente 0.89 entre “Valor Final Contrato Interventoría” y “Valor Inversión Por Categoría”. Esto sugiere una relación positiva entre el valor de la interventoría y la inversión por categoría.


Valor Inversión Por Categoría con Número Contrato


  • Número Contrato: La correlación entre “Valor Inversión Por Categoría” y “Número Contrato” es cercana a cero (aproximadamente -0.02), lo que indica una correlación débil. Esto sugiere que no hay una relación lineal clara entre el valor de la inversión por categoría y el número de contrato.


Número Contrato con otras variables


  • Las correlaciones entre “Número Contrato” y las otras variables son muy bajas, cercanas a cero. Esto sugiere que no hay una relación lineal evidente entre el número de contrato y los otros valores.


En resumen, las correlaciones positivas indican que hay asociaciones lineales positivas fuertes o moderadas entre algunas de las variables. Las correlaciones cercanas a cero indican una débil o nula relación lineal.


La correlación positiva entre las variables indica que están relacionadas entre sí de alguna manera. Sin embargo, estas relaciones no deben interpretarse como una razón para eliminar variables, ya que cada una de ellas aporta información única al entendimiento de los contratos. Estas variables pueden estar conectadas, pero su inclusión en el análisis es fundamental para entender la diversidad de factores que influyen en el comportamiento de los contratos.

Al eliminar variables altamente correlacionadas, podríamos perder enfoques importantes y limitar nuestra capacidad para analizar los contratos desde diversas perspectivas. Cada variable, aunque pueda compartir cierta información con otras, aporta su propio contexto único, enriqueciendo así la comprensión general de los datos.


Datos atípicos


En el ámbito del análisis de datos en el centro de gobierno local de Bogotá, se da una atención especial a la presencia de datos atípicos, dado que los valores de los contratos tienen una variabilidad significativa. Estos valores atraviesan un proceso de tratamiento que implica la revisión detallada a cargo de analistas de datos. El propósito fundamental de este procedimiento es verificar la autenticidad de estos antes de ser integrados en el cuadro de control. Esta práctica asegura la integridad de la información presentada, permitiendo a los responsables de la toma de decisiones acceder a datos precisos y pertinentes para sus análisis.

Análisis Exploratorio Datos


Una vez realizada la limpieza de los datos para poder obtener específicamente solo la información que requeremos con fines del estudio, se lleva a la práctica el análisis de todos los datos.


Para el análisis se encuentran las medidas de tendencia central de la base de datos.


Variable “valor final contrato interventoria”


Media
mediaVFCI<-mean(datos2$`Valor Final Contrato Interventoría`);mediaVFCI
## [1] 354533475
Mediana
medianaVFCI<-median(datos2$`Valor Final Contrato Interventoría`);medianaVFCI
## [1] 165157066
Varianza
VarianzaVFCI<-var(datos2$`Valor Final Contrato Interventoría`);VarianzaVFCI
## [1] 2.958739e+17

Realizando el estudio del valor final de contrato de interventoria observamos que en promedio el valor de los contratos realizados es de $354.533.475 y el contrato que se encuentra en la posición central de toda la muestra tiene un valor de $165.157.066. En el contexto de la varianza, este resultado indica que hay una gran dispersión en los valores del conjunto de datos.


Valor total de contratos interventoria


VTCI<-sum(datos1$`Valor Final Contrato Interventoría`, na.rm=TRUE);VTCI
## [1] 50343753510

La suma de contratos total de interventoria en el año 2023 finalmente muestra que en total el estado invirtió $50.343.753.510 en el seguimiento técnico y vigilancia de los contratos de todas las obras de turismo con el objetivo de supervisar la finalización exitosa de estos mismos.


Variable “valor final contrato”

Media
## [1] 2578172416
Mediana
## [1] 840518181
Varianza
VarianzaVFC<-var(datos1$`Valor Final Contrato`);VarianzaVFC
## [1] 1.490514e+19

Por otro lado, se identifica que en promedio el valor de los contratos realizados que son destinados a la inversión del turismo en la ciudad de Bogotá es de $2.578.172.416 y el contrato que se encuentra en la posición central de toda la muestra ordenada y tiene un valor de $840.518.181. De igual manera que el caso anterior respecto a la varianza, este resultado indica que hay una gran dispersión en los valores del conjunto de datos.

Valor total de contratos generales

## [1] 554307069433


La suma de contratos en el año 2023 finalmente muestra que en total el estado invirtió $554.307.069.433 en el sector de turismo y estos se dividieron en diferentes tipos de intervenciones, dentro de las cuales destacan las siguientes categorias con sus respectivos valores:


Intervención 1: Mantenimiento


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
USAQUÉN 286 Obra 215000000 Liquidado NA Sede 215000000 Mantenimiento Urbano Terminado
USAQUÉN 308 Obra 301880000 Liquidado 54275235 Cicloinfraestructura 301880000 Mantenimiento Urbano Terminado
USAQUÉN 419 Obra 170000000 Liquidado NA Sede 170000000 Mantenimiento Urbano Terminado
USAQUÉN 423 Obra 130000000 Liquidado NA Sede 130000000 Mantenimiento Urbano Terminado
SANTA FE 276 Obra 731671423 Terminado 87800568 Vivienda Rural 731671423 Mantenimiento Rural Terminado

Tabla 3:Intervenciones de mantenimiento ciudad de Bogotá


Intervención 2: Conservación


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
USAQUÉN 292 Obra 4050515384 Liquidado 484402370 Malla Vial 4050515384 Conservación Urbano Terminado
CHAPINERO 304 Obra 2240632023 Terminado 366250994 Malla Vial 2240632023 Conservación Rural Terminado
USME 428 Obra 621521100 Terminado 69057900 Acueductos 621521100 Conservación Rural Terminado
USME 431 Obra 570734289 En ejecución 77827403 Obra de Bioingeniería 570734289 Conservación Urbano En ejecución
TUNJUELITO 236 Obra 793799960 Terminado 81627509 Espacio Público 793799960 Conservación Urbano Terminado

Tabla 4:Intervenciones de conservación ciudad de Bogotá


Intervención 3: Construcción


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
CHAPINERO 289 Obra 1141246181 Terminado 310200000 Parque 1141246181 Construcción Urbano Terminado
SAN CRISTÓBAL 507 Obra 3263380489 Terminado 435269199 Malla Vial 2240424925 Construcción Urbano Terminado
SAN CRISTÓBAL 508 Obra 300250243 Terminado 52385514 Obra de Mitigación 300250243 Construcción Urbano Terminado
TUNJUELITO 222 Obra 972278940 En ejecución 85819981 Parque 972278940 Construcción Urbano En ejecución
TUNJUELITO 230 Obra 621338396 Terminado 69093780 Salón Comunal 621338396 Construcción Urbano Terminado

Tabla 5:Intervenciones de construcción ciudad de Bogotá


Intervención 4: Adecuación


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
USME 413 Suministro 1260000000 Terminado NA Malla Vial NA Adecuación Rural Terminado
USAQUÉN 561 Obra 683263741 Terminado 115659514 Obra de Mitigación 683263741 Adecuación Urbano Terminado
KENNEDY 817 Obra 495000000 Terminado NA Casa de Cultura NA Adecuación Urbano Terminado

Tabla 6:Intervenciones de adecuación ciudad de Bogotá


Intervención 5: Estudios y diseños


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
SANTA FE 273 Consultoría 140175457 Terminado 56113573 Acueductos 140175457 Estudios y Diseños Rural Terminado
USME 410 Consultoría 190241168 En ejecución NA Salón Comunal 190241168 Estudios y Diseños Urbano En ejecución
USME 436 Consultoría 1014381324 Suspendido 101432132 Cicloinfraestructura 101432132 Estudios y Diseños Urbano En ejecución
BOSA 514 Consultoría 312861777 En ejecución NA Salón Comunal 312861777 Estudios y Diseños Urbano En ejecución
KENNEDY 548 Consultoría 169976000 Suspendido 56428765 Salón Comunal 113570000 Estudios y Diseños Urbano En ejecución

Tabla 7:Intervenciones de estudios y diseños ciudad de Bogotá


Intervención 6: Limpieza de Vallados


## [1] 1079236046


Intervención 7: Rehabilitación


Localidad Número Contrato Tipo de Contrato Valor Final Contrato EGC Valor Final Contrato Interventoría Categoría Inversión Valor Inversión Por Categoría Tipo Intervención Zona Estado Intervención
USAQUÉN 536 Obra 610726566 En ejecución NA Puente 610726566 Rehabilitación Urbano Por iniciar
TEUSAQUILLO 232 Obra 3157146401 En ejecución 343048012 Malla Vial NA Rehabilitación Urbano Por iniciar
ANTONIO NARIÑO 260 Obra 4983460033 Por iniciar NA Malla Vial NA Rehabilitación Urbano Por iniciar

Tabla 8:Intervenciones de rehabilitación ciudad de Bogotá


Resumen de valores por categorías de inversión


CATEGORÍA DE INVERSIÓN VALOR
Mantenimiento $5.299.151.316
Conservación $12.818.645.335
Construcción $22.376.874.493
Adecuación $683.263.741
Estudios y diseños $9.583.255.998
Limpieza de Vallados $1.079.236.046
Rehabilitación $610.726.566

Tabla 9:Resumen valores de intervención ciudad de Bogotá


Representación Gráfica


Zona de intervención


barplot(table(datos$Zona),main = "Tipo de Zona Intervenida", xlab="Zona" , ylab="Conteo", col=c("blue","red"), ylim = c(0,4000) )

Interpretando el gráfico de barras correspondiente a la variable “zona”, se puede identificar que en el área de estudio de la ciudad de Bogotá, el tipo de zona que tiene mayor intervención intervenida es de tipo urbano.

Intervención localidad en Bogotá


colores1 <- c("#00F5FF", "#5CACEE", "#C6E2FF", "#27408B")

Localidad<-subset(datos,select=Localidad)
pie(table(Localidad),main = "Intervenciones por Localidad", r=1.08, cex=0.5, col = colores1)


En el diagrama de pastel de intervención por localidad podemos identificar que la más intervenida es Engativá, seguido de Kennedy, Suba y Ciudad Bolívar, mientras que las localidades menos intervenidas son Candelaria, Chapinero y Tunjuelito, lo cual nos ayuda a inferir que aunque en estas localidades hay varias zonas turísticas aun así no se evidencian intervenciones para la mejora y expansión de lugares, en especial Candelaria, donde se debería estar invirtiendo en mayor cantidad ya que como se sabe es la localidad donde tanto visitantes como locales eligen más para el gozo de diferentes actividades y tiempos de ocio debido a la cultura que allí presenta la ciudad.

Otra conclusión inferida a partir del grafico es el balance de turismo, es beneficioso ya que existen algunos puntos clave donde se disfruta del turismo y se concentra la mayor parte de espacios; al distribuir como comenzar a construir en otras localidades las personas tendrán varias opciones para poder realizar turismo en Bogotá y los habitantes locales no tomarán viajes tan extensos atravesando la ciudad para poder disfrutar del turismo de la capital del país.

Estado general de los contratos


barplot(table(datos$EGC), main = "Estado Genaral de Contrato", xlab = "Estado del Contrato", ylab = "Conteo", col = c("green", "purple"), las = 2, cex.names = 0.55, ylim = c(0, 100))

Este grafico de barras nos muestra que el mayor porcentaje de los estados de los contratos están Finalizados o en ejecución y en un porcentaje reducido están incumplidos, suspendidos o por iniciar.

Estado general de intervención


colores2 <- c("#FFE7BA", "#FF7256", "#FF8247", "#EE8262","#FFA500")

Estado_intervencion<-subset(datos,select=`Estado Intervención`)
pie(table(Estado_intervencion),main = "Estado de Intervencion", r=1.08, col = colores2)

Distribución Discreta


Por medio de distribuciones discretas asociadas a las variables se realiza una representación de los datos correspondientes a la base de datos Matriz Bogotá Turismo con el fin de observar su comportamiento con ayuda de medidas descriptivas como la media, la varianza y la simetría a partir de experimentos realizar un análisis hacia las variables en las que está enfocado el proyecto.

Distribución Binomial


El estado general de un contrato se puede clasificar en 6 categorías las cuales son:

  • En ejecución
  • Incumplimiento
  • Liquidado
  • Por iniciar
  • Suspendido
  • Terminado

Para poder evidenciar el avance de las inversiones en turismo en la ciudad de Bogotá de manera real y garantizar que los ciudadanos puedan utilizar los espacios o se contemple la idea de que en un futuro cercano se puedan utilizar, el contrato debe estar en dos estados generales:

En ejecución: Debido a que se garantiza que actualmente se encuentran en construcción y la obra no está detenida.

Terminado: Debido a que si el contrato finalizo significa que la obra ya está culminada y el espacio actualmente se encuentra a disposición de todos los ciudadanos.


# Probabilidad contratos terminados
prob_ter <- sum(datos_limpios$EGC == "Terminado", na.rm = TRUE) / nrow(datos_limpios)

print(paste("Probabilidad de que los contratos esten es estado terminado es :",
            round(prob_ter, 2)))
## [1] "Probabilidad de que los contratos esten es estado terminado es : 0.45"


La probabilidad de seleccionar los contratos de las localidades que estén en estado terminado es del 45%.

# Probabilidad contratos terminados
prob_eje <- sum(datos_limpios$EGC == "En ejecución", na.rm = TRUE) / nrow(datos_limpios)

print(paste("Probabilidad de que los contratos esten es estado de ejecución es :",
            round(prob_eje, 2)))
## [1] "Probabilidad de que los contratos esten es estado de ejecución es : 0.35"


La probabilidad de seleccionar los contratos de las localidades que estén en estado de ejecución es del 35%.

# Estados
estados <- c("Liquidado", "Suspendido", "Por iniciar", "Incumplimiento")
probabilidades <- numeric(length(estados))

# Probabilidades para cada estado
for (i in seq_along(estados)) {
  prob_estado <- sum(datos_limpios$EGC == estados[i], na.rm = TRUE) / nrow(datos_limpios)
  probabilidades[i] <- prob_estado
}

# Sumar las probabilidades
prob_otros <- sum(probabilidades)

# Imprimir la suma de probabilidades con 2 decimales
print(paste("Suma de probabilidades:", sprintf("%.2f", prob_otros)))
## [1] "Suma de probabilidades: 0.20"


La probabilidad de seleccionar los contratos de las localidades que estén en otros estados es del 20%.

# Suma Probabilidades
prob_total <- prob_eje + prob_ter + prob_otros
print(paste("Probabilidad total:", round(prob_total, 2)))
## [1] "Probabilidad total: 1"

Se comprueba que la probabilidad total de todos los estados generales de los contratos en las 20 localidades es del 100%


Registro contratos de contrucciones turismo Bogotá



La variable de interés en este caso es el estado general de los contratos, ya que constituye la medida más representativa para evaluar si realmente se está invirtiendo dinero de manera efectiva en el sector turístico de Bogotá. Esta variable nos proporciona una visión integral del progreso y la finalización de los contratos, permitiéndonos identificar de manera clara y significativa la situación de las inversiones destinadas al desarrollo turístico en la ciudad.

Para este planteamiento se utilizan los contratos con estado general de terminado ya que nos garantizan que esas construcciones ya estan disponibles al uso del publico.

Si se sabe que la probabilidad de que un contrato este en estado general terminado es del 45% y se seleccionan una cantidad de 10 contratos al azar:

  • ¿cuál es la probabilidad de que 5 de esos contratos estén en estado terminado?

Se eligen 5 contratos, que representan la mitad del número total de ensayos propuestos, con el fin de obtener una muestra más manejable y significativa para analizar el estado de los contratos de manera más eficiente.


En este caso se emplea la distribución binomial debido a que es un experimento que admite dos posibles resultados donde 1 de ellos se considera como un éxito y el otro como un fracaso tal como se realiza en la distribución de Bernoulli pero se aplica de manera sucesiva teniendo en cuenta que cada contrato es independiente al anterior.

F.D.P.


Función De Distribución General

  • No.Ensayos = N
  • Probabilidad de éxito = P
  • Número de casos exitosos = X


X∼B(N,P)




Función De Distribución Especifica Del Experimento

  • No.Ensayos = 10
  • Probabilidad de éxito = 0.45
  • Número de casos exitosos = 5

X∼B(10,0.45)







prob_exito <- 0.45  # Probabilidad(contrato en estado terminado)
num_contratos <- 10  # Número total de contratos seleccionados al azar
num_exitos_deseados <- 5  # Número de contratos en estado terminado deseados

# Probabilidad
probabilidad <- dbinom(num_exitos_deseados, size = num_contratos, prob = prob_exito)

print(paste("La probabilidad de obtener", num_exitos_deseados, "contratos en estado terminado por cada 10 contratos seleccionados es:", round(probabilidad, 3)))
## [1] "La probabilidad de obtener 5 contratos en estado terminado por cada 10 contratos seleccionados es: 0.234"


La probabilidad de que, al seleccionar 10 contratos, todos estén en estado terminado es baja, específicamente del 23%. Este resultado refleja la realidad del proceso de ejecución de contratos en el ámbito de la construcción y restauración para actividades turísticas. La baja probabilidad indica que muchos contratos comienzan, pero no todos llegan a su estado final de terminado. Esto puede deberse a diversos factores, como demoras en la ejecución, cambios en los planes originales, problemas de financiamiento o cualquier otro obstáculo que pueda surgir durante el proceso de construcción. Esta estadística desfavorable sugiere que, a pesar de la existencia de numerosos contratos para proyectos turísticos, la transformación de estos contratos en obras terminadas implica una inversión considerable de tiempo y recursos. La complejidad y la duración del proceso pueden ser obstáculos importantes para la efectiva implementación de proyectos en el sector turístico.

Medidas Descriptivas


Media y varianza con distribución binomial del experimento correspondiente

# Parámetros
prob_exito <- 0.45
num_contratos <- 10

# Media y varianza
media <- num_contratos * prob_exito
varianza <- num_contratos * prob_exito * (1 - prob_exito)

print(paste("Media:", media))
## [1] "Media: 4.5"
print(paste("Varianza:", varianza))
## [1] "Varianza: 2.475"


Media(4.5):La media de una distribución binomial se calcula con la fórmula μ=n.p, representa el valor promedio de la distribución y, en este contexto, indica el número medio de contratos que se esperaría que estén en estado “terminado” al seleccionar 10 contratos al azar

La media sugiere que, en promedio, se esperaría que alrededor de 4.5 contratos estén en estado “terminado” en cada selección de 10 contratos. Dado que no se puede tener un número fraccional de contratos, esta cifra se interpreta como un valor esperado a largo plazo.

Varianza(2.475):La varianza de una distribución binomial se calcula con la fórmula σ^2=n⋅p⋅(1−p), mide la dispersión de la distribución. En este contexto, indica cuánto varía el número de contratos en estado “terminado” al seleccionar 10 contratos al azar.

La varianza indica que la distribución tiene cierta dispersión alrededor de la media. Cuanto mayor sea la varianza, mayor será la variabilidad en los resultados.


Gráficos F.D.P y F.D.A.


Gráfico que representa las distribución binomial de los contratos

# Números de contratos
num_contratos <- 0:10

# Parámetros
prob_exito <- 0.45
num_ensayos <- 10

# Probabilidades para cada número de contratos
probabilidades <- dbinom(num_contratos, size = num_ensayos, prob = prob_exito)

# Gráfico de barras
barplot(probabilidades, names.arg = num_contratos, col = "#FFB90F", 
        main = "Distribución Binomial Contratos Terminados", xlab = "Número de Contratos en Estado Terminado",
        ylab = "Probabilidad", ylim = c(0, 0.3), xlim = c(-0.5, 10.5), width = 0.7, border = "black", space = 0.2)

# Etiquetas de probabilidad
text(x = num_contratos, y = probabilidades, labels = paste(round(probabilidades, 3) * 100, "%"),
     pos = 3, col = "black", cex = 0.6)

# Media
abline(v = mean(num_contratos, prob = prob_exito * num_ensayos), col = "red", lty = 2)


INTERPRETACIÓN: El eje X representa el número de contratos en estado “terminado”, el eje Y representa la probabilidad de observar un cierto número de contratos en el mismo estado, en general se puede observar cómo varía la probabilidad a medida que cambia el número de contratos en estado “terminado”.


Gráfico que representa las distribución binomial acumulada de los contratos

# Números de contratos posibles
num_contratos <- 0:10

# Parámetros
prob_exito <- 0.45
num_ensayos <- 10

# Probabilidades acumuladas para cada número de contratos
prob_acumuladas <- pbinom(num_contratos, size = num_ensayos, prob = prob_exito)

# Gráfico de barras
barplot(prob_acumuladas, names.arg = num_contratos, col = "#FF7F24", 
        main = "Distribución Binomial Acumulada Contratos Terminados",
        xlab = "Número de Contratos en Estado Terminado", ylab = "Probabilidad Acumulada",
        ylim = c(0, 1.5), xlim = c(-0.5, 10.5), width = 0.7, border = "black", space = 0.2)

text(x = num_contratos, y = prob_acumuladas, labels = paste(round(prob_acumuladas, 3) * 100, "%"),
     pos = 3, col = "black", cex = 0.7, offset = 1)

# Media
abline(v = mean(num_contratos, prob = prob_exito * num_ensayos), col = "red", lty = 2)



INTERPRETACIÓN: El gráfico de distribución acumulada representa la probabilidad acumulada de que el número de contratos en estado “terminado” sea igual o menor que un valor específico. Cada barra en el gráfico indica la probabilidad acumulada hasta ese punto.La forma de la curva refleja cómo la probabilidad acumulada aumenta a medida que avanzamos a lo largo del eje X. En este caso, dado que la probabilidad de éxito (contratos en estado “terminado”) es relativamente alta (0.45), la curva sube más rápidamente.

Preguntas planteadas


1. Número esperado de contratos finalizados

  • ¿Cuál es el número esperado de contratos terminados en un mes si la probabilidad de éxito es del 45%?
# Probabilidad de éxito
prob_exito <- 0.45

# meses
num_ensayos <- 1

# Número esperado de contratos terminados en un mes
num_contratos_esperados <- num_ensayos * prob_exito

print(paste("El número esperado de contratos terminados en un mes es:", num_contratos_esperados))
## [1] "El número esperado de contratos terminados en un mes es: 0.45"
# Números de contratos
num_contratos <- 0:10

# Parámetros
prob_exito <- 0.45
num_ensayos <- 10

# Probabilidades para cada número de contratos
probabilidades <- dbinom(num_contratos, size = num_ensayos, prob = prob_exito)

# Gráfico de barras
barplot(probabilidades, names.arg = num_contratos, col = "#FFB90F", 
        main = "Contratos en un mes",
        xlab = "Número de Contratos en Estado Terminado",
        ylab = "Probabilidad", ylim = c(0, 0.3), xlim = c(-0.5, 10.5),
        width = 0.7, border = "black", space = 0.2)

# Etiquetas de probabilidad
text(x = num_contratos, y = probabilidades, labels = paste(round(probabilidades, 3) * 100, "%"),
     pos = 3, col = "black", cex = 0.6)
abline(v = 0.45, col = "blue", lty = 2)


  • ¿Cuál es el número esperado de contratos terminados semestralmente si la probabilidad de éxito es del 45%?
# Probabilidad de éxito
prob_exito <- 0.45

# meses en un semestre
meses <- 6

# Número esperado de contratos terminados semestralmente
num_contratos_esperados <- meses * prob_exito

print(paste("El número esperado de contratos terminados semestralmente es:", num_contratos_esperados))
## [1] "El número esperado de contratos terminados semestralmente es: 2.7"
# Números de contratos
num_contratos <- 0:10

# Parámetros
prob_exito <- 0.45
num_ensayos <- 10

# Probabilidades para cada número de contratos
probabilidades <- dbinom(num_contratos, size = num_ensayos, prob = prob_exito)

# Gráfico de barras
barplot(probabilidades, names.arg = num_contratos, col = "#FFB90F", 
        main = "Contratos en seis meses",
        xlab = "Número de Contratos en Estado Terminado",
        ylab = "Probabilidad", ylim = c(0, 0.3), xlim = c(-0.5, 10.5),
        width = 0.7, border = "black", space = 0.2)

# Etiquetas de probabilidad
text(x = num_contratos, y = probabilidades, labels = paste(round(probabilidades, 3) * 100, "%"),
     pos = 3, col = "black", cex = 0.6)
abline(v = 2.7, col = "purple", lty = 2)


2. Riesgo

  • ¿Cuál es la varianza del número de contratos terminados al seleccionar 20 contratos?
# Parámetros
n_contratos <- 20
prob_exito <- 0.45

# Varianza
varianza <- n_contratos * prob_exito * (1 - prob_exito)

print(paste("La varianza del número de contratos terminados es:", varianza))
## [1] "La varianza del número de contratos terminados es: 4.95"


3. Tamaños de muestra ideales

  • Si queremos asegurarnos de que al menos el 50% de los contratos estén terminados a tiempo y la probabilidad de éxito es del 45%, ¿cuál debería ser el tamaño mínimo de la muestra?
# Instalar y cargar la librería necesaria
# install.packages("readxl")
library(readxl)


prob_exito <- 0.45
cuantil_deseado <- 0.50

matriz_datos <- read_excel('matrizestadistica.xlsx')

# Calcular el tamaño mínimo de la muestra
tamaño_muestra <- qbinom(cuantil_deseado, size = nrow(matriz_datos), prob = prob_exito, lower.tail = FALSE)

print(paste("El tamaño mínimo de la muestra para asegurar el cuantil deseado de contratos terminados a tiempo es:", tamaño_muestra))
## [1] "El tamaño mínimo de la muestra para asegurar el cuantil deseado de contratos terminados a tiempo es: 1855"


5. Comparaciones

  • Si la probabilidad de éxito es de 45%, ¿cómo afecta esto a la probabilidad de que al menos 8 de 12 contratos estén terminados a tiempo?
# Parámetros
prob_exito_nuevo <- 0.45
num_contratos_nuevo <- 12
num_terminados_nuevo <- 8

# Probabilidad acumulativa
prob_acumulativa_nueva <- 1 - pbinom(num_terminados_nuevo - 1, size = num_contratos_nuevo, prob = prob_exito_nuevo)

print(paste("La probabilidad de que al menos 8 de 12 contratos estén terminados a tiempo con la probabilidad de éxito es:", round(prob_acumulativa_nueva, 3)))
## [1] "La probabilidad de que al menos 8 de 12 contratos estén terminados a tiempo con la probabilidad de éxito es: 0.112"
num_contratos <- 0:12
prob_exito <- 0.45
num_ensayos <- 12

# Probabilidades 
probabilidades <- dbinom(num_contratos, size = num_ensayos, prob = prob_exito)

# Probabilidad acumulativa
prob_acumulativa <- pbinom(7, size = num_ensayos, prob = prob_exito, lower.tail = FALSE)
par(mar = c(5, 5, 4, 2) + 0.1)  # Ajustar los márgenes

# Gráfico de barras
barplot(probabilidades, names.arg = num_contratos, col = "#FFB90F", 
        main = "Contratos terminados a tiempo",
        xlab = "Número de Contratos en Estado Terminado",
        ylab = "Probabilidad", ylim = c(0, 0.3), xlim = c(-0.5, 12.5),
        width = 0.7, border = "black", space = 0.2, las = 2)  # Rotar etiquetas del eje x

text(x = num_contratos, y = probabilidades, labels = paste(round(probabilidades, 3) * 100, "%"),
     pos = 3, col = "black", cex = 0.6)
abline(v = 7.5, col = "green", lty = 2)
text(x = 11, y = 0.28, labels = paste("Prob. Acumulativa (>=8):", round(prob_acumulativa, 3) * 100, "%"),
     col = "blue", pos = 3)



Análisis y conclusiones


Análisis:Se han explorado varias distribuciones de probabilidad, incluyendo la distribución uniforme, la distribución geométrica, la distribución binomial y la distribución de poisson seleccionando finalmente la binomial la cual representaba de una mejor manera el enfoque del proyecto que queriamos.

Esta elección se justifica por su capacidad para representar de manera efectiva la variabilidad en el número de contratos terminados y proporcionar información valiosa para comprender el avance de las construcciones en la ciudad de Bogotá respecto al turismo. Al utilizarla, se puede obtener una comprensión más profunda de la incertidumbre asociada con el estado de los contratos y, por ende, con el progreso general de las construcciones.


Conclusión:Este proyecto porporcionó una comprensión práctica de diversas distribuciones de probabilidad y cómo aplicarlas en el contexto de la gestión de contratos y proyectos de construcción en Bogotá. Las distribuciones de probabilidad son herramientas valiosas para modelar eventos inciertos y tomar decisiones informadas en la planificación y gestión de proyectos.

Al comprender y aplicar estas distribuciones, podemos hacer predicciones probabilísticas sobre eventos futuros, lo que es esencial para tomar decisiones estratégicas y asignar recursos de manera eficiente. La capacidad de modelar la incertidumbre y evaluar el riesgo asociado proporciona una base sólida para la toma de decisiones informada en el ámbito de la gestión de proyectos y contratos.



Distribución Continua



En el presente estudio, se lleva a cabo un análisis detallado de los datos extraídos de la base de datos “Matriz Bogotá Turismo”. El enfoque se centra en dos variables específicas: el “estado general del contrato” y su “valor final de contrato”. Estas variables se consideran cruciales para entender el comportamiento de los contratos en el contexto de la matriz.

Normalidad


Histograma

El objetivo principal es evaluar la normalidad de la distribución de estas variables y determinar si siguen ciertos patrones preestablecidos o difieren significativamente de una distribución normal.

En este contexto, se realizará un análisis exhaustivo de la relación entre las dos variables clave, “estado general del contrato” y “valor final del contrato”, con un enfoque específico en la evaluación de la normalidad. Para visualizar la distribución conjunta, se empleará un histograma que muestre la frecuencia de los distintos estados del contrato en relación con sus valores finales.

Este análisis visual no solo nos permitirá identificar patrones, tendencias o posibles relaciones entre el estado general del contrato y su valor final, sino que también nos proporcionará información valiosa sobre la normalidad de la distribución conjunta. La evaluación de la normalidad es crucial para comprender la naturaleza de las variables y puede influir en la elección de las pruebas estadísticas apropiadas para análisis posteriores.


datos1 <- subset(matrizestadistica, `Valor Final Contrato` != 0)

ggplot(datos1, aes(x = EGC, y = `Valor Final Contrato`, fill = EGC)) +
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal() +
  labs(title = "Histograma de Estado General del Contrato y su Valor Final",
       x = "Estado del Contrato",
       y = "Valor del Contrato") +
  theme(axis.text.x = element_text(size = 6))


La distribución de los datos revela que el conjunto de datos no sigue una distribución normal, y esta observación está vinculada a la categorización del “Estado del Contrato”. La frecuencia de las observaciones y la interacción entre las variables también influyen en la forma del histograma. En particular, se destaca que los contratos en ejecución son los que más impactan la normalidad de la gráfica, ya que representan la mayor cantidad de dinero en comparación con otros tipos de contratos.

En un sentido positivo, se observa que los contratos terminados también tienen una presencia significativa en la gráfica, indicando que esta categoría sigue a los contratos en ejecución en términos de la cantidad de dinero asociado. De esta manera, se puede concluir que los contratos terminados y en ejecución son los que más se destacan en la distribución, siendo los principales contribuyentes a la distribución de fondos representada en el histograma.


Diagrama de cajas y bigotes


#Diagrama
boxplot(datos1$`Valor Final Contrato`, main="Valor Final del Contrato",xlab = 'Valor', col = '#98F5FF')

El diagrama de bigotes nos permite identificar de manera clara la distribución de los datos, revelando patrones de simetría alrededor de la mediana y proporcionando información sobre la dispersión y la presencia de posibles valores atípicos.


Cuantiles


#Diagrama
qqnorm(datos1$`Valor Final Contrato`, main ='Cuantiles', col = '#8B4789')
qqline(datos1$`Valor Final Contrato`, col = '#FF3E96')

La observación muestra que si bien algunos puntos se alinean en cierta medida con la línea roja de referencia, no hay una concordancia completa. Esta falta de alineación perfecta sugiere que la desviación de la normalidad no es clara ni pronunciada. La presencia de puntos que se desvían de la línea indica cierta discrepancia en la distribución de los datos respecto a una distribución normal.


Pruebas de Normalidad


Pruebasnormalidad <- function(x) {
  shapiro <- shapiro.test(x)

  resultados <- data.frame(
    Prueba = c("Shapiro-Wilk"),
    Estadístico = c(shapiro$statistic),
    Valor_p = c( shapiro$p.value)
  )

  print(resultados)
}

Pruebasnormalidad(datos1$`Valor Final Contrato`)
##         Prueba Estadístico      Valor_p
## W Shapiro-Wilk   0.6437542 5.794366e-21


Shapiro-Wilk Test:

Estadístico: 0.6437542 Valor p: 5.794366e-21

El estadístico (0.64) y el valor p indican que los datos no siguen una distribución normal. La hipótesis nula de normalidad se rechaza.


Los resultados consistentemente indican que la variable Valor Final Contrato no sigue una distribución normal. Los valores extremadamente bajos de los estadísticos y los valores_p cercanos a cero proporcionan fuerte evidencia en contra de la hipótesis de normalidad.


Ajustes Bondad

# Columna a analizar 'Estado General del Contrato'
Valor_Contrato <-datos1$`Valor Final Contrato`

# Prueba de Kolmogorov-Smirnov
resultado_ks <- ks.test(Valor_Contrato, "pnorm", mean = mean(Valor_Contrato), sd = sd(Valor_Contrato))
## Warning in ks.test.default(Valor_Contrato, "pnorm", mean =
## mean(Valor_Contrato), : ties should not be present for the Kolmogorov-Smirnov
## test
print(resultado_ks)
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  Valor_Contrato
## D = 0.26439, p-value = 1.767e-13
## alternative hypothesis: two-sided
hist(Valor_Contrato, main='Histograma', xlab='Valor Contrato', ylab='Frecuencia', breaks = 3)


Se realiza un proceso de selección de modelos estadísticos aplicado a la variable ‘Valor Final Contrato’. Este análisis implica la evaluación de diversos modelos estadísticos con el objetivo de determinar cuál de ellos se adapta de manera óptima a los datos observados.



model_select(datos1$`Valor Final Contrato`)
## Maximum likelihood estimates for the Inverse Gaussian model 
##      mean      shape  
## 2.578e+09  6.239e+08


Este proceso de selección de modelos sugiere la utilización del modelo Inverse Gaussian para modelar la variable ‘Valor Final Contrato’. La elección de este modelo específico implica que, tras evaluar diferentes opciones, el modelo Inverse Gaussian ha demostrado ser el más adecuado para describir la estructura y la variabilidad de los datos observados. Sin embargo, es importante destacar que durante la implementación de este método, el programa solicitó ciertas especificaciones que no estaban dentro de nuestro conocimiento previo. Ante esta situación, optamos por explorar otro modelo llamado Weibull, el cual también demostró un ajuste significativo a la curva de nuestros datos, proporcionando una alternativa viable en el proceso de modelado estadístico.


min_aporte <- min(datos1$`Valor Final Contrato`)
max_aporte <- max(datos1$`Valor Final Contrato`)

# Ajustar una Distribución
Distribucion_Weibull <- fitdist(datos1$`Valor Final Contrato`, 'weibull')

summary(Distribucion_Weibull)
## Fitting of the distribution ' weibull ' by maximum likelihood 
## Parameters : 
##           estimate Std. Error
## shape 7.669122e-01         NA
## scale 2.239797e+09         NA
## Loglikelihood:  -4857.023   AIC:  9718.046   BIC:  9724.787 
## Correlation matrix:
## [1] NA
plot(Distribucion_Weibull)


Gráfico de cuantiles con modelo Weibull


# Distribución Weibull
Weibull <- fitdistrplus::fitdist(datos1$`Valor Final Contrato`, 'weibull')

# Gráfico de cuantiles con la distribución Weibull
fitdistrplus::qqcomp(list(Weibull), legendtext = "Weibull")

Medidas Descriptivas


# Distribución Weibull a los datos
ajuste_weibull <- fitdistrplus::fitdist(datos1$`Valor Final Contrato`, "weibull")

# parámetros
parametros_weibull <- ajuste_weibull$estimate

# Media y varianza
media_weibull <- parametros_weibull[2] * gamma(1 + 1/parametros_weibull[1])
varianza_weibull <- parametros_weibull[2]^2 * (gamma(1 + 2/parametros_weibull[1]) - (gamma(1 + 1/parametros_weibull[1]))^2)

cat("Media de la distribución Weibull:", media_weibull, "\n")
## Media de la distribución Weibull: 2619378888
cat("Varianza de la distribución Weibull:", varianza_weibull, "\n")
## Varianza de la distribución Weibull: 1.195341e+19


Media de la Distribución Weibull:

La media indica el nivel típico o esperado del “Valor Final Contrato” según la distribución Weibull. En el contexto de contratos, la media sugiere un punto central alrededor del cual se agrupan los valores de “Valor Final Contrato”. Es esencial tener en cuenta este valor para comprender la magnitud promedio de los contratos.

Varianza de la Distribución Weibull:

La varianza mide la dispersión de los valores de “Valor Final Contrato” alrededor de la media. La magnitud significativa de esta varianza indica una amplia variabilidad en los “Valores Finales de Contrato”. Los valores dispersos sugieren que hay una considerable diversidad en los montos finales de los contratos.

Análisis General:

La presencia de una varianza tan grande sugiere que hay contratos con valores finales que varían considerablemente en comparación con la media. Puede haber contratos con valores extremadamente altos que contribuyan significativamente a la variabilidad total.


Funciones y Gráficos


FUNCIONES Y GRÁFICOS DE F.D.P y F.D.A.


\[f(x)= \left\{ \begin{array}{lcc} (2.239797e+09)(7.669122e-01) x^{(7.669122e-01)-1}e^{-2.239797e+09 x^{7.669122e-01}} & & x>0 \\ 0 & & \text{En otro caso} \end{array} \right. \]

# Rango de valores
x <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Calcular la función de densidad de probabilidad (FDP) Weibull
fdp_weibull <- dweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
head(fdp_weibull, 10)
##  [1]          Inf 5.156204e-10 3.932803e-10 3.248439e-10 2.778269e-10
##  [6] 2.424530e-10 2.144326e-10 1.914879e-10 1.722591e-10 1.558660e-10
fdp_weibull[!is.finite(fdp_weibull)] <- 0

# Calcular la función de distribución acumulativa (FDA) Weibull
fda_weibull <- pweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
head(fda_weibull, 10)
##  [1] 0.0000000 0.1442343 0.2328268 0.3035167 0.3630110 0.4144368 0.4596276
##  [8] 0.4997947 0.5357988 0.5682837
# Gráfico de la FDP y FDA Weibull
plot(x, fdp_weibull, type = "l", col = "springgreen3", lwd = 2, main = "FDP y FDA Weibull", xlab = "Valor Final Contrato", ylab = "Densidad de Probabilidad", ylim = c(0, max(fdp_weibull, na.rm = TRUE)))
lines(x, fda_weibull, type = "l", col = "#CD4F39", lwd = 2)

legend("topright", legend = c("FDP", "FDA"), col = c("springgreen3", "#CD4F39"), lty = 1, lwd = 2)


Consideraciones:

  • La FDP Weibull muestra cómo se distribuyen los valores del “Valor Final Contrato” alrededor de la media estimada para la distribución Weibull.

  • La (FDA) Weibull indica la probabilidad acumulativa de que un contrato tenga un valor menor o igual a cierto monto.

  • La pendiente de la curva proporciona información sobre la tasa de acumulación de probabilidad


Interpretación:

La alta variabilidad, indicada por la varianza previamente calculada, se reflejará en la forma de la FDP y en la tasa de acumulación de probabilidad en la FDA.

Valores extremos o colas largas en la FDP pueden indicar la presencia de contratos con montos significativamente más altos o bajos que la media.


Preguntas planteadas


Probabilidades Específicas:

Dada la distribución Weibull ajustada,¿cuál es la probabilidad de que esté entre dos valores dados?

# Parámetros ajustados
parametros_weibull <- Distribucion_Weibull$estimate

valor_inferior <- 89594303 
valor_superior <- 484402370 
  

# Probabilidad acumulada C/U
prob_inferior <- pweibull(valor_inferior, shape = parametros_weibull[1], scale = parametros_weibull[2])
prob_superior <- pweibull(valor_superior, shape = parametros_weibull[1], scale = parametros_weibull[2])

# Probabilidad Final
prob_entre_valores <- prob_superior - prob_inferior


cat("Probabilidad de que el valor final de un contrato esté entre", valor_inferior, "y", valor_superior, "es:", prob_entre_valores, "\n")
## Probabilidad de que el valor final de un contrato esté entre 89594303 y 484402370 es: 0.1846245
# Parámetros ajustados de la distribución Weibull
parametros_weibull <- Distribucion_Weibull$estimate

# Función de densidad de probabilidad (FDP) de la distribución Weibull
fdp_weibull <- function(x) dweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
valores_contrato <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Densidad de probabilidad para cada valor
densidad_probabilidad <- fdp_weibull(valores_contrato)

# Gráfico de la función de densidad de probabilidad (FDP)
plot(valores_contrato, densidad_probabilidad, type = "l", lwd = 2, col = "blue",
     main = "probabilidad entre dos valores",
     xlab = "Valor Final del Contrato", ylab = "Densidad de Probabilidad")

# Límites
limite_inferior <- 89594303 
limite_superior <- 484402370 

# Líneas punteadas para los límites
abline(v = c(limite_inferior, limite_superior), col = c("red", "green"), lty = 2)

# Área sombreada entre los límites
x_area <- c(limite_inferior, valores_contrato[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], limite_superior)
y_area <- c(0, densidad_probabilidad[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], 0)
polygon(x_area, y_area, col = "lightgray", rgb(0.8, 0.8, 0.8, 0.5), border = NA)

# Leyenda
legend("topright", legend = c("FDP Weibull", "Límite Inferior", "Límite Superior"), 
       col = c("blue", "red", "green", rgb(0.8, 0.8, 0.8, 0.5)), lty = c(1, 2, 2, 0), cex = 0.8)

Comparación de Contratos:

Sea el experimiento de seleccionar dos contratos al azar y comparar sus Valores Finales de Contrato utilizando la función de distribución acumulativa. ¿Cuál tiene una probabilidad acumulativa más alta?

parametros_weibull <- ajuste_weibull$estimate

contrato_1 <- 166905670 
contrato_2 <- 76956615 

# Probabilidades acumulativas C/U
prob_acum_contrato_1 <- pweibull(contrato_1, shape = parametros_weibull[1], scale = parametros_weibull[2])
prob_acum_contrato_2 <- pweibull(contrato_2, shape = parametros_weibull[1], scale = parametros_weibull[2])

# Comparación
if (prob_acum_contrato_1 > prob_acum_contrato_2) {
  cat("El contrato 1 tiene una probabilidad acumulativa más alta.\n")
} else if (prob_acum_contrato_1 < prob_acum_contrato_2) {
  cat("El contrato 2 tiene una probabilidad acumulativa más alta.\n")
} else {
  cat("Ambos contratos tienen la misma probabilidad acumulativa.\n")
}
## El contrato 1 tiene una probabilidad acumulativa más alta.


parametros_weibull <- Distribucion_Weibull$estimate

# Función de distribución acumulativa (FDA) de la distribución Weibull
fda_weibull <- function(x) pweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
valores_contrato <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Probabilidad acumulativa para cada valor
prob_acumulativa <- fda_weibull(valores_contrato)

# Gráfico función de distribución acumulativa (FDA)
plot(valores_contrato, prob_acumulativa, type = "l", lwd = 2, col = "blue",
     main = "Probabilidad acumulativa mayor",
     xlab = "Valor Final del Contrato", ylab = "Probabilidad Acumulativa")

contrato_1 <- 166905670 
contrato_2 <- 76956615 
abline(v = contrato_1, col = "red", lty = 2)
abline(v = contrato_2, col = "green", lty = 2)
legend("bottomright", legend = c("FDA Weibull", "Contrato 1", "Contrato 2"), 
       col = c("blue", "red", "green"), lty = c(1, 2, 2), cex = 0.8)

Estimaciones:

Dada la función de distribución acumulativa, ¿cómo se estimaría el valor medio esperado de los Valores Finales de Contrato?

# Parámetros de la distribución Weibull ajustada
forma <- Weibull$estimate[1]
escala <- Weibull$estimate[2]

# Media de la distribución Weibull
media_weibull <- escala * gamma(1 + 1 / forma)

print(paste("La media esperada de los Valores Finales de Contrato según la distribución Weibull ajustada es:", round(media_weibull, 2)))
## [1] "La media esperada de los Valores Finales de Contrato según la distribución Weibull ajustada es: 2619378888.11"


parametros_weibull <- Distribucion_Weibull$estimate

# Función de densidad de probabilidad (FDP) de la distribución Weibull
fdp_weibull <- function(x) dweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
valores_contrato <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Densidad de probabilidad para cada valor
densidad_probabilidad <- fdp_weibull(valores_contrato)

# Gráfico de la función de densidad de probabilidad (FDP)
plot(valores_contrato, densidad_probabilidad, type = "l", lwd = 2, col = "blue",
     main = "Valor medio esperado",
     xlab = "Valor Final del Contrato", ylab = "Densidad de Probabilidad")

media <- 2619378888.11
abline(v = media, col = "purple", lty = 2)
text(x = media, y = max(densidad_probabilidad) * 0.8,
     labels = paste("Media:", round(media, 2)), col = "purple")

legend("topright", legend = c("FDP Weibull", "Media"), 
       col = c("blue", "purple"), lty = c(1, 2), cex = 0.8)


¿Qué rango de valores abarca el 90% de los contratos?

# Cuantiles para el 5% y 95%
cuantil_5 <- qweibull(0.05, shape = ajuste_weibull$estimate[1], scale = ajuste_weibull$estimate[2])
cuantil_95 <- qweibull(0.95, shape = ajuste_weibull$estimate[1], scale = ajuste_weibull$estimate[2])

cat("El rango de valores que abarca el 90% de los contratos es:", round(cuantil_5, 2), "a", round(cuantil_95, 2), "\n")
## El rango de valores que abarca el 90% de los contratos es: 46581949 a 9365594483


# Parámetros ajustados de la distribución Weibull
parametros_weibull <- Distribucion_Weibull$estimate

# Función de densidad de probabilidad (FDP) de la distribución Weibull
fdp_weibull <- function(x) dweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
valores_contrato <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Densidad de probabilidad para cada valor
densidad_probabilidad <- fdp_weibull(valores_contrato)

# Gráfico de la función de densidad de probabilidad (FDP)
plot(valores_contrato, densidad_probabilidad, type = "l", lwd = 2, col = "blue",
     main = "90% datos muestra",
     xlab = "Valor Final del Contrato", ylab = "Densidad de Probabilidad")

# Límites
limite_inferior <- 46581949
limite_superior <- 9365594483

# Líneas punteadas para los límites
abline(v = c(limite_inferior, limite_superior), col = c("red", "green"), lty = 2)

# Área sombreada entre los límites
x_area <- c(limite_inferior, valores_contrato[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], limite_superior)
y_area <- c(0, densidad_probabilidad[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], 0)
polygon(x_area, y_area, col = "lightgray", rgb(0.8, 0.8, 0.8, 0.5), border = NA)

# Leyenda
legend("topright", legend = c("FDP Weibull", "Límite Inferior", "Límite Superior"), 
       col = c("blue", "red", "green", rgb(0.8, 0.8, 0.8, 0.5)), lty = c(1, 2, 2, 0), cex = 0.8)


Probabilidades de Eventos Futuros

¿Cuál es la probabilidad de que un contrato tenga un valor superior superior a la media de la distribución?

# Distribución Weibull ajustada
forma <- Weibull$estimate[1]
escala <- Weibull$estimate[2]

# Media de la distribución Weibull
media_weibull <- escala * gamma(1 + 1 / forma)

# Probabilidad 
prob_superior_media <- 1 - pweibull(media_weibull, shape = forma, scale = escala)

print(paste("La probabilidad de que un contrato tenga un valor superior a la media es:", round(prob_superior_media, 4)))
## [1] "La probabilidad de que un contrato tenga un valor superior a la media es: 0.3238"


# Parámetros ajustados de la distribución Weibull
parametros_weibull <- Distribucion_Weibull$estimate

# Función de densidad de probabilidad (FDP) de la distribución Weibull
fdp_weibull <- function(x) dweibull(x, shape = parametros_weibull[1], scale = parametros_weibull[2])
valores_contrato <- seq(0, max(datos1$`Valor Final Contrato`), length.out = 100)

# Densidad de probabilidad para cada valor
densidad_probabilidad <- fdp_weibull(valores_contrato)

# Gráfico de la función de densidad de probabilidad (FDP)
plot(valores_contrato, densidad_probabilidad, type = "l", lwd = 2, col = "blue",
     main = "Datos mayores a la media",
     xlab = "Valor Final del Contrato", ylab = "Densidad de Probabilidad")

# Límites
limite_inferior <- 2619378888.11
limite_superior <- 19627175114


# Líneas punteadas para los límites
abline(v = c(limite_inferior, limite_superior), col = c("red", "green"), lty = 2)

# Área sombreada entre los límites
x_area <- c(limite_inferior, valores_contrato[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], limite_superior)
y_area <- c(0, densidad_probabilidad[valores_contrato >= limite_inferior & valores_contrato <= limite_superior], 0)
polygon(x_area, y_area, col = "lightgray", rgb(0.8, 0.8, 0.8, 0.5), border = NA)

# Leyenda
legend("topright", legend = c("FDP Weibull", "Límite Inferior", "Límite Superior"), 
       col = c("blue", "red", "green", rgb(0.8, 0.8, 0.8, 0.5)), lty = c(1, 2, 2, 0), cex = 0.8)



Análisis y Conclusiones


ANÁLISIS:El análisis detallado de la base de datos “Matriz Bogotá Turismo” revela una visión significativa del estado general de los contratos y su valor final en el contexto turístico de la ciudad. La primera gráfica refleja mayoritariamente contratos en ejecución en todas las localidades, sugiriendo un sesgo positivo en la distribución de datos. Sin embargo, esta interpretación inicial podría ser desviada, ya que muchos proyectos ni siquiera han comenzado o, mucho menos, finalizado.

Se observa que la falta de distribución en intervalos y la concentración en la fase de ejecución pueden deberse a diversos factores, como malos contratistas o la falta de avance real en las obras. Los histogramas indican que las localidades suroccidentales enfrentan contratos en incumplimiento o suspendidos, mientras que aquellas hacia el norte, oriente o suroriente tienden a tener proyectos en ejecución o terminados.

El análisis realizado sobre los Valores Finales de Contrato utilizando la distribución Weibull proporciona información valiosa sobre la variabilidad y la probabilidad asociada con esta variable. La elección de la distribución Weibull se basó en pruebas estadísticas y el ajuste visual de los datos. Se encontró que esta distribución se ajusta adecuadamente a la variabilidad de los Valores Finales de Contrato.

Las probabilidades acumulativas proporcionan información sobre la probabilidad de que un contrato tenga un valor final menor o igual a un cierto umbral. Estas probabilidades son valiosas para la toma de decisiones y la evaluación de riesgos.

Al comparar las probabilidades acumulativas de dos contratos seleccionados al azar, se puede determinar cuál tiene una probabilidad más alta de tener un Valor Final de Contrato inferior. Esto es útil para tomar decisiones informadas sobre la gestión de contratos.

La aplicación de estos conceptos en situaciones prácticas puede ayudar en la planificación y toma de decisiones relacionadas con contratos. Se pueden utilizar para evaluar la probabilidad de que los contratos alcancen ciertos umbrales de valor o para estimar costos esperados.


CONCLUSIÓN:La evaluación de los contratos en Bogotá presenta desafíos significativos derivados de la complejidad y la heterogeneidad de los datos. Se subraya la importancia de adoptar enfoques más avanzados y la necesidad de explorar modelos más sofisticados con el fin de comprender plenamente la dinámica de los contratos en el sector turístico de la ciudad. Este proyecto proporciona una sólida base para futuras investigaciones y estrategias en la gestión de contratos dentro del ámbito turístico, contribuyendo así al desarrollo de prácticas más eficientes en datos en el manejo de contratos en esta área específica.



Preguntas Generales


¿Cuál es la proporción de contratos suspendidos en comparación con los que han continuado o terminado, y cómo afecta esto a la distribución de valores finales?

La proporción de los contratos suspendidos con respecto a los que estan en ejecución o ya terminados es muy bajita, puede ser por eso mismo que al presentarse varios problemas dentro de los contratos u obras y no suspender, si no seguir inyectando capital es por lo que aparece ese sesgo positivo hacia el estado de ejecución, que puede significar un sobre costo.


¿Cómo varía la distribución de valores finales entre contratos en diferentes estados (liquidado, incumplimiento, por iniciar, suspendido, terminado)?

Tenemos que la mayor cantidad de dinero según el valor final del contrato están en las categorías donde más se demanda dinero: al momento de iniciar el contrato por todos los costos preliminares, cuando de estan ejecutando por todas las posibles demoras, abandonos y demás factores que pueden ocurrir en una obra, y al finalizar el contrato, cuanto falta ultimar detalles y dar liquidez a este.


¿Cómo influye la ubicación geográfica en la variabilidad de los valores finales de los contratos?

La ubicación en donde se estan realizando los contratos varía bastante entre las localidades, ya que las localidades suroccidentales enfrentan contratos en incumplimiento o suspendidos, mientras que aquellas hacia el norte, oriente o suroriente tienden a tener proyectos en ejecución o terminados.


¿Cuál es el impacto potencial de sesgo positivo en la interpretación de la distribución de datos para contratos en ejecución?

El sesgo positivo en la distribución de datos para contratos en ejecución sugiere una posible sobreestimación de los valores finales, que se pueden deber a varios factores de sobrecostos en la ejecución de estos contratos


¿Cómo afecta la inclusión de contratos que ni siquiera han comenzado al análisis de la distribución de valores finales en contratos en ejecución?

La inclusión de contratos que no han comenzado puede introducir sesgos en la distribución de valores finales para contratos en ejecución, ya que la falta de datos sobre proyectos no iniciados puede distorsionar la interpretación general y conducir a conclusiones menos precisas sobre el rendimiento de estos contratos en particular


LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZGVwdGg6IDYKICAgIHRvY19mbG9hdDogVFJVRQogICAgbnVtYmVyX3NlY3Rpb246IEZBTFNFCiAgICB0aGVtZTogam91cm5hbAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogc2VudGVuY2UKICAgIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAotLS0KCgo8Y2VudGVyPgo8YnIvPgo8YnIvPgoKIyAqKsK/UkVBTE1FTlRFIFNPTU9TIExBIENJVURBRCBDQVBJVEFMIERFTCBUVVJJU01PPyoqCgo8YnIvPgo8YnIvPgoKKlVuaXZlcnNpZGFkIERpc3RyaXRhbCBGcmFuY2lzY28gSm9zw6kgRGUgQ2FsZGFzKgo8YnIvPgoqUHJvYmFiaWxpZGFkIHkgZXN0YWTDrXN0aWNhKiAKPGJyLz4KKlByb3llY3RvOiBQYXJ0ZSBJSSoKPGJyLz4KCipMYXVyYSBEYW5pZWxhIFVycmVnbyBEw61heioKPGJyLz4KKkp1YW4gRXN0ZWJhbiBQZXJleiBKaW1lbmV6Kgo8YnIvPgo8YnIvPgoqRG9jZW50ZTogU2luZHkgVGF0aWFuYSBDb3Jkb2JhIENvcmRvYmEqCgo8L2NlbnRlcj4KCjxici8+Cgo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4KCiMgKipJbnRyb2R1Y2Npw7NuKioKCjxici8+CgpDb2xvbWJpYSBlcyByZWNvbm9jaWRvIGNvbW8gdW5vIGRlIGxvcyBwYcOtc2VzIHF1ZSBhdHJhZSBhIHN1cyB0aWVycmFzIGluZmluaWRhZCBkZSB2aXNpdGFudGVzIHByb3ZlbmllbnRlcyBkZSB0b2RhcyBwYXJ0ZXMgZGVsIG11bmRvIGRlYmlkbyBhIHF1ZSBzZSBzaWVudGVuIGF0cmHDrWRvcyBwb3IgZWwgZW5jYW50byBkZSBsYSBnZW50ZSwgbGFzIGhpc3RvcmlhcywgbGEgY2F1dGl2YWRvcmEgYmVsbGV6YSBkZSBsb3MgcGFpc2FqZXMgeSBsYXMgZGl2ZXJzYXMgYWN0aXZpZGFkZXMgcXVlIHBlcm1pdGVuIHNlciByZWFsaXphZGFzIGFsIHNlciB1biBwYcOtcyB0YW4gZGl2ZXJzbyB5IG11bHRpY3VsdHVyYWwuIAo8YnIvPgoKTGEgZmFzY2luYWNpw7NuIHBvciBjb25vY2VyIGVzdGUgcGHDrXMgdHJhZSBjb25zaWdvIG11Y2hvcyB2aWFqZXJvcyBxdWllbmVzIGN1cmlvc29zIGRlIHRvZG8gbG8gcXVlIENvbG9tYmlhIHRpZW5lIHBvciBvZnJlY2VyIGVsaWdlbiBhIGVzdGUgY29tbyB1biBwcmluY2lwYWwgZGVzdGlubyB0dXLDrXN0aWNvIGEgY29ub2NlciBjb21lbnphbmRvIGNvbiBsYSBjYXBpdGFsIGRlbCBwYcOtcywgbGEgY3VhbCBjdWVudGEgY29uIHVuYSB1YmljYWNpw7NuIHByaXZpbGVnaWFkYSBlbiBlbCBjZW50cm8gZGVsIHRlcnJpdG9yaW8gY29sb21iaWFubyBlbiBlbCBhbHRpcGxhbm8gY3VuZGlib3lhY2Vuc2UsIHViaWNhZG8gZW4gbGEgY29yZGlsbGVyYSBvcmllbnRhbCBkZSBsb3MgQW5kZXMgY29ub2NpZGEgb2ZpY2lhbG1lbnRlIGNvbW8gQm9nb3TDoSBEaXN0cml0byBDYXBpdGFsLgo8YnIvPgoKQm9nb3TDoSB0aWVuZSB1bmEgbG9uZ2l0dWQgZGUgMzMga20gZGUgc3VyIGEgbm9ydGUgeSAxNiBrbSBkZSBvcmllbnRlIGEgb2NjaWRlbnRlLCBlc3TDoSBjb25zdGl0dWlkYSBwb3IgMjAgbG9jYWxpZGFkZXMgZG9uZGUgY2FkYSB1bmEgdGllbmUgc3UgcHJvcGlvIGFsY2FsZGUgbWVub3IgeSBqdW50YSBhZG1pbmlzdHJhdGl2YSBsb2NhbCBlbmNhcmdhZG9zIGRlIGxhIHN1cGVydmlzacOzbiwgZWplY3VjacOzbiB5IGRlYmlkbyBmdW5jaW9uYW1pZW50byBkZSBsb3MgcHJvY2Vzb3MgaW50ZXJub3MgZGUgY2FkYSBsb2NhbGlkYWQ7IGVzdGEgY2l1ZGFkIGVzIGVsIGVwaWNlbnRybyBhcnTDrXN0aWNvLCBjdWx0dXJhbCwgZGVwb3J0aXZvIHkgdHVyw61zdGljbyBkZWwgcGHDrXMgZGViaWRvIGEgcXVlIG9mcmVjZSB1bmEgZ3JhbiB2YXJpZWRhZCBkZSBnYXN0cm9ub23DrWEgeSBhcnF1aXRlY3R1cmEgZXNwZWNpYWxpemFkYSBjb24gZmluZXMgdHVyw61zdGljb3MgdGFsZXMgY29tbyBtdXNlb3MsIHBhcnF1ZXMsIHRlYXRyb3MsIGNhc2FzIGN1bHR1cmFsZXMsIGNlbnRyb3MgY29tZXJjaWFsZXMgeSBvdHJvcyBsb2NhY2lvbmVzIHF1ZSBhY29nZW4gYWwgdmlhamVybyBhIHZpdmlyIGV4cGVyaWVuY2lhcyDDum5pY2FzIGRlbnRybyBkZSBsYSBjaXVkYWQgY2FwaXRhbCBjb24gdW5hIG1lemNsYSBwZXJmZWN0YSBlbnRyZSBsbyBhbnRpZ3VvIHkgbG8gbW9kZXJuby4KPGJyLz4KCkxhIGZpbmFsaWRhZCBkZSBlc3RlIHByb3llY3RvIGVzIHRvbWFyIGNvbW8gb2JqZXRvIGRlIGVzdHVkaW8gdW4gZW5mb3F1ZSB0dXLDrXN0aWNvIGRlIGxhIGNpdWRhZCBkZSBCb2dvdMOhIHkgY29uIGF5dWRhIGRlIGRpZmVyZW50ZXMgw6FyZWFzIGRlbCBjb25vY2ltaWVudG8gY29tbyBsYSBlc3RhZMOtc3RpY2EsIGxhIHByb2JhYmlsaWRhZCB5IG90cmFzIGNpZW5jaWFzIGV4YWN0YXMgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGFjZXJjYSBkZSBsYSBpbnZlcnNpw7NuIHF1ZSBzZSBkZXN0aW5hIHBhcmEgZXN0b3MgaW50ZXJlc2VzIHkgbGEgZGlzdHJpYnVjacOzbiBwb3IgbG9jYWxpZGFkZXMgZGUgbG9zIHJlY3Vyc29zIGNvbiBlc2UgZmluLCB0YW1iacOpbiBzZSByZWNvbm9jZXLDoW4gb3Ryb3MgZmFjdG9yZXMgcXVlIHRpZW5lbiByZWxhY2nDs24gdGFudG8gaW5kaXJlY3RhIGNvbW8gZGlyZWN0YW1lbnRlIHBhcmEgYXPDrSBsb2dyYXIgdmlzdWFsaXphciBjb21vIGVsIHR1cmlzbW8gZW4gbGEgY2FwaXRhbCBkZSBsYSBjaXVkYWQgZXN0w6EgcHJlc2VudGUgZW4gZWwgZGVzYXJyb2xsbyBpbnRlZ3JhbCBkZWwgcGHDrXMgeSBicmluZGFuZG8gbnVldmFzIGV4cGVyaWVuY2lhcyBsbGFtYXRpdmFzIHBhcmEgbG9zIHZpc2l0YW50ZXMgY29tbyB0YW1iacOpbiBudWV2YXMgb3BvcnR1bmlkYWRlcyBkZSBlbXBsZW8sIG1lam9yYSBkZSBpbmZyYWVzdHJ1Y3R1cmEgeSBtZWpvcmFtaWVudG8gZGUgbGEgY2FsaWRhZCBkZSB2aWRhIHBhcmEgbG9zIGNpdWRhZGFub3MuCgoKPGJyLz4KPGJyLz4KCiMgKipQcm9ibGVtYSBPYmpldGl2byoqCgo8YnIvPgo8YnIvPgoKKipFbCBwcm9ibGVtYSBvYmpldGl2byB0cmF0YWRvIGEgbG8gbGFyZ28gZGVsIGRlc2Fycm9sbG8gZGVsIHByb3llY3RvIGVzOioqCgo8YnIvPgo8ZGl2Lz4KPGNlbnRlcj4KCioqwr9MYSBpbnZlcnNpw7NuIG1vbmV0YXJpYSBkZXN0aW5hZGEgYWwgdHVyaXNtbyBlbiBsYSBjaXVkYWQgZGUgQm9nb3TDoSBzZSB2ZSByZWZsZWphZGEgZW4gbGEgcmVhbGlkYWQgcGFyYSBlbCBnb3pvIGRlIGxvcyBjaXVkYWRhbm9zIHkgdmlzaXRhbnRlcz8qKgoKPC9jZW50ZXI+Cjxici8+CgpTZSByZWFsaXphcsOhIGVsIGVzdHVkaW8gZGUgbG9zIHJlY3Vyc29zIHF1ZSBzb24gZGVzdGluYWRvcyBwYXJhIGxhIG1lam9yYSB5IGNvbnN0cnVjY2nDs24gZGUgZGlmZXJlbnRlcyBsb2NhY2lvbmVzIHF1ZSBwcm9tdWV2ZW4gZWwgdHVyaXNtbyBlbiBsYSBjaXVkYWQgZGUgQm9nb3TDoSB0YWxlcyBjb21vIGNhc2FzIGRlIGN1bHR1cmEsIHRlYXRyb3MsIGNpY2xvIGluZnJhZXN0cnVjdHVyYSwgbWFsbGEgdmlhbCwgZXNwYWNpb3MgcMO6YmxpY29zIHkgcGFycXVlcyBkZSBsYSBjaXVkYWQgZGUgQm9nb3TDoSBlbiBsYXMgZGlmZXJlbnRlcyBsb2NhbGlkYWRlcywgdGFtYmnDqW4gc2UgdGVuZHLDoSBlbiBjdWVudGEgZWwgdGlwbyBkZSBpbnRlcnZlbmNpw7NuIHF1ZSBzZSBlc3TDqSByZWFsaXphbmRvIHkgZWwgZXN0YWRvIGRlIGVzdGEgcGFyYSBhc8OtIHBvZGVyIHZpc3VhbGl6YXIgY3VhbnRpdGF0aXZhbWVudGUgbGEgY2FudGlkYWQgZGUgb2JyYXMgcXVlIHJlYWxtZW50ZSBzZSBoYW4gcmVhbGl6YWRvIHkgZXN0w6FuIGRpc3BvbmlibGVzIHBhcmEgc3UgdXNvIGNvbGVjdGl2byBjb21vIHRhbWJpw6luIGxhIGNhbnRpZGFkIGRlIG9icmFzIGVzdMOhbiBlbiBzdSBmYXNlIGluaWNpYWwsIGNvbiBpbmN1bXBsaW1pZW50b3MgbyBlbiBzdXNwZW5zacOzbi4KCjxici8+Cjxici8+CgojICoqQW50ZWNlZGVudGVzIFByb2JsZW3DoXRpY2EqKgoKPGJyLz4KPGJyLz4KCioqwr9RdcOpIHNlIGhhIHJlYWxpemFkbyBoYXN0YSBlbCBtb21lbnRvPyoqCjxici8+CgpFbCBjZW50cm8gZGUgZ29iaWVybm8gbG9jYWwgZGUgQm9nb3TDoSB0aWVuZSBhIGRpc3Bvc2ljacOzbiBkZSBsb3MgY2l1ZGFkYW5vcyBpbmZvcm1hY2nDs24gcmVmZXJlbnRlIGEgbG9zIGRpZmVyZW50ZXMgY29udHJhdG9zIGV4aXN0ZW50ZXMgeSBvYnJhcyB5YSBxdWUgZXN0YSBlbnRpZGFkIGVzIGxhIGVuY2FyZ2FkYSBkZSBsbGV2YXIgbG9zIHNlZ3VpbWllbnRvcyBhIGxhIGludmVyc2nDs24gZGUgbGFzIGRpZmVyZW50ZXMgaW5mcmFlc3RydWN0dXJhcyB5IGFjY2lvbmVzIGRlIGxvcyBlc3BhY2lvcyBww7pibGljb3MgZGUgY2FkYSBsb2NhbGlkYWQsIGVuIGVzdGEgaW5mb3JtYWNpw7NuIHNlIHB1ZWRlIGV2aWRlbmNpYXIgZWwgbWFwYSwgbGFzIGVzdGFkw61zdGljYXMgZGUgbGEgY2l1ZGFkLCBlbCBlc3RhZG8gZGUgbG9zIHByb2Nlc29zIGNvbnRyYWN0dWFsZXMgeSBlbCByZXN1bWVuIGRlIGluZnJhZXN0cnVjdHVyYSBsb2NhbC4KCkxhbWVudGFibGVtZW50ZSBlc3RlIHRpcG8gZGUgcHJvY2Vzb3MgbGEgbWF5b3LDrWEgZGUgdmVjZXMgbm8gc2UgZWplY3V0YW4gZGUgbGEgbWFuZXJhIG3DoXMgZWZpY2F6IHkgcsOhcGlkYSBwb3NpYmxlIGRlIG1vZG8gcXVlLCBhdW5xdWUgbGEgaW5mb3JtYWNpw7NuIHNlIGVuY3VlbnRyYSB5IHNlIGNvbm9jZW4gbGFzIGZ1dHVyYXMgaW50ZXJ2ZW5jaW9uZXMgYXVuIGFzw60gZW4gbGEgbWF5b3LDrWEgZGUgY2Fzb3Mgc2UgZXZpZGVuY2lhIHVuYSBudWxhIG8gbGVudGEgZWplY3VjacOzbiBkZSBlc3Rhcy4KCjxici8+CgoqKkxhIHBvc2libGUgc29sdWNpw7NuIHF1ZSBzZSBwbGFudGVhIGVzOioqCjxici8+CgpSZWFsaXphciB1biBhbsOhbGlzaXMgZGUgbGEgaW5mb3JtYWNpw7NuIHF1ZSBicmlkYSBlbCBjZW50cm8gZGUgZ29iaWVybm8gbG9jYWwgZGUgQm9nb3TDoSBwYXJhIGFzw60gcG9kZXIgaWRlbnRpZmljYXIgbGEgaW52ZXJzacOzbiBtb25ldGFyaWEgdHVyw61zdGljYSBwb3IgbG9jYWxpZGFkLCBhZGljaW9uYWxtZW50ZSBpZGVudGlmaWNhciBsYSBqZXJhcnF1aXphY2nDs24gZGUgbG9zIHJlY3Vyc29zIGVudHJlIGxhcyBsb2NhbGlkYWRlcyB5IGxvcyBhdmFuY2VzIHF1ZSBhbGzDrSBwcmVzZW50YW4gcGFyYSBsYXMgaW5mcmFlc3RydWN0dXJhcyBxdWUgYXBvcnRhbiBhbCBkZXNhcnJvbGxvIHR1csOtc3RpY28gZGUgbGEgY3VpZGFkIHBhcmEgbHVlZ28gcG9kZXIgY29tcGFyYXIgY29uIHZpc2l0YXMgZGUgY2FtcG8gc2kgcmVhbG1lbnRlIHNlIGV2aWRlbmNpYSBsYSByZXNwZWN0aXZhIGludGVydmVuY2nDs24gZW4gbGEgbG9jYWNpw7NuIHRhbCBjb21vIGxvIHByZXNlbnRhIGxhIGluZm9ybWFjacOzbi4KCkdyYWNpYXMgYSBlc3RlIGVzdHVkaW8gc2UgdGVuZHLDrWEgbGEgcG9zaWJpbGlkYWQgZGUgY29ub2NlciBlbiBsYSBhY3R1YWxpZGFkIGxhcyBpbnRlcnZlbmNpb25lcyBxdWUgc2UgZXN0w6FuIGVqZWN1dGFuZG8geSBwb2RlciBleGlnaXIgbGEgYWdpbGlkYWQgZGUgbG9zIHByb2Nlc29zIGEgZW50aWRhZGVzIGNvbW8gbGEgc2VjcmV0YXJpYSBkZSBnb2JpZXJubyB5IGxhIGp1bnRhIGFkbWluaXN0cmF0aXZhIHBvciBsb2NhbGlkYWQgcGFyYSBxdWUgYXPDrSB0YW50byBsb3MgY2l1ZGFkYW5vcyBjb21vIGxvcyB2aXNpdGFudGVzIGRlIG90cm9zIGx1Z2FyZXMgcHVlZGFuIHNlZ3VpciBkaXNmcnV0YW5kbyBsb3MgZXNwYWNpb3MgdHVyw61zdGljb3MgcXVlIHNlIGVuY3VlbnRyYW4geSBxdWUgc2UgcGxhbmVhbiBjb25zdHJ1aXIgZW4gdW4gZnV0dXJvIGVuIGxhIGNpdWRhZCBkZSBCb2dvdMOhLgoKPGJyLz4KPGJyLz4KCioqwr9Dw7NtbyBjb250cmlidXllIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCBlbiBsYSBzb2x1Y2nDs24gZGUgZXN0YSBwcm9ibGVtw6F0aWNhPyoqCjxici8+CgpMYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgdGllbmUgdW4gcGFwZWwgaW1wb3J0YW50ZSBlbiBjdWFudG8gYWwgYXBveW8gZGUgbGEgc29sdWNpw7NuIGRlIGVzdGEgcHJvYmxlbcOhdGljYSBkZWJpZG8gYSBxdWUgc3UgYXBsaWNhY2nDs24gbm9zIHBlcm1pdGUgZXN0dWRpYXIgZGlmZXJlbnRlcyBmYWN0b3JlcyBxdWUgc2UgcmVsYWNpb25hbiB0YW50byBkaXJlY3RhIGNvbW8gaW5kaXJlY3RhbWVudGUgY29uIGVsIHR1cmlzbW8geSBub3MgYXl1ZGEgYSBjb21wcmVuZGVybG9zIHBhcmEgYXPDrSByZWFsaXphciB1bmEgdG9tYSBkZSBkZWNpc2lvbmVzIGRlIHVuYSBtYW5lcmEgbcOhcyBmw6FjaWwsIGJhc8OhbmRvbm9zIGFzw60gZW4gbG9zIGRhdG9zIHF1ZSBub3MgbXVlc3RyYW4gbnVlc3RyYXMgZnVlbnRlcyBkZSBpbmZvcm1hY2nDs24uCgpPdHJvIGFwb3J0ZSBxdWUgbm9zIGJyaW5kYSBsYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgZXMgZWwgYXBveW8gZW4gbGEgcmVhbGl6YWNpw7NuIGRlIGRlZHVjY2lvbmVzIHBhcmEgY29ub2NlciBlbCBzaWd1aWVudGUgcGFzbyBhIHNlZ3VpciB5IGRhciBsYSBjb250aW51aWRhZCBkZWwgZXN0dWRpbywgaW1wbGVtZW50YW5kbyBsYSBzb2x1Y2nDs24gYSBlc3RhIHByb2JsZW3DoXRpY2EgYmFzw6FuZG9ub3MgZW4gZ3JhbiBwYXJ0ZSBlbiBsYSBpbmZvcm1hY2nDs24gbnVtw6lyaWNhIGFkcXVpcmlkYSB0ZW5pZW5kbyB1bmEgYmFzZSBzb2xpZGEgcGFyYSBsYSBhcmd1bWVudGFjacOzbiBhIGxhIGF0ZW5jacOzbiBkZSBsYSBwcm9ibGVtw6F0aWNhLgoKPGJyLz4KPGJyLz4KCiMgKipPYmpldGl2b3MqKgoKPGJyLz4KCiMjICoqT2JqZXRpdm8gR2VuZXJhbCoqIAoKPGJyLz4KCkFuYWxpemFyIGxhIGVmaWNpZW5jaWEsIGN1bXBsaW1pZW50byBlIGludmVyc2nDs24gZGUgbGFzIGNvbnN0cnVjY2lvbmVzIGNvbW8gdGFtYmnDqW4gZGUgbG9zIGVzcGFjaW9zIHDDumJsaWNvcyBxdWUgZXN0w6FuIGRlc3RpbmFkb3MgYWwgb2NpbyB5IGdvem8gdGFudG8gZGUgbG9zIGhhYml0YW50ZXMgZGUgbGEgY2l1ZGFkIGRlIEJvZ290w6EgY29tbyBsb3MgdmlzaXRhbnRlcyBkZSBvdHJhcyBsb2NhY2lvbmVzLgoKPGJyLz4KCiMjICoqT2JqZXRpdm9zIEVzcGVjaWZpY29zKioKCjxici8+CgotIENvbXBpbGFyIHRvZGEgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSBjb24gZWwgZmluIGRlIGNvbm9jZXIgbG9zIGZhY3RvcmVzIGRlIGxhIHByb2JsZW3DoXRpY2EgZW4gc3UgdG90YWxpZGFkIHkgcmVhbGl6YXIgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGVzdG9zIG1pc21vcy4KCjxici8+CgotIFJlYWxpemFyIHVuIGFuw6FsaXNpcyBlc3BlY2lmaWNvIGRlIGxhIGJhc2UgZGUgZGF0b3MgcGFyYSBjb25vY2VyIGxhIGludmVyc2nDs24gbW9uZXRhcmlhIHkgZWplY3VjacOzbiBkZSBsYXMgb2JyYXMgcmVmZXJlbnRlcyBhbCB0dXJpc21vIGVuIGxhIGNpdWRhZCBjYXBpdGFsIGRlbCBwYcOtcy4KCjxici8+CgotIENvbXBhcmFyIGxhIGluZm9ybWFjacOzbiBicmluZGFkYSBwb3IgZWwgYW7DoWxpc2lzIGRlbCBlc3R1ZGlvIGNvbiB0cmFiYWpvIGVuIGNhbXBvIHF1ZSByZWN0aWZpcXVlIGxhIHZlcmFjaWRhZCBkZSBsYSBpbmZvcm1hY2nDs24gcG9yIG1lZGlvIGRlIGV2aWRlbmNpYXMuCgo8YnIvPgoKLSBBcHJlbmRlciBhIHV0aWxpemFyIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCB5IHN1cyBhcGxpY2FjaW9uZXMgY29tbyBoZXJyYW1pZW50YSBkZSB0cmFiYWpvIGVuIHVuIMOhbWJpdG8gcmVhbCBkZSBsYSBpbmdlbmllcsOtYSBjaXZpbC4KCjxici8+Cjxici8+CgojICoqTWFyY28gVGXDs3JpY28qKgoKPGJyLz4KCi0gKipUdXJpc21vOioqIFTDqXJtaW5vIHF1ZSBkZWZpbmUgYWN0aXZpZGFkZXMgcXVlIHJlYWxpemFuIGxhcyBwZXJzb25hcyBkdXJhbnRlIHN1cyB2aWFqZXMgeSAgcGVybWFuZW5jaWFzIGVuIGx1Z2FyZXMgZGlzdGludG9zIGEgc3UgZW50b3JubyBoYWJpdHVhbCBkdXJhbnRlIHVuIHBlcsOtb2RvIGRlIHRpZW1wbyBjb24gZmluZXMgZGUgb2NpbywgbmVnb2Npb3MgdSBvdHJvcy4KCjxici8+CgotICoqSW5nZW5pZXLDrWEgY2l2aWw6KiogRGlzY2lwbGluYSBxdWUgZW1wbGVhIGNvbm9jaW1pZW50b3MgZGUgY8OhbGN1bG8sIG1lY8OhbmljYSwgaGlkcsOhdWxpY2EgeSBmw61zaWNhIHBhcmEgZW5jYXJnYXJzZSBkZWwgZGlzZcOxbywgY29uc3RydWNjacOzbiB5IG1hbnRlbmltaWVudG8gZGUgbGFzIGluZnJhZXN0cnVjdHVyYXMgcmVhbGxpemFkYXMgZW4gZWwgZW50b3Juby4KCjxici8+CgotICoqSW5mcmFlc3RydWN0dXJhOioqIFJlYWxpemFjacOzbiBodW1hbmEgZGlzZcOxYWRhIHkgZGlyaWdpZGEgcG9yIHByb2Zlc2lvbmFsZXMgZGUgSW5nZW5pZXLDrWEsIFVyYmFuaXNtbywgZXRjLiwgcXVlIHNpcnZlbiBkZSBzb3BvcnRlIHBhcmEgZWwgZGVzYXJyb2xsbyBkZSBvdHJhcyBhY3RpdmlkYWRlcyB5IHN1IGZ1bmNpb25hbWllbnRvLgoKPGJyLz4KCi0gKipFc3RhZMOtc3RpY2E6KiogQ2llbmNpYSBkZSBkYXIgc2VudGlkbyBhIGxvcyBkYXRvcywgcHJvcG9yY2lvbmFuZG8gbGEgdGVvcsOtYSB5IGxvcyBtw6l0b2RvcyBwYXJhIGV4dHJhZXIgaW5mb3JtYWNpw7NuIGRlIGVzdG9zIHkgcG9kZXIgcmVzb2x2ZXIgcHJvYmxlbWFzIGRlbCBtdW5kbyByZWFsLiAKCjxici8+CgotICoqUHJvYmFiaWxpZGFkOioqVmFsb3IgbnVtw6lyaWNvIHF1ZSBub3Mgc2lydmUgcGFyYSBkZXRlcm1pbmFyIHF1w6kgdGFuIHBvc2libGUgZXMgcXVlIG9jdXJyYSB1biBldmVudG8gZGV0ZXJtaW5hZG8uCgo8YnIvPgoKLSAqKkxvY2FsaWRhZDoqKiBEaXZpc2nDs24gdGVycml0b3JpYWwgbyBhZG1pbmlzdHJhdGl2YSBnZW7DqXJpY2EgcGFyYSBjdWFscXVpZXIgbsO6Y2xlbyBkZSBwb2JsYWNpw7NuLCBjb24gaWRlbnRpZGFkIHByb3BpYS4gUHVlZGUgc2VyIHRhbnRvIHVuIG7DumNsZW8gZGUgZ3JhbiB0YW1hw7FvIHkgY29uIG11Y2hvcyBoYWJpdGFudGVzIG8gbsO6Y2xlbyBwZXF1ZcOxbyB0YW1hw7FvIHkgcG9jb3MgaGFiaXRhbnRlcy4KCjxici8+CgotICoqQ29udHJhdG86KiogTmVnb2NpbyBqdXLDrWRpY28gYmlsYXRlcmFsIGVuIGVsIGN1YWwgZG9zIG8gbcOhcyBwYXJ0ZXMgZXhwcmVzYW4gc3UgY29uc2VudGltaWVudG8gZW4gbGEgZm9ybWEgcGVybWl0aWRhIHBvciBsYSBsZXksIHBhcmEgY3JlYXIsIHJlZ3VsYXIsIG1vZGlmaWNhciBvIGV4dGluZ3VpciBvYmxpZ2FjaW9uZXMuCgo8YnIvPgoKLSAqKkludmVuc2nDs246KipBY3RvIGRlIGFzaWduYXIgcmVjdXJzb3MgcGFyYSBsYSBjb21wcmEgbyBjcmVhY2nDs24gZGUgYWN0aXZvcyBvIGRlIGNhcGl0YWwuCgo8YnIvPgoKLSAqKlpvbmE6KiogU3VwZXJmaWNpZSBkZSB0ZXJyZW5vIGRldGVybWluYWRhIHBvciBjb25zaWRlcmFjaW9uZXMgYWRtaW5pc3RyYXRpdmFzIG8gZXN0cnVjdHVyYWxlcy4KCjxici8+Cjxici8+CgojICoqUmVjb3BpbGFjacOzbiBEYXRvcyoqCgo8YnIvPgoKTGEgcmVjb3BpbGFjacOzbiBkZSBkYXRvcyBzZSBsbGV2w7MgYSBjYWJvIHBvciBtZWRpbyBkZSBmdWVudGVzIGFiaWVydGFzLCBsYSBiYXNlIGRlIGRhdG9zIHNlbGVjY2lvbmFkYSBjb24gbGEgY3VhbCBzZSByZWFsaXrDsyBlbCByZXNwZWN0aXZvIGFuw6FsaXNpcyBkZSBsYSBpbmZvcm1hY2nDs24gcGFyYSBlc3R1ZGlhciBsYSBwcm9ibGVtw6F0aWNhIGRlIHR1cmlzbW8gZW4gbGEgY2l1ZGFkIGRlIEJvZ290w6EgYW50ZXJpb3JtZW50ZSBwbGFudGVhZGEgZnVlIG9idGVuaWRhIGRlIGxhIHDDoWdpbmEgd2ViIGNvcnJlc3BvbmRpZW50ZSBhbCBnb2JpZXJubyBsb2NhbCBkZSBCb2dvdMOhLCBlc3RhIGluZm9ybWFjacOzbiBqdW50byBjb24gbGEgYWRpY2nDs24gZGUgb3Ryb3MgZGF0b3Mgb2J0ZW5pZG9zIHNvbiBsYSBiYXNlIGRlbCBlc3R1ZGlvIGVuIHN1IHRvdGFsaWRhZC4KCjxici8+Cjxici8+CgoKPGNlbnRlcj4KW0NlbnRybyBkZSBHb2JpZXJubyBMb2NhbCBkZSBCb2dvdMOhXShodHRwczovL2NlbnRyb2dvYmllcm5vbG9jYWwuZ29iaWVybm9ib2dvdGEuZ292LmNvLykKPC9jZW50ZXI+Cjxici8+Cgo8Y2VudGVyPgohW10oU2NyZW5zaG9vdDEuanBnKXt3aWR0aD02MCV9Cgo8YnIvPgoKIVtdKFNjcmVuc2hvb3QyLmpwZyl7d2lkdGg9OTAlfQo8L2NlbnRlcj4KPGJyLz4KPGNlbnRlcj4KKkZpZ3VyYSAxOkNhcHR1cmEgcGFudGFsbGEgcMOhZ2luYSB3ZWIgQ2VudHJvIGdvYmllcm5vIGxvY2FsLUJvZ290w6EqCjwvY2VudGVyPgo8YnIvPgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTGlicmVyaWFzCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodW5pdmFyaWF0ZU1MKQpsaWJyYXJ5KG5vcnRlc3QpCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQpsaWJyYXJ5KE1BU1MpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShsZWFmbGV0KQpgYGAKPC9kaXY+CgojICoqT3JnYW5pemFjacOzbiBEYXRvcyoqCgo8YnIvPgpMb3MgZGF0b3MgdXRpbGl6YWRvcyBwYXJhIGVsIGVzdHVkaW8gZXN0w6FuIGNvbnRlbmlkb3MgeSBvcmdhbml6YWRvcyBlbiBmb3JtYXRvIGRlIEV4Y2VsIChYTFNYKSwgZXN0b3Mgc2UgcG9kcsOhbiBvYnNlcnZhciBlbiBlbCBzaWd1aWVudGUgZW5sYWNlLgo8YnIvPgo8YnIvPgo8Y2VudGVyPgpbQmFzZSBkZSBkYXRvcyBNYXRyaXogQm9nb3TDoSBUdXJpc21vXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xemdzZzJuNHFnM0F5bGNPZ2thbDRGU1hhNlBRb2tnTC0vZWRpdD91c3A9c2hhcmluZyZvdWlkPTExMTAyNDQwOTg2MzEwMDUwMDg2MyZydHBvZj10cnVlJnNkPXRydWUpCjwvY2VudGVyPgo8YnIvPgoKKipSZXN1bWVuIGJhc2UgZGUgZGF0b3MqKgo8YnIvPgo8YnIvPgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLGVjaG89Rn0KCm1hdHJpemVzdGFkaXN0aWNhcmVzdW08LXJlYWRfZXhjZWwoIm1hdHJpemVzdGFkaXN0aWNhcmVzdW0ueGxzeCIpClRhYmxhPC1tYXRyaXplc3RhZGlzdGljYXJlc3VtWywxOjExXQpGb3JtLmJhc2ljPC1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJob3ZlciIsImNvbmRlbnNlZCIsInJlc3BvbnNpdmUiKQprYWJsZShUYWJsYSxmb3JtYXQgPSAiaHRtbCIpJT4lCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBGb3JtLmJhc2ljLGZ1bGxfd2lkdGggPSBGLGZvbnRfc2l6ZSA9IDgsIHBvc2l0aW9uID0gImNlbnRlciIpCmBgYAoKPGJyLz4KPGNlbnRlcj4KKlRhYmxhIDE6UmVzdW1lbiBiYXNlIGRlIGRhdG9zIGV4dHJhaWRhIGRlbCBjZW50cm8gZGUgZ29iaWVybm8gbG9jYWwqCjwvY2VudGVyPgo8YnIvPgoKRW4gZWwgc2lndWllbnRlIG1hcGEgcG9kZW1vcyBvYnNlcnZhciBsYSBkaXZpc2nDs24gZGUgYm9nb3TDoSBlbiBzdXMgcmVzcGVjdGl2YXMgbG9jYWxpZGFkZXMgbGFzIGN1YWxlcyBzb24gZWwgb2JqZXRvIGRlIGVzdHVkaW8gZGVsIHByZXNlbnRlIHRyYWJham8gZW4gZWwgc2VjdG9yIGRlIHR1cmlzbW8uCgo8Q2VudGVyPgoqKlJlY29tZW5kYWNpw7NuIDogRGVzY2FyZ2FyIGVsIGRvY3VtZW50byBwYXJhIHBvZGVyIHZpc3VhbGl6YXIgZWwgbWFwYSoqCgo8L0NlbnRlcj4KCjxici8+CjxDZW50ZXI+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CmxlYWZsZXQoKSAlPiUKICBhZGRUaWxlcygpICU+JQogIHNldFZpZXcobG5nID0gLTc0LjA4MTc1LCBsYXQgPSA0LjYwOTcxLCB6b29tID0gMTIpICU+JQogIGFkZE1pbmlNYXAod2lkdGggPSAxNTAsIGhlaWdodCA9IDE1MCkKYGBgCjwvZGl2PgoKPC9DZW50ZXI+Cjxici8+Cjxici8+CgojICoqSWRlbnRpZmljYWNpw7NuIFZhcmlhYmxlcyoqCgo8YnIvPgo8YnIvPgoKUGFyYSByZWFsaXphciBlbCBlc3R1ZGlvIHNlIGhpem8gdXNvIGRlIGxhcyBzaWd1aWVudGVzIHZhcmlhYmxlcyBkZW50cm8gZGUgbGEgYmFzZSBkZSBkYXRvcwoKPGJyLz4KPGJyLz4KCmBgYHtyLGVjaG89Rn0KCm1hdHJpemVzdGFkaXN0aWNhIDwtIHJlYWRfZXhjZWwoIm1hdHJpemVzdGFkaXN0aWNhLnhsc3giKQpuYW1lcyAobWF0cml6ZXN0YWRpc3RpY2EpCmBgYAo8YnIvPgo8YnIvPgoKQSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmEgZWwgZGljY2lvbmFyaW8gZGUgZGF0b3MgZGUgbGFzIHZhcmlhYmxlcyBwYXJhIGxhIGNvbXByZXNpw7NuIGRlIGxhcyB0YWJsYXMgZGUgZGF0b3MuCgo8YnIvPgo8YnIvPgoKfCBDQU1QTyAJfCBUSVBPIERFIERBVE8gCXwgREVTQ1JJUENJw5NOIAl8Cnw6LS0tOgl8Oi0tLToJfDotLS06CXwKfCBMb2NhbGlkYWQgCXwgQ2Fyw6FjdGVyIAl8IExvY2FsaWRhZCBkb25kZSBzZSBlbmN1ZW50cmEgbGEgaW50ZXJ2ZW5jacOzbiAgCXwKfCBOby4gZGUgY29udHJhdG8gCXwgTnVtw6lyaWNvIAl8IE7Dum1lcm8gZGUgY29udHJhdG8gZGUgbGEgaW50ZXJ2ZW5jacOzbiAJfAp8IFRpcG8gZGUgQ29udHJhdG8gCXwgQ2Fyw6FjdGVyIAl8IEVzcGVjaWZpY2FjacOzbiBnZW5lcmFsIGRlbCB0aXBvIGRlIGludGVydmVuY2nDs24gIAl8CnwgVmFsb3IgRmluYWwgQ29udHJhdG8gCXwgTnVtw6lyaWNvIAl8IFZhbG9yIG1vbmV0YXJpbyBkZWwgY29udHJhdG8gdG90YWwgZGUgbGEgaW50ZXJ2ZW5jacOzbiAJfAp8IEVzdGFkbyBHZW5lcmFsIENvbnRyYXRvIAl8IENhcsOhY3RlciAJfCBFc3RhZG8gZGUgYXZhbmNlIGRlbCBjb250cmF0byBkZSBsYSBpbnRlcnZlbmNpw7NuIAl8CnwgVmFsb3IgRmluYWwgQ29udHJhdG8gSW50ZXJ2ZW50b3LDrWEgCXwgTnVtw6lyaWNvIAl8IFZhbG9yIG1vbmV0YXJpbyBkZWwgY29udHJhdG8gZGUgbGEgaW50ZXJ2ZW50b3JpYSAgCXwKfCBDYXRlZ29yw61hIEludmVyc2nDs24gCXwgQ2Fyw6FjdGVyIAl8IFRpcG8gZGUgY29uc3RydWNjacOzbiB0dXJpc3RpY2EgCXwKfCBWYWxvciBJbnZlcnNpw7NuIFBvciBDYXRlZ29yw61hIAl8IE51bcOpcmljbyAJfCBWYWxvciBtb25ldGFyaW8gdG90YWwgZGVzdGluYWRvIGEgY2FkYSBjb25zdHJ1Y2Npw7NuIHR1cmlzdGljYSAJfAp8IFRpcG8gSW50ZXJ2ZW5jacOzbiAJfCBDYXLDoWN0ZXIgCXwgRXNwZWNpZmljYWNpw7NuIGRldGFsbGFkYSBkZWwgdGlwbyBkZSBpbnRlcnZlbmNpw7NuIAl8CnwgWm9uYSAJfCBDYXLDoWN0ZXIgCXwgRXNwZWNpZmljYWNpw7NuIGRlIGVzcGVjaW8gcnVyYWwgbyB1cmJhbm8gCXwKfCBFc3RhZG8gSW50ZXJ2ZW5jacOzbiAJfCBDYXLDoWN0ZXIgCXwgRXN0YWRvIGRlIGF2YW5jZSBkZSBsYSBpbnRlcnZlbmNpw7NuIAl8Cgo8YnIvPgo8Y2VudGVyPgoqVGFibGEgMjpEaWNjaW9uYXJpbyBkZSB2YXJpYWJsZXMqCjwvY2VudGVyPgo8YnIvPgo8YnIvPgoKIyAqKkxpbXBpZXphIERhdG9zKioKCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3Igd2FybmluZz1GQUxTRX0KZGF0b3M8LXJlYWRfZXhjZWwoIm1hdHJpemVzdGFkaXN0aWNhLnhsc3giKQpkYXRvczE8LXN1YnNldChkYXRvcyxkYXRvcyRgVmFsb3IgRmluYWwgQ29udHJhdG9gIT0wKQpWVEM8LXN1bShkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCwgbmEucm09VFJVRSkKZGF0b3MyPC1zdWJzZXQoZGF0b3MsZGF0b3MkYFZhbG9yIEZpbmFsIENvbnRyYXRvIEludGVydmVudG9yw61hYCE9MCkKVlRDSTwtc3VtKGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG8gSW50ZXJ2ZW50b3LDrWFgLCBuYS5ybT1UUlVFKQpkYXRvc19saW1waW9zIDwtIG5hLm9taXQoZGF0b3NbLCAiRUdDIiwgZHJvcCA9IEZBTFNFXSkKYGBgCjwvZGl2PgoKRW4gZWwgcHJvY2VzbyBkZSBsaW1waWV6YSBkZSBkYXRvcyBhcGxpY2FkbyBhIGxhcyB2YXJpYWJsZXMgcHJpbmNpcGFsZXMsIHNlIGNvbnNpZGVyYSBlc2VuY2lhbCBlbGltaW5hciBhcXVlbGxvcyB2YWxvcmVzIHF1ZSBzZWFuIGlndWFsZXMgYSBjZXJvIG8gcXVlIGVzdMOpbiBtYXJjYWRvcyBjb21vIE4vQSAobm8gZGlzcG9uaWJsZXMpLiBFc3RhIHByw6FjdGljYSBnYXJhbnRpemEgcXVlIGVzdG9zIHZhbG9yZXMgbm8gaW50ZXJmaWVyYW4gZW4gbG9zIGPDoWxjdWxvcyBzaWd1aWVudGVzLCBlc3BlY2lhbG1lbnRlIGR1cmFudGUgbGEgc3VtYSBkZSBsb3MgdmFsb3Jlcy4gRW4gZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBkYXRvcywgc2Ugc2VndWlyw6EgZXZpZGVuY2lhbmRvIGVzdGUgZW5mb3F1ZSBkZSBsaW1waWV6YSwgYXNlZ3VyYW5kbyBxdWUgbG9zIHJlc3VsdGFkb3MgcHJvcG9yY2lvbmFkb3MgY29udGluw7plbiBleGNsdXllbmRvIGVzdG9zIHZhbG9yZXMgbnVsb3MgbyBjZXJvLiBFc3RlIHByb2NlZGltaWVudG8gY29udHJpYnVpcsOhIGEgbWFudGVuZXIgbGEgaW50ZWdyaWRhZCB5IHJlbGV2YW5jaWEgZGUgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zIGVuIGxvcyBkZW3DoXMgYW7DoWxpc2lzLgoKPGJyLz4KCioqVGFibGFzIGRlIGNvbnRpbmdlbmNpYSoqCgo8YnIvPgoKKipMb2NhbGlkYWQgeSBab25hKioKCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgpkYXRvcyRWYXJpYWJsZTEgPC0gYXMuZmFjdG9yKGRhdG9zJExvY2FsaWRhZCkKZGF0b3MkVmFyaWFibGUyIDwtIGFzLmZhY3RvcihkYXRvcyRgWm9uYWApCgojIFRhYmxhIGRlIGNvbnRpbmdlbmNpYQp0YWJsYV9jb250aW5nZW5jaWEgPC0gdGFibGUoZGF0b3MkTG9jYWxpZGFkLCBkYXRvcyRgWm9uYWApCgpUYWJsYV9wcm9wb3JjaW9uZXM8LSBwcm9wLnRhYmxlKHRhYmxhX2NvbnRpbmdlbmNpYSkKVGFibGFfUDwtIGFkZG1hcmdpbnMocm91bmQodGFibGFfY29udGluZ2VuY2lhKjEwMCwzKSkKRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGFfUCxmb3JtYXQgPSAiaHRtbCIpJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IEZvcm0uYmFzaWMsZnVsbF93aWR0aCA9IEYsZm9udF9zaXplID0gMTApCgpgYGAKPC9kaXY+Cgo8YnIvPgoKKipFc3RhZG8gR2VuYXJhbCBkZWwgQ29udHJhdG8geSBFc3RhZG8gZGUgaW50ZXJ2ZW5jacOzbioqCgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQoKZGF0b3MkVmFyaWFibGUxIDwtIGFzLmZhY3RvcihkYXRvcyQnRUdDJykKZGF0b3MkVmFyaWFibGUyIDwtIGFzLmZhY3RvcihkYXRvcyQgJ0VzdGFkbyBJbnRlcnZlbmNpw7NuJykKCiMgVGFibGEgZGUgY29udGluZ2VuY2lhCnRhYmxhX2NvbnRpbmdlbmNpYSA8LSB0YWJsZShkYXRvcyQnRUdDJywgZGF0b3MkJ0VzdGFkbyBJbnRlcnZlbmNpw7NuJykKClRhYmxhX3Byb3BvcmNpb25lczwtIHByb3AudGFibGUodGFibGFfY29udGluZ2VuY2lhKQpUYWJsYV9QPC0gYWRkbWFyZ2lucyhyb3VuZCh0YWJsYV9jb250aW5nZW5jaWEqMTAwLDMpKQpGb3JtLmJhc2ljPC1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJob3ZlciIsImNvbmRlbnNlZCIsInJlc3BvbnNpdmUiKQprYWJsZShUYWJsYV9QLGZvcm1hdCA9ICJodG1sIiklPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gRm9ybS5iYXNpYyxmdWxsX3dpZHRoID0gRixmb250X3NpemUgPSAxMCkKCmBgYAoKPC9kaXY+Cjxici8+CgoqKkNhdGVnb3LDrWEgZGUgSW52ZXJzacOzbiB5IHRpcG8gZGUgY29udHJhdG8qKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KCmRhdG9zJFZhcmlhYmxlMSA8LSBhcy5mYWN0b3IoZGF0b3MkJ0NhdGVnb3LDrWEgSW52ZXJzacOzbicpCmRhdG9zJFZhcmlhYmxlMiA8LSBhcy5mYWN0b3IoZGF0b3MkJ1RpcG8gZGUgQ29udHJhdG8nKQoKIyBUYWJsYSBkZSBjb250aW5nZW5jaWEKdGFibGFfY29udGluZ2VuY2lhIDwtIHRhYmxlKGRhdG9zJCdDYXRlZ29yw61hIEludmVyc2nDs24nLCBkYXRvcyQnVGlwbyBkZSBDb250cmF0bycpCgpUYWJsYV9wcm9wb3JjaW9uZXM8LSBwcm9wLnRhYmxlKHRhYmxhX2NvbnRpbmdlbmNpYSkKVGFibGFfUDwtIGFkZG1hcmdpbnMocm91bmQodGFibGFfY29udGluZ2VuY2lhKjEwMCwzKSkKRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGFfUCxmb3JtYXQgPSAiaHRtbCIpJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IEZvcm0uYmFzaWMsZnVsbF93aWR0aCA9IEYsZm9udF9zaXplID0gMTApCgpgYGAKPC9kaXY+Cgo8YnIvPgoKKipSZWxhY2nDs24gVmFyaWFibGVzKioKCjxici8+CgoqKlBydWViYXMgZGUgQ2hpIGN1YWRyYWRvKioKCjxici8+CgoqKkxvY2FsaWRhZCB5IFpvbmEqKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7ciB3YXJuaW5nPUZBTFNFfQoKZGF0b3MkVmFyaWFibGUxIDwtIGFzLmZhY3RvcihkYXRvcyQnTG9jYWxpZGFkJykKZGF0b3MkVmFyaWFibGUyIDwtIGFzLmZhY3RvcihkYXRvcyQnWm9uYScpCgojIFRlc3QgZGUgY2hpLWN1YWRyYWRvCnJlc3VsdGFkb19jaGlfY3VhZHJhZG8gPC0gY2hpc3EudGVzdCh0YWJsZShkYXRvcyQnTG9jYWxpZGFkJywgZGF0b3MkJ1pvbmEnKSkKcHJpbnQocmVzdWx0YWRvX2NoaV9jdWFkcmFkbykKCmBgYAo8L2Rpdj4KCjxici8+CgoqKklOVEVSUFJFVEFDScOTTjoqKiBEYWRvIHF1ZSBlbCB2YWxvciBwIGVzIG11eSBwZXF1ZcOxbywgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgaW5kZXBlbmRlbmNpYSBlbnRyZSBsYXMgdmFyaWFibGVzICJMb2NhbGlkYWQiIHkgIlRpcG8gZGUgQ29udHJhdG8iLiBFbiBvdHJhcyBwYWxhYnJhcywgaGF5IGV2aWRlbmNpYSBzaWduaWZpY2F0aXZhIHBhcmEgc3VnZXJpciBxdWUgZXhpc3RlIHVuYSBhc29jaWFjacOzbiBlbnRyZSBlc3RhcyBkb3MgdmFyaWFibGVzLiBFbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIGRlIGNoaS1jdWFkcmFkbyAoMTk4MC4zKSBlcyBhbHRvLCBsbyBxdWUgaW5kaWNhIHF1ZSBoYXkgdW5hIGdyYW4gZGlmZXJlbmNpYSBlbnRyZSBsYXMgZnJlY3VlbmNpYXMgb2JzZXJ2YWRhcyB5IGxhcyBmcmVjdWVuY2lhcyBlc3BlcmFkYXMgYmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgaW5kZXBlbmRlbmNpYS4KCjxici8+CgoqKkVzdGFkbyBHZW5lcmFsIENvbnRyYXRvIHkgRXN0YWRvIEludmVyc2nDs24qKgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyIHdhcm5pbmc9RkFMU0V9CgpkYXRvcyRWYXJpYWJsZTEgPC0gYXMuZmFjdG9yKGRhdG9zJCdFR0MnKQpkYXRvcyRWYXJpYWJsZTIgPC0gYXMuZmFjdG9yKGRhdG9zJCdFc3RhZG8gSW50ZXJ2ZW5jacOzbicpCgojIFRlc3QgZGUgY2hpLWN1YWRyYWRvCnJlc3VsdGFkb19jaGlfY3VhZHJhZG8gPC0gY2hpc3EudGVzdCh0YWJsZShkYXRvcyQnRUdDJywgZGF0b3MkJ0VzdGFkbyBJbnRlcnZlbmNpw7NuJykpCnByaW50KHJlc3VsdGFkb19jaGlfY3VhZHJhZG8pCgpgYGAKPC9kaXY+CgoKPGJyLz4KCioqSU5URVJQUkVUQUNJw5NOOioqQXNvY2lhY2nDs24gU2lnbmlmaWNhdGl2YTogRGFkbyBxdWUgZWwgdmFsb3IgcCBlcyBtdXkgcGVxdWXDsW8sIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIGluZGVwZW5kZW5jaWEgZW50cmUgbGFzIHZhcmlhYmxlcyAiRUdDIiB5ICJFc3RhZG8gSW50ZXJ2ZW5jacOzbiIuIEVzdG8gc3VnaWVyZSBxdWUgaGF5IHVuYSBhc29jaWFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGVzdGFzIGRvcyB2YXJpYWJsZXMuIEVsIHZhbG9yIGRlbCBlc3RhZMOtc3RpY28gZGUgY2hpLWN1YWRyYWRvICgzNDUuMDkpIGVzIGFsdG8sIGluZGljYW5kbyBxdWUgaGF5IHVuYSBncmFuIGRpZmVyZW5jaWEgZW50cmUgbGFzIGZyZWN1ZW5jaWFzIG9ic2VydmFkYXMgeSBsYXMgZnJlY3VlbmNpYXMgZXNwZXJhZGFzIGJham8gbGEgaGlww7N0ZXNpcyBudWxhIGRlIGluZGVwZW5kZW5jaWEuCgo8YnIvPgoKKipDYXRlZ29yw61hIEludmVyc2nDs24geSBUaXBvICBDb250cmF0byoqCgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyIHdhcm5pbmc9RkFMU0V9CgpkYXRvcyRWYXJpYWJsZTEgPC0gYXMuZmFjdG9yKGRhdG9zJCdDYXRlZ29yw61hIEludmVyc2nDs24nKQpkYXRvcyRWYXJpYWJsZTIgPC0gYXMuZmFjdG9yKGRhdG9zJCdUaXBvIGRlIENvbnRyYXRvJykKCiMgVGVzdCBkZSBjaGktY3VhZHJhZG8KcmVzdWx0YWRvX2NoaV9jdWFkcmFkbyA8LSBjaGlzcS50ZXN0KHRhYmxlKGRhdG9zJCdDYXRlZ29yw61hIEludmVyc2nDs24nLCBkYXRvcyQnVGlwbyBJbnRlcnZlbmNpw7NuJykpCnByaW50KHJlc3VsdGFkb19jaGlfY3VhZHJhZG8pCgpgYGAKPC9kaXY+CgoqKklOVEVSUFJFVEFDScOTTjoqKkRhZG8gcXVlIGVsIHZhbG9yIHAgZXMgbXV5IHBlcXVlw7FvLCByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBpbmRlcGVuZGVuY2lhIGVudHJlIGxhcyB2YXJpYWJsZXMgIkNhdGVnb3LDrWEgSW52ZXJzacOzbiIgeSAiVGlwbyBJbnRlcnZlbmNpw7NuIi4gRXN0byBzdWdpZXJlIHF1ZSBoYXkgdW5hIGFzb2NpYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgZXN0YXMgZG9zIHZhcmlhYmxlcy5FbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIGRlIGNoaS1jdWFkcmFkbyAoODA4Ni41KSBlcyBhbHRvLCBpbmRpY2FuZG8gcXVlIGhheSB1bmEgZ3JhbiBkaWZlcmVuY2lhIGVudHJlIGxhcyBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHkgbGFzIGZyZWN1ZW5jaWFzIGVzcGVyYWRhcyBiYWpvIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBpbmRlcGVuZGVuY2lhCgoKKipDb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbioqCgo8YnIvPgo8Y2VudGVyPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQptYXRyaXplc3RhZGlzdGljYSA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIm1hdHJpemVzdGFkaXN0aWNhLnhsc3giKQoKY3VhbnRpIDwtIG1hdHJpemVzdGFkaXN0aWNhWywgYygiVmFsb3IgRmluYWwgQ29udHJhdG8iLCAiVmFsb3IgRmluYWwgQ29udHJhdG8gSW50ZXJ2ZW50b3LDrWEiLCAiVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYSIsICJOw7ptZXJvIENvbnRyYXRvIildCgpwYWlycyhjdWFudGksY29sPSdyZWQnLHBjaCA9IDE4LGxhYmVscyA9IGMoIlYuRi5DLiIsIlYuRi5DLiBJbnRlcnZlbnRvcsOtYSIsIlYuSS5DYXRlZ29yw61hIiwiTsO6bWVybyBDb250cmF0byIpLAogICAgICBtYWluID0gIk90cmFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIikKCmNvcnJlbGFjaW9uZXMgPC0gY29yKGN1YW50aSwgdXNlID0gImNvbXBsZXRlLm9icyIpCgpwcmludChjb3JyZWxhY2lvbmVzKQoKYGBgCgo8L2Rpdj4KCjxici8+CgoqKlZhbG9yIEZpbmFsIENvbnRyYXRvIGNvbiBvdHJhcyB2YXJpYWJsZXMqKgoKPGJyLz4KCi0gVmFsb3IgRmluYWwgQ29udHJhdG8gSW50ZXJ2ZW50b3LDrWE6IEhheSB1bmEgZnVlcnRlIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBkZSBhcHJveGltYWRhbWVudGUgMC44OCBlbnRyZSAiVmFsb3IgRmluYWwgQ29udHJhdG8iIHkgIlZhbG9yIEZpbmFsIENvbnRyYXRvIEludGVydmVudG9yw61hIi4gRXN0byBzdWdpZXJlIHF1ZSBjdWFuZG8gZWwgdmFsb3IgZGUgdW4gY29udHJhdG8gYXVtZW50YSwgZWwgdmFsb3IgZGUgbGEgaW50ZXJ2ZW50b3LDrWEgdGFtYmnDqW4gdGllbmRlIGEgYXVtZW50YXIgZGUgbWFuZXJhIHByb3BvcmNpb25hbC4KCjxici8+CgotIFZhbG9yIEludmVyc2nDs24gUG9yIENhdGVnb3LDrWE6IEhheSB1bmEgZnVlcnRlIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBkZSBhcHJveGltYWRhbWVudGUgMC45NiBlbnRyZSAiVmFsb3IgRmluYWwgQ29udHJhdG8iIHkgIlZhbG9yIEludmVyc2nDs24gUG9yIENhdGVnb3LDrWEiLiBFc3RvIGluZGljYSB1bmEgZnVlcnRlIHJlbGFjacOzbiBwb3NpdGl2YSBlbnRyZSBlbCB2YWxvciBmaW5hbCBkZWwgY29udHJhdG8geSBsYSBpbnZlcnNpw7NuIHBvciBjYXRlZ29yw61hLgoKPGJyLz4KCioqVmFsb3IgRmluYWwgQ29udHJhdG8gSW50ZXJ2ZW50b3LDrWEgY29uIG90cmFzIHZhcmlhYmxlcyoqCgo8YnIvPgoKLSBWYWxvciBJbnZlcnNpw7NuIFBvciBDYXRlZ29yw61hOiBIYXkgdW5hIGZ1ZXJ0ZSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgZGUgYXByb3hpbWFkYW1lbnRlIDAuODkgZW50cmUgIlZhbG9yIEZpbmFsIENvbnRyYXRvIEludGVydmVudG9yw61hIiB5ICJWYWxvciBJbnZlcnNpw7NuIFBvciBDYXRlZ29yw61hIi4gRXN0byBzdWdpZXJlIHVuYSByZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgZWwgdmFsb3IgZGUgbGEgaW50ZXJ2ZW50b3LDrWEgeSBsYSBpbnZlcnNpw7NuIHBvciBjYXRlZ29yw61hLgoKPGJyLz4KCioqVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYSBjb24gTsO6bWVybyBDb250cmF0byoqCgo8YnIvPgoKLSBOw7ptZXJvIENvbnRyYXRvOiBMYSBjb3JyZWxhY2nDs24gZW50cmUgIlZhbG9yIEludmVyc2nDs24gUG9yIENhdGVnb3LDrWEiIHkgIk7Dum1lcm8gQ29udHJhdG8iIGVzIGNlcmNhbmEgYSBjZXJvIChhcHJveGltYWRhbWVudGUgLTAuMDIpLCBsbyBxdWUgaW5kaWNhIHVuYSBjb3JyZWxhY2nDs24gZMOpYmlsLiBFc3RvIHN1Z2llcmUgcXVlIG5vIGhheSB1bmEgcmVsYWNpw7NuIGxpbmVhbCBjbGFyYSBlbnRyZSBlbCB2YWxvciBkZSBsYSBpbnZlcnNpw7NuIHBvciBjYXRlZ29yw61hIHkgZWwgbsO6bWVybyBkZSBjb250cmF0by4KCjxici8+CgoqKk7Dum1lcm8gQ29udHJhdG8gY29uIG90cmFzIHZhcmlhYmxlcyoqCgo8YnIvPgoKLSBMYXMgY29ycmVsYWNpb25lcyBlbnRyZSAiTsO6bWVybyBDb250cmF0byIgeSBsYXMgb3RyYXMgdmFyaWFibGVzIHNvbiBtdXkgYmFqYXMsIGNlcmNhbmFzIGEgY2Vyby4gRXN0byBzdWdpZXJlIHF1ZSBubyBoYXkgdW5hIHJlbGFjacOzbiBsaW5lYWwgZXZpZGVudGUgZW50cmUgZWwgbsO6bWVybyBkZSBjb250cmF0byB5IGxvcyBvdHJvcyB2YWxvcmVzLgoKPGJyLz4KCkVuIHJlc3VtZW4sIGxhcyBjb3JyZWxhY2lvbmVzIHBvc2l0aXZhcyBpbmRpY2FuIHF1ZSBoYXkgYXNvY2lhY2lvbmVzIGxpbmVhbGVzIHBvc2l0aXZhcyBmdWVydGVzIG8gbW9kZXJhZGFzIGVudHJlIGFsZ3VuYXMgZGUgbGFzIHZhcmlhYmxlcy4gTGFzIGNvcnJlbGFjaW9uZXMgY2VyY2FuYXMgYSBjZXJvIGluZGljYW4gdW5hIGTDqWJpbCBvIG51bGEgcmVsYWNpw7NuIGxpbmVhbC4gCgo8YnIvPgpMYSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgZW50cmUgbGFzIHZhcmlhYmxlcyBpbmRpY2EgcXVlIGVzdMOhbiByZWxhY2lvbmFkYXMgZW50cmUgc8OtIGRlIGFsZ3VuYSBtYW5lcmEuIFNpbiBlbWJhcmdvLCBlc3RhcyByZWxhY2lvbmVzIG5vIGRlYmVuIGludGVycHJldGFyc2UgY29tbyB1bmEgcmF6w7NuIHBhcmEgZWxpbWluYXIgdmFyaWFibGVzLCB5YSBxdWUgY2FkYSB1bmEgZGUgZWxsYXMgYXBvcnRhIGluZm9ybWFjacOzbiDDum5pY2EgYWwgZW50ZW5kaW1pZW50byBkZSBsb3MgY29udHJhdG9zLiBFc3RhcyB2YXJpYWJsZXMgcHVlZGVuIGVzdGFyIGNvbmVjdGFkYXMsIHBlcm8gc3UgaW5jbHVzacOzbiBlbiBlbCBhbsOhbGlzaXMgZXMgZnVuZGFtZW50YWwgcGFyYSBlbnRlbmRlciBsYSBkaXZlcnNpZGFkIGRlIGZhY3RvcmVzIHF1ZSBpbmZsdXllbiBlbiBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgY29udHJhdG9zLgoKQWwgZWxpbWluYXIgdmFyaWFibGVzIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkYXMsIHBvZHLDrWFtb3MgcGVyZGVyIGVuZm9xdWVzIGltcG9ydGFudGVzIHkgbGltaXRhciBudWVzdHJhIGNhcGFjaWRhZCBwYXJhIGFuYWxpemFyIGxvcyBjb250cmF0b3MgZGVzZGUgZGl2ZXJzYXMgcGVyc3BlY3RpdmFzLiBDYWRhIHZhcmlhYmxlLCBhdW5xdWUgcHVlZGEgY29tcGFydGlyIGNpZXJ0YSBpbmZvcm1hY2nDs24gY29uIG90cmFzLCBhcG9ydGEgc3UgcHJvcGlvIGNvbnRleHRvIMO6bmljbywgZW5yaXF1ZWNpZW5kbyBhc8OtIGxhIGNvbXByZW5zacOzbiBnZW5lcmFsIGRlIGxvcyBkYXRvcy4KCjxici8+CgoqKkRhdG9zIGF0w61waWNvcyoqCgo8YnIvPgoKRW4gZWwgw6FtYml0byBkZWwgYW7DoWxpc2lzIGRlIGRhdG9zIGVuIGVsIGNlbnRybyBkZSBnb2JpZXJubyBsb2NhbCBkZSBCb2dvdMOhLCBzZSBkYSB1bmEgYXRlbmNpw7NuIGVzcGVjaWFsIGEgbGEgcHJlc2VuY2lhIGRlIGRhdG9zIGF0w61waWNvcywgZGFkbyBxdWUgbG9zIHZhbG9yZXMgZGUgbG9zIGNvbnRyYXRvcyB0aWVuZW4gdW5hIHZhcmlhYmlsaWRhZCBzaWduaWZpY2F0aXZhLiBFc3RvcyB2YWxvcmVzIGF0cmF2aWVzYW4gdW4gcHJvY2VzbyBkZSB0cmF0YW1pZW50byBxdWUgaW1wbGljYSBsYSByZXZpc2nDs24gZGV0YWxsYWRhIGEgY2FyZ28gZGUgYW5hbGlzdGFzIGRlIGRhdG9zLiBFbCBwcm9ww7NzaXRvIGZ1bmRhbWVudGFsIGRlIGVzdGUgcHJvY2VkaW1pZW50byBlcyB2ZXJpZmljYXIgbGEgYXV0ZW50aWNpZGFkIGRlIGVzdG9zIGFudGVzIGRlIHNlciBpbnRlZ3JhZG9zIGVuIGVsIGN1YWRybyBkZSBjb250cm9sLiBFc3RhIHByw6FjdGljYSBhc2VndXJhIGxhIGludGVncmlkYWQgZGUgbGEgaW5mb3JtYWNpw7NuIHByZXNlbnRhZGEsIHBlcm1pdGllbmRvIGEgbG9zIHJlc3BvbnNhYmxlcyBkZSBsYSB0b21hIGRlIGRlY2lzaW9uZXMgYWNjZWRlciBhIGRhdG9zIHByZWNpc29zIHkgcGVydGluZW50ZXMgcGFyYSBzdXMgYW7DoWxpc2lzLiAKCiMgKipBbsOhbGlzaXMgRXhwbG9yYXRvcmlvIERhdG9zKioKCjxici8+CgpVbmEgdmV6IHJlYWxpemFkYSBsYSBsaW1waWV6YSBkZSBsb3MgZGF0b3MgcGFyYSBwb2RlciBvYnRlbmVyIGVzcGVjw61maWNhbWVudGUgc29sbyBsYSBpbmZvcm1hY2nDs24gcXVlIHJlcXVlcmVtb3MgY29uIGZpbmVzIGRlbCBlc3R1ZGlvLCBzZSBsbGV2YSBhIGxhIHByw6FjdGljYSBlbCBhbsOhbGlzaXMgZGUgdG9kb3MgbG9zIGRhdG9zLgoKPGJyLz4KClBhcmEgZWwgYW7DoWxpc2lzIHNlIGVuY3VlbnRyYW4gbGFzIG1lZGlkYXMgZGUgdGVuZGVuY2lhIGNlbnRyYWwgZGUgbGEgYmFzZSBkZSBkYXRvcy4KCjxici8+CgoqKlZhcmlhYmxlIOKAnHZhbG9yIGZpbmFsIGNvbnRyYXRvIGludGVydmVudG9yaWHigJ0qKgoKPGJyLz4KCioqTWVkaWEqKgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9Cm1lZGlhVkZDSTwtbWVhbihkYXRvczIkYFZhbG9yIEZpbmFsIENvbnRyYXRvIEludGVydmVudG9yw61hYCk7bWVkaWFWRkNJCmBgYAo8L2Rpdj4KCioqTWVkaWFuYSoqCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KbWVkaWFuYVZGQ0k8LW1lZGlhbihkYXRvczIkYFZhbG9yIEZpbmFsIENvbnRyYXRvIEludGVydmVudG9yw61hYCk7bWVkaWFuYVZGQ0kKYGBgCjwvZGl2PgoKKipWYXJpYW56YSoqCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KVmFyaWFuemFWRkNJPC12YXIoZGF0b3MyJGBWYWxvciBGaW5hbCBDb250cmF0byBJbnRlcnZlbnRvcsOtYWApO1ZhcmlhbnphVkZDSQpgYGAKPC9kaXY+CgpSZWFsaXphbmRvIGVsIGVzdHVkaW8gZGVsIHZhbG9yIGZpbmFsIGRlIGNvbnRyYXRvIGRlIGludGVydmVudG9yaWEgb2JzZXJ2YW1vcyBxdWUgZW4gcHJvbWVkaW8gZWwgdmFsb3IgZGUgbG9zIGNvbnRyYXRvcyByZWFsaXphZG9zIGVzIGRlICoqJDM1NC41MzMuNDc1KiogeSBlbCBjb250cmF0byBxdWUgc2UgZW5jdWVudHJhIGVuIGxhIHBvc2ljacOzbiBjZW50cmFsIGRlIHRvZGEgbGEgbXVlc3RyYSB0aWVuZSB1biB2YWxvciBkZSAqKiQxNjUuMTU3LjA2NioqLiBFbiBlbCBjb250ZXh0byBkZSBsYSB2YXJpYW56YSwgZXN0ZSByZXN1bHRhZG8gaW5kaWNhIHF1ZSBoYXkgdW5hIGdyYW4gZGlzcGVyc2nDs24gZW4gbG9zIHZhbG9yZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLgoKPGJyLz4KCioqVmFsb3IgdG90YWwgZGUgY29udHJhdG9zIGludGVydmVudG9yaWEqKgoKPGJyLz4KPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQpWVENJPC1zdW0oZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0byBJbnRlcnZlbnRvcsOtYWAsIG5hLnJtPVRSVUUpO1ZUQ0kKYGBgCjwvZGl2PgoKTGEgc3VtYSBkZSBjb250cmF0b3MgdG90YWwgZGUgaW50ZXJ2ZW50b3JpYSBlbiBlbCBhw7FvIDIwMjMgZmluYWxtZW50ZSBtdWVzdHJhIHF1ZSBlbiB0b3RhbCBlbCBlc3RhZG8gaW52aXJ0acOzICoqJDUwLjM0My43NTMuNTEwKiogZW4gZWwgc2VndWltaWVudG8gdMOpY25pY28geSB2aWdpbGFuY2lhIGRlIGxvcyBjb250cmF0b3MgZGUgdG9kYXMgbGFzIG9icmFzIGRlIHR1cmlzbW8gY29uIGVsIG9iamV0aXZvIGRlIHN1cGVydmlzYXIgbGEgZmluYWxpemFjacOzbiBleGl0b3NhIGRlIGVzdG9zIG1pc21vcy4KCjxici8+CgoqKlZhcmlhYmxlIOKAnHZhbG9yIGZpbmFsIGNvbnRyYXRv4oCdKioKPGJyLz4KCioqTWVkaWEqKgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3IsZWNobz1GfQptZWRpYVZGQzwtbWVhbihkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCk7bWVkaWFWRkMKYGBgCjwvZGl2PgoKKipNZWRpYW5hKioKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyLGVjaG89Rn0KbWVkaWFuYVZGQzwtbWVkaWFuKGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gKTttZWRpYW5hVkZDCmBgYAo8L2Rpdj4KCioqVmFyaWFuemEqKgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9ClZhcmlhbnphVkZDPC12YXIoZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2ApO1ZhcmlhbnphVkZDCmBgYAo8L2Rpdj4KClBvciBvdHJvIGxhZG8sIHNlIGlkZW50aWZpY2EgcXVlIGVuIHByb21lZGlvIGVsIHZhbG9yIGRlIGxvcyBjb250cmF0b3MgcmVhbGl6YWRvcyBxdWUgc29uIGRlc3RpbmFkb3MgYSBsYSBpbnZlcnNpw7NuIGRlbCB0dXJpc21vIGVuIGxhIGNpdWRhZCBkZSBCb2dvdMOhIGVzIGRlICoqJDIuNTc4LjE3Mi40MTYqKiB5IGVsIGNvbnRyYXRvIHF1ZSBzZSBlbmN1ZW50cmEgZW4gbGEgcG9zaWNpw7NuIGNlbnRyYWwgZGUgdG9kYSBsYSBtdWVzdHJhIG9yZGVuYWRhIHkgdGllbmUgdW4gdmFsb3IgZGUgKiokODQwLjUxOC4xODEqKi4gRGUgaWd1YWwgbWFuZXJhIHF1ZSBlbCBjYXNvIGFudGVyaW9yIHJlc3BlY3RvIGEgbGEgdmFyaWFuemEsIGVzdGUgcmVzdWx0YWRvIGluZGljYSBxdWUgaGF5IHVuYSBncmFuIGRpc3BlcnNpw7NuIGVuIGxvcyB2YWxvcmVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4KPGJyLz4KCioqVmFsb3IgdG90YWwgZGUgY29udHJhdG9zIGdlbmVyYWxlcyoqCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3IsZWNobz1GfQpWVEM8LXN1bShkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCwgbmEucm09VFJVRSk7VlRDCmBgYAo8L2Rpdj4KPGJyLz4KCkxhIHN1bWEgZGUgY29udHJhdG9zIGVuIGVsIGHDsW8gMjAyMyBmaW5hbG1lbnRlIG11ZXN0cmEgcXVlIGVuIHRvdGFsIGVsIGVzdGFkbyBpbnZpcnRpw7MgKiokNTU0LjMwNy4wNjkuNDMzKiogZW4gZWwgc2VjdG9yIGRlIHR1cmlzbW8geSBlc3RvcyBzZSBkaXZpZGllcm9uIGVuIGRpZmVyZW50ZXMgdGlwb3MgZGUgaW50ZXJ2ZW5jaW9uZXMsIGRlbnRybyBkZSBsYXMgY3VhbGVzIGRlc3RhY2FuIGxhcyBzaWd1aWVudGVzIGNhdGVnb3JpYXMgY29uIHN1cyByZXNwZWN0aXZvcyB2YWxvcmVzOgoKPGJyLz4KCioqSW50ZXJ2ZW5jacOzbiAxOiBNYW50ZW5pbWllbnRvKioKCjxici8+CmBgYHtyLGluY2x1ZGU9RkFMU0V9CmRhdG9zbWFudGVuaW1pZW50bzwtc3Vic2V0KGRhdG9zMSxkYXRvczEkYFRpcG8gSW50ZXJ2ZW5jacOzbmA9PSJNYW50ZW5pbWllbnRvIik7ZGF0b3NtYW50ZW5pbWllbnRvCmBgYAoKYGBge3IsZWNobz1GfQpNYW50ZW5pbWllbnRvPC1yZWFkX2V4Y2VsKCJNYW50ZW5pbWllbnRvLnhsc3giKQpUYWJsYTwtZGF0b3NtYW50ZW5pbWllbnRvPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09Ik1hbnRlbmltaWVudG8iKVsxOjUsMToxMV0KRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGEsZm9ybWF0ID0gImh0bWwiKSU+JQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gRm9ybS5iYXNpYyxmdWxsX3dpZHRoID0gRixmb250X3NpemUgPSA4LCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKPGNlbnRlcj4KCipUYWJsYSAzOkludGVydmVuY2lvbmVzIGRlIG1hbnRlbmltaWVudG8gY2l1ZGFkIGRlIEJvZ290w6EqCgo8YnIvPgo8L2NlbnRlcgpgYGB7cixlY2hvPUZ9CnZhbG9ybWFudGVuaW1pZW50bzwtc3VtKGRhdG9zbWFudGVuaW1pZW50byRgVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYWAsbmEucm0gPSBUUlVFKTt2YWxvcm1hbnRlbmltaWVudG8KYGBgCjxici8+CgoqKkludGVydmVuY2nDs24gMjogQ29uc2VydmFjacOzbioqCgo8YnIvPgpgYGB7cixpbmNsdWRlPUZ9CmRhdG9zY29uc2VydmFjaW9uPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09IkNvbnNlcnZhY2nDs24iKTtkYXRvc2NvbnNlcnZhY2lvbgpgYGAKCmBgYHtyLGVjaG89Rn0KQ29uc2VydmFjaW9uPC1yZWFkX2V4Y2VsKCJDb25zZXJ2YWNpb24ueGxzeCIpClRhYmxhPC1kYXRvc2NvbnNlcnZhY2lvbjwtc3Vic2V0KGRhdG9zMSxkYXRvczEkYFRpcG8gSW50ZXJ2ZW5jacOzbmA9PSJDb25zZXJ2YWNpw7NuIilbMTo1LDE6MTFdCkZvcm0uYmFzaWM8LWMoInN0cmlwZWQiLCJib3JkZXJlZCIsImhvdmVyIiwiY29uZGVuc2VkIiwicmVzcG9uc2l2ZSIpCmthYmxlKFRhYmxhLGZvcm1hdCA9ICJodG1sIiklPiUKa2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IEZvcm0uYmFzaWMsZnVsbF93aWR0aCA9IEYsZm9udF9zaXplID0gOCwgcG9zaXRpb24gPSAiY2VudGVyIikKYGBgCjxjZW50ZXI+CgoqVGFibGEgNDpJbnRlcnZlbmNpb25lcyBkZSBjb25zZXJ2YWNpw7NuIGNpdWRhZCBkZSBCb2dvdMOhKgoKPGJyLz4KPC9jZW50ZXIKYGBge3IsZWNobz1GQUxTRX0KdmFsb3Jjb25zZXJ2YWNpb248LXN1bShkYXRvc2NvbnNlcnZhY2lvbiRgVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYWAsbmEucm0gPSBUUlVFKTt2YWxvcmNvbnNlcnZhY2lvbgpgYGAKPGJyLz4KCioqSW50ZXJ2ZW5jacOzbiAzOiBDb25zdHJ1Y2Npw7NuKioKCjxici8+CmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRSwgaW5jbHVkZT1GfQpkYXRvc2NvbnN0cnVjY2lvbjwtc3Vic2V0KGRhdG9zMSxkYXRvczEkYFRpcG8gSW50ZXJ2ZW5jacOzbmA9PSJDb25zdHJ1Y2Npw7NuIik7ZGF0b3Njb25zdHJ1Y2Npb24KYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsZWNobz1GfQpDb25zdHJ1Y2Npb248LXJlYWRfZXhjZWwoIkNvbnN0cnVjY2lvbi54bHN4IikKVGFibGE8LWRhdG9zY29uc3RydWNjaW9uPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09IkNvbnN0cnVjY2nDs24iKVsxOjUsMToxMV0KRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGEsZm9ybWF0ID0gImh0bWwiKSU+JQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gRm9ybS5iYXNpYyxmdWxsX3dpZHRoID0gRixmb250X3NpemUgPSA4LCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKPGNlbnRlcj4KCipUYWJsYSA1OkludGVydmVuY2lvbmVzIGRlIGNvbnN0cnVjY2nDs24gY2l1ZGFkIGRlIEJvZ290w6EqCgo8YnIvPgo8L2NlbnRlcgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0UsZWNobz1GQUxTRX0KdmFsb3Jjb25zdHJ1Y2Npb248LXN1bShkYXRvc2NvbnN0cnVjY2lvbiRgVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYWAsbmEucm0gPSBUUlVFKTt2YWxvcmNvbnN0cnVjY2lvbgpgYGAKPGJyLz4KCioqSW50ZXJ2ZW5jacOzbiA0OiBBZGVjdWFjacOzbioqCgo8YnIvPgoKYGBge3IsaW5jbHVkZT1GfQpkYXRvc2FkZWN1YWNpb248LXN1YnNldChkYXRvczEsZGF0b3MxJGBUaXBvIEludGVydmVuY2nDs25gPT0iQWRlY3VhY2nDs24iKTtkYXRvc2FkZWN1YWNpb24KYGBgCgpgYGB7cixlY2hvPUZ9CkFkZWN1YWNpb248LXJlYWRfZXhjZWwoIkFkZWN1YWNpb24ueGxzeCIpClRhYmxhPC1kYXRvc2FkZWN1YWNpb248LXN1YnNldChkYXRvczEsZGF0b3MxJGBUaXBvIEludGVydmVuY2nDs25gPT0iQWRlY3VhY2nDs24iKVsxOjMsMToxMV0KRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGEsZm9ybWF0ID0gImh0bWwiKSU+JQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gRm9ybS5iYXNpYyxmdWxsX3dpZHRoID0gRixmb250X3NpemUgPSA4LCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKPGNlbnRlcj4KCipUYWJsYSA2OkludGVydmVuY2lvbmVzIGRlIGFkZWN1YWNpw7NuIGNpdWRhZCBkZSBCb2dvdMOhKgoKPGJyLz4KPC9jZW50ZXIKYGBge3IsZWNobz1GfQp2YWxvcmFkZWN1YWNpb248LXN1bShkYXRvc2FkZWN1YWNpb24kYFZhbG9yIEludmVyc2nDs24gUG9yIENhdGVnb3LDrWFgLG5hLnJtID0gVFJVRSk7dmFsb3JhZGVjdWFjaW9uCmBgYAo8YnIvPgoKKipJbnRlcnZlbmNpw7NuIDU6IEVzdHVkaW9zIHkgZGlzZcOxb3MqKgoKPGJyLz4KYGBge3IsaW5jbHVkZT1GfQpkYXRvc2VzdHlkaXM8LXN1YnNldChkYXRvczEsZGF0b3MxJGBUaXBvIEludGVydmVuY2nDs25gPT0iRXN0dWRpb3MgeSBEaXNlw7FvcyIpO2RhdG9zZXN0eWRpcwpgYGAKYGBge3IsZWNobz1GfQpFc3R5ZGlzPC1yZWFkX2V4Y2VsKCJFc3R5ZGlzLnhsc3giKQpUYWJsYTwtZGF0b3Nlc3R5ZGlzPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09IkVzdHVkaW9zIHkgRGlzZcOxb3MiKVsxOjUsMToxMV0KRm9ybS5iYXNpYzwtYygic3RyaXBlZCIsImJvcmRlcmVkIiwiaG92ZXIiLCJjb25kZW5zZWQiLCJyZXNwb25zaXZlIikKa2FibGUoVGFibGEsZm9ybWF0ID0gImh0bWwiKSU+JQprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gRm9ybS5iYXNpYyxmdWxsX3dpZHRoID0gRixmb250X3NpemUgPSA4LCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKPGNlbnRlcj4KCipUYWJsYSA3OkludGVydmVuY2lvbmVzIGRlIGVzdHVkaW9zIHkgZGlzZcOxb3MgY2l1ZGFkIGRlIEJvZ290w6EqCgo8YnIvPgo8L2NlbnRlcgpgYGB7cixlY2hvPUZ9CnZhbG9yZXN0eWRpczwtc3VtKGRhdG9zZXN0eWRpcyRgVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYWAsbmEucm0gPSBUUlVFKTt2YWxvcmVzdHlkaXMKYGBgCjxici8+CgoqKkludGVydmVuY2nDs24gNjogTGltcGllemEgZGUgVmFsbGFkb3MqKgoKPGJyLz4KCmBgYHtyLGluY2x1ZGU9Rn0KZGF0b3NsaW12YWxsPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09IkxpbXBpZXphIHZhbGxhZG9zIik7ZGF0b3NsaW12YWxsCmBgYAoKCmBgYHtyLGVjaG89Rn0KdmFsb3JsaW12YWxsPC1zdW0oZGF0b3NsaW12YWxsJGBWYWxvciBJbnZlcnNpw7NuIFBvciBDYXRlZ29yw61hYCxuYS5ybSA9IFRSVUUpO3ZhbG9ybGltdmFsbApgYGAKPGJyLz4KCioqSW50ZXJ2ZW5jacOzbiA3OiBSZWhhYmlsaXRhY2nDs24qKgoKPGJyLz4KCmBgYHtyLGluY2x1ZGU9Rn0KZGF0b3NSZWhhYjwtc3Vic2V0KGRhdG9zMSxkYXRvczEkYFRpcG8gSW50ZXJ2ZW5jacOzbmA9PSJSZWhhYmlsaXRhY2nDs24iKTtkYXRvc1JlaGFiCmBgYAoKYGBge3IsZWNobz1GfQpSZWhhYmlsaXRhY2lvbjwtcmVhZF9leGNlbCgiUmVoYWJpbGl0YWNpb24ueGxzeCIpClRhYmxhPC1kYXRvc1JlaGFiPC1zdWJzZXQoZGF0b3MxLGRhdG9zMSRgVGlwbyBJbnRlcnZlbmNpw7NuYD09IlJlaGFiaWxpdGFjacOzbiIpWzE6MywxOjExXQpGb3JtLmJhc2ljPC1jKCJzdHJpcGVkIiwiYm9yZGVyZWQiLCJob3ZlciIsImNvbmRlbnNlZCIsInJlc3BvbnNpdmUiKQprYWJsZShUYWJsYSxmb3JtYXQgPSAiaHRtbCIpJT4lCmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBGb3JtLmJhc2ljLGZ1bGxfd2lkdGggPSBGLGZvbnRfc2l6ZSA9IDgsIHBvc2l0aW9uID0gImNlbnRlciIpCmBgYAo8Y2VudGVyPgoKKlRhYmxhIDg6SW50ZXJ2ZW5jaW9uZXMgZGUgcmVoYWJpbGl0YWNpw7NuIGNpdWRhZCBkZSBCb2dvdMOhKgoKPC9jZW50ZXIKYGBge3IsZWNobz1GfQp2YWxvclJlaGFiPC1zdW0oZGF0b3NSZWhhYiRgVmFsb3IgSW52ZXJzacOzbiBQb3IgQ2F0ZWdvcsOtYWAsbmEucm0gPSBUUlVFKTt2YWxvclJlaGFiCmBgYAo8YnIvPgo8YnIvPgoKKipSZXN1bWVuIGRlIHZhbG9yZXMgcG9yIGNhdGVnb3LDrWFzIGRlIGludmVyc2nDs24qKgoKPGJyLz4KCnwgQ0FURUdPUsONQSBERSBJTlZFUlNJw5NOIAl8IFZBTE9SIAl8Cnw6LS0tOgl8Oi0tLToJfAp8IE1hbnRlbmltaWVudG8gCXwgJDUuMjk5LjE1MS4zMTYgCXwKfCBDb25zZXJ2YWNpw7NuIAl8ICQxMi44MTguNjQ1LjMzNSAJfAp8IENvbnN0cnVjY2nDs24gCXwgJDIyLjM3Ni44NzQuNDkzIAl8CnwgQWRlY3VhY2nDs24gCXwgJDY4My4yNjMuNzQxIAl8CnwgRXN0dWRpb3MgeSBkaXNlw7FvcyAJfCAkOS41ODMuMjU1Ljk5OCAJfAp8IExpbXBpZXphIGRlIFZhbGxhZG9zIAl8ICQxLjA3OS4yMzYuMDQ2IAl8CnwgUmVoYWJpbGl0YWNpw7NuIAl8ICQ2MTAuNzI2LjU2NiAJfAoKPGNlbnRlcj4KKlRhYmxhIDk6UmVzdW1lbiB2YWxvcmVzIGRlIGludGVydmVuY2nDs24gY2l1ZGFkIGRlIEJvZ290w6EqCgo8L2NlbnRlcgo8YnIvPgo8YnIvPgoKIyMgKipSZXByZXNlbnRhY2nDs24gR3LDoWZpY2EqKgoKPGJyLz4KCioqWm9uYSBkZSBpbnRlcnZlbmNpw7NuKioKCjxjZW50ZXI+Cjxici8+CjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KYmFycGxvdCh0YWJsZShkYXRvcyRab25hKSxtYWluID0gIlRpcG8gZGUgWm9uYSBJbnRlcnZlbmlkYSIsIHhsYWI9IlpvbmEiICwgeWxhYj0iQ29udGVvIiwgY29sPWMoImJsdWUiLCJyZWQiKSwgeWxpbSA9IGMoMCw0MDAwKSApCmBgYAo8ZGl2Lz4KPC9jZW50ZXI+CgpJbnRlcnByZXRhbmRvIGVsIGdyw6FmaWNvIGRlIGJhcnJhcyBjb3JyZXNwb25kaWVudGUgYSBsYSB2YXJpYWJsZSAiem9uYSIsIHNlIHB1ZWRlIGlkZW50aWZpY2FyIHF1ZSBlbiBlbCDDoXJlYSBkZSBlc3R1ZGlvIGRlIGxhIGNpdWRhZCBkZSBCb2dvdMOhLCBlbCB0aXBvIGRlIHpvbmEgcXVlIHRpZW5lIG1heW9yIGludGVydmVuY2nDs24gaW50ZXJ2ZW5pZGEgZXMgZGUgdGlwbyB1cmJhbm8uCjxici8+Cjxici8+CgoqKkludGVydmVuY2nDs24gbG9jYWxpZGFkIGVuIEJvZ290w6EqKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KCmNvbG9yZXMxIDwtIGMoIiMwMEY1RkYiLCAiIzVDQUNFRSIsICIjQzZFMkZGIiwgIiMyNzQwOEIiKQoKTG9jYWxpZGFkPC1zdWJzZXQoZGF0b3Msc2VsZWN0PUxvY2FsaWRhZCkKcGllKHRhYmxlKExvY2FsaWRhZCksbWFpbiA9ICJJbnRlcnZlbmNpb25lcyBwb3IgTG9jYWxpZGFkIiwgcj0xLjA4LCBjZXg9MC41LCBjb2wgPSBjb2xvcmVzMSkKCmBgYAoKPC9kaXY+Cgo8L2NlbnRlcj4KPGJyLz4KCkVuIGVsIGRpYWdyYW1hIGRlIHBhc3RlbCBkZSBpbnRlcnZlbmNpw7NuIHBvciBsb2NhbGlkYWQgcG9kZW1vcyBpZGVudGlmaWNhciBxdWUgbGEgbcOhcyBpbnRlcnZlbmlkYSBlcyBFbmdhdGl2w6EsIHNlZ3VpZG8gZGUgS2VubmVkeSwgU3ViYSB5IENpdWRhZCBCb2zDrXZhciwgbWllbnRyYXMgcXVlIGxhcyBsb2NhbGlkYWRlcyBtZW5vcyBpbnRlcnZlbmlkYXMgc29uIENhbmRlbGFyaWEsIENoYXBpbmVybyB5IFR1bmp1ZWxpdG8sIGxvIGN1YWwgbm9zIGF5dWRhIGEgaW5mZXJpciBxdWUgYXVucXVlIGVuIGVzdGFzIGxvY2FsaWRhZGVzIGhheSB2YXJpYXMgem9uYXMgdHVyw61zdGljYXMgYXVuIGFzw60gbm8gc2UgZXZpZGVuY2lhbiBpbnRlcnZlbmNpb25lcyBwYXJhIGxhIG1lam9yYSB5IGV4cGFuc2nDs24gZGUgbHVnYXJlcywgZW4gZXNwZWNpYWwgQ2FuZGVsYXJpYSwgZG9uZGUgc2UgZGViZXLDrWEgZXN0YXIgaW52aXJ0aWVuZG8gZW4gbWF5b3IgY2FudGlkYWQgeWEgcXVlIGNvbW8gc2Ugc2FiZSBlcyBsYSBsb2NhbGlkYWQgZG9uZGUgdGFudG8gdmlzaXRhbnRlcyBjb21vIGxvY2FsZXMgZWxpZ2VuIG3DoXMgcGFyYSBlbCBnb3pvIGRlIGRpZmVyZW50ZXMgYWN0aXZpZGFkZXMgeSB0aWVtcG9zIGRlIG9jaW8gZGViaWRvIGEgbGEgY3VsdHVyYSBxdWUgYWxsw60gcHJlc2VudGEgbGEgY2l1ZGFkLgoKT3RyYSBjb25jbHVzacOzbiBpbmZlcmlkYSBhIHBhcnRpciBkZWwgZ3JhZmljbyBlcyBlbCBiYWxhbmNlIGRlIHR1cmlzbW8sIGVzIGJlbmVmaWNpb3NvIHlhIHF1ZSBleGlzdGVuIGFsZ3Vub3MgcHVudG9zIGNsYXZlIGRvbmRlIHNlIGRpc2ZydXRhIGRlbCB0dXJpc21vIHkgc2UgY29uY2VudHJhIGxhIG1heW9yIHBhcnRlIGRlIGVzcGFjaW9zOyBhbCBkaXN0cmlidWlyIGNvbW8gY29tZW56YXIgYSBjb25zdHJ1aXIgZW4gb3RyYXMgbG9jYWxpZGFkZXMgbGFzIHBlcnNvbmFzIHRlbmRyw6FuIHZhcmlhcyBvcGNpb25lcyBwYXJhIHBvZGVyIHJlYWxpemFyIHR1cmlzbW8gZW4gQm9nb3TDoSB5IGxvcyBoYWJpdGFudGVzIGxvY2FsZXMgbm8gdG9tYXLDoW4gdmlhamVzIHRhbiBleHRlbnNvcyBhdHJhdmVzYW5kbyBsYSBjaXVkYWQgcGFyYSBwb2RlciBkaXNmcnV0YXIgZGVsIHR1cmlzbW8gZGUgbGEgY2FwaXRhbCBkZWwgcGHDrXMuCjxici8+CgoqKkVzdGFkbyBnZW5lcmFsIGRlIGxvcyBjb250cmF0b3MqKgoKPGJyLz4KPGNlbnRlcj4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KCmJhcnBsb3QodGFibGUoZGF0b3MkRUdDKSwgbWFpbiA9ICJFc3RhZG8gR2VuYXJhbCBkZSBDb250cmF0byIsIHhsYWIgPSAiRXN0YWRvIGRlbCBDb250cmF0byIsIHlsYWIgPSAiQ29udGVvIiwgY29sID0gYygiZ3JlZW4iLCAicHVycGxlIiksIGxhcyA9IDIsIGNleC5uYW1lcyA9IDAuNTUsIHlsaW0gPSBjKDAsIDEwMCkpCgpgYGAKPGRpdi8+Cgo8L2NlbnRlcj4KCkVzdGUgZ3JhZmljbyBkZSBiYXJyYXMgbm9zIG11ZXN0cmEgcXVlIGVsIG1heW9yIHBvcmNlbnRhamUgZGUgbG9zIGVzdGFkb3MgZGUgbG9zIGNvbnRyYXRvcyBlc3TDoW4gRmluYWxpemFkb3MgbyBlbiBlamVjdWNpw7NuIHkgZW4gdW4gcG9yY2VudGFqZSByZWR1Y2lkbyBlc3TDoW4gaW5jdW1wbGlkb3MsIHN1c3BlbmRpZG9zIG8gcG9yIGluaWNpYXIuCjxici8+CgoqKkVzdGFkbyBnZW5lcmFsIGRlIGludGVydmVuY2nDs24qKgoKPGJyLz4KPGNlbnRlcj4KPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQoKY29sb3JlczIgPC0gYygiI0ZGRTdCQSIsICIjRkY3MjU2IiwgIiNGRjgyNDciLCAiI0VFODI2MiIsIiNGRkE1MDAiKQoKRXN0YWRvX2ludGVydmVuY2lvbjwtc3Vic2V0KGRhdG9zLHNlbGVjdD1gRXN0YWRvIEludGVydmVuY2nDs25gKQpwaWUodGFibGUoRXN0YWRvX2ludGVydmVuY2lvbiksbWFpbiA9ICJFc3RhZG8gZGUgSW50ZXJ2ZW5jaW9uIiwgcj0xLjA4LCBjb2wgPSBjb2xvcmVzMikKYGBgCjxkaXYvPgo8L2NlbnRlcj4KCgojICoqRGlzdHJpYnVjacOzbiBEaXNjcmV0YSoqCjxici8+CgpQb3IgbWVkaW8gZGUgZGlzdHJpYnVjaW9uZXMgZGlzY3JldGFzIGFzb2NpYWRhcyBhIGxhcyB2YXJpYWJsZXMgc2UgcmVhbGl6YSB1bmEgcmVwcmVzZW50YWNpw7NuIGRlIGxvcyBkYXRvcyBjb3JyZXNwb25kaWVudGVzIGEgbGEgYmFzZSBkZSBkYXRvcyAqKk1hdHJpeiBCb2dvdMOhIFR1cmlzbW8qKiBjb24gZWwgZmluIGRlIG9ic2VydmFyIHN1IGNvbXBvcnRhbWllbnRvIGNvbiBheXVkYSBkZSBtZWRpZGFzIGRlc2NyaXB0aXZhcyBjb21vIGxhIG1lZGlhLCBsYSB2YXJpYW56YSB5IGxhIHNpbWV0csOtYSBhIHBhcnRpciBkZSBleHBlcmltZW50b3MgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGhhY2lhIGxhcyB2YXJpYWJsZXMgZW4gbGFzIHF1ZSBlc3TDoSBlbmZvY2FkbyBlbCBwcm95ZWN0by4KPGJyLz4KPGJyLz4KCiMjICoqRGlzdHJpYnVjacOzbiBCaW5vbWlhbCoqCjxici8+CgpFbCBlc3RhZG8gZ2VuZXJhbCBkZSB1biBjb250cmF0byBzZSBwdWVkZSBjbGFzaWZpY2FyIGVuIDYgY2F0ZWdvcsOtYXMgbGFzIGN1YWxlcyBzb246IAo8YnIvPgoKLSBFbiBlamVjdWNpw7NuCi0gSW5jdW1wbGltaWVudG8KLSBMaXF1aWRhZG8KLSBQb3IgaW5pY2lhcgotIFN1c3BlbmRpZG8KLSBUZXJtaW5hZG8gCjxici8+CgpQYXJhIHBvZGVyIGV2aWRlbmNpYXIgZWwgYXZhbmNlIGRlIGxhcyBpbnZlcnNpb25lcyBlbiB0dXJpc21vIGVuIGxhIGNpdWRhZCBkZSBCb2dvdMOhIGRlIG1hbmVyYSByZWFsIHkgZ2FyYW50aXphciBxdWUgbG9zIGNpdWRhZGFub3MgcHVlZGFuIHV0aWxpemFyIGxvcyBlc3BhY2lvcyBvIHNlIGNvbnRlbXBsZSBsYSBpZGVhIGRlIHF1ZSBlbiB1biBmdXR1cm8gY2VyY2FubyBzZSBwdWVkYW4gdXRpbGl6YXIsIGVsIGNvbnRyYXRvIGRlYmUgZXN0YXIgZW4gZG9zIGVzdGFkb3MgZ2VuZXJhbGVzOiAKCioqRW4gZWplY3VjacOzbjoqKiBEZWJpZG8gYSBxdWUgc2UgZ2FyYW50aXphIHF1ZSBhY3R1YWxtZW50ZSBzZSBlbmN1ZW50cmFuIGVuIGNvbnN0cnVjY2nDs24geSBsYSBvYnJhIG5vIGVzdMOhIGRldGVuaWRhLgoKICoqVGVybWluYWRvOioqIERlYmlkbyBhIHF1ZSBzaSBlbCBjb250cmF0byBmaW5hbGl6byBzaWduaWZpY2EgcXVlIGxhIG9icmEgeWEgZXN0w6EgY3VsbWluYWRhIHkgZWwgZXNwYWNpbyBhY3R1YWxtZW50ZSBzZSBlbmN1ZW50cmEgYSBkaXNwb3NpY2nDs24gZGUgdG9kb3MgbG9zIGNpdWRhZGFub3MuCiAKIDxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgojIFByb2JhYmlsaWRhZCBjb250cmF0b3MgdGVybWluYWRvcwpwcm9iX3RlciA8LSBzdW0oZGF0b3NfbGltcGlvcyRFR0MgPT0gIlRlcm1pbmFkbyIsIG5hLnJtID0gVFJVRSkgLyBucm93KGRhdG9zX2xpbXBpb3MpCgpwcmludChwYXN0ZSgiUHJvYmFiaWxpZGFkIGRlIHF1ZSBsb3MgY29udHJhdG9zIGVzdGVuIGVzIGVzdGFkbyB0ZXJtaW5hZG8gZXMgOiIsCiAgICAgICAgICAgIHJvdW5kKHByb2JfdGVyLCAyKSkpCgpgYGAKPC9kaXY+Cgo8YnIvPgoKTGEgcHJvYmFiaWxpZGFkIGRlIHNlbGVjY2lvbmFyIGxvcyBjb250cmF0b3MgZGUgbGFzIGxvY2FsaWRhZGVzIHF1ZSBlc3TDqW4gZW4gZXN0YWRvIHRlcm1pbmFkbyBlcyBkZWwgNDUlLgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQoKIyBQcm9iYWJpbGlkYWQgY29udHJhdG9zIHRlcm1pbmFkb3MKcHJvYl9lamUgPC0gc3VtKGRhdG9zX2xpbXBpb3MkRUdDID09ICJFbiBlamVjdWNpw7NuIiwgbmEucm0gPSBUUlVFKSAvIG5yb3coZGF0b3NfbGltcGlvcykKCnByaW50KHBhc3RlKCJQcm9iYWJpbGlkYWQgZGUgcXVlIGxvcyBjb250cmF0b3MgZXN0ZW4gZXMgZXN0YWRvIGRlIGVqZWN1Y2nDs24gZXMgOiIsCiAgICAgICAgICAgIHJvdW5kKHByb2JfZWplLCAyKSkpCmBgYAo8L2Rpdj4KPGJyLz4KCkxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciBsb3MgY29udHJhdG9zIGRlIGxhcyBsb2NhbGlkYWRlcyBxdWUgZXN0w6luIGVuIGVzdGFkbyBkZSBlamVjdWNpw7NuIGVzIGRlbCAzNSUuCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgojIEVzdGFkb3MKZXN0YWRvcyA8LSBjKCJMaXF1aWRhZG8iLCAiU3VzcGVuZGlkbyIsICJQb3IgaW5pY2lhciIsICJJbmN1bXBsaW1pZW50byIpCnByb2JhYmlsaWRhZGVzIDwtIG51bWVyaWMobGVuZ3RoKGVzdGFkb3MpKQoKIyBQcm9iYWJpbGlkYWRlcyBwYXJhIGNhZGEgZXN0YWRvCmZvciAoaSBpbiBzZXFfYWxvbmcoZXN0YWRvcykpIHsKICBwcm9iX2VzdGFkbyA8LSBzdW0oZGF0b3NfbGltcGlvcyRFR0MgPT0gZXN0YWRvc1tpXSwgbmEucm0gPSBUUlVFKSAvIG5yb3coZGF0b3NfbGltcGlvcykKICBwcm9iYWJpbGlkYWRlc1tpXSA8LSBwcm9iX2VzdGFkbwp9CgojIFN1bWFyIGxhcyBwcm9iYWJpbGlkYWRlcwpwcm9iX290cm9zIDwtIHN1bShwcm9iYWJpbGlkYWRlcykKCiMgSW1wcmltaXIgbGEgc3VtYSBkZSBwcm9iYWJpbGlkYWRlcyBjb24gMiBkZWNpbWFsZXMKcHJpbnQocGFzdGUoIlN1bWEgZGUgcHJvYmFiaWxpZGFkZXM6Iiwgc3ByaW50ZigiJS4yZiIsIHByb2Jfb3Ryb3MpKSkKCmBgYAo8L2Rpdj4KPGJyLz4KCkxhIHByb2JhYmlsaWRhZCBkZSBzZWxlY2Npb25hciBsb3MgY29udHJhdG9zIGRlIGxhcyBsb2NhbGlkYWRlcyBxdWUgZXN0w6luIGVuIG90cm9zIGVzdGFkb3MgZXMgZGVsIDIwJS4KPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBTdW1hIFByb2JhYmlsaWRhZGVzCnByb2JfdG90YWwgPC0gcHJvYl9lamUgKyBwcm9iX3RlciArIHByb2Jfb3Ryb3MKcHJpbnQocGFzdGUoIlByb2JhYmlsaWRhZCB0b3RhbDoiLCByb3VuZChwcm9iX3RvdGFsLCAyKSkpCgpgYGAKPC9kaXY+CgpTZSBjb21wcnVlYmEgcXVlIGxhIHByb2JhYmlsaWRhZCB0b3RhbCBkZSB0b2RvcyBsb3MgZXN0YWRvcyBnZW5lcmFsZXMgZGUgbG9zIGNvbnRyYXRvcyBlbiBsYXMgMjAgbG9jYWxpZGFkZXMgZXMgZGVsIDEwMCUKPGJyLz4KCiFbXShNYXBhY29udHJhdG9zLmpwZykKPGJyLz4KPGNlbnRlcj4KW1JlZ2lzdHJvIGNvbnRyYXRvcyBkZSBjb250cnVjY2lvbmVzIHR1cmlzbW8gQm9nb3TDoV0oaHR0cHM6Ly9jZW50cm9nb2JpZXJub2xvY2FsLmdvYmllcm5vYm9nb3RhLmdvdi5jby9kYXRvcy1sb2NhbGVzL29icmFzLWxvY2FsZXMvc2VndWltaWVudG8tZGUtaW52ZXJzaW9uLWVuLWluZnJhZXN0cnVjdHVyYS0yMDIxLTIwMjMpCjwvY2VudGVyPgo8YnIvPgo8YnIvPgoKTGEgdmFyaWFibGUgZGUgaW50ZXLDqXMgZW4gZXN0ZSBjYXNvIGVzIGVsIGVzdGFkbyBnZW5lcmFsIGRlIGxvcyBjb250cmF0b3MsIHlhIHF1ZSBjb25zdGl0dXllIGxhIG1lZGlkYSBtw6FzIHJlcHJlc2VudGF0aXZhIHBhcmEgZXZhbHVhciBzaSByZWFsbWVudGUgc2UgZXN0w6EgaW52aXJ0aWVuZG8gZGluZXJvIGRlIG1hbmVyYSBlZmVjdGl2YSBlbiBlbCBzZWN0b3IgdHVyw61zdGljbyBkZSBCb2dvdMOhLiBFc3RhIHZhcmlhYmxlIG5vcyBwcm9wb3JjaW9uYSB1bmEgdmlzacOzbiBpbnRlZ3JhbCBkZWwgcHJvZ3Jlc28geSBsYSBmaW5hbGl6YWNpw7NuIGRlIGxvcyBjb250cmF0b3MsIHBlcm1pdGnDqW5kb25vcyBpZGVudGlmaWNhciBkZSBtYW5lcmEgY2xhcmEgeSBzaWduaWZpY2F0aXZhIGxhIHNpdHVhY2nDs24gZGUgbGFzIGludmVyc2lvbmVzIGRlc3RpbmFkYXMgYWwgZGVzYXJyb2xsbyB0dXLDrXN0aWNvIGVuIGxhIGNpdWRhZC4KCgpQYXJhIGVzdGUgcGxhbnRlYW1pZW50byBzZSB1dGlsaXphbiBsb3MgY29udHJhdG9zIGNvbiBlc3RhZG8gZ2VuZXJhbCBkZSB0ZXJtaW5hZG8geWEgcXVlIG5vcyBnYXJhbnRpemFuIHF1ZSBlc2FzIGNvbnN0cnVjY2lvbmVzIHlhIGVzdGFuIGRpc3BvbmlibGVzIGFsIHVzbyBkZWwgcHVibGljby4KClNpIHNlIHNhYmUgcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gY29udHJhdG8gZXN0ZSBlbiBlc3RhZG8gZ2VuZXJhbCB0ZXJtaW5hZG8gZXMgZGVsIDQ1JSB5IHNlIHNlbGVjY2lvbmFuIHVuYSBjYW50aWRhZCBkZSAxMCBjb250cmF0b3MgYWwgYXphcjoKCi0gwr9jdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIDUgZGUgZXNvcyBjb250cmF0b3MgZXN0w6luIGVuIGVzdGFkbyB0ZXJtaW5hZG8/CgoKU2UgZWxpZ2VuIDUgY29udHJhdG9zLCBxdWUgcmVwcmVzZW50YW4gbGEgbWl0YWQgZGVsIG7Dum1lcm8gdG90YWwgZGUgZW5zYXlvcyBwcm9wdWVzdG9zLCBjb24gZWwgZmluIGRlIG9idGVuZXIgdW5hIG11ZXN0cmEgbcOhcyBtYW5lamFibGUgeSBzaWduaWZpY2F0aXZhIHBhcmEgYW5hbGl6YXIgZWwgZXN0YWRvIGRlIGxvcyBjb250cmF0b3MgZGUgbWFuZXJhIG3DoXMgZWZpY2llbnRlLgoKPGJyLz4KRW4gZXN0ZSBjYXNvIHNlIGVtcGxlYSBsYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsIGRlYmlkbyBhIHF1ZSBlcyB1biBleHBlcmltZW50byBxdWUgYWRtaXRlIGRvcyBwb3NpYmxlcyByZXN1bHRhZG9zIGRvbmRlIDEgZGUgZWxsb3Mgc2UgY29uc2lkZXJhIGNvbW8gdW4gw6l4aXRvIHkgZWwgb3RybyBjb21vIHVuIGZyYWNhc28gdGFsIGNvbW8gc2UgcmVhbGl6YSBlbiBsYSBkaXN0cmlidWNpw7NuIGRlIEJlcm5vdWxsaSBwZXJvIHNlIGFwbGljYSBkZSBtYW5lcmEgc3VjZXNpdmEgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBjYWRhIGNvbnRyYXRvIGVzIGluZGVwZW5kaWVudGUgYWwgYW50ZXJpb3IuCgojIyMgKipGLkQuUC4qKgo8YnIvPgoKKipGdW5jacOzbiBEZSBEaXN0cmlidWNpw7NuIEdlbmVyYWwqKiAKCi0gTm8uRW5zYXlvcyA9IE4KLSBQcm9iYWJpbGlkYWQgZGUgw6l4aXRvID0gUAotIE7Dum1lcm8gZGUgY2Fzb3MgZXhpdG9zb3MgPSBYCgo8YnIvPgoKPGNlbnRlcj4KWOKIvEIoTixQKQo8YnIvPgoKIVtdKE9SSUcxLmpwZykKPGJyLz4KPGJyLz4KIVtdKE9SSUcyLmpwZykKCjwvY2VudGVyPgo8YnIvPgoKKipGdW5jacOzbiBEZSBEaXN0cmlidWNpw7NuIEVzcGVjaWZpY2EgRGVsIEV4cGVyaW1lbnRvKiogCjxici8+CgotIE5vLkVuc2F5b3MgPSAxMAotIFByb2JhYmlsaWRhZCBkZSDDqXhpdG8gPSAwLjQ1Ci0gTsO6bWVybyBkZSBjYXNvcyBleGl0b3NvcyA9IDUKPGJyLz4KPGJyLz4KCjxjZW50ZXI+CgpY4oi8QigxMCwwLjQ1KQo8YnIvPgo8YnIvPgohW10oRk9SLkJFUi5FUy5qcGcpCjxici8+Cjxici8+CgohW10oRk9SLkJFUi5FUzEuanBnKQoKPGJyLz4KPGJyLz4KCiFbXShCZXJub3VsbGkuanBnKQoKPC9jZW50ZXI+Cgo8YnIvPgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQpwcm9iX2V4aXRvIDwtIDAuNDUgICMgUHJvYmFiaWxpZGFkKGNvbnRyYXRvIGVuIGVzdGFkbyB0ZXJtaW5hZG8pCm51bV9jb250cmF0b3MgPC0gMTAgICMgTsO6bWVybyB0b3RhbCBkZSBjb250cmF0b3Mgc2VsZWNjaW9uYWRvcyBhbCBhemFyCm51bV9leGl0b3NfZGVzZWFkb3MgPC0gNSAgIyBOw7ptZXJvIGRlIGNvbnRyYXRvcyBlbiBlc3RhZG8gdGVybWluYWRvIGRlc2VhZG9zCgojIFByb2JhYmlsaWRhZApwcm9iYWJpbGlkYWQgPC0gZGJpbm9tKG51bV9leGl0b3NfZGVzZWFkb3MsIHNpemUgPSBudW1fY29udHJhdG9zLCBwcm9iID0gcHJvYl9leGl0bykKCnByaW50KHBhc3RlKCJMYSBwcm9iYWJpbGlkYWQgZGUgb2J0ZW5lciIsIG51bV9leGl0b3NfZGVzZWFkb3MsICJjb250cmF0b3MgZW4gZXN0YWRvIHRlcm1pbmFkbyBwb3IgY2FkYSAxMCBjb250cmF0b3Mgc2VsZWNjaW9uYWRvcyBlczoiLCByb3VuZChwcm9iYWJpbGlkYWQsIDMpKSkKYGBgCjxkaXYvPgoKPGJyLz4KCkxhIHByb2JhYmlsaWRhZCBkZSBxdWUsIGFsIHNlbGVjY2lvbmFyIDEwIGNvbnRyYXRvcywgdG9kb3MgZXN0w6luIGVuIGVzdGFkbyB0ZXJtaW5hZG8gZXMgYmFqYSwgZXNwZWPDrWZpY2FtZW50ZSBkZWwgMjMlLiBFc3RlIHJlc3VsdGFkbyByZWZsZWphIGxhIHJlYWxpZGFkIGRlbCBwcm9jZXNvIGRlIGVqZWN1Y2nDs24gZGUgY29udHJhdG9zIGVuIGVsIMOhbWJpdG8gZGUgbGEgY29uc3RydWNjacOzbiB5IHJlc3RhdXJhY2nDs24gcGFyYSBhY3RpdmlkYWRlcyB0dXLDrXN0aWNhcy4gTGEgYmFqYSBwcm9iYWJpbGlkYWQgaW5kaWNhIHF1ZSBtdWNob3MgY29udHJhdG9zIGNvbWllbnphbiwgcGVybyBubyB0b2RvcyBsbGVnYW4gYSBzdSBlc3RhZG8gZmluYWwgZGUgdGVybWluYWRvLiBFc3RvIHB1ZWRlIGRlYmVyc2UgYSBkaXZlcnNvcyBmYWN0b3JlcywgY29tbyBkZW1vcmFzIGVuIGxhIGVqZWN1Y2nDs24sIGNhbWJpb3MgZW4gbG9zIHBsYW5lcyBvcmlnaW5hbGVzLCBwcm9ibGVtYXMgZGUgZmluYW5jaWFtaWVudG8gbyBjdWFscXVpZXIgb3RybyBvYnN0w6FjdWxvIHF1ZSBwdWVkYSBzdXJnaXIgZHVyYW50ZSBlbCBwcm9jZXNvIGRlIGNvbnN0cnVjY2nDs24uIEVzdGEgZXN0YWTDrXN0aWNhIGRlc2Zhdm9yYWJsZSBzdWdpZXJlIHF1ZSwgYSBwZXNhciBkZSBsYSBleGlzdGVuY2lhIGRlIG51bWVyb3NvcyBjb250cmF0b3MgcGFyYSBwcm95ZWN0b3MgdHVyw61zdGljb3MsIGxhIHRyYW5zZm9ybWFjacOzbiBkZSBlc3RvcyBjb250cmF0b3MgZW4gb2JyYXMgdGVybWluYWRhcyBpbXBsaWNhIHVuYSBpbnZlcnNpw7NuIGNvbnNpZGVyYWJsZSBkZSB0aWVtcG8geSByZWN1cnNvcy4gTGEgY29tcGxlamlkYWQgeSBsYSBkdXJhY2nDs24gZGVsIHByb2Nlc28gcHVlZGVuIHNlciBvYnN0w6FjdWxvcyBpbXBvcnRhbnRlcyBwYXJhIGxhIGVmZWN0aXZhIGltcGxlbWVudGFjacOzbiBkZSBwcm95ZWN0b3MgZW4gZWwgc2VjdG9yIHR1csOtc3RpY28uCjxici8+Cjxici8+CgojIyMgKipNZWRpZGFzIERlc2NyaXB0aXZhcyoqIAo8YnIvPgpNZWRpYSB5IHZhcmlhbnphIGNvbiBkaXN0cmlidWNpw7NuIGJpbm9taWFsIGRlbCBleHBlcmltZW50byBjb3JyZXNwb25kaWVudGUKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBQYXLDoW1ldHJvcwpwcm9iX2V4aXRvIDwtIDAuNDUKbnVtX2NvbnRyYXRvcyA8LSAxMAoKIyBNZWRpYSB5IHZhcmlhbnphCm1lZGlhIDwtIG51bV9jb250cmF0b3MgKiBwcm9iX2V4aXRvCnZhcmlhbnphIDwtIG51bV9jb250cmF0b3MgKiBwcm9iX2V4aXRvICogKDEgLSBwcm9iX2V4aXRvKQoKcHJpbnQocGFzdGUoIk1lZGlhOiIsIG1lZGlhKSkKcHJpbnQocGFzdGUoIlZhcmlhbnphOiIsIHZhcmlhbnphKSkKYGBgCjxkaXYvPgoKPGJyLz4KCioqTWVkaWEoNC41KToqKkxhIG1lZGlhIGRlIHVuYSBkaXN0cmlidWNpw7NuIGJpbm9taWFsIHNlIGNhbGN1bGEgY29uIGxhIGbDs3JtdWxhICoqzrw9bi5wKiosIHJlcHJlc2VudGEgZWwgdmFsb3IgcHJvbWVkaW8gZGUgbGEgZGlzdHJpYnVjacOzbiB5LCBlbiBlc3RlIGNvbnRleHRvLCBpbmRpY2EgZWwgbsO6bWVybyBtZWRpbyBkZSBjb250cmF0b3MgcXVlIHNlIGVzcGVyYXLDrWEgcXVlIGVzdMOpbiBlbiBlc3RhZG8gInRlcm1pbmFkbyIgYWwgc2VsZWNjaW9uYXIgMTAgY29udHJhdG9zIGFsIGF6YXIKCkxhIG1lZGlhIHN1Z2llcmUgcXVlLCBlbiBwcm9tZWRpbywgc2UgZXNwZXJhcsOtYSBxdWUgYWxyZWRlZG9yIGRlIDQuNSBjb250cmF0b3MgZXN0w6luIGVuIGVzdGFkbyAidGVybWluYWRvIiBlbiBjYWRhIHNlbGVjY2nDs24gZGUgMTAgY29udHJhdG9zLiBEYWRvIHF1ZSBubyBzZSBwdWVkZSB0ZW5lciB1biBuw7ptZXJvIGZyYWNjaW9uYWwgZGUgY29udHJhdG9zLCBlc3RhIGNpZnJhIHNlIGludGVycHJldGEgY29tbyB1biB2YWxvciBlc3BlcmFkbyBhIGxhcmdvIHBsYXpvLgoKCioqVmFyaWFuemEoMi40NzUpOioqTGEgdmFyaWFuemEgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gYmlub21pYWwgc2UgY2FsY3VsYSBjb24gbGEgZsOzcm11bGEgKirPg14yPW7ii4Vw4ouFKDHiiJJwKSoqLCBtaWRlIGxhIGRpc3BlcnNpw7NuIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIEVuIGVzdGUgY29udGV4dG8sIGluZGljYSBjdcOhbnRvIHZhcsOtYSBlbCBuw7ptZXJvIGRlIGNvbnRyYXRvcyBlbiBlc3RhZG8gInRlcm1pbmFkbyIgYWwgc2VsZWNjaW9uYXIgMTAgY29udHJhdG9zIGFsIGF6YXIuCgpMYSB2YXJpYW56YSBpbmRpY2EgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gdGllbmUgY2llcnRhIGRpc3BlcnNpw7NuIGFscmVkZWRvciBkZSBsYSBtZWRpYS4gQ3VhbnRvIG1heW9yIHNlYSBsYSB2YXJpYW56YSwgbWF5b3Igc2Vyw6EgbGEgdmFyaWFiaWxpZGFkIGVuIGxvcyByZXN1bHRhZG9zLgoKCjxici8+CgojIyMgKipHcsOhZmljb3MgRi5ELlAgeSBGLkQuQS4qKiAKPGJyLz4KCkdyw6FmaWNvIHF1ZSByZXByZXNlbnRhIGxhcyBkaXN0cmlidWNpw7NuIGJpbm9taWFsIGRlIGxvcyBjb250cmF0b3MKPGJyLz4KCjxjZW50ZXI+CjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgoKYGBge3J9CiMgTsO6bWVyb3MgZGUgY29udHJhdG9zCm51bV9jb250cmF0b3MgPC0gMDoxMAoKIyBQYXLDoW1ldHJvcwpwcm9iX2V4aXRvIDwtIDAuNDUKbnVtX2Vuc2F5b3MgPC0gMTAKCiMgUHJvYmFiaWxpZGFkZXMgcGFyYSBjYWRhIG7Dum1lcm8gZGUgY29udHJhdG9zCnByb2JhYmlsaWRhZGVzIDwtIGRiaW5vbShudW1fY29udHJhdG9zLCBzaXplID0gbnVtX2Vuc2F5b3MsIHByb2IgPSBwcm9iX2V4aXRvKQoKIyBHcsOhZmljbyBkZSBiYXJyYXMKYmFycGxvdChwcm9iYWJpbGlkYWRlcywgbmFtZXMuYXJnID0gbnVtX2NvbnRyYXRvcywgY29sID0gIiNGRkI5MEYiLCAKICAgICAgICBtYWluID0gIkRpc3RyaWJ1Y2nDs24gQmlub21pYWwgQ29udHJhdG9zIFRlcm1pbmFkb3MiLCB4bGFiID0gIk7Dum1lcm8gZGUgQ29udHJhdG9zIGVuIEVzdGFkbyBUZXJtaW5hZG8iLAogICAgICAgIHlsYWIgPSAiUHJvYmFiaWxpZGFkIiwgeWxpbSA9IGMoMCwgMC4zKSwgeGxpbSA9IGMoLTAuNSwgMTAuNSksIHdpZHRoID0gMC43LCBib3JkZXIgPSAiYmxhY2siLCBzcGFjZSA9IDAuMikKCiMgRXRpcXVldGFzIGRlIHByb2JhYmlsaWRhZAp0ZXh0KHggPSBudW1fY29udHJhdG9zLCB5ID0gcHJvYmFiaWxpZGFkZXMsIGxhYmVscyA9IHBhc3RlKHJvdW5kKHByb2JhYmlsaWRhZGVzLCAzKSAqIDEwMCwgIiUiKSwKICAgICBwb3MgPSAzLCBjb2wgPSAiYmxhY2siLCBjZXggPSAwLjYpCgojIE1lZGlhCmFibGluZSh2ID0gbWVhbihudW1fY29udHJhdG9zLCBwcm9iID0gcHJvYl9leGl0byAqIG51bV9lbnNheW9zKSwgY29sID0gInJlZCIsIGx0eSA9IDIpCgpgYGAKPC9jZW50ZXI+CjxkaXYvPgo8YnIvPgoKKipJTlRFUlBSRVRBQ0nDk046KiogRWwgZWplIFggcmVwcmVzZW50YSBlbCBuw7ptZXJvIGRlIGNvbnRyYXRvcyBlbiBlc3RhZG8gInRlcm1pbmFkbyIsIGVsIGVqZSBZIHJlcHJlc2VudGEgbGEgcHJvYmFiaWxpZGFkIGRlIG9ic2VydmFyIHVuIGNpZXJ0byBuw7ptZXJvIGRlIGNvbnRyYXRvcyBlbiBlbCBtaXNtbyBlc3RhZG8sIGVuIGdlbmVyYWwgc2UgcHVlZGUgb2JzZXJ2YXIgY8OzbW8gdmFyw61hIGxhIHByb2JhYmlsaWRhZCBhIG1lZGlkYSBxdWUgY2FtYmlhIGVsIG7Dum1lcm8gZGUgY29udHJhdG9zIGVuIGVzdGFkbyAidGVybWluYWRvIi4KPGJyLz4KPGJyLz4KPGJyLz4KR3LDoWZpY28gcXVlIHJlcHJlc2VudGEgbGFzIGRpc3RyaWJ1Y2nDs24gYmlub21pYWwgYWN1bXVsYWRhIGRlIGxvcyBjb250cmF0b3MKPGJyLz4KCjxjZW50ZXI+CjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBOw7ptZXJvcyBkZSBjb250cmF0b3MgcG9zaWJsZXMKbnVtX2NvbnRyYXRvcyA8LSAwOjEwCgojIFBhcsOhbWV0cm9zCnByb2JfZXhpdG8gPC0gMC40NQpudW1fZW5zYXlvcyA8LSAxMAoKIyBQcm9iYWJpbGlkYWRlcyBhY3VtdWxhZGFzIHBhcmEgY2FkYSBuw7ptZXJvIGRlIGNvbnRyYXRvcwpwcm9iX2FjdW11bGFkYXMgPC0gcGJpbm9tKG51bV9jb250cmF0b3MsIHNpemUgPSBudW1fZW5zYXlvcywgcHJvYiA9IHByb2JfZXhpdG8pCgojIEdyw6FmaWNvIGRlIGJhcnJhcwpiYXJwbG90KHByb2JfYWN1bXVsYWRhcywgbmFtZXMuYXJnID0gbnVtX2NvbnRyYXRvcywgY29sID0gIiNGRjdGMjQiLCAKICAgICAgICBtYWluID0gIkRpc3RyaWJ1Y2nDs24gQmlub21pYWwgQWN1bXVsYWRhIENvbnRyYXRvcyBUZXJtaW5hZG9zIiwKICAgICAgICB4bGFiID0gIk7Dum1lcm8gZGUgQ29udHJhdG9zIGVuIEVzdGFkbyBUZXJtaW5hZG8iLCB5bGFiID0gIlByb2JhYmlsaWRhZCBBY3VtdWxhZGEiLAogICAgICAgIHlsaW0gPSBjKDAsIDEuNSksIHhsaW0gPSBjKC0wLjUsIDEwLjUpLCB3aWR0aCA9IDAuNywgYm9yZGVyID0gImJsYWNrIiwgc3BhY2UgPSAwLjIpCgp0ZXh0KHggPSBudW1fY29udHJhdG9zLCB5ID0gcHJvYl9hY3VtdWxhZGFzLCBsYWJlbHMgPSBwYXN0ZShyb3VuZChwcm9iX2FjdW11bGFkYXMsIDMpICogMTAwLCAiJSIpLAogICAgIHBvcyA9IDMsIGNvbCA9ICJibGFjayIsIGNleCA9IDAuNywgb2Zmc2V0ID0gMSkKCiMgTWVkaWEKYWJsaW5lKHYgPSBtZWFuKG51bV9jb250cmF0b3MsIHByb2IgPSBwcm9iX2V4aXRvICogbnVtX2Vuc2F5b3MpLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKCmBgYAo8L2NlbnRlcj4KPGRpdi8+Cjxici8+Cjxici8+CgoqKklOVEVSUFJFVEFDScOTTjoqKiBFbCBncsOhZmljbyBkZSBkaXN0cmlidWNpw7NuIGFjdW11bGFkYSByZXByZXNlbnRhIGxhIHByb2JhYmlsaWRhZCBhY3VtdWxhZGEgZGUgcXVlIGVsIG7Dum1lcm8gZGUgY29udHJhdG9zIGVuIGVzdGFkbyAidGVybWluYWRvIiBzZWEgaWd1YWwgbyBtZW5vciBxdWUgdW4gdmFsb3IgZXNwZWPDrWZpY28uIENhZGEgYmFycmEgZW4gZWwgZ3LDoWZpY28gaW5kaWNhIGxhIHByb2JhYmlsaWRhZCBhY3VtdWxhZGEgaGFzdGEgZXNlIHB1bnRvLkxhIGZvcm1hIGRlIGxhIGN1cnZhIHJlZmxlamEgY8OzbW8gbGEgcHJvYmFiaWxpZGFkIGFjdW11bGFkYSBhdW1lbnRhIGEgbWVkaWRhIHF1ZSBhdmFuemFtb3MgYSBsbyBsYXJnbyBkZWwgZWplIFguIEVuIGVzdGUgY2FzbywgZGFkbyBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIMOpeGl0byAoY29udHJhdG9zIGVuIGVzdGFkbyAidGVybWluYWRvIikgZXMgcmVsYXRpdmFtZW50ZSBhbHRhICgwLjQ1KSwgbGEgY3VydmEgc3ViZSBtw6FzIHLDoXBpZGFtZW50ZS4KPGJyLz4KCgojIyMgKipQcmVndW50YXMgcGxhbnRlYWRhcyoqCjxici8+CgoqKjEuIE7Dum1lcm8gZXNwZXJhZG8gZGUgY29udHJhdG9zIGZpbmFsaXphZG9zKioKCi0gwr9DdcOhbCBlcyBlbCBuw7ptZXJvIGVzcGVyYWRvIGRlIGNvbnRyYXRvcyB0ZXJtaW5hZG9zIGVuIHVuIG1lcyBzaSBsYSBwcm9iYWJpbGlkYWQgZGUgw6l4aXRvIGVzIGRlbCA0NSU/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgUHJvYmFiaWxpZGFkIGRlIMOpeGl0bwpwcm9iX2V4aXRvIDwtIDAuNDUKCiMgbWVzZXMKbnVtX2Vuc2F5b3MgPC0gMQoKIyBOw7ptZXJvIGVzcGVyYWRvIGRlIGNvbnRyYXRvcyB0ZXJtaW5hZG9zIGVuIHVuIG1lcwpudW1fY29udHJhdG9zX2VzcGVyYWRvcyA8LSBudW1fZW5zYXlvcyAqIHByb2JfZXhpdG8KCnByaW50KHBhc3RlKCJFbCBuw7ptZXJvIGVzcGVyYWRvIGRlIGNvbnRyYXRvcyB0ZXJtaW5hZG9zIGVuIHVuIG1lcyBlczoiLCBudW1fY29udHJhdG9zX2VzcGVyYWRvcykpCgpgYGAKPC9kaXY+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgTsO6bWVyb3MgZGUgY29udHJhdG9zCm51bV9jb250cmF0b3MgPC0gMDoxMAoKIyBQYXLDoW1ldHJvcwpwcm9iX2V4aXRvIDwtIDAuNDUKbnVtX2Vuc2F5b3MgPC0gMTAKCiMgUHJvYmFiaWxpZGFkZXMgcGFyYSBjYWRhIG7Dum1lcm8gZGUgY29udHJhdG9zCnByb2JhYmlsaWRhZGVzIDwtIGRiaW5vbShudW1fY29udHJhdG9zLCBzaXplID0gbnVtX2Vuc2F5b3MsIHByb2IgPSBwcm9iX2V4aXRvKQoKIyBHcsOhZmljbyBkZSBiYXJyYXMKYmFycGxvdChwcm9iYWJpbGlkYWRlcywgbmFtZXMuYXJnID0gbnVtX2NvbnRyYXRvcywgY29sID0gIiNGRkI5MEYiLCAKICAgICAgICBtYWluID0gIkNvbnRyYXRvcyBlbiB1biBtZXMiLAogICAgICAgIHhsYWIgPSAiTsO6bWVybyBkZSBDb250cmF0b3MgZW4gRXN0YWRvIFRlcm1pbmFkbyIsCiAgICAgICAgeWxhYiA9ICJQcm9iYWJpbGlkYWQiLCB5bGltID0gYygwLCAwLjMpLCB4bGltID0gYygtMC41LCAxMC41KSwKICAgICAgICB3aWR0aCA9IDAuNywgYm9yZGVyID0gImJsYWNrIiwgc3BhY2UgPSAwLjIpCgojIEV0aXF1ZXRhcyBkZSBwcm9iYWJpbGlkYWQKdGV4dCh4ID0gbnVtX2NvbnRyYXRvcywgeSA9IHByb2JhYmlsaWRhZGVzLCBsYWJlbHMgPSBwYXN0ZShyb3VuZChwcm9iYWJpbGlkYWRlcywgMykgKiAxMDAsICIlIiksCiAgICAgcG9zID0gMywgY29sID0gImJsYWNrIiwgY2V4ID0gMC42KQphYmxpbmUodiA9IDAuNDUsIGNvbCA9ICJibHVlIiwgbHR5ID0gMikKCmBgYAo8L2Rpdj4KCjxici8+CgotIMK/Q3XDoWwgZXMgZWwgbsO6bWVybyBlc3BlcmFkbyBkZSBjb250cmF0b3MgdGVybWluYWRvcyBzZW1lc3RyYWxtZW50ZSBzaSBsYSBwcm9iYWJpbGlkYWQgZGUgw6l4aXRvIGVzIGRlbCA0NSU/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgUHJvYmFiaWxpZGFkIGRlIMOpeGl0bwpwcm9iX2V4aXRvIDwtIDAuNDUKCiMgbWVzZXMgZW4gdW4gc2VtZXN0cmUKbWVzZXMgPC0gNgoKIyBOw7ptZXJvIGVzcGVyYWRvIGRlIGNvbnRyYXRvcyB0ZXJtaW5hZG9zIHNlbWVzdHJhbG1lbnRlCm51bV9jb250cmF0b3NfZXNwZXJhZG9zIDwtIG1lc2VzICogcHJvYl9leGl0bwoKcHJpbnQocGFzdGUoIkVsIG7Dum1lcm8gZXNwZXJhZG8gZGUgY29udHJhdG9zIHRlcm1pbmFkb3Mgc2VtZXN0cmFsbWVudGUgZXM6IiwgbnVtX2NvbnRyYXRvc19lc3BlcmFkb3MpKQpgYGAKPC9kaXY+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgTsO6bWVyb3MgZGUgY29udHJhdG9zCm51bV9jb250cmF0b3MgPC0gMDoxMAoKIyBQYXLDoW1ldHJvcwpwcm9iX2V4aXRvIDwtIDAuNDUKbnVtX2Vuc2F5b3MgPC0gMTAKCiMgUHJvYmFiaWxpZGFkZXMgcGFyYSBjYWRhIG7Dum1lcm8gZGUgY29udHJhdG9zCnByb2JhYmlsaWRhZGVzIDwtIGRiaW5vbShudW1fY29udHJhdG9zLCBzaXplID0gbnVtX2Vuc2F5b3MsIHByb2IgPSBwcm9iX2V4aXRvKQoKIyBHcsOhZmljbyBkZSBiYXJyYXMKYmFycGxvdChwcm9iYWJpbGlkYWRlcywgbmFtZXMuYXJnID0gbnVtX2NvbnRyYXRvcywgY29sID0gIiNGRkI5MEYiLCAKICAgICAgICBtYWluID0gIkNvbnRyYXRvcyBlbiBzZWlzIG1lc2VzIiwKICAgICAgICB4bGFiID0gIk7Dum1lcm8gZGUgQ29udHJhdG9zIGVuIEVzdGFkbyBUZXJtaW5hZG8iLAogICAgICAgIHlsYWIgPSAiUHJvYmFiaWxpZGFkIiwgeWxpbSA9IGMoMCwgMC4zKSwgeGxpbSA9IGMoLTAuNSwgMTAuNSksCiAgICAgICAgd2lkdGggPSAwLjcsIGJvcmRlciA9ICJibGFjayIsIHNwYWNlID0gMC4yKQoKIyBFdGlxdWV0YXMgZGUgcHJvYmFiaWxpZGFkCnRleHQoeCA9IG51bV9jb250cmF0b3MsIHkgPSBwcm9iYWJpbGlkYWRlcywgbGFiZWxzID0gcGFzdGUocm91bmQocHJvYmFiaWxpZGFkZXMsIDMpICogMTAwLCAiJSIpLAogICAgIHBvcyA9IDMsIGNvbCA9ICJibGFjayIsIGNleCA9IDAuNikKYWJsaW5lKHYgPSAyLjcsIGNvbCA9ICJwdXJwbGUiLCBsdHkgPSAyKQoKYGBgCjwvZGl2PgoKPGJyLz4KCioqMi4gUmllc2dvKioKCi0gwr9DdcOhbCBlcyBsYSB2YXJpYW56YSBkZWwgbsO6bWVybyBkZSBjb250cmF0b3MgdGVybWluYWRvcyBhbCBzZWxlY2Npb25hciAyMCBjb250cmF0b3M/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgUGFyw6FtZXRyb3MKbl9jb250cmF0b3MgPC0gMjAKcHJvYl9leGl0byA8LSAwLjQ1CgojIFZhcmlhbnphCnZhcmlhbnphIDwtIG5fY29udHJhdG9zICogcHJvYl9leGl0byAqICgxIC0gcHJvYl9leGl0bykKCnByaW50KHBhc3RlKCJMYSB2YXJpYW56YSBkZWwgbsO6bWVybyBkZSBjb250cmF0b3MgdGVybWluYWRvcyBlczoiLCB2YXJpYW56YSkpCmBgYAo8L2Rpdj4KCjxici8+CgoqKjMuIFRhbWHDsW9zIGRlIG11ZXN0cmEgaWRlYWxlcyoqCgotIFNpIHF1ZXJlbW9zIGFzZWd1cmFybm9zIGRlIHF1ZSBhbCBtZW5vcyBlbCA1MCUgZGUgbG9zIGNvbnRyYXRvcyBlc3TDqW4gdGVybWluYWRvcyBhIHRpZW1wbyB5IGxhIHByb2JhYmlsaWRhZCBkZSDDqXhpdG8gZXMgZGVsIDQ1JSwgwr9jdcOhbCBkZWJlcsOtYSBzZXIgZWwgdGFtYcOxbyBtw61uaW1vIGRlIGxhIG11ZXN0cmE/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CiMgSW5zdGFsYXIgeSBjYXJnYXIgbGEgbGlicmVyw61hIG5lY2VzYXJpYQojIGluc3RhbGwucGFja2FnZXMoInJlYWR4bCIpCmxpYnJhcnkocmVhZHhsKQoKCnByb2JfZXhpdG8gPC0gMC40NQpjdWFudGlsX2Rlc2VhZG8gPC0gMC41MAoKbWF0cml6X2RhdG9zIDwtIHJlYWRfZXhjZWwoJ21hdHJpemVzdGFkaXN0aWNhLnhsc3gnKQoKIyBDYWxjdWxhciBlbCB0YW1hw7FvIG3DrW5pbW8gZGUgbGEgbXVlc3RyYQp0YW1hw7FvX211ZXN0cmEgPC0gcWJpbm9tKGN1YW50aWxfZGVzZWFkbywgc2l6ZSA9IG5yb3cobWF0cml6X2RhdG9zKSwgcHJvYiA9IHByb2JfZXhpdG8sIGxvd2VyLnRhaWwgPSBGQUxTRSkKCnByaW50KHBhc3RlKCJFbCB0YW1hw7FvIG3DrW5pbW8gZGUgbGEgbXVlc3RyYSBwYXJhIGFzZWd1cmFyIGVsIGN1YW50aWwgZGVzZWFkbyBkZSBjb250cmF0b3MgdGVybWluYWRvcyBhIHRpZW1wbyBlczoiLCB0YW1hw7FvX211ZXN0cmEpKQoKYGBgCjwvZGl2PgoKPGJyLz4KCioqNS4gQ29tcGFyYWNpb25lcyoqCgotIFNpIGxhIHByb2JhYmlsaWRhZCBkZSDDqXhpdG8gZXMgZGUgNDUlLCDCv2PDs21vIGFmZWN0YSBlc3RvIGEgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBhbCBtZW5vcyA4IGRlIDEyIGNvbnRyYXRvcyBlc3TDqW4gdGVybWluYWRvcyBhIHRpZW1wbz8KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBQYXLDoW1ldHJvcwpwcm9iX2V4aXRvX251ZXZvIDwtIDAuNDUKbnVtX2NvbnRyYXRvc19udWV2byA8LSAxMgpudW1fdGVybWluYWRvc19udWV2byA8LSA4CgojIFByb2JhYmlsaWRhZCBhY3VtdWxhdGl2YQpwcm9iX2FjdW11bGF0aXZhX251ZXZhIDwtIDEgLSBwYmlub20obnVtX3Rlcm1pbmFkb3NfbnVldm8gLSAxLCBzaXplID0gbnVtX2NvbnRyYXRvc19udWV2bywgcHJvYiA9IHByb2JfZXhpdG9fbnVldm8pCgpwcmludChwYXN0ZSgiTGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBhbCBtZW5vcyA4IGRlIDEyIGNvbnRyYXRvcyBlc3TDqW4gdGVybWluYWRvcyBhIHRpZW1wbyBjb24gbGEgcHJvYmFiaWxpZGFkIGRlIMOpeGl0byBlczoiLCByb3VuZChwcm9iX2FjdW11bGF0aXZhX251ZXZhLCAzKSkpCgpgYGAKPC9kaXY+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgpudW1fY29udHJhdG9zIDwtIDA6MTIKcHJvYl9leGl0byA8LSAwLjQ1Cm51bV9lbnNheW9zIDwtIDEyCgojIFByb2JhYmlsaWRhZGVzIApwcm9iYWJpbGlkYWRlcyA8LSBkYmlub20obnVtX2NvbnRyYXRvcywgc2l6ZSA9IG51bV9lbnNheW9zLCBwcm9iID0gcHJvYl9leGl0bykKCiMgUHJvYmFiaWxpZGFkIGFjdW11bGF0aXZhCnByb2JfYWN1bXVsYXRpdmEgPC0gcGJpbm9tKDcsIHNpemUgPSBudW1fZW5zYXlvcywgcHJvYiA9IHByb2JfZXhpdG8sIGxvd2VyLnRhaWwgPSBGQUxTRSkKcGFyKG1hciA9IGMoNSwgNSwgNCwgMikgKyAwLjEpICAjIEFqdXN0YXIgbG9zIG3DoXJnZW5lcwoKIyBHcsOhZmljbyBkZSBiYXJyYXMKYmFycGxvdChwcm9iYWJpbGlkYWRlcywgbmFtZXMuYXJnID0gbnVtX2NvbnRyYXRvcywgY29sID0gIiNGRkI5MEYiLCAKICAgICAgICBtYWluID0gIkNvbnRyYXRvcyB0ZXJtaW5hZG9zIGEgdGllbXBvIiwKICAgICAgICB4bGFiID0gIk7Dum1lcm8gZGUgQ29udHJhdG9zIGVuIEVzdGFkbyBUZXJtaW5hZG8iLAogICAgICAgIHlsYWIgPSAiUHJvYmFiaWxpZGFkIiwgeWxpbSA9IGMoMCwgMC4zKSwgeGxpbSA9IGMoLTAuNSwgMTIuNSksCiAgICAgICAgd2lkdGggPSAwLjcsIGJvcmRlciA9ICJibGFjayIsIHNwYWNlID0gMC4yLCBsYXMgPSAyKSAgIyBSb3RhciBldGlxdWV0YXMgZGVsIGVqZSB4Cgp0ZXh0KHggPSBudW1fY29udHJhdG9zLCB5ID0gcHJvYmFiaWxpZGFkZXMsIGxhYmVscyA9IHBhc3RlKHJvdW5kKHByb2JhYmlsaWRhZGVzLCAzKSAqIDEwMCwgIiUiKSwKICAgICBwb3MgPSAzLCBjb2wgPSAiYmxhY2siLCBjZXggPSAwLjYpCmFibGluZSh2ID0gNy41LCBjb2wgPSAiZ3JlZW4iLCBsdHkgPSAyKQp0ZXh0KHggPSAxMSwgeSA9IDAuMjgsIGxhYmVscyA9IHBhc3RlKCJQcm9iLiBBY3VtdWxhdGl2YSAoPj04KToiLCByb3VuZChwcm9iX2FjdW11bGF0aXZhLCAzKSAqIDEwMCwgIiUiKSwKICAgICBjb2wgPSAiYmx1ZSIsIHBvcyA9IDMpCgpgYGAKPC9kaXY+Cjxici8+Cjxici8+CgojIyMgKipBbsOhbGlzaXMgeSBjb25jbHVzaW9uZXMqKgo8YnIvPgoKKipBbsOhbGlzaXM6KipTZSBoYW4gZXhwbG9yYWRvIHZhcmlhcyBkaXN0cmlidWNpb25lcyBkZSBwcm9iYWJpbGlkYWQsIGluY2x1eWVuZG8gbGEgZGlzdHJpYnVjacOzbiB1bmlmb3JtZSwgbGEgZGlzdHJpYnVjacOzbiBnZW9tw6l0cmljYSwgbGEgZGlzdHJpYnVjacOzbiBiaW5vbWlhbCB5IGxhIGRpc3RyaWJ1Y2nDs24gZGUgcG9pc3NvbiBzZWxlY2Npb25hbmRvIGZpbmFsbWVudGUgbGEgYmlub21pYWwgbGEgY3VhbCByZXByZXNlbnRhYmEgZGUgdW5hIG1lam9yIG1hbmVyYSBlbCBlbmZvcXVlIGRlbCBwcm95ZWN0byBxdWUgcXVlcmlhbW9zLgoKRXN0YSBlbGVjY2nDs24gc2UganVzdGlmaWNhIHBvciBzdSBjYXBhY2lkYWQgcGFyYSByZXByZXNlbnRhciBkZSBtYW5lcmEgZWZlY3RpdmEgbGEgdmFyaWFiaWxpZGFkIGVuIGVsIG7Dum1lcm8gZGUgY29udHJhdG9zIHRlcm1pbmFkb3MgeSBwcm9wb3JjaW9uYXIgaW5mb3JtYWNpw7NuIHZhbGlvc2EgcGFyYSBjb21wcmVuZGVyIGVsIGF2YW5jZSBkZSBsYXMgY29uc3RydWNjaW9uZXMgZW4gbGEgY2l1ZGFkIGRlIEJvZ290w6EgcmVzcGVjdG8gYWwgdHVyaXNtby4gQWwgdXRpbGl6YXJsYSwgc2UgcHVlZGUgb2J0ZW5lciB1bmEgY29tcHJlbnNpw7NuIG3DoXMgcHJvZnVuZGEgZGUgbGEgaW5jZXJ0aWR1bWJyZSBhc29jaWFkYSBjb24gZWwgZXN0YWRvIGRlIGxvcyBjb250cmF0b3MgeSwgcG9yIGVuZGUsIGNvbiBlbCBwcm9ncmVzbyBnZW5lcmFsIGRlIGxhcyBjb25zdHJ1Y2Npb25lcy4KCjxici8+CgoqKkNvbmNsdXNpw7NuOioqRXN0ZSBwcm95ZWN0byBwb3Jwb3JjaW9uw7MgdW5hIGNvbXByZW5zacOzbiBwcsOhY3RpY2EgZGUgZGl2ZXJzYXMgZGlzdHJpYnVjaW9uZXMgZGUgcHJvYmFiaWxpZGFkIHkgY8OzbW8gYXBsaWNhcmxhcyBlbiBlbCBjb250ZXh0byBkZSBsYSBnZXN0acOzbiBkZSBjb250cmF0b3MgeSBwcm95ZWN0b3MgZGUgY29uc3RydWNjacOzbiBlbiBCb2dvdMOhLiBMYXMgZGlzdHJpYnVjaW9uZXMgZGUgcHJvYmFiaWxpZGFkIHNvbiBoZXJyYW1pZW50YXMgdmFsaW9zYXMgcGFyYSBtb2RlbGFyIGV2ZW50b3MgaW5jaWVydG9zIHkgdG9tYXIgZGVjaXNpb25lcyBpbmZvcm1hZGFzIGVuIGxhIHBsYW5pZmljYWNpw7NuIHkgZ2VzdGnDs24gZGUgcHJveWVjdG9zLgoKQWwgY29tcHJlbmRlciB5IGFwbGljYXIgZXN0YXMgZGlzdHJpYnVjaW9uZXMsIHBvZGVtb3MgaGFjZXIgcHJlZGljY2lvbmVzIHByb2JhYmlsw61zdGljYXMgc29icmUgZXZlbnRvcyBmdXR1cm9zLCBsbyBxdWUgZXMgZXNlbmNpYWwgcGFyYSB0b21hciBkZWNpc2lvbmVzIGVzdHJhdMOpZ2ljYXMgeSBhc2lnbmFyIHJlY3Vyc29zIGRlIG1hbmVyYSBlZmljaWVudGUuIExhIGNhcGFjaWRhZCBkZSBtb2RlbGFyIGxhIGluY2VydGlkdW1icmUgeSBldmFsdWFyIGVsIHJpZXNnbyBhc29jaWFkbyBwcm9wb3JjaW9uYSB1bmEgYmFzZSBzw7NsaWRhIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGluZm9ybWFkYSBlbiBlbCDDoW1iaXRvIGRlIGxhIGdlc3Rpw7NuIGRlIHByb3llY3RvcyB5IGNvbnRyYXRvcy4KCjxkaXYvPgoKPGJyLz4KPGJyLz4KCiMgKipEaXN0cmlidWNpw7NuIENvbnRpbnVhKioKCjxici8+Cjxici8+CgoKRW4gZWwgcHJlc2VudGUgZXN0dWRpbywgc2UgbGxldmEgYSBjYWJvIHVuIGFuw6FsaXNpcyBkZXRhbGxhZG8gZGUgbG9zIGRhdG9zIGV4dHJhw61kb3MgZGUgbGEgYmFzZSBkZSBkYXRvcyAiTWF0cml6IEJvZ290w6EgVHVyaXNtbyIuIEVsIGVuZm9xdWUgc2UgY2VudHJhIGVuIGRvcyB2YXJpYWJsZXMgZXNwZWPDrWZpY2FzOiBlbCAiZXN0YWRvIGdlbmVyYWwgZGVsIGNvbnRyYXRvIiB5IHN1ICJ2YWxvciBmaW5hbCBkZSBjb250cmF0byIuIEVzdGFzIHZhcmlhYmxlcyBzZSBjb25zaWRlcmFuIGNydWNpYWxlcyBwYXJhIGVudGVuZGVyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxvcyBjb250cmF0b3MgZW4gZWwgY29udGV4dG8gZGUgbGEgbWF0cml6LgoKCiMjIyAqKk5vcm1hbGlkYWQqKiAKPGJyLz4KCioqSGlzdG9ncmFtYSoqCgpFbCBvYmpldGl2byBwcmluY2lwYWwgZXMgZXZhbHVhciBsYSBub3JtYWxpZGFkIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZXN0YXMgdmFyaWFibGVzIHkgZGV0ZXJtaW5hciBzaSBzaWd1ZW4gY2llcnRvcyBwYXRyb25lcyBwcmVlc3RhYmxlY2lkb3MgbyBkaWZpZXJlbiBzaWduaWZpY2F0aXZhbWVudGUgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLgoKRW4gZXN0ZSBjb250ZXh0bywgc2UgcmVhbGl6YXLDoSB1biBhbsOhbGlzaXMgZXhoYXVzdGl2byBkZSBsYSByZWxhY2nDs24gZW50cmUgbGFzIGRvcyB2YXJpYWJsZXMgY2xhdmUsICJlc3RhZG8gZ2VuZXJhbCBkZWwgY29udHJhdG8iIHkgInZhbG9yIGZpbmFsIGRlbCBjb250cmF0byIsIGNvbiB1biBlbmZvcXVlIGVzcGVjw61maWNvIGVuIGxhIGV2YWx1YWNpw7NuIGRlIGxhIG5vcm1hbGlkYWQuIFBhcmEgdmlzdWFsaXphciBsYSBkaXN0cmlidWNpw7NuIGNvbmp1bnRhLCBzZSBlbXBsZWFyw6EgdW4gaGlzdG9ncmFtYSBxdWUgbXVlc3RyZSBsYSBmcmVjdWVuY2lhIGRlIGxvcyBkaXN0aW50b3MgZXN0YWRvcyBkZWwgY29udHJhdG8gZW4gcmVsYWNpw7NuIGNvbiBzdXMgdmFsb3JlcyBmaW5hbGVzLgoKRXN0ZSBhbsOhbGlzaXMgdmlzdWFsIG5vIHNvbG8gbm9zIHBlcm1pdGlyw6EgaWRlbnRpZmljYXIgcGF0cm9uZXMsIHRlbmRlbmNpYXMgbyBwb3NpYmxlcyByZWxhY2lvbmVzIGVudHJlIGVsIGVzdGFkbyBnZW5lcmFsIGRlbCBjb250cmF0byB5IHN1IHZhbG9yIGZpbmFsLCBzaW5vIHF1ZSB0YW1iacOpbiBub3MgcHJvcG9yY2lvbmFyw6EgaW5mb3JtYWNpw7NuIHZhbGlvc2Egc29icmUgbGEgbm9ybWFsaWRhZCBkZSBsYSBkaXN0cmlidWNpw7NuIGNvbmp1bnRhLiBMYSBldmFsdWFjacOzbiBkZSBsYSBub3JtYWxpZGFkIGVzIGNydWNpYWwgcGFyYSBjb21wcmVuZGVyIGxhIG5hdHVyYWxlemEgZGUgbGFzIHZhcmlhYmxlcyB5IHB1ZWRlIGluZmx1aXIgZW4gbGEgZWxlY2Npw7NuIGRlIGxhcyBwcnVlYmFzIGVzdGFkw61zdGljYXMgYXByb3BpYWRhcyBwYXJhIGFuw6FsaXNpcyBwb3N0ZXJpb3Jlcy4KPGJyLz4KPGNlbnRlcj4KPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KZGF0b3MxIDwtIHN1YnNldChtYXRyaXplc3RhZGlzdGljYSwgYFZhbG9yIEZpbmFsIENvbnRyYXRvYCAhPSAwKQoKZ2dwbG90KGRhdG9zMSwgYWVzKHggPSBFR0MsIHkgPSBgVmFsb3IgRmluYWwgQ29udHJhdG9gLCBmaWxsID0gRUdDKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtYSBkZSBFc3RhZG8gR2VuZXJhbCBkZWwgQ29udHJhdG8geSBzdSBWYWxvciBGaW5hbCIsCiAgICAgICB4ID0gIkVzdGFkbyBkZWwgQ29udHJhdG8iLAogICAgICAgeSA9ICJWYWxvciBkZWwgQ29udHJhdG8iKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYpKQpgYGAKPC9kaXY+CjwvY2VudGVyPgo8YnIvPgoKTGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3MgcmV2ZWxhIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcyBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIHkgZXN0YSBvYnNlcnZhY2nDs24gZXN0w6EgdmluY3VsYWRhIGEgbGEgY2F0ZWdvcml6YWNpw7NuIGRlbCAiRXN0YWRvIGRlbCBDb250cmF0byIuIExhIGZyZWN1ZW5jaWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgeSBsYSBpbnRlcmFjY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyB0YW1iacOpbiBpbmZsdXllbiBlbiBsYSBmb3JtYSBkZWwgaGlzdG9ncmFtYS4gRW4gcGFydGljdWxhciwgc2UgZGVzdGFjYSBxdWUgbG9zIGNvbnRyYXRvcyBlbiBlamVjdWNpw7NuIHNvbiBsb3MgcXVlIG3DoXMgaW1wYWN0YW4gbGEgbm9ybWFsaWRhZCBkZSBsYSBncsOhZmljYSwgeWEgcXVlIHJlcHJlc2VudGFuIGxhIG1heW9yIGNhbnRpZGFkIGRlIGRpbmVybyBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIHRpcG9zIGRlIGNvbnRyYXRvcy4KCkVuIHVuIHNlbnRpZG8gcG9zaXRpdm8sIHNlIG9ic2VydmEgcXVlIGxvcyBjb250cmF0b3MgdGVybWluYWRvcyB0YW1iacOpbiB0aWVuZW4gdW5hIHByZXNlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhIGdyw6FmaWNhLCBpbmRpY2FuZG8gcXVlIGVzdGEgY2F0ZWdvcsOtYSBzaWd1ZSBhIGxvcyBjb250cmF0b3MgZW4gZWplY3VjacOzbiBlbiB0w6lybWlub3MgZGUgbGEgY2FudGlkYWQgZGUgZGluZXJvIGFzb2NpYWRvLiBEZSBlc3RhIG1hbmVyYSwgc2UgcHVlZGUgY29uY2x1aXIgcXVlIGxvcyBjb250cmF0b3MgdGVybWluYWRvcyB5IGVuIGVqZWN1Y2nDs24gc29uIGxvcyBxdWUgbcOhcyBzZSBkZXN0YWNhbiBlbiBsYSBkaXN0cmlidWNpw7NuLCBzaWVuZG8gbG9zIHByaW5jaXBhbGVzIGNvbnRyaWJ1eWVudGVzIGEgbGEgZGlzdHJpYnVjacOzbiBkZSBmb25kb3MgcmVwcmVzZW50YWRhIGVuIGVsIGhpc3RvZ3JhbWEuCgo8YnIvPgoKKipEaWFncmFtYSBkZSBjYWphcyB5IGJpZ290ZXMqKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KI0RpYWdyYW1hCmJveHBsb3QoZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2AsIG1haW49IlZhbG9yIEZpbmFsIGRlbCBDb250cmF0byIseGxhYiA9ICdWYWxvcicsIGNvbCA9ICcjOThGNUZGJykKYGBgCjwvZGl2PgoKRWwgZGlhZ3JhbWEgZGUgYmlnb3RlcyBub3MgcGVybWl0ZSBpZGVudGlmaWNhciBkZSBtYW5lcmEgY2xhcmEgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3MsIHJldmVsYW5kbyBwYXRyb25lcyBkZSBzaW1ldHLDrWEgYWxyZWRlZG9yIGRlIGxhIG1lZGlhbmEgeSBwcm9wb3JjaW9uYW5kbyBpbmZvcm1hY2nDs24gc29icmUgbGEgZGlzcGVyc2nDs24geSBsYSBwcmVzZW5jaWEgZGUgcG9zaWJsZXMgdmFsb3JlcyBhdMOtcGljb3MuCgo8YnIvPgoKKipDdWFudGlsZXMqKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KI0RpYWdyYW1hCnFxbm9ybShkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCwgbWFpbiA9J0N1YW50aWxlcycsIGNvbCA9ICcjOEI0Nzg5JykKcXFsaW5lKGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gLCBjb2wgPSAnI0ZGM0U5NicpCmBgYAo8L2Rpdj4KCkxhIG9ic2VydmFjacOzbiBtdWVzdHJhIHF1ZSBzaSBiaWVuIGFsZ3Vub3MgcHVudG9zIHNlIGFsaW5lYW4gZW4gY2llcnRhIG1lZGlkYSBjb24gbGEgbMOtbmVhIHJvamEgZGUgcmVmZXJlbmNpYSwgbm8gaGF5IHVuYSBjb25jb3JkYW5jaWEgY29tcGxldGEuIEVzdGEgZmFsdGEgZGUgYWxpbmVhY2nDs24gcGVyZmVjdGEgc3VnaWVyZSBxdWUgbGEgZGVzdmlhY2nDs24gZGUgbGEgbm9ybWFsaWRhZCBubyBlcyBjbGFyYSBuaSBwcm9udW5jaWFkYS4gTGEgcHJlc2VuY2lhIGRlIHB1bnRvcyBxdWUgc2UgZGVzdsOtYW4gZGUgbGEgbMOtbmVhIGluZGljYSBjaWVydGEgZGlzY3JlcGFuY2lhIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIHJlc3BlY3RvIGEgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLgoKPGJyLz4KCioqUHJ1ZWJhcyBkZSBOb3JtYWxpZGFkKioKCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9ClBydWViYXNub3JtYWxpZGFkIDwtIGZ1bmN0aW9uKHgpIHsKICBzaGFwaXJvIDwtIHNoYXBpcm8udGVzdCh4KQoKICByZXN1bHRhZG9zIDwtIGRhdGEuZnJhbWUoCiAgICBQcnVlYmEgPSBjKCJTaGFwaXJvLVdpbGsiKSwKICAgIEVzdGFkw61zdGljbyA9IGMoc2hhcGlybyRzdGF0aXN0aWMpLAogICAgVmFsb3JfcCA9IGMoIHNoYXBpcm8kcC52YWx1ZSkKICApCgogIHByaW50KHJlc3VsdGFkb3MpCn0KClBydWViYXNub3JtYWxpZGFkKGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gKQpgYGAKPC9kaXY+Cgo8YnIvPgoqKlNoYXBpcm8tV2lsayBUZXN0OioqCgpFc3RhZMOtc3RpY286IDAuNjQzNzU0MgpWYWxvciBwOiA1Ljc5NDM2NmUtMjEKCkVsIGVzdGFkw61zdGljbyAoMC42NCkgeSBlbCB2YWxvciBwIGluZGljYW4gcXVlIGxvcyBkYXRvcyBubyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBMYSBoaXDDs3Rlc2lzIG51bGEgZGUgbm9ybWFsaWRhZCBzZSByZWNoYXphLgoKPGJyLz4KTG9zIHJlc3VsdGFkb3MgY29uc2lzdGVudGVtZW50ZSBpbmRpY2FuIHF1ZSBsYSB2YXJpYWJsZSAqKlZhbG9yIEZpbmFsIENvbnRyYXRvKiogbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLiBMb3MgdmFsb3JlcyBleHRyZW1hZGFtZW50ZSBiYWpvcyBkZSBsb3MgZXN0YWTDrXN0aWNvcyB5IGxvcyB2YWxvcmVzX3AgY2VyY2Fub3MgYSBjZXJvIHByb3BvcmNpb25hbiBmdWVydGUgZXZpZGVuY2lhIGVuIGNvbnRyYSBkZSBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQuCgo8YnIvPgoKIyMjICoqQWp1c3RlcyBCb25kYWQqKiAKCgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQojIENvbHVtbmEgYSBhbmFsaXphciAnRXN0YWRvIEdlbmVyYWwgZGVsIENvbnRyYXRvJwpWYWxvcl9Db250cmF0byA8LWRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gCgojIFBydWViYSBkZSBLb2xtb2dvcm92LVNtaXJub3YKcmVzdWx0YWRvX2tzIDwtIGtzLnRlc3QoVmFsb3JfQ29udHJhdG8sICJwbm9ybSIsIG1lYW4gPSBtZWFuKFZhbG9yX0NvbnRyYXRvKSwgc2QgPSBzZChWYWxvcl9Db250cmF0bykpCgoKcHJpbnQocmVzdWx0YWRvX2tzKQoKYGBgCjwvZGl2PgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQpoaXN0KFZhbG9yX0NvbnRyYXRvLCBtYWluPSdIaXN0b2dyYW1hJywgeGxhYj0nVmFsb3IgQ29udHJhdG8nLCB5bGFiPSdGcmVjdWVuY2lhJywgYnJlYWtzID0gMykKCmBgYAo8L2Rpdj4KCjxici8+CgpTZSByZWFsaXphIHVuIHByb2Nlc28gZGUgc2VsZWNjacOzbiBkZSBtb2RlbG9zIGVzdGFkw61zdGljb3MgYXBsaWNhZG8gYSBsYSB2YXJpYWJsZSAnVmFsb3IgRmluYWwgQ29udHJhdG8nLiBFc3RlIGFuw6FsaXNpcyBpbXBsaWNhIGxhIGV2YWx1YWNpw7NuIGRlIGRpdmVyc29zIG1vZGVsb3MgZXN0YWTDrXN0aWNvcyBjb24gZWwgb2JqZXRpdm8gZGUgZGV0ZXJtaW5hciBjdcOhbCBkZSBlbGxvcyBzZSBhZGFwdGEgZGUgbWFuZXJhIMOzcHRpbWEgYSBsb3MgZGF0b3Mgb2JzZXJ2YWRvcy4KCjxici8+Cjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9Cm1vZGVsX3NlbGVjdChkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCkKYGBgCjwvZGl2Pgo8YnIvPgoKRXN0ZSBwcm9jZXNvIGRlIHNlbGVjY2nDs24gZGUgbW9kZWxvcyBzdWdpZXJlIGxhIHV0aWxpemFjacOzbiBkZWwgbW9kZWxvIEludmVyc2UgR2F1c3NpYW4gcGFyYSBtb2RlbGFyIGxhIHZhcmlhYmxlICdWYWxvciBGaW5hbCBDb250cmF0bycuIExhIGVsZWNjacOzbiBkZSBlc3RlIG1vZGVsbyBlc3BlY8OtZmljbyBpbXBsaWNhIHF1ZSwgdHJhcyBldmFsdWFyIGRpZmVyZW50ZXMgb3BjaW9uZXMsIGVsIG1vZGVsbyBJbnZlcnNlIEdhdXNzaWFuIGhhIGRlbW9zdHJhZG8gc2VyIGVsIG3DoXMgYWRlY3VhZG8gcGFyYSBkZXNjcmliaXIgbGEgZXN0cnVjdHVyYSB5IGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZGF0b3Mgb2JzZXJ2YWRvcy4gU2luIGVtYmFyZ28sIGVzIGltcG9ydGFudGUgZGVzdGFjYXIgcXVlIGR1cmFudGUgbGEgaW1wbGVtZW50YWNpw7NuIGRlIGVzdGUgbcOpdG9kbywgZWwgcHJvZ3JhbWEgc29saWNpdMOzIGNpZXJ0YXMgZXNwZWNpZmljYWNpb25lcyBxdWUgbm8gZXN0YWJhbiBkZW50cm8gZGUgbnVlc3RybyBjb25vY2ltaWVudG8gcHJldmlvLiBBbnRlIGVzdGEgc2l0dWFjacOzbiwgb3B0YW1vcyBwb3IgZXhwbG9yYXIgb3RybyBtb2RlbG8gbGxhbWFkbyBXZWlidWxsLCBlbCBjdWFsIHRhbWJpw6luIGRlbW9zdHLDsyB1biBhanVzdGUgc2lnbmlmaWNhdGl2byBhIGxhIGN1cnZhIGRlIG51ZXN0cm9zIGRhdG9zLCBwcm9wb3JjaW9uYW5kbyB1bmEgYWx0ZXJuYXRpdmEgdmlhYmxlIGVuIGVsIHByb2Nlc28gZGUgbW9kZWxhZG8gZXN0YWTDrXN0aWNvLgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KbWluX2Fwb3J0ZSA8LSBtaW4oZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2ApCm1heF9hcG9ydGUgPC0gbWF4KGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gKQoKIyBBanVzdGFyIHVuYSBEaXN0cmlidWNpw7NuCkRpc3RyaWJ1Y2lvbl9XZWlidWxsIDwtIGZpdGRpc3QoZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2AsICd3ZWlidWxsJykKCnN1bW1hcnkoRGlzdHJpYnVjaW9uX1dlaWJ1bGwpCnBsb3QoRGlzdHJpYnVjaW9uX1dlaWJ1bGwpCmBgYAo8L2Rpdj4KCjxici8+CgoqKkdyw6FmaWNvIGRlIGN1YW50aWxlcyBjb24gbW9kZWxvIFdlaWJ1bGwqKgoKPGJyLz4KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KCiMgRGlzdHJpYnVjacOzbiBXZWlidWxsCldlaWJ1bGwgPC0gZml0ZGlzdHJwbHVzOjpmaXRkaXN0KGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gLCAnd2VpYnVsbCcpCgojIEdyw6FmaWNvIGRlIGN1YW50aWxlcyBjb24gbGEgZGlzdHJpYnVjacOzbiBXZWlidWxsCmZpdGRpc3RycGx1czo6cXFjb21wKGxpc3QoV2VpYnVsbCksIGxlZ2VuZHRleHQgPSAiV2VpYnVsbCIpCgoKYGBgCjwvZGl2PgoKCiMjIyAqKk1lZGlkYXMgRGVzY3JpcHRpdmFzKioKCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3Igd2FybmluZz1GQUxTRX0KIyBEaXN0cmlidWNpw7NuIFdlaWJ1bGwgYSBsb3MgZGF0b3MKYWp1c3RlX3dlaWJ1bGwgPC0gZml0ZGlzdHJwbHVzOjpmaXRkaXN0KGRhdG9zMSRgVmFsb3IgRmluYWwgQ29udHJhdG9gLCAid2VpYnVsbCIpCgojIHBhcsOhbWV0cm9zCnBhcmFtZXRyb3Nfd2VpYnVsbCA8LSBhanVzdGVfd2VpYnVsbCRlc3RpbWF0ZQoKIyBNZWRpYSB5IHZhcmlhbnphCm1lZGlhX3dlaWJ1bGwgPC0gcGFyYW1ldHJvc193ZWlidWxsWzJdICogZ2FtbWEoMSArIDEvcGFyYW1ldHJvc193ZWlidWxsWzFdKQp2YXJpYW56YV93ZWlidWxsIDwtIHBhcmFtZXRyb3Nfd2VpYnVsbFsyXV4yICogKGdhbW1hKDEgKyAyL3BhcmFtZXRyb3Nfd2VpYnVsbFsxXSkgLSAoZ2FtbWEoMSArIDEvcGFyYW1ldHJvc193ZWlidWxsWzFdKSleMikKCmNhdCgiTWVkaWEgZGUgbGEgZGlzdHJpYnVjacOzbiBXZWlidWxsOiIsIG1lZGlhX3dlaWJ1bGwsICJcbiIpCmNhdCgiVmFyaWFuemEgZGUgbGEgZGlzdHJpYnVjacOzbiBXZWlidWxsOiIsIHZhcmlhbnphX3dlaWJ1bGwsICJcbiIpCgpgYGAKPC9kaXY+Cgo8YnIvPgoKKipNZWRpYSBkZSBsYSBEaXN0cmlidWNpw7NuIFdlaWJ1bGw6KioKCkxhIG1lZGlhIGluZGljYSBlbCBuaXZlbCB0w61waWNvIG8gZXNwZXJhZG8gZGVsICJWYWxvciBGaW5hbCBDb250cmF0byIgc2Vnw7puIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbC4gRW4gZWwgY29udGV4dG8gZGUgY29udHJhdG9zLCBsYSBtZWRpYSBzdWdpZXJlIHVuIHB1bnRvIGNlbnRyYWwgYWxyZWRlZG9yIGRlbCBjdWFsIHNlIGFncnVwYW4gbG9zIHZhbG9yZXMgZGUgIlZhbG9yIEZpbmFsIENvbnRyYXRvIi4gRXMgZXNlbmNpYWwgdGVuZXIgZW4gY3VlbnRhIGVzdGUgdmFsb3IgcGFyYSBjb21wcmVuZGVyIGxhIG1hZ25pdHVkIHByb21lZGlvIGRlIGxvcyBjb250cmF0b3MuCgoqKlZhcmlhbnphIGRlIGxhIERpc3RyaWJ1Y2nDs24gV2VpYnVsbDoqKgoKTGEgdmFyaWFuemEgbWlkZSBsYSBkaXNwZXJzacOzbiBkZSBsb3MgdmFsb3JlcyBkZSAiVmFsb3IgRmluYWwgQ29udHJhdG8iIGFscmVkZWRvciBkZSBsYSBtZWRpYS4gTGEgbWFnbml0dWQgc2lnbmlmaWNhdGl2YSBkZSBlc3RhIHZhcmlhbnphIGluZGljYSB1bmEgYW1wbGlhIHZhcmlhYmlsaWRhZCBlbiBsb3MgIlZhbG9yZXMgRmluYWxlcyBkZSBDb250cmF0byIuIExvcyB2YWxvcmVzIGRpc3BlcnNvcyBzdWdpZXJlbiBxdWUgaGF5IHVuYSBjb25zaWRlcmFibGUgZGl2ZXJzaWRhZCBlbiBsb3MgbW9udG9zIGZpbmFsZXMgZGUgbG9zIGNvbnRyYXRvcy4KCgoqKkFuw6FsaXNpcyBHZW5lcmFsOioqCgpMYSBwcmVzZW5jaWEgZGUgdW5hIHZhcmlhbnphIHRhbiBncmFuZGUgc3VnaWVyZSBxdWUgaGF5IGNvbnRyYXRvcyBjb24gdmFsb3JlcyBmaW5hbGVzIHF1ZSB2YXLDrWFuIGNvbnNpZGVyYWJsZW1lbnRlIGVuIGNvbXBhcmFjacOzbiBjb24gbGEgbWVkaWEuIFB1ZWRlIGhhYmVyIGNvbnRyYXRvcyBjb24gdmFsb3JlcyBleHRyZW1hZGFtZW50ZSBhbHRvcyBxdWUgY29udHJpYnV5YW4gc2lnbmlmaWNhdGl2YW1lbnRlIGEgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLgoKPGJyLz4KCiMjIyAqKkZ1bmNpb25lcyB5IEdyw6FmaWNvcyoqCgo8YnIvPgoKICoqRlVOQ0lPTkVTIFkgR1LDgUZJQ09TIERFIEYuRC5QIHkgRi5ELkEuKioKIAogPGJyLz4KIAogCiAkJGYoeCk9ICBcbGVmdFx7IFxiZWdpbnthcnJheX17bGNjfQogICAgICAgICAgICAJCSAoMi4yMzk3OTdlKzA5KSg3LjY2OTEyMmUtMDEpIHheeyg3LjY2OTEyMmUtMDEpLTF9ZV57LTIuMjM5Nzk3ZSswOSB4Xns3LjY2OTEyMmUtMDF9fSAmICAgICYgeD4wIFxcCiAgICAgICAgICAgIAkJCSAwICYgICAmIFx0ZXh0e0VuIG90cm8gY2Fzb30KICAgICAgICAgICAJCSAgXGVuZHthcnJheX0KICAgCQkJXHJpZ2h0LgogICAJCQkkJAo8YnIvPgogCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBSYW5nbyBkZSB2YWxvcmVzCnggPC0gc2VxKDAsIG1heChkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCksIGxlbmd0aC5vdXQgPSAxMDApCgojIENhbGN1bGFyIGxhIGZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCAoRkRQKSBXZWlidWxsCmZkcF93ZWlidWxsIDwtIGR3ZWlidWxsKHgsIHNoYXBlID0gcGFyYW1ldHJvc193ZWlidWxsWzFdLCBzY2FsZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsyXSkKaGVhZChmZHBfd2VpYnVsbCwgMTApCmZkcF93ZWlidWxsWyFpcy5maW5pdGUoZmRwX3dlaWJ1bGwpXSA8LSAwCgojIENhbGN1bGFyIGxhIGZ1bmNpw7NuIGRlIGRpc3RyaWJ1Y2nDs24gYWN1bXVsYXRpdmEgKEZEQSkgV2VpYnVsbApmZGFfd2VpYnVsbCA8LSBwd2VpYnVsbCh4LCBzaGFwZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsxXSwgc2NhbGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMl0pCmhlYWQoZmRhX3dlaWJ1bGwsIDEwKQoKIyBHcsOhZmljbyBkZSBsYSBGRFAgeSBGREEgV2VpYnVsbApwbG90KHgsIGZkcF93ZWlidWxsLCB0eXBlID0gImwiLCBjb2wgPSAic3ByaW5nZ3JlZW4zIiwgbHdkID0gMiwgbWFpbiA9ICJGRFAgeSBGREEgV2VpYnVsbCIsIHhsYWIgPSAiVmFsb3IgRmluYWwgQ29udHJhdG8iLCB5bGFiID0gIkRlbnNpZGFkIGRlIFByb2JhYmlsaWRhZCIsIHlsaW0gPSBjKDAsIG1heChmZHBfd2VpYnVsbCwgbmEucm0gPSBUUlVFKSkpCmxpbmVzKHgsIGZkYV93ZWlidWxsLCB0eXBlID0gImwiLCBjb2wgPSAiI0NENEYzOSIsIGx3ZCA9IDIpCgpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiRkRQIiwgIkZEQSIpLCBjb2wgPSBjKCJzcHJpbmdncmVlbjMiLCAiI0NENEYzOSIpLCBsdHkgPSAxLCBsd2QgPSAyKQoKYGBgCjwvZGl2PgoKPGJyLz4KCioqQ29uc2lkZXJhY2lvbmVzOioqCgotIExhIEZEUCBXZWlidWxsIG11ZXN0cmEgY8OzbW8gc2UgZGlzdHJpYnV5ZW4gbG9zIHZhbG9yZXMgZGVsICJWYWxvciBGaW5hbCBDb250cmF0byIgYWxyZWRlZG9yIGRlIGxhIG1lZGlhIGVzdGltYWRhIHBhcmEgbGEgZGlzdHJpYnVjacOzbiBXZWlidWxsLgoKLSBMYSAoRkRBKSBXZWlidWxsIGluZGljYSBsYSBwcm9iYWJpbGlkYWQgYWN1bXVsYXRpdmEgZGUgcXVlIHVuIGNvbnRyYXRvIHRlbmdhIHVuIHZhbG9yIG1lbm9yIG8gaWd1YWwgYSBjaWVydG8gbW9udG8uCgotIExhIHBlbmRpZW50ZSBkZSBsYSBjdXJ2YSBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgbGEgdGFzYSBkZSBhY3VtdWxhY2nDs24gZGUgcHJvYmFiaWxpZGFkCgo8YnIvPgoKKipJbnRlcnByZXRhY2nDs246KioKCkxhIGFsdGEgdmFyaWFiaWxpZGFkLCBpbmRpY2FkYSBwb3IgbGEgdmFyaWFuemEgcHJldmlhbWVudGUgY2FsY3VsYWRhLCBzZSByZWZsZWphcsOhIGVuIGxhIGZvcm1hIGRlIGxhIEZEUCB5IGVuIGxhIHRhc2EgZGUgYWN1bXVsYWNpw7NuIGRlIHByb2JhYmlsaWRhZCBlbiBsYSBGREEuCgpWYWxvcmVzIGV4dHJlbW9zIG8gY29sYXMgbGFyZ2FzIGVuIGxhIEZEUCBwdWVkZW4gaW5kaWNhciBsYSBwcmVzZW5jaWEgZGUgY29udHJhdG9zIGNvbiBtb250b3Mgc2lnbmlmaWNhdGl2YW1lbnRlIG3DoXMgYWx0b3MgbyBiYWpvcyBxdWUgbGEgbWVkaWEuCgo8YnIvPgoKIyMjICoqUHJlZ3VudGFzIHBsYW50ZWFkYXMqKgoKPGJyLz4KCioqUHJvYmFiaWxpZGFkZXMgRXNwZWPDrWZpY2FzOioqCgpEYWRhIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbCBhanVzdGFkYSzCv2N1w6FsIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgZXN0w6kgZW50cmUgZG9zIHZhbG9yZXMgZGFkb3M/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgojIFBhcsOhbWV0cm9zIGFqdXN0YWRvcwpwYXJhbWV0cm9zX3dlaWJ1bGwgPC0gRGlzdHJpYnVjaW9uX1dlaWJ1bGwkZXN0aW1hdGUKCnZhbG9yX2luZmVyaW9yIDwtIDg5NTk0MzAzIAp2YWxvcl9zdXBlcmlvciA8LSA0ODQ0MDIzNzAgCiAgCgojIFByb2JhYmlsaWRhZCBhY3VtdWxhZGEgQy9VCnByb2JfaW5mZXJpb3IgPC0gcHdlaWJ1bGwodmFsb3JfaW5mZXJpb3IsIHNoYXBlID0gcGFyYW1ldHJvc193ZWlidWxsWzFdLCBzY2FsZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsyXSkKcHJvYl9zdXBlcmlvciA8LSBwd2VpYnVsbCh2YWxvcl9zdXBlcmlvciwgc2hhcGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMV0sIHNjYWxlID0gcGFyYW1ldHJvc193ZWlidWxsWzJdKQoKIyBQcm9iYWJpbGlkYWQgRmluYWwKcHJvYl9lbnRyZV92YWxvcmVzIDwtIHByb2Jfc3VwZXJpb3IgLSBwcm9iX2luZmVyaW9yCgoKY2F0KCJQcm9iYWJpbGlkYWQgZGUgcXVlIGVsIHZhbG9yIGZpbmFsIGRlIHVuIGNvbnRyYXRvIGVzdMOpIGVudHJlIiwgdmFsb3JfaW5mZXJpb3IsICJ5IiwgdmFsb3Jfc3VwZXJpb3IsICJlczoiLCBwcm9iX2VudHJlX3ZhbG9yZXMsICJcbiIpCgpgYGAKYGBge3J9CiMgUGFyw6FtZXRyb3MgYWp1c3RhZG9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbApwYXJhbWV0cm9zX3dlaWJ1bGwgPC0gRGlzdHJpYnVjaW9uX1dlaWJ1bGwkZXN0aW1hdGUKCiMgRnVuY2nDs24gZGUgZGVuc2lkYWQgZGUgcHJvYmFiaWxpZGFkIChGRFApIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbApmZHBfd2VpYnVsbCA8LSBmdW5jdGlvbih4KSBkd2VpYnVsbCh4LCBzaGFwZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsxXSwgc2NhbGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMl0pCnZhbG9yZXNfY29udHJhdG8gPC0gc2VxKDAsIG1heChkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCksIGxlbmd0aC5vdXQgPSAxMDApCgojIERlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBwYXJhIGNhZGEgdmFsb3IKZGVuc2lkYWRfcHJvYmFiaWxpZGFkIDwtIGZkcF93ZWlidWxsKHZhbG9yZXNfY29udHJhdG8pCgojIEdyw6FmaWNvIGRlIGxhIGZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCAoRkRQKQpwbG90KHZhbG9yZXNfY29udHJhdG8sIGRlbnNpZGFkX3Byb2JhYmlsaWRhZCwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAicHJvYmFiaWxpZGFkIGVudHJlIGRvcyB2YWxvcmVzIiwKICAgICB4bGFiID0gIlZhbG9yIEZpbmFsIGRlbCBDb250cmF0byIsIHlsYWIgPSAiRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIikKCiMgTMOtbWl0ZXMKbGltaXRlX2luZmVyaW9yIDwtIDg5NTk0MzAzIApsaW1pdGVfc3VwZXJpb3IgPC0gNDg0NDAyMzcwIAoKIyBMw61uZWFzIHB1bnRlYWRhcyBwYXJhIGxvcyBsw61taXRlcwphYmxpbmUodiA9IGMobGltaXRlX2luZmVyaW9yLCBsaW1pdGVfc3VwZXJpb3IpLCBjb2wgPSBjKCJyZWQiLCAiZ3JlZW4iKSwgbHR5ID0gMikKCiMgw4FyZWEgc29tYnJlYWRhIGVudHJlIGxvcyBsw61taXRlcwp4X2FyZWEgPC0gYyhsaW1pdGVfaW5mZXJpb3IsIHZhbG9yZXNfY29udHJhdG9bdmFsb3Jlc19jb250cmF0byA+PSBsaW1pdGVfaW5mZXJpb3IgJiB2YWxvcmVzX2NvbnRyYXRvIDw9IGxpbWl0ZV9zdXBlcmlvcl0sIGxpbWl0ZV9zdXBlcmlvcikKeV9hcmVhIDwtIGMoMCwgZGVuc2lkYWRfcHJvYmFiaWxpZGFkW3ZhbG9yZXNfY29udHJhdG8gPj0gbGltaXRlX2luZmVyaW9yICYgdmFsb3Jlc19jb250cmF0byA8PSBsaW1pdGVfc3VwZXJpb3JdLCAwKQpwb2x5Z29uKHhfYXJlYSwgeV9hcmVhLCBjb2wgPSAibGlnaHRncmF5IiwgcmdiKDAuOCwgMC44LCAwLjgsIDAuNSksIGJvcmRlciA9IE5BKQoKIyBMZXllbmRhCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJGRFAgV2VpYnVsbCIsICJMw61taXRlIEluZmVyaW9yIiwgIkzDrW1pdGUgU3VwZXJpb3IiKSwgCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsIHJnYigwLjgsIDAuOCwgMC44LCAwLjUpKSwgbHR5ID0gYygxLCAyLCAyLCAwKSwgY2V4ID0gMC44KQoKYGBgCgo8L2Rpdj4KCioqQ29tcGFyYWNpw7NuIGRlIENvbnRyYXRvczoqKgoKU2VhIGVsIGV4cGVyaW1pZW50byBkZSBzZWxlY2Npb25hciBkb3MgY29udHJhdG9zIGFsIGF6YXIgeSBjb21wYXJhciBzdXMgVmFsb3JlcyBGaW5hbGVzIGRlIENvbnRyYXRvIHV0aWxpemFuZG8gbGEgZnVuY2nDs24gZGUgZGlzdHJpYnVjacOzbiBhY3VtdWxhdGl2YS4gwr9DdcOhbCB0aWVuZSB1bmEgcHJvYmFiaWxpZGFkIGFjdW11bGF0aXZhIG3DoXMgYWx0YT8KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KcGFyYW1ldHJvc193ZWlidWxsIDwtIGFqdXN0ZV93ZWlidWxsJGVzdGltYXRlCgpjb250cmF0b18xIDwtIDE2NjkwNTY3MCAKY29udHJhdG9fMiA8LSA3Njk1NjYxNSAKCiMgUHJvYmFiaWxpZGFkZXMgYWN1bXVsYXRpdmFzIEMvVQpwcm9iX2FjdW1fY29udHJhdG9fMSA8LSBwd2VpYnVsbChjb250cmF0b18xLCBzaGFwZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsxXSwgc2NhbGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMl0pCnByb2JfYWN1bV9jb250cmF0b18yIDwtIHB3ZWlidWxsKGNvbnRyYXRvXzIsIHNoYXBlID0gcGFyYW1ldHJvc193ZWlidWxsWzFdLCBzY2FsZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsyXSkKCiMgQ29tcGFyYWNpw7NuCmlmIChwcm9iX2FjdW1fY29udHJhdG9fMSA+IHByb2JfYWN1bV9jb250cmF0b18yKSB7CiAgY2F0KCJFbCBjb250cmF0byAxIHRpZW5lIHVuYSBwcm9iYWJpbGlkYWQgYWN1bXVsYXRpdmEgbcOhcyBhbHRhLlxuIikKfSBlbHNlIGlmIChwcm9iX2FjdW1fY29udHJhdG9fMSA8IHByb2JfYWN1bV9jb250cmF0b18yKSB7CiAgY2F0KCJFbCBjb250cmF0byAyIHRpZW5lIHVuYSBwcm9iYWJpbGlkYWQgYWN1bXVsYXRpdmEgbcOhcyBhbHRhLlxuIikKfSBlbHNlIHsKICBjYXQoIkFtYm9zIGNvbnRyYXRvcyB0aWVuZW4gbGEgbWlzbWEgcHJvYmFiaWxpZGFkIGFjdW11bGF0aXZhLlxuIikKfQoKYGBgCjwvZGl2Pgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQpwYXJhbWV0cm9zX3dlaWJ1bGwgPC0gRGlzdHJpYnVjaW9uX1dlaWJ1bGwkZXN0aW1hdGUKCiMgRnVuY2nDs24gZGUgZGlzdHJpYnVjacOzbiBhY3VtdWxhdGl2YSAoRkRBKSBkZSBsYSBkaXN0cmlidWNpw7NuIFdlaWJ1bGwKZmRhX3dlaWJ1bGwgPC0gZnVuY3Rpb24oeCkgcHdlaWJ1bGwoeCwgc2hhcGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMV0sIHNjYWxlID0gcGFyYW1ldHJvc193ZWlidWxsWzJdKQp2YWxvcmVzX2NvbnRyYXRvIDwtIHNlcSgwLCBtYXgoZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2ApLCBsZW5ndGgub3V0ID0gMTAwKQoKIyBQcm9iYWJpbGlkYWQgYWN1bXVsYXRpdmEgcGFyYSBjYWRhIHZhbG9yCnByb2JfYWN1bXVsYXRpdmEgPC0gZmRhX3dlaWJ1bGwodmFsb3Jlc19jb250cmF0bykKCiMgR3LDoWZpY28gZnVuY2nDs24gZGUgZGlzdHJpYnVjacOzbiBhY3VtdWxhdGl2YSAoRkRBKQpwbG90KHZhbG9yZXNfY29udHJhdG8sIHByb2JfYWN1bXVsYXRpdmEsIHR5cGUgPSAibCIsIGx3ZCA9IDIsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIlByb2JhYmlsaWRhZCBhY3VtdWxhdGl2YSBtYXlvciIsCiAgICAgeGxhYiA9ICJWYWxvciBGaW5hbCBkZWwgQ29udHJhdG8iLCB5bGFiID0gIlByb2JhYmlsaWRhZCBBY3VtdWxhdGl2YSIpCgpjb250cmF0b18xIDwtIDE2NjkwNTY3MCAKY29udHJhdG9fMiA8LSA3Njk1NjYxNSAKYWJsaW5lKHYgPSBjb250cmF0b18xLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKYWJsaW5lKHYgPSBjb250cmF0b18yLCBjb2wgPSAiZ3JlZW4iLCBsdHkgPSAyKQpsZWdlbmQoImJvdHRvbXJpZ2h0IiwgbGVnZW5kID0gYygiRkRBIFdlaWJ1bGwiLCAiQ29udHJhdG8gMSIsICJDb250cmF0byAyIiksIAogICAgICAgY29sID0gYygiYmx1ZSIsICJyZWQiLCAiZ3JlZW4iKSwgbHR5ID0gYygxLCAyLCAyKSwgY2V4ID0gMC44KQoKYGBgCjwvZGl2PgoKKipFc3RpbWFjaW9uZXM6KioKCkRhZGEgbGEgZnVuY2nDs24gZGUgZGlzdHJpYnVjacOzbiBhY3VtdWxhdGl2YSwgwr9jw7NtbyBzZSBlc3RpbWFyw61hIGVsIHZhbG9yIG1lZGlvIGVzcGVyYWRvIGRlIGxvcyBWYWxvcmVzIEZpbmFsZXMgZGUgQ29udHJhdG8/Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgojIFBhcsOhbWV0cm9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbCBhanVzdGFkYQpmb3JtYSA8LSBXZWlidWxsJGVzdGltYXRlWzFdCmVzY2FsYSA8LSBXZWlidWxsJGVzdGltYXRlWzJdCgojIE1lZGlhIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbAptZWRpYV93ZWlidWxsIDwtIGVzY2FsYSAqIGdhbW1hKDEgKyAxIC8gZm9ybWEpCgpwcmludChwYXN0ZSgiTGEgbWVkaWEgZXNwZXJhZGEgZGUgbG9zIFZhbG9yZXMgRmluYWxlcyBkZSBDb250cmF0byBzZWfDum4gbGEgZGlzdHJpYnVjacOzbiBXZWlidWxsIGFqdXN0YWRhIGVzOiIsIHJvdW5kKG1lZGlhX3dlaWJ1bGwsIDIpKSkKCgpgYGAKPC9kaXY+Cgo8YnIvPgoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQpwYXJhbWV0cm9zX3dlaWJ1bGwgPC0gRGlzdHJpYnVjaW9uX1dlaWJ1bGwkZXN0aW1hdGUKCiMgRnVuY2nDs24gZGUgZGVuc2lkYWQgZGUgcHJvYmFiaWxpZGFkIChGRFApIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbApmZHBfd2VpYnVsbCA8LSBmdW5jdGlvbih4KSBkd2VpYnVsbCh4LCBzaGFwZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsxXSwgc2NhbGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMl0pCnZhbG9yZXNfY29udHJhdG8gPC0gc2VxKDAsIG1heChkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCksIGxlbmd0aC5vdXQgPSAxMDApCgojIERlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBwYXJhIGNhZGEgdmFsb3IKZGVuc2lkYWRfcHJvYmFiaWxpZGFkIDwtIGZkcF93ZWlidWxsKHZhbG9yZXNfY29udHJhdG8pCgojIEdyw6FmaWNvIGRlIGxhIGZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCAoRkRQKQpwbG90KHZhbG9yZXNfY29udHJhdG8sIGRlbnNpZGFkX3Byb2JhYmlsaWRhZCwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiVmFsb3IgbWVkaW8gZXNwZXJhZG8iLAogICAgIHhsYWIgPSAiVmFsb3IgRmluYWwgZGVsIENvbnRyYXRvIiwgeWxhYiA9ICJEZW5zaWRhZCBkZSBQcm9iYWJpbGlkYWQiKQoKbWVkaWEgPC0gMjYxOTM3ODg4OC4xMQphYmxpbmUodiA9IG1lZGlhLCBjb2wgPSAicHVycGxlIiwgbHR5ID0gMikKdGV4dCh4ID0gbWVkaWEsIHkgPSBtYXgoZGVuc2lkYWRfcHJvYmFiaWxpZGFkKSAqIDAuOCwKICAgICBsYWJlbHMgPSBwYXN0ZSgiTWVkaWE6Iiwgcm91bmQobWVkaWEsIDIpKSwgY29sID0gInB1cnBsZSIpCgpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiRkRQIFdlaWJ1bGwiLCAiTWVkaWEiKSwgCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInB1cnBsZSIpLCBsdHkgPSBjKDEsIDIpLCBjZXggPSAwLjgpCgpgYGAKPC9kaXY+Cgo8YnIvPgoKwr9RdcOpIHJhbmdvIGRlIHZhbG9yZXMgYWJhcmNhIGVsIDkwJSBkZSBsb3MgY29udHJhdG9zPwoKPGRpdiBzdHlsZT0iYm9yZGVyOiAycHggc29saWQgI2NjYzsgcGFkZGluZzogMTBweDsgbWFyZ2luOiAxMHB4OyB0ZXh0LWFsaWduOiBsZWZ0OyI+CmBgYHtyfQoKIyBDdWFudGlsZXMgcGFyYSBlbCA1JSB5IDk1JQpjdWFudGlsXzUgPC0gcXdlaWJ1bGwoMC4wNSwgc2hhcGUgPSBhanVzdGVfd2VpYnVsbCRlc3RpbWF0ZVsxXSwgc2NhbGUgPSBhanVzdGVfd2VpYnVsbCRlc3RpbWF0ZVsyXSkKY3VhbnRpbF85NSA8LSBxd2VpYnVsbCgwLjk1LCBzaGFwZSA9IGFqdXN0ZV93ZWlidWxsJGVzdGltYXRlWzFdLCBzY2FsZSA9IGFqdXN0ZV93ZWlidWxsJGVzdGltYXRlWzJdKQoKY2F0KCJFbCByYW5nbyBkZSB2YWxvcmVzIHF1ZSBhYmFyY2EgZWwgOTAlIGRlIGxvcyBjb250cmF0b3MgZXM6Iiwgcm91bmQoY3VhbnRpbF81LCAyKSwgImEiLCByb3VuZChjdWFudGlsXzk1LCAyKSwgIlxuIikKCmBgYAo8L2Rpdj4KCjxici8+Cgo8ZGl2IHN0eWxlPSJib3JkZXI6IDJweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiAxMHB4OyBtYXJnaW46IDEwcHg7IHRleHQtYWxpZ246IGxlZnQ7Ij4KYGBge3J9CgojIFBhcsOhbWV0cm9zIGFqdXN0YWRvcyBkZSBsYSBkaXN0cmlidWNpw7NuIFdlaWJ1bGwKcGFyYW1ldHJvc193ZWlidWxsIDwtIERpc3RyaWJ1Y2lvbl9XZWlidWxsJGVzdGltYXRlCgojIEZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCAoRkRQKSBkZSBsYSBkaXN0cmlidWNpw7NuIFdlaWJ1bGwKZmRwX3dlaWJ1bGwgPC0gZnVuY3Rpb24oeCkgZHdlaWJ1bGwoeCwgc2hhcGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMV0sIHNjYWxlID0gcGFyYW1ldHJvc193ZWlidWxsWzJdKQp2YWxvcmVzX2NvbnRyYXRvIDwtIHNlcSgwLCBtYXgoZGF0b3MxJGBWYWxvciBGaW5hbCBDb250cmF0b2ApLCBsZW5ndGgub3V0ID0gMTAwKQoKIyBEZW5zaWRhZCBkZSBwcm9iYWJpbGlkYWQgcGFyYSBjYWRhIHZhbG9yCmRlbnNpZGFkX3Byb2JhYmlsaWRhZCA8LSBmZHBfd2VpYnVsbCh2YWxvcmVzX2NvbnRyYXRvKQoKIyBHcsOhZmljbyBkZSBsYSBmdW5jacOzbiBkZSBkZW5zaWRhZCBkZSBwcm9iYWJpbGlkYWQgKEZEUCkKcGxvdCh2YWxvcmVzX2NvbnRyYXRvLCBkZW5zaWRhZF9wcm9iYWJpbGlkYWQsIHR5cGUgPSAibCIsIGx3ZCA9IDIsIGNvbCA9ICJibHVlIiwKICAgICBtYWluID0gIjkwJSBkYXRvcyBtdWVzdHJhIiwKICAgICB4bGFiID0gIlZhbG9yIEZpbmFsIGRlbCBDb250cmF0byIsIHlsYWIgPSAiRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIikKCiMgTMOtbWl0ZXMKbGltaXRlX2luZmVyaW9yIDwtIDQ2NTgxOTQ5CmxpbWl0ZV9zdXBlcmlvciA8LSA5MzY1NTk0NDgzCgojIEzDrW5lYXMgcHVudGVhZGFzIHBhcmEgbG9zIGzDrW1pdGVzCmFibGluZSh2ID0gYyhsaW1pdGVfaW5mZXJpb3IsIGxpbWl0ZV9zdXBlcmlvciksIGNvbCA9IGMoInJlZCIsICJncmVlbiIpLCBsdHkgPSAyKQoKIyDDgXJlYSBzb21icmVhZGEgZW50cmUgbG9zIGzDrW1pdGVzCnhfYXJlYSA8LSBjKGxpbWl0ZV9pbmZlcmlvciwgdmFsb3Jlc19jb250cmF0b1t2YWxvcmVzX2NvbnRyYXRvID49IGxpbWl0ZV9pbmZlcmlvciAmIHZhbG9yZXNfY29udHJhdG8gPD0gbGltaXRlX3N1cGVyaW9yXSwgbGltaXRlX3N1cGVyaW9yKQp5X2FyZWEgPC0gYygwLCBkZW5zaWRhZF9wcm9iYWJpbGlkYWRbdmFsb3Jlc19jb250cmF0byA+PSBsaW1pdGVfaW5mZXJpb3IgJiB2YWxvcmVzX2NvbnRyYXRvIDw9IGxpbWl0ZV9zdXBlcmlvcl0sIDApCnBvbHlnb24oeF9hcmVhLCB5X2FyZWEsIGNvbCA9ICJsaWdodGdyYXkiLCByZ2IoMC44LCAwLjgsIDAuOCwgMC41KSwgYm9yZGVyID0gTkEpCgojIExleWVuZGEKbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkZEUCBXZWlidWxsIiwgIkzDrW1pdGUgSW5mZXJpb3IiLCAiTMOtbWl0ZSBTdXBlcmlvciIpLCAKICAgICAgIGNvbCA9IGMoImJsdWUiLCAicmVkIiwgImdyZWVuIiwgcmdiKDAuOCwgMC44LCAwLjgsIDAuNSkpLCBsdHkgPSBjKDEsIDIsIDIsIDApLCBjZXggPSAwLjgpCgpgYGAKPC9kaXY+Cgo8YnIvPgoKKipQcm9iYWJpbGlkYWRlcyBkZSBFdmVudG9zIEZ1dHVyb3MqKgoKwr9DdcOhbCBlcyBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHVuIGNvbnRyYXRvIHRlbmdhIHVuIHZhbG9yIHN1cGVyaW9yIHN1cGVyaW9yIGEgbGEgbWVkaWEgZGUgbGEgZGlzdHJpYnVjacOzbj8KCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KIyBEaXN0cmlidWNpw7NuIFdlaWJ1bGwgYWp1c3RhZGEKZm9ybWEgPC0gV2VpYnVsbCRlc3RpbWF0ZVsxXQplc2NhbGEgPC0gV2VpYnVsbCRlc3RpbWF0ZVsyXQoKIyBNZWRpYSBkZSBsYSBkaXN0cmlidWNpw7NuIFdlaWJ1bGwKbWVkaWFfd2VpYnVsbCA8LSBlc2NhbGEgKiBnYW1tYSgxICsgMSAvIGZvcm1hKQoKIyBQcm9iYWJpbGlkYWQgCnByb2Jfc3VwZXJpb3JfbWVkaWEgPC0gMSAtIHB3ZWlidWxsKG1lZGlhX3dlaWJ1bGwsIHNoYXBlID0gZm9ybWEsIHNjYWxlID0gZXNjYWxhKQoKcHJpbnQocGFzdGUoIkxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gY29udHJhdG8gdGVuZ2EgdW4gdmFsb3Igc3VwZXJpb3IgYSBsYSBtZWRpYSBlczoiLCByb3VuZChwcm9iX3N1cGVyaW9yX21lZGlhLCA0KSkpCgpgYGAKPC9kaXY+Cgo8YnIvPgoKCjxkaXYgc3R5bGU9ImJvcmRlcjogMnB4IHNvbGlkICNjY2M7IHBhZGRpbmc6IDEwcHg7IG1hcmdpbjogMTBweDsgdGV4dC1hbGlnbjogbGVmdDsiPgpgYGB7cn0KCiMgUGFyw6FtZXRyb3MgYWp1c3RhZG9zIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbApwYXJhbWV0cm9zX3dlaWJ1bGwgPC0gRGlzdHJpYnVjaW9uX1dlaWJ1bGwkZXN0aW1hdGUKCiMgRnVuY2nDs24gZGUgZGVuc2lkYWQgZGUgcHJvYmFiaWxpZGFkIChGRFApIGRlIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbApmZHBfd2VpYnVsbCA8LSBmdW5jdGlvbih4KSBkd2VpYnVsbCh4LCBzaGFwZSA9IHBhcmFtZXRyb3Nfd2VpYnVsbFsxXSwgc2NhbGUgPSBwYXJhbWV0cm9zX3dlaWJ1bGxbMl0pCnZhbG9yZXNfY29udHJhdG8gPC0gc2VxKDAsIG1heChkYXRvczEkYFZhbG9yIEZpbmFsIENvbnRyYXRvYCksIGxlbmd0aC5vdXQgPSAxMDApCgojIERlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCBwYXJhIGNhZGEgdmFsb3IKZGVuc2lkYWRfcHJvYmFiaWxpZGFkIDwtIGZkcF93ZWlidWxsKHZhbG9yZXNfY29udHJhdG8pCgojIEdyw6FmaWNvIGRlIGxhIGZ1bmNpw7NuIGRlIGRlbnNpZGFkIGRlIHByb2JhYmlsaWRhZCAoRkRQKQpwbG90KHZhbG9yZXNfY29udHJhdG8sIGRlbnNpZGFkX3Byb2JhYmlsaWRhZCwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gImJsdWUiLAogICAgIG1haW4gPSAiRGF0b3MgbWF5b3JlcyBhIGxhIG1lZGlhIiwKICAgICB4bGFiID0gIlZhbG9yIEZpbmFsIGRlbCBDb250cmF0byIsIHlsYWIgPSAiRGVuc2lkYWQgZGUgUHJvYmFiaWxpZGFkIikKCiMgTMOtbWl0ZXMKbGltaXRlX2luZmVyaW9yIDwtIDI2MTkzNzg4ODguMTEKbGltaXRlX3N1cGVyaW9yIDwtIDE5NjI3MTc1MTE0CgoKIyBMw61uZWFzIHB1bnRlYWRhcyBwYXJhIGxvcyBsw61taXRlcwphYmxpbmUodiA9IGMobGltaXRlX2luZmVyaW9yLCBsaW1pdGVfc3VwZXJpb3IpLCBjb2wgPSBjKCJyZWQiLCAiZ3JlZW4iKSwgbHR5ID0gMikKCiMgw4FyZWEgc29tYnJlYWRhIGVudHJlIGxvcyBsw61taXRlcwp4X2FyZWEgPC0gYyhsaW1pdGVfaW5mZXJpb3IsIHZhbG9yZXNfY29udHJhdG9bdmFsb3Jlc19jb250cmF0byA+PSBsaW1pdGVfaW5mZXJpb3IgJiB2YWxvcmVzX2NvbnRyYXRvIDw9IGxpbWl0ZV9zdXBlcmlvcl0sIGxpbWl0ZV9zdXBlcmlvcikKeV9hcmVhIDwtIGMoMCwgZGVuc2lkYWRfcHJvYmFiaWxpZGFkW3ZhbG9yZXNfY29udHJhdG8gPj0gbGltaXRlX2luZmVyaW9yICYgdmFsb3Jlc19jb250cmF0byA8PSBsaW1pdGVfc3VwZXJpb3JdLCAwKQpwb2x5Z29uKHhfYXJlYSwgeV9hcmVhLCBjb2wgPSAibGlnaHRncmF5IiwgcmdiKDAuOCwgMC44LCAwLjgsIDAuNSksIGJvcmRlciA9IE5BKQoKIyBMZXllbmRhCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJGRFAgV2VpYnVsbCIsICJMw61taXRlIEluZmVyaW9yIiwgIkzDrW1pdGUgU3VwZXJpb3IiKSwgCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsIHJnYigwLjgsIDAuOCwgMC44LCAwLjUpKSwgbHR5ID0gYygxLCAyLCAyLCAwKSwgY2V4ID0gMC44KQoKCmBgYAo8L2Rpdj4KCjxici8+Cjxici8+CgojIyMgKipBbsOhbGlzaXMgeSBDb25jbHVzaW9uZXMqKgoKPGJyLz4KCgoqKkFOw4FMSVNJUzoqKkVsIGFuw6FsaXNpcyBkZXRhbGxhZG8gZGUgbGEgYmFzZSBkZSBkYXRvcyAiTWF0cml6IEJvZ290w6EgVHVyaXNtbyIgcmV2ZWxhIHVuYSB2aXNpw7NuIHNpZ25pZmljYXRpdmEgZGVsIGVzdGFkbyBnZW5lcmFsIGRlIGxvcyBjb250cmF0b3MgeSBzdSB2YWxvciBmaW5hbCBlbiBlbCBjb250ZXh0byB0dXLDrXN0aWNvIGRlIGxhIGNpdWRhZC4gTGEgcHJpbWVyYSBncsOhZmljYSByZWZsZWphIG1heW9yaXRhcmlhbWVudGUgY29udHJhdG9zIGVuIGVqZWN1Y2nDs24gZW4gdG9kYXMgbGFzIGxvY2FsaWRhZGVzLCBzdWdpcmllbmRvIHVuIHNlc2dvIHBvc2l0aXZvIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZGF0b3MuIFNpbiBlbWJhcmdvLCBlc3RhIGludGVycHJldGFjacOzbiBpbmljaWFsIHBvZHLDrWEgc2VyIGRlc3ZpYWRhLCB5YSBxdWUgbXVjaG9zIHByb3llY3RvcyBuaSBzaXF1aWVyYSBoYW4gY29tZW56YWRvIG8sIG11Y2hvIG1lbm9zLCBmaW5hbGl6YWRvLgoKU2Ugb2JzZXJ2YSBxdWUgbGEgZmFsdGEgZGUgZGlzdHJpYnVjacOzbiBlbiBpbnRlcnZhbG9zIHkgbGEgY29uY2VudHJhY2nDs24gZW4gbGEgZmFzZSBkZSBlamVjdWNpw7NuIHB1ZWRlbiBkZWJlcnNlIGEgZGl2ZXJzb3MgZmFjdG9yZXMsIGNvbW8gbWFsb3MgY29udHJhdGlzdGFzIG8gbGEgZmFsdGEgZGUgYXZhbmNlIHJlYWwgZW4gbGFzIG9icmFzLiBMb3MgaGlzdG9ncmFtYXMgaW5kaWNhbiBxdWUgbGFzIGxvY2FsaWRhZGVzIHN1cm9jY2lkZW50YWxlcyBlbmZyZW50YW4gY29udHJhdG9zIGVuIGluY3VtcGxpbWllbnRvIG8gc3VzcGVuZGlkb3MsIG1pZW50cmFzIHF1ZSBhcXVlbGxhcyBoYWNpYSBlbCBub3J0ZSwgb3JpZW50ZSBvIHN1cm9yaWVudGUgdGllbmRlbiBhIHRlbmVyIHByb3llY3RvcyBlbiBlamVjdWNpw7NuIG8gdGVybWluYWRvcy4KCkVsIGFuw6FsaXNpcyByZWFsaXphZG8gc29icmUgbG9zIFZhbG9yZXMgRmluYWxlcyBkZSBDb250cmF0byB1dGlsaXphbmRvIGxhIGRpc3RyaWJ1Y2nDs24gV2VpYnVsbCBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gdmFsaW9zYSBzb2JyZSBsYSB2YXJpYWJpbGlkYWQgeSBsYSBwcm9iYWJpbGlkYWQgYXNvY2lhZGEgY29uIGVzdGEgdmFyaWFibGUuIExhIGVsZWNjacOzbiBkZSBsYSBkaXN0cmlidWNpw7NuIFdlaWJ1bGwgc2UgYmFzw7MgZW4gcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzIHkgZWwgYWp1c3RlIHZpc3VhbCBkZSBsb3MgZGF0b3MuIFNlIGVuY29udHLDsyBxdWUgZXN0YSBkaXN0cmlidWNpw7NuIHNlIGFqdXN0YSBhZGVjdWFkYW1lbnRlIGEgbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBWYWxvcmVzIEZpbmFsZXMgZGUgQ29udHJhdG8uCgpMYXMgcHJvYmFiaWxpZGFkZXMgYWN1bXVsYXRpdmFzIHByb3BvcmNpb25hbiBpbmZvcm1hY2nDs24gc29icmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSB1biBjb250cmF0byB0ZW5nYSB1biB2YWxvciBmaW5hbCBtZW5vciBvIGlndWFsIGEgdW4gY2llcnRvIHVtYnJhbC4gRXN0YXMgcHJvYmFiaWxpZGFkZXMgc29uIHZhbGlvc2FzIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIHkgbGEgZXZhbHVhY2nDs24gZGUgcmllc2dvcy4KCkFsIGNvbXBhcmFyIGxhcyBwcm9iYWJpbGlkYWRlcyBhY3VtdWxhdGl2YXMgZGUgZG9zIGNvbnRyYXRvcyBzZWxlY2Npb25hZG9zIGFsIGF6YXIsIHNlIHB1ZWRlIGRldGVybWluYXIgY3XDoWwgdGllbmUgdW5hIHByb2JhYmlsaWRhZCBtw6FzIGFsdGEgZGUgdGVuZXIgdW4gVmFsb3IgRmluYWwgZGUgQ29udHJhdG8gaW5mZXJpb3IuIEVzdG8gZXMgw7p0aWwgcGFyYSB0b21hciBkZWNpc2lvbmVzIGluZm9ybWFkYXMgc29icmUgbGEgZ2VzdGnDs24gZGUgY29udHJhdG9zLgoKTGEgYXBsaWNhY2nDs24gZGUgZXN0b3MgY29uY2VwdG9zIGVuIHNpdHVhY2lvbmVzIHByw6FjdGljYXMgcHVlZGUgYXl1ZGFyIGVuIGxhIHBsYW5pZmljYWNpw7NuIHkgdG9tYSBkZSBkZWNpc2lvbmVzIHJlbGFjaW9uYWRhcyBjb24gY29udHJhdG9zLiBTZSBwdWVkZW4gdXRpbGl6YXIgcGFyYSBldmFsdWFyIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgbG9zIGNvbnRyYXRvcyBhbGNhbmNlbiBjaWVydG9zIHVtYnJhbGVzIGRlIHZhbG9yIG8gcGFyYSBlc3RpbWFyIGNvc3RvcyBlc3BlcmFkb3MuCgoKCjxici8+CgoqKkNPTkNMVVNJw5NOOioqTGEgZXZhbHVhY2nDs24gZGUgbG9zIGNvbnRyYXRvcyBlbiBCb2dvdMOhIHByZXNlbnRhIGRlc2Fmw61vcyBzaWduaWZpY2F0aXZvcyBkZXJpdmFkb3MgZGUgbGEgY29tcGxlamlkYWQgeSBsYSBoZXRlcm9nZW5laWRhZCBkZSBsb3MgZGF0b3MuIFNlIHN1YnJheWEgbGEgaW1wb3J0YW5jaWEgZGUgYWRvcHRhciBlbmZvcXVlcyBtw6FzIGF2YW56YWRvcyB5IGxhIG5lY2VzaWRhZCBkZSBleHBsb3JhciBtb2RlbG9zIG3DoXMgc29maXN0aWNhZG9zIGNvbiBlbCBmaW4gZGUgY29tcHJlbmRlciBwbGVuYW1lbnRlIGxhIGRpbsOhbWljYSBkZSBsb3MgY29udHJhdG9zIGVuIGVsIHNlY3RvciB0dXLDrXN0aWNvIGRlIGxhIGNpdWRhZC4gRXN0ZSBwcm95ZWN0byBwcm9wb3JjaW9uYSB1bmEgc8OzbGlkYSBiYXNlIHBhcmEgZnV0dXJhcyBpbnZlc3RpZ2FjaW9uZXMgeSBlc3RyYXRlZ2lhcyBlbiBsYSBnZXN0acOzbiBkZSBjb250cmF0b3MgZGVudHJvIGRlbCDDoW1iaXRvIHR1csOtc3RpY28sIGNvbnRyaWJ1eWVuZG8gYXPDrSBhbCBkZXNhcnJvbGxvIGRlIHByw6FjdGljYXMgbcOhcyBlZmljaWVudGVzIGVuIGRhdG9zIGVuIGVsIG1hbmVqbyBkZSBjb250cmF0b3MgZW4gZXN0YSDDoXJlYSBlc3BlY8OtZmljYS4KCgo8YnIvPgo8YnIvPgoKIyAqKlByZWd1bnRhcyBHZW5lcmFsZXMqKgoKPGJyLz4KCjxjZW50ZXI+CgoqKirCv0N1w6FsIGVzIGxhIHByb3BvcmNpw7NuIGRlIGNvbnRyYXRvcyBzdXNwZW5kaWRvcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBxdWUgaGFuIGNvbnRpbnVhZG8gbyB0ZXJtaW5hZG8sIHkgY8OzbW8gYWZlY3RhIGVzdG8gYSBsYSBkaXN0cmlidWNpw7NuIGRlIHZhbG9yZXMgZmluYWxlcz8qKioKCjwvY2VudGVyPgoKTGEgcHJvcG9yY2nDs24gZGUgbG9zIGNvbnRyYXRvcyBzdXNwZW5kaWRvcyBjb24gcmVzcGVjdG8gYSBsb3MgcXVlIGVzdGFuIGVuIGVqZWN1Y2nDs24gbyB5YSB0ZXJtaW5hZG9zIGVzIG11eSBiYWppdGEsIHB1ZWRlIHNlciBwb3IgZXNvIG1pc21vIHF1ZSBhbCBwcmVzZW50YXJzZSB2YXJpb3MgcHJvYmxlbWFzIGRlbnRybyBkZSBsb3MgY29udHJhdG9zIHUgb2JyYXMgeSBubyBzdXNwZW5kZXIsIHNpIG5vIHNlZ3VpciBpbnllY3RhbmRvIGNhcGl0YWwgZXMgcG9yIGxvIHF1ZSBhcGFyZWNlIGVzZSBzZXNnbyBwb3NpdGl2byBoYWNpYSBlbCBlc3RhZG8gZGUgZWplY3VjacOzbiwgcXVlIHB1ZWRlIHNpZ25pZmljYXIgdW4gc29icmUgY29zdG8uCgo8YnIvPgo8Y2VudGVyPgoKKioqwr9Dw7NtbyB2YXLDrWEgbGEgZGlzdHJpYnVjacOzbiBkZSB2YWxvcmVzIGZpbmFsZXMgZW50cmUgY29udHJhdG9zIGVuIGRpZmVyZW50ZXMgZXN0YWRvcyAobGlxdWlkYWRvLCBpbmN1bXBsaW1pZW50bywgcG9yIGluaWNpYXIsIHN1c3BlbmRpZG8sIHRlcm1pbmFkbyk/KioqCgo8L2NlbnRlcj4KClRlbmVtb3MgcXVlIGxhIG1heW9yIGNhbnRpZGFkIGRlIGRpbmVybyBzZWfDum4gZWwgdmFsb3IgZmluYWwgZGVsIGNvbnRyYXRvIGVzdMOhbiBlbiBsYXMgY2F0ZWdvcsOtYXMgZG9uZGUgbcOhcyBzZSBkZW1hbmRhIGRpbmVybzogYWwgbW9tZW50byBkZSBpbmljaWFyIGVsIGNvbnRyYXRvIHBvciB0b2RvcyBsb3MgY29zdG9zIHByZWxpbWluYXJlcywgY3VhbmRvIGRlIGVzdGFuIGVqZWN1dGFuZG8gcG9yIHRvZGFzIGxhcyBwb3NpYmxlcyBkZW1vcmFzLCBhYmFuZG9ub3MgeSBkZW3DoXMgZmFjdG9yZXMgcXVlIHB1ZWRlbiBvY3VycmlyIGVuIHVuYSBvYnJhLCB5IGFsIGZpbmFsaXphciBlbCBjb250cmF0bywgY3VhbnRvIGZhbHRhIHVsdGltYXIgZGV0YWxsZXMgeSBkYXIgbGlxdWlkZXogYSBlc3RlLgoKPGJyLz4KPGNlbnRlcj4KCioqKsK/Q8OzbW8gaW5mbHV5ZSBsYSB1YmljYWNpw7NuIGdlb2dyw6FmaWNhIGVuIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgdmFsb3JlcyBmaW5hbGVzIGRlIGxvcyBjb250cmF0b3M/KioqCgo8L2NlbnRlcj4KCkxhIHViaWNhY2nDs24gZW4gZG9uZGUgc2UgZXN0YW4gcmVhbGl6YW5kbyBsb3MgY29udHJhdG9zIHZhcsOtYSBiYXN0YW50ZSBlbnRyZSBsYXMgbG9jYWxpZGFkZXMsIHlhIHF1ZSBsYXMgbG9jYWxpZGFkZXMgc3Vyb2NjaWRlbnRhbGVzIGVuZnJlbnRhbiBjb250cmF0b3MgZW4gaW5jdW1wbGltaWVudG8gbyBzdXNwZW5kaWRvcywgbWllbnRyYXMgcXVlIGFxdWVsbGFzIGhhY2lhIGVsIG5vcnRlLCBvcmllbnRlIG8gc3Vyb3JpZW50ZSB0aWVuZGVuIGEgdGVuZXIgcHJveWVjdG9zIGVuIGVqZWN1Y2nDs24gbyB0ZXJtaW5hZG9zLgoKPGJyLz4KPGNlbnRlcj4KCioqKsK/Q3XDoWwgZXMgZWwgaW1wYWN0byBwb3RlbmNpYWwgZGUgc2VzZ28gcG9zaXRpdm8gZW4gbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZGF0b3MgcGFyYSBjb250cmF0b3MgZW4gZWplY3VjacOzbj8qKioKCjwvY2VudGVyPgoKRWwgc2VzZ28gcG9zaXRpdm8gZW4gbGEgZGlzdHJpYnVjacOzbiBkZSBkYXRvcyBwYXJhIGNvbnRyYXRvcyBlbiBlamVjdWNpw7NuIHN1Z2llcmUgdW5hIHBvc2libGUgc29icmVlc3RpbWFjacOzbiBkZSBsb3MgdmFsb3JlcyBmaW5hbGVzLCBxdWUgc2UgcHVlZGVuIGRlYmVyIGEgdmFyaW9zIGZhY3RvcmVzIGRlIHNvYnJlY29zdG9zIGVuIGxhIGVqZWN1Y2nDs24gZGUgZXN0b3MgY29udHJhdG9zCgo8YnIvPgoKPGNlbnRlcj4KCioqKsK/Q8OzbW8gYWZlY3RhIGxhIGluY2x1c2nDs24gZGUgY29udHJhdG9zIHF1ZSBuaSBzaXF1aWVyYSBoYW4gY29tZW56YWRvIGFsIGFuw6FsaXNpcyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHZhbG9yZXMgZmluYWxlcyBlbiBjb250cmF0b3MgZW4gZWplY3VjacOzbj8qKioKCjwvY2VudGVyPgoKTGEgaW5jbHVzacOzbiBkZSBjb250cmF0b3MgcXVlIG5vIGhhbiBjb21lbnphZG8gcHVlZGUgaW50cm9kdWNpciBzZXNnb3MgZW4gbGEgZGlzdHJpYnVjacOzbiBkZSB2YWxvcmVzIGZpbmFsZXMgcGFyYSBjb250cmF0b3MgZW4gZWplY3VjacOzbiwgeWEgcXVlIGxhIGZhbHRhIGRlIGRhdG9zIHNvYnJlIHByb3llY3RvcyBubyBpbmljaWFkb3MgcHVlZGUgZGlzdG9yc2lvbmFyIGxhIGludGVycHJldGFjacOzbiBnZW5lcmFsIHkgY29uZHVjaXIgYSBjb25jbHVzaW9uZXMgbWVub3MgcHJlY2lzYXMgc29icmUgZWwgcmVuZGltaWVudG8gZGUgZXN0b3MgY29udHJhdG9zIGVuIHBhcnRpY3VsYXIKCgo8YnIvPgoKIyAqKkJpYmxpb2dyYWbDrWEqKgoKPGJyLz4KCi0gKipDw6FtYXJhIGRlIGNvbWVyY2lvIGRlIEJvZ290w6E6KioKPGJyLz4KaHR0cHM6Ly93d3cuY2NiLm9yZy5jby9pbmZvcm1hY2lvbi1lc3BlY2lhbGl6YWRhL29ic2VydmF0b3Jpby9hbmFsaXNpcy1lY29ub21pY28vdHVyaXNtbwoKLSAqKkJvZ290w6EuZ292LmNvOioqCjxici8+Cmh0dHBzOi8vYm9nb3RhLmdvdi5jby9taS1jaXVkYWQvdHVyaXNtby9ib2dvdGEtaW1wYXJhYmxlLWVuLW9jdXBhY2lvbi1ob3RlbGVyYS15LXR1cmlzbW8KCi0gKipDZW50cm8gR29iaWVybm8gTG9jYWw6KioKPGJyLz4KaHR0cHM6Ly9jZW50cm9nb2JpZXJub2xvY2FsLmdvYmllcm5vYm9nb3RhLmdvdi5jby9kYXRvcy1sb2NhbGVzL29icmFzLWxvY2FsZXMvc2VndWltaWVudG8tZGUtaW52ZXJzaW9uLWVuLWluZnJhZXN0cnVjdHVyYS0yMDIxLTIwMjMKCi0gKipNYW5lam8gUnN0dWRpbyoqCjxici8+Cmh0dHBzOi8vci1jaGFydHMuY29tLwoKLSAqKk1hbnVhbCBSc3R1ZGlvKioKPGJyLz4KaHR0cHM6Ly9maGVybmFuYi5naXRodWIuaW8vTWFudWFsLWRlLVIvb2JqZXRvcy5odG1sI2xpc3RhcwoK