Visualización
library(rio)
res2016 = import("resultados2016.xlsx")
Una de las tareas más comunes en el manejo de datos es la
visualización de los resultados. En R hay dos maneras de proceder. La
primera es usar los comandos de base de R. La otra es usar una librería
ggplot2
que permite una mayor flexibilidad en la producción
y estética de los gráficos.
Para esto se carga la librería ggplot2
. Esta tiene un
comando ggplot
en el que se define los aspectos del
gráfico. Por ejemplo, para graficar una variable numérica, como el
porcentaje de voto a FP por provincia, se puede producir un
histograma.
Dentro de este comando se define la base de datos y la variable que
se va a graficar. Luego se van agregando capas. La primera define el
tipo de gráfico. Usamos geom_histogram
para producir el
histograma y se especifica el ancho de columna. Luego se define las
etiquetas de ejes y el tema del gráfico.
Se observa que el gráfico de porcentaje de votos a Fuerza Popular es
aproximadamente simétrico, tal como indicaban la similitud entre media y
mediana.
library(ggplot2)
ggplot(res2016, aes(x=fp))+
geom_histogram(binwidth = 5)+
xlab("% Voto FP 2016") +
ylab("Frecuencia")+
theme_minimal()
Habíamos encontrado que la media y la mediana del porcentaje de voto
al Frente Amplio diferían. Esto lo comprobamos produciendo el histograma
de esta variable.
ggplot(res2016, aes(x=fa))+
geom_histogram(binwidth = 5)+
geom_vline(xintercept = 29.3, color = "red")+
geom_vline(xintercept = 24.5, color = "green")+
xlab("% Voto FA 2011")+
ylab("Frecuencia")+
theme_classic()
Otro gráfico útil en la visualización es el llamado “boxplot” o
“gráfico de cajas”. Este tipo de gráficos sirve bastante para comparar
entre grupos de otra variable.
Para producir un gráfico de cajas usamos la especificación
geom_bloxplot()
y podemos definir los límites y saltos del
eje Y. Este gráfico nos muestra que el distrito con el menor porcentaje
de voto a FP tuvo un poco más de 5% y que el máximo fue de casi 80%.
También muestra que la votación mediana fue de 40%. Los límites de la
caja son el cuartil 25 y el cuartil 75.
ggplot(res2016, aes(y=fp))+
geom_boxplot()+
ylab("% Voto FP 2011")
El aspecto más útil de los gráficos de cajas es la comparación. Por
ejemplo, si se quisiera comparar el voto a Fuerza Popular entre
departamentos del país. Para hacer esto se debe definir que la variable
en el eje Y sea el porcentaje de votos a Fuerza Popular “fp” y en el eje
X la variable que define los departamentos “dpto”.
En el gráfico se pueden hacer varias comparaciones. Lo más importante
es comparar medianas y anchos de cajas entre departamentos. Los puntos
aislados son “outliers” o valores extremos, que se calculan
automáticamente y se grafican.
Este gráfico, sin embargo, es muy desagragado.
ggplot(res2016, aes(y=fp, x=dpto))+
geom_boxplot()+
scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 10))+
ylab("% Voto FP 2011")+
xlab("Departamento")+
theme_minimal()
Si se quisiera comparar entre regiones (costa, sierra y selva), se
tendría que crear esta variable, a partir de la variable “dpto”.
Recodificando variables
library(tidyverse)
res2016 = res2016 %>%
mutate(region = case_when(
dpto=="AMAZONAS"~3,
dpto=="ANCASH"~2,
dpto=="APURIMAC"~2,
dpto=="AREQUIPA"~2,
dpto=="AYACUCHO"~2,
dpto=="CAJAMARCA"~2,
dpto=="CUSCO"~2,
dpto=="CALLAO"~1,
dpto=="HUANCAVELICA"~2,
dpto=="HUANUCO"~3,
dpto=="ICA"~1,
dpto=="JUNIN"~2,
dpto=="LA LIBERTAD"~1,
dpto=="LAMBAYEQUE"~1,
dpto=="LIMA"~1,
dpto=="LORETO"~3,
dpto=="MADRE DE DIOS"~3,
dpto=="MOQUEGUA"~1,
dpto=="PASCO"~2,
dpto=="PIURA"~1,
dpto=="PUNO"~2,
dpto=="SAN MARTIN"~3,
dpto=="TACNA"~1,
dpto=="TUMBES"~1,
dpto=="UCAYALI"~3
))
res2016 %>%
count(Region = region, name="Frecuencia")
## Region Frecuencia
## 1 1 49
## 2 2 104
## 3 3 43
La variable creada es una variable de tipo “numérico”. En R existe
otro tipo de variable llamado “factor”. Podemos convertir cualquier
variable a una de factor y etiquetar cada valor.
library(forcats)
res2016 = res2016 %>%
mutate(region2 = factor(region, labels=c("Costa", "Sierra", "Selva")))
Ahora, procedemos a producir el gráfico de cajas de porcentaje de
voto a Fuerza Popular por región.
ggplot(res2016, aes(y=fp, x=region2))+
geom_boxplot()+
scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, 20))+
ylab("% Voto FP 2016")+
xlab("Región")+
theme_get()
Se observa en este gráfico que el voto mediano a Fuerza Popular fue
mayor entre provincias de la costa, seguido por la selva y luego la
sierra. Este mismo patrón se observa si calculáramos la media del
porcentaje de voto provincial a Fuerza Popular por región.
res2016 %>%
group_by(region2) %>%
summarise(mean(fp), sd(fp))
## # A tibble: 3 × 3
## region2 `mean(fp)` `sd(fp)`
## <fct> <dbl> <dbl>
## 1 Costa 49.6 13.6
## 2 Sierra 32.5 14.0
## 3 Selva 45.0 13.6
Caso 1: ¿los peruanos leen?
Pregunta: Existe un sentido común que indica que los peruanos no
leen. ¿Es aquello cierto? ¿Existen diferencias de género o
socioeconómicas en los niveles de lectura?
Para responder a esta pregunta, usaremos la Encuesta Nacional de
Lectura de 2022.
library(rio)
enl = import("/Users/Arturo/Library/CloudStorage/GoogleDrive-arturo.maldonado@pucp.pe/My Drive/A Cursos/Estadistica_1/Data/ENL2022/ENL2022.sav")
Esta encuesta tiene una pregunta que indaga directamente (P408).
Cuando se importa los datos a R, esta variable se importa como una
variable numérica, cuando en realidad, es una variable de tipo
factor.
Se usa el comando mutate
para crear una nueva variable y
el comando factor
para transformar la variable numérica a
una de factor con sus respectivos labels
.
library(tidyverse)
enl = enl %>%
mutate(lee = factor(P408, labels=c("Sí", "No")))
Descripción de variables de factor
Para describir variables que no son numéricas, podemos producir
tablas de distribución de frecuencias. Por ejemplo, podemos describir la
variable “lee” de la base de datos. Podemos usar el comando
count
para calcular la tabla de distribución de frecuencias
de esta variable. Se guarda esta tabla en un objeto “tabla1”.
tabla1 = enl %>%
filter(lee == "Sí" | lee == "No") |>
count(Lee = lee, name="Frecuencia")
tabla1
## Lee Frecuencia
## 1 Sí 18929
## 2 No 22714
Para calcular los porcentajes, se puede agregar a la tabla una
columna “Porcentaje” con el cálculo de la “Frecuencia” (columna
existente) ente la suma total de las frecuencias. Se encuentra que
Fuerza Popular ganó en el 57% de provincias del Perú.
tabla1 = tabla1 %>%
mutate(Porcentaje = (Frecuencia / sum(Frecuencia)*100 ))
tabla1
## Lee Frecuencia Porcentaje
## 1 Sí 18929 45.45542
## 2 No 22714 54.54458
Para graficar una variable de tipo cualitativa (o de factor en el
lenguaje de R), se debe usar, por ejemplo, un gráfico de barras. Podemos
graficar estos porcentajes.
Para esto usamos la librería ggplot2
, pero ahora no
realizaremos un histograma (no usaremos geom_histogram
),
sino barras, con geom_bar
. Dentro de este comando se añade
stat="identity
para indicar que R no calcule nada y solo
use los datos de “tabla”.
library(ggplot2)
graf1 = ggplot(tabla1, aes(x=Lee,y=Porcentaje))+
geom_bar(stat="identity", width=0.5)
graf1
La encuesta también incluye la pregunta P209 sobre género. Esta
variable se importa como una numérica, por lo que nuevamente la
transformamos en una variable de tipo factor “sexo” con sus
etiquetas.
enl = enl %>%
mutate(sexo = factor(P209, labels=c("Hombre", "Mujer")))
Ahora usamos esta variable para calcular las frecuencias y
porcentajes por grupos de sexo.
tabla2 = enl %>%
filter(lee == "Sí" | lee == "No") %>%
group_by(sexo) %>%
count(Lee = lee, name="N")%>%
mutate(total = sum(N),
Por = N / total * 100)
tabla2
## # A tibble: 4 × 5
## # Groups: sexo [2]
## sexo Lee N total Por
## <fct> <fct> <int> <int> <dbl>
## 1 Hombre Sí 8307 19759 42.0
## 2 Hombre No 11452 19759 58.0
## 3 Mujer Sí 10622 21884 48.5
## 4 Mujer No 11262 21884 51.5
La tabla nos indica los porcentajes de los que sí leen y los que no
leen por sexo. Como solo queremos graficar los porcentajes de los que sí
leen, podemos eliminar las filas de los que no leen.
tabla2 = tabla2[-c(2,4),]
Con esta tabla reducida, podemos graficas usando ggplot
.
Ahora agregamos la capa geom_text
para incluir el dato del
porcentaje dentro del gráfico.
graf2 = ggplot(tabla2, aes(x=sexo, y=Por))+
geom_bar(stat="identity")+
geom_text(aes(label=paste(round(Por, 1))), vjust=-1, size=3)+
labs(x="Sexo", y="Porcentaje")+
theme_classic()
graf2
La base de datos incluye una variable “nse”, que refiere al nivel
socioeconómico de la persona que responde. Este nivel socioeconómico
está categorizado en 4 niveles.
enl = enl %>%
mutate(nse1 = factor(nse, labels=c("Rural", "Bajo", "Medio", "Alto")))
Pasamos a calcular los porcentajes de lectura por los 4 niveles
socioeconómicos.
tabla3 = enl %>%
filter(lee == "Sí" | lee == "No") %>%
group_by(nse1) %>%
count(Lee = lee, name="N")%>%
mutate(total = sum(N),
Por = N / total * 100)
tabla3
## # A tibble: 8 × 5
## # Groups: nse1 [4]
## nse1 Lee N total Por
## <fct> <fct> <int> <int> <dbl>
## 1 Rural Sí 1431 4819 29.7
## 2 Rural No 3388 4819 70.3
## 3 Bajo Sí 8684 20815 41.7
## 4 Bajo No 12131 20815 58.3
## 5 Medio Sí 4254 8301 51.2
## 6 Medio No 4047 8301 48.8
## 7 Alto Sí 4560 7708 59.2
## 8 Alto No 3148 7708 40.8
Nuevamente eliminamos las filas de los porcentajes de aquellos que no
leen.
tabla3 = tabla3[-c(2,4,6,8),]
Y graficamos los porcentajes de los que sí leen por niveles
socioeconómicos.
graf3 = ggplot(tabla3, aes(x=nse1, y=Por))+
geom_bar(stat="identity")+
geom_text(aes(label=paste(round(Por, 1))), vjust=-1, size=3)+
labs(x="NSE", y="Porcentaje")+
theme_classic()
graf3
Tarea
Se encontró que una mayor proporción de mujeres que hombres lee.
¿Cuántos libros impresos y digitales lee el peruano promedio? ¿Existen
diferencias entre hombres y mujeres entre el promedio de libros impresos
y digitales que leen? ¿Entre niveles socioeconómicos?
Caso 2: Encuesta Nacional Docente 2020
Cada dos años, el Ministerio de Educación realiza una encuesta a una
muestra de docentes de educación básica en el Perú. La última disponible
fue hecha en 2020, en medio de la pandemia del COVID-19. Las bases de
datos y cuestionarios de esta encuesta se encuentran disponibles aquí.
En esta ubicación se encuentra la base de datos, que puede ser
descargada y leída en R con el siguiente código.
library(rio)
endo2020 = import("bases/ENDO_REMOTO_2020.dta")
#CAMBIAR A PROPIO DIRECTORIO DE TRABAJO
Estimación puntual
De una variable numérica, la medida de tendencia central más útil es
la media. La encuesta a docentes incluye la pregunta:
- ¿A cuántos estudiantes le brinda acompañamiento como docente de aula
en esta IE? (Ver cuestionario)
De esta pregunta podemos preguntarnos: ¿A cuántos alumnos en promedio
acompaña el docente peruano en aula? Esta encuesta tiene una pregunta
que nos permite calcular esta media y la desviación estándar.
library(dplyr)
library(tidyverse)
endo2020 %>%
summarize(Media =mean(P1_6, na.rm = T), Desv.Std = sd(P1_6, na.rm = T))
## Media Desv.Std
## 1 39.98644 50.76707
Es decir, un profesor promedio en Perú acompaña aproximadamente a 40
alumnos en aula. ¿Existen diferencias en el número promedio de alumnos
que acompañan docentes hombres y docentes mujeres?
Cuando se importa la base de datos, la variable sexo, P1_1, es
definida como numérica.
str(endo2020$P1_1)
## num [1:28216] 1 2 2 NA NA 2 1 NA NA NA ...
## - attr(*, "label")= chr "Sexo"
## - attr(*, "format.stata")= chr "%12.0g"
## - attr(*, "labels")= Named num [1:2] 1 2
## ..- attr(*, "names")= chr [1:2] "Masculino" "Femenino"
La podemos transformar a una variable de tipo factor.
endo2020 = endo2020 %>%
mutate(sexo = factor(P1_1, labels=c("Hombre", "Mujer")))
Calculamos los datos para hombres y mujeres.
tabla1 = endo2020 %>%
group_by(sexo) %>%
summarize(Media = mean(P1_6, na.rm = T),
Desv.Std = sd(P1_6, na.rm = T),
Mediana = median(P1_6, na.rm = T))
tabla1
## # A tibble: 3 × 4
## sexo Media Desv.Std Mediana
## <fct> <dbl> <dbl> <dbl>
## 1 Hombre 52.2 60.4 28
## 2 Mujer 34.1 44.2 22
## 3 <NA> NaN NA NA
Se encuentra que los docentes hombres acompañan, en promedio, a 52
alumnos, mientras que las docentes mujeres acompañan a 34 alumnos, una
diferencia de 18 alumnos en promedio.
Todos estos resultados son puntuales y aplican para la muestra de
28,216 profesores.
Para una comparación gráfica, se puede usar boxplot.
library(ggplot2)
ggplot(endo2020, aes(y=P1_6, x=sexo))+
geom_boxplot()
## Warning: Removed 9266 rows containing
## non-finite outside the scale
## range (`stat_boxplot()`).
endo2020 = endo2020 %>%
mutate(condicion = factor(P1_7, labels=c("Nombrado", "Contratado x concurso", "Contratado otro")))
tabla2 = endo2020 %>%
group_by(condicion) %>%
summarize(Media = mean(P1_6, na.rm = T),
Desv.Std = sd(P1_6, na.rm = T),
Mediana = median(P1_6, na.rm = T))
tabla2
## # A tibble: 4 × 4
## condicion Media Desv.Std Mediana
## <fct> <dbl> <dbl> <dbl>
## 1 Nombrado 36.9 48.0 23
## 2 Contratado x concurso 43.7 53.6 23
## 3 Contratado otro 50.6 66.1 23
## 4 <NA> NaN NA NA
library(ggplot2)
library(tidyverse)
endo2020 %>%
drop_na(P1_6) %>%
ggplot(aes(y=P1_6, x=condicion))+
geom_boxplot()
ggplot(subset(endo2020, !is.na(P1_6)), aes(y=P1_6, x=condicion))+
geom_boxplot()
Si se quiere hacer un gráfico de barras simples para mostrar la media
del número de alumnos por sexo del profesor, se puede usar:
ggplot(tabla1, aes(x=sexo, y=Media)) +
geom_bar(stat = "identity") +
ggtitle("Número de alumnos promedio por sexo del docente") +
xlab("Sexo del docente") +
geom_text(aes(label=round(Media,1)), vjust=1.30, color="white", size=3)+
theme_minimal()
## Warning: Removed 1 row containing
## missing values or values
## outside the scale range
## (`geom_bar()`).
## Warning: Removed 1 row containing
## missing values or values
## outside the scale range
## (`geom_text()`).
¿Cómo se pueden extrapolar estos resultados al universo de profesores
peruanos?
Estimación por intervalos
Tanto la media muestral, como la proporción muestral, son
estimaciones puntuales, basados en los resultados de la muestra. Es
decir, estas son estimaciones correspondientes a las 28,216
observaciones que son parte de este estudio. Sin embargo, esta muestra
forma parte de un universo o población (el conjunto de profesores del
Perú), del que seguramente se quiere decir algo.
El mismo razonamiento aplica a una encuesta de opinión convencional.
La ficha técnica de una encuesta menciona, generalmente, el tamaño de
muestra y la población a la que se busca representar. También se puede
encontrar el margen de error (+/- 2.8%) y el nivel de confianza
(generalmente de 95%).(Ver, por ejemplo, la encuesta
de opinión de agosto 2023 de Ipsos.
El proceso mediante el cual se parte de una muestra para decir algo
de un universo o población es un proceso de inferencia y es parte de la
estadística inferencial. La estadística inferencial introduce la
incertidumbre en los estimados, debido al hecho de
estar trabajando con una muestra y no con el total de observaciones del
universo.
Un breve paseo por las probabilidades
Partimos del hecho que en el común de las investigaciones uno tiene
que seleccionar un conjunto de observaciones que son parte del total,
que es muy costoso e ineficiente hacer un estudio de la población
completa. La analogía es, por ejemplo, que para un análisis de sangre se
extrae una “muestra” de sangre y no el total de sangre del cuerpo.
A esto le sumamos el hecho que nuestras herramientas de recojo de
información son imperfectas. Un estudio transversal, por ejemplo,
debería recoger información de los individuos en un corte en el tiempo,
sin embargo, muchos estudios no son una “foto del momento”, pues las
observaciones toman tiempo y abarcan horas, días o semanas, sino
meses.
Es por este motivo que para un estudio se selecciona “una” muestra,
un conjunto de observaciones que son una fracción del total. Esta
selección se hace siguiendo procedimientos aleatorios, de tal manera que
cualquier unidad del universo tenga la misma probabilidad de ser
seleccionada.
El punto es que esta única muestra es solo una de las múltiples
muestras teóricas que se podrían seleccionar de un universo
determinado.
Partamos de un ejemplo muy simple. Para un universo de 5 personas, se
pueden extraer 10 muestras de tamaño 2 diferentes.
La fórmula para calcular el número de muestras probables es la de
combinatorias, que incluye el operador factorial. Si aplicamos esta
fórmula a un ejemplo de un universo más grande, por ejemplo, un salón de
clase de 50 alumnos, donde se quiere saber cuántas muestras diferentes
de tamaño 4 se pueden extraer. Según la fórmula:
\[
\frac{50!} {(50-4)! 4!} = \frac{50!} {46! 4!} = \frac{50*49*48*47}
{4*3*2} = 230,300
\]
Para un sondeo de opinión, donde el universo son 24 millones de
individuos y se quiere saber cuántas muestras diferentes de tamaño 1,500
se pueden extraer, este número de muestras probables es muuuuy
grande.
Volviendo al ejemplo muy simple de 5 personas donde se quiere extraer
una muestra de 2 y se quiere inferir los datos de la muestra de dos
variables: sexo y edad.
Se tiene un universo de 5 individuos, cada uno con su sexo y edad. En
la población la proporción de hombres es de 60% y la media de edad es de
34 años.
Si queremos extraer una muestra de tamaño de 2 de ese universo, se
tienen 10 posibles muestras, cada una tendrá una aproximación de la
proporción de hombres y de la media de edad. Dependiendo de qué muestra
de todas las posibles sea la que se observa, los estadísticos serán una
aproximación de los parámetros poblacionales.
En el caso de la proporción de hombres, se puede tabular los
resultados de cada muestra probable.
0% |
1 |
X |
50% |
5 |
XXXXX |
100% |
4 |
XXXX |
Incluso se podría calcular un promedio de todas esas proporciones
muestrales (100+50+100+…+50/10), y ese resultado sería 65%, un resultado
algo cerca de la proporción poblacional de 60%.
Este mismo procedimiento se podría hacer para todas las 230,300
muestras probables de tamaño 4 de un universo de 50 alumnos. Cada uno de
los 50 alumnos será hombre o mujer y la proporción poblacional de
hombres se puede calcular en ese total. A su vez, cada muestra de 4,
tendrá una proporción muestral que tendrá valores (0 si no hay ningún
hombre, 25% si hay 1 hombre, 50% si hay 2 hombres, 75% si hay 3 hombres
y 100% si todos son hombres). Finalmente, se puede contar cuántas de las
230,300 muestras probables tuvieron 0%, 25%, 50%, 75% y 100% de hombres.
Esta distribución se llama “distribución de
muestreo”.
Si quisiéramos ampliar el tamaño de muestra a 10, entonces los
resultados posibles serían, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 y
100%. También podríamos contar cuántas muestras tienen estos
resultados.
De un universo más grande, se puede plantear extraer muestras de
tamaño más grande. Por ejemplo, teóricamente se puede pensar que de un
universo de 20 millones, se pueden extraer casi infinitas muestras de
tamaño 1,500. Cada una de estas muestras tendrá un estadístico que será
una aproximación del parámetro. Los estadísticos de todas estas casi
infinitas muestras se pueden tabular y graficar.
Teorema del límite central
Este teorema muestra que la distribución de muestreo se
aproxima a una distribución normal, con centro en el parámetro,
en la medida que el tamaño de muestra aumenta.
Esto se puede mostrar gráficamente en el Tablero de Galton, ver aquí
Por lo tanto, la distribución de muestreo de N grandes para cualquier
variable seguirá las características de cualquier curva normal. Toda
curva normal es simétrica y sabemos que si desde el centro se desplaza 1
desviación estándar en ambas direcciones, entre esos límites estarán el
68.3% de todas las observaciones. Si se desplaza 2 desviaciones estándar
en ambas direcciones, se acumularían el 95.4% de todas las
observaciones. Con 3 desviaciones estándar hacia ambos lados, se
acumularía el 99.7% de todas las observaciones.
Traduciendo a la distribución de muestreo, la idea es que si se
tabulan y se hace un gráfico de barras de los resultados de todas las
muestras probables, se tendría una curva normal con centro en el
parámetro. Sabríamos que si desde ese centro nos desplazamos 2
desviaciones estándar en ambas direcciones, entre esos límites estarían
el 95% de todas las muestra probables.
Es altamente probable (95% probable) que si en una investigación se
extrae una sola muestra, esta sea parte del 95% de muestras posibles a
+/- 2 desviaciones estándar del parámetro. De la misma manera, es poco
probable (5% probable) que una sola muestra no esté a +/- 2 desviaciones
estándar del parámetro.
Estimación de intervalos de confianza
La distribución de muestreo es teórica, muy difícilmente se puede
calcular en la realidad. Regularmente tampoco sabemos los datos del
universo. Lo que tenemos a mano es 1 muestra observada.
Es decir, en un estudio de las muuuuuchas muestras probables, se
selecciona 1 muestra.
En el caso de la encuesta ENDO, por ejemplo, del universo de
profesores peruanos, se seleccionó 1 muestra de 28,216 observaciones, de
las muuuuchas muestras de 28,216 individuos de la población total.
Si teóricamente sabemos que en la distribución muestral, el 95% de
todas las muestras están a +/- 2 desviaciones estándar del centro, que
coincide con el parámetro poblacional, es muy probable que la única
muestra que se ha observado sea parte de ese conjunto. De hecho, se
puede decir que se tiene 95% de probabilidades de que sea parte de ese
grupo.
Por lo tanto, si a partir del estadístico muestral, se aplica esta
distancia de +/- 2 errores estándar, se tiene 95% de probabilidades que
entre esos límites se incluya al valor del parámetro. Para verlo de
manera más visual, en la siguiente figura se tiene la distribución de
muestreo teórica (y desconocida), donde se marca la región que acumula
el 95% de todas las muestras probables.
Más abajo se marca los resultados de 2 muestras observadas. La
primera proporción muestral subestima la proporción poblacional. La
segunda, por el contrario, sobreestima la proporción poblacional. En el
primer caso, si a partir del estadístico muestral se aplica +/- 1.96
errores estándar (línea horizontal en negrita), se observa que el
parámetro poblacional está incluido en esos límites.
Es probable, como en el segundo caso, que otra muestra probable,
cuando se le aplique el intervalo de +/- 1.96 errores estándar, no
incluya al parámetro. Se observa que la línea en negrita no incluye la
linea vertical entrecortada que marca el valor del parámetro
poblacional.
Sin embargo, sabemos que es mucho más probable (95% de
probabilidades) que si una muestra observada es parte del 95% de
muestras alrededor del parámetro, este intervalo incluya al parámetro
poblacional. A estos límites le llamamos “intervalos de confianza”.
En cualquier investigación solo se cuenta con una muestra observada,
cuyo estadístico muestral, sea una media o un proporción, es una
aproximación del parámetro poblacional.
Para poder extrapolar desde la muestra hasta la población, se tiene
que construir un intervalo de confianza alrededor del estadístico
muestral. Este intervalo se construye aplicando la “distancia” de +/-
1.96 errores estándar, para tener una confianza de 95% de incluir al
parámetro poblacional.
Si se está extrapolando para una variable numérica, mediante la
media, el error estándar (o se) es:
\[
se = 1.96 * \frac{s} {\sqrt{n}}
\]
Si se está extrapolando para una variable categórica, mediante una
proporción, el error estándar (o se) es:
\[
se = 1.96 * \sqrt{\frac{(p * (1-p))} {n}}
\]
A manera de resumen, la siguiente tabla nos muestra el parámetro, el
estadístico puntual y el error estándar para cada tipo de variable y
cómo se forma el intervalo de confianza.
En estas fórmulas, se usa el símbolo “t” y “z” para referir a las
distribuciones teóricas que se usan. Para fines prácticos, cuando la
muestra es grande, ambas distribuciones son iguales. El valor de “t” o
“z” depende del nivel de confianza que queremos. Es decir, de la
probabilidad que queremos de que el intervalo incluya al parámetro. De
esta manera:
Z al 90% = 1.645
Z al 95% = 1.96
Z al 98% = 2.326
Z al 99% = 2.576
¿Qué pasa con el IC cuando se quiere mayor confianza? ¿Se vuelve más
o menos preciso?
En el ejemplo del cálculo del promedio de alumnos que atiende los
profesores, se puede añadir el cálculo de los intervalos de confianza en
ambos casos, para hombres y mujeres. El comando para hacer esto es
ciMean
que es parte de la librería lsr
.
library(lsr)
ciMean(endo2020$P1_6, na.rm = T)
## 2.5% 97.5%
## [1,] 39.26358 40.7093
Si se calculan los intervalos de confianza por grupos, estos se
pueden comparar.
library(lsr)
ci_alumxsexo = endo2020 |>
group_by(sexo) |>
summarise(Media = mean(P1_6, na.rm=T),
min = ciMean(P1_6, na.rm=T)[1],
max = ciMean(P1_6, na.rm=T)[2]
)
ci_alumxsexo
## # A tibble: 3 × 4
## sexo Media min max
## <fct> <dbl> <dbl> <dbl>
## 1 Hombre 52.2 50.7 53.8
## 2 Mujer 34.1 33.3 34.8
## 3 <NA> NaN NA NA
Se encuentra que la media de alumnos que atiende un docente hombre
esta entre 50.7 y 53.8 alumnos, mientras que en el caso de las docentes
mujeres está entre 33.3 y 34.8 alumnos en aula.
¿Qué más se puede decir de esta comparación entre intervalos de
confianza? ¿Cómo graficar estos intervalos de confianza?
Bibliografía
LS0tCnRpdGxlOiAnQ2xhc2UgMzogVmlzdWFsaXphY2nDs24nCmF1dGhvcjogIkFydHVybyBNYWxkb25hZG8iCmRhdGU6ICIzLzkvMjAyMyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogY29zbW8KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUKZWRpdG9yX29wdGlvbnM6CiAgbWFya2Rvd246CiAgICB3cmFwOiBzZW50ZW5jZQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgVmlzdWFsaXphY2nDs24KCmBgYHtyfQpsaWJyYXJ5KHJpbykKcmVzMjAxNiA9IGltcG9ydCgicmVzdWx0YWRvczIwMTYueGxzeCIpCmBgYAoKVW5hIGRlIGxhcyB0YXJlYXMgbcOhcyBjb211bmVzIGVuIGVsIG1hbmVqbyBkZSBkYXRvcyBlcyBsYSB2aXN1YWxpemFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4KRW4gUiBoYXkgZG9zIG1hbmVyYXMgZGUgcHJvY2VkZXIuCkxhIHByaW1lcmEgZXMgdXNhciBsb3MgY29tYW5kb3MgZGUgYmFzZSBkZSBSLgpMYSBvdHJhIGVzIHVzYXIgdW5hIGxpYnJlcsOtYSBgZ2dwbG90MmAgcXVlIHBlcm1pdGUgdW5hIG1heW9yIGZsZXhpYmlsaWRhZCBlbiBsYSBwcm9kdWNjacOzbiB5IGVzdMOpdGljYSBkZSBsb3MgZ3LDoWZpY29zLgoKUGFyYSBlc3RvIHNlIGNhcmdhIGxhIGxpYnJlcsOtYSBgZ2dwbG90MmAuCkVzdGEgdGllbmUgdW4gY29tYW5kbyBgZ2dwbG90YCBlbiBlbCBxdWUgc2UgZGVmaW5lIGxvcyBhc3BlY3RvcyBkZWwgZ3LDoWZpY28uClBvciBlamVtcGxvLCBwYXJhIGdyYWZpY2FyIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EsIGNvbW8gZWwgcG9yY2VudGFqZSBkZSB2b3RvIGEgRlAgcG9yIHByb3ZpbmNpYSwgc2UgcHVlZGUgcHJvZHVjaXIgdW4gaGlzdG9ncmFtYS4KCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgZGVmaW5lIGxhIGJhc2UgZGUgZGF0b3MgeSBsYSB2YXJpYWJsZSBxdWUgc2UgdmEgYSBncmFmaWNhci4KTHVlZ28gc2UgdmFuIGFncmVnYW5kbyBjYXBhcy4KTGEgcHJpbWVyYSBkZWZpbmUgZWwgdGlwbyBkZSBncsOhZmljby4KVXNhbW9zIGBnZW9tX2hpc3RvZ3JhbWAgcGFyYSBwcm9kdWNpciBlbCBoaXN0b2dyYW1hIHkgc2UgZXNwZWNpZmljYSBlbCBhbmNobyBkZSBjb2x1bW5hLgpMdWVnbyBzZSBkZWZpbmUgbGFzIGV0aXF1ZXRhcyBkZSBlamVzIHkgZWwgdGVtYSBkZWwgZ3LDoWZpY28uCgpTZSBvYnNlcnZhIHF1ZSBlbCBncsOhZmljbyBkZSBwb3JjZW50YWplIGRlIHZvdG9zIGEgRnVlcnphIFBvcHVsYXIgZXMgYXByb3hpbWFkYW1lbnRlIHNpbcOpdHJpY28sIHRhbCBjb21vIGluZGljYWJhbiBsYSBzaW1pbGl0dWQgZW50cmUgbWVkaWEgeSBtZWRpYW5hLgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QocmVzMjAxNiwgYWVzKHg9ZnApKSsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpKwogIHhsYWIoIiUgVm90byBGUCAyMDE2IikgKwogIHlsYWIoIkZyZWN1ZW5jaWEiKSsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpIYWLDrWFtb3MgZW5jb250cmFkbyBxdWUgbGEgbWVkaWEgeSBsYSBtZWRpYW5hIGRlbCBwb3JjZW50YWplIGRlIHZvdG8gYWwgRnJlbnRlIEFtcGxpbyBkaWZlcsOtYW4uCkVzdG8gbG8gY29tcHJvYmFtb3MgcHJvZHVjaWVuZG8gZWwgaGlzdG9ncmFtYSBkZSBlc3RhIHZhcmlhYmxlLgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeD1mYSkpKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjkuMywgY29sb3IgPSAicmVkIikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjQuNSwgY29sb3IgPSAiZ3JlZW4iKSsKICB4bGFiKCIlIFZvdG8gRkEgMjAxMSIpKwogIHlsYWIoIkZyZWN1ZW5jaWEiKSsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgpPdHJvIGdyw6FmaWNvIMO6dGlsIGVuIGxhIHZpc3VhbGl6YWNpw7NuIGVzIGVsIGxsYW1hZG8gImJveHBsb3QiIG8gImdyw6FmaWNvIGRlIGNhamFzIi4KRXN0ZSB0aXBvIGRlIGdyw6FmaWNvcyBzaXJ2ZSBiYXN0YW50ZSBwYXJhIGNvbXBhcmFyIGVudHJlIGdydXBvcyBkZSBvdHJhIHZhcmlhYmxlLgoKUGFyYSBwcm9kdWNpciB1biBncsOhZmljbyBkZSBjYWphcyB1c2Ftb3MgbGEgZXNwZWNpZmljYWNpw7NuIGBnZW9tX2Jsb3hwbG90KClgIHkgcG9kZW1vcyBkZWZpbmlyIGxvcyBsw61taXRlcyB5IHNhbHRvcyBkZWwgZWplIFkuCkVzdGUgZ3LDoWZpY28gbm9zIG11ZXN0cmEgcXVlIGVsIGRpc3RyaXRvIGNvbiBlbCBtZW5vciBwb3JjZW50YWplIGRlIHZvdG8gYSBGUCB0dXZvIHVuIHBvY28gbcOhcyBkZSA1JSB5IHF1ZSBlbCBtw6F4aW1vIGZ1ZSBkZSBjYXNpIDgwJS4KVGFtYmnDqW4gbXVlc3RyYSBxdWUgbGEgdm90YWNpw7NuIG1lZGlhbmEgZnVlIGRlIDQwJS4KTG9zIGzDrW1pdGVzIGRlIGxhIGNhamEgc29uIGVsIGN1YXJ0aWwgMjUgeSBlbCBjdWFydGlsIDc1LgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeT1mcCkpKwogIGdlb21fYm94cGxvdCgpKwogIHlsYWIoIiUgVm90byBGUCAyMDExIikKYGBgCgpFbCBhc3BlY3RvIG3DoXMgw7p0aWwgZGUgbG9zIGdyw6FmaWNvcyBkZSBjYWphcyBlcyBsYSBjb21wYXJhY2nDs24uClBvciBlamVtcGxvLCBzaSBzZSBxdWlzaWVyYSBjb21wYXJhciBlbCB2b3RvIGEgRnVlcnphIFBvcHVsYXIgZW50cmUgZGVwYXJ0YW1lbnRvcyBkZWwgcGHDrXMuClBhcmEgaGFjZXIgZXN0byBzZSBkZWJlIGRlZmluaXIgcXVlIGxhIHZhcmlhYmxlIGVuIGVsIGVqZSBZIHNlYSBlbCBwb3JjZW50YWplIGRlIHZvdG9zIGEgRnVlcnphIFBvcHVsYXIgImZwIiB5IGVuIGVsIGVqZSBYIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgbG9zIGRlcGFydGFtZW50b3MgImRwdG8iLgoKRW4gZWwgZ3LDoWZpY28gc2UgcHVlZGVuIGhhY2VyIHZhcmlhcyBjb21wYXJhY2lvbmVzLgpMbyBtw6FzIGltcG9ydGFudGUgZXMgY29tcGFyYXIgbWVkaWFuYXMgeSBhbmNob3MgZGUgY2FqYXMgZW50cmUgZGVwYXJ0YW1lbnRvcy4KTG9zIHB1bnRvcyBhaXNsYWRvcyBzb24gIm91dGxpZXJzIiBvIHZhbG9yZXMgZXh0cmVtb3MsIHF1ZSBzZSBjYWxjdWxhbiBhdXRvbcOhdGljYW1lbnRlIHkgc2UgZ3JhZmljYW4uCgpFc3RlIGdyw6FmaWNvLCBzaW4gZW1iYXJnbywgZXMgbXV5IGRlc2FncmFnYWRvLgoKYGBge3J9CmdncGxvdChyZXMyMDE2LCBhZXMoeT1mcCwgeD1kcHRvKSkrCiAgZ2VvbV9ib3hwbG90KCkrCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSwgYnJlYWtzID0gc2VxKDAsIDEwMCwgMTApKSsKICB5bGFiKCIlIFZvdG8gRlAgMjAxMSIpKwogIHhsYWIoIkRlcGFydGFtZW50byIpKwogIHRoZW1lX21pbmltYWwoKQpgYGAKClNpIHNlIHF1aXNpZXJhIGNvbXBhcmFyIGVudHJlIHJlZ2lvbmVzIChjb3N0YSwgc2llcnJhIHkgc2VsdmEpLCBzZSB0ZW5kcsOtYSBxdWUgY3JlYXIgZXN0YSB2YXJpYWJsZSwgYSBwYXJ0aXIgZGUgbGEgdmFyaWFibGUgImRwdG8iLgoKIyMgUmVjb2RpZmljYW5kbyB2YXJpYWJsZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKcmVzMjAxNiA9IHJlczIwMTYgJT4lCiAgbXV0YXRlKHJlZ2lvbiA9IGNhc2Vfd2hlbigKICAgIGRwdG89PSJBTUFaT05BUyJ+MywKICAgIGRwdG89PSJBTkNBU0gifjIsCiAgICBkcHRvPT0iQVBVUklNQUMifjIsCiAgICBkcHRvPT0iQVJFUVVJUEEifjIsCiAgICBkcHRvPT0iQVlBQ1VDSE8ifjIsCiAgICBkcHRvPT0iQ0FKQU1BUkNBIn4yLAogICAgZHB0bz09IkNVU0NPIn4yLAogICAgZHB0bz09IkNBTExBTyJ+MSwKICAgIGRwdG89PSJIVUFOQ0FWRUxJQ0EifjIsCiAgICBkcHRvPT0iSFVBTlVDTyJ+MywKICAgIGRwdG89PSJJQ0EifjEsCiAgICBkcHRvPT0iSlVOSU4ifjIsCiAgICBkcHRvPT0iTEEgTElCRVJUQUQifjEsCiAgICBkcHRvPT0iTEFNQkFZRVFVRSJ+MSwKICAgIGRwdG89PSJMSU1BIn4xLAogICAgZHB0bz09IkxPUkVUTyJ+MywKICAgIGRwdG89PSJNQURSRSBERSBESU9TIn4zLAogICAgZHB0bz09Ik1PUVVFR1VBIn4xLAogICAgZHB0bz09IlBBU0NPIn4yLAogICAgZHB0bz09IlBJVVJBIn4xLAogICAgZHB0bz09IlBVTk8ifjIsCiAgICBkcHRvPT0iU0FOIE1BUlRJTiJ+MywKICAgIGRwdG89PSJUQUNOQSJ+MSwKICAgIGRwdG89PSJUVU1CRVMifjEsCiAgICBkcHRvPT0iVUNBWUFMSSJ+MwogICkpIApgYGAKCmBgYHtyfQpyZXMyMDE2ICU+JQogIGNvdW50KFJlZ2lvbiA9IHJlZ2lvbiwgbmFtZT0iRnJlY3VlbmNpYSIpCmBgYAoKTGEgdmFyaWFibGUgY3JlYWRhIGVzIHVuYSB2YXJpYWJsZSBkZSB0aXBvICJudW3DqXJpY28iLgpFbiBSIGV4aXN0ZSBvdHJvIHRpcG8gZGUgdmFyaWFibGUgbGxhbWFkbyAiZmFjdG9yIi4KUG9kZW1vcyBjb252ZXJ0aXIgY3VhbHF1aWVyIHZhcmlhYmxlIGEgdW5hIGRlIGZhY3RvciB5IGV0aXF1ZXRhciBjYWRhIHZhbG9yLgoKYGBge3J9CmxpYnJhcnkoZm9yY2F0cykKcmVzMjAxNiA9IHJlczIwMTYgJT4lCiAgbXV0YXRlKHJlZ2lvbjIgPSBmYWN0b3IocmVnaW9uLCBsYWJlbHM9YygiQ29zdGEiLCAiU2llcnJhIiwgIlNlbHZhIikpKQpgYGAKCkFob3JhLCBwcm9jZWRlbW9zIGEgcHJvZHVjaXIgZWwgZ3LDoWZpY28gZGUgY2FqYXMgZGUgcG9yY2VudGFqZSBkZSB2b3RvIGEgRnVlcnphIFBvcHVsYXIgcG9yIHJlZ2nDs24uCgpgYGB7cn0KZ2dwbG90KHJlczIwMTYsIGFlcyh5PWZwLCB4PXJlZ2lvbjIpKSsKICBnZW9tX2JveHBsb3QoKSsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxMDApLCBicmVha3MgPSBzZXEoMCwgMTAwLCAyMCkpKwogIHlsYWIoIiUgVm90byBGUCAyMDE2IikrCiAgeGxhYigiUmVnacOzbiIpKwogIHRoZW1lX2dldCgpCmBgYAoKU2Ugb2JzZXJ2YSBlbiBlc3RlIGdyw6FmaWNvIHF1ZSBlbCB2b3RvIG1lZGlhbm8gYSBGdWVyemEgUG9wdWxhciBmdWUgbWF5b3IgZW50cmUgcHJvdmluY2lhcyBkZSBsYSBjb3N0YSwgc2VndWlkbyBwb3IgbGEgc2VsdmEgeSBsdWVnbyBsYSBzaWVycmEuCkVzdGUgbWlzbW8gcGF0csOzbiBzZSBvYnNlcnZhIHNpIGNhbGN1bMOhcmFtb3MgbGEgbWVkaWEgZGVsIHBvcmNlbnRhamUgZGUgdm90byBwcm92aW5jaWFsIGEgRnVlcnphIFBvcHVsYXIgcG9yIHJlZ2nDs24uCgpgYGB7cn0KcmVzMjAxNiAlPiUgCiAgZ3JvdXBfYnkocmVnaW9uMikgJT4lCiAgc3VtbWFyaXNlKG1lYW4oZnApLCBzZChmcCkpCmBgYAoKIyBDYXNvIDE6IMK/bG9zIHBlcnVhbm9zIGxlZW4/CgoqUHJlZ3VudGE6IEV4aXN0ZSB1biBzZW50aWRvIGNvbcO6biBxdWUgaW5kaWNhIHF1ZSBsb3MgcGVydWFub3Mgbm8gbGVlbi4gwr9FcyBhcXVlbGxvIGNpZXJ0bz8gwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGRlIGfDqW5lcm8gbyBzb2Npb2Vjb27Ds21pY2FzIGVuIGxvcyBuaXZlbGVzIGRlIGxlY3R1cmE/KgoKUGFyYSByZXNwb25kZXIgYSBlc3RhIHByZWd1bnRhLCB1c2FyZW1vcyBsYSBFbmN1ZXN0YSBOYWNpb25hbCBkZSBMZWN0dXJhIGRlIDIwMjIuCgpgYGB7cn0KbGlicmFyeShyaW8pCmVubCA9IGltcG9ydCgiL1VzZXJzL0FydHVyby9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9Hb29nbGVEcml2ZS1hcnR1cm8ubWFsZG9uYWRvQHB1Y3AucGUvTXkgRHJpdmUvQSBDdXJzb3MvRXN0YWRpc3RpY2FfMS9EYXRhL0VOTDIwMjIvRU5MMjAyMi5zYXYiKQpgYGAKCkVzdGEgZW5jdWVzdGEgdGllbmUgdW5hIHByZWd1bnRhIHF1ZSBpbmRhZ2EgZGlyZWN0YW1lbnRlIChQNDA4KS4KQ3VhbmRvIHNlIGltcG9ydGEgbG9zIGRhdG9zIGEgUiwgZXN0YSB2YXJpYWJsZSBzZSBpbXBvcnRhIGNvbW8gdW5hIHZhcmlhYmxlIG51bcOpcmljYSwgY3VhbmRvIGVuIHJlYWxpZGFkLCBlcyB1bmEgdmFyaWFibGUgZGUgdGlwbyBmYWN0b3IuCgpTZSB1c2EgZWwgY29tYW5kbyBgbXV0YXRlYCBwYXJhIGNyZWFyIHVuYSBudWV2YSB2YXJpYWJsZSB5IGVsIGNvbWFuZG8gYGZhY3RvcmAgcGFyYSB0cmFuc2Zvcm1hciBsYSB2YXJpYWJsZSBudW3DqXJpY2EgYSB1bmEgZGUgZmFjdG9yIGNvbiBzdXMgcmVzcGVjdGl2b3MgYGxhYmVsc2AuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmVubCA9IGVubCAlPiUKICBtdXRhdGUobGVlID0gZmFjdG9yKFA0MDgsIGxhYmVscz1jKCJTw60iLCAiTm8iKSkpCmBgYAoKIyMgRGVzY3JpcGNpw7NuIGRlIHZhcmlhYmxlcyBkZSBmYWN0b3IKClBhcmEgZGVzY3JpYmlyIHZhcmlhYmxlcyBxdWUgbm8gc29uIG51bcOpcmljYXMsIHBvZGVtb3MgcHJvZHVjaXIgdGFibGFzIGRlIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYXMuClBvciBlamVtcGxvLCBwb2RlbW9zIGRlc2NyaWJpciBsYSB2YXJpYWJsZSAibGVlIiBkZSBsYSBiYXNlIGRlIGRhdG9zLgpQb2RlbW9zIHVzYXIgZWwgY29tYW5kbyBgY291bnRgIHBhcmEgY2FsY3VsYXIgbGEgdGFibGEgZGUgZGlzdHJpYnVjacOzbiBkZSBmcmVjdWVuY2lhcyBkZSBlc3RhIHZhcmlhYmxlLgpTZSBndWFyZGEgZXN0YSB0YWJsYSBlbiB1biBvYmpldG8gInRhYmxhMSIuCgpgYGB7cn0KdGFibGExID0gZW5sICU+JQogIGZpbHRlcihsZWUgPT0gIlPDrSIgfCBsZWUgPT0gIk5vIikgfD4KICBjb3VudChMZWUgPSBsZWUsIG5hbWU9IkZyZWN1ZW5jaWEiKQp0YWJsYTEKYGBgCgpQYXJhIGNhbGN1bGFyIGxvcyBwb3JjZW50YWplcywgc2UgcHVlZGUgYWdyZWdhciBhIGxhIHRhYmxhIHVuYSBjb2x1bW5hICJQb3JjZW50YWplIiBjb24gZWwgY8OhbGN1bG8gZGUgbGEgIkZyZWN1ZW5jaWEiIChjb2x1bW5hIGV4aXN0ZW50ZSkgZW50ZSBsYSBzdW1hIHRvdGFsIGRlIGxhcyBmcmVjdWVuY2lhcy4KU2UgZW5jdWVudHJhIHF1ZSBGdWVyemEgUG9wdWxhciBnYW7DsyBlbiBlbCA1NyUgZGUgcHJvdmluY2lhcyBkZWwgUGVyw7ouCgpgYGB7cn0KdGFibGExID0gdGFibGExICU+JQogIG11dGF0ZShQb3JjZW50YWplID0gKEZyZWN1ZW5jaWEgLyBzdW0oRnJlY3VlbmNpYSkqMTAwICkpCnRhYmxhMQpgYGAKClBhcmEgZ3JhZmljYXIgdW5hIHZhcmlhYmxlIGRlIHRpcG8gY3VhbGl0YXRpdmEgKG8gZGUgZmFjdG9yIGVuIGVsIGxlbmd1YWplIGRlIFIpLCBzZSBkZWJlIHVzYXIsIHBvciBlamVtcGxvLCB1biBncsOhZmljbyBkZSBiYXJyYXMuClBvZGVtb3MgZ3JhZmljYXIgZXN0b3MgcG9yY2VudGFqZXMuCgpQYXJhIGVzdG8gdXNhbW9zIGxhIGxpYnJlcsOtYSBgZ2dwbG90MmAsIHBlcm8gYWhvcmEgbm8gcmVhbGl6YXJlbW9zIHVuIGhpc3RvZ3JhbWEgKG5vIHVzYXJlbW9zIGBnZW9tX2hpc3RvZ3JhbWApLCBzaW5vIGJhcnJhcywgY29uIGBnZW9tX2JhcmAuCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgYcOxYWRlIGBzdGF0PSJpZGVudGl0eWAgcGFyYSBpbmRpY2FyIHF1ZSBSIG5vIGNhbGN1bGUgbmFkYSB5IHNvbG8gdXNlIGxvcyBkYXRvcyBkZSAidGFibGEiLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ3JhZjEgPSBnZ3Bsb3QodGFibGExLCBhZXMoeD1MZWUseT1Qb3JjZW50YWplKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0wLjUpCmdyYWYxCmBgYAoKTGEgZW5jdWVzdGEgdGFtYmnDqW4gaW5jbHV5ZSBsYSBwcmVndW50YSBQMjA5IHNvYnJlIGfDqW5lcm8uCkVzdGEgdmFyaWFibGUgc2UgaW1wb3J0YSBjb21vIHVuYSBudW3DqXJpY2EsIHBvciBsbyBxdWUgbnVldmFtZW50ZSBsYSB0cmFuc2Zvcm1hbW9zIGVuIHVuYSB2YXJpYWJsZSBkZSB0aXBvIGZhY3RvciAic2V4byIgY29uIHN1cyBldGlxdWV0YXMuCgpgYGB7cn0KZW5sID0gZW5sICU+JQogIG11dGF0ZShzZXhvID0gZmFjdG9yKFAyMDksIGxhYmVscz1jKCJIb21icmUiLCAiTXVqZXIiKSkpCmBgYAoKQWhvcmEgdXNhbW9zIGVzdGEgdmFyaWFibGUgcGFyYSBjYWxjdWxhciBsYXMgZnJlY3VlbmNpYXMgeSBwb3JjZW50YWplcyBwb3IgZ3J1cG9zIGRlIHNleG8uCgpgYGB7cn0KdGFibGEyID0gZW5sICU+JQogIGZpbHRlcihsZWUgPT0gIlPDrSIgfCBsZWUgPT0gIk5vIikgJT4lCiAgZ3JvdXBfYnkoc2V4bykgJT4lCiAgY291bnQoTGVlID0gbGVlLCBuYW1lPSJOIiklPiUKICBtdXRhdGUodG90YWwgPSBzdW0oTiksIAogICAgICAgICBQb3IgPSBOIC8gdG90YWwgKiAxMDApCnRhYmxhMgpgYGAKCkxhIHRhYmxhIG5vcyBpbmRpY2EgbG9zIHBvcmNlbnRhamVzIGRlIGxvcyBxdWUgc8OtIGxlZW4geSBsb3MgcXVlIG5vIGxlZW4gcG9yIHNleG8uCkNvbW8gc29sbyBxdWVyZW1vcyBncmFmaWNhciBsb3MgcG9yY2VudGFqZXMgZGUgbG9zIHF1ZSBzw60gbGVlbiwgcG9kZW1vcyBlbGltaW5hciBsYXMgZmlsYXMgZGUgbG9zIHF1ZSBubyBsZWVuLgoKYGBge3J9CnRhYmxhMiA9IHRhYmxhMlstYygyLDQpLF0KYGBgCgpDb24gZXN0YSB0YWJsYSByZWR1Y2lkYSwgcG9kZW1vcyBncmFmaWNhcyB1c2FuZG8gYGdncGxvdGAuCkFob3JhIGFncmVnYW1vcyBsYSBjYXBhIGBnZW9tX3RleHRgIHBhcmEgaW5jbHVpciBlbCBkYXRvIGRlbCBwb3JjZW50YWplIGRlbnRybyBkZWwgZ3LDoWZpY28uCgpgYGB7cn0KZ3JhZjIgPSBnZ3Bsb3QodGFibGEyLCBhZXMoeD1zZXhvLCB5PVBvcikpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChQb3IsIDEpKSksIHZqdXN0PS0xLCBzaXplPTMpKwogIGxhYnMoeD0iU2V4byIsIHk9IlBvcmNlbnRhamUiKSsKICB0aGVtZV9jbGFzc2ljKCkKZ3JhZjIKYGBgCgpMYSBiYXNlIGRlIGRhdG9zIGluY2x1eWUgdW5hIHZhcmlhYmxlICJuc2UiLCBxdWUgcmVmaWVyZSBhbCBuaXZlbCBzb2Npb2Vjb27Ds21pY28gZGUgbGEgcGVyc29uYSBxdWUgcmVzcG9uZGUuCkVzdGUgbml2ZWwgc29jaW9lY29uw7NtaWNvIGVzdMOhIGNhdGVnb3JpemFkbyBlbiA0IG5pdmVsZXMuCgpgYGB7cn0KZW5sID0gZW5sICU+JQogIG11dGF0ZShuc2UxID0gZmFjdG9yKG5zZSwgbGFiZWxzPWMoIlJ1cmFsIiwgIkJham8iLCAiTWVkaW8iLCAiQWx0byIpKSkKYGBgCgpQYXNhbW9zIGEgY2FsY3VsYXIgbG9zIHBvcmNlbnRhamVzIGRlIGxlY3R1cmEgcG9yIGxvcyA0IG5pdmVsZXMgc29jaW9lY29uw7NtaWNvcy4KCmBgYHtyfQp0YWJsYTMgPSBlbmwgJT4lCiAgZmlsdGVyKGxlZSA9PSAiU8OtIiB8IGxlZSA9PSAiTm8iKSAlPiUKICBncm91cF9ieShuc2UxKSAlPiUKICBjb3VudChMZWUgPSBsZWUsIG5hbWU9Ik4iKSU+JQogIG11dGF0ZSh0b3RhbCA9IHN1bShOKSwgCiAgICAgICAgIFBvciA9IE4gLyB0b3RhbCAqIDEwMCkKdGFibGEzCmBgYAoKTnVldmFtZW50ZSBlbGltaW5hbW9zIGxhcyBmaWxhcyBkZSBsb3MgcG9yY2VudGFqZXMgZGUgYXF1ZWxsb3MgcXVlIG5vIGxlZW4uCgpgYGB7cn0KdGFibGEzID0gdGFibGEzWy1jKDIsNCw2LDgpLF0KYGBgCgpZIGdyYWZpY2Ftb3MgbG9zIHBvcmNlbnRhamVzIGRlIGxvcyBxdWUgc8OtIGxlZW4gcG9yIG5pdmVsZXMgc29jaW9lY29uw7NtaWNvcy4KCmBgYHtyfQpncmFmMyA9IGdncGxvdCh0YWJsYTMsIGFlcyh4PW5zZTEsIHk9UG9yKSkrCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKHJvdW5kKFBvciwgMSkpKSwgdmp1c3Q9LTEsIHNpemU9MykrCiAgbGFicyh4PSJOU0UiLCB5PSJQb3JjZW50YWplIikrCiAgdGhlbWVfY2xhc3NpYygpCmdyYWYzCmBgYAoKIyMgVGFyZWEKClNlIGVuY29udHLDsyBxdWUgdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIG11amVyZXMgcXVlIGhvbWJyZXMgbGVlLgrCv0N1w6FudG9zIGxpYnJvcyBpbXByZXNvcyB5IGRpZ2l0YWxlcyBsZWUgZWwgcGVydWFubyBwcm9tZWRpbz8Kwr9FeGlzdGVuIGRpZmVyZW5jaWFzIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzIGVudHJlIGVsIHByb21lZGlvIGRlIGxpYnJvcyBpbXByZXNvcyB5IGRpZ2l0YWxlcyBxdWUgbGVlbj8Kwr9FbnRyZSBuaXZlbGVzIHNvY2lvZWNvbsOzbWljb3M/CgojIENhc28gMjogRW5jdWVzdGEgTmFjaW9uYWwgRG9jZW50ZSAyMDIwCgpDYWRhIGRvcyBhw7FvcywgZWwgTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIHJlYWxpemEgdW5hIGVuY3Vlc3RhIGEgdW5hIG11ZXN0cmEgZGUgZG9jZW50ZXMgZGUgZWR1Y2FjacOzbiBiw6FzaWNhIGVuIGVsIFBlcsO6LgpMYSDDumx0aW1hIGRpc3BvbmlibGUgZnVlIGhlY2hhIGVuIDIwMjAsIGVuIG1lZGlvIGRlIGxhIHBhbmRlbWlhIGRlbCBDT1ZJRC0xOS4KTGFzIGJhc2VzIGRlIGRhdG9zIHkgY3Vlc3Rpb25hcmlvcyBkZSBlc3RhIGVuY3Vlc3RhIHNlIGVuY3VlbnRyYW4gZGlzcG9uaWJsZXMgW2FxdcOtXShodHRwOi8vd3d3Lm1pbmVkdS5nb2IucGUvcG9saXRpY2FzL2RvY2VuY2lhL2VuY3Vlc3RhLW5hY2lvbmFsLWEtZG9jZW50ZXMtZW5kby5waHApLgoKRW4gZXN0YSB1YmljYWNpw7NuIHNlIGVuY3VlbnRyYSBsYSBiYXNlIGRlIGRhdG9zLCBxdWUgcHVlZGUgc2VyIGRlc2NhcmdhZGEgeSBsZcOtZGEgZW4gUiBjb24gZWwgc2lndWllbnRlIGPDs2RpZ28uCgpgYGB7ciBlbmRvfQpsaWJyYXJ5KHJpbykKZW5kbzIwMjAgPSBpbXBvcnQoImJhc2VzL0VORE9fUkVNT1RPXzIwMjAuZHRhIikKI0NBTUJJQVIgQSBQUk9QSU8gRElSRUNUT1JJTyBERSBUUkFCQUpPCmBgYAoKIyBFc3RpbWFjacOzbiBwdW50dWFsCgpEZSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLCBsYSBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgbcOhcyDDunRpbCBlcyBsYSBtZWRpYS4KTGEgZW5jdWVzdGEgYSBkb2NlbnRlcyBpbmNsdXllIGxhIHByZWd1bnRhOgoKNi4gIMK/QSBjdcOhbnRvcyBlc3R1ZGlhbnRlcyBsZSBicmluZGEgYWNvbXBhw7FhbWllbnRvIGNvbW8gZG9jZW50ZSBkZSBhdWxhIGVuIGVzdGEgSUU/IChWZXIgY3Vlc3Rpb25hcmlvKQoKRGUgZXN0YSBwcmVndW50YSBwb2RlbW9zIHByZWd1bnRhcm5vczogwr9BIGN1w6FudG9zIGFsdW1ub3MgZW4gcHJvbWVkaW8gYWNvbXBhw7FhIGVsIGRvY2VudGUgcGVydWFubyBlbiBhdWxhPwpFc3RhIGVuY3Vlc3RhIHRpZW5lIHVuYSBwcmVndW50YSBxdWUgbm9zIHBlcm1pdGUgY2FsY3VsYXIgZXN0YSBtZWRpYSB5IGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhci4KCmBgYHtyIGRlc2MgYWx1bW5vcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmVuZG8yMDIwICU+JQogIHN1bW1hcml6ZShNZWRpYSA9bWVhbihQMV82LCBuYS5ybSA9IFQpLCBEZXN2LlN0ZCA9IHNkKFAxXzYsIG5hLnJtID0gVCkpCmBgYAoKRXMgZGVjaXIsIHVuIHByb2Zlc29yIHByb21lZGlvIGVuIFBlcsO6IGFjb21wYcOxYSBhcHJveGltYWRhbWVudGUgYSA0MCBhbHVtbm9zIGVuIGF1bGEuCsK/RXhpc3RlbiBkaWZlcmVuY2lhcyBlbiBlbCBuw7ptZXJvIHByb21lZGlvIGRlIGFsdW1ub3MgcXVlIGFjb21wYcOxYW4gZG9jZW50ZXMgaG9tYnJlcyB5IGRvY2VudGVzIG11amVyZXM/CgpDdWFuZG8gc2UgaW1wb3J0YSBsYSBiYXNlIGRlIGRhdG9zLCBsYSB2YXJpYWJsZSBzZXhvLCBQMV8xLCBlcyBkZWZpbmlkYSBjb21vIG51bcOpcmljYS4KCmBgYHtyfQpzdHIoZW5kbzIwMjAkUDFfMSkKYGBgCgpMYSBwb2RlbW9zIHRyYW5zZm9ybWFyIGEgdW5hIHZhcmlhYmxlIGRlIHRpcG8gZmFjdG9yLgoKYGBge3J9CmVuZG8yMDIwID0gZW5kbzIwMjAgJT4lCiAgbXV0YXRlKHNleG8gPSBmYWN0b3IoUDFfMSwgbGFiZWxzPWMoIkhvbWJyZSIsICJNdWplciIpKSkKYGBgCgpDYWxjdWxhbW9zIGxvcyBkYXRvcyBwYXJhIGhvbWJyZXMgeSBtdWplcmVzLgoKYGBge3IgZG9jZW50ZXMgaG9tYnJlfQp0YWJsYTEgPSBlbmRvMjAyMCAlPiUKICBncm91cF9ieShzZXhvKSAlPiUKICBzdW1tYXJpemUoTWVkaWEgPSBtZWFuKFAxXzYsIG5hLnJtID0gVCksIAogICAgICAgICAgICBEZXN2LlN0ZCA9IHNkKFAxXzYsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE1lZGlhbmEgPSBtZWRpYW4oUDFfNiwgbmEucm0gPSBUKSkKdGFibGExCmBgYAoKU2UgZW5jdWVudHJhIHF1ZSBsb3MgZG9jZW50ZXMgaG9tYnJlcyBhY29tcGHDsWFuLCBlbiBwcm9tZWRpbywgYSA1MiBhbHVtbm9zLCBtaWVudHJhcyBxdWUgbGFzIGRvY2VudGVzIG11amVyZXMgYWNvbXBhw7FhbiBhIDM0IGFsdW1ub3MsIHVuYSBkaWZlcmVuY2lhIGRlIDE4IGFsdW1ub3MgZW4gcHJvbWVkaW8uCgpUb2RvcyBlc3RvcyByZXN1bHRhZG9zIHNvbiBwdW50dWFsZXMgeSBhcGxpY2FuIHBhcmEgbGEgbXVlc3RyYSBkZSAyOCwyMTYgcHJvZmVzb3Jlcy4KClBhcmEgdW5hIGNvbXBhcmFjacOzbiBncsOhZmljYSwgc2UgcHVlZGUgdXNhciBib3hwbG90LgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KGVuZG8yMDIwLCBhZXMoeT1QMV82LCB4PXNleG8pKSsKICBnZW9tX2JveHBsb3QoKQpgYGAKCmBgYHtyfQplbmRvMjAyMCA9IGVuZG8yMDIwICU+JQogIG11dGF0ZShjb25kaWNpb24gPSBmYWN0b3IoUDFfNywgbGFiZWxzPWMoIk5vbWJyYWRvIiwgIkNvbnRyYXRhZG8geCBjb25jdXJzbyIsICJDb250cmF0YWRvIG90cm8iKSkpCmBgYAoKYGBge3J9CnRhYmxhMiA9IGVuZG8yMDIwICU+JQogIGdyb3VwX2J5KGNvbmRpY2lvbikgJT4lCiAgc3VtbWFyaXplKE1lZGlhID0gbWVhbihQMV82LCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgRGVzdi5TdGQgPSBzZChQMV82LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBNZWRpYW5hID0gbWVkaWFuKFAxXzYsIG5hLnJtID0gVCkpCnRhYmxhMgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQplbmRvMjAyMCAlPiUKICBkcm9wX25hKFAxXzYpICU+JQogIGdncGxvdChhZXMoeT1QMV82LCB4PWNvbmRpY2lvbikpKwogIGdlb21fYm94cGxvdCgpCmBgYAoKYGBge3J9CmdncGxvdChzdWJzZXQoZW5kbzIwMjAsICFpcy5uYShQMV82KSksIGFlcyh5PVAxXzYsIHg9Y29uZGljaW9uKSkrCiAgZ2VvbV9ib3hwbG90KCkKYGBgCgpTaSBzZSBxdWllcmUgaGFjZXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzIHNpbXBsZXMgcGFyYSBtb3N0cmFyIGxhIG1lZGlhIGRlbCBuw7ptZXJvIGRlIGFsdW1ub3MgcG9yIHNleG8gZGVsIHByb2Zlc29yLCBzZSBwdWVkZSB1c2FyOgoKYGBge3J9CmdncGxvdCh0YWJsYTEsIGFlcyh4PXNleG8sIHk9TWVkaWEpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2d0aXRsZSgiTsO6bWVybyBkZSBhbHVtbm9zIHByb21lZGlvIHBvciBzZXhvIGRlbCBkb2NlbnRlIikgKwogIHhsYWIoIlNleG8gZGVsIGRvY2VudGUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1yb3VuZChNZWRpYSwxKSksIHZqdXN0PTEuMzAsIGNvbG9yPSJ3aGl0ZSIsIHNpemU9MykrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKwr9Dw7NtbyBzZSBwdWVkZW4gZXh0cmFwb2xhciBlc3RvcyByZXN1bHRhZG9zIGFsIHVuaXZlcnNvIGRlIHByb2Zlc29yZXMgcGVydWFub3M/CgojIEVzdGltYWNpw7NuIHBvciBpbnRlcnZhbG9zCgpUYW50byBsYSBtZWRpYSBtdWVzdHJhbCwgY29tbyBsYSBwcm9wb3JjacOzbiBtdWVzdHJhbCwgc29uIGVzdGltYWNpb25lcyBwdW50dWFsZXMsIGJhc2Fkb3MgZW4gbG9zIHJlc3VsdGFkb3MgZGUgbGEgbXVlc3RyYS4KRXMgZGVjaXIsIGVzdGFzIHNvbiBlc3RpbWFjaW9uZXMgY29ycmVzcG9uZGllbnRlcyBhIGxhcyAyOCwyMTYgb2JzZXJ2YWNpb25lcyBxdWUgc29uIHBhcnRlIGRlIGVzdGUgZXN0dWRpby4KU2luIGVtYmFyZ28sIGVzdGEgbXVlc3RyYSBmb3JtYSBwYXJ0ZSBkZSB1biB1bml2ZXJzbyBvIHBvYmxhY2nDs24gKGVsIGNvbmp1bnRvIGRlIHByb2Zlc29yZXMgZGVsIFBlcsO6KSwgZGVsIHF1ZSBzZWd1cmFtZW50ZSBzZSBxdWllcmUgZGVjaXIgYWxnby4KCkVsIG1pc21vIHJhem9uYW1pZW50byBhcGxpY2EgYSB1bmEgZW5jdWVzdGEgZGUgb3BpbmnDs24gY29udmVuY2lvbmFsLgpMYSBmaWNoYSB0w6ljbmljYSBkZSB1bmEgZW5jdWVzdGEgbWVuY2lvbmEsIGdlbmVyYWxtZW50ZSwgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIHkgbGEgcG9ibGFjacOzbiBhIGxhIHF1ZSBzZSBidXNjYSByZXByZXNlbnRhci4KVGFtYmnDqW4gc2UgcHVlZGUgZW5jb250cmFyIGVsIG1hcmdlbiBkZSBlcnJvciAoKy8tIDIuOCUpIHkgZWwgbml2ZWwgZGUgY29uZmlhbnphIChnZW5lcmFsbWVudGUgZGUgOTUlKS4oVmVyLCBwb3IgZWplbXBsbywgbGEgW2VuY3Vlc3RhIGRlIG9waW5pw7NuIGRlIGFnb3N0byAyMDIzIGRlIElwc29zXShodHRwczovL3d3dy5pcHNvcy5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy9jdC9uZXdzL2RvY3VtZW50cy8yMDIzLTA4L0luZm9ybWUlMjBFbmN1ZXN0YSUyME5hY2lvbmFsJTIwVXJiYW5vJTIwUnVyYWwlMjAtJTIwQW1lcmljYSUyMFRlbGV2aXNpw7NuJTIwYWwlMjAxMSUyMGRlJTIwYWdvc3RvJTIwMjAyMyUyMEVzdHVkaW8lMjBkZSUyME9waW5pw7NuLnBkZikuCgpFbCBwcm9jZXNvIG1lZGlhbnRlIGVsIGN1YWwgc2UgcGFydGUgZGUgdW5hIG11ZXN0cmEgcGFyYSBkZWNpciBhbGdvIGRlIHVuIHVuaXZlcnNvIG8gcG9ibGFjacOzbiBlcyB1biBwcm9jZXNvIGRlIGluZmVyZW5jaWEgeSBlcyBwYXJ0ZSBkZSBsYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwuCkxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbCBpbnRyb2R1Y2UgbGEgKippbmNlcnRpZHVtYnJlKiogZW4gbG9zIGVzdGltYWRvcywgZGViaWRvIGFsIGhlY2hvIGRlIGVzdGFyIHRyYWJhamFuZG8gY29uIHVuYSBtdWVzdHJhIHkgbm8gY29uIGVsIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMgZGVsIHVuaXZlcnNvLgoKIyMgVW4gYnJldmUgcGFzZW8gcG9yIGxhcyBwcm9iYWJpbGlkYWRlcwoKUGFydGltb3MgZGVsIGhlY2hvIHF1ZSBlbiBlbCBjb23Dum4gZGUgbGFzIGludmVzdGlnYWNpb25lcyB1bm8gdGllbmUgcXVlIHNlbGVjY2lvbmFyIHVuIGNvbmp1bnRvIGRlIG9ic2VydmFjaW9uZXMgcXVlIHNvbiBwYXJ0ZSBkZWwgdG90YWwsIHF1ZSBlcyBtdXkgY29zdG9zbyBlIGluZWZpY2llbnRlIGhhY2VyIHVuIGVzdHVkaW8gZGUgbGEgcG9ibGFjacOzbiBjb21wbGV0YS4KTGEgYW5hbG9nw61hIGVzLCBwb3IgZWplbXBsbywgcXVlIHBhcmEgdW4gYW7DoWxpc2lzIGRlIHNhbmdyZSBzZSBleHRyYWUgdW5hICJtdWVzdHJhIiBkZSBzYW5ncmUgeSBubyBlbCB0b3RhbCBkZSBzYW5ncmUgZGVsIGN1ZXJwby4KCkEgZXN0byBsZSBzdW1hbW9zIGVsIGhlY2hvIHF1ZSBudWVzdHJhcyBoZXJyYW1pZW50YXMgZGUgcmVjb2pvIGRlIGluZm9ybWFjacOzbiBzb24gaW1wZXJmZWN0YXMuClVuIGVzdHVkaW8gdHJhbnN2ZXJzYWwsIHBvciBlamVtcGxvLCBkZWJlcsOtYSByZWNvZ2VyIGluZm9ybWFjacOzbiBkZSBsb3MgaW5kaXZpZHVvcyBlbiB1biBjb3J0ZSBlbiBlbCB0aWVtcG8sIHNpbiBlbWJhcmdvLCBtdWNob3MgZXN0dWRpb3Mgbm8gc29uIHVuYSAiZm90byBkZWwgbW9tZW50byIsIHB1ZXMgbGFzIG9ic2VydmFjaW9uZXMgdG9tYW4gdGllbXBvIHkgYWJhcmNhbiBob3JhcywgZMOtYXMgbyBzZW1hbmFzLCBzaW5vIG1lc2VzLgoKRXMgcG9yIGVzdGUgbW90aXZvIHF1ZSBwYXJhIHVuIGVzdHVkaW8gc2Ugc2VsZWNjaW9uYSAidW5hIiBtdWVzdHJhLCB1biBjb25qdW50byBkZSBvYnNlcnZhY2lvbmVzIHF1ZSBzb24gdW5hIGZyYWNjacOzbiBkZWwgdG90YWwuCkVzdGEgc2VsZWNjacOzbiBzZSBoYWNlIHNpZ3VpZW5kbyBwcm9jZWRpbWllbnRvcyBhbGVhdG9yaW9zLCBkZSB0YWwgbWFuZXJhIHF1ZSBjdWFscXVpZXIgdW5pZGFkIGRlbCB1bml2ZXJzbyB0ZW5nYSBsYSBtaXNtYSBwcm9iYWJpbGlkYWQgZGUgc2VyIHNlbGVjY2lvbmFkYS4KCkVsIHB1bnRvIGVzIHF1ZSBlc3RhIMO6bmljYSBtdWVzdHJhIGVzIHNvbG8gdW5hIGRlIGxhcyBtw7psdGlwbGVzIG11ZXN0cmFzIHRlw7NyaWNhcyBxdWUgc2UgcG9kcsOtYW4gc2VsZWNjaW9uYXIgZGUgdW4gdW5pdmVyc28gZGV0ZXJtaW5hZG8uCgpQYXJ0YW1vcyBkZSB1biBlamVtcGxvIG11eSBzaW1wbGUuClBhcmEgdW4gdW5pdmVyc28gZGUgNSBwZXJzb25hcywgc2UgcHVlZGVuIGV4dHJhZXIgMTAgbXVlc3RyYXMgZGUgdGFtYcOxbyAyIGRpZmVyZW50ZXMuCgohW10obXVlc3RyYTEuanBlZykKCkxhIGbDs3JtdWxhIHBhcmEgY2FsY3VsYXIgZWwgbsO6bWVybyBkZSBtdWVzdHJhcyBwcm9iYWJsZXMgZXMgbGEgZGUgY29tYmluYXRvcmlhcywgcXVlIGluY2x1eWUgZWwgb3BlcmFkb3IgZmFjdG9yaWFsLgpTaSBhcGxpY2Ftb3MgZXN0YSBmw7NybXVsYSBhIHVuIGVqZW1wbG8gZGUgdW4gdW5pdmVyc28gbcOhcyBncmFuZGUsIHBvciBlamVtcGxvLCB1biBzYWzDs24gZGUgY2xhc2UgZGUgNTAgYWx1bW5vcywgZG9uZGUgc2UgcXVpZXJlIHNhYmVyIGN1w6FudGFzIG11ZXN0cmFzIGRpZmVyZW50ZXMgZGUgdGFtYcOxbyA0IHNlIHB1ZWRlbiBleHRyYWVyLgpTZWfDum4gbGEgZsOzcm11bGE6CgokJApcZnJhY3s1MCF9IHsoNTAtNCkhIDQhfSA9IFxmcmFjezUwIX0gezQ2ISA0IX0gPSBcZnJhY3s1MCo0OSo0OCo0N30gezQqMyoyfSA9IDIzMCwzMDAKJCQKClBhcmEgdW4gc29uZGVvIGRlIG9waW5pw7NuLCBkb25kZSBlbCB1bml2ZXJzbyBzb24gMjQgbWlsbG9uZXMgZGUgaW5kaXZpZHVvcyB5IHNlIHF1aWVyZSBzYWJlciBjdcOhbnRhcyBtdWVzdHJhcyBkaWZlcmVudGVzIGRlIHRhbWHDsW8gMSw1MDAgc2UgcHVlZGVuIGV4dHJhZXIsIGVzdGUgbsO6bWVybyBkZSBtdWVzdHJhcyBwcm9iYWJsZXMgZXMgbXV1dXV5IGdyYW5kZS4KClZvbHZpZW5kbyBhbCBlamVtcGxvIG11eSBzaW1wbGUgZGUgNSBwZXJzb25hcyBkb25kZSBzZSBxdWllcmUgZXh0cmFlciB1bmEgbXVlc3RyYSBkZSAyIHkgc2UgcXVpZXJlIGluZmVyaXIgbG9zIGRhdG9zIGRlIGxhIG11ZXN0cmEgZGUgZG9zIHZhcmlhYmxlczogc2V4byB5IGVkYWQuCgpTZSB0aWVuZSB1biB1bml2ZXJzbyBkZSA1IGluZGl2aWR1b3MsIGNhZGEgdW5vIGNvbiBzdSBzZXhvIHkgZWRhZC4KRW4gbGEgcG9ibGFjacOzbiBsYSBwcm9wb3JjacOzbiBkZSBob21icmVzIGVzIGRlIDYwJSB5IGxhIG1lZGlhIGRlIGVkYWQgZXMgZGUgMzQgYcOxb3MuCgohW10obXVlc3RyYTIuanBlZykKClNpIHF1ZXJlbW9zIGV4dHJhZXIgdW5hIG11ZXN0cmEgZGUgdGFtYcOxbyBkZSAyIGRlIGVzZSB1bml2ZXJzbywgc2UgdGllbmVuIDEwIHBvc2libGVzIG11ZXN0cmFzLCBjYWRhIHVuYSB0ZW5kcsOhIHVuYSBhcHJveGltYWNpw7NuIGRlIGxhIHByb3BvcmNpw7NuIGRlIGhvbWJyZXMgeSBkZSBsYSBtZWRpYSBkZSBlZGFkLgpEZXBlbmRpZW5kbyBkZSBxdcOpIG11ZXN0cmEgZGUgdG9kYXMgbGFzIHBvc2libGVzIHNlYSBsYSBxdWUgc2Ugb2JzZXJ2YSwgbG9zIGVzdGFkw61zdGljb3Mgc2Vyw6FuIHVuYSBhcHJveGltYWNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLgoKRW4gZWwgY2FzbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBob21icmVzLCBzZSBwdWVkZSB0YWJ1bGFyIGxvcyByZXN1bHRhZG9zIGRlIGNhZGEgbXVlc3RyYSBwcm9iYWJsZS4KCnwgUmVzdWx0YWRvcyBtdWVzdHJhbGVzIHwgTsO6bWVybyBkZSBtdWVzdHJhcyBxdWUgYXJyb2phcm9uIGVzZSByZXN1bHRhZG8gfCBGcmVjdWVuY2lhIHwKfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IDAlIHwgMSB8IFggfAp8IDUwJSB8IDUgfCBYWFhYWCB8CnwgMTAwJSB8IDQgfCBYWFhYIHwKCkluY2x1c28gc2UgcG9kcsOtYSBjYWxjdWxhciB1biBwcm9tZWRpbyBkZSB0b2RhcyBlc2FzIHByb3BvcmNpb25lcyBtdWVzdHJhbGVzICgxMDArNTArMTAwKy4uLis1MC8xMCksIHkgZXNlIHJlc3VsdGFkbyBzZXLDrWEgNjUlLCB1biByZXN1bHRhZG8gYWxnbyBjZXJjYSBkZSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbCBkZSA2MCUuCgpFc3RlIG1pc21vIHByb2NlZGltaWVudG8gc2UgcG9kcsOtYSBoYWNlciBwYXJhIHRvZGFzIGxhcyAyMzAsMzAwIG11ZXN0cmFzIHByb2JhYmxlcyBkZSB0YW1hw7FvIDQgZGUgdW4gdW5pdmVyc28gZGUgNTAgYWx1bW5vcy4KQ2FkYSB1bm8gZGUgbG9zIDUwIGFsdW1ub3Mgc2Vyw6EgaG9tYnJlIG8gbXVqZXIgeSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbCBkZSBob21icmVzIHNlIHB1ZWRlIGNhbGN1bGFyIGVuIGVzZSB0b3RhbC4KQSBzdSB2ZXosIGNhZGEgbXVlc3RyYSBkZSA0LCB0ZW5kcsOhIHVuYSBwcm9wb3JjacOzbiBtdWVzdHJhbCBxdWUgdGVuZHLDoSB2YWxvcmVzICgwIHNpIG5vIGhheSBuaW5nw7puIGhvbWJyZSwgMjUlIHNpIGhheSAxIGhvbWJyZSwgNTAlIHNpIGhheSAyIGhvbWJyZXMsIDc1JSBzaSBoYXkgMyBob21icmVzIHkgMTAwJSBzaSB0b2RvcyBzb24gaG9tYnJlcykuCkZpbmFsbWVudGUsIHNlIHB1ZWRlIGNvbnRhciBjdcOhbnRhcyBkZSBsYXMgMjMwLDMwMCBtdWVzdHJhcyBwcm9iYWJsZXMgdHV2aWVyb24gMCUsIDI1JSwgNTAlLCA3NSUgeSAxMDAlIGRlIGhvbWJyZXMuCkVzdGEgZGlzdHJpYnVjacOzbiBzZSBsbGFtYSAiKipkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvKioiLgoKU2kgcXVpc2nDqXJhbW9zIGFtcGxpYXIgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIGEgMTAsIGVudG9uY2VzIGxvcyByZXN1bHRhZG9zIHBvc2libGVzIHNlcsOtYW4sIDAsIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAgeSAxMDAlLgpUYW1iacOpbiBwb2Ryw61hbW9zIGNvbnRhciBjdcOhbnRhcyBtdWVzdHJhcyB0aWVuZW4gZXN0b3MgcmVzdWx0YWRvcy4KCkRlIHVuIHVuaXZlcnNvIG3DoXMgZ3JhbmRlLCBzZSBwdWVkZSBwbGFudGVhciBleHRyYWVyIG11ZXN0cmFzIGRlIHRhbWHDsW8gbcOhcyBncmFuZGUuClBvciBlamVtcGxvLCB0ZcOzcmljYW1lbnRlIHNlIHB1ZWRlIHBlbnNhciBxdWUgZGUgdW4gdW5pdmVyc28gZGUgMjAgbWlsbG9uZXMsIHNlIHB1ZWRlbiBleHRyYWVyIGNhc2kgaW5maW5pdGFzIG11ZXN0cmFzIGRlIHRhbWHDsW8gMSw1MDAuCkNhZGEgdW5hIGRlIGVzdGFzIG11ZXN0cmFzIHRlbmRyw6EgdW4gZXN0YWTDrXN0aWNvIHF1ZSBzZXLDoSB1bmEgYXByb3hpbWFjacOzbiBkZWwgcGFyw6FtZXRyby4KTG9zIGVzdGFkw61zdGljb3MgZGUgdG9kYXMgZXN0YXMgY2FzaSBpbmZpbml0YXMgbXVlc3RyYXMgc2UgcHVlZGVuIHRhYnVsYXIgeSBncmFmaWNhci4KCiMjIFRlb3JlbWEgZGVsIGzDrW1pdGUgY2VudHJhbAoKRXN0ZSB0ZW9yZW1hIG11ZXN0cmEgcXVlIGxhICoqZGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbyBzZSBhcHJveGltYSBhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCoqLCBjb24gY2VudHJvIGVuIGVsIHBhcsOhbWV0cm8sIGVuIGxhIG1lZGlkYSBxdWUgZWwgdGFtYcOxbyBkZSBtdWVzdHJhIGF1bWVudGEuCgpFc3RvIHNlIHB1ZWRlIG1vc3RyYXIgZ3LDoWZpY2FtZW50ZSBlbiBlbCBUYWJsZXJvIGRlIEdhbHRvbiwgdmVyIFthcXXDrV0oaHR0cHM6Ly95b3V0dS5iZS9Bd0VhSENqZ2VYaz9zaT1hMC13ZkctZm5nNEhZc1JRKQoKUG9yIGxvIHRhbnRvLCBsYSBkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvIGRlIE4gZ3JhbmRlcyBwYXJhIGN1YWxxdWllciB2YXJpYWJsZSBzZWd1aXLDoSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjdWFscXVpZXIgY3VydmEgbm9ybWFsLgpUb2RhIGN1cnZhIG5vcm1hbCBlcyBzaW3DqXRyaWNhIHkgc2FiZW1vcyBxdWUgc2kgZGVzZGUgZWwgY2VudHJvIHNlIGRlc3BsYXphIDEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGVuIGFtYmFzIGRpcmVjY2lvbmVzLCBlbnRyZSBlc29zIGzDrW1pdGVzIGVzdGFyw6FuIGVsIDY4LjMlIGRlIHRvZGFzIGxhcyBvYnNlcnZhY2lvbmVzLgpTaSBzZSBkZXNwbGF6YSAyIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZW4gYW1iYXMgZGlyZWNjaW9uZXMsIHNlIGFjdW11bGFyw61hbiBlbCA5NS40JSBkZSB0b2RhcyBsYXMgb2JzZXJ2YWNpb25lcy4KQ29uIDMgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBoYWNpYSBhbWJvcyBsYWRvcywgc2UgYWN1bXVsYXLDrWEgZWwgOTkuNyUgZGUgdG9kYXMgbGFzIG9ic2VydmFjaW9uZXMuCgohW10oYzMuMy5wbmcpe3dpZHRoPSI1MTAifQoKVHJhZHVjaWVuZG8gYSBsYSBkaXN0cmlidWNpw7NuIGRlIG11ZXN0cmVvLCBsYSBpZGVhIGVzIHF1ZSBzaSBzZSB0YWJ1bGFuIHkgc2UgaGFjZSB1biBncsOhZmljbyBkZSBiYXJyYXMgZGUgbG9zIHJlc3VsdGFkb3MgZGUgdG9kYXMgbGFzIG11ZXN0cmFzIHByb2JhYmxlcywgc2UgdGVuZHLDrWEgdW5hIGN1cnZhIG5vcm1hbCBjb24gY2VudHJvIGVuIGVsIHBhcsOhbWV0cm8uClNhYnLDrWFtb3MgcXVlIHNpIGRlc2RlIGVzZSBjZW50cm8gbm9zIGRlc3BsYXphbW9zIDIgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBlbiBhbWJhcyBkaXJlY2Npb25lcywgZW50cmUgZXNvcyBsw61taXRlcyBlc3RhcsOtYW4gZWwgOTUlIGRlIHRvZGFzIGxhcyBtdWVzdHJhIHByb2JhYmxlcy4KCkVzIGFsdGFtZW50ZSBwcm9iYWJsZSAoOTUlIHByb2JhYmxlKSBxdWUgc2kgZW4gdW5hIGludmVzdGlnYWNpw7NuIHNlIGV4dHJhZSB1bmEgc29sYSBtdWVzdHJhLCBlc3RhIHNlYSBwYXJ0ZSBkZWwgOTUlIGRlIG11ZXN0cmFzIHBvc2libGVzIGEgKy8tIDIgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBkZWwgcGFyw6FtZXRyby4KRGUgbGEgbWlzbWEgbWFuZXJhLCBlcyBwb2NvIHByb2JhYmxlICg1JSBwcm9iYWJsZSkgcXVlIHVuYSBzb2xhIG11ZXN0cmEgbm8gZXN0w6kgYSArLy0gMiBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIGRlbCBwYXLDoW1ldHJvLgoKIyBFc3RpbWFjacOzbiBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQoKTGEgZGlzdHJpYnVjacOzbiBkZSBtdWVzdHJlbyBlcyB0ZcOzcmljYSwgbXV5IGRpZsOtY2lsbWVudGUgc2UgcHVlZGUgY2FsY3VsYXIgZW4gbGEgcmVhbGlkYWQuClJlZ3VsYXJtZW50ZSB0YW1wb2NvIHNhYmVtb3MgbG9zIGRhdG9zIGRlbCB1bml2ZXJzby4KTG8gcXVlIHRlbmVtb3MgYSBtYW5vIGVzICoqMSBtdWVzdHJhIG9ic2VydmFkYSoqLgpFcyBkZWNpciwgZW4gdW4gZXN0dWRpbyBkZSBsYXMgbXV1dXV1Y2hhcyBtdWVzdHJhcyBwcm9iYWJsZXMsIHNlIHNlbGVjY2lvbmEgMSBtdWVzdHJhLgoKRW4gZWwgY2FzbyBkZSBsYSBlbmN1ZXN0YSBFTkRPLCBwb3IgZWplbXBsbywgZGVsIHVuaXZlcnNvIGRlIHByb2Zlc29yZXMgcGVydWFub3MsIHNlIHNlbGVjY2lvbsOzIDEgbXVlc3RyYSBkZSAyOCwyMTYgb2JzZXJ2YWNpb25lcywgZGUgbGFzIG11dXV1Y2hhcyBtdWVzdHJhcyBkZSAyOCwyMTYgaW5kaXZpZHVvcyBkZSBsYSBwb2JsYWNpw7NuIHRvdGFsLgoKU2kgdGXDs3JpY2FtZW50ZSBzYWJlbW9zIHF1ZSBlbiBsYSBkaXN0cmlidWNpw7NuIG11ZXN0cmFsLCBlbCA5NSUgZGUgdG9kYXMgbGFzIG11ZXN0cmFzIGVzdMOhbiBhICsvLSAyIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXJbXjFdIGRlbCBjZW50cm8sIHF1ZSBjb2luY2lkZSBjb24gZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCwgZXMgbXV5IHByb2JhYmxlIHF1ZSBsYSDDum5pY2EgbXVlc3RyYSBxdWUgc2UgaGEgb2JzZXJ2YWRvIHNlYSBwYXJ0ZSBkZSBlc2UgY29uanVudG8uCkRlIGhlY2hvLCBzZSBwdWVkZSBkZWNpciBxdWUgc2UgdGllbmUgOTUlIGRlIHByb2JhYmlsaWRhZGVzIGRlIHF1ZSBzZWEgcGFydGUgZGUgZXNlIGdydXBvLgoKW14xXTogRW4gcmVhbGlkYWQgZXMgYSArLy0gMiBlcnJvcmVzIGVzdMOhbmRhciBkZWwgY2VudHJvLgogICAgRWwgZXJyb3IgZXN0w6FuZGFyIHNlIGVudGllbmRlIGNvbW8gbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbXVlc3RyZW8uCgpQb3IgbG8gdGFudG8sIHNpIGEgcGFydGlyIGRlbCBlc3RhZMOtc3RpY28gbXVlc3RyYWwsIHNlIGFwbGljYSBlc3RhIGRpc3RhbmNpYSBkZSArLy0gMiBlcnJvcmVzIGVzdMOhbmRhciwgc2UgdGllbmUgOTUlIGRlIHByb2JhYmlsaWRhZGVzIHF1ZSBlbnRyZSBlc29zIGzDrW1pdGVzIHNlIGluY2x1eWEgYWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8uClBhcmEgdmVybG8gZGUgbWFuZXJhIG3DoXMgdmlzdWFsLCBlbiBsYSBzaWd1aWVudGUgZmlndXJhIHNlIHRpZW5lIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbXVlc3RyZW8gdGXDs3JpY2EgKHkgZGVzY29ub2NpZGEpLCBkb25kZSBzZSBtYXJjYSBsYSByZWdpw7NuIHF1ZSBhY3VtdWxhIGVsIDk1JSBkZSB0b2RhcyBsYXMgbXVlc3RyYXMgcHJvYmFibGVzLgoKTcOhcyBhYmFqbyBzZSBtYXJjYSBsb3MgcmVzdWx0YWRvcyBkZSAyIG11ZXN0cmFzIG9ic2VydmFkYXMuCkxhIHByaW1lcmEgcHJvcG9yY2nDs24gbXVlc3RyYWwgc3ViZXN0aW1hIGxhIHByb3BvcmNpw7NuIHBvYmxhY2lvbmFsLgpMYSBzZWd1bmRhLCBwb3IgZWwgY29udHJhcmlvLCBzb2JyZWVzdGltYSBsYSBwcm9wb3JjacOzbiBwb2JsYWNpb25hbC4KRW4gZWwgcHJpbWVyIGNhc28sIHNpIGEgcGFydGlyIGRlbCBlc3RhZMOtc3RpY28gbXVlc3RyYWwgc2UgYXBsaWNhICsvLSAxLjk2IGVycm9yZXMgZXN0w6FuZGFyIChsw61uZWEgaG9yaXpvbnRhbCBlbiBuZWdyaXRhKSwgc2Ugb2JzZXJ2YSBxdWUgZWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbCBlc3TDoSBpbmNsdWlkbyBlbiBlc29zIGzDrW1pdGVzLgoKRXMgcHJvYmFibGUsIGNvbW8gZW4gZWwgc2VndW5kbyBjYXNvLCBxdWUgb3RyYSBtdWVzdHJhIHByb2JhYmxlLCBjdWFuZG8gc2UgbGUgYXBsaXF1ZSBlbCBpbnRlcnZhbG8gZGUgKy8tIDEuOTYgZXJyb3JlcyBlc3TDoW5kYXIsIG5vIGluY2x1eWEgYWwgcGFyw6FtZXRyby4KU2Ugb2JzZXJ2YSBxdWUgbGEgbMOtbmVhIGVuIG5lZ3JpdGEgbm8gaW5jbHV5ZSBsYSBsaW5lYSB2ZXJ0aWNhbCBlbnRyZWNvcnRhZGEgcXVlIG1hcmNhIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKIVtdKGMzLjQucG5nKXt3aWR0aD0iNTgxIn0KClNpbiBlbWJhcmdvLCBzYWJlbW9zIHF1ZSBlcyBtdWNobyBtw6FzIHByb2JhYmxlICg5NSUgZGUgcHJvYmFiaWxpZGFkZXMpIHF1ZSBzaSB1bmEgbXVlc3RyYSBvYnNlcnZhZGEgZXMgcGFydGUgZGVsIDk1JSBkZSBtdWVzdHJhcyBhbHJlZGVkb3IgZGVsIHBhcsOhbWV0cm8sIGVzdGUgaW50ZXJ2YWxvIGluY2x1eWEgYWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbC4KQSBlc3RvcyBsw61taXRlcyBsZSBsbGFtYW1vcyAiaW50ZXJ2YWxvcyBkZSBjb25maWFuemEiLgoKRW4gY3VhbHF1aWVyIGludmVzdGlnYWNpw7NuIHNvbG8gc2UgY3VlbnRhIGNvbiB1bmEgbXVlc3RyYSBvYnNlcnZhZGEsIGN1eW8gZXN0YWTDrXN0aWNvIG11ZXN0cmFsLCBzZWEgdW5hIG1lZGlhIG8gdW4gcHJvcG9yY2nDs24sIGVzIHVuYSBhcHJveGltYWNpw7NuIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKUGFyYSBwb2RlciBleHRyYXBvbGFyIGRlc2RlIGxhIG11ZXN0cmEgaGFzdGEgbGEgcG9ibGFjacOzbiwgc2UgdGllbmUgcXVlIGNvbnN0cnVpciB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFscmVkZWRvciBkZWwgZXN0YWTDrXN0aWNvIG11ZXN0cmFsLgpFc3RlIGludGVydmFsbyBzZSBjb25zdHJ1eWUgYXBsaWNhbmRvIGxhICJkaXN0YW5jaWEiIGRlICsvLSAxLjk2IGVycm9yZXMgZXN0w6FuZGFyLCBwYXJhIHRlbmVyIHVuYSBjb25maWFuemEgZGUgOTUlIGRlIGluY2x1aXIgYWwgcGFyw6FtZXRybyBwb2JsYWNpb25hbC4KClNpIHNlIGVzdMOhIGV4dHJhcG9sYW5kbyBwYXJhIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EsIG1lZGlhbnRlIGxhIG1lZGlhLCBlbCBlcnJvciBlc3TDoW5kYXIgKG8gc2UpIGVzOgoKJCQKc2UgPSAxLjk2ICogXGZyYWN7c30ge1xzcXJ0e259fQokJAoKU2kgc2UgZXN0w6EgZXh0cmFwb2xhbmRvIHBhcmEgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhLCBtZWRpYW50ZSB1bmEgcHJvcG9yY2nDs24sIGVsIGVycm9yIGVzdMOhbmRhciAobyBzZSkgZXM6CgokJApzZSA9IDEuOTYgKiBcc3FydHtcZnJhY3socCAqICgxLXApKX0ge259fQokJAoKQSBtYW5lcmEgZGUgcmVzdW1lbiwgbGEgc2lndWllbnRlIHRhYmxhIG5vcyBtdWVzdHJhIGVsIHBhcsOhbWV0cm8sIGVsIGVzdGFkw61zdGljbyBwdW50dWFsIHkgZWwgZXJyb3IgZXN0w6FuZGFyIHBhcmEgY2FkYSB0aXBvIGRlIHZhcmlhYmxlIHkgY8OzbW8gc2UgZm9ybWEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCiFbXShjMy41LnBuZykKCkVuIGVzdGFzIGbDs3JtdWxhcywgc2UgdXNhIGVsIHPDrW1ib2xvICJ0IiB5ICJ6IiBwYXJhIHJlZmVyaXIgYSBsYXMgZGlzdHJpYnVjaW9uZXMgdGXDs3JpY2FzIHF1ZSBzZSB1c2FuLgpQYXJhIGZpbmVzIHByw6FjdGljb3MsIGN1YW5kbyBsYSBtdWVzdHJhIGVzIGdyYW5kZSwgYW1iYXMgZGlzdHJpYnVjaW9uZXMgc29uIGlndWFsZXMuCkVsIHZhbG9yIGRlICJ0IiBvICJ6IiBkZXBlbmRlIGRlbCBuaXZlbCBkZSBjb25maWFuemEgcXVlIHF1ZXJlbW9zLgpFcyBkZWNpciwgZGUgbGEgcHJvYmFiaWxpZGFkIHF1ZSBxdWVyZW1vcyBkZSBxdWUgZWwgaW50ZXJ2YWxvIGluY2x1eWEgYWwgcGFyw6FtZXRyby4KRGUgZXN0YSBtYW5lcmE6CgotICAgWiBhbCA5MCUgPSAxLjY0NQoKLSAgIFogYWwgOTUlID0gMS45NgoKLSAgIFogYWwgOTglID0gMi4zMjYKCi0gICBaIGFsIDk5JSA9IDIuNTc2CgrCv1F1w6kgcGFzYSBjb24gZWwgSUMgY3VhbmRvIHNlIHF1aWVyZSBtYXlvciBjb25maWFuemE/CsK/U2UgdnVlbHZlIG3DoXMgbyBtZW5vcyBwcmVjaXNvPwoKRW4gZWwgZWplbXBsbyBkZWwgY8OhbGN1bG8gZGVsIHByb21lZGlvIGRlIGFsdW1ub3MgcXVlIGF0aWVuZGUgbG9zIHByb2Zlc29yZXMsIHNlIHB1ZWRlIGHDsWFkaXIgZWwgY8OhbGN1bG8gZGUgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIGVuIGFtYm9zIGNhc29zLCBwYXJhIGhvbWJyZXMgeSBtdWplcmVzLgpFbCBjb21hbmRvIHBhcmEgaGFjZXIgZXN0byBlcyBgY2lNZWFuYCBxdWUgZXMgcGFydGUgZGUgbGEgbGlicmVyw61hIGBsc3JgLgoKYGBge3J9CmxpYnJhcnkobHNyKQpjaU1lYW4oZW5kbzIwMjAkUDFfNiwgbmEucm0gPSBUKQpgYGAKClNpIHNlIGNhbGN1bGFuIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwb3IgZ3J1cG9zLCBlc3RvcyBzZSBwdWVkZW4gY29tcGFyYXIuCgpgYGB7ciBJQyBkb2NlbnRlc30KbGlicmFyeShsc3IpCmNpX2FsdW14c2V4byA9IGVuZG8yMDIwIHw+CiAgZ3JvdXBfYnkoc2V4bykgfD4KICBzdW1tYXJpc2UoTWVkaWEgPSBtZWFuKFAxXzYsIG5hLnJtPVQpLAogICAgICAgICAgICBtaW4gPSBjaU1lYW4oUDFfNiwgbmEucm09VClbMV0sCiAgICAgICAgICAgIG1heCA9IGNpTWVhbihQMV82LCBuYS5ybT1UKVsyXQogICAgICAgICAgICApCmNpX2FsdW14c2V4bwpgYGAKClNlIGVuY3VlbnRyYSBxdWUgbGEgbWVkaWEgZGUgYWx1bW5vcyBxdWUgYXRpZW5kZSB1biBkb2NlbnRlIGhvbWJyZSBlc3RhIGVudHJlIDUwLjcgeSA1My44IGFsdW1ub3MsIG1pZW50cmFzIHF1ZSBlbiBlbCBjYXNvIGRlIGxhcyBkb2NlbnRlcyBtdWplcmVzIGVzdMOhIGVudHJlIDMzLjMgeSAzNC44IGFsdW1ub3MgZW4gYXVsYS4KCsK/UXXDqSBtw6FzIHNlIHB1ZWRlIGRlY2lyIGRlIGVzdGEgY29tcGFyYWNpw7NuIGVudHJlIGludGVydmFsb3MgZGUgY29uZmlhbnphPwrCv0PDs21vIGdyYWZpY2FyIGVzdG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphPwoKIyBCaWJsaW9ncmFmw61hCg==