0.1 Objetivos

Este sitio web tiene como objetivo presentar los fundamentos de la estadística inferencial y su aplicación en el análisis de datos.


1 ¿Qué es la estadística inferencial?

La estadística inferencial es una rama de la estadística que permite extraer conclusiones sobre una población a partir del análisis de una muestra. Su relevancia radica en que, en la mayoría de situaciones reales, resulta inviable estudiar la totalidad de los individuos de una población, por lo que se emplean métodos probabilísticos y herramientas matemáticas para realizar estimaciones y tomar decisiones fundamentadas (Triola, 2018).

Entre las herramientas utilizadas en estadística inferencial destacan los contrastes de hipótesis.

2 ¿Qué son los contrastes de hipótesis?

Un contraste de hipótesis es un procedimiento estadístico que permite decidir, a partir de una muestra de datos, si la evidencia observada es compatible o no con la hipótesis nula planteada (Triola, 2018).

Este método constituye una de las bases fundamentales de la inferencia estadística y se utiliza ampliamente en todo tipo de disciplinas científicas, médicas, industriales y sociales (Triola, 2018).

Entre sus objetivos principales están:

  • Evaluar afirmaciones sobre parámetros poblacionales.
  • Determinar si las diferencias observadas pueden atribuirse al azar.
  • Facilitar la toma de decisiones en situaciones de incertidumbre estadística.


3 Proceso para realizar un contraste de hipótesis

El contraste de hipótesis se desarrolla en una serie de etapas estructuradas que permiten evaluar, a partir de datos muestrales, la validez de una afirmación sobre una población.

El procedimiento puede resumirse en las siguientes etapas:

3.0.1 1. Formular las hipótesis

Se parte de la formulación de una hipótesis estadística que permita contrastar la existencia de un efecto o diferencia significativa en el sistema analizado. Se distingue entre hipótesis nula \(H_0\) e hipótesis alternativa \(H_1\) (Triola, 2018).

La hipótesis nula \(H_0\) se define como la afirmación de referencia que se asume válida inicialmente y que se somete a contraste con los datos para evaluar su compatibilidad con la evidencia muestral.

La hipótesis alternativa \(H_1\) representa la afirmación contraria a la hipótesis nula y recoge los valores del parámetro que no son compatibles con la hipótesis nula.

En función del tipo de contraste, la hipótesis alternativa puede formularse como una afirmación bilateral, cuando se plantea simplemente la existencia de una diferencia respecto al valor de referencia, o como una afirmación unilateral, cuando se especifica la dirección de dicha desviación (mayor o menor que el valor hipotetizado).

Esta elección no es arbitraria, sino que depende directamente del objetivo del estudio y de la formulación del problema, ya que determina la región de rechazo y, por tanto, la sensibilidad del contraste frente a distintos tipos de desviaciones respecto a la hipótesis nula.


3.0.2 2. Seleccionar el nivel de significación \(\alpha\) y consecuentemente, el nivel de confianza asociado.

El nivel de significación \(\alpha\) corresponde a la probabilidad máxima que se acepta de cometer un error al rechazar la hipótesis nula cuando esta es verdadera.

Los valores más habituales utilizados son:

  • \(\alpha = 0.05\)
  • \(\alpha = 0.01\)

Error tipo I

Ocurre cuando se rechaza la hipótesis nula \(H_0\) siendo esta verdadera. Es decir, se concluye que existe una diferencia o efecto cuando en realidad no lo hay.

Este error está directamente controlado por el nivel de significación \(\alpha\).

Error tipo II

Ocurre cuando no se rechaza la hipótesis nula \(H_0\) siendo esta falsa. Es decir, no se detecta una diferencia o efecto que realmente existe.

En este caso, se está pasando por alto un efecto real.

El nivel de confianza es la probabilidad complementaria al nivel de significación y expresa el grado de fiabilidad asociado a un procedimiento de inferencia estadística. Se denota como:

\[ \text{Nivel de confianza} = 1 - \alpha \]

Por ejemplo:

  • Si \(\alpha = 0{,}05\), el nivel de confianza es 0,95 (95%).
  • Si \(\alpha = 0{,}01\), el nivel de confianza es 0,99 (99%).

El nivel de confianza debe fijarse antes de realizar el análisis de los datos, ya que forma parte del diseño del contraste de hipótesis. No se ajusta en función de los resultados observados, sino que se establece a priori para controlar la probabilidad de cometer un error de tipo I y definir el criterio de decisión del test.

Un nivel de confianza del 95% indica que si se repitiese el muestreo infinitas veces, aproximadamente el 95% de los intervalos construidos contendrían el verdadero parámetro poblacional.


3.0.3 3. Recoger la muestra de datos y seleccionar el tamaño muestral

El tamaño muestral es un factor determinante en la validez y fiabilidad de un contraste de hipótesis, ya que condiciona tanto la precisión de las estimaciones como las propiedades del test estadístico.

En términos generales, un mayor tamaño muestral:

  • Reduce la variabilidad de los estimadores, aumentando su precisión.
  • Incrementa la potencia estadística del contraste, es decir, la capacidad para detectar efectos reales.
  • Mejora la robustez del procedimiento frente a fluctuaciones aleatorias en los datos.

3.0.4 4. Elegir el estadístico de contraste adecuado y calcularlo

Una vez formuladas las hipótesis, se debe elegir el estadístico de prueba más adecuado según el tipo de variable, los supuestos que se cumplan y el objetivo del estudio.

Los principales métodos utilizados en contrastes de hipótesis son:

Test Z

Se utiliza cuando se quiere contrastar una media y se conoce la desviación estándar poblacional (σ).

Este caso es habitual en entornos industriales donde el proceso está bien caracterizado y la variabilidad poblacional puede considerarse conocida y estable.

Es especialmente apropiado cuando la población es normal o cuando el tamaño muestral es suficientemente grande, de forma que la distribución de la media muestral puede aproximarse a una normal en virtud del Teorema Central del Límite.

En la práctica, se utiliza con frecuencia la regla orientativa \(n \geq 30\), aunque no constituye un criterio estricto.

El estadístico de contraste se define como

\[ Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}} \]

Donde:

  • \(\bar{x}\): media muestral de la temperatura del reactor
  • \(\mu_0\): valor de referencia proporcionado por el fabricante
  • \(\sigma\): desviación estándar poblacional conocida
  • \(n\): tamaño de la muestra

Bajo la hipótesis nula \(H_0\), este estadístico sigue una distribución normal estándar \(\mathcal{N}(0,1)\).


Test t de Student

El test t de Student es el enfoque más habitual cuando la desviación estándar poblacional es desconocida.

En este caso, la variabilidad del proceso se estima a partir de la muestra mediante la desviación estándar muestral (s).

Es adecuado especialmente cuando:

  • El tamaño muestral es pequeño o moderado (\(n < 30\)).
  • No se conoce \(\sigma\).
  • El proceso se encuentra en régimen estacionario y puede asumirse aproximadamente normalidad.

Se define como

\[ t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}} \]

donde:

  • \(s\): desviación estándar muestral
  • El resto de variables se definen como en el caso anterior

Bajo la hipótesis nula \(H_0\), este estadístico sigue una distribución t de Student con \(n - 1\) grados de libertad.


Test Z para dos proporciones

El test Z para dos proporciones se utiliza para comparar si dos proporciones poblacionales pueden considerarse iguales o si existen diferencias estadísticamente significativas entre ellas.

Es especialmente útil cuando se desea comparar la frecuencia de aparición de una característica en dos poblaciones independientes.

Es adecuado cuando:

  • Se comparan dos muestras independientes.
  • La variable analizada es dicotómica (presencia/ausencia, éxito/fracaso, detección/no detección).
  • Los tamaños muestrales son suficientemente grandes para aproximar la distribución a una normal.

El estadístico de contraste se define como:

\[ Z = \frac{\hat{p}_1 - \hat{p}_2} {\sqrt{\hat{p}(1-\hat{p}) \left( \frac{1}{n_1} + \frac{1}{n_2} \right)}} \]

donde:

  • \(\hat{p}_1\): proporción muestral del primer grupo.
  • \(\hat{p}_2\): proporción muestral del segundo grupo.
  • \(n_1\): tamaño de la primera muestra.
  • \(n_2\): tamaño de la segunda muestra.
  • \(\hat{p}\): proporción combinada bajo la hipótesis nula.

La proporción combinada se calcula como:

\[ \hat{p} = \frac{x_1+x_2} {n_1+n_2} \]

donde \(x_1\) y \(x_2\) representan el número de observaciones con la característica estudiada en cada muestra.

Bajo la hipótesis nula \(H_0\), el estadístico sigue aproximadamente una distribución normal estándar:

\[ Z \sim \mathcal{N}(0,1) \]

Este contraste se utiliza con frecuencia en estudios de calidad industrial, epidemiología, ciencias ambientales y análisis comparativos de materiales, donde el objetivo es determinar si dos poblaciones presentan proporciones significativamente diferentes.


Test Chi-cuadrado (χ²)

El test Chi-cuadrado se utiliza con variables categóricas (por ejemplo, tipos, clases o categorías) y permite comparar lo que se observa en los datos con lo que se esperaría bajo una hipótesis teórica.

Su objetivo es determinar si las diferencias entre frecuencias observadas y esperadas son suficientemente grandes como para indicar que existe una relación entre variables o un desajuste respecto a un modelo teórico.

Se aplica principalmente en estos contextos: análisis de independencia entre variables categóricas, comprobación de la bondad de ajuste de una distribución y comparación de proporciones entre grupos.

\[ \chi^2 = \sum \frac{(O_i - E_i)^2}{E_i} \]

donde

  • \(O_i\): frecuencia observada en la categoría \(i\) (datos reales).
  • \(E_i\): frecuencia esperada bajo la hipótesis nula.
  • \(O_i - E_i\): diferencia entre lo observado y lo esperado.
  • \((O_i - E_i)^2\): se eleva al cuadrado para evitar signos negativos y amplificar desviaciones grandes.
  • \(\frac{(O_i - E_i)^2}{E_i}\): normaliza la desviación respecto al tamaño esperado.
  • \(\sum\): suma de todas las categorías.

Bootstrapping

Es un método computacional muy flexible. No requiere asumir normalidad ni conocer la distribución poblacional. Consiste en generar miles de muestras artificiales (con reemplazo) a partir de los datos originales para estimar la distribución del estadístico.

Es especialmente útil cuando:

  • El tamaño de la muestra es pequeño
  • Los datos no siguen una distribución normal
  • Los supuestos de los tests clásicos no se cumplen

3.0.5 Resumen comparativo

Estadístico Tipo de variable Supuestos principales Tamaño muestral recomendado Coste computacional Uso más frecuente
Test Z Numérica (media) Normalidad + σ conocida Grande (n ≥ 30) Muy bajo Procesos industriales
Test t Numérica (media) Normalidad aproximada Pequeño o mediano Bajo Experimentos científicos
Chi-cuadrado Categórica Frecuencias esperadas ≥ 5 Grande Bajo Encuestas
Bootstrapping Cualquier tipo Muy pocos supuestos Cualquier tamaño Alto Datos no normales o muestras pequeñas
Z (dos proporciones) Proporciones Muestras independientes y tamaño grande Grande Muy bajo Comparación de proporciones

3.0.6 5. Determinación del valor-p o región crítica asociada al contraste

Una vez seleccionado el estadístico de contraste adecuado, se calcula su valor a partir de los datos muestrales.

A partir de este valor observado y de la distribución del estadístico bajo la hipótesis nula \(H_0\), se obtiene el p-valor, utilizando tablas estadísticas o software especializado.

3.0.7 ¿Qué es el p-valor?

El p-valor es la probabilidad de obtener un resultado igual o más extremo que el observado, suponiendo que la hipótesis nula \(H_0\) es verdadera.

En otras palabras, mide la compatibilidad entre los datos observados y la hipótesis nula.

3.0.8 Interpretación del p-valor

  • p-valor pequeño (\(p \leq \alpha\), por ejemplo \(\alpha = 0{,}05\)):
    Los datos observados serían poco probables bajo \(H_0\). Se rechaza \(H_0\) y se considera que existe evidencia estadísticamente significativa a favor de \(H_1\).

  • p-valor grande (\(p > \alpha\)):
    Los datos son compatibles con \(H_0\). No se rechaza \(H_0\), ya que no existe evidencia suficiente en su contra.

3.0.9 Nota

El p-valor no es la probabilidad de que \(H_0\) sea verdadera.
Solo indica cuán consistentes son los datos con la hipótesis nula.

3.0.10 Regla de decisión

La decisión en un contraste de hipótesis se basa en la comparación entre el p-valor y el nivel de significación \(\alpha\):

  • Si \(p \leq \alpha\): se rechaza \(H_0\).
  • Si \(p > \alpha\): no se rechaza \(H_0\).

En un contraste bilateral, el p-valor considera ambas colas de la distribución, mientras que en un contraste unilateral se considera una sola cola.


3.0.11 Representación gráfica de contrastes de hipótesis

A continuación, se muestran dos figuras que ilustran el comportamiento de los contrastes de hipótesis en sus versiones bilateral y unilateral.

Figura 1: Contraste bilateral

En un contraste bilateral, la región crítica se distribuye en ambas colas de la distribución, de modo que la probabilidad de error \(\alpha\) se reparte entre los dos extremos. Este enfoque se utiliza cuando la hipótesis alternativa plantea diferencias en cualquier dirección.

