0. Definición del ambiente de trabajo.
Al comenzar siempre es importante establecer el idioma adecuado para
que el programa reconozca caracteres especiales. En el caso de definir
al idioma español, la instrucción a utilizar es:
Sys.setlocale("LC_ALL", "es_ES") #alternativa 1
## [1] "es_ES/es_ES/es_ES/C/es_ES/es_ES"
Sys.setenv(LANG = "es_ES") #alternativa 2
También es importante instalar las librerías que se utilizarán
posteriormente, para ello primero se guardan como un objeto:
paquetes <- c("tidyverse", "DescTools")
Posteriormente se “llaman” a las librerías mediante el script
libraries() de la paquetería easypackages:
library(easypackages)
libraries(paquetes)
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Loading required package: DescTools
##
## All packages loaded successfully
Además es muy relevante establecer la ubicación del directorio de
trabajo, para que el programa identifique el archivo del que extraerá y,
también, guardará la información solicitada.
getwd() ##directorio actual
## [1] "/Users/gustavo/Dropbox/R/Rmarkdown"
setwd("~/Dropbox/R/Rmarkdown") ##Esta permite cambiar y definir el directorio deseado
list.files() ##Esta permite enlistar los archivos dentro del directorio
## [1] "Actividad_1.html"
## [2] "Actividad_1.Rmd"
## [3] "Actividad_2_Exploracion_Descripcion.pdf"
## [4] "Actividad_2.html"
## [5] "Actividad_2.Rmd"
## [6] "Actividad_3_1_.html"
## [7] "Actividad_3_Estadistica_Descriptiva.pdf"
## [8] "Actividad_3-1-.html"
## [9] "Actividad_3(1).Rmd"
## [10] "Actividad_4_files"
## [11] "actividad_4_inferencia.Rmd"
## [12] "Actividad_4. Probabilidad y Distribución Normal.pdf"
## [13] "Actividad_4._Probabilidad_Distribucion_Normal.pdf"
## [14] "Actividad_4.html"
## [15] "Actividad_4.Rmd"
## [16] "Actividad_5_Inferencia_Est.docx"
## [17] "Actividad_5_Inferencia_Est.html"
## [18] "Actividad_5_Inferencia_Est.pdf"
## [19] "Actividad_5_Inferencia_Est.Rmd"
## [20] "actividad_6_intervalos_confianza.html"
## [21] "actividad_6_intervalos_confianza.Rmd"
## [22] "Actividad_7_Contingencia_Correlacion.html"
## [23] "Actividad_7_Contingencia_Correlacion.Rmd"
## [24] "actividad_correlacion.html"
## [25] "actividad_correlacion.Rmd"
## [26] "actividad_regresion_lineal_simple.html"
## [27] "actividad_regresion_lineal_simple.Rmd"
## [28] "actividad_regresion_lineal.html"
## [29] "actividad_regresion_lineal.Rmd"
## [30] "actividad_regresion_logit.html"
## [31] "actividad_regresion_logit.Rmd"
## [32] "add in ymlthis.png"
## [33] "adiciones a modelos OLS.Rmd"
## [34] "adiciones-a-modelos-OLS.html"
## [35] "analisis_clusters.html"
## [36] "analisis_clusters.Rmd"
## [37] "apa.csl"
## [38] "bibliografia partidos_prueba.bib"
## [39] "comandos chunks en rmd.Rmd"
## [40] "comandos-chunks-en-rmd.html"
## [41] "confidence_intervals_Coursera_2.rmd"
## [42] "confidence_intervals_Coursera.rmd"
## [43] "diseno yaml.Rmd"
## [44] "diseno-yaml.html"
## [45] "dist_normal.png"
## [46] "dist_z_t.png"
## [47] "distill.png"
## [48] "ha_h0.gif"
## [49] "inf_for_numerical_data.Rmd"
## [50] "intervalo_confianza.png"
## [51] "intro_MCA.html"
## [52] "intro_MCA.Rmd"
## [53] "intro_pca.html"
## [54] "intro_pca.Rmd"
## [55] "intro_to_data_Coursera.rmd"
## [56] "intro_to_r_coursera_2.Rmd"
## [57] "intro_to_r_Coursera.Rmd"
## [58] "metodologia.bib"
## [59] "papaja.png"
## [60] "poblacion_muestra.png"
## [61] "potencia.png"
## [62] "presentacion_reg_logit_ordinal.html"
## [63] "presentacion_reg_logit_ordinal.Rmd"
## [64] "probability_Coursera.Rmd"
## [65] "prueba chunks.Rmd"
## [66] "prueba de YAML.Rmd"
## [67] "prueba sintax markdown.Rmd"
## [68] "prueba_uso_markdown_files"
## [69] "prueba_uso_markdown.html"
## [70] "prueba_uso_markdown.Rmd"
## [71] "prueba-chunks_files"
## [72] "prueba-chunks.html"
## [73] "prueba-de-YAML.html"
## [74] "prueba-de-YAML.pdf"
## [75] "prueba-sintax-markdown.html"
## [76] "pruebas_hipotesis_bivariadas.html"
## [77] "pruebas_hipotesis_bivariadas.Rmd"
## [78] "references.bib"
## [79] "regresion_efectos_fijos.html"
## [80] "regresion_efectos_fijos.Rmd"
## [81] "regresion_lineal_multiple.html"
## [82] "regresion_lineal_multiple.Rmd"
## [83] "regresion_lineal_simple_presentacion.html"
## [84] "regresion_lineal_simple_presentacion.Rmd"
## [85] "rsconnect"
## [86] "rticles.png"
## [87] "sampling_distributions_Coursera.rmd"
## [88] "script_PCA.R"
## [89] "script_reg_lineal.R"
## [90] "sintax_markdown.html"
## [91] "sintax_markdown.Rmd"
## [92] "syllabus sistemas politicos comparados uabc 2022-2.Rmd"
## [93] "syllabus-sistemas-politicos-comparados-uabc-2022-2.pdf"
## [94] "vars_democ_latinob.png"
## [95] "ventana_config_basica_yaml.png"
## [96] "ventana_plantillas_articulos.png"
## [97] "ventana_selec_plantilla_yaml.png"
## [98] "zotero1.png"
## [99] "zotero2.png"
## [100] "zotero3.png"
Una vez establecido el directorio de trabajo, se debe cargar la base
de datos o data frame en el ambiente del programa, con el que se
analizará la información. Para ello habrá que “cargar” la información
sobre los pacientes infectados por COVID-19 reportados por la Secretaría
de Salud del gobierno federal mexicano.
datos_covid <- read.csv("~/Dropbox/R/200613COVID19MEXICO.csv", header = TRUE) #ruta de acceso a los datos, 'header = TRUE' en caso de que el archivo cuente con nombres de las variables.
1. Estadística inferencial y generación de conocimiento mediante
inferencias
El proceso de generación de conocimiento, para conocer una realidad,
usualmente procede mediante alguna de las dos vías tradicionales:
mediante métodos deductivos o inductivos. En términos de King, Keohane y
Verba (2000[1994]), las tradiciones cuantitativas y cualitativas también
suponían formas distintas de acercarse a conocer la realidad, pero en el
fondo ambas tradiciones se basan en una misma lógica inferencial.
Esto es, el proceso de conocimiento científico se apoya en el proceso
de generación y evaluación mediante el uso de inferencias. Una
inferencia consiste en conocer algo que se desconoce a partir de
elementos (datos) conocidos, según King, Keohane y Verba (2000). Y estas tienden a traducirse en
distintas herramientas (como lo son las hipótesis) que, en el análisis
cuantitativo, se busca someter a evaluación frente a los datos (en gran
medida provienen de muestras) disponibles con el fin de conocer a la
realidad (poblacional) mediante estimaciones.
La estadística inferencial consiste en un conjunto de técnicas y
herramientas de la estadística con las que se busca generar
estimaciones sobre la realidad (poblacional) a partir
de los datos disponibles (muestrales) que, al final, puedan
generalizarse. De manera que “la inferencia pretende generalizar la
información contenida en unos datos a un cuerpo de conocimientos más
amplio.” (cobo2007?)
En este sentido, la lógica de la metodología estadística inferencial
se apoya en la generalización mediante refutación empírica de las
inferencias iniciales, por lo que, en el fondo, se trata de un método
comparativo basado en las herramientas estadísticas que permiten evaluar
mediante estimaciones.
Los tres usos principales (vilalta2016?) de la
estadística inferencial consisten en: 1. Estimar si una muestra es
representativa de una población. 2. Estimar si una muestra difiere de
otra. 3. Estimar la probabilidad de que 2 eventos estén relacionados por
azar.
1.1. Inferencias e hipótesis
Una inferencia consiste en un argumento que busca conocer algo que se
desconoce (usualmente se refiere a una característica de la población) a
partir de elementos conocidos (suele referirse a datos provenientes de
una muestra), según King, Keohane y Verba (2000). Y a partir de la generación de
inferencias y su evaluación consecuente, se busca generar estimaciones
que permitan acercarse a conocer la realidad (poblacional).
Las hipótesis suelen ser la manera formal en que se traducen las
inferencias (ya sean descriptivas o causales, según King, Keohane y
Verba (2000)), y estas se integran con
elementos específicos: 1. variables, y 2. relaciones entre las
variables.
En el análisis cuantitativo, las hipótesis serán el punto de partida
del análisis inferencial pues, a través de su evaluación empírica, es la
manera en que se busca conocer a la realidad. Donde las hipótesis
estadísticas que se generan tienen dos características básicas:
- Según su rol en la investigación pueden ser:
- Hipótesis alternativas (\(H_a\)),
esta presenta un enunciado integrado por una o más variables y, además,
establece una relación sistemática entre éstas, por ejemplo: \[ Y = f(X)\]
- Hipótesis nula (\(H_0\)), se
integra por las mismas variables, pero aquí rechaza o niega la relación
sistemática establecida previamente; “consiste en la negación o ausencia
de diferencia [igualdad] de un efecto” (vilalta2016?): \[Y \neq f(X)\]
- Según el tipo de dirección en la relación entre variables:
- Hipótesis unidireccionales se refieren a aquellas que plantean un
sentido en la relación entre las variables tanto en la muestra como en
la población. Además, estás hipótesis pueden plantear dos tipos de
sentidos:
- Hipótesis unidireccional hacia la derecha, en la que se plantea que
el parámetro poblacional será un valor mayor al estadístico muestral
(\(\mu > \bar{X}\)).
- Hipótesis unidireccional hacia la izquierda, en la que se plantea
que el parámetro poblacional será un valor menor al estadístico muestral
(\(\mu < \bar{X}\))
- Hipótesis bidireccionales que consisten en argumentos que plantean
la existencia de una diferencia de las variables entre la muestra y la
población. \[\mu \neq X\]
En términos de la distribución de probabilidad de los valores de una
variable, el primer tipo de hipótesis se conocen también como hipótesis
de “una cola” mientras que las segundas se refieren como hipótesis de
“dos colas.”
1.2. Pruebas de hipótesis (nula) y error
La manera en que la estadística realiza el análisis y la
interpretación de los datos empíricos es a través del conjunto de
técnicas y herramientas que se agrupan bajo el nombre de “prueba de
hipótesis”, que permiten interpretar la información obtenida a partir de
responder a preguntas de investigación (vilalta2016?) mediante el uso
de estimadores (puntuales o intervalos de confianza). Este método de
evaluación de los datos también se conoce como prueba de significancia
estadística (Fisher, 1925, 1926).
El método de la prueba de significancia o de hipótesis “busca, en
esencia, probar si las mediciones provenientes de una muestra están en
armonía con la hipótesis del investigador (Fisher, 1925). Cualquier
diferencia observada entre el verdadero valor de un parámetro
poblacional y un estadístico muestral empleado para estimarlo se sujeta
a una probabilidad.” (vilalta2016?)
Si bien al intentar probar la significancia de nuestras hipótesis de
investigación desde el ámbito de la estadística inferencial, y por tanto
desde su asociación con las probabilidades de ocurrencia de un resultado
esperado en la realidad, nos enfrentamos al problema “tradicional” de la
evaluación de hipótesis. Y es que si bien se reconoce que toda hipótesis
de trabajo siempre tendrá una probabilidad de ocurrencia y, por tanto,
de ser verdadera para la realidad, esta posibilidad no permite, al
final, establecer la veracidad de nuestras hipótesis.
Una manera alternativa (de tipo popperiana) para conocer la realidad
consiste en el método de la refutación de hipótesis, que permite, al
menos, descartar hipótesis que no se ajusten a los datos empíricos
disponibles. A partir de este proceso de refutación, en la estadística
inferencial se opta por el método de la “prueba de hipótesis nula”
(PHN), en el que se desea y se busca refutar o rechazar
probabilísticamente una hipótesis de no efecto o nula. (vilalta2016?) En la medida en
que la hipótesis nula pueda ser refutada (y por ende también se refute
el argumento de no efecto o no diferencia entre las variables), se puede
aceptar que existe una mejor explicación de la realidad que suele
ubicarse en la hipótesis alternativa (aquella que plantea la existencia
de un efecto o diferencia entre variables en la población).
Dicha prueba de hipótesis o de significancia, como parte del proceso
inferencial de generación de conocimiento, si bien busca evaluar las
relaciones entre variables a partir de los datos muestrales para,
posteriormente, generalizar los resultados hacia una realidad
poblacional, reconoce que este proceso de generalización no es
determinista sino, al contrario, parte de asumir la existencia del
fenómeno de la incertidumbre presente en la realidad, que se puede
reflejar en los datos muestrales.
Dichos errores en el análisis cuantitativo se pueden generar en
distintos momentos del diseño de la investigación: * en el momento del
muestreo y recopilación de los datos, * en la medición de la realidad, o
* en la presencia de variables intervinientes que no fueron consideradas
en la investigación. (vilalta2016?;
cobo2007?; salkind2013?)
Reconocer la presencia de la incertidumbre y, también, la existencia
de diversas fuentes de error dentro del diseño de las investigaciones
permite, a su vez, asumir la existencia de un riesgo latente en el
proceso de generalización del conocimiento en el análisis estadístico
inferencial. Dicho riesgo o error en el proceso de estimación
(inferencia estadística) puede ser de dos tipos: i. aleatorio, que se
deben a fluctuaciones del azar en las distintas fases de la
investigación, y ii. sistemático, o sesgos que tienden a repetirse de
manera constante por el uso de diversas herramientas de
investigación.
De acuerdo con Cobo (cobo2007?), “la estadística
ayuda a cuantificar la magnitud de los primeros (errores aleatorios)” a
partir del cálculo del tamaño del “error aleatorio.” Esto permite “saber
con qué grado de certidumbre la diferencia observada entre un
estadístico y un parámetro puede deberse a una fluctuación aleatoria.”
(Stigler, 1986 citado en
vilalta2016?)
1.3. Error aleatorio
El error aleatorio consiste en la diferencia existente entre ambos
valores (estimadores) que se produce a raíz de analizar algo a partir de
una muestra frente a analizarlo a partir de su población entera y, a su
vez, permite evaluar el grado de certidumbre con el que se puede
concluir algo para la población a partir de la información muestral
disponible.
El error aleatorio, por tanto, “es la oscilación de los estadísticos
obtenibles en las posibles muestras (siempre centrados en el parámetro
de la población origen de la muestra).” (cobo2007?) Especialmente, la
evaluación del tamaño del error aleatorio permite comparar la distancia
existente de un estimador presente en una muestra respecto de su
posición en una población. Pero a raíz del problema de carecer de
información poblacional, ésta comparación suele llevarse a cabo entre el
estimador de una muestra con su posición correspondiente ante
una distribución muestral (el conjunto de diversas muestras de
igual tamaño al tamaño de la muestra disponible).
A medida que el tamaño del error aleatorio del estimador utilizado en
la muestra disponible tiende a ser pequeño (cercano a cero), se asume
que la muestra utilizada es representativa de la población
analizada.
El cálculo del error aleatorio se apoya en el índice del
Error estándar (SE) o error típico de la
media, que es el cociente resultante de dividir a la desviación
estándar (\(\sigma\)) de una variable
entre la raíz cuadrada del tamaño de muestra \(\sqrt{n}\): \[SE
= \frac{\sigma_\bar{X}}{\sqrt{n}}\]
La forma manual de calcular el Error estándar (SE)
se realiza aplicando las variables directamente en la fórmula
referida:
SE_EDAD <- sd(datos_covid$EDAD, na.rm = TRUE) / sqrt(length(datos_covid$EDAD))
SE_EDAD
## [1] 0.02634047
Otra manera de obtener el Error Estándar para una
variable continua de manera más directa es a través del script
MeanSE(objeto, sd = NULL, na.rm = TRUE) de la librería
DescTools(), de la siguiente manera:
SE_age <- MeanSE(datos_covid $ EDAD, sd = NULL, na.rm = TRUE)
SE_age
## [1] 0.02634047
El tamaño del error aleatorio existente entre la muestra y el
conjunto de todas las muestras posibles del mismo tamaño (distribución
muestral), a partir de comparar el estimador de la media para ambas, es
de casi 0.03 desviaciones estándar. Lo que refiere que los datos de la
muestra disponible son muy cercanos a los datos existentes en la
distribución muestral, que es nuestra mejor aproximación a la
población.
Finalmente, a partir de la definición operacional del error
aleatorio, se observa que existe una relación inversa entre el tamaño de
la muestra y el error típico, pues a medida que tiene a aumentar el
primero, el segundo se reducirá y viceversa. (cobo2007?)
Pregunta: ¿Cuál será el tamaño del error estándar de la variable de
EDAD de los pacientes con síntomas de covid-19 en caso que el tamaño de
muestra (n) fuese de 800,000 individuos?
¿Cuál será el tamaño del error estándar de la variable de Edad de los
pacientes con síntomas de covid-19 en caso que el tamaño de muestra (n)
fuese de 100,000 individuos?
2. Estimación y significancia estadística
El proceso de la inferencia estadística que se apoya en las pruebas
de hipótesis o significancia se apoya en las herramientas de la
estimación de un parámetro a partir de un estadístico proveniente de una
muestra. Y dicho proceso de estimación se puede realizar mediante dos
instrumentos:
1. Estimadores puntuales, o
2. Intervalos de Confianza.
A partir de estos estimadores se buscan responder dos tipos de
preguntas relacionadas con la prueba de una hipótesis:
1. ¿Se puede negar cierto valor del parámetro? Esta será respondida
mendiante la PHN y su Nivel de Significancia
estadística, y
2. ¿Qué valores del parámetro son creíbles? Esta será respondida
mediante los Intervalos de Confianza y su nivel de
confianza (esto se abordará en otra sesión).
2.1. Estimación puntual
Un estimador puntual “es la representación numérica
de una característica de una población que se realiza a partir de una
muestra. Es un estadístico muestral para estimar un valor de interés en
una población o universo”. (vilalta2016?) A partir del
supuesto del Teorema del Límite Central se
asume que el ejemplo clásico de estimador puntual es la media aritmética
de una muestra, que se trata como si fuera una variable aleatoria. Esto
permite, también, que su cálculo se realice sobre la base de una
distribución de probabilidades y, así, evaluar la hipótesis
generada a partir de dicho estimador y, finalmente, interpretar su
resultado a la luz de un criterio de decisión. Dicho criterio se refiere
a la significancia estadística del estimador.
2.1.2. Tipos de error en las pruebas de hipótesis
Debido a la naturaleza probabilística de las pruebas de hipótesis
(nula) o de significancia estadística, lo que se busca es evaluar la
probabilidad de ocurrencia de la hipótesis nula con el fin de tomar una
decisión final sobre la verosimilitud de la misma.
Una característica probabilística de todo resultado o evento posible
de la variable de interés consiste en que su probabilidad de ocurrencia,
por más mínima que pueda ser, nunca será igual a 0 (ausencia del evento)
o a 1 (presencia completa del evento). De manera que tanto la hipótesis
alternativa así como la hipótesis nula siempre tienen asociada una
probabilidad de ocurrencia.
Ante dicha situación, el nivel de significancia es
el criterio de decisión que se utiliza para evaluar la ocurrencia del
evento analizado y, también, para que el analista tome una
decisión (aceptar o rechazar) sobre la hipótesis evaluada como
la mejor explicación posible de la realidad.
Sin embargo, debido a la misma naturaleza probabilística de la
pruebas de hipótesis (nula) o significancia estadística también se corre
el riesgo de cometer errores al evaluar la probabilidad
de ocurrencia de una hipótesis a partir de los datos muestrales, y
también se pueden generar errores al momento en que el analista debe
tomar una decisión sobre la hipótesis (nula) evaluada.
Al evaluar la hipótesis nula se debe considerar que, en la
población dicha hipótesis puede ser verdadera o falsa, mientras
que el analista debe decidir entre rechazar o
no rechazar la hipótesis nula.
Ante esta combinación de posibilidades, se pueden generar dos
tipos de error en las pruebas de significancia:
- Error tipo I, y
- Error tipo II.
| Aceptar |
Decisión correcta |
Error tipo II (beta) |
| Rechazar |
Error tipo I (alfa) |
Decisión correcta (poder = 1 - beta) |
El error tipo I se corresponde con el Nivel de
Significancia, o que puede ser concebido también como un
falso positivo. Y este consiste en la: \(P(rechazar H0 | H0 verdadera)\). Esta
probabilidad la define el analista de manera discrecional y de antemano
a la realización de la prueba de significancia; entre los valores
estándar que se utilizan para evaluar dicho riesgo de error se suelen
ubicar en 5% o 1% (Fisher, 1925). Esto es, se considera aceptable un
error (o nivel de significancia: \(\alpha\)) del 5%, en donde se contempla que
1 de cada 20 casos el analista tome una decisión errada.
El error tipo II consiste en la probabilidad de: \(P(aceptar H0 | H0 falsa)\), y que se conoce
también como un falso negativo. Este suele representarse con el
estimador \(\beta\), que está vinculado
al tamaño de muestra (\(n\)) y, por
tanto, no puede manipularse directamente por el analista. A su vez, la
probabilidad inversa \(1-\beta\) se
conoce como el poder estadístico de la prueba de
hipótesis, y que consiste en adoptar una decisión correcta cuando \(P(\text{rechazar H0} | \text{H0 es
falsa})\). (Murphy y Myers, 2004 citado en
vilalta2016?)
2.2. Lógica de la prueba de hipótesis y p-value
Si bien el Nivel de Significancia consiste en el
criterio utilizado por el analista para tomar una decisión sobre la
inferencia generada en torno a una hipótesis nula, el estimador que se
utiliza para evaluar la significancia estadística (probabilidad)
asociada a dicha hipótesis consiste en el p-valor.
Este consiste en “la probabilidad de que se presente un valor del
estadístico (media) más alejado de la hipótesis nula (en la población)
que el observado (en la muestra).” (cobo2007?) O dicho de otra
manera, es la “probabilidad de observar valores del estadístico igual o
más extremos que el observado, en caso de que la hipótesis nula sea
cierta.” (cobo2007?)
Su interpretación debe reconocer que “si el p-valor
es pequeño, se dice que la hipótesis nula es inverosímil. (…) (O) Cuán
inverosímil es el resultado observado si la hipótesis nula fuera cierta”
o “Hasta qué punto el resultado observado (en la muestra) es
probabilísticamente compatible con la hipótesis nula.” (cobo2007?)
La lógica de la PHN consiste en alcanzar resultados altamente
significativos, o lo que es lo mismo “buscar la menor probabilidad de
cometer un error tipo I” que permita, al final, rechazar a la hipótesis
nula como la mejor explicación posible de la realidad.
De manera que “cada H0 tiene asociada un tipo particular de
estadístico (z, t, F, u otro). Y cada estadístico tiene asociado un tipo
especial de distribución de probabilidades con la que se puede comparar
los datos de una muestra. La comparación entre las características de la
muestra frente a los de la población, en la prueba de distribución
permiten concluir si las características de la muestra son diferentes a
lo que se esperaría obtener por azar (en la población, representada
mediante la curva de distribución de probabilidades).” (salkind2013?)
Esto es, se compara el p-valor calculado y asociado
a la probabilidad de ocurrencia de \(H_0\) con respecto al Nivel de
significancia (\(\alpha\))
previamente definido, y a partir de ello se toma una decisión centrada
en la Hipótesis nula (\(H_0\)).
2.2.1. Pasos de la prueba de hipótesis o significancia.
La prueba de significancia hace una pregunta concreta sobre el valor
del parámetro en la población a partir de los datos observados en la
muestra o si \(\pi = \bar{x}\). Y donde
la hipótesis nula “es el punto de salida de la investigación, por lo que
debe establecerse previo a la recolección de los datos.” (cobo2007?)
A partir de dicha prueba de significancia se busca “tomar una
decisión (sobre H0), manteniendo los riesgos del error, controlados”, al
mismo tiempo que se “aporta evidencia en contra de la hipótesis nula.”
(cobo2007?)
La mecánica de las pruebas de significancia o de hipótesis siguen una
serie de pasos, y estos tienden a variar según cada autor. A
continuación se presentan una serie de 6 pasos, basados en la propuesta
de Salkind (salkind2013?):
Definición de la Hipótesis
nula (\(H_0\)), esta consiste
siempre en una “igualdad” o en la negación del efecto entre variables.
Por ejemplo: \(\mu =
\bar{x}\).
Definición del Nivel de
Significancia (\(\alpha\)) por
el analista, que suele ubicarse en valores estándar de 5% o 1%.
Selección del
estadístico apropiado según la distribución de
probabilidad de la variable analizada. Estos pueden corresponderse
con la distribución de los estadísticos \(z,
t, F, r\) u otro (Recomendación: uso del diagrama elaborado por
Salkind (salkind2013?)).
Cálculo (mediante fórmula) del valor
del estadístico para la muestra (valor obtenido del
p-valor), que consiste en una transformación de la
unidad de medida de la variable original al valor correspondiente
(estandarización de la variable) según el estadístico de
distribución correspondiente y, así, calcular su probabilidad
asociada.
Comparar el valor obtenido del
p-valor asociado a la probabilidad de ocurrencia de H0
en la población frente al Nivel de Significancia (\(\alpha\)) previamente definido por el
analista, y ubicar si el p-value es menor al nivel de
significancia..
Decisión del analista sobre H0, que
corresponde al rechazo o no rechazo de \(H_0\) a partir de la comparación realizada
en el paso 5.
De manera que si: \[ \text{p-value} \geq
\alpha : \text{No rechazo H0}\] \[
\text{p-value} < \alpha: \text{Rechazo H0}\]
4. Prueba de hipótesis para una propoción
La estimación de un parámetro poblacional cuando se analiza una
variable discreta y binomial (dos valores o atributos posibles
solamente), se realiza mediante el estadístico de la proporción a partir
de los datos de la muestra.
En este caso, el programa R cuenta con una función específica para
calcular el estadístico calculado y su p-valor a partir del estadístico
de distribución de probabilidades de Chi-cuadrada (\(\chi^2\)).
4.1. Hipótesis bilateral (dos colas) o “desigual”, donde \(\pi \neq p\)
Los pasos de la prueba de significancia para una proporción se
plantean de la siguiente manera:
- Hipótesis nula: \(\pi = p\);
Hipótesis alternativa: \(\pi \neq p\)
(bidireccional) donde H0: \(\pi =
0.35\), Ha: \(\pi \neq 0.35\)
pues se encontró que la frecuencia relativa de los casos con contagio de
COVID-19 (valor 1 en la codificación de la variable) es de 35.51%.
prop.table(table(datos_covid $ RESULTADO))
##
## 1 2 3
## 0.3551667 0.5031400 0.1416933
Nivel de significancia (\(\alpha\)) = 0.05
Estadístico de prueba para una proporción: chi-cuadrado (\(\chi^2\)).
Cálculo del p-valor, utilizando el comando
prop.test():
prop.test(x = 142690, #cantidad de casos exitosos o donde ocurrió el evento de interés
n = 401755, #tamaño de la muestra
p = 0.35, #proporción que define al valor o hipótesis nula
alternative = "two.sided", #tipo de hipótesis alternativa
conf.level = 0.95, #nivel de confianza
correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: 142690 out of 401755, null probability 0.35
## X-squared = 47.119, df = 1, p-value = 0.00000000000668
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
## 0.3536870 0.3566491
## sample estimates:
## p
## 0.3551667
Aquí se observó que el valor del estadístico de prueba (\(\chi^2\)) calculado u observado es de
47.119 unidades de \(\chi^2\), con 1
grado de libertad, para lo que se obtuvo un p-valor de 0.00000000000668
para la hipótesis nula (p = 0.35).
Comparación del p-valor frente al Nivel
de significancia. Al comparar el valor del
p-valor asociado a la H0 (que es de 0.00000000000668)
con respecto al Nivel de significancia (\(\alpha\)) (que es de 0.05). Con
esto se puede establecer que el p-value es menor
que el Nivel de significancia.
Decisión sobre la hipótesis nula.
- El p-value asociado al valor de la proporción de casos que dieron
positivo en la prueba COVID-19 en la muestra (0.00000000000668) es menor
al nivel de significancia establecido (\(\alpha = 0.05\)), por lo que la
probabilidad de observar a la hipótesis nula en la población es menor al
criterio de decisión.
- A partir de este criterio sí se rechaza la H0 con
los datos observados, por lo que se considera que Ha es la mejor
explicación. O dicho de otra manera, se puede establecer que la
proporción de personas que darían positivo a la prueba COVID-19 en
población es distinta la proporción de personas que dieron positivo en
la prueba COVID-19 en la muestra, con un nivel de confianza del
95%.
4.2. Hipótesis unilateral a la izquierda (una cola) o “menor que”,
donde \(\pi < p\)
Los pasos de la prueba de significancia para una proporción se
plantean de la siguiente manera:
- Hipótesis nula: \(\pi \geq p\);
Hipótesis alternativa: \(\pi < p\)
(unidireccional a la izquierda), donde H0: \(\pi \geq 0.35\), Ha: \(\pi < 0.35\) pues se encontró que la
frecuencia relativa de los casos con contagio de COVID-19 (valor 1 en la
codificación de la variable) es de 35.51%.
prop.table(table(datos_covid $ RESULTADO))
##
## 1 2 3
## 0.3551667 0.5031400 0.1416933
Nivel de significancia (\(\alpha\)) = 0.05
Estadístico de prueba para una proporción: Chi^2 \(\chi^2\)
Cálculo del p-valor, utilizando el comando
prop.test():
prop.test(x = 142690, #cantidad de casos exitosos o donde ocurrió el evento de interés
n = 401755, #tamaño de la muestra
p = 0.35, #proporción que define al valor o hipótesis nula
alternative = "less", #tipo de hipótesis alternativa
conf.level = 0.95, #nivel de confianza
correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: 142690 out of 401755, null probability 0.35
## X-squared = 47.119, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.35
## 95 percent confidence interval:
## 0.0000000 0.3564108
## sample estimates:
## p
## 0.3551667
Aquí se observó que el valor del estadístico de prueba (\(\chi^2\)) calculado u observado es de
47.119 unidades de \(\chi^2\), con 1
grado de libertad, para lo que se obtuvo un p-valor de 1 para la
hipótesis nula (\(\pi \geq 0.35\)).
Comparación del p-valor frente al Nivel
de significancia. Al comparar el valor del
p-valor asociado a la H0 (que es de 1) con respecto al
Nivel de significancia (alfa) (que es de 0.05), se
puede establecer que el p-value es mayor que
el Nivel de significancia.
Decisión sobre la hipótesis nula.
- El p-value asociado al valor de la proporción de casos que dieron
positivo en la prueba COVID-19 en la muestra (1) es mayor al nivel de
significancia establecido (\(\alpha =
0.05\)), por lo que la probabilidad de observar a la hipótesis
nula en la población es mayar al criterio de decisión.
- A partir de este criterio no se rechaza la H0 con
los datos observados, por lo que se considera que H0 es la mejor
explicación. O dicho de otra manera, se puede establecer que la
proporción de personas que darían positivo a la prueba COVID-19 en
población es mayor o igual a la proporción de personas que dieron
positivo en la prueba COVID-19 en la muestra, con un nivel de confianza
del 95%.
LS0tCnRpdGxlOiAiSW5mZXJlbmNpYSB5IHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgdW4gZXN0YWTDrXN0aWNvIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5leiBWYWxkZXMiCmRhdGU6ICIyMDIzLTA3LTEyIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIG51bWJlcl9zZWN0aW9uOiBGQUxTRQogICAgdGhlbWU6ICJjb3NtbyIKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIGNvZGVfZm9sZGluZzogc2hvdwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKYmlibGlvZ3JhcGh5OiBtZXRvZG9sb2dpYS5iaWIKYXBhOiBhcGEuY3NsCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIyAwLiBEZWZpbmljacOzbiBkZWwgYW1iaWVudGUgZGUgdHJhYmFqby4KCkFsIGNvbWVuemFyIHNpZW1wcmUgZXMgaW1wb3J0YW50ZSBlc3RhYmxlY2VyIGVsIGlkaW9tYSBhZGVjdWFkbyBwYXJhIHF1ZQplbCBwcm9ncmFtYSByZWNvbm96Y2EgY2FyYWN0ZXJlcyBlc3BlY2lhbGVzLiBFbiBlbCBjYXNvIGRlIGRlZmluaXIgYWwKaWRpb21hIGVzcGHDsW9sLCBsYSBpbnN0cnVjY2nDs24gYSB1dGlsaXphciBlczoKCmBgYHtyIGlkaW9tYX0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwgImVzX0VTIikgI2FsdGVybmF0aXZhIDEKU3lzLnNldGVudihMQU5HID0gImVzX0VTIikgI2FsdGVybmF0aXZhIDIKYGBgCgpUYW1iacOpbiBlcyBpbXBvcnRhbnRlIGluc3RhbGFyIGxhcyBsaWJyZXLDrWFzIHF1ZSBzZSB1dGlsaXphcsOhbgpwb3N0ZXJpb3JtZW50ZSwgcGFyYSBlbGxvIHByaW1lcm8gc2UgZ3VhcmRhbiBjb21vIHVuIG9iamV0bzoKCmBgYHtyIGxpYnJlcmlhc30KcGFxdWV0ZXMgPC0gYygidGlkeXZlcnNlIiwgIkRlc2NUb29scyIpCmBgYAoKUG9zdGVyaW9ybWVudGUgc2UgImxsYW1hbiIgYSBsYXMgbGlicmVyw61hcyBtZWRpYW50ZSBlbCBzY3JpcHQKYGxpYnJhcmllcygpYCBkZSBsYSBwYXF1ZXRlcsOtYSBgZWFzeXBhY2thZ2VzYDoKCmBgYHtyIGVhc3lwYWNrYWdlc30KbGlicmFyeShlYXN5cGFja2FnZXMpCmxpYnJhcmllcyhwYXF1ZXRlcykKYGBgCgpBZGVtw6FzIGVzIG11eSByZWxldmFudGUgZXN0YWJsZWNlciBsYSB1YmljYWNpw7NuIGRlbCBkaXJlY3RvcmlvIGRlCnRyYWJham8sIHBhcmEgcXVlIGVsIHByb2dyYW1hIGlkZW50aWZpcXVlIGVsIGFyY2hpdm8gZGVsIHF1ZSBleHRyYWVyw6EgeSwKdGFtYmnDqW4sIGd1YXJkYXLDoSBsYSBpbmZvcm1hY2nDs24gc29saWNpdGFkYS4KCmBgYHtyIGRpcmVjdG9yaW99CmdldHdkKCkgIyNkaXJlY3RvcmlvIGFjdHVhbApzZXR3ZCgifi9Ecm9wYm94L1IvUm1hcmtkb3duIikgIyNFc3RhIHBlcm1pdGUgY2FtYmlhciB5IGRlZmluaXIgZWwgZGlyZWN0b3JpbyBkZXNlYWRvCmxpc3QuZmlsZXMoKSAjI0VzdGEgcGVybWl0ZSBlbmxpc3RhciBsb3MgYXJjaGl2b3MgZGVudHJvIGRlbCBkaXJlY3RvcmlvCmBgYAoKVW5hIHZleiBlc3RhYmxlY2lkbyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8sIHNlIGRlYmUgY2FyZ2FyIGxhIGJhc2UgZGUKZGF0b3MgbyBkYXRhIGZyYW1lIGVuIGVsIGFtYmllbnRlIGRlbCBwcm9ncmFtYSwgY29uIGVsIHF1ZSBzZSBhbmFsaXphcsOhCmxhIGluZm9ybWFjacOzbi4gUGFyYSBlbGxvIGhhYnLDoSBxdWUgImNhcmdhciIgbGEgaW5mb3JtYWNpw7NuIHNvYnJlIGxvcwpwYWNpZW50ZXMgaW5mZWN0YWRvcyBwb3IgQ09WSUQtMTkgcmVwb3J0YWRvcyBwb3IgbGEgU2VjcmV0YXLDrWEgZGUgU2FsdWQKZGVsIGdvYmllcm5vIGZlZGVyYWwgbWV4aWNhbm8uCgpgYGB7ciBjYXJnYV9kYXRvc30KZGF0b3NfY292aWQgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9SLzIwMDYxM0NPVklEMTlNRVhJQ08uY3N2IiwgaGVhZGVyID0gVFJVRSkgI3J1dGEgZGUgYWNjZXNvIGEgbG9zIGRhdG9zLCAnaGVhZGVyID0gVFJVRScgZW4gY2FzbyBkZSBxdWUgZWwgYXJjaGl2byBjdWVudGUgY29uIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcy4KYGBgCgojIyAxLiBFc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgeSBnZW5lcmFjacOzbiBkZSBjb25vY2ltaWVudG8gbWVkaWFudGUgaW5mZXJlbmNpYXMKCkVsIHByb2Nlc28gZGUgZ2VuZXJhY2nDs24gZGUgY29ub2NpbWllbnRvLCBwYXJhIGNvbm9jZXIgdW5hIHJlYWxpZGFkLAp1c3VhbG1lbnRlIHByb2NlZGUgbWVkaWFudGUgYWxndW5hIGRlIGxhcyBkb3MgdsOtYXMgdHJhZGljaW9uYWxlczoKbWVkaWFudGUgbcOpdG9kb3MgZGVkdWN0aXZvcyBvIGluZHVjdGl2b3MuIEVuIHTDqXJtaW5vcyBkZSBLaW5nLCBLZW9oYW5lIHkKVmVyYmEgKDIwMDBbMTk5NF0pLCBsYXMgdHJhZGljaW9uZXMgY3VhbnRpdGF0aXZhcyB5IGN1YWxpdGF0aXZhcyB0YW1iacOpbgpzdXBvbsOtYW4gZm9ybWFzIGRpc3RpbnRhcyBkZSBhY2VyY2Fyc2UgYSBjb25vY2VyIGxhIHJlYWxpZGFkLCBwZXJvIGVuIGVsCmZvbmRvIGFtYmFzIHRyYWRpY2lvbmVzIHNlIGJhc2FuIGVuIHVuYSBtaXNtYSBsw7NnaWNhIGluZmVyZW5jaWFsLgoKRXN0byBlcywgZWwgcHJvY2VzbyBkZSBjb25vY2ltaWVudG8gY2llbnTDrWZpY28gc2UgYXBveWEgZW4gZWwgcHJvY2VzbyBkZQpnZW5lcmFjacOzbiB5IGV2YWx1YWNpw7NuIG1lZGlhbnRlIGVsIHVzbyBkZSBpbmZlcmVuY2lhcy4gVW5hIGluZmVyZW5jaWEKY29uc2lzdGUgZW4gY29ub2NlciBhbGdvIHF1ZSBzZSBkZXNjb25vY2UgYSBwYXJ0aXIgZGUgZWxlbWVudG9zIChkYXRvcykKY29ub2NpZG9zLCBzZWfDum4gS2luZywgS2VvaGFuZSB5IFZlcmJhIFstQGtpbmdfZGlzZW5vXzIwMDBdLiBZIGVzdGFzCnRpZW5kZW4gYSB0cmFkdWNpcnNlIGVuIGRpc3RpbnRhcyBoZXJyYW1pZW50YXMgKGNvbW8gbG8gc29uIGxhcwpoaXDDs3Rlc2lzKSBxdWUsIGVuIGVsIGFuw6FsaXNpcyBjdWFudGl0YXRpdm8sIHNlIGJ1c2NhIHNvbWV0ZXIgYQpldmFsdWFjacOzbiBmcmVudGUgYSBsb3MgZGF0b3MgKGVuIGdyYW4gbWVkaWRhIHByb3ZpZW5lbiBkZSBtdWVzdHJhcykKZGlzcG9uaWJsZXMgY29uIGVsIGZpbiBkZSBjb25vY2VyIGEgbGEgcmVhbGlkYWQgKHBvYmxhY2lvbmFsKSBtZWRpYW50ZQplc3RpbWFjaW9uZXMuCgpMYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwgY29uc2lzdGUgZW4gdW4gY29uanVudG8gZGUgdMOpY25pY2FzIHkKaGVycmFtaWVudGFzIGRlIGxhIGVzdGFkw61zdGljYSBjb24gbGFzIHF1ZSBzZSBidXNjYSBnZW5lcmFyCioqZXN0aW1hY2lvbmVzKiogc29icmUgbGEgcmVhbGlkYWQgKHBvYmxhY2lvbmFsKSBhIHBhcnRpciBkZSBsb3MgZGF0b3MKZGlzcG9uaWJsZXMgKG11ZXN0cmFsZXMpIHF1ZSwgYWwgZmluYWwsIHB1ZWRhbiBnZW5lcmFsaXphcnNlLiBEZSBtYW5lcmEKcXVlICJsYSBpbmZlcmVuY2lhIHByZXRlbmRlIGdlbmVyYWxpemFyIGxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gdW5vcwpkYXRvcyBhIHVuIGN1ZXJwbyBkZSBjb25vY2ltaWVudG9zIG3DoXMgYW1wbGlvLiIgW0Bjb2JvMjAwNywgcC4gOTJdCgpFbiBlc3RlIHNlbnRpZG8sIGxhIGzDs2dpY2EgZGUgbGEgbWV0b2RvbG9nw61hIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCBzZQphcG95YSBlbiBsYSBnZW5lcmFsaXphY2nDs24gbWVkaWFudGUgcmVmdXRhY2nDs24gZW1ww61yaWNhIGRlIGxhcwppbmZlcmVuY2lhcyBpbmljaWFsZXMsIHBvciBsbyBxdWUsIGVuIGVsIGZvbmRvLCBzZSB0cmF0YSBkZSB1biBtw6l0b2RvCmNvbXBhcmF0aXZvIGJhc2FkbyBlbiBsYXMgaGVycmFtaWVudGFzIGVzdGFkw61zdGljYXMgcXVlIHBlcm1pdGVuIGV2YWx1YXIKbWVkaWFudGUgZXN0aW1hY2lvbmVzLgoKTG9zIHRyZXMgdXNvcyBwcmluY2lwYWxlcyBbQHZpbGFsdGEyMDE2LCBwLiAxNDldIGRlIGxhIGVzdGFkw61zdGljYQppbmZlcmVuY2lhbCBjb25zaXN0ZW4gZW46IDEuIEVzdGltYXIgc2kgdW5hIG11ZXN0cmEgZXMgcmVwcmVzZW50YXRpdmEgZGUKdW5hIHBvYmxhY2nDs24uIDIuIEVzdGltYXIgc2kgdW5hIG11ZXN0cmEgZGlmaWVyZSBkZSBvdHJhLiAzLiBFc3RpbWFyIGxhCnByb2JhYmlsaWRhZCBkZSBxdWUgMiBldmVudG9zIGVzdMOpbiByZWxhY2lvbmFkb3MgcG9yIGF6YXIuCgojIyMgMS4xLiBJbmZlcmVuY2lhcyBlIGhpcMOzdGVzaXMKClVuYSBpbmZlcmVuY2lhIGNvbnNpc3RlIGVuIHVuIGFyZ3VtZW50byBxdWUgYnVzY2EgY29ub2NlciBhbGdvIHF1ZSBzZQpkZXNjb25vY2UgKHVzdWFsbWVudGUgc2UgcmVmaWVyZSBhIHVuYSBjYXJhY3RlcsOtc3RpY2EgZGUgbGEgcG9ibGFjacOzbikgYQpwYXJ0aXIgZGUgZWxlbWVudG9zIGNvbm9jaWRvcyAoc3VlbGUgcmVmZXJpcnNlIGEgZGF0b3MgcHJvdmVuaWVudGVzIGRlCnVuYSBtdWVzdHJhKSwgc2Vnw7puIEtpbmcsIEtlb2hhbmUgeSBWZXJiYSBbLUBraW5nX2Rpc2Vub18yMDAwXS4gWSBhCnBhcnRpciBkZSBsYSBnZW5lcmFjacOzbiBkZSBpbmZlcmVuY2lhcyB5IHN1IGV2YWx1YWNpw7NuIGNvbnNlY3VlbnRlLCBzZQpidXNjYSBnZW5lcmFyIGVzdGltYWNpb25lcyBxdWUgcGVybWl0YW4gYWNlcmNhcnNlIGEgY29ub2NlciBsYSByZWFsaWRhZAoocG9ibGFjaW9uYWwpLgoKTGFzIGhpcMOzdGVzaXMgc3VlbGVuIHNlciBsYSBtYW5lcmEgZm9ybWFsIGVuIHF1ZSBzZSB0cmFkdWNlbiBsYXMKaW5mZXJlbmNpYXMgKHlhIHNlYW4gZGVzY3JpcHRpdmFzIG8gY2F1c2FsZXMsIHNlZ8O6biBLaW5nLCBLZW9oYW5lIHkKVmVyYmEgWy1Aa2luZ19kaXNlbm9fMjAwMF0pLCB5IGVzdGFzIHNlIGludGVncmFuIGNvbiBlbGVtZW50b3MKZXNwZWPDrWZpY29zOiAxLiB2YXJpYWJsZXMsIHkgMi4gcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLgoKRW4gZWwgYW7DoWxpc2lzIGN1YW50aXRhdGl2bywgbGFzIGhpcMOzdGVzaXMgc2Vyw6FuIGVsIHB1bnRvIGRlIHBhcnRpZGEgZGVsCmFuw6FsaXNpcyBpbmZlcmVuY2lhbCBwdWVzLCBhIHRyYXbDqXMgZGUgc3UgZXZhbHVhY2nDs24gZW1ww61yaWNhLCBlcyBsYQptYW5lcmEgZW4gcXVlIHNlIGJ1c2NhIGNvbm9jZXIgYSBsYSByZWFsaWRhZC4gRG9uZGUgbGFzIGhpcMOzdGVzaXMKZXN0YWTDrXN0aWNhcyBxdWUgc2UgZ2VuZXJhbiB0aWVuZW4gZG9zIGNhcmFjdGVyw61zdGljYXMgYsOhc2ljYXM6CgoxLiAgU2Vnw7puIHN1IHJvbCBlbiBsYSBpbnZlc3RpZ2FjacOzbiBwdWVkZW4gc2VyOgoKLSAgIEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmFzICgkSF9hJCksIGVzdGEgcHJlc2VudGEgdW4gZW51bmNpYWRvIGludGVncmFkbwogICAgcG9yIHVuYSBvIG3DoXMgdmFyaWFibGVzIHksIGFkZW3DoXMsIGVzdGFibGVjZSB1bmEgcmVsYWNpw7NuCiAgICBzaXN0ZW3DoXRpY2EgZW50cmUgw6lzdGFzLCBwb3IgZWplbXBsbzogJCQgWSA9IGYoWCkkJAotICAgSGlww7N0ZXNpcyBudWxhICgkSF8wJCksIHNlIGludGVncmEgcG9yIGxhcyBtaXNtYXMgdmFyaWFibGVzLCBwZXJvCiAgICBhcXXDrSByZWNoYXphIG8gbmllZ2EgbGEgcmVsYWNpw7NuIHNpc3RlbcOhdGljYSBlc3RhYmxlY2lkYQogICAgcHJldmlhbWVudGU7ICJjb25zaXN0ZSBlbiBsYSBuZWdhY2nDs24gbyBhdXNlbmNpYSBkZSBkaWZlcmVuY2lhCiAgICBbaWd1YWxkYWRdIGRlIHVuIGVmZWN0byIgW0B2aWxhbHRhMjAxNiwgcC4gMTQ2XTogJCRZIFxuZXEgZihYKSQkCgoyLiAgU2Vnw7puIGVsIHRpcG8gZGUgZGlyZWNjacOzbiBlbiBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzOgoKLSAgIEhpcMOzdGVzaXMgdW5pZGlyZWNjaW9uYWxlcyBzZSByZWZpZXJlbiBhIGFxdWVsbGFzIHF1ZSBwbGFudGVhbiB1bgogICAgc2VudGlkbyBlbiBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyB0YW50byBlbiBsYSBtdWVzdHJhIGNvbW8KICAgIGVuIGxhIHBvYmxhY2nDs24uIEFkZW3DoXMsIGVzdMOhcyBoaXDDs3Rlc2lzIHB1ZWRlbiBwbGFudGVhciBkb3MgdGlwb3MKICAgIGRlIHNlbnRpZG9zOgogICAgLSAgIEhpcMOzdGVzaXMgdW5pZGlyZWNjaW9uYWwgaGFjaWEgbGEgZGVyZWNoYSwgZW4gbGEgcXVlIHNlIHBsYW50ZWEKICAgICAgICBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBzZXLDoSB1biB2YWxvciBtYXlvciBhbCBlc3RhZMOtc3RpY28KICAgICAgICBtdWVzdHJhbCAoJFxtdSA+IFxiYXJ7WH0kKS4KICAgIC0gICBIaXDDs3Rlc2lzIHVuaWRpcmVjY2lvbmFsIGhhY2lhIGxhIGl6cXVpZXJkYSwgZW4gbGEgcXVlIHNlCiAgICAgICAgcGxhbnRlYSBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBzZXLDoSB1biB2YWxvciBtZW5vciBhbAogICAgICAgIGVzdGFkw61zdGljbyBtdWVzdHJhbCAoJFxtdSA8IFxiYXJ7WH0kKQotICAgSGlww7N0ZXNpcyBiaWRpcmVjY2lvbmFsZXMgcXVlIGNvbnNpc3RlbiBlbiBhcmd1bWVudG9zIHF1ZSBwbGFudGVhbgogICAgbGEgZXhpc3RlbmNpYSBkZSB1bmEgZGlmZXJlbmNpYSBkZSBsYXMgdmFyaWFibGVzIGVudHJlIGxhIG11ZXN0cmEgeQogICAgbGEgcG9ibGFjacOzbi4gJCRcbXUgXG5lcSBYJCQKCkVuIHTDqXJtaW5vcyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZCBkZSBsb3MgdmFsb3JlcyBkZSB1bmEKdmFyaWFibGUsIGVsIHByaW1lciB0aXBvIGRlIGhpcMOzdGVzaXMgc2UgY29ub2NlbiB0YW1iacOpbiBjb21vIGhpcMOzdGVzaXMKZGUgInVuYSBjb2xhIiBtaWVudHJhcyBxdWUgbGFzIHNlZ3VuZGFzIHNlIHJlZmllcmVuIGNvbW8gaGlww7N0ZXNpcyBkZQoiZG9zIGNvbGFzLiIKCiMjIyAxLjIuIFBydWViYXMgZGUgaGlww7N0ZXNpcyAobnVsYSkgeSBlcnJvcgoKTGEgbWFuZXJhIGVuIHF1ZSBsYSBlc3RhZMOtc3RpY2EgcmVhbGl6YSBlbCBhbsOhbGlzaXMgeSBsYSBpbnRlcnByZXRhY2nDs24KZGUgbG9zIGRhdG9zIGVtcMOtcmljb3MgZXMgYSB0cmF2w6lzIGRlbCBjb25qdW50byBkZSB0w6ljbmljYXMgeQpoZXJyYW1pZW50YXMgcXVlIHNlIGFncnVwYW4gYmFqbyBlbCBub21icmUgZGUgInBydWViYSBkZSBoaXDDs3Rlc2lzIiwgcXVlCnBlcm1pdGVuIGludGVycHJldGFyIGxhIGluZm9ybWFjacOzbiBvYnRlbmlkYSBhIHBhcnRpciBkZSByZXNwb25kZXIgYQpwcmVndW50YXMgZGUgaW52ZXN0aWdhY2nDs24gW0B2aWxhbHRhMjAxNiwgcC4gMTQ1XSBtZWRpYW50ZSBlbCB1c28gZGUKZXN0aW1hZG9yZXMgKHB1bnR1YWxlcyBvIGludGVydmFsb3MgZGUgY29uZmlhbnphKS4gRXN0ZSBtw6l0b2RvIGRlCmV2YWx1YWNpw7NuIGRlIGxvcyBkYXRvcyB0YW1iacOpbiBzZSBjb25vY2UgY29tbyBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYQplc3RhZMOtc3RpY2EgKEZpc2hlciwgMTkyNSwgMTkyNikuCgpFbCBtw6l0b2RvIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIG8gZGUgaGlww7N0ZXNpcyAiYnVzY2EsIGVuCmVzZW5jaWEsIHByb2JhciBzaSBsYXMgbWVkaWNpb25lcyBwcm92ZW5pZW50ZXMgZGUgdW5hIG11ZXN0cmEgZXN0w6FuIGVuCmFybW9uw61hIGNvbiBsYSBoaXDDs3Rlc2lzIGRlbCBpbnZlc3RpZ2Fkb3IgKEZpc2hlciwgMTkyNSkuIEN1YWxxdWllcgpkaWZlcmVuY2lhIG9ic2VydmFkYSBlbnRyZSBlbCB2ZXJkYWRlcm8gdmFsb3IgZGUgdW4gcGFyw6FtZXRybwpwb2JsYWNpb25hbCB5IHVuIGVzdGFkw61zdGljbyBtdWVzdHJhbCBlbXBsZWFkbyBwYXJhIGVzdGltYXJsbyBzZSBzdWpldGEKYSB1bmEgcHJvYmFiaWxpZGFkLiIgW0B2aWxhbHRhMjAxNiwgcC4gMTQ2XQoKU2kgYmllbiBhbCBpbnRlbnRhciBwcm9iYXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBudWVzdHJhcyBoaXDDs3Rlc2lzIGRlCmludmVzdGlnYWNpw7NuIGRlc2RlIGVsIMOhbWJpdG8gZGUgbGEgZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsLCB5IHBvciB0YW50bwpkZXNkZSBzdSBhc29jaWFjacOzbiBjb24gbGFzIHByb2JhYmlsaWRhZGVzIGRlIG9jdXJyZW5jaWEgZGUgdW4gcmVzdWx0YWRvCmVzcGVyYWRvIGVuIGxhIHJlYWxpZGFkLCBub3MgZW5mcmVudGFtb3MgYWwgcHJvYmxlbWEgInRyYWRpY2lvbmFsIiBkZSBsYQpldmFsdWFjacOzbiBkZSBoaXDDs3Rlc2lzLiBZIGVzIHF1ZSBzaSBiaWVuIHNlIHJlY29ub2NlIHF1ZSB0b2RhIGhpcMOzdGVzaXMKZGUgdHJhYmFqbyBzaWVtcHJlIHRlbmRyw6EgdW5hIHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIHksIHBvciB0YW50bywKZGUgc2VyIHZlcmRhZGVyYSBwYXJhIGxhIHJlYWxpZGFkLCBlc3RhIHBvc2liaWxpZGFkIG5vIHBlcm1pdGUsIGFsCmZpbmFsLCBlc3RhYmxlY2VyIGxhIHZlcmFjaWRhZCBkZSBudWVzdHJhcyBoaXDDs3Rlc2lzLgoKVW5hIG1hbmVyYSBhbHRlcm5hdGl2YSAoZGUgdGlwbyBwb3BwZXJpYW5hKSBwYXJhIGNvbm9jZXIgbGEgcmVhbGlkYWQKY29uc2lzdGUgZW4gZWwgbcOpdG9kbyBkZSBsYSByZWZ1dGFjacOzbiBkZSBoaXDDs3Rlc2lzLCBxdWUgcGVybWl0ZSwgYWwKbWVub3MsIGRlc2NhcnRhciBoaXDDs3Rlc2lzIHF1ZSBubyBzZSBhanVzdGVuIGEgbG9zIGRhdG9zIGVtcMOtcmljb3MKZGlzcG9uaWJsZXMuIEEgcGFydGlyIGRlIGVzdGUgcHJvY2VzbyBkZSByZWZ1dGFjacOzbiwgZW4gbGEgZXN0YWTDrXN0aWNhCmluZmVyZW5jaWFsIHNlIG9wdGEgcG9yIGVsIG3DqXRvZG8gZGUgbGEgInBydWViYSBkZSBoaXDDs3Rlc2lzIG51bGEiCihQSE4pLCBlbiBlbCBxdWUgc2UgZGVzZWEgeSBzZSBidXNjYSByZWZ1dGFyIG8gcmVjaGF6YXIKcHJvYmFiaWzDrXN0aWNhbWVudGUgdW5hIGhpcMOzdGVzaXMgZGUgbm8gZWZlY3RvIG8gbnVsYS4gW0B2aWxhbHRhMjAxNiwgcC4KMTQ2XSBFbiBsYSBtZWRpZGEgZW4gcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBwdWVkYSBzZXIgcmVmdXRhZGEgKHkgcG9yCmVuZGUgdGFtYmnDqW4gc2UgcmVmdXRlIGVsIGFyZ3VtZW50byBkZSBubyBlZmVjdG8gbyBubyBkaWZlcmVuY2lhIGVudHJlCmxhcyB2YXJpYWJsZXMpLCBzZSBwdWVkZSBhY2VwdGFyIHF1ZSBleGlzdGUgdW5hIG1lam9yIGV4cGxpY2FjacOzbiBkZSBsYQpyZWFsaWRhZCBxdWUgc3VlbGUgdWJpY2Fyc2UgZW4gbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YSAoYXF1ZWxsYSBxdWUKcGxhbnRlYSBsYSBleGlzdGVuY2lhIGRlIHVuIGVmZWN0byBvIGRpZmVyZW5jaWEgZW50cmUgdmFyaWFibGVzIGVuIGxhCnBvYmxhY2nDs24pLgoKRGljaGEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgbyBkZSBzaWduaWZpY2FuY2lhLCBjb21vIHBhcnRlIGRlbCBwcm9jZXNvCmluZmVyZW5jaWFsIGRlIGdlbmVyYWNpw7NuIGRlIGNvbm9jaW1pZW50bywgc2kgYmllbiBidXNjYSBldmFsdWFyIGxhcwpyZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcyBhIHBhcnRpciBkZSBsb3MgZGF0b3MgbXVlc3RyYWxlcyBwYXJhLApwb3N0ZXJpb3JtZW50ZSwgZ2VuZXJhbGl6YXIgbG9zIHJlc3VsdGFkb3MgaGFjaWEgdW5hIHJlYWxpZGFkCnBvYmxhY2lvbmFsLCByZWNvbm9jZSBxdWUgZXN0ZSBwcm9jZXNvIGRlIGdlbmVyYWxpemFjacOzbiBubyBlcwpkZXRlcm1pbmlzdGEgc2lubywgYWwgY29udHJhcmlvLCBwYXJ0ZSBkZSBhc3VtaXIgbGEgZXhpc3RlbmNpYSBkZWwKZmVuw7NtZW5vIGRlIGxhIGluY2VydGlkdW1icmUgcHJlc2VudGUgZW4gbGEgcmVhbGlkYWQsIHF1ZSBzZSBwdWVkZQpyZWZsZWphciBlbiBsb3MgZGF0b3MgbXVlc3RyYWxlcy4KCkRpY2hvcyBlcnJvcmVzIGVuIGVsIGFuw6FsaXNpcyBjdWFudGl0YXRpdm8gc2UgcHVlZGVuIGdlbmVyYXIgZW4KZGlzdGludG9zIG1vbWVudG9zIGRlbCBkaXNlw7FvIGRlIGxhIGludmVzdGlnYWNpw7NuOiBcKiBlbiBlbCBtb21lbnRvIGRlbAptdWVzdHJlbyB5IHJlY29waWxhY2nDs24gZGUgbG9zIGRhdG9zLCBcKiBlbiBsYSBtZWRpY2nDs24gZGUgbGEgcmVhbGlkYWQsCm8gXCogZW4gbGEgcHJlc2VuY2lhIGRlIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcyBxdWUgbm8gZnVlcm9uCmNvbnNpZGVyYWRhcyBlbiBsYSBpbnZlc3RpZ2FjacOzbi4gW0B2aWxhbHRhMjAxNjsgQGNvYm8yMDA3OwpAc2Fsa2luZDIwMTNdCgpSZWNvbm9jZXIgbGEgcHJlc2VuY2lhIGRlIGxhIGluY2VydGlkdW1icmUgeSwgdGFtYmnDqW4sIGxhIGV4aXN0ZW5jaWEgZGUKZGl2ZXJzYXMgZnVlbnRlcyBkZSBlcnJvciBkZW50cm8gZGVsIGRpc2XDsW8gZGUgbGFzIGludmVzdGlnYWNpb25lcwpwZXJtaXRlLCBhIHN1IHZleiwgYXN1bWlyIGxhIGV4aXN0ZW5jaWEgZGUgdW4gcmllc2dvIGxhdGVudGUgZW4gZWwKcHJvY2VzbyBkZSBnZW5lcmFsaXphY2nDs24gZGVsIGNvbm9jaW1pZW50byBlbiBlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvCmluZmVyZW5jaWFsLiBEaWNobyByaWVzZ28gbyBlcnJvciBlbiBlbCBwcm9jZXNvIGRlIGVzdGltYWNpw7NuCihpbmZlcmVuY2lhIGVzdGFkw61zdGljYSkgcHVlZGUgc2VyIGRlIGRvcyB0aXBvczogaS4gYWxlYXRvcmlvLCBxdWUgc2UKZGViZW4gYSBmbHVjdHVhY2lvbmVzIGRlbCBhemFyIGVuIGxhcyBkaXN0aW50YXMgZmFzZXMgZGUgbGEKaW52ZXN0aWdhY2nDs24sIHkgaWkuIHNpc3RlbcOhdGljbywgbyBzZXNnb3MgcXVlIHRpZW5kZW4gYSByZXBldGlyc2UgZGUKbWFuZXJhIGNvbnN0YW50ZSBwb3IgZWwgdXNvIGRlIGRpdmVyc2FzIGhlcnJhbWllbnRhcyBkZSBpbnZlc3RpZ2FjacOzbi4KCkRlIGFjdWVyZG8gY29uIENvYm8gWy1AY29ibzIwMDcsIHAuIDEwM10sICJsYSBlc3RhZMOtc3RpY2EgYXl1ZGEgYQpjdWFudGlmaWNhciBsYSBtYWduaXR1ZCBkZSBsb3MgcHJpbWVyb3MgKGVycm9yZXMgYWxlYXRvcmlvcykiIGEgcGFydGlyCmRlbCBjw6FsY3VsbyBkZWwgdGFtYcOxbyBkZWwgImVycm9yIGFsZWF0b3Jpby4iIEVzdG8gcGVybWl0ZSAic2FiZXIgY29uCnF1w6kgZ3JhZG8gZGUgY2VydGlkdW1icmUgbGEgZGlmZXJlbmNpYSBvYnNlcnZhZGEgZW50cmUgdW4gZXN0YWTDrXN0aWNvIHkKdW4gcGFyw6FtZXRybyBwdWVkZSBkZWJlcnNlIGEgdW5hIGZsdWN0dWFjacOzbiBhbGVhdG9yaWEuIiBbU3RpZ2xlciwgMTk4NgpjaXRhZG8gZW4gQHZpbGFsdGEyMDE2LCBwLiAxNDZdCgojIyMgMS4zLiBFcnJvciBhbGVhdG9yaW8KCkVsIGVycm9yIGFsZWF0b3JpbyBjb25zaXN0ZSBlbiBsYSBkaWZlcmVuY2lhIGV4aXN0ZW50ZSBlbnRyZSBhbWJvcwp2YWxvcmVzIChlc3RpbWFkb3JlcykgcXVlIHNlIHByb2R1Y2UgYSByYcOteiBkZSBhbmFsaXphciBhbGdvIGEgcGFydGlyIGRlCnVuYSBtdWVzdHJhIGZyZW50ZSBhIGFuYWxpemFybG8gYSBwYXJ0aXIgZGUgc3UgcG9ibGFjacOzbiBlbnRlcmEgeSwgYSBzdQp2ZXosIHBlcm1pdGUgZXZhbHVhciBlbCBncmFkbyBkZSBjZXJ0aWR1bWJyZSBjb24gZWwgcXVlIHNlIHB1ZWRlCmNvbmNsdWlyIGFsZ28gcGFyYSBsYSBwb2JsYWNpw7NuIGEgcGFydGlyIGRlIGxhIGluZm9ybWFjacOzbiBtdWVzdHJhbApkaXNwb25pYmxlLgoKRWwgZXJyb3IgYWxlYXRvcmlvLCBwb3IgdGFudG8sICJlcyBsYSBvc2NpbGFjacOzbiBkZSBsb3MgZXN0YWTDrXN0aWNvcwpvYnRlbmlibGVzIGVuIGxhcyBwb3NpYmxlcyBtdWVzdHJhcyAoc2llbXByZSBjZW50cmFkb3MgZW4gZWwgcGFyw6FtZXRybwpkZSBsYSBwb2JsYWNpw7NuIG9yaWdlbiBkZSBsYSBtdWVzdHJhKS4iIFtAY29ibzIwMDcsIHAuIDEwNV0KRXNwZWNpYWxtZW50ZSwgbGEgZXZhbHVhY2nDs24gZGVsIHRhbWHDsW8gZGVsIGVycm9yIGFsZWF0b3JpbyBwZXJtaXRlCmNvbXBhcmFyIGxhIGRpc3RhbmNpYSBleGlzdGVudGUgZGUgdW4gZXN0aW1hZG9yIHByZXNlbnRlIGVuIHVuYSBtdWVzdHJhCnJlc3BlY3RvIGRlIHN1IHBvc2ljacOzbiBlbiB1bmEgcG9ibGFjacOzbi4gUGVybyBhIHJhw616IGRlbCBwcm9ibGVtYSBkZQpjYXJlY2VyIGRlIGluZm9ybWFjacOzbiBwb2JsYWNpb25hbCwgw6lzdGEgY29tcGFyYWNpw7NuIHN1ZWxlIGxsZXZhcnNlIGEKY2FibyBlbnRyZSBlbCAqZXN0aW1hZG9yIGRlIHVuYSBtdWVzdHJhKiBjb24gc3UgcG9zaWNpw7NuIGNvcnJlc3BvbmRpZW50ZQphbnRlIHVuYSAqZGlzdHJpYnVjacOzbiBtdWVzdHJhbCogKGVsIGNvbmp1bnRvIGRlIGRpdmVyc2FzIG11ZXN0cmFzIGRlCmlndWFsIHRhbWHDsW8gYWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhIGRpc3BvbmlibGUpLgoKQSBtZWRpZGEgcXVlIGVsIHRhbWHDsW8gZGVsIGVycm9yIGFsZWF0b3JpbyBkZWwgZXN0aW1hZG9yIHV0aWxpemFkbyBlbiBsYQptdWVzdHJhIGRpc3BvbmlibGUgdGllbmRlIGEgc2VyIHBlcXVlw7FvIChjZXJjYW5vIGEgY2VybyksIHNlIGFzdW1lIHF1ZQpsYSBtdWVzdHJhIHV0aWxpemFkYSBlcyByZXByZXNlbnRhdGl2YSBkZSBsYSBwb2JsYWNpw7NuIGFuYWxpemFkYS4KCkVsIGPDoWxjdWxvIGRlbCBlcnJvciBhbGVhdG9yaW8gc2UgYXBveWEgZW4gZWwgw61uZGljZSBkZWwgKipFcnJvcgplc3TDoW5kYXIgKFNFKSoqIG8gKiplcnJvciB0w61waWNvIGRlIGxhIG1lZGlhKiosIHF1ZSBlcyBlbCBjb2NpZW50ZQpyZXN1bHRhbnRlIGRlIGRpdmlkaXIgYSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgKCRcc2lnbWEkKSBkZSB1bmEKdmFyaWFibGUgZW50cmUgbGEgcmHDrXogY3VhZHJhZGEgZGVsIHRhbWHDsW8gZGUgbXVlc3RyYSAkXHNxcnR7bn0kOgokJFNFID0gXGZyYWN7XHNpZ21hX1xiYXJ7WH19e1xzcXJ0e259fSQkCgpMYSBmb3JtYSBtYW51YWwgZGUgY2FsY3VsYXIgZWwgKipFcnJvciBlc3TDoW5kYXIgKFNFKSoqIHNlIHJlYWxpemEKYXBsaWNhbmRvIGxhcyB2YXJpYWJsZXMgZGlyZWN0YW1lbnRlIGVuIGxhIGbDs3JtdWxhIHJlZmVyaWRhOgoKYGBge3IgZXJyb3Jfc3RkfQpTRV9FREFEIDwtIHNkKGRhdG9zX2NvdmlkJEVEQUQsIG5hLnJtID0gVFJVRSkgLyBzcXJ0KGxlbmd0aChkYXRvc19jb3ZpZCRFREFEKSkKU0VfRURBRApgYGAKCk90cmEgbWFuZXJhIGRlIG9idGVuZXIgZWwgKipFcnJvciBFc3TDoW5kYXIqKiBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YQpkZSBtYW5lcmEgbcOhcyBkaXJlY3RhIGVzIGEgdHJhdsOpcyBkZWwgc2NyaXB0CmBNZWFuU0Uob2JqZXRvLCBzZCA9IE5VTEwsIG5hLnJtID0gVFJVRSlgIGRlIGxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzKClgLApkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKYGBge3IgRVN9ClNFX2FnZSA8LSBNZWFuU0UoZGF0b3NfY292aWQgJCBFREFELCBzZCA9IE5VTEwsIG5hLnJtID0gVFJVRSkKU0VfYWdlCmBgYAoKRWwgdGFtYcOxbyBkZWwgZXJyb3IgYWxlYXRvcmlvIGV4aXN0ZW50ZSBlbnRyZSBsYSBtdWVzdHJhIHkgZWwgY29uanVudG8KZGUgdG9kYXMgbGFzIG11ZXN0cmFzIHBvc2libGVzIGRlbCBtaXNtbyB0YW1hw7FvIChkaXN0cmlidWNpw7NuIG11ZXN0cmFsKSwKYSBwYXJ0aXIgZGUgY29tcGFyYXIgZWwgZXN0aW1hZG9yIGRlIGxhIG1lZGlhIHBhcmEgYW1iYXMsIGVzIGRlIGNhc2kKMC4wMyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyLiBMbyBxdWUgcmVmaWVyZSBxdWUgbG9zIGRhdG9zIGRlIGxhIG11ZXN0cmEKZGlzcG9uaWJsZSBzb24gbXV5IGNlcmNhbm9zIGEgbG9zIGRhdG9zIGV4aXN0ZW50ZXMgZW4gbGEgZGlzdHJpYnVjacOzbgptdWVzdHJhbCwgcXVlIGVzIG51ZXN0cmEgbWVqb3IgYXByb3hpbWFjacOzbiBhIGxhIHBvYmxhY2nDs24uCgpGaW5hbG1lbnRlLCBhIHBhcnRpciBkZSBsYSBkZWZpbmljacOzbiBvcGVyYWNpb25hbCBkZWwgZXJyb3IgYWxlYXRvcmlvLApzZSBvYnNlcnZhIHF1ZSBleGlzdGUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGVsIHRhbWHDsW8gZGUgbGEgbXVlc3RyYQp5IGVsIGVycm9yIHTDrXBpY28sIHB1ZXMgYSBtZWRpZGEgcXVlIHRpZW5lIGEgYXVtZW50YXIgZWwgcHJpbWVybywgZWwKc2VndW5kbyBzZSByZWR1Y2lyw6EgeSB2aWNldmVyc2EuIFtAY29ibzIwMDddCgpQcmVndW50YTogwr9DdcOhbCBzZXLDoSBlbCB0YW1hw7FvIGRlbCBlcnJvciBlc3TDoW5kYXIgZGUgbGEgdmFyaWFibGUgZGUgRURBRApkZSBsb3MgcGFjaWVudGVzIGNvbiBzw61udG9tYXMgZGUgY292aWQtMTkgZW4gY2FzbyBxdWUgZWwgdGFtYcOxbyBkZQptdWVzdHJhIChuKSBmdWVzZSBkZSA4MDAsMDAwIGluZGl2aWR1b3M/CgrCv0N1w6FsIHNlcsOhIGVsIHRhbWHDsW8gZGVsIGVycm9yIGVzdMOhbmRhciBkZSBsYSB2YXJpYWJsZSBkZSBFZGFkIGRlIGxvcwpwYWNpZW50ZXMgY29uIHPDrW50b21hcyBkZSBjb3ZpZC0xOSBlbiBjYXNvIHF1ZSBlbCB0YW1hw7FvIGRlIG11ZXN0cmEgKG4pCmZ1ZXNlIGRlIDEwMCwwMDAgaW5kaXZpZHVvcz8KCiMjIDIuIEVzdGltYWNpw7NuIHkgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EKCkVsIHByb2Nlc28gZGUgbGEgaW5mZXJlbmNpYSBlc3RhZMOtc3RpY2EgcXVlIHNlIGFwb3lhIGVuIGxhcyBwcnVlYmFzIGRlCmhpcMOzdGVzaXMgbyBzaWduaWZpY2FuY2lhIHNlIGFwb3lhIGVuIGxhcyBoZXJyYW1pZW50YXMgZGUgbGEgZXN0aW1hY2nDs24KZGUgdW4gcGFyw6FtZXRybyBhIHBhcnRpciBkZSB1biBlc3RhZMOtc3RpY28gcHJvdmVuaWVudGUgZGUgdW5hIG11ZXN0cmEuIFkKZGljaG8gcHJvY2VzbyBkZSBlc3RpbWFjacOzbiBzZSBwdWVkZSByZWFsaXphciBtZWRpYW50ZSBkb3MgaW5zdHJ1bWVudG9zOgoKMVwuIEVzdGltYWRvcmVzIHB1bnR1YWxlcywgbwoKMlwuIEludGVydmFsb3MgZGUgQ29uZmlhbnphLgoKQSBwYXJ0aXIgZGUgZXN0b3MgZXN0aW1hZG9yZXMgc2UgYnVzY2FuIHJlc3BvbmRlciBkb3MgdGlwb3MgZGUgcHJlZ3VudGFzCnJlbGFjaW9uYWRhcyBjb24gbGEgcHJ1ZWJhIGRlIHVuYSBoaXDDs3Rlc2lzOgoKMVwuIMK/U2UgcHVlZGUgbmVnYXIgY2llcnRvIHZhbG9yIGRlbCBwYXLDoW1ldHJvPyBFc3RhIHNlcsOhIHJlc3BvbmRpZGEKbWVuZGlhbnRlIGxhIFBITiB5IHN1ICoqTml2ZWwgZGUgU2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EqKiwgeQoKMlwuIMK/UXXDqSB2YWxvcmVzIGRlbCBwYXLDoW1ldHJvIHNvbiBjcmXDrWJsZXM/IEVzdGEgc2Vyw6EgcmVzcG9uZGlkYQptZWRpYW50ZSBsb3MgKipJbnRlcnZhbG9zIGRlIENvbmZpYW56YSoqIHkgc3Ugbml2ZWwgZGUgY29uZmlhbnphIChlc3RvCnNlIGFib3JkYXLDoSBlbiBvdHJhIHNlc2nDs24pLgoKIyMjIDIuMS4gRXN0aW1hY2nDs24gcHVudHVhbAoKVW4gKiplc3RpbWFkb3IgcHVudHVhbCoqICJlcyBsYSByZXByZXNlbnRhY2nDs24gbnVtw6lyaWNhIGRlIHVuYQpjYXJhY3RlcsOtc3RpY2EgZGUgdW5hIHBvYmxhY2nDs24gcXVlIHNlIHJlYWxpemEgYSBwYXJ0aXIgZGUgdW5hIG11ZXN0cmEuCkVzIHVuIGVzdGFkw61zdGljbyBtdWVzdHJhbCBwYXJhIGVzdGltYXIgdW4gdmFsb3IgZGUgaW50ZXLDqXMgZW4gdW5hCnBvYmxhY2nDs24gbyB1bml2ZXJzbyIuIFtAdmlsYWx0YTIwMTYsIHAuIDk0XSBBIHBhcnRpciBkZWwgc3VwdWVzdG8gZGVsCioqKlRlb3JlbWEgZGVsIEzDrW1pdGUgQ2VudHJhbCoqKiBzZSBhc3VtZSBxdWUgZWwgZWplbXBsbyBjbMOhc2ljbyBkZQplc3RpbWFkb3IgcHVudHVhbCBlcyBsYSBtZWRpYSBhcml0bcOpdGljYSBkZSB1bmEgbXVlc3RyYSwgcXVlIHNlIHRyYXRhCmNvbW8gc2kgZnVlcmEgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYS4gRXN0byBwZXJtaXRlLCB0YW1iacOpbiwgcXVlIHN1CmPDoWxjdWxvIHNlIHJlYWxpY2Ugc29icmUgbGEgYmFzZSBkZSB1bmEgKmRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkZXMqCnksIGFzw60sIGV2YWx1YXIgbGEgaGlww7N0ZXNpcyBnZW5lcmFkYSBhIHBhcnRpciBkZSBkaWNobyBlc3RpbWFkb3IgeSwKZmluYWxtZW50ZSwgaW50ZXJwcmV0YXIgc3UgcmVzdWx0YWRvIGEgbGEgbHV6IGRlIHVuIGNyaXRlcmlvIGRlCmRlY2lzacOzbi4gRGljaG8gY3JpdGVyaW8gc2UgcmVmaWVyZSBhIGxhICoqc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgZGVsCmVzdGltYWRvcioqLgoKIyMjIyAyLjEuMS4gUHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIGRlIHVuIGVzdGltYWRvciBwdW50dWFsIChtZWRpYSkKCkxhICoqcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhKiogZXMgdW5hIHTDqWNuaWNhIGRlIGVzdGFkw61zdGljYQppbmZlcmVuY2lhbCBxdWUgc2UgdXNhICJwYXJhIGp1emdhciBzaSB1bmEgcHJvcGllZGFkIHF1ZSwgc2Ugc3Vwb25lLApjdW1wbGUgdW5hIHBvYmxhY2nDs24gZXMgY29tcGF0aWJsZSBjb24gbG8gb2JzZXJ2YWRvIGVuIHVuYSBtdWVzdHJhIGRlIGxhCm1pc21hLiIgW0Bjb2JvMjAwNywgcC4gMTYwXSBBIHBhcnRpciBkZSBkaWNoYSBjb21wYXJhY2nDs24gZGUgbGFzCnByb2JhYmlsaWRhZGVzIGNhbGN1bGFkYXMgcGFyYSBlbCB2YWxvciBvYnNlcnZhZG8gZW4gdW5hIG11ZXN0cmEKcmVzcGVjdG8gZGVsIG1pc21vIHZhbG9yIGNvcnJlc3BvbmRpZW50ZSBwYXJhIGVsIHBhcsOhbWV0cm8gcG9ibGFjaW9uYWwKZXMgcXVlIHNlIGJ1c2NhIGVzdGFibGVjZXIgdW4gY3JpdGVyaW8gZGUgZGVjaXNpw7NuIHBhcmEgYWNlcHRhciBvCnJlY2hhemFyIGxhIGhpcMOzdGVzaXMgcGxhbnRlYWRhIHBhcmEgY29ub2NlciBsYSByZWFsaWRhZCAocG9ibGFjaW9uYWwpLApyZWNvbm9jaWVuZG8gc2llbXByZSBsYSBleGlzdGVuY2lhIGRlIHVuIGVycm9yIGFsZWF0b3JpbywgbyBlbCByaWVzZ28KYXNvY2lhZG8gY29uIG5vIGVzdGFyIDEwMCUgc2VndXJvIGRlIHF1ZSBsbyBvYnNlcnZhZG8gZW4gdW5hIG11ZXN0cmEgc2UKZGViZSBhIGNhdXNhcyBzaXN0ZW3DoXRpY2FzICh0cmF0YW1pZW50bywgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSwgY2F1c2EKZXNwZXJhZGEsIGV0Yy4pLiIgW0BzYWxraW5kMjAxM10KCkNvbiBlbCBmaW4gZGUgZXZhbHVhciBkaWNoYSBjb21wYXJhY2nDs24gZGUgcHJvYmFiaWxpZGFkZXMsIHkgcGFyYSB0b21hcgp1bmEgZGVjaXNpw7NuIGFsIHJlc3BlY3RvIGNvbnNpZGVyYW5kbyBlbCByaWVzZ28gZGVsIGVycm9yIGFsZWF0b3Jpbywgc2UKdXRpbGl6YSB1biBjcml0ZXJpbyBkZSBkZWNpc2nDs24gcXVlIGNvbnNpc3RlIGVuIGVsICoqTml2ZWwgZGUKc2lnbmlmaWNhbmNpYSoqIChyZXByZXNlbnRhZG8gcG9yIGxhIGxldHJhIGdyaWVnYSAkXGFscGhhJCkuIEVzdGUgImVzIGVsCmdyYWRvIGRlIHJpZXNnbyBxdWUgc2UgZGVzZWEgYWNlcHRhciBwYXJhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSAoYQpwYXJ0aXIgZGUgbG9zIGRhdG9zIG11ZXN0cmFsZXMpIGN1YW5kbyBlcyB2ZXJkYWRlcmEgZW4gbGEgcmVhbGlkYWQKKHBvYmxhY2lvbmFsKS4iIFkgZGljaG8gZ3JhZG8gZGUgcmllc2dvIGVuIGVsIGZvbmRvIGNvbnNpc3RlIGVuIHVuYQpwcm9iYWJpbGlkYWQgY29uZGljaW9uYWwgc29icmUgZWwgcmllc2dvIGFjZXB0YWJsZSwgZGUgbWFuZXJhIHF1ZToKJCRcYWxwaGEgPSBQKFx0ZXh0e3JlY2hhemFyIEgwfSB8IFx0ZXh0e0gwIGVzIHZlcmRhZGVyYX0pJCQKCiMjIyMgMi4xLjIuIFRpcG9zIGRlIGVycm9yIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMKCkRlYmlkbyBhIGxhIG5hdHVyYWxlemEgcHJvYmFiaWzDrXN0aWNhIGRlIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgKG51bGEpCm8gZGUgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EsIGxvIHF1ZSBzZSBidXNjYSBlcyBldmFsdWFyIGxhCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBjb24gZWwgZmluIGRlIHRvbWFyIHVuYQpkZWNpc2nDs24gZmluYWwgc29icmUgbGEgdmVyb3NpbWlsaXR1ZCBkZSBsYSBtaXNtYS4KClVuYSBjYXJhY3RlcsOtc3RpY2EgcHJvYmFiaWzDrXN0aWNhIGRlIHRvZG8gcmVzdWx0YWRvIG8gZXZlbnRvIHBvc2libGUgZGUKbGEgdmFyaWFibGUgZGUgaW50ZXLDqXMgY29uc2lzdGUgZW4gcXVlIHN1IHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhLApwb3IgbcOhcyBtw61uaW1hIHF1ZSBwdWVkYSBzZXIsIG51bmNhIHNlcsOhIGlndWFsIGEgMCAoYXVzZW5jaWEgZGVsIGV2ZW50bykKbyBhIDEgKHByZXNlbmNpYSBjb21wbGV0YSBkZWwgZXZlbnRvKS4gRGUgbWFuZXJhIHF1ZSB0YW50byBsYSBoaXDDs3Rlc2lzCmFsdGVybmF0aXZhIGFzw60gY29tbyBsYSBoaXDDs3Rlc2lzIG51bGEgc2llbXByZSB0aWVuZW4gYXNvY2lhZGEgdW5hCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhLgo8IS0tLSBJTkNMVUlSIElNQUdFTiBERSBESVNUUklCVUNJw5NOIERFIEhJUMOTVEVTSVMtLS0+CgpBbnRlIGRpY2hhIHNpdHVhY2nDs24sIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSoqIGVzIGVsIGNyaXRlcmlvIGRlCmRlY2lzacOzbiBxdWUgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgbGEgb2N1cnJlbmNpYSBkZWwgZXZlbnRvIGFuYWxpemFkbwp5LCB0YW1iacOpbiwgcGFyYSBxdWUgZWwgYW5hbGlzdGEgdG9tZSB1bmEgKmRlY2lzacOzbiogKGFjZXB0YXIgbwpyZWNoYXphcikgc29icmUgbGEgaGlww7N0ZXNpcyBldmFsdWFkYSBjb21vIGxhIG1lam9yIGV4cGxpY2FjacOzbiBwb3NpYmxlCmRlIGxhIHJlYWxpZGFkLgoKU2luIGVtYmFyZ28sIGRlYmlkbyBhIGxhIG1pc21hIG5hdHVyYWxlemEgcHJvYmFiaWzDrXN0aWNhIGRlIGxhIHBydWViYXMKZGUgaGlww7N0ZXNpcyAobnVsYSkgbyBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSB0YW1iacOpbiBzZSBjb3JyZSBlbApyaWVzZ28gZGUgY29tZXRlciAqKmVycm9yZXMqKiBhbCBldmFsdWFyIGxhIHByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhCmRlIHVuYSBoaXDDs3Rlc2lzIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBtdWVzdHJhbGVzLCB5IHRhbWJpw6luIHNlIHB1ZWRlbgpnZW5lcmFyIGVycm9yZXMgYWwgbW9tZW50byBlbiBxdWUgZWwgYW5hbGlzdGEgZGViZSB0b21hciB1bmEgZGVjaXNpw7NuCnNvYnJlIGxhIGhpcMOzdGVzaXMgKG51bGEpIGV2YWx1YWRhLgoKQWwgZXZhbHVhciBsYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGViZSBjb25zaWRlcmFyIHF1ZSwgZW4gbGEgKnBvYmxhY2nDs24qCmRpY2hhIGhpcMOzdGVzaXMgcHVlZGUgc2VyIHZlcmRhZGVyYSBvIGZhbHNhLCBtaWVudHJhcyBxdWUgZWwgYW5hbGlzdGEKZGViZSAqKmRlY2lkaXIqKiBlbnRyZSAqcmVjaGF6YXIqIG8gKm5vIHJlY2hhemFyKiBsYSBoaXDDs3Rlc2lzIG51bGEuCgpBbnRlIGVzdGEgY29tYmluYWNpw7NuIGRlIHBvc2liaWxpZGFkZXMsIHNlIHB1ZWRlbiBnZW5lcmFyICoqZG9zIHRpcG9zIGRlCmVycm9yKiogZW4gbGFzIHBydWViYXMgZGUgc2lnbmlmaWNhbmNpYToKCjEuICBFcnJvciB0aXBvIEksIHkKMi4gIEVycm9yIHRpcG8gSUkuCgp8IERlY2lzacOzbiBkZWwgYW5hbGlzdGEgfCBIMCBWZXJkYWRlcmEgICAgICAgIHwgSDAgRmFsc2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBBY2VwdGFyICAgICAgICAgICAgICAgfCBEZWNpc2nDs24gY29ycmVjdGEgICB8IEVycm9yIHRpcG8gSUkgKGJldGEpICAgICAgICAgICAgICAgICB8CnwgUmVjaGF6YXIgICAgICAgICAgICAgIHwgRXJyb3IgdGlwbyBJIChhbGZhKSB8IERlY2lzacOzbiBjb3JyZWN0YSAocG9kZXIgPSAxIC0gYmV0YSkgfAoKMS4gIEVsIGVycm9yIHRpcG8gSSBzZSBjb3JyZXNwb25kZSBjb24gZWwgKipOaXZlbCBkZSBTaWduaWZpY2FuY2lhKiosIG8KICAgIHF1ZSBwdWVkZSBzZXIgY29uY2ViaWRvIHRhbWJpw6luIGNvbW8gdW4gKmZhbHNvIHBvc2l0aXZvKi4gWSBlc3RlCiAgICBjb25zaXN0ZSBlbiBsYTogJFAocmVjaGF6YXIgSDAgfCBIMCB2ZXJkYWRlcmEpJC4gRXN0YSBwcm9iYWJpbGlkYWQKICAgIGxhIGRlZmluZSBlbCBhbmFsaXN0YSBkZSBtYW5lcmEgZGlzY3JlY2lvbmFsIHkgZGUgYW50ZW1hbm8gYSBsYQogICAgcmVhbGl6YWNpw7NuIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhOyBlbnRyZSBsb3MgdmFsb3JlcwogICAgZXN0w6FuZGFyIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGV2YWx1YXIgZGljaG8gcmllc2dvIGRlIGVycm9yIHNlCiAgICBzdWVsZW4gdWJpY2FyIGVuIDUlIG8gMSUgKEZpc2hlciwgMTkyNSkuIEVzdG8gZXMsIHNlIGNvbnNpZGVyYQogICAgYWNlcHRhYmxlIHVuIGVycm9yIChvIG5pdmVsIGRlIHNpZ25pZmljYW5jaWE6ICRcYWxwaGEkKSBkZWwgNSUsIGVuCiAgICBkb25kZSBzZSBjb250ZW1wbGEgcXVlIDEgZGUgY2FkYSAyMCBjYXNvcyBlbCBhbmFsaXN0YSB0b21lIHVuYQogICAgZGVjaXNpw7NuIGVycmFkYS4KCjIuICBFbCBlcnJvciB0aXBvIElJIGNvbnNpc3RlIGVuIGxhIHByb2JhYmlsaWRhZCBkZToKICAgICRQKGFjZXB0YXIgSDAgfCBIMCBmYWxzYSkkLCB5IHF1ZSBzZSBjb25vY2UgdGFtYmnDqW4gY29tbyB1biAqZmFsc28KICAgIG5lZ2F0aXZvKi4gRXN0ZSBzdWVsZSByZXByZXNlbnRhcnNlIGNvbiBlbCBlc3RpbWFkb3IgJFxiZXRhJCwgcXVlCiAgICBlc3TDoSB2aW5jdWxhZG8gYWwgdGFtYcOxbyBkZSBtdWVzdHJhICgkbiQpIHksIHBvciB0YW50bywgbm8gcHVlZGUKICAgIG1hbmlwdWxhcnNlIGRpcmVjdGFtZW50ZSBwb3IgZWwgYW5hbGlzdGEuIEEgc3UgdmV6LCBsYSBwcm9iYWJpbGlkYWQKICAgIGludmVyc2EgJDEtXGJldGEkIHNlIGNvbm9jZSBjb21vIGVsICoqcG9kZXIgZXN0YWTDrXN0aWNvKiogZGUgbGEKICAgIHBydWViYSBkZSBoaXDDs3Rlc2lzLCB5IHF1ZSBjb25zaXN0ZSBlbiBhZG9wdGFyIHVuYSBkZWNpc2nDs24gY29ycmVjdGEKICAgIGN1YW5kbyAkUChcdGV4dHtyZWNoYXphciBIMH0gfCBcdGV4dHtIMCBlcyBmYWxzYX0pJC4gW011cnBoeSB5CiAgICBNeWVycywgMjAwNCBjaXRhZG8gZW4gQHZpbGFsdGEyMDE2LCBwLiAxNTVdCgojIyMgMi4yLiBMw7NnaWNhIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzIHkgcC12YWx1ZQoKU2kgYmllbiBlbCAqKk5pdmVsIGRlIFNpZ25pZmljYW5jaWEqKiBjb25zaXN0ZSBlbiBlbCBjcml0ZXJpbyB1dGlsaXphZG8KcG9yIGVsIGFuYWxpc3RhIHBhcmEgdG9tYXIgdW5hIGRlY2lzacOzbiBzb2JyZSBsYSBpbmZlcmVuY2lhIGdlbmVyYWRhIGVuCnRvcm5vIGEgdW5hIGhpcMOzdGVzaXMgbnVsYSwgZWwgZXN0aW1hZG9yIHF1ZSBzZSB1dGlsaXphIHBhcmEgZXZhbHVhciBsYQpzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSAocHJvYmFiaWxpZGFkKSBhc29jaWFkYSBhIGRpY2hhIGhpcMOzdGVzaXMKY29uc2lzdGUgZW4gZWwgKipwLXZhbG9yKiouCgpFc3RlIGNvbnNpc3RlIGVuICJsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIHNlIHByZXNlbnRlIHVuIHZhbG9yIGRlbAplc3RhZMOtc3RpY28gKG1lZGlhKSBtw6FzIGFsZWphZG8gZGUgbGEgaGlww7N0ZXNpcyBudWxhIChlbiBsYSBwb2JsYWNpw7NuKQpxdWUgZWwgb2JzZXJ2YWRvIChlbiBsYSBtdWVzdHJhKS4iIFtAY29ibzIwMDcsIHAuIDE2MF0gTyBkaWNobyBkZSBvdHJhCm1hbmVyYSwgZXMgbGEgInByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciB2YWxvcmVzIGRlbCBlc3RhZMOtc3RpY28gaWd1YWwgbwptw6FzIGV4dHJlbW9zIHF1ZSBlbCBvYnNlcnZhZG8sIGVuIGNhc28gZGUgcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBzZWEKY2llcnRhLiIgW0Bjb2JvMjAwNywgcC4gMTYwXQoKU3UgaW50ZXJwcmV0YWNpw7NuIGRlYmUgcmVjb25vY2VyIHF1ZSAic2kgZWwgKipwLXZhbG9yKiogZXMgcGVxdWXDsW8sIHNlCmRpY2UgcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBlcyBpbnZlcm9zw61taWwuICguLi4pIChPKSBDdcOhbiBpbnZlcm9zw61taWwgZXMKZWwgcmVzdWx0YWRvIG9ic2VydmFkbyBzaSBsYSBoaXDDs3Rlc2lzIG51bGEgZnVlcmEgY2llcnRhIiBvICJIYXN0YSBxdcOpCnB1bnRvIGVsIHJlc3VsdGFkbyBvYnNlcnZhZG8gKGVuIGxhIG11ZXN0cmEpIGVzIHByb2JhYmlsw61zdGljYW1lbnRlCmNvbXBhdGlibGUgY29uIGxhIGhpcMOzdGVzaXMgbnVsYS4iIFtAY29ibzIwMDcsIHAuIDE2MF0KCkxhIGzDs2dpY2EgZGUgbGEgUEhOIGNvbnNpc3RlIGVuIGFsY2FuemFyIHJlc3VsdGFkb3MgYWx0YW1lbnRlCnNpZ25pZmljYXRpdm9zLCBvIGxvIHF1ZSBlcyBsbyBtaXNtbyAiYnVzY2FyIGxhIG1lbm9yIHByb2JhYmlsaWRhZCBkZQpjb21ldGVyIHVuIGVycm9yIHRpcG8gSSIgcXVlIHBlcm1pdGEsIGFsIGZpbmFsLCByZWNoYXphciBhIGxhIGhpcMOzdGVzaXMKbnVsYSBjb21vIGxhIG1lam9yIGV4cGxpY2FjacOzbiBwb3NpYmxlIGRlIGxhIHJlYWxpZGFkLgoKRGUgbWFuZXJhIHF1ZSAiY2FkYSBIMCB0aWVuZSBhc29jaWFkYSB1biB0aXBvIHBhcnRpY3VsYXIgZGUgZXN0YWTDrXN0aWNvCih6LCB0LCBGLCB1IG90cm8pLiBZIGNhZGEgZXN0YWTDrXN0aWNvIHRpZW5lIGFzb2NpYWRvIHVuIHRpcG8gZXNwZWNpYWwgZGUKZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWRlcyBjb24gbGEgcXVlIHNlIHB1ZWRlIGNvbXBhcmFyIGxvcyBkYXRvcyBkZQp1bmEgbXVlc3RyYS4gTGEgY29tcGFyYWNpw7NuIGVudHJlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIG11ZXN0cmEKZnJlbnRlIGEgbG9zIGRlIGxhIHBvYmxhY2nDs24sIGVuIGxhIHBydWViYSBkZSBkaXN0cmlidWNpw7NuIHBlcm1pdGVuCmNvbmNsdWlyIHNpIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIG11ZXN0cmEgc29uIGRpZmVyZW50ZXMgYSBsbyBxdWUgc2UKZXNwZXJhcsOtYSBvYnRlbmVyIHBvciBhemFyIChlbiBsYSBwb2JsYWNpw7NuLCByZXByZXNlbnRhZGEgbWVkaWFudGUgbGEKY3VydmEgZGUgZGlzdHJpYnVjacOzbiBkZSBwcm9iYWJpbGlkYWRlcykuIiBbQHNhbGtpbmQyMDEzXQoKRXN0byBlcywgc2UgY29tcGFyYSBlbCAqKnAtdmFsb3IqKiBjYWxjdWxhZG8geSBhc29jaWFkbyBhIGxhCnByb2JhYmlsaWRhZCBkZSBvY3VycmVuY2lhIGRlICRIXzAkIGNvbiByZXNwZWN0byBhbCAqKk5pdmVsIGRlCnNpZ25pZmljYW5jaWEqKiAoJFxhbHBoYSQpIHByZXZpYW1lbnRlIGRlZmluaWRvLCB5IGEgcGFydGlyIGRlIGVsbG8gc2UKdG9tYSB1bmEgZGVjaXNpw7NuIGNlbnRyYWRhIGVuIGxhICoqSGlww7N0ZXNpcyBudWxhKiogKCRIXzAkKS4KCiMjIyMgMi4yLjEuIFBhc29zIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzIG8gc2lnbmlmaWNhbmNpYS4KCkxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIGhhY2UgdW5hIHByZWd1bnRhIGNvbmNyZXRhIHNvYnJlIGVsIHZhbG9yIGRlbApwYXLDoW1ldHJvIGVuIGxhIHBvYmxhY2nDs24gYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG9ic2VydmFkb3MgZW4gbGEgbXVlc3RyYQpvIHNpICRccGkgPSBcYmFye3h9JC4gWSBkb25kZSBsYSBoaXDDs3Rlc2lzIG51bGEgImVzIGVsIHB1bnRvIGRlIHNhbGlkYQpkZSBsYSBpbnZlc3RpZ2FjacOzbiwgcG9yIGxvIHF1ZSBkZWJlIGVzdGFibGVjZXJzZSBwcmV2aW8gYSBsYQpyZWNvbGVjY2nDs24gZGUgbG9zIGRhdG9zLiIgW0Bjb2JvMjAwNywgcC4gMTcwXQoKQSBwYXJ0aXIgZGUgZGljaGEgcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEgc2UgYnVzY2EgInRvbWFyIHVuYSBkZWNpc2nDs24KKHNvYnJlIEgwKSwgbWFudGVuaWVuZG8gbG9zIHJpZXNnb3MgZGVsIGVycm9yLCBjb250cm9sYWRvcyIsIGFsIG1pc21vCnRpZW1wbyBxdWUgc2UgImFwb3J0YSBldmlkZW5jaWEgZW4gY29udHJhIGRlIGxhIGhpcMOzdGVzaXMgbnVsYS4iCltAY29ibzIwMDcsIHAuIDE3MS0xNzJdCgpMYSBtZWPDoW5pY2EgZGUgbGFzIHBydWViYXMgZGUgc2lnbmlmaWNhbmNpYSBvIGRlIGhpcMOzdGVzaXMgc2lndWVuIHVuYQpzZXJpZSBkZSBwYXNvcywgeSBlc3RvcyB0aWVuZGVuIGEgdmFyaWFyIHNlZ8O6biBjYWRhIGF1dG9yLiBBCmNvbnRpbnVhY2nDs24gc2UgcHJlc2VudGFuIHVuYSBzZXJpZSBkZSA2IHBhc29zLCBiYXNhZG9zIGVuIGxhIHByb3B1ZXN0YQpkZSBTYWxraW5kIFstQHNhbGtpbmQyMDEzXToKCjEuICAqKipEZWZpbmljacOzbioqKiBkZSBsYSAqKkhpcMOzdGVzaXMgbnVsYSoqICgkSF8wJCksIGVzdGEgY29uc2lzdGUKICAgIHNpZW1wcmUgZW4gdW5hICJpZ3VhbGRhZCIgbyBlbiBsYSBuZWdhY2nDs24gZGVsIGVmZWN0byBlbnRyZQogICAgdmFyaWFibGVzLiBQb3IgZWplbXBsbzogJFxtdSA9IFxiYXJ7eH0kLgoKMi4gICoqKkRlZmluaWNpw7NuKioqIGRlbCAqKk5pdmVsIGRlIFNpZ25pZmljYW5jaWEqKiAoJFxhbHBoYSQpIHBvciBlbAogICAgYW5hbGlzdGEsIHF1ZSBzdWVsZSB1YmljYXJzZSBlbiB2YWxvcmVzIGVzdMOhbmRhciBkZSA1JSBvIDElLgoKMy4gICoqKlNlbGVjY2nDs24qKiogZGVsICoqZXN0YWTDrXN0aWNvKiogYXByb3BpYWRvIHNlZ8O6biBsYSAqZGlzdHJpYnVjacOzbgogICAgZGUgcHJvYmFiaWxpZGFkKiBkZSBsYSB2YXJpYWJsZSBhbmFsaXphZGEuIEVzdG9zIHB1ZWRlbgogICAgY29ycmVzcG9uZGVyc2UgY29uIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGVzdGFkw61zdGljb3MgJHosIHQsIEYsIHIkCiAgICB1IG90cm8gKFJlY29tZW5kYWNpw7NuOiB1c28gZGVsIGRpYWdyYW1hIGVsYWJvcmFkbyBwb3IgU2Fsa2luZAogICAgWy1Ac2Fsa2luZDIwMTNdKS4KCjQuICAqKipDw6FsY3VsbyAobWVkaWFudGUgZsOzcm11bGEpKioqIGRlbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIHBhcmEgbGEKICAgIG11ZXN0cmEgKHZhbG9yIG9idGVuaWRvIGRlbCAqKnAtdmFsb3IqKiksIHF1ZSBjb25zaXN0ZSBlbiB1bmEKICAgIHRyYW5zZm9ybWFjacOzbiBkZSBsYSB1bmlkYWQgZGUgbWVkaWRhIGRlIGxhIHZhcmlhYmxlIG9yaWdpbmFsIGFsCiAgICB2YWxvciBjb3JyZXNwb25kaWVudGUgKCplc3RhbmRhcml6YWNpw7NuIGRlIGxhIHZhcmlhYmxlKikgc2Vnw7puIGVsCiAgICBlc3RhZMOtc3RpY28gZGUgZGlzdHJpYnVjacOzbiBjb3JyZXNwb25kaWVudGUgeSwgYXPDrSwgY2FsY3VsYXIgc3UKICAgIHByb2JhYmlsaWRhZCBhc29jaWFkYS4KCjUuICAqKipDb21wYXJhcioqKiBlbCB2YWxvciBvYnRlbmlkbyBkZWwgKipwLXZhbG9yKiogYXNvY2lhZG8gYSBsYQogICAgcHJvYmFiaWxpZGFkIGRlIG9jdXJyZW5jaWEgZGUgSDAgZW4gbGEgcG9ibGFjacOzbiBmcmVudGUgYWwgKipOaXZlbAogICAgZGUgU2lnbmlmaWNhbmNpYSAoKiokXGFscGhhJCkgcHJldmlhbWVudGUgZGVmaW5pZG8gcG9yIGVsIGFuYWxpc3RhLAogICAgeSB1YmljYXIgc2kgZWwgcC12YWx1ZSBlcyBtZW5vciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhLi4KCjYuICAqKipEZWNpc2nDs24qKiogZGVsIGFuYWxpc3RhIHNvYnJlIEgwLCBxdWUgY29ycmVzcG9uZGUgYWwgKnJlY2hhem8qIG8KICAgICpubyByZWNoYXpvKiBkZSAkSF8wJCBhIHBhcnRpciBkZSBsYSBjb21wYXJhY2nDs24gcmVhbGl6YWRhIGVuIGVsCiAgICBwYXNvIDUuCgpEZSBtYW5lcmEgcXVlIHNpOiAkJCBcdGV4dHtwLXZhbHVlfSBcZ2VxIFxhbHBoYSA6IFx0ZXh0e05vIHJlY2hhem8gSDB9JCQKJCQgXHRleHR7cC12YWx1ZX0gPCBcYWxwaGE6IFx0ZXh0e1JlY2hhem8gSDB9JCQKCiMjIDMuIFBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgdW5hIHZhcmlhYmxlLgoKQWwgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBjb24gbG9zIGRhdG9zIGRlIHVuYSBtdWVzdHJhIHNlIHB1ZWRlCnJlYWxpemFyIGVsIHByb2Nlc28gZGUgZXN0aW1hY2nDs24gcGFyYSBjb25vY2VyIHPDrSBsYSBwcmltZXJhIG5vcyBwZXJtaXRlCmFjZXJjYXJub3MgYWwgdmFsb3IgY29ycmVzcG9uZGllbnRlIGVuIGxhIHBvYmxhY2nDs24gKHBhcsOhbWV0cm8pLiBTaW4KZW1iYXJnbyBlcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBlbCB0aXBvIGRlIHZhcmlhYmxlIGNvbiBsYSBxdWUgc2UKZXN0w6EgdHJhYmFqYW5kbyBlbCBwcm9jZXNvIGRlIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhIChnZW5lcmFsaXphY2nDs24pLAp5YSBzZWEgcXVlIHNlIHRyYXRlIGRlIHVuYSB2YXJpYWJsZSBjY29udGludWEgbyBjYXRlZ8OzcmljYS4gUHVlcyBwYXJhIGVsCnByaW1lciBjYXNvIHNlIHRyYWJhamEgY29uIGVsIGVzdGFkw61zdGljbyBkZSBsYSBtZWRpYSBtaWVudHJhcyBxdWUgcGFyYQplbCBzZWd1bmRvIHNlIGV2YWzDumEgbGEgcHJvcG9yY2nDs24gZGVsIGF0cmlidXRvIGRlIGludGVyw6lzIChub21pbmFsIHUKb3JkaW5hbCkuCgojIyMgMy4xLiBQcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YS4KCkVuIGVsIGNhc28gZGUgY29udGFyIGNvbiB1bmEgdmFyaWFibGUgYWxlYXRvcmlhIGRlIHRpcG8gKipjb250aW51YSoqLApwcsOhY3RpY2FtZW50ZSBwdWVkZSBjb25zaWRlcmFyc2UgcXVlIHRpZW5kZSBhIGRpc3RyaWJ1aXJzZSBjb21vIHVuYQoqbm9ybWFsKiAoJFggLT4gTihcYmFye1h9LCBcc2lnbWEpJCkgYWwgY3VtcGxpciwgYWwgbWVub3MsIGxhcwpzaWd1aWVudGVzIGNvbmRpY2lvbmVzOgoKaS4gICJuIiBncmFuZGUgKG4gXD4gMzAgY2Fzb3MpIHlcCmlpLiBzZSBzZWxlY2Npb25hIGFsIDEwJSBkZSBsYSBwb2JsYWNpw7NuIGVuIGxhIG11ZXN0cmEsIG8KaWlpLiAkWCQgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLgoKRW50b25jZXMgc2UgY29uc2lkZXJhIHF1ZSBzdSAqbWVkaWEqIHNlcsOhIHVuIGJ1ZW4gZXN0aW1hZG9yIHBhcmEgY29ub2NlcgplbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsIGNvcnJlc3BvbmRpZW50ZS4KCiMjIyMgMy4xLjEuIEhpcMOzdGVzaXMgZGUgZG9zIGNvbGFzIG8gImRlc2lndWFsZGFkIiwgZG9uZGUgJFxtdSBcbmVxIFxiYXJ7eH0kCgpTaWd1aWVuZG8gbG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBoaXDDs3Rlc2lzLCBzZSBlc3RhYmxlY2UgcXVlOgoKMS4gIEhpcMOzdGVzaXMgbnVsYTogJFxtdSA9IFxiYXJ7WH0kOyBIaXDDs3Rlc2lzIGFsdGVybmF0aXZhOgogICAgJFxtdSBcbmVxIFxiYXJ7WH0kIChoaXDDs3Rlc2lzIGRlICJkb3MgY29sYXMiKS4gQSBwYXJ0aXIgZGUgZXN0YQogICAgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgY2FsY3VsYWRvIGEgcGFydGlyCiAgICBkZSBsYSBtdWVzdHJhIHNlIHBhcmVjZSBhbCBwcm9tZWRpbyBkZSBlZGFkIGVuIGxhIHBvYmxhY2nDs24uCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKToKICAgICQkeiA9IFxmcmFjeyhcYmFye1h9IC0gXG11KX17XGZyYWN7XHNpZ21hfXtcc3FydHtufX19JCQgU2luIGVtYmFyZ28KICAgIHNlIGRlYmUgdG9tYXIgZW4gY29uc2lkZXJhY2nDs24gcXVlIGBSYCBubyBjdWVudGEgY29uIHVuIHNjcmlwdCBlbiBlbAogICAgc2lzdGVtYSBiYXNlIHBhcmEgY2FsY3VsYXIgZGlyZWN0YW1lbnRlIGVsIHAtdmFsb3IgYXNvY2lhZG8gYWwKICAgIGN1YW50aWwgInoiLiBQb3IgZWxsbyBzZSBvcHRhIHBvciB1dGlsaXphciBlbCBzY3JpcHQgYHQudGVzdCgpYCwgcXVlCiAgICBzZSBhcG95YSBlbiBlbCBjw6FsY3VsbyBkZWwgcC12YWxvciBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvIGRlCiAgICBkaXN0cmlidWNpw7NuICoqdCBkZSBTdHVkZW50KiosIGN1eWEgZsOzcm11bGEgZXMgbXV5IHBhcmVjaWRhIGEgbGEgZGVsCiAgICBlc3RhZMOtc3RpY28gInoiOgogICAgJCR0ID0gXGZyYWN7KFxiYXJ7WH0gLSBcbXUpfXtcZnJhY3tzX1xzaWdtYX17XHNxcnR7bn19fSQkCgpMYSBkaWZlcmVuY2lhIHByaW5jaXBhbCBlbnRyZSBhbWJhcyBmw7NybXVsYXMgcmFkaWNhIGVuIGxvcyBlbGVtZW50b3MKaW5jbHVpZG9zIGVuIGVsIGRlbm9taW5hZG9yOiBwYXJhIGVsIGNhc28gZGVsIGVzdGFkw61zdGljbyAieiIsIGVsIGVycm9yCmVzdMOhbmRhciBzZSBjYWxjdWxhIGEgcGFydGlyIGRlbCB2YWxvciBkZSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIKKCRcc2lnbWEkKSBwb2JsYWNpb25hbCwgbWllbnRyYXMgcXVlIGVuIGVsIGNhc28gZGUgbGEgZsOzcm11bGEgZGVsCmVzdGFkw61zdGljbyAidCBkZSBTdHVkZW50IiBzZSBjYWxjdWxhIHV0aWxpemFuZG8gZWwgdmFsb3IgZGUgbGEKZGVzdmlhY2nDs24gZXN0w6FuZGFyICgkc19cc2lnbWEkKSBwYXJhIGxhIG11ZXN0cmEuCgpTaW4gZW1iYXJnbywgYSBtZWRpZGEgcXVlIGVsIHRhbWHDsW8gZGUgbXVlc3RyYSAoJG4kKSB0aWVuZGUgYSBhdW1lbnRhciwKdGFudG8gJFxzaWdtYSQgY29tbyAkc19cc2lnbWEkIHRlbmRlcsOhbiBhIGFjZXJjYXJzZSBlbnRyZSBzw60geSwgcG9yCnRhbnRvLCBsYSBmb3JtYSBkZSBsYSBkaXN0cmlidWNpw7NuICJ0IGRlIFN0dWRlbnQiIHNlIHBhcmVjZXLDoSBjYWRhIHZlegptw6FzIGEgbGEgZm9ybWEgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsICJ6Ii4KCjQuICBDw6FsY3VsbyBkZWwgKipwLXZhbG9yKiouCgpgYGB7ciB0X3Rlc3RfZWRhZF9kZXNpZ3VhbGRhZH0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICNjb21hbmRvIHBhcmEgY29udmVydGlyIGxvcyB2YWxvcmVzIHBlcXVlw7FvcyBhIGRlY2ltYWxlcy4KdC50ZXN0KGRhdG9zX2NvdmlkICQgRURBRCwKICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsICNIaXDDs3Rlc2lzIGRlICJkb3MgY29sYXMiIG8gZGUgZGVzaWd1YWxkYWQKICAgICAgIG11ID0gNDIuNTY2NzUsICNWYWxvciBkZSBjb250cmFzdGFjacOzbiwgYXF1w60gc2UgdXRpbGl6w7MgZWwgdmFsb3IgZGUgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbAogICAgICAgcGFpcmVkID0gRkFMU0UsICNlbiBjYXNvIGRlIHF1ZSBsYSBtdWVzdHJhIHNlYSAicGFyZWFkYSIKICAgICAgIHZhci5lcXVhbCA9IEZBTFNFLCAjc3VwdWVzdG8gZGUgdmFyaWFuemEgaG9tb2fDqW5lYSBzaSBsYSBtdWVzdHJhIGVzIHBhcmVkYS4KICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KSAjTml2ZWwgZGUgY29uZmlhbnphID0gMSAtIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEuCmBgYAoKVmFsb3Igb2J0ZW5pZG8gZW4gdW5pZGFkZXMgdCBlcyBkZSAwLjM3NDksIGNvbiA0MDE3NTQgZ3JhZG9zIGRlCmxpYmVydGFkLiBBIHBhcnRpciBkZWwgdXNvIGRlIGFtYm9zIGVsZW1lbnRvcyBzZSBwdWVkZSBjYWxjdWxhciBsYQpwcm9iYWJpbGlkYWQgY29ycmVzcG9uZGllbnRlIGFsICoqcC12YWxvcioqLCBxdWUgZXMgZGUgMC43MDc3LgoKNS4gIENvbXBhcmFjacOzbiBkZWwgKipwLXZhbG9yKiogY2FsY3VsYWRvIGZyZW50ZSBhbCAqKk5pdmVsIGRlCiAgICBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkqKi4gQWwgY29tcGFyYXIgZWwgdmFsb3IgZGVsICoqcC12YWxvcioqCiAgICBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMC43MDc3KSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKiAocXVlIGVzIGRlIDAuMDUpLiBDb24gZXN0byBzZSBwdWVkZQogICAgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMgKm1heW9yIHF1ZSogZWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEKCmkuICBFbCBwLXZhbHVlIGFzb2NpYWRvIGFsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIGVkYWQgZW4gbGEgbXVlc3RyYQogICAgKDAuNzA3NykgZXMgbWF5b3IgYWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkbyAoJFxhbHBoYSA9IDAuMDUkKSwgCiAgICBwb3IgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbgogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqbm8gc2UgcmVjaGF6YSoqIGxhIEgwIGNvbiBsb3MgZGF0b3MKICAgIG9ic2VydmFkb3MsIHBvciBsbyBxdWUgc2UgY29uc2lkZXJhIHF1ZSBIMCBlcyBsYSBtZWpvciBleHBsaWNhY2nDs24uCiAgICBPIGRpY2hvIGRlIG90cmEgbWFuZXJhLCAqc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgbGEgbWVkaWEgZGUgZWRhZCBkZQogICAgbGEgbXVlc3RyYSBlcyBzaW1pbGFyIGEgbGEgbWVkaWEgZGUgZWRhZCBkZSBsYSBwb2JsYWNpw7NuLCBjb24gdW4KICAgIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyMgMy4xLjIuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGl6cXVpZXJkYSAodW5hIGNvbGEpIG8gIm1lbm9yIHF1ZSIsIGRvbmRlICRcbXUgPCBcYmFye3h9JAoKU2lndWllbmRvIGxvcyBwYXNvcyBkZSBsYSBwcnVlYmEgZGUgaGlww7N0ZXNpcywgc2UgZXN0YWJsZWNlIHF1ZToKCjEuICBIaXDDs3Rlc2lzIG51bGE6ICRcbXUgXGdlcSBcYmFye1h9JDsgSGlww7N0ZXNpcyBhbHRlcm5hdGl2YToKICAgICRcbXUgPCBcYmFye1h9JCAoaGlww7N0ZXNpcyB1bmlsYXRlcmxhIGEgbGEgaXpxdWllcmRhKS4gQSBwYXJ0aXIgZGUKICAgIGVzdGEgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbGEKICAgIHBvYmxhY2nDs24gZXMgbWVub3IgYWwgcHJvbWVkaW8gZGUgZWRhZCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGUgbGEKICAgIG11ZXN0cmEuCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKSwgcGVybyBzZSBvcHRhIHBvciB1dGlsaXphcgogICAgZWwgZXN0YWTDrXN0aWNvICJ0IGRlIFN0dWRlbnQiLCB5IHBvciBlbmRlIGVsIHNjcmlwdCBgdC50ZXN0KClgLgoKNC4gIENhbGN1bGFyIGVsICoqcC12YWxvcioqCgpgYGB7ciB0X3Rlc3RfZWRhZF9tZW5vcl9xdWV9CnQudGVzdChkYXRvc19jb3ZpZCAkIEVEQUQsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgI0hpcMOzdGVzaXMgZGUgdW5hIGNvbGEsICJtZW5vciBxdWUiCiAgICAgICBtdSA9IDQyLjU2Njc1LCAjVmFsb3IgZGUgY29udHJhc3RhY2nDs24sIGFxdcOtIHNlIHV0aWxpesOzIGVsIHZhbG9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwKICAgICAgIHBhaXJlZCA9IEZBTFNFLCAjZW4gY2FzbyBkZSBxdWUgbGEgbXVlc3RyYSBzZWEgInBhcmVhZGEiCiAgICAgICB2YXIuZXF1YWwgPSBGQUxTRSwgI3N1cHVlc3RvIGRlIHZhcmlhbnphIGhvbW9nw6luZWEgc2kgbGEgbXVlc3RyYSBlcyBwYXJlZGEuCiAgICAgICBjb25mLmxldmVsID0gMC45NSkgI05pdmVsIGRlIGNvbmZpYW56YSA9IDEgLSBOaXZlbCBkZSBzaWduaWZpY2FuY2lhLgpgYGAKCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGNhbGN1bGFkbyBmcmVudGUgYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKi4gQWwgY29tcGFyYXIgZWwgdmFsb3IgZGVsICoqcC12YWxvcioqCiAgICBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMC42NDYxKSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoYWxmYSkqKiAocXVlIGVzIGRlIDAuMDUpLiBDb24gZXN0byBzZSBwdWVkZQogICAgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMgKm1heW9yIHF1ZSogZWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEuCgpgYGB7PWh0bWx9CjwhLS0gLS0+CmBgYAppLiAgRWwgcC12YWx1ZSBhc29jaWFkbyBhbCB2YWxvciBkZSBsYSBtZWRpYSBkZSBlZGFkIGVuIGxhIG11ZXN0cmEKICAgICgwLjY0NjEpIGVzIG1heW9yIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZG8gKFwkXGFscGhhID0KICAgIDAuMDUpLCBwb3IgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbgogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqbm8gc2UgcmVjaGF6YSoqIGxhIEgwIGNvbiBsb3MgZGF0b3MKICAgIG9ic2VydmFkb3MsIHBvciBsbyBxdWUgc2UgY29uc2lkZXJhIHF1ZSBIMCBlcyBsYSBtZWpvciBleHBsaWNhY2nDs24uCiAgICBPIGRpY2hvIGRlIG90cmEgbWFuZXJhLCAqc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgbGEgbWVkaWEgZGUgZWRhZCBkZQogICAgbGEgcG9ibGFjacOzbiBlcyBtYXlvciBvIGlndWFsIGEgbGEgbWVkaWEgZGUgZWRhZCBlbiBsYSBtdWVzdHJhLCBjb24KICAgIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyMgMy4xLjMuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGRlcmVjaGEgKHVuYSBjb2xhKSBvICJtYXlvciBxdWUiLCBkb25kZSAkXG11ID4gXGJhcnt4fSQKClNpZ3VpZW5kbyBsb3MgcGFzb3MgZGUgbGEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMsIHNlIGVzdGFibGVjZSBxdWU6CgoxLiAgKkhpcMOzdGVzaXMgbnVsYSo6ICRcbXUgXGxlcSBcYmFye1h9JDsgKkhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEqOgogICAgJFxtdSA+IFxiYXJ7WH0kIChoaXDDs3Rlc2lzIHVuaWxhdGVyYWwgYSBsYSBkZXJlY2hhKS4gQSBwYXJ0aXIgZGUKICAgIGVzdGEgaGlww7N0ZXNpcyBzZSBkZXNlYSBldmFsdWFyIHNpIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbGEKICAgIHBvYmxhY2nDs24gZXMgbWF5b3IgYWwgcHJvbWVkaW8gZGUgZWRhZCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGUgbGEKICAgIG11ZXN0cmEuCgoyLiAgTml2ZWwgZGUgc2lnbmlmaWNhbmNpYTogJFxhbHBoYSA9IDAuMDUkLiBOaXZlbCBlc3TDoW5kYXIgcGFyYSBlbAogICAgw6FtYml0byBkZSBsYXMgQ2llbmNpYXMgU29jaWFsZXMuCgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJFokIHBhcmEgZGlzdHJpYnVjacOzbiBkZSB1bmEgbXVlc3RyYQogICAgKGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIHByb2JhYmlsaWRhZGVzKSwgcGVybyBzZSBvcHRhIHBvciB1dGlsaXphcgogICAgZWwgZXN0YWTDrXN0aWNvICJ0IGRlIFN0dWRlbnQiLCB5IHBvciBlbmRlIGVsIHNjcmlwdCBgdC50ZXN0KClgLgoKNC4gIENhbGN1bGFyIGVsICoqcC12YWxvcioqCgpgYGB7ciB0X3Rlc3RfZWRhZF9tYXlvcl9xdWV9CnQudGVzdChkYXRvc19jb3ZpZCAkIEVEQUQsCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgI0hpcMOzdGVzaXMgZGUgdW5hIGNvbGEsICJtZW5vciBxdWUiCiAgICAgICBtdSA9IDQyLjU2Njc1LCAjVmFsb3IgZGUgY29udHJhc3RhY2nDs24sIGFxdcOtIHNlIHV0aWxpesOzIGVsIHZhbG9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwKICAgICAgIHBhaXJlZCA9IEZBTFNFLCAjZW4gY2FzbyBkZSBxdWUgbGEgbXVlc3RyYSBzZWEgInBhcmVhZGEiCiAgICAgICB2YXIuZXF1YWwgPSBGQUxTRSwgI3N1cHVlc3RvIGRlIHZhcmlhbnphIGhvbW9nw6luZWEgc2kgbGEgbXVlc3RyYSBlcyBwYXJlZGEuCiAgICAgICBjb25mLmxldmVsID0gMC45NSkgI05pdmVsIGRlIGNvbmZpYW56YSA9IDEgLSBOaXZlbCBkZSBzaWduaWZpY2FuY2lhLgpgYGAKCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGNhbGN1bGFkbyBmcmVudGUgYWwgKipOaXZlbCBkZQogICAgc2lnbmlmaWNhbmNpYSAoJFxhbHBoYSQpKiouIEFsIGNvbXBhcmFyIGVsIHZhbG9yIGRlbCAqKnAtdmFsb3IqKgogICAgYXNvY2lhZG8gYSBsYSBIMCAocXVlIGVzIGRlIDAuMzUzOSkgY29uIHJlc3BlY3RvIGFsICoqTml2ZWwgZGUKICAgIHNpZ25pZmljYW5jaWEgKCRcYWxwaGEkKSoqIChxdWUgZXMgZGUgMC4wNSkuIENvbiBlc3RvIHNlIHB1ZWRlCiAgICBlc3RhYmxlY2VyIHF1ZSBlbCAqKnAtdmFsdWUqKiBlcyAqbWF5b3IgcXVlKiBlbCAqKk5pdmVsIGRlCiAgICBzaWduaWZpY2FuY2lhKiouCgo2LiAgRGVjaXNpw7NuIHNvYnJlIGxhIGhpcMOzdGVzaXMgbnVsYS4KCmBgYHs9aHRtbH0KPCEtLSAtLT4KYGBgCmkuICBFbCBwLXZhbHVlIGFzb2NpYWRvIGFsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIGVkYWQgZW4gbGEgbXVlc3RyYQogICAgKDAuMzUzOSkgZXMgbWF5b3IgYWwgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBlc3RhYmxlY2lkbyAoXCRcYWxwaGEgPQogICAgMC4wNSksIHBvciBsbyBxdWUgbGEgcHJvYmFiaWxpZGFkIGRlIG9ic2VydmFyIGEgbGEgaGlww7N0ZXNpcyBudWxhIGVuCiAgICBsYSBwb2JsYWNpw7NuIGVzIG1heW9yIGFsIGNyaXRlcmlvIGRlIGRlY2lzacOzbi4KaWkuIEEgcGFydGlyIGRlIGVzdGUgY3JpdGVyaW8gKipubyBzZSByZWNoYXphKiogbGEgSDAgY29uIGxvcyBkYXRvcwogICAgb2JzZXJ2YWRvcywgcG9yIGxvIHF1ZSBzZSBjb25zaWRlcmEgcXVlIEgwIGVzIGxhIG1lam9yIGV4cGxpY2FjacOzbi4KICAgIE8gZGljaG8gZGUgb3RyYSBtYW5lcmEsICpzZSBwdWVkZSBlc3RhYmxlY2VyIHF1ZSBsYSBtZWRpYSBkZSBlZGFkIGRlCiAgICBsYSBwb2JsYWNpw7NuIGVzIG1heW9yIG8gaWd1YWwgYSBsYSBtZWRpYSBkZSBlZGFkIGVuIGxhIG11ZXN0cmEsIGNvbgogICAgdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSUuKgoKIyMgNC4gUHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSB1bmEgcHJvcG9jacOzbgoKTGEgZXN0aW1hY2nDs24gZGUgdW4gcGFyw6FtZXRybyBwb2JsYWNpb25hbCBjdWFuZG8gc2UgYW5hbGl6YSB1bmEgdmFyaWFibGUKZGlzY3JldGEgeSBiaW5vbWlhbCAoZG9zIHZhbG9yZXMgbyBhdHJpYnV0b3MgcG9zaWJsZXMgc29sYW1lbnRlKSwgc2UKcmVhbGl6YSBtZWRpYW50ZSBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJvcG9yY2nDs24gYSBwYXJ0aXIgZGUgbG9zIGRhdG9zCmRlIGxhIG11ZXN0cmEuCgpFbiBlc3RlIGNhc28sIGVsIHByb2dyYW1hIFIgY3VlbnRhIGNvbiB1bmEgZnVuY2nDs24gZXNwZWPDrWZpY2EgcGFyYQpjYWxjdWxhciBlbCBlc3RhZMOtc3RpY28gY2FsY3VsYWRvIHkgc3UgcC12YWxvciBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvCmRlIGRpc3RyaWJ1Y2nDs24gZGUgcHJvYmFiaWxpZGFkZXMgZGUgQ2hpLWN1YWRyYWRhICgkXGNoaV4yJCkuCgojIyMgNC4xLiBIaXDDs3Rlc2lzIGJpbGF0ZXJhbCAoZG9zIGNvbGFzKSBvICJkZXNpZ3VhbCIsIGRvbmRlICRccGkgXG5lcSBwJAoKTG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW5hIHByb3BvcmNpw7NuIHNlIHBsYW50ZWFuCmRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgoxLiAgSGlww7N0ZXNpcyBudWxhOiAkXHBpID0gcCQ7IEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmE6ICRccGkgXG5lcSBwJAogICAgKGJpZGlyZWNjaW9uYWwpIGRvbmRlIEgwOiAkXHBpID0gMC4zNSQsIEhhOiAkXHBpIFxuZXEgMC4zNSQgcHVlcyBzZQogICAgZW5jb250csOzIHF1ZSBsYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGRlIGxvcyBjYXNvcyBjb24gY29udGFnaW8gZGUKICAgIENPVklELTE5ICh2YWxvciAxIGVuIGxhIGNvZGlmaWNhY2nDs24gZGUgbGEgdmFyaWFibGUpIGVzIGRlIDM1LjUxJS4KCmBgYHtyIHRhYmxhX2ZyZWNfcmVzdWx0YWRvXzF9CnByb3AudGFibGUodGFibGUoZGF0b3NfY292aWQgJCBSRVNVTFRBRE8pKQpgYGAKCjIuICBOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkgPSAwLjA1CgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYSBwYXJhIHVuYSBwcm9wb3JjacOzbjogY2hpLWN1YWRyYWRvICgkXGNoaV4yJCkuCgo0LiAgQ8OhbGN1bG8gZGVsICoqcC12YWxvcioqLCB1dGlsaXphbmRvIGVsIGNvbWFuZG8gYHByb3AudGVzdCgpYDoKCmBgYHtyIHByb3BfdGVzdF9yZXN1bHRhZG9fZGVzaWd1YWx9CnByb3AudGVzdCh4ID0gMTQyNjkwLCAjY2FudGlkYWQgZGUgY2Fzb3MgZXhpdG9zb3MgbyBkb25kZSBvY3VycmnDsyBlbCBldmVudG8gZGUgaW50ZXLDqXMKICAgICAgICAgIG4gPSA0MDE3NTUsICN0YW1hw7FvIGRlIGxhIG11ZXN0cmEKICAgICAgICAgIHAgPSAwLjM1LCAjcHJvcG9yY2nDs24gcXVlIGRlZmluZSBhbCB2YWxvciBvIGhpcMOzdGVzaXMgbnVsYQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgI3RpcG8gZGUgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YQogICAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUsICNuaXZlbCBkZSBjb25maWFuemEKICAgICAgICAgIGNvcnJlY3QgPSBUUlVFKQpgYGAKCkFxdcOtIHNlIG9ic2VydsOzIHF1ZSBlbCB2YWxvciBkZWwgZXN0YWTDrXN0aWNvIGRlIHBydWViYSAoJFxjaGleMiQpCmNhbGN1bGFkbyB1IG9ic2VydmFkbyBlcyBkZSA0Ny4xMTkgdW5pZGFkZXMgZGUgJFxjaGleMiQsIGNvbiAxIGdyYWRvIGRlCmxpYmVydGFkLCBwYXJhIGxvIHF1ZSBzZSBvYnR1dm8gdW4gcC12YWxvciBkZSAwLjAwMDAwMDAwMDAwNjY4IHBhcmEgbGEKaGlww7N0ZXNpcyBudWxhIChwID0gMC4zNSkuCgo1LiAgQ29tcGFyYWNpw7NuIGRlbCAqKnAtdmFsb3IqKiBmcmVudGUgYWwgKipOaXZlbCBkZSBzaWduaWZpY2FuY2lhKiouIEFsCiAgICBjb21wYXJhciBlbCB2YWxvciBkZWwgKipwLXZhbG9yKiogYXNvY2lhZG8gYSBsYSBIMCAocXVlIGVzIGRlCiAgICAwLjAwMDAwMDAwMDAwNjY4KSBjb24gcmVzcGVjdG8gYWwgKipOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkqKgogICAgKHF1ZSBlcyBkZSAwLjA1KS4gQ29uIGVzdG8gc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgKipwLXZhbHVlKiogZXMKICAgICptZW5vciBxdWUqIGVsICoqTml2ZWwgZGUgc2lnbmlmaWNhbmNpYSoqLgoKNi4gIERlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIG51bGEuCgpgYGB7PWh0bWx9CjwhLS0gLS0+CmBgYAppLiAgRWwgcC12YWx1ZSBhc29jaWFkbyBhbCB2YWxvciBkZSBsYSBwcm9wb3JjacOzbiBkZSBjYXNvcyBxdWUgZGllcm9uCiAgICBwb3NpdGl2byBlbiBsYSBwcnVlYmEgQ09WSUQtMTkgZW4gbGEgbXVlc3RyYSAoMC4wMDAwMDAwMDAwMDY2OCkgZXMKICAgIG1lbm9yIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZXN0YWJsZWNpZG8gKCRcYWxwaGEgPSAwLjA1JCksIHBvcgogICAgbG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciBhIGxhIGhpcMOzdGVzaXMgbnVsYSBlbiBsYQogICAgcG9ibGFjacOzbiBlcyBtZW5vciBhbCBjcml0ZXJpbyBkZSBkZWNpc2nDs24uCmlpLiBBIHBhcnRpciBkZSBlc3RlIGNyaXRlcmlvICoqc8OtIHNlIHJlY2hhemEqKiBsYSBIMCBjb24gbG9zIGRhdG9zCiAgICBvYnNlcnZhZG9zLCBwb3IgbG8gcXVlIHNlIGNvbnNpZGVyYSBxdWUgSGEgZXMgbGEgbWVqb3IgZXhwbGljYWNpw7NuLgogICAgTyBkaWNobyBkZSBvdHJhIG1hbmVyYSwgKnNlIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGxhIHByb3BvcmNpw7NuIGRlCiAgICBwZXJzb25hcyBxdWUgZGFyw61hbiBwb3NpdGl2byBhIGxhIHBydWViYSBDT1ZJRC0xOSBlbiBwb2JsYWNpw7NuIGVzCiAgICBkaXN0aW50YSBsYSBwcm9wb3JjacOzbiBkZSBwZXJzb25hcyBxdWUgZGllcm9uIHBvc2l0aXZvIGVuIGxhIHBydWViYQogICAgQ09WSUQtMTkgZW4gbGEgbXVlc3RyYSwgY29uIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLioKCiMjIyA0LjIuIEhpcMOzdGVzaXMgdW5pbGF0ZXJhbCBhIGxhIGl6cXVpZXJkYSAodW5hIGNvbGEpIG8gIm1lbm9yIHF1ZSIsIGRvbmRlICRccGkgPCBwJAoKTG9zIHBhc29zIGRlIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIHBhcmEgdW5hIHByb3BvcmNpw7NuIHNlIHBsYW50ZWFuCmRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgoxLiAgSGlww7N0ZXNpcyBudWxhOiAkXHBpIFxnZXEgcCQ7IEhpcMOzdGVzaXMgYWx0ZXJuYXRpdmE6ICRccGkgPCBwJAogICAgKHVuaWRpcmVjY2lvbmFsIGEgbGEgaXpxdWllcmRhKSwgZG9uZGUgSDA6ICRccGkgXGdlcSAwLjM1JCwgSGE6CiAgICAkXHBpIDwgMC4zNSQgcHVlcyBzZSBlbmNvbnRyw7MgcXVlIGxhIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZGUgbG9zCiAgICBjYXNvcyBjb24gY29udGFnaW8gZGUgQ09WSUQtMTkgKHZhbG9yIDEgZW4gbGEgY29kaWZpY2FjacOzbiBkZSBsYQogICAgdmFyaWFibGUpIGVzIGRlIDM1LjUxJS4KCmBgYHtyIHRhYmxhX2ZyZWNfcmVzdWx0YWRvXzJ9CnByb3AudGFibGUodGFibGUoZGF0b3NfY292aWQgJCBSRVNVTFRBRE8pKQpgYGAKCjIuICBOaXZlbCBkZSBzaWduaWZpY2FuY2lhICgkXGFscGhhJCkgPSAwLjA1CgozLiAgRXN0YWTDrXN0aWNvIGRlIHBydWViYSBwYXJhIHVuYSBwcm9wb3JjacOzbjogQ2hpXF4yICRcY2hpXjIkCgo0LiAgQ8OhbGN1bG8gZGVsICoqcC12YWxvcioqLCB1dGlsaXphbmRvIGVsIGNvbWFuZG8gYHByb3AudGVzdCgpYDoKCmBgYHtyIHByb3BfdGVzdF9yZXN1bHRhZG9fbWVub3J9CnByb3AudGVzdCh4ID0gMTQyNjkwLCAjY2FudGlkYWQgZGUgY2Fzb3MgZXhpdG9zb3MgbyBkb25kZSBvY3VycmnDsyBlbCBldmVudG8gZGUgaW50ZXLDqXMKICAgICAgICAgIG4gPSA0MDE3NTUsICN0YW1hw7FvIGRlIGxhIG11ZXN0cmEKICAgICAgICAgIHAgPSAwLjM1LCAjcHJvcG9yY2nDs24gcXVlIGRlZmluZSBhbCB2YWxvciBvIGhpcMOzdGVzaXMgbnVsYQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIsICN0aXBvIGRlIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEKICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1LCAjbml2ZWwgZGUgY29uZmlhbnphCiAgICAgICAgICBjb3JyZWN0ID0gVFJVRSkKYGBgCgpBcXXDrSBzZSBvYnNlcnbDsyBxdWUgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgKCRcY2hpXjIkKQpjYWxjdWxhZG8gdSBvYnNlcnZhZG8gZXMgZGUgNDcuMTE5IHVuaWRhZGVzIGRlICRcY2hpXjIkLCBjb24gMSBncmFkbyBkZQpsaWJlcnRhZCwgcGFyYSBsbyBxdWUgc2Ugb2J0dXZvIHVuIHAtdmFsb3IgZGUgMSBwYXJhIGxhIGhpcMOzdGVzaXMgbnVsYQooJFxwaSBcZ2VxIDAuMzUkKS4KCjUuICBDb21wYXJhY2nDs24gZGVsICoqcC12YWxvcioqIGZyZW50ZSBhbCAqKk5pdmVsIGRlIHNpZ25pZmljYW5jaWEqKi4gQWwKICAgIGNvbXBhcmFyIGVsIHZhbG9yIGRlbCAqKnAtdmFsb3IqKiBhc29jaWFkbyBhIGxhIEgwIChxdWUgZXMgZGUgMSkgY29uCiAgICByZXNwZWN0byBhbCAqKk5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKGFsZmEpKiogKHF1ZSBlcyBkZSAwLjA1KSwgc2UKICAgIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGVsICoqcC12YWx1ZSoqIGVzICptYXlvciBxdWUqIGVsICoqTml2ZWwgZGUKICAgIHNpZ25pZmljYW5jaWEqKi4KCjYuICBEZWNpc2nDs24gc29icmUgbGEgaGlww7N0ZXNpcyBudWxhLgoKYGBgez1odG1sfQo8IS0tIC0tPgpgYGAKaS4gIEVsIHAtdmFsdWUgYXNvY2lhZG8gYWwgdmFsb3IgZGUgbGEgcHJvcG9yY2nDs24gZGUgY2Fzb3MgcXVlIGRpZXJvbgogICAgcG9zaXRpdm8gZW4gbGEgcHJ1ZWJhIENPVklELTE5IGVuIGxhIG11ZXN0cmEgKDEpIGVzIG1heW9yIGFsIG5pdmVsCiAgICBkZSBzaWduaWZpY2FuY2lhIGVzdGFibGVjaWRvICgkXGFscGhhID0gMC4wNSQpLCBwb3IgbG8gcXVlIGxhCiAgICBwcm9iYWJpbGlkYWQgZGUgb2JzZXJ2YXIgYSBsYSBoaXDDs3Rlc2lzIG51bGEgZW4gbGEgcG9ibGFjacOzbiBlcwogICAgbWF5YXIgYWwgY3JpdGVyaW8gZGUgZGVjaXNpw7NuLgppaS4gQSBwYXJ0aXIgZGUgZXN0ZSBjcml0ZXJpbyAqKm5vIHNlIHJlY2hhemEqKiBsYSBIMCBjb24gbG9zIGRhdG9zCiAgICBvYnNlcnZhZG9zLCBwb3IgbG8gcXVlIHNlIGNvbnNpZGVyYSBxdWUgSDAgZXMgbGEgbWVqb3IgZXhwbGljYWNpw7NuLgogICAgTyBkaWNobyBkZSBvdHJhIG1hbmVyYSwgKnNlIHB1ZWRlIGVzdGFibGVjZXIgcXVlIGxhIHByb3BvcmNpw7NuIGRlCiAgICBwZXJzb25hcyBxdWUgZGFyw61hbiBwb3NpdGl2byBhIGxhIHBydWViYSBDT1ZJRC0xOSBlbiBwb2JsYWNpw7NuIGVzCiAgICBtYXlvciBvIGlndWFsIGEgbGEgcHJvcG9yY2nDs24gZGUgcGVyc29uYXMgcXVlIGRpZXJvbiBwb3NpdGl2byBlbiBsYQogICAgcHJ1ZWJhIENPVklELTE5IGVuIGxhIG11ZXN0cmEsIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JS4qCgojIyA1LiBFamVyY2ljaW9zCgoxLiAgQ29uc3RydWlyIHVuYSBoaXDDs3Rlc2lzIG51bGEgYmlkaXJlY2Npb25hbCB5IHVuYSB1bmlkaXJlY2Npb25hbCBjb24KICAgIFggeSBZCjIuICBDYWxjdWxhciBlbCBlcnJvciBlc3TDoW5kYXIgcGFyYSB1bmEgbWVkaWEgZGUgbGEgdmFyaWFibGUgZWRhZCBwYXJhCiAgICB1bmEgc3VibXVlc3RyYSBkZSAxMCwwMDAgY2Fzb3MsIGdlbmVyYWRhIGEgcGFydGlyIGRlbCB1bml2ZXJzbyBkZQogICAgY2Fzb3MgY29udGVuaWRvcyBlbiBsYSB2YXJpYWJsZSBFREFEIGRlIGxhIGJhc2UgZGUgZGF0b3MgQ09WSUQtMTkuCiAgICBVc2FyIGVsIHZhbG9yIHNlZWQgPSA0MzIxLgozLiAgUmVhbGl6YXIgdW5hIHBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgdW5hIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEVEQUQKICAgIGEgcGFydGlyIGRlIGxhIHN1Ym11ZXN0cmEgcHJldmlhbWVudGUgZ2VuZXJhZGEgeSByZXBvcnRhcjogaS4gbGEKICAgIEhPLCBpaS4gc2kgZWwgdmFsb3IgZGVsIGVzdGFkw61zdGljbyBjYWxjdWxhZG8gZXMgbWF5b3IgbyBtZW5vciBxdWUKICAgIGVsIHZhbG9yIGNyw610aWNvLCBpaWkuIGVsIHAtdmFsb3IgY29ycmVzcG9uZGllbnRlLCB5IGl2LiBzaSBzZQogICAgcmVjaGF6YSBvIG5vIHNlIHJlY2hhemEgSDAuCjQuICBSZWFsaXphciB1bmEgcHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSB1bmEgcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFibGUKICAgIFJFU1VMVEFETyBhIHBhcnRpciBkZSBsYSBzdWJtdWVzdHJhIHkgcmVwb3J0YXI6IGkuIGxhIEhPLCBpaS4gc2kgZWwKICAgIHZhbG9yIGRlbCBlc3RhZMOtc3RpY28gY2FsY3VsYWRvIGVzIG1heW9yIG8gbWVub3IgcXVlIGVsIHZhbG9yCiAgICBjcsOtdGljbywgaWlpLiBlbCBwLXZhbG9yIGNvcnJlc3BvbmRpZW50ZSwgeSBpdi4gc2kgc2UgcmVjaGF6YSBvIG5vCiAgICBzZSByZWNoYXphIEgwLgoKIyMgUmVmZXJlbmNpYXMK