Aquí:

  • α (nivel de significación) representa la probabilidad total de cometer un error de tipo I (rechazar H₀ siendo verdadera).
  • Este riesgo se reparte en dos colas: α/2 en cada extremo de la distribución.
  • Las zonas rojas son las regiones críticas donde se rechaza H₀.
  • La zona verde representa el intervalo de no rechazo, donde no hay evidencia suficiente contra H₀.
  • Las líneas discontinuas son los valores críticos que separan ambas regiones.

Regla visual:

  • Si el estadístico cae en rojo → p ≤ α → se rechaza \(H_0\)
  • Si cae en verde → p > α → no se rechaza \(H_0\)

Figura 2: Contraste unilateral

En un contraste unilateral, la región crítica se sitúa únicamente en una de las colas de la distribución, de modo que toda la probabilidad de error α se concentra en un solo lado en función de la hipótesis alternativa.

Aquí:

  • Todo el nivel de significación α se concentra en una sola cola de la distribución.
  • La zona roja representa la región crítica, donde se rechaza H₀.
  • La zona verde es la región de no rechazo (1 − α).
  • El valor crítico marca el punto a partir del cual el estadístico es suficientemente extremo.

Regla visual:

  • Si el estadístico cae en rojo → p ≤ α → rechazo de \(H_0\)
  • Si el estadístico cae en verde → p > α → no rechazo de \(H_0\)

3.0.12 6. Conclusión. Toma la decisión estadística

Tras el análisis, se toma la decisión estadística (rechazar o no rechazar \(H_0\)),

  • Si se rechaza \(H_0\): se concluye que existe evidencia suficiente para afirmar que el efecto, diferencia o relación planteada en \(H_1\) es compatible con los datos observados.

  • Si no se rechaza \(H_0\): no se dispone de evidencia suficiente para afirmar que exista el efecto o diferencia planteada en \(H_1\), aunque esto no implica que \(H_0\) sea necesariamente verdadera.


3.0.13 7. Interpretación del resultado en el contexto del problema

Una vez tomada la decisión estadística (rechazar o no rechazar \(H_0\)), el resultado debe interpretarse en términos del problema original.

En este paso se traduce la conclusión estadística a una conclusión contextual, explicando qué implica la decisión sobre la hipótesis en el ámbito real del estudio.

Es importante destacar que esta interpretación no afirma que \(H_0\) sea verdadera o falsa, sino que la evidencia disponible no es suficiente para rechazarla bajo el riesgo de error establecido.


A continuación, se presentan dos escenarios prácticos con el objetivo de ejemplificar la aplicación de los contrastes de hipótesis en contextos reales


4 🔬 Escenario 1: Control de temperatura en un reactor industrial

4.1 1. Planteamiento del problema

Se analiza el comportamiento térmico de un reactor industrial con el objetivo de determinar si la temperatura media de operación supera el valor de referencia especificado por el fabricante.

El problema se plantea como un contraste de hipótesis, ya que temperaturas elevadas de forma sostenida pueden indicar fallos en el sistema o un funcionamiento anómalo.


4.2 2. Población y variable de estudio

La población está formada por todas las* posibles mediciones de temperatura del reactor en condiciones normales de operación.

La variable de estudio es la temperatura interna del reactor, medida en grados Celsius (°C). Se trata de una variable cuantitativa continua, ya que puede tomar cualquier valor dentro de un intervalo.


4.3 3. Recogida de datos

Se obtiene una muestra aleatoria de mediciones de temperatura del reactor registradas en distintos instantes de tiempo durante condiciones de funcionamiento estable.

Las observaciones se consideran independientes y pueden recogerse mediante muestreo aleatorio simple, asegurando que la muestra sea representativa del comportamiento del sistema.

El tamaño muestral \(n\) debe ser suficientemente grande para garantizar estabilidad en las estimaciones.

La base de datos incluye, al menos, la temperatura registrada en cada medición, pudiendo incorporarse también el instante de registro para fines de trazabilidad y análisis temporal.


4.4 4. Formulación de hipótesis

Se plantea un contraste de hipótesis sobre la media poblacional \(\mu\), con el objetivo de evaluar si la temperatura media del reactor supera el valor de referencia establecido por el fabricante \(\mu_0\).

\[ H_0: \mu \leq \mu_0 \]

\[ H_1: \mu > \mu_0 \]

Se trata de un contraste unilateral de cola derecha, diseñado para detectar incrementos en la media respecto al valor de referencia.


4.5 5. Nivel de significación

Se fija el nivel de significación del contraste en:

\[ \alpha = 0.05, \quad 1 - \alpha = 0.95 \]

Este parámetro determina el umbral de decisión del contraste y controla la probabilidad de cometer un error de tipo I, es decir, rechazar la hipótesis nula siendo esta verdadera.


4.6 6. Métodos de contraste posibles

4.6.1 Método principal: t de Student (σ desconocida)

\[ t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}} \]


4.6.2 Alternativas metodológicas

En función de las características de los datos y de los supuestos disponibles, podrían emplearse otros métodos de contraste:

Método Ventajas Limitaciones Uso típico
Test Z Simple Requiere σ conocida Procesos muy controlados
Bootstrapping Sin supuestos fuertes Coste computacional alto Datos no normales

4.7 7. Regla de decisión

La decisión del contraste se toma comparando el p-valor con el nivel de significación \(\alpha = 0.05\):

  • Si \(p < 0.05\), se rechaza \(H_0\).
  • Si \(p \geq 0.05\), no se rechaza \(H_0\).

En el contexto del reactor industrial, esta regla permite determinar si la temperatura media observada es incompatible con el valor de referencia establecido por el fabricante.


4.8 8. Interpretación del resultado

  • Rechazo de \(H_0\): se concluye que existe evidencia estadística de que la temperatura media del reactor supera el valor de referencia, lo que puede indicar sobrecalentamiento o una desviación relevante en las condiciones de operación del sistema.

  • No rechazo de \(H_0\): no se dispone de evidencia suficiente para afirmar que la temperatura media supere el valor de referencia, por lo que el comportamiento térmico del reactor se considera compatible con la variabilidad normal del proceso.



5 ☢️ Escenario 2: Comparación de proporciones de uranio en muestras radiactivas

5.1 1. Planteamiento del problema

Se analiza si dos muestras de material radiactivo pueden proceder de la misma fuente de origen a partir de la comparación de la proporción de uranio presente en cada una.

El objetivo es determinar si las diferencias observadas son atribuibles a variabilidad aleatoria o a diferencias estructurales entre poblaciones.


5.2 2. Poblaciones y variable de estudio

Se eligen las siguientes poblaciones, ya que representan posibles fuentes distintas de material radiactivo.

Población 1: muestras de material radiactivo de origen desconocido A

Población 2: muestras de material radiactivo de origen desconocido B

Variable de estudio: proporción de uranio en cada muestra

Tipo: variable categórica/binomial

Interpretación: porcentaje de uranio respecto al total de la muestra


5.3 3. Recogida de datos

Se obtienen dos muestras independientes procedentes de cada una de las poblaciones.

En cada una de ellas se registran:

  • tamaños muestrales \(n_1\) y \(n_2\)
  • número de detecciones de uranio en cada muestra
  • cálculo de las proporciones muestrales \(\hat{p}_1\) y \(\hat{p}_2\)

Estas proporciones se obtienen a partir de la frecuencia de detección de uranio respecto al total de observaciones en cada muestra.

Condiciones del muestreo:

  • independencia entre muestras
  • control del sesgo instrumental
  • condiciones homogéneas de medición para asegurar comparabilidad

5.4 4. Formulación de hipótesis

Se plantea un contraste bilateral para determinar si existen diferencias en la proporción de uranio entre ambas poblaciones.

\[ H_0: p_1 = p_2 \]

\[ H_1: p_1 \neq p_2 \]

Bajo la hipótesis nula \(H_0\), se asume que ambas poblaciones presentan la misma proporción de uranio, mientras que la hipótesis alternativa (H_01) plantea la existencia de diferencias significativas entre ellas.


5.5 5. Nivel de significación

Se fija el nivel de significación en:

\[ \alpha = 0.05 \]

5.6 6. Métodos de contraste posibles

5.6.1 Método principal: contraste Z para dos proporciones de uranio

Se utiliza el estadístico Z (dos proporciones)para comparar la proporción de uranio entre ambas poblaciones.

\[ Z = \frac{\hat{p}_1 - \hat{p}_2} {\sqrt{\hat{p}(1 - \hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]

Este contraste permite evaluar si las diferencias observadas en el contenido de uranio entre las dos muestras son estadísticamente significativas.


5.6.2 Alternativa metodológica

Método Ventajas Limitaciones
Chi-cuadrado Enfoque alternativo al Z en tablas de contingencia Menos directo para interpretación de proporciones Verificación de diferencias globales

A diferencia del contraste de proporciones (Z), que compara directamente las proporciones estimadas en cada muestra, el chi-cuadrado mide si las diferencias en el uranio entre las dos muestras son demasiado grandes como para explicarse solo por casualidad, evaluando la discrepancia entre las frecuencias observadas y las que se esperarían si ambas poblaciones fueran iguales.


5.7 7. Regla de decisión

La decisión se basa en comparar el p-valor obtenido en el contraste sobre la proporción de uranio entre ambas muestras con el nivel de significación \(\alpha = 0.05\).

  • Si \(p < 0.05\) se rechaza \(H_0\), concluyendo que existen diferencias significativas en la proporción de uranio entre las muestras A y B (posible origen distinto).
  • Si \(p \geq 0.05\) no se rechaza \(H_0\), concluyendo que las diferencias observadas en el contenido de uranio son compatibles con la variabilidad aleatoria y no hay evidencia de orígenes distintos.

5.8 8. Interpretación del resultado

A partir del resultado del contraste sobre la proporción de uranio entre las muestras, la interpretación se conecta directamente con el objetivo del estudio: determinar si ambas muestras pueden proceder del mismo origen.

  • Rechazo de \(H_0\): se concluye que existen diferencias significativas en la proporción de uranio entre las muestras. Esto indica que la composición química no es compatible bajo un mismo patrón de generación, por lo que es razonable considerar que las muestras podrían proceder de fuentes de origen distintas.

  • No rechazo de \(H_0\): no se encuentran diferencias estadísticamente significativas en la proporción de uranio. En este caso, las variaciones observadas se interpretan como resultado de la variabilidad aleatoria del muestreo, por lo que los datos son compatibles con la hipótesis de un mismo origen para ambas muestras.


5.9 Referencias

  • Triola, M. F. (2018). Estadística (12ª ed.). Pearson Educación.
  • Elaboración propia con apoyo de inteligencia artificial (ChatGPT).
LS0tDQp0aXRsZTogJ0VzdGFkw61zdGljYSBpbmZlcmVuY2lhbDogZGVsIGFuw6FsaXNpcyBtdWVzdHJhbCBhIGxhIHByZWRpY2Npw7NuIHBvYmxhY2lvbmFsJw0KYXV0aG9yOiAiSXJpcyBZYWfDvGUgSW5nbGFkYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgcm1hcmtkb3duOjpodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGhpZ2hsaWdodDoga2F0ZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgZGlzdGlsbDo6ZGlzdGlsbF9hcnRpY2xlOiBkZWZhdWx0DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBUUlVFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsDQogIGZpZy53aWR0aCA9IDEwLA0KICBmaWcuaGVpZ2h0ID0gNg0KKQ0KYGBgDQojIyBPYmpldGl2b3MgDQoNCkVzdGUgc2l0aW8gd2ViIHRpZW5lIGNvbW8gb2JqZXRpdm8gcHJlc2VudGFyIGxvcyAqKmZ1bmRhbWVudG9zIGRlIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCoqIHkgc3UgYXBsaWNhY2nDs24gZW4gZWwgYW7DoWxpc2lzIGRlIGRhdG9zLg0KDQotLS0NCg0KIyDCv1F1w6kgZXMgbGEgZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsPyANCg0KTGEgKiplc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwqKiBlcyB1bmEgcmFtYSBkZSBsYSAqKmVzdGFkw61zdGljYSoqIHF1ZSBwZXJtaXRlIGV4dHJhZXIgY29uY2x1c2lvbmVzIHNvYnJlIHVuYSBwb2JsYWNpw7NuIGEgcGFydGlyIGRlbCBhbsOhbGlzaXMgZGUgdW5hIG11ZXN0cmEuIFN1IHJlbGV2YW5jaWEgcmFkaWNhIGVuIHF1ZSwgZW4gbGEgbWF5b3LDrWEgZGUgc2l0dWFjaW9uZXMgcmVhbGVzLCByZXN1bHRhIGludmlhYmxlIGVzdHVkaWFyIGxhIHRvdGFsaWRhZCBkZSBsb3MgaW5kaXZpZHVvcyBkZSB1bmEgcG9ibGFjacOzbiwgcG9yIGxvIHF1ZSBzZSBlbXBsZWFuIG3DqXRvZG9zIHByb2JhYmlsw61zdGljb3MgeSBoZXJyYW1pZW50YXMgbWF0ZW3DoXRpY2FzIHBhcmEgcmVhbGl6YXIgZXN0aW1hY2lvbmVzIHkgdG9tYXIgZGVjaXNpb25lcyBmdW5kYW1lbnRhZGFzIChUcmlvbGEsIDIwMTgpLg0KDQpFbnRyZSBsYXMgaGVycmFtaWVudGFzIHV0aWxpemFkYXMgZW4gZXN0YWTDrXN0aWNhIGluZmVyZW5jaWFsIGRlc3RhY2FuIGxvcyAqKmNvbnRyYXN0ZXMgZGUgaGlww7N0ZXNpcyoqLg0KPGJyPg0KDQojIMK/UXXDqSBzb24gbG9zIGNvbnRyYXN0ZXMgZGUgaGlww7N0ZXNpcz8NCg0KKipVbiBjb250cmFzdGUgZGUgaGlww7N0ZXNpcyoqIGVzIHVuIHByb2NlZGltaWVudG8gZXN0YWTDrXN0aWNvIHF1ZSBwZXJtaXRlIGRlY2lkaXIsIGEgcGFydGlyIGRlIHVuYSBtdWVzdHJhIGRlIGRhdG9zLCBzaSBsYSBldmlkZW5jaWEgb2JzZXJ2YWRhIGVzIGNvbXBhdGlibGUgbyBubyBjb24gbGEgaGlww7N0ZXNpcyBudWxhIHBsYW50ZWFkYSAoVHJpb2xhLCAyMDE4KS4NCg0KRXN0ZSBtw6l0b2RvIGNvbnN0aXR1eWUgdW5hIGRlIGxhcyBiYXNlcyBmdW5kYW1lbnRhbGVzIGRlIGxhIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhIHkgc2UgdXRpbGl6YSBhbXBsaWFtZW50ZSBlbiB0b2RvIHRpcG8gZGUgZGlzY2lwbGluYXMgY2llbnTDrWZpY2FzLCBtw6lkaWNhcywgaW5kdXN0cmlhbGVzIHkgc29jaWFsZXMgKFRyaW9sYSwgMjAxOCkuDQoNCioqRW50cmUgc3VzIG9iamV0aXZvcyBwcmluY2lwYWxlcyBlc3TDoW46KioNCg0KLSBFdmFsdWFyIGFmaXJtYWNpb25lcyBzb2JyZSBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLg0KLSBEZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBvYnNlcnZhZGFzIHB1ZWRlbiBhdHJpYnVpcnNlIGFsIGF6YXIuDQotIEZhY2lsaXRhciBsYSB0b21hIGRlIGRlY2lzaW9uZXMgZW4gc2l0dWFjaW9uZXMgZGUgaW5jZXJ0aWR1bWJyZSBlc3RhZMOtc3RpY2EuDQoNCjxicj4NCg0KIyBQcm9jZXNvIHBhcmEgcmVhbGl6YXIgdW4gY29udHJhc3RlIGRlIGhpcMOzdGVzaXMNCg0KKipFbCBjb250cmFzdGUgZGUgaGlww7N0ZXNpcyoqIHNlIGRlc2Fycm9sbGEgZW4gdW5hIHNlcmllIGRlIGV0YXBhcyBlc3RydWN0dXJhZGFzIHF1ZSBwZXJtaXRlbiBldmFsdWFyLCBhIHBhcnRpciBkZSBkYXRvcyBtdWVzdHJhbGVzLCBsYSB2YWxpZGV6IGRlIHVuYSBhZmlybWFjacOzbiBzb2JyZSB1bmEgcG9ibGFjacOzbi4gDQoNCg0KRWwgcHJvY2VkaW1pZW50byBwdWVkZSByZXN1bWlyc2UgZW4gbGFzIHNpZ3VpZW50ZXMgZXRhcGFzOg0KDQoNCiMjIyAxLiBGb3JtdWxhciBsYXMgaGlww7N0ZXNpcw0KDQpTZSBwYXJ0ZSBkZSBsYSBmb3JtdWxhY2nDs24gZGUgdW5hICoqaGlww7N0ZXNpcyBlc3RhZMOtc3RpY2EqKiBxdWUgcGVybWl0YSBjb250cmFzdGFyIGxhIGV4aXN0ZW5jaWEgZGUgdW4gZWZlY3RvIG8gZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGVsIHNpc3RlbWEgYW5hbGl6YWRvLiBTZSBkaXN0aW5ndWUgZW50cmUgKipoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSBlIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgXChIXzFcKSoqIChUcmlvbGEsIDIwMTgpLg0KDQoNCioqTGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCkqKiBzZSBkZWZpbmUgY29tbyBsYSBhZmlybWFjacOzbiBkZSByZWZlcmVuY2lhIHF1ZSBzZSBhc3VtZSB2w6FsaWRhIGluaWNpYWxtZW50ZSB5IHF1ZSBzZSBzb21ldGUgYSBjb250cmFzdGUgY29uIGxvcyBkYXRvcyBwYXJhIGV2YWx1YXIgc3UgY29tcGF0aWJpbGlkYWQgY29uIGxhIGV2aWRlbmNpYSBtdWVzdHJhbC4NCg0KDQoqKkxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgXChIXzFcKSoqIHJlcHJlc2VudGEgbGEgYWZpcm1hY2nDs24gY29udHJhcmlhIGEgbGEgaGlww7N0ZXNpcyBudWxhIHkgcmVjb2dlIGxvcyB2YWxvcmVzIGRlbCBwYXLDoW1ldHJvIHF1ZSBubyBzb24gY29tcGF0aWJsZXMgY29uIGxhIGhpcMOzdGVzaXMgbnVsYS4gDQoNCkVuIGZ1bmNpw7NuIGRlbCB0aXBvIGRlIGNvbnRyYXN0ZSwgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YSBwdWVkZSBmb3JtdWxhcnNlIGNvbW8gdW5hICoqYWZpcm1hY2nDs24gYmlsYXRlcmFsKiosIGN1YW5kbyBzZSBwbGFudGVhIHNpbXBsZW1lbnRlIGxhIGV4aXN0ZW5jaWEgZGUgdW5hIGRpZmVyZW5jaWEgcmVzcGVjdG8gYWwgdmFsb3IgZGUgcmVmZXJlbmNpYSwgbyBjb21vIHVuYSAqKmFmaXJtYWNpw7NuIHVuaWxhdGVyYWwqKiwgY3VhbmRvIHNlIGVzcGVjaWZpY2EgbGEgZGlyZWNjacOzbiBkZSBkaWNoYSBkZXN2aWFjacOzbiAobWF5b3IgbyBtZW5vciBxdWUgZWwgdmFsb3IgaGlwb3RldGl6YWRvKS4gDQoNCkVzdGEgZWxlY2Npw7NuIG5vIGVzIGFyYml0cmFyaWEsIHNpbm8gcXVlIGRlcGVuZGUgZGlyZWN0YW1lbnRlIGRlbCBvYmpldGl2byBkZWwgZXN0dWRpbyB5IGRlIGxhIGZvcm11bGFjacOzbiBkZWwgcHJvYmxlbWEsIHlhIHF1ZSBkZXRlcm1pbmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIHksIHBvciB0YW50bywgbGEgc2Vuc2liaWxpZGFkIGRlbCBjb250cmFzdGUgZnJlbnRlIGEgZGlzdGludG9zIHRpcG9zIGRlIGRlc3ZpYWNpb25lcyByZXNwZWN0byBhIGxhIGhpcMOzdGVzaXMgbnVsYS4NCg0KLS0tDQoNCiMjIyAyLiBTZWxlY2Npb25hciBlbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBcKFxhbHBoYVwpIHkgY29uc2VjdWVudGVtZW50ZSwgZWwgbml2ZWwgZGUgY29uZmlhbnphIGFzb2NpYWRvLg0KDQoqKkVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhXCkqKiBjb3JyZXNwb25kZSBhIGxhIHByb2JhYmlsaWRhZCBtw6F4aW1hIHF1ZSBzZSBhY2VwdGEgZGUgY29tZXRlciB1biBlcnJvciBhbCByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEgY3VhbmRvIGVzdGEgZXMgdmVyZGFkZXJhLg0KDQoqKkxvcyB2YWxvcmVzIG3DoXMgaGFiaXR1YWxlcyB1dGlsaXphZG9zIHNvbjoqKg0KDQotIFwoXGFscGhhID0gMC4wNVwpDQotIFwoXGFscGhhID0gMC4wMVwpDQoNCg0KKipFcnJvciB0aXBvIEkqKg0KDQpPY3VycmUgY3VhbmRvICoqc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSBzaWVuZG8gZXN0YSB2ZXJkYWRlcmEqKi4gRXMgZGVjaXIsIHNlIGNvbmNsdXllIHF1ZSBleGlzdGUgdW5hIGRpZmVyZW5jaWEgbyBlZmVjdG8gY3VhbmRvIGVuIHJlYWxpZGFkIG5vIGxvIGhheS4NCg0KRXN0ZSBlcnJvciBlc3TDoSBkaXJlY3RhbWVudGUgY29udHJvbGFkbyBwb3IgZWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24gXChcYWxwaGFcKS4NCg0KICoqRXJyb3IgdGlwbyBJSSoqDQoNCk9jdXJyZSBjdWFuZG8gKipubyBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSBcKEhfMFwpIHNpZW5kbyBlc3RhIGZhbHNhKiouIEVzIGRlY2lyLCBubyBzZSBkZXRlY3RhIHVuYSBkaWZlcmVuY2lhIG8gZWZlY3RvIHF1ZSByZWFsbWVudGUgZXhpc3RlLg0KDQpFbiBlc3RlIGNhc28sIHNlIGVzdMOhIHBhc2FuZG8gcG9yIGFsdG8gdW4gZWZlY3RvIHJlYWwuDQoNCg0KKipFbCBuaXZlbCBkZSBjb25maWFuemEqKiBlcyBsYSBwcm9iYWJpbGlkYWQgY29tcGxlbWVudGFyaWEgYWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24geSBleHByZXNhIGVsIGdyYWRvIGRlIGZpYWJpbGlkYWQgYXNvY2lhZG8gYSB1biBwcm9jZWRpbWllbnRvIGRlIGluZmVyZW5jaWEgZXN0YWTDrXN0aWNhLiBTZSBkZW5vdGEgY29tbzoNCg0KXFsNClx0ZXh0e05pdmVsIGRlIGNvbmZpYW56YX0gPSAxIC0gXGFscGhhDQpcXQ0KDQpQb3IgZWplbXBsbzoNCg0KLSBTaSBcKFxhbHBoYSA9IDB7LH0wNVwpLCBlbCBuaXZlbCBkZSBjb25maWFuemEgZXMgMCw5NSAoOTUlKS4NCi0gU2kgXChcYWxwaGEgPSAweyx9MDFcKSwgZWwgbml2ZWwgZGUgY29uZmlhbnphIGVzIDAsOTkgKDk5JSkuDQoNCkVsIG5pdmVsIGRlIGNvbmZpYW56YSBkZWJlIGZpamFyc2UgKiphbnRlcyBkZSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zKiosIHlhIHF1ZSBmb3JtYSBwYXJ0ZSBkZWwgZGlzZcOxbyBkZWwgY29udHJhc3RlIGRlIGhpcMOzdGVzaXMuIE5vIHNlIGFqdXN0YSBlbiBmdW5jacOzbiBkZSBsb3MgcmVzdWx0YWRvcyBvYnNlcnZhZG9zLCBzaW5vIHF1ZSBzZSBlc3RhYmxlY2UgYSBwcmlvcmkgcGFyYSBjb250cm9sYXIgbGEgcHJvYmFiaWxpZGFkIGRlIGNvbWV0ZXIgdW4gKiplcnJvciBkZSB0aXBvIEkqKiB5IGRlZmluaXIgZWwgY3JpdGVyaW8gZGUgZGVjaXNpw7NuIGRlbCB0ZXN0Lg0KDQpVbiBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSBpbmRpY2EgcXVlIHNpIHNlIHJlcGl0aWVzZSBlbCBtdWVzdHJlbyBpbmZpbml0YXMgdmVjZXMsIGFwcm94aW1hZGFtZW50ZSBlbCA5NSUgZGUgbG9zIGludGVydmFsb3MgY29uc3RydWlkb3MgY29udGVuZHLDrWFuIGVsIHZlcmRhZGVybyBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLg0KDQotLS0NCg0KIyMjIDMuIFJlY29nZXIgbGEgbXVlc3RyYSBkZSBkYXRvcyB5IHNlbGVjY2lvbmFyIGVsIHRhbWHDsW8gbXVlc3RyYWwNCg0KKipFbCB0YW1hw7FvIG11ZXN0cmFsKiogZXMgdW4gZmFjdG9yIGRldGVybWluYW50ZSBlbiBsYSB2YWxpZGV6IHkgZmlhYmlsaWRhZCBkZSB1biBjb250cmFzdGUgZGUgaGlww7N0ZXNpcywgeWEgcXVlIGNvbmRpY2lvbmEgdGFudG8gbGEgcHJlY2lzacOzbiBkZSBsYXMgZXN0aW1hY2lvbmVzIGNvbW8gbGFzIHByb3BpZWRhZGVzIGRlbCB0ZXN0IGVzdGFkw61zdGljby4NCg0KRW4gdMOpcm1pbm9zIGdlbmVyYWxlcywgdW4gKiptYXlvciB0YW1hw7FvIG11ZXN0cmFsKio6DQoNCi0gUmVkdWNlIGxhIHZhcmlhYmlsaWRhZCBkZSBsb3MgZXN0aW1hZG9yZXMsIGF1bWVudGFuZG8gc3UgcHJlY2lzacOzbi4NCi0gSW5jcmVtZW50YSBsYSBwb3RlbmNpYSBlc3RhZMOtc3RpY2EgZGVsIGNvbnRyYXN0ZSwgZXMgZGVjaXIsIGxhIGNhcGFjaWRhZCBwYXJhIGRldGVjdGFyIGVmZWN0b3MgcmVhbGVzLg0KLSBNZWpvcmEgbGEgcm9idXN0ZXogZGVsIHByb2NlZGltaWVudG8gZnJlbnRlIGEgZmx1Y3R1YWNpb25lcyBhbGVhdG9yaWFzIGVuIGxvcyBkYXRvcy4NCg0KLS0tDQoNCiMjIyA0LiBFbGVnaXIgZWwgZXN0YWTDrXN0aWNvIGRlIGNvbnRyYXN0ZSBhZGVjdWFkbyB5IGNhbGN1bGFybG8NCg0KVW5hIHZleiBmb3JtdWxhZGFzIGxhcyBoaXDDs3Rlc2lzLCBzZSBkZWJlIGVsZWdpciBlbCAqKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqKiBtw6FzIGFkZWN1YWRvIHNlZ8O6biBlbCB0aXBvIGRlIHZhcmlhYmxlLCBsb3Mgc3VwdWVzdG9zIHF1ZSBzZSBjdW1wbGFuIHkgZWwgb2JqZXRpdm8gZGVsIGVzdHVkaW8uDQoNCkxvcyBwcmluY2lwYWxlcyAqKm3DqXRvZG9zIHV0aWxpemFkb3MgZW4gY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzKiogc29uOg0KDQoqKlRlc3QgWioqDQoNClNlIHV0aWxpemEgY3VhbmRvIHNlIHF1aWVyZSAqKmNvbnRyYXN0YXIgdW5hIG1lZGlhIHkgc2UgY29ub2NlIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCAoz4MpLioqDQoNCkVzdGUgY2FzbyBlcyBoYWJpdHVhbCBlbiBlbnRvcm5vcyBpbmR1c3RyaWFsZXMgZG9uZGUgZWwgcHJvY2VzbyBlc3TDoSBiaWVuIGNhcmFjdGVyaXphZG8geSBsYSB2YXJpYWJpbGlkYWQgcG9ibGFjaW9uYWwgcHVlZGUgY29uc2lkZXJhcnNlIGNvbm9jaWRhIHkgZXN0YWJsZS4NCg0KRXMgZXNwZWNpYWxtZW50ZSBhcHJvcGlhZG8gY3VhbmRvIGxhIHBvYmxhY2nDs24gZXMgbm9ybWFsIG8gY3VhbmRvIGVsIHRhbWHDsW8gbXVlc3RyYWwgZXMgc3VmaWNpZW50ZW1lbnRlIGdyYW5kZSwgZGUgZm9ybWEgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgbWVkaWEgbXVlc3RyYWwgcHVlZGUgYXByb3hpbWFyc2UgYSB1bmEgbm9ybWFsIGVuIHZpcnR1ZCBkZWwgVGVvcmVtYSBDZW50cmFsIGRlbCBMw61taXRlLiANCg0KRW4gbGEgcHLDoWN0aWNhLCBzZSB1dGlsaXphIGNvbiBmcmVjdWVuY2lhIGxhIHJlZ2xhIG9yaWVudGF0aXZhIFwobiBcZ2VxIDMwXCksIGF1bnF1ZSBubyBjb25zdGl0dXllIHVuIGNyaXRlcmlvIGVzdHJpY3RvLg0KDQoqKkVsIGVzdGFkw61zdGljbyBkZSBjb250cmFzdGUgc2UgZGVmaW5lIGNvbW8qKg0KDQokJA0KWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19DQokJA0KDQpEb25kZToNCg0KLSBcKFxiYXJ7eH1cKTogbWVkaWEgbXVlc3RyYWwgZGUgbGEgdGVtcGVyYXR1cmEgZGVsIHJlYWN0b3IgIA0KLSBcKFxtdV8wXCk6IHZhbG9yIGRlIHJlZmVyZW5jaWEgcHJvcG9yY2lvbmFkbyBwb3IgZWwgZmFicmljYW50ZSAgDQotIFwoXHNpZ21hXCk6IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCBjb25vY2lkYSAgDQotIFwoblwpOiB0YW1hw7FvIGRlIGxhIG11ZXN0cmENCg0KQmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSwgZXN0ZSBlc3RhZMOtc3RpY28gc2lndWUgdW5hICoqZGlzdHJpYnVjacOzbiBub3JtYWwgZXN0w6FuZGFyIFwoIFxtYXRoY2Fse059KDAsMSkgXCkuKioNCg0KLS0tDQoNCioqVGVzdCB0IGRlIFN0dWRlbnQqKg0KDQpFbCAqKnRlc3QgdCBkZSBTdHVkZW50KiogZXMgZWwgZW5mb3F1ZSBtw6FzIGhhYml0dWFsIGN1YW5kbyAqKmxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwb2JsYWNpb25hbCBlcyBkZXNjb25vY2lkYS4qKiANCg0KRW4gZXN0ZSBjYXNvLCBsYSB2YXJpYWJpbGlkYWQgZGVsIHByb2Nlc28gc2UgZXN0aW1hIGEgcGFydGlyIGRlIGxhIG11ZXN0cmEgbWVkaWFudGUgbGEgKipkZXN2aWFjacOzbiBlc3TDoW5kYXIgbXVlc3RyYWwgKHMpKiouDQoNCioqRXMgYWRlY3VhZG8gZXNwZWNpYWxtZW50ZSBjdWFuZG86KioNCg0KLSBFbCB0YW1hw7FvIG11ZXN0cmFsIGVzIHBlcXVlw7FvIG8gbW9kZXJhZG8gKFwobiA8IDMwXCkpLg0KLSBObyBzZSBjb25vY2UgXChcc2lnbWFcKS4NCi0gRWwgcHJvY2VzbyBzZSBlbmN1ZW50cmEgZW4gcsOpZ2ltZW4gZXN0YWNpb25hcmlvIHkgcHVlZGUgYXN1bWlyc2UgYXByb3hpbWFkYW1lbnRlIG5vcm1hbGlkYWQuDQoNClNlIGRlZmluZSBjb21vDQoNCiQkDQp0ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtzIC8gXHNxcnR7bn19DQokJA0KDQpkb25kZToNCg0KLSBcKHNcKTogZGVzdmlhY2nDs24gZXN0w6FuZGFyIG11ZXN0cmFsICANCi0gRWwgcmVzdG8gZGUgdmFyaWFibGVzIHNlIGRlZmluZW4gY29tbyBlbiBlbCBjYXNvIGFudGVyaW9yICANCg0KQmFqbyBsYSBoaXDDs3Rlc2lzIG51bGEgXChIXzBcKSwgZXN0ZSBlc3RhZMOtc3RpY28gc2lndWUgdW5hICoqZGlzdHJpYnVjacOzbiB0IGRlIFN0dWRlbnQgY29uIFwobiAtIDFcKSBncmFkb3MgZGUgbGliZXJ0YWQuKioNCg0KLS0tDQoNCioqVGVzdCBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyoqDQoNCkVsICoqdGVzdCBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyoqIHNlIHV0aWxpemEgcGFyYSBjb21wYXJhciBzaSBkb3MgcHJvcG9yY2lvbmVzIHBvYmxhY2lvbmFsZXMgcHVlZGVuIGNvbnNpZGVyYXJzZSBpZ3VhbGVzIG8gc2kgZXhpc3RlbiBkaWZlcmVuY2lhcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBlbnRyZSBlbGxhcy4NCg0KRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG8gc2UgZGVzZWEgY29tcGFyYXIgbGEgZnJlY3VlbmNpYSBkZSBhcGFyaWNpw7NuIGRlIHVuYSBjYXJhY3RlcsOtc3RpY2EgZW4gZG9zIHBvYmxhY2lvbmVzIGluZGVwZW5kaWVudGVzLg0KDQoqKkVzIGFkZWN1YWRvIGN1YW5kbzoqKg0KDQotIFNlIGNvbXBhcmFuIGRvcyBtdWVzdHJhcyBpbmRlcGVuZGllbnRlcy4NCi0gTGEgdmFyaWFibGUgYW5hbGl6YWRhIGVzIGRpY290w7NtaWNhIChwcmVzZW5jaWEvYXVzZW5jaWEsIMOpeGl0by9mcmFjYXNvLCBkZXRlY2Npw7NuL25vIGRldGVjY2nDs24pLg0KLSBMb3MgdGFtYcOxb3MgbXVlc3RyYWxlcyBzb24gc3VmaWNpZW50ZW1lbnRlIGdyYW5kZXMgcGFyYSBhcHJveGltYXIgbGEgZGlzdHJpYnVjacOzbiBhIHVuYSBub3JtYWwuDQoNCioqRWwgZXN0YWTDrXN0aWNvIGRlIGNvbnRyYXN0ZSBzZSBkZWZpbmUgY29tbzoqKg0KDQokJA0KWiA9DQpcZnJhY3tcaGF0e3B9XzEgLSBcaGF0e3B9XzJ9DQp7XHNxcnR7XGhhdHtwfSgxLVxoYXR7cH0pDQpcbGVmdCgNClxmcmFjezF9e25fMX0NCisNClxmcmFjezF9e25fMn0NClxyaWdodCl9fQ0KJCQNCg0KZG9uZGU6DQoNCi0gXChcaGF0e3B9XzFcKTogcHJvcG9yY2nDs24gbXVlc3RyYWwgZGVsIHByaW1lciBncnVwby4NCi0gXChcaGF0e3B9XzJcKTogcHJvcG9yY2nDs24gbXVlc3RyYWwgZGVsIHNlZ3VuZG8gZ3J1cG8uDQotIFwobl8xXCk6IHRhbWHDsW8gZGUgbGEgcHJpbWVyYSBtdWVzdHJhLg0KLSBcKG5fMlwpOiB0YW1hw7FvIGRlIGxhIHNlZ3VuZGEgbXVlc3RyYS4NCi0gXChcaGF0e3B9XCk6IHByb3BvcmNpw7NuIGNvbWJpbmFkYSBiYWpvIGxhIGhpcMOzdGVzaXMgbnVsYS4NCg0KTGEgcHJvcG9yY2nDs24gY29tYmluYWRhIHNlIGNhbGN1bGEgY29tbzoNCg0KJCQNClxoYXR7cH0NCj0NClxmcmFje3hfMSt4XzJ9DQp7bl8xK25fMn0NCiQkDQoNCmRvbmRlIFwoeF8xXCkgeSBcKHhfMlwpIHJlcHJlc2VudGFuIGVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyBjb24gbGEgY2FyYWN0ZXLDrXN0aWNhIGVzdHVkaWFkYSBlbiBjYWRhIG11ZXN0cmEuDQoNCkJham8gbGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCksIGVsIGVzdGFkw61zdGljbyBzaWd1ZSBhcHJveGltYWRhbWVudGUgdW5hICoqZGlzdHJpYnVjacOzbiBub3JtYWwgZXN0w6FuZGFyKio6DQoNCiQkDQpaIFxzaW0gXG1hdGhjYWx7Tn0oMCwxKQ0KJCQNCg0KRXN0ZSBjb250cmFzdGUgc2UgdXRpbGl6YSBjb24gZnJlY3VlbmNpYSBlbiBlc3R1ZGlvcyBkZSBjYWxpZGFkIGluZHVzdHJpYWwsIGVwaWRlbWlvbG9nw61hLCBjaWVuY2lhcyBhbWJpZW50YWxlcyB5IGFuw6FsaXNpcyBjb21wYXJhdGl2b3MgZGUgbWF0ZXJpYWxlcywgZG9uZGUgZWwgb2JqZXRpdm8gZXMgZGV0ZXJtaW5hciBzaSBkb3MgcG9ibGFjaW9uZXMgcHJlc2VudGFuIHByb3BvcmNpb25lcyBzaWduaWZpY2F0aXZhbWVudGUgZGlmZXJlbnRlcy4NCg0KDQotLS0NCg0KKipUZXN0IENoaS1jdWFkcmFkbyAoz4fCsikqKg0KDQoqKkVsIHRlc3QgQ2hpLWN1YWRyYWRvKiogc2UgdXRpbGl6YSBjb24gKip2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzKiogKHBvciBlamVtcGxvLCB0aXBvcywgY2xhc2VzIG8gY2F0ZWdvcsOtYXMpIHkgcGVybWl0ZSBjb21wYXJhciBsbyBxdWUgc2Ugb2JzZXJ2YSBlbiBsb3MgZGF0b3MgY29uIGxvIHF1ZSBzZSBlc3BlcmFyw61hIGJham8gdW5hIGhpcMOzdGVzaXMgdGXDs3JpY2EuDQoNClN1ICoqb2JqZXRpdm8qKiBlcyBkZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHkgZXNwZXJhZGFzIHNvbiBzdWZpY2llbnRlbWVudGUgZ3JhbmRlcyBjb21vIHBhcmEgaW5kaWNhciBxdWUgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG8gdW4gZGVzYWp1c3RlIHJlc3BlY3RvIGEgdW4gbW9kZWxvIHRlw7NyaWNvLg0KDQpTZSBhcGxpY2EgcHJpbmNpcGFsbWVudGUgKiplbiBlc3RvcyBjb250ZXh0b3MqKjogYW7DoWxpc2lzIGRlIGluZGVwZW5kZW5jaWEgZW50cmUgdmFyaWFibGVzIGNhdGVnw7NyaWNhcywgY29tcHJvYmFjacOzbiBkZSBsYSBib25kYWQgZGUgYWp1c3RlIGRlIHVuYSBkaXN0cmlidWNpw7NuIHkgY29tcGFyYWNpw7NuIGRlIHByb3BvcmNpb25lcyBlbnRyZSBncnVwb3MuDQoNClxbDQpcY2hpXjIgPSBcc3VtIFxmcmFjeyhPX2kgLSBFX2kpXjJ9e0VfaX0NClxdDQoNCmRvbmRlDQoNCg0KLSBcKE9faVwpOiBmcmVjdWVuY2lhIG9ic2VydmFkYSBlbiBsYSBjYXRlZ29yw61hIFwoaVwpIChkYXRvcyByZWFsZXMpLg0KLSBcKEVfaVwpOiBmcmVjdWVuY2lhIGVzcGVyYWRhIGJham8gbGEgaGlww7N0ZXNpcyBudWxhLg0KLSBcKE9faSAtIEVfaVwpOiBkaWZlcmVuY2lhIGVudHJlIGxvIG9ic2VydmFkbyB5IGxvIGVzcGVyYWRvLg0KLSBcKChPX2kgLSBFX2kpXjJcKTogc2UgZWxldmEgYWwgY3VhZHJhZG8gcGFyYSBldml0YXIgc2lnbm9zIG5lZ2F0aXZvcyB5IGFtcGxpZmljYXIgZGVzdmlhY2lvbmVzIGdyYW5kZXMuDQotIFwoXGZyYWN7KE9faSAtIEVfaSleMn17RV9pfVwpOiBub3JtYWxpemEgbGEgZGVzdmlhY2nDs24gcmVzcGVjdG8gYWwgdGFtYcOxbyBlc3BlcmFkby4NCi0gXChcc3VtXCk6IHN1bWEgZGUgdG9kYXMgbGFzIGNhdGVnb3LDrWFzLg0KDQotLS0NCg0KKipCb290c3RyYXBwaW5nKioNCg0KRXMgdW4gKiptw6l0b2RvIGNvbXB1dGFjaW9uYWwqKiBtdXkgZmxleGlibGUuIE5vIHJlcXVpZXJlIGFzdW1pciBub3JtYWxpZGFkIG5pIGNvbm9jZXIgbGEgZGlzdHJpYnVjacOzbiBwb2JsYWNpb25hbC4gQ29uc2lzdGUgZW4gZ2VuZXJhciBtaWxlcyBkZSBtdWVzdHJhcyBhcnRpZmljaWFsZXMgKGNvbiByZWVtcGxhem8pIGEgcGFydGlyIGRlIGxvcyBkYXRvcyBvcmlnaW5hbGVzIHBhcmEgZXN0aW1hciBsYSBkaXN0cmlidWNpw7NuIGRlbCBlc3RhZMOtc3RpY28uDQoNCioqRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG86KioNCg0KLSBFbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEgZXMgcGVxdWXDsW8gIA0KLSBMb3MgZGF0b3Mgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCAgDQotIExvcyBzdXB1ZXN0b3MgZGUgbG9zIHRlc3RzIGNsw6FzaWNvcyBubyBzZSBjdW1wbGVuICANCg0KLS0tDQoNCiMjIyBSZXN1bWVuIGNvbXBhcmF0aXZvDQoNCjx0YWJsZSBzdHlsZT0iYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsgYm9yZGVyLXNwYWNpbmc6IDAgOHB4OyB3aWR0aDoxMDAlOyI+DQogIDx0cj4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+RXN0YWTDrXN0aWNvPC90aD4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+VGlwbyBkZSB2YXJpYWJsZTwvdGg+DQogICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IHBhZGRpbmc6MTBweDsiPlN1cHVlc3RvcyBwcmluY2lwYWxlczwvdGg+DQogICAgPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOmxlZnQ7IHBhZGRpbmc6MTBweDsiPlRhbWHDsW8gbXVlc3RyYWwgcmVjb21lbmRhZG88L3RoPg0KICAgIDx0aCBzdHlsZT0idGV4dC1hbGlnbjpsZWZ0OyBwYWRkaW5nOjEwcHg7Ij5Db3N0ZSBjb21wdXRhY2lvbmFsPC90aD4NCiAgICA8dGggc3R5bGU9InRleHQtYWxpZ246bGVmdDsgcGFkZGluZzoxMHB4OyI+VXNvIG3DoXMgZnJlY3VlbnRlPC90aD4NCiAgPC90cj4NCg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5UZXN0IFo8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+TnVtw6lyaWNhIChtZWRpYSk8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Tm9ybWFsaWRhZCArIM+DIGNvbm9jaWRhPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZSAobiDiiaUgMzApPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk11eSBiYWpvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPlByb2Nlc29zIGluZHVzdHJpYWxlczwvdGQ+DQogIDwvdHI+DQoNCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+VGVzdCB0PC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk51bcOpcmljYSAobWVkaWEpPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk5vcm1hbGlkYWQgYXByb3hpbWFkYTwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5QZXF1ZcOxbyBvIG1lZGlhbm88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+QmFqbzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5FeHBlcmltZW50b3MgY2llbnTDrWZpY29zPC90ZD4NCiAgPC90cj4NCg0KICA8dHI+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5DaGktY3VhZHJhZG88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Q2F0ZWfDs3JpY2E8L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+RnJlY3VlbmNpYXMgZXNwZXJhZGFzIOKJpSA1PC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZTwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5CYWpvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkVuY3Vlc3RhczwvdGQ+DQogIDwvdHI+DQoNCiAgPHRyPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+Qm9vdHN0cmFwcGluZzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5DdWFscXVpZXIgdGlwbzwvdGQ+DQogICAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5NdXkgcG9jb3Mgc3VwdWVzdG9zPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkN1YWxxdWllciB0YW1hw7FvPC90ZD4NCiAgICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkFsdG88L3RkPg0KICAgIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+RGF0b3Mgbm8gbm9ybWFsZXMgbyBtdWVzdHJhcyBwZXF1ZcOxYXM8L3RkPg0KICA8L3RyPg0KICANCiAgPHRyPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPlogKGRvcyBwcm9wb3JjaW9uZXMpPC90ZD4NCiAgPHRkIHN0eWxlPSJwYWRkaW5nOjEwcHg7Ij5Qcm9wb3JjaW9uZXM8L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPk11ZXN0cmFzIGluZGVwZW5kaWVudGVzIHkgdGFtYcOxbyBncmFuZGU8L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkdyYW5kZTwvdGQ+DQogIDx0ZCBzdHlsZT0icGFkZGluZzoxMHB4OyI+TXV5IGJham88L3RkPg0KICA8dGQgc3R5bGU9InBhZGRpbmc6MTBweDsiPkNvbXBhcmFjacOzbiBkZSBwcm9wb3JjaW9uZXM8L3RkPg0KPC90cj4NCjwvdGFibGU+DQoNCg0KDQojIyMgNS4gRGV0ZXJtaW5hY2nDs24gZGVsIHZhbG9yLXAgbyByZWdpw7NuIGNyw610aWNhIGFzb2NpYWRhIGFsIGNvbnRyYXN0ZQ0KDQoNClVuYSB2ZXogc2VsZWNjaW9uYWRvIGVsIGVzdGFkw61zdGljbyBkZSBjb250cmFzdGUgYWRlY3VhZG8sIHNlIGNhbGN1bGEgc3UgdmFsb3IgYSBwYXJ0aXIgZGUgbG9zIGRhdG9zIG11ZXN0cmFsZXMuDQoNCkEgcGFydGlyIGRlIGVzdGUgdmFsb3Igb2JzZXJ2YWRvIHkgZGUgbGEgZGlzdHJpYnVjacOzbiBkZWwgZXN0YWTDrXN0aWNvIGJham8gbGEgaGlww7N0ZXNpcyBudWxhIFwoSF8wXCksIHNlIG9idGllbmUgZWwgKipwLXZhbG9yKiosIHV0aWxpemFuZG8gdGFibGFzIGVzdGFkw61zdGljYXMgbyBzb2Z0d2FyZSBlc3BlY2lhbGl6YWRvLg0KDQoNCiMjIyDCv1F1w6kgZXMgZWwgcC12YWxvcj8NCg0KRWwgKipwLXZhbG9yKiogZXMgbGEgcHJvYmFiaWxpZGFkIGRlIG9idGVuZXIgdW4gcmVzdWx0YWRvIGlndWFsIG8gbcOhcyBleHRyZW1vIHF1ZSBlbCBvYnNlcnZhZG8sIHN1cG9uaWVuZG8gcXVlIGxhIGhpcMOzdGVzaXMgbnVsYSBcKEhfMFwpIGVzIHZlcmRhZGVyYS4NCg0KRW4gb3RyYXMgcGFsYWJyYXMsIG1pZGUgbGEgY29tcGF0aWJpbGlkYWQgZW50cmUgbG9zIGRhdG9zIG9ic2VydmFkb3MgeSBsYSBoaXDDs3Rlc2lzIG51bGEuDQoNCg0KIyMjIEludGVycHJldGFjacOzbiBkZWwgcC12YWxvcg0KDQotICoqcC12YWxvciBwZXF1ZcOxbyoqIChcKHAgXGxlcSBcYWxwaGFcKSwgcG9yIGVqZW1wbG8gXChcYWxwaGEgPSAweyx9MDVcKSk6ICANCiAgTG9zIGRhdG9zIG9ic2VydmFkb3Mgc2Vyw61hbiBwb2NvIHByb2JhYmxlcyBiYWpvIFwoSF8wXCkuIFNlIHJlY2hhemEgXChIXzBcKSB5IHNlIGNvbnNpZGVyYSBxdWUgZXhpc3RlIGV2aWRlbmNpYSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGEgZmF2b3IgZGUgXChIXzFcKS4NCg0KLSAqKnAtdmFsb3IgZ3JhbmRlKiogKFwocCA+IFxhbHBoYVwpKTogIA0KICBMb3MgZGF0b3Mgc29uIGNvbXBhdGlibGVzIGNvbiBcKEhfMFwpLiBObyBzZSByZWNoYXphIFwoSF8wXCksIHlhIHF1ZSBubyBleGlzdGUgZXZpZGVuY2lhIHN1ZmljaWVudGUgZW4gc3UgY29udHJhLg0KDQoNCiMjIyBOb3RhIA0KDQpFbCBwLXZhbG9yIG5vIGVzIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgXChIXzBcKSBzZWEgdmVyZGFkZXJhLiAgDQpTb2xvIGluZGljYSBjdcOhbiBjb25zaXN0ZW50ZXMgc29uIGxvcyBkYXRvcyBjb24gbGEgaGlww7N0ZXNpcyBudWxhLg0KDQoNCiMjIyBSZWdsYSBkZSBkZWNpc2nDs24NCg0KTGEgZGVjaXNpw7NuIGVuIHVuIGNvbnRyYXN0ZSBkZSBoaXDDs3Rlc2lzIHNlIGJhc2EgZW4gbGEgKipjb21wYXJhY2nDs24gZW50cmUgZWwgcC12YWxvciB5IGVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhXCkqKjoNCg0KLSBTaSBcKHAgXGxlcSBcYWxwaGFcKTogc2UgcmVjaGF6YSBcKEhfMFwpLg0KLSBTaSBcKHAgPiBcYWxwaGFcKTogbm8gc2UgcmVjaGF6YSBcKEhfMFwpLg0KDQpFbiB1biAqKmNvbnRyYXN0ZSBiaWxhdGVyYWwqKiwgZWwgcC12YWxvciBjb25zaWRlcmEgYW1iYXMgY29sYXMgZGUgbGEgZGlzdHJpYnVjacOzbiwgbWllbnRyYXMgcXVlIGVuIHVuICoqY29udHJhc3RlIHVuaWxhdGVyYWwqKiBzZSBjb25zaWRlcmEgdW5hIHNvbGEgY29sYS4NCg0KLS0tDQoNCiMjIyBSZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgZGUgY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzDQoNCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYW4gKipkb3MgZmlndXJhcyoqIHF1ZSBpbHVzdHJhbiBlbCBjb21wb3J0YW1pZW50byBkZSBsb3MgKipjb250cmFzdGVzIGRlIGhpcMOzdGVzaXMqKiBlbiBzdXMgdmVyc2lvbmVzIGJpbGF0ZXJhbCB5IHVuaWxhdGVyYWwuDQoNCg0KKipGaWd1cmEgMTogQ29udHJhc3RlIGJpbGF0ZXJhbCoqDQoNCkVuIHVuICoqY29udHJhc3RlIGJpbGF0ZXJhbCoqLCBsYSByZWdpw7NuIGNyw610aWNhIHNlIGRpc3RyaWJ1eWUgZW4gKiphbWJhcyBjb2xhcyBkZSBsYSBkaXN0cmlidWNpw7NuKiosIGRlIG1vZG8gcXVlIGxhIHByb2JhYmlsaWRhZCBkZSBlcnJvciBcKFxhbHBoYVwpIHNlIHJlcGFydGUgZW50cmUgbG9zIGRvcyBleHRyZW1vcy4gRXN0ZSBlbmZvcXVlIHNlIHV0aWxpemEgY3VhbmRvIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgcGxhbnRlYSBkaWZlcmVuY2lhcyBlbiBjdWFscXVpZXIgZGlyZWNjacOzbi4NCg0KYGBge3IgY3VydmEtaGlwb3Rlc2lzLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0b3MgY3VydmEgbm9ybWFsIGVzdMOhbmRhcg0KeCA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeSA8LSBkbm9ybSh4KQ0KDQpkYXRhIDwtIGRhdGEuZnJhbWUoeCwgeSkNCg0KIyBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KYWxwaGEgPC0gMC4wNQ0Kel9jcml0IDwtIHFub3JtKDEgLSBhbHBoYS8yKQ0KDQpnZ3Bsb3QoZGF0YSwgYWVzKHgsIHkpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICANCiAgIyBab25hIGRlIG5vIHJlY2hhem8gKDEgLSDOsSkNCiAgZ2VvbV9hcmVhKA0KICAgIGRhdGEgPSBzdWJzZXQoZGF0YSwgeCA+IC16X2NyaXQgJiB4IDwgel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJncmVlbiIsDQogICAgYWxwaGEgPSAwLjI1DQogICkgKw0KICANCiAgIyBab25hcyBjcsOtdGljYXMgKM6xLzIgZW4gY2FkYSBjb2xhKQ0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4IDw9IC16X2NyaXQpLA0KICAgIGFlcyh4LCB5KSwNCiAgICBmaWxsID0gInJlZCIsDQogICAgYWxwaGEgPSAwLjQNCiAgKSArDQogIA0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4ID49IHpfY3JpdCksDQogICAgYWVzKHgsIHkpLA0KICAgIGZpbGwgPSAicmVkIiwNCiAgICBhbHBoYSA9IDAuNA0KICApICsNCiAgDQogICMgTMOtbmVhcyBjcsOtdGljYXMNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtel9jcml0LCB6X2NyaXQpLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICAjIEV0aXF1ZXRhcyBwcmluY2lwYWxlcw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLCB5ID0gMC4yNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBkZSBubyByZWNoYXpvICgxIC0gzrEpIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICANCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTIuOCwgeSA9IDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gIlpvbmEgY3LDrXRpY2EgzrEvMiIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIuOCwgeSA9IDAuMDUsDQogICAgICAgICAgIGxhYmVsID0gIlpvbmEgY3LDrXRpY2EgzrEvMiIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAsIHkgPSAwLjAyLA0KICAgICAgICAgICBsYWJlbCA9ICLOsSA9IDAuMDUg4oaSIHJpZXNnbyBkZSBlcnJvciB0aXBvIEkiLCBjb2xvciA9ICJibGFjayIpICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQ29udHJhc3RlIGJpbGF0ZXJhbDogZGlzdHJpYnVjacOzbiBub3JtYWwgeSBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiDOsSIsDQogICAgeCA9ICJFc3RhZMOtc3RpY28gWiIsDQogICAgeSA9ICJEZW5zaWRhZCINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpBcXXDrToNCg0KLSAqKs6xIChuaXZlbCBkZSBzaWduaWZpY2FjacOzbikqKiByZXByZXNlbnRhIGxhIHByb2JhYmlsaWRhZCB0b3RhbCBkZSBjb21ldGVyIHVuIGVycm9yIGRlIHRpcG8gSSAocmVjaGF6YXIgSOKCgCBzaWVuZG8gdmVyZGFkZXJhKS4NCi0gRXN0ZSByaWVzZ28gc2UgcmVwYXJ0ZSBlbiBkb3MgY29sYXM6ICoqzrEvMiBlbiBjYWRhIGV4dHJlbW8qKiBkZSBsYSBkaXN0cmlidWNpw7NuLg0KLSBMYXMgKip6b25hcyByb2phcyoqIHNvbiBsYXMgcmVnaW9uZXMgY3LDrXRpY2FzIGRvbmRlIHNlIHJlY2hhemEgSOKCgC4NCi0gTGEgKip6b25hIHZlcmRlKiogcmVwcmVzZW50YSBlbCBpbnRlcnZhbG8gZGUgbm8gcmVjaGF6bywgZG9uZGUgbm8gaGF5IGV2aWRlbmNpYSBzdWZpY2llbnRlIGNvbnRyYSBI4oKALg0KLSBMYXMgbMOtbmVhcyBkaXNjb250aW51YXMgc29uIGxvcyAqKnZhbG9yZXMgY3LDrXRpY29zKiogcXVlIHNlcGFyYW4gYW1iYXMgcmVnaW9uZXMuDQoNCg0KKipSZWdsYSB2aXN1YWw6KioNCg0KLSBTaSBlbCBlc3RhZMOtc3RpY28gY2FlIGVuICoqcm9qbyoqIOKGkiBwIOKJpCDOsSDihpIgc2UgcmVjaGF6YSAqKlwoSF8wXCkqKg0KLSBTaSBjYWUgZW4gKip2ZXJkZSoqIOKGkiBwID4gzrEg4oaSIG5vIHNlIHJlY2hhemEgKipcKEhfMFwpKioNCg0KLS0tDQoNCioqRmlndXJhIDI6IENvbnRyYXN0ZSB1bmlsYXRlcmFsKioNCg0KRW4gdW4gKipjb250cmFzdGUgdW5pbGF0ZXJhbCoqLCBsYSByZWdpw7NuIGNyw610aWNhIHNlIHNpdMO6YSDDum5pY2FtZW50ZSBlbiAqKnVuYSBkZSBsYXMgY29sYXMgZGUgbGEgZGlzdHJpYnVjacOzbioqLCBkZSBtb2RvIHF1ZSB0b2RhIGxhIHByb2JhYmlsaWRhZCBkZSBlcnJvciDOsSBzZSBjb25jZW50cmEgZW4gdW4gc29sbyBsYWRvIGVuIGZ1bmNpw7NuIGRlIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuDQoNCmBgYHtyIGN1cnZhLWhpcG90ZXNpcy11bmlsYXRlcmFsLCBlY2hvPUZBTFNFfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQoNCnggPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCnkgPC0gZG5vcm0oeCkNCg0KZGF0YSA8LSBkYXRhLmZyYW1lKHgsIHkpDQoNCmFscGhhIDwtIDAuMDUNCnpfY3JpdCA8LSBxbm9ybSgxIC0gYWxwaGEpDQoNCmdncGxvdChkYXRhLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIA0KICAjIFpvbmEgZGUgbm8gcmVjaGF6byAoMSAtIM6xKQ0KICBnZW9tX2FyZWEoDQogICAgZGF0YSA9IHN1YnNldChkYXRhLCB4IDwgel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJncmVlbiIsDQogICAgYWxwaGEgPSAwLjI1DQogICkgKw0KICANCiAgIyBab25hIGNyw610aWNhIM6xDQogIGdlb21fYXJlYSgNCiAgICBkYXRhID0gc3Vic2V0KGRhdGEsIHggPj0gel9jcml0KSwNCiAgICBhZXMoeCwgeSksDQogICAgZmlsbCA9ICJyZWQiLA0KICAgIGFscGhhID0gMC40DQogICkgKw0KICANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gel9jcml0LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSAwLCB5ID0gMC4yNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBkZSBubyByZWNoYXpvICgxIC0gzrEpIiwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICANCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMi41LCB5ID0gMC4wNSwNCiAgICAgICAgICAgbGFiZWwgPSAiWm9uYSBjcsOtdGljYSDOsSIpICsNCiAgDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAsIHkgPSAwLjAyLA0KICAgICAgICAgICBsYWJlbCA9ICLOsSA9IDAuMDUg4oaSIGVycm9yIHRpcG8gSSIsIGNvbG9yID0gImJsYWNrIikgKw0KICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb250cmFzdGUgdW5pbGF0ZXJhbDogcmVnacOzbiBjcsOtdGljYSB5IG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIM6xIiwNCiAgICB4ID0gIkVzdGFkw61zdGljbyBaIiwNCiAgICB5ID0gIkRlbnNpZGFkIg0KICApICsNCiAgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCkFxdcOtOg0KDQotIFRvZG8gZWwgbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24gKirOsSBzZSBjb25jZW50cmEgZW4gdW5hIHNvbGEgY29sYSoqIGRlIGxhIGRpc3RyaWJ1Y2nDs24uDQotIExhIHpvbmEgcm9qYSByZXByZXNlbnRhIGxhICoqcmVnacOzbiBjcsOtdGljYSoqLCBkb25kZSBzZSByZWNoYXphIEjigoAuDQotIExhIHpvbmEgdmVyZGUgZXMgbGEgcmVnacOzbiBkZSAqKm5vIHJlY2hhem8gKDEg4oiSIM6xKSoqLg0KLSBFbCB2YWxvciBjcsOtdGljbyBtYXJjYSBlbCBwdW50byBhIHBhcnRpciBkZWwgY3VhbCBlbCBlc3RhZMOtc3RpY28gZXMgc3VmaWNpZW50ZW1lbnRlIGV4dHJlbW8uDQoNCg0KKipSZWdsYSB2aXN1YWw6KioNCg0KLSBTaSBlbCBlc3RhZMOtc3RpY28gY2FlIGVuICoqcm9qbyoqIOKGkiBwIOKJpCDOsSDihpIgcmVjaGF6byBkZSAqKlwoSF8wXCkqKiANCi0gU2kgZWwgZXN0YWTDrXN0aWNvIGNhZSBlbiAqKnZlcmRlKiog4oaSIHAgPiDOsSDihpIgbm8gcmVjaGF6byBkZSAqKlwoSF8wXCkqKg0KDQotLS0NCg0KIyMjIDYuIENvbmNsdXNpw7NuLiBUb21hIGxhIGRlY2lzacOzbiBlc3RhZMOtc3RpY2ENCg0KVHJhcyBlbCBhbsOhbGlzaXMsIHNlIHRvbWEgbGEgKipkZWNpc2nDs24gZXN0YWTDrXN0aWNhKiogKHJlY2hhemFyIG8gbm8gcmVjaGF6YXIgXChIXzBcKSksDQoNCi0gU2kgc2UgcmVjaGF6YSAgXChIXzBcKTogc2UgY29uY2x1eWUgcXVlIGV4aXN0ZSBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIGFmaXJtYXIgcXVlIGVsIGVmZWN0bywgZGlmZXJlbmNpYSBvIHJlbGFjacOzbiBwbGFudGVhZGEgZW4gIFwoSF8xXCkgZXMgY29tcGF0aWJsZSBjb24gbG9zIGRhdG9zIG9ic2VydmFkb3MuDQoNCi0gU2kgbm8gc2UgcmVjaGF6YSAgXChIXzBcKTogbm8gc2UgZGlzcG9uZSBkZSBldmlkZW5jaWEgc3VmaWNpZW50ZSBwYXJhIGFmaXJtYXIgcXVlIGV4aXN0YSBlbCBlZmVjdG8gbyBkaWZlcmVuY2lhIHBsYW50ZWFkYSBlbiAgXChIXzFcKSwgYXVucXVlIGVzdG8gbm8gaW1wbGljYSBxdWUgIFwoSF8wXCkgc2VhIG5lY2VzYXJpYW1lbnRlIHZlcmRhZGVyYS4NCg0KLS0tDQoNCiMjIyA3LiBJbnRlcnByZXRhY2nDs24gZGVsIHJlc3VsdGFkbyBlbiBlbCBjb250ZXh0byBkZWwgcHJvYmxlbWENCg0KVW5hIHZleiB0b21hZGEgbGEgZGVjaXNpw7NuIGVzdGFkw61zdGljYSAocmVjaGF6YXIgbyBubyByZWNoYXphciBcKEhfMFwpKSwgZWwgcmVzdWx0YWRvIGRlYmUgKippbnRlcnByZXRhcnNlIGVuIHTDqXJtaW5vcyBkZWwgcHJvYmxlbWEgb3JpZ2luYWwqKi4NCg0KRW4gZXN0ZSBwYXNvIHNlIHRyYWR1Y2UgbGEgY29uY2x1c2nDs24gZXN0YWTDrXN0aWNhIGEgdW5hIGNvbmNsdXNpw7NuIGNvbnRleHR1YWwsIGV4cGxpY2FuZG8gcXXDqSBpbXBsaWNhIGxhIGRlY2lzacOzbiBzb2JyZSBsYSBoaXDDs3Rlc2lzIGVuIGVsIMOhbWJpdG8gcmVhbCBkZWwgZXN0dWRpby4NCg0KRXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWUgZXN0YSBpbnRlcnByZXRhY2nDs24gbm8gYWZpcm1hIHF1ZSBcKEhfMFwpIHNlYSB2ZXJkYWRlcmEgbyBmYWxzYSwgc2lubyBxdWUgbGEgZXZpZGVuY2lhIGRpc3BvbmlibGUgbm8gZXMgc3VmaWNpZW50ZSBwYXJhIHJlY2hhemFybGEgYmFqbyBlbCByaWVzZ28gZGUgZXJyb3IgZXN0YWJsZWNpZG8uDQoNCg0KLS0tDQoNCkEgY29udGludWFjacOzbiwgc2UgcHJlc2VudGFuICoqZG9zIGVzY2VuYXJpb3MgcHLDoWN0aWNvcyoqIGNvbiBlbCBvYmpldGl2byBkZSBlamVtcGxpZmljYXIgbGEgYXBsaWNhY2nDs24gZGUgbG9zICoqY29udHJhc3RlcyBkZSBoaXDDs3Rlc2lzIGVuIGNvbnRleHRvcyByZWFsZXMqKg0KDQo8YnI+DQoNCiMg8J+UrCBFc2NlbmFyaW8gMTogQ29udHJvbCBkZSB0ZW1wZXJhdHVyYSBlbiB1biByZWFjdG9yIGluZHVzdHJpYWwNCg0KIyMgMS4gUGxhbnRlYW1pZW50byBkZWwgcHJvYmxlbWENCg0KU2UgYW5hbGl6YSBlbCAqKmNvbXBvcnRhbWllbnRvIHTDqXJtaWNvIGRlIHVuIHJlYWN0b3IgaW5kdXN0cmlhbCoqIGNvbiBlbCBvYmpldGl2byBkZSBkZXRlcm1pbmFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIGRlIG9wZXJhY2nDs24gKipzdXBlcmEgZWwgdmFsb3IgZGUgcmVmZXJlbmNpYSoqIGVzcGVjaWZpY2FkbyBwb3IgZWwgZmFicmljYW50ZS4NCg0KRWwgcHJvYmxlbWEgc2UgcGxhbnRlYSBjb21vIHVuICoqY29udHJhc3RlIGRlIGhpcMOzdGVzaXMqKiwgeWEgcXVlIHRlbXBlcmF0dXJhcyBlbGV2YWRhcyBkZSBmb3JtYSBzb3N0ZW5pZGEgcHVlZGVuIGluZGljYXIgZmFsbG9zIGVuIGVsIHNpc3RlbWEgbyB1biBmdW5jaW9uYW1pZW50byBhbsOzbWFsby4NCg0KLS0tDQoNCiMjIDIuIFBvYmxhY2nDs24geSB2YXJpYWJsZSBkZSBlc3R1ZGlvDQoNCkxhIHBvYmxhY2nDs24gZXN0w6EgZm9ybWFkYSBwb3IgdG9kYXMgbGFzKiAqKnBvc2libGVzIG1lZGljaW9uZXMgZGUgdGVtcGVyYXR1cmEgZGVsIHJlYWN0b3IqKiBlbiBjb25kaWNpb25lcyBub3JtYWxlcyBkZSBvcGVyYWNpw7NuLg0KDQpMYSAqKnZhcmlhYmxlIGRlIGVzdHVkaW8qKiBlcyBsYSAqKnRlbXBlcmF0dXJhIGludGVybmEgZGVsIHJlYWN0b3IqKiwgbWVkaWRhIGVuIGdyYWRvcyBDZWxzaXVzICjCsEMpLiBTZSB0cmF0YSBkZSB1bmEgdmFyaWFibGUgY3VhbnRpdGF0aXZhIGNvbnRpbnVhLCB5YSBxdWUgcHVlZGUgdG9tYXIgY3VhbHF1aWVyIHZhbG9yIGRlbnRybyBkZSB1biBpbnRlcnZhbG8uDQoNCi0tLQ0KDQojIyAzLiBSZWNvZ2lkYSBkZSBkYXRvcw0KDQoNClNlIG9idGllbmUgdW5hICoqbXVlc3RyYSBhbGVhdG9yaWEqKiBkZSBtZWRpY2lvbmVzIGRlIHRlbXBlcmF0dXJhIGRlbCByZWFjdG9yIHJlZ2lzdHJhZGFzIGVuIGRpc3RpbnRvcyBpbnN0YW50ZXMgZGUgdGllbXBvIGR1cmFudGUgY29uZGljaW9uZXMgZGUgZnVuY2lvbmFtaWVudG8gZXN0YWJsZS4NCg0KTGFzIG9ic2VydmFjaW9uZXMgc2UgY29uc2lkZXJhbiAqKmluZGVwZW5kaWVudGVzKiogeSBwdWVkZW4gcmVjb2dlcnNlIG1lZGlhbnRlIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUsIGFzZWd1cmFuZG8gcXVlIGxhIG11ZXN0cmEgc2VhIHJlcHJlc2VudGF0aXZhIGRlbCBjb21wb3J0YW1pZW50byBkZWwgc2lzdGVtYS4NCg0KRWwgKip0YW1hw7FvIG11ZXN0cmFsIFwoblwpKiogZGViZSBzZXIgc3VmaWNpZW50ZW1lbnRlIGdyYW5kZSBwYXJhIGdhcmFudGl6YXIgZXN0YWJpbGlkYWQgZW4gbGFzIGVzdGltYWNpb25lcy4NCg0KTGEgKipiYXNlIGRlIGRhdG9zKiogaW5jbHV5ZSwgYWwgbWVub3MsIGxhIHRlbXBlcmF0dXJhIHJlZ2lzdHJhZGEgZW4gY2FkYSBtZWRpY2nDs24sIHB1ZGllbmRvIGluY29ycG9yYXJzZSB0YW1iacOpbiBlbCBpbnN0YW50ZSBkZSByZWdpc3RybyBwYXJhIGZpbmVzIGRlIHRyYXphYmlsaWRhZCB5IGFuw6FsaXNpcyB0ZW1wb3JhbC4NCg0KLS0tDQoNCiMjIDQuIEZvcm11bGFjacOzbiBkZSBoaXDDs3Rlc2lzDQoNClNlIHBsYW50ZWEgdW4gKipjb250cmFzdGUgZGUgaGlww7N0ZXNpcyBzb2JyZSBsYSBtZWRpYSBwb2JsYWNpb25hbCBcKFxtdVwpKiosIGNvbiBlbCBvYmpldGl2byBkZSBldmFsdWFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIGRlbCByZWFjdG9yIHN1cGVyYSBlbCB2YWxvciBkZSByZWZlcmVuY2lhIGVzdGFibGVjaWRvIHBvciBlbCBmYWJyaWNhbnRlIFwoXG11XzBcKS4NCg0KXFsNCkhfMDogXG11IFxsZXEgXG11XzANClxdDQoNClxbDQpIXzE6IFxtdSA+IFxtdV8wDQpcXQ0KDQpTZSB0cmF0YSBkZSB1biAqKmNvbnRyYXN0ZSB1bmlsYXRlcmFsIGRlIGNvbGEgZGVyZWNoYSoqLCBkaXNlw7FhZG8gcGFyYSBkZXRlY3RhciBpbmNyZW1lbnRvcyBlbiBsYSBtZWRpYSByZXNwZWN0byBhbCB2YWxvciBkZSByZWZlcmVuY2lhLg0KDQotLS0NCg0KDQojIyA1LiBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KDQpTZSBmaWphIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24qKiBkZWwgY29udHJhc3RlIGVuOg0KDQpcWw0KXGFscGhhID0gMC4wNSwgXHF1YWQgMSAtIFxhbHBoYSA9IDAuOTUNClxdDQoNCkVzdGUgcGFyw6FtZXRybyBkZXRlcm1pbmEgZWwgdW1icmFsIGRlIGRlY2lzacOzbiBkZWwgY29udHJhc3RlIHkgY29udHJvbGEgbGEgcHJvYmFiaWxpZGFkIGRlIGNvbWV0ZXIgdW4gZXJyb3IgZGUgdGlwbyBJLCBlcyBkZWNpciwgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhIHNpZW5kbyBlc3RhIHZlcmRhZGVyYS4NCg0KLS0tDQoNCiMjIDYuIE3DqXRvZG9zIGRlIGNvbnRyYXN0ZSBwb3NpYmxlcw0KDQojIyMgTcOpdG9kbyBwcmluY2lwYWw6IHQgZGUgU3R1ZGVudCAoz4MgZGVzY29ub2NpZGEpDQoNClxbDQp0ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtzIC8gXHNxcnR7bn19DQpcXQ0KDQotLS0NCg0KIyMjIEFsdGVybmF0aXZhcyBtZXRvZG9sw7NnaWNhcw0KDQpFbiBmdW5jacOzbiBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3MgZGF0b3MgeSBkZSBsb3Mgc3VwdWVzdG9zIGRpc3BvbmlibGVzLCBwb2Ryw61hbiBlbXBsZWFyc2Ugb3Ryb3MgbcOpdG9kb3MgZGUgY29udHJhc3RlOg0KDQoNCnwgTcOpdG9kbyB8IFZlbnRhamFzIHwgTGltaXRhY2lvbmVzIHwgVXNvIHTDrXBpY28gfA0KfC0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18DQp8IFRlc3QgWiB8IFNpbXBsZSB8IFJlcXVpZXJlIM+DIGNvbm9jaWRhIHwgUHJvY2Vzb3MgbXV5IGNvbnRyb2xhZG9zIHwNCnwgQm9vdHN0cmFwcGluZyB8IFNpbiBzdXB1ZXN0b3MgZnVlcnRlcyB8IENvc3RlIGNvbXB1dGFjaW9uYWwgYWx0byB8IERhdG9zIG5vIG5vcm1hbGVzIHwNCg0KLS0tDQoNCiMjIDcuIFJlZ2xhIGRlIGRlY2lzacOzbg0KDQpMYSBkZWNpc2nDs24gZGVsIGNvbnRyYXN0ZSBzZSB0b21hIGNvbXBhcmFuZG8gZWwgKipwLXZhbG9yIGNvbiBlbCBuaXZlbCBkZSBzaWduaWZpY2FjacOzbiBcKFxhbHBoYSA9IDAuMDVcKSoqOg0KDQotIFNpIFwocCA8IDAuMDVcKSwgc2UgcmVjaGF6YSBcKEhfMFwpLiAgDQotIFNpIFwocCBcZ2VxIDAuMDVcKSwgbm8gc2UgcmVjaGF6YSBcKEhfMFwpLiAgDQoNCkVuIGVsIGNvbnRleHRvIGRlbCByZWFjdG9yIGluZHVzdHJpYWwsIGVzdGEgcmVnbGEgcGVybWl0ZSBkZXRlcm1pbmFyIHNpIGxhIHRlbXBlcmF0dXJhIG1lZGlhIG9ic2VydmFkYSBlcyBpbmNvbXBhdGlibGUgY29uIGVsIHZhbG9yIGRlIHJlZmVyZW5jaWEgZXN0YWJsZWNpZG8gcG9yIGVsIGZhYnJpY2FudGUuDQoNCi0tLQ0KDQojIyA4LiBJbnRlcnByZXRhY2nDs24gZGVsIHJlc3VsdGFkbw0KDQotICoqUmVjaGF6byBkZSBcKEhfMFwpOioqIHNlIGNvbmNsdXllIHF1ZSAqKmV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHF1ZSBsYSB0ZW1wZXJhdHVyYSBtZWRpYSBkZWwgcmVhY3RvciBzdXBlcmEgZWwgdmFsb3IgZGUgcmVmZXJlbmNpYSoqLCBsbyBxdWUgcHVlZGUgaW5kaWNhciBzb2JyZWNhbGVudGFtaWVudG8gbyB1bmEgZGVzdmlhY2nDs24gcmVsZXZhbnRlIGVuIGxhcyBjb25kaWNpb25lcyBkZSBvcGVyYWNpw7NuIGRlbCBzaXN0ZW1hLiAgDQoNCi0gKipObyByZWNoYXpvIGRlIFwoSF8wXCk6KiogKipubyBzZSBkaXNwb25lIGRlIGV2aWRlbmNpYSBzdWZpY2llbnRlIHBhcmEgYWZpcm1hciBxdWUgbGEgdGVtcGVyYXR1cmEgbWVkaWEgc3VwZXJlIGVsIHZhbG9yIGRlIHJlZmVyZW5jaWEqKiwgcG9yIGxvIHF1ZSBlbCBjb21wb3J0YW1pZW50byB0w6lybWljbyBkZWwgcmVhY3RvciBzZSBjb25zaWRlcmEgY29tcGF0aWJsZSBjb24gbGEgdmFyaWFiaWxpZGFkIG5vcm1hbCBkZWwgcHJvY2Vzby4gIA0KDQotLS0NCg0KPGJyPg0KDQojIOKYou+4jyBFc2NlbmFyaW8gMjogQ29tcGFyYWNpw7NuIGRlIHByb3BvcmNpb25lcyBkZSB1cmFuaW8gZW4gbXVlc3RyYXMgcmFkaWFjdGl2YXMNCg0KIyMgMS4gUGxhbnRlYW1pZW50byBkZWwgcHJvYmxlbWENCg0KU2UgYW5hbGl6YSBzaSAqKmRvcyBtdWVzdHJhcyBkZSBtYXRlcmlhbCByYWRpYWN0aXZvKiogcHVlZGVuIHByb2NlZGVyIGRlIGxhICoqbWlzbWEgZnVlbnRlIGRlIG9yaWdlbioqIGEgcGFydGlyIGRlIGxhIGNvbXBhcmFjacOzbiBkZSBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gcHJlc2VudGUgZW4gY2FkYSB1bmEuDQoNCkVsICoqb2JqZXRpdm8qKiBlcyBkZXRlcm1pbmFyIHNpIGxhcyBkaWZlcmVuY2lhcyBvYnNlcnZhZGFzIHNvbiBhdHJpYnVpYmxlcyBhIHZhcmlhYmlsaWRhZCBhbGVhdG9yaWEgbyBhIGRpZmVyZW5jaWFzIGVzdHJ1Y3R1cmFsZXMgZW50cmUgcG9ibGFjaW9uZXMuDQoNCi0tLQ0KDQojIyAyLiBQb2JsYWNpb25lcyB5IHZhcmlhYmxlIGRlIGVzdHVkaW8NCg0KU2UgZWxpZ2VuIGxhcyBzaWd1aWVudGVzICoqcG9ibGFjaW9uZXMqKiwgeWEgcXVlIHJlcHJlc2VudGFuIHBvc2libGVzIGZ1ZW50ZXMgZGlzdGludGFzIGRlIG1hdGVyaWFsIHJhZGlhY3Rpdm8uIA0KDQoNCioqUG9ibGFjacOzbiAxKio6IG11ZXN0cmFzIGRlIG1hdGVyaWFsIHJhZGlhY3Rpdm8gZGUgb3JpZ2VuIGRlc2Nvbm9jaWRvIEENCg0KKipQb2JsYWNpw7NuIDIqKjogbXVlc3RyYXMgZGUgbWF0ZXJpYWwgcmFkaWFjdGl2byBkZSBvcmlnZW4gZGVzY29ub2NpZG8gQg0KDQoNClZhcmlhYmxlIGRlIGVzdHVkaW86ICoqcHJvcG9yY2nDs24gZGUgdXJhbmlvIGVuIGNhZGEgbXVlc3RyYSoqDQoNClRpcG86ICoqdmFyaWFibGUgY2F0ZWfDs3JpY2EvYmlub21pYWwqKg0KDQoNCkludGVycHJldGFjacOzbjogKipwb3JjZW50YWplIGRlIHVyYW5pbyByZXNwZWN0byBhbCB0b3RhbCBkZSBsYSBtdWVzdHJhKioNCg0KDQotLS0NCg0KIyMgMy4gUmVjb2dpZGEgZGUgZGF0b3MNCg0KU2Ugb2J0aWVuZW4gKipkb3MgbXVlc3RyYXMgaW5kZXBlbmRpZW50ZXMqKiBwcm9jZWRlbnRlcyBkZSBjYWRhIHVuYSBkZSBsYXMgcG9ibGFjaW9uZXMuDQoNCkVuIGNhZGEgdW5hIGRlIGVsbGFzICoqc2UgcmVnaXN0cmFuKio6DQoNCi0gdGFtYcOxb3MgbXVlc3RyYWxlcyBcKG5fMVwpIHkgXChuXzJcKSAgDQotIG7Dum1lcm8gZGUgZGV0ZWNjaW9uZXMgZGUgdXJhbmlvIGVuIGNhZGEgbXVlc3RyYSAgDQotIGPDoWxjdWxvIGRlIGxhcyBwcm9wb3JjaW9uZXMgbXVlc3RyYWxlcyBcKFxoYXR7cH1fMVwpIHkgXChcaGF0e3B9XzJcKSAgDQoNCkVzdGFzIHByb3BvcmNpb25lcyBzZSBvYnRpZW5lbiBhIHBhcnRpciBkZSBsYSBmcmVjdWVuY2lhIGRlIGRldGVjY2nDs24gZGUgdXJhbmlvIHJlc3BlY3RvIGFsIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMgZW4gY2FkYSBtdWVzdHJhLg0KDQoqKkNvbmRpY2lvbmVzIGRlbCBtdWVzdHJlbzoqKg0KDQotIGluZGVwZW5kZW5jaWEgZW50cmUgbXVlc3RyYXMgIA0KLSBjb250cm9sIGRlbCBzZXNnbyBpbnN0cnVtZW50YWwgIA0KLSBjb25kaWNpb25lcyBob21vZ8OpbmVhcyBkZSBtZWRpY2nDs24gcGFyYSBhc2VndXJhciBjb21wYXJhYmlsaWRhZCAgDQoNCi0tLQ0KDQojIyA0LiBGb3JtdWxhY2nDs24gZGUgaGlww7N0ZXNpcw0KDQpTZSBwbGFudGVhIHVuICoqY29udHJhc3RlIGJpbGF0ZXJhbCoqIHBhcmEgZGV0ZXJtaW5hciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVuIGxhIHByb3BvcmNpw7NuIGRlIHVyYW5pbyBlbnRyZSBhbWJhcyBwb2JsYWNpb25lcy4NCg0KJCQNCkhfMDogcF8xID0gcF8yDQokJA0KDQokJA0KSF8xOiBwXzEgXG5lcSBwXzINCiQkDQoNCkJham8gbGEgKipoaXDDs3Rlc2lzIG51bGEgIFwoSF8wXCkqKiwgc2UgYXN1bWUgcXVlIGFtYmFzIHBvYmxhY2lvbmVzIHByZXNlbnRhbiBsYSAqKm1pc21hIHByb3BvcmNpw7NuIGRlIHVyYW5pbyoqLCBtaWVudHJhcyBxdWUgbGEgKipoaXDDs3Rlc2lzIGFsdGVybmF0aXZhIFwoSF8wMSkqKiBwbGFudGVhIGxhIGV4aXN0ZW5jaWEgZGUgZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgZWxsYXMuDQoNCi0tLQ0KDQojIyA1LiBOaXZlbCBkZSBzaWduaWZpY2FjacOzbg0KDQpTZSBmaWphIGVsICoqbml2ZWwgZGUgc2lnbmlmaWNhY2nDs24qKiBlbjogDQoNCiQkDQpcYWxwaGEgPSAwLjA1DQokJA0KLS0tDQoNCiMjIDYuIE3DqXRvZG9zIGRlIGNvbnRyYXN0ZSBwb3NpYmxlcw0KDQojIyMgTcOpdG9kbyBwcmluY2lwYWw6IGNvbnRyYXN0ZSBaIHBhcmEgZG9zIHByb3BvcmNpb25lcyBkZSB1cmFuaW8NCg0KU2UgdXRpbGl6YSBlbCAqKmVzdGFkw61zdGljbyBaIChkb3MgcHJvcG9yY2lvbmVzKSoqcGFyYSBjb21wYXJhciBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgYW1iYXMgcG9ibGFjaW9uZXMuDQoNCiQkDQpaID0NClxmcmFje1xoYXR7cH1fMSAtIFxoYXR7cH1fMn0NCntcc3FydHtcaGF0e3B9KDEgLSBcaGF0e3B9KVxsZWZ0KFxmcmFjezF9e25fMX0gKyBcZnJhY3sxfXtuXzJ9XHJpZ2h0KX19DQokJA0KDQpFc3RlIGNvbnRyYXN0ZSBwZXJtaXRlIGV2YWx1YXIgc2kgbGFzIGRpZmVyZW5jaWFzIG9ic2VydmFkYXMgZW4gZWwgY29udGVuaWRvIGRlIHVyYW5pbyBlbnRyZSBsYXMgZG9zIG11ZXN0cmFzIHNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4NCg0KLS0tDQoNCiMjIyBBbHRlcm5hdGl2YSBtZXRvZG9sw7NnaWNhDQoNCnx8IE3DqXRvZG8gfCBWZW50YWphcyB8IExpbWl0YWNpb25lcyB8IFVzbyB0w61waWNvIHwNCnwtLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfA0KfCBDaGktY3VhZHJhZG8gfCBFbmZvcXVlIGFsdGVybmF0aXZvIGFsIFogZW4gdGFibGFzIGRlIGNvbnRpbmdlbmNpYSB8IE1lbm9zIGRpcmVjdG8gcGFyYSBpbnRlcnByZXRhY2nDs24gZGUgcHJvcG9yY2lvbmVzIHwgVmVyaWZpY2FjacOzbiBkZSBkaWZlcmVuY2lhcyBnbG9iYWxlcyB8DQoNCkEgZGlmZXJlbmNpYSBkZWwgKipjb250cmFzdGUgZGUgcHJvcG9yY2lvbmVzIChaKSoqLCBxdWUgY29tcGFyYSBkaXJlY3RhbWVudGUgbGFzIHByb3BvcmNpb25lcyBlc3RpbWFkYXMgZW4gY2FkYSBtdWVzdHJhLCBlbCAqKmNoaS1jdWFkcmFkbyoqIG1pZGUgc2kgbGFzIGRpZmVyZW5jaWFzIGVuIGVsIHVyYW5pbyBlbnRyZSBsYXMgZG9zIG11ZXN0cmFzIHNvbiBkZW1hc2lhZG8gZ3JhbmRlcyBjb21vIHBhcmEgZXhwbGljYXJzZSBzb2xvIHBvciBjYXN1YWxpZGFkLCBldmFsdWFuZG8gbGEgZGlzY3JlcGFuY2lhIGVudHJlIGxhcyBmcmVjdWVuY2lhcyBvYnNlcnZhZGFzIHkgbGFzIHF1ZSBzZSBlc3BlcmFyw61hbiBzaSBhbWJhcyBwb2JsYWNpb25lcyBmdWVyYW4gaWd1YWxlcy4NCg0KLS0tDQoNCiMjIDcuIFJlZ2xhIGRlIGRlY2lzacOzbg0KDQoNCkxhIGRlY2lzacOzbiBzZSBiYXNhIGVuIGNvbXBhcmFyIGVsICoqcC12YWxvcioqIG9idGVuaWRvIGVuIGVsIGNvbnRyYXN0ZSBzb2JyZSBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgYW1iYXMgbXVlc3RyYXMgY29uIGVsIG5pdmVsIGRlIHNpZ25pZmljYWNpw7NuIFwoXGFscGhhID0gMC4wNVwpLg0KDQotICoqU2kgXChwIDwgMC4wNVwpIHNlIHJlY2hhemEgXChIXzBcKSoqLCBjb25jbHV5ZW5kbyBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgbGFzIG11ZXN0cmFzIEEgeSBCIChwb3NpYmxlIG9yaWdlbiBkaXN0aW50bykuICANCi0gKipTaSBcKHAgXGdlcSAwLjA1XCkgbm8gc2UgcmVjaGF6YSBcKEhfMFwpKiosIGNvbmNsdXllbmRvIHF1ZSBsYXMgZGlmZXJlbmNpYXMgb2JzZXJ2YWRhcyBlbiBlbCBjb250ZW5pZG8gZGUgdXJhbmlvIHNvbiBjb21wYXRpYmxlcyBjb24gbGEgdmFyaWFiaWxpZGFkIGFsZWF0b3JpYSB5IG5vIGhheSBldmlkZW5jaWEgZGUgb3LDrWdlbmVzIGRpc3RpbnRvcy4NCg0KLS0tDQoNCiMjIDguIEludGVycHJldGFjacOzbiBkZWwgcmVzdWx0YWRvDQoNCkEgcGFydGlyIGRlbCAqKnJlc3VsdGFkbyBkZWwgY29udHJhc3RlIHNvYnJlIGxhIHByb3BvcmNpw7NuIGRlIHVyYW5pbyBlbnRyZSBsYXMgbXVlc3RyYXMqKiwgbGEgaW50ZXJwcmV0YWNpw7NuIHNlIGNvbmVjdGEgZGlyZWN0YW1lbnRlIGNvbiBlbCBvYmpldGl2byBkZWwgZXN0dWRpbzogZGV0ZXJtaW5hciBzaSBhbWJhcyBtdWVzdHJhcyBwdWVkZW4gcHJvY2VkZXIgZGVsIG1pc21vIG9yaWdlbi4NCg0KLSAqKlJlY2hhem8gZGUgXChIXzBcKToqKiBzZSBjb25jbHV5ZSBxdWUgZXhpc3RlbiBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbiBsYSBwcm9wb3JjacOzbiBkZSB1cmFuaW8gZW50cmUgbGFzIG11ZXN0cmFzLiBFc3RvIGluZGljYSBxdWUgbGEgY29tcG9zaWNpw7NuIHF1w61taWNhIG5vIGVzIGNvbXBhdGlibGUgYmFqbyB1biBtaXNtbyBwYXRyw7NuIGRlIGdlbmVyYWNpw7NuLCBwb3IgbG8gcXVlIGVzIHJhem9uYWJsZSBjb25zaWRlcmFyIHF1ZSBsYXMgbXVlc3RyYXMgcG9kcsOtYW4gcHJvY2VkZXIgZGUgZnVlbnRlcyBkZSBvcmlnZW4gZGlzdGludGFzLg0KDQotICoqTm8gcmVjaGF6byBkZSBcKEhfMFwpOioqIG5vIHNlIGVuY3VlbnRyYW4gZGlmZXJlbmNpYXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMgZW4gbGEgcHJvcG9yY2nDs24gZGUgdXJhbmlvLiBFbiBlc3RlIGNhc28sIGxhcyB2YXJpYWNpb25lcyBvYnNlcnZhZGFzIHNlIGludGVycHJldGFuIGNvbW8gcmVzdWx0YWRvIGRlIGxhIHZhcmlhYmlsaWRhZCBhbGVhdG9yaWEgZGVsIG11ZXN0cmVvLCBwb3IgbG8gcXVlIGxvcyBkYXRvcyBzb24gY29tcGF0aWJsZXMgY29uIGxhIGhpcMOzdGVzaXMgZGUgdW4gbWlzbW8gb3JpZ2VuIHBhcmEgYW1iYXMgbXVlc3RyYXMuDQoNCjxicj4NCg0KDQojIyBSZWZlcmVuY2lhcw0KDQotIFRyaW9sYSwgTS4gRi4gKDIwMTgpLiAqRXN0YWTDrXN0aWNhKiAoMTLCqiBlZC4pLiBQZWFyc29uIEVkdWNhY2nDs24uICANCi0gRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gYXBveW8gZGUgaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwgKENoYXRHUFQpLg0K