Tolerancia a los golpes ejecutivos
El gráfico 1.7 del reporte El pulso de la Democracia para la ronda
del Barómetro de las Américas 2021 presenta los resultados del
porcentaje de ciudadanos que tolera un golpe ejecutivo. En el gráfico
estos datos están representados por la altura de la barra. Este gráfico,
además, presente el intervalo de confianza al 95% de este porcentaje en
cada país, graficado como una líneas punteadas alrededor de la punto
máximo de la barra, que indica el límite inferior y superior del
intervalo de confianza.
La variable para construir este gráfico es “jc15a” que está fraseada:
¿Cree usted que cuando el país enfrenta momentos muy difíciles, se
justifica que el presidente del país cierre el Congreso/Asamblea y
gobierno sin Congreso/Asamblea? Las opciones de respuesta son:
- Sí se justifica
- No se justifica
Describiendo la tolerancia a los golpes ejecutivos
Para calculas los porcentajes de ciudadanos que justifican o toleran
los golpes ejecutivos se tiene que recodificar esta variable, de tal
manera que aquellos que justifican tengan el valor 100 y los que no
justifican, el valor 0. En este caso se usa el comando
recode
y se tabula, mediante table
, para
verificar la recodificación.
lapop21$jc15ar = car::recode(lapop21$jc15a, "1=100; 2=0")
table(lapop21$jc15ar)
##
## 0 100
## 14711 5908
Para calcular el porcentaje de ciudadanos que toleran los golpes
ejecutivos se puede usar los comandos table
y
prop.table
. La nueva variable “jc15ar” es una variable
dummy. En este tipo de variables, la media corresponde a la proporción
de respuestas 100. Es decir, si calculamos la media de esta variable, se
está calculando el porcentaje para todos los entrevistados. En esta
sección vamos a tratar a esta variable como si fuera una variable
numérica. En sentido estricto es una variable categórica nominal. Los
cálculos de desviaciones estándar y luego de intervalos de confianza,
por lo tanto, son referenciales.
El resultado indica que en toda la muestra, el porcentaje de
ciudadanos que toleran los golpes ejecutivos es de 28.7%.
summary(lapop21$jc15ar)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 0.00 0.00 28.65 100.00 100.00 40042
Intervalos de confianza de tolerancia a los golpes ejecutivos
Para calcular el intervalo de confianza al 95% de este porcentaje, se
puede usar el comando t.test
o la librería
lsr
, que tiene el comando ciMean
. En ambos
casos, el resultado nos indica que el porcentaje de ciudadanos que
tolera los golpes ejecutivos en la región está entre 28% y 29.3%.
t.test(lapop21$jc15ar)
##
## One Sample t-test
##
## data: lapop21$jc15ar
## t = 90.996, df = 20618, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 28.03599 29.27038
## sample estimates:
## mean of x
## 28.65318
library(lsr)
ciMean(as.numeric(lapop21$jc15ar), na.rm=T)
## 2.5% 97.5%
## [1,] 28.03599 29.27038
Tolerancia a los golpes ejecutivos por país
El gráfico 1.7 muestra el porcentaje de ciudadanos que toleran los
golpes ejecutivos por país. Para replicar este gráfico, primero tenemos
que definir que la variable “pais” es de tipo factor. Se guarda este
cambio en una nueva variable “paises”, la que se etiqueta con las siglas
de cada país.
lapop21$paises = as.factor(lapop21$pais)
levels(lapop21$paises) = c("MX", "GT", "SV", "HN", "NI", "CR",
"PN", "CO", "EC", "BO", "PE",
"PY", "CL", "UY", "BR", "AR", "DO",
"HT", "JA", "GU")
table(lapop21$paises)
##
## MX GT SV HN NI CR PN CO EC BO PE PY CL UY BR AR
## 2998 3000 3245 2999 2997 2977 3183 3003 3005 3002 3038 3004 2954 3009 3016 3011
## DO HT JA GU
## 3000 3088 3121 3011
Para calcular estos porcentajes por país, se puede usar varias
alternativas. Una de las maneras más directas es con la librería
Rmisc
. Esta librería tiene el comando
group.CI
, que calcula la media, el límite inferior y
superior de una variable por grupos de otra variable. Esta tabla se
guarda en un objeto llamado “golpe”. Este comando no incluye las filas
de los países donde no hay datos, por lo que no hay filas de Costa Rica
ni de Guyana.
library(Rmisc)
golpe = group.CI(jc15ar~paises, lapop21)
golpe
Con esta tabla podemos replicar el gráfico 1.7 con la librería
ggplot2
. Para incluir los intervalos de confianza se tiene
que agregar la especificación geom_errorbar()
. La tabla
“golpe” tiene el dato de “ymin” en la columna “jc15ar.lower” y el dato
de “ymax” en la columna “jc15ar.upper”. Estos datos se deben ingresar en
la especificación aes
dentro de geom_errorbar
.
Además, se tiene como opciones width
para especificar el
ancho de las bigotes de las barras de error, color
para
especificar el color, cex
para especificar el ancho de las
líneas y linetype
para especificar el tipo de líneas, en
este caso puntuadas.
Para poder ordenar las barras de acuerdo al valor de la variable, se
puede usar la especificación reorder(grupo, variable)
dentro de la especificación aes
de ggplot
.
library(ggplot2)
graf1 = ggplot(golpe, aes(x=reorder(paises, -jc15ar.mean), y=jc15ar.mean))+
geom_bar(width=0.5, fill="darkslategray3", colour="#69b3a2", stat="identity")+
geom_errorbar(aes(ymin=jc15ar.lower, ymax=jc15ar.upper), width=0.4,
color="darkcyan", cex=0.4, linetype=3)+
geom_text(aes(label=paste(round(jc15ar.mean, 1), "%")), vjust=-4.4, size=2.5)+
xlab("País") + ylab("Tolerancia a golpes ejecutivos (%)")+
ylim(0, 60)
graf1
Estos datos, sin embargo, no son exactamente iguales a los
presentados en el gráfico 1.7 debido a que estos cálculos no incluyen el
efecto de diseño. Más adelante, se verá cómo incluir el efecto de diseño
para replicar el gráfico exactamente.
Satisfacción con la democracia
El gráfico 3.9 del reporte El Pulso de la Democracia de la ronda
2018/19 presenta el porcentaje de entrevistados que está satisfecho con
la democracia por tipo de usuarios de redes sociales. El porcentaje está
marcado como un punto y el intervalo de confianza como un área gris
alrededor de estos puntos.
La variable satisfacción con la democracia se llama “pn4” y está
codificada de la siguiente manera:
- Muy satisfecho
- Satisfecho
- Insatisfecho
- Muy insatisfecho
La nota 21 de este reporte indica que “Se codifica a los
entrevistados que seleccionan (1) o (2) como satisfechos con la
democracia”. Por lo tanto, se tiene que recodificar esta variable. En
este caso se usa el comando recode
y se tabula, mediante
table
, para verificar la recodificación.
library(car)
table(lapop18$pn4)
##
## 1 2 3 4
## 1727 8916 12455 3855
lapop18$pn4rr = car::recode(lapop18$pn4, "1:2=100; 3:4=0")
table(lapop18$pn4rr)
##
## 0 100
## 16310 10643
La nueva variable “pn4rr” es una variable dummy. En este tipo de
variables, la media corresponde a la proporción de respuestas 100. Es
decir, si calculamos la media de esta variable, se está calculando el
porcentaje para todos los entrevistados. En esta sección vamos a tratar
a esta variable como si fuera una variable numérica. En sentido estricto
es una variable categórica nominal. Los cálculos de desviaciones
estándar y luego de intervalos de confianza, por lo tanto, son
referenciales.
summary(lapop18$pn4rr)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 0.00 0.00 39.49 100.00 100.00 1089
Estos resultados muestran una media de 39.5, es decir el 39.5% de los
entrevistados están satisfechos con la democracia. Se puede calcular
también el intervalo de confianza de esta variable de varias formas. Una
primera es mediante la prueba t de una muestra, usando el comando
t.test
. Otra forma es usando el comando ciMean
de la librería lsr
.
t.test(lapop18$pn4rr)
##
## One Sample t-test
##
## data: lapop18$pn4rr
## t = 132.62, df = 26952, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 38.90364 40.07087
## sample estimates:
## mean of x
## 39.48726
library(lsr)
ciMean(lapop18$pn4rr, na.rm=T)
## 2.5% 97.5%
## [1,] 38.90364 40.07087
Estos resultados indican que el intervalo de confianza de la media de
satisfacción con la democracia varía entre 38.9% y 40.1% con 95% de
confianza. Se podría cambiar este valor por defecto a 99% de confianza
agregando la especificación conf = 0.99
al comando
ciMean
.
Satisfacción con la democracia por grupos de consumo de información
en redes sociales
El informe usa una variable que mide la “exposición frecuente a
información política”. Esta variable se construye de una manera
compleja, sobre la base de las 3 redes sociales por las que se pregunta.
En este caso vamos a empezar con una recodificación más simple para
recrear los intervalos de confianza de la variable “satisfacción de la
democracia” por grupo de frecuencia de consumo de información de cada
red social. Luego se procederá a replicar la variable que se usa en el
reporte. La frecuencia de consumo de información (variables “smedia2”
para Facebook, “smedia5” para Twitter y “smedia8” para Whatsapp) de cada
red social se mide en la siguiente escala:
- Diariamente
- Algunas veces a la semana
- Algunas veces al mes
- Algunas veces al año
- Nunca
Vamos a recodificar estas variables de tal manera que aquellos que
responden diariamente o algunas veces a la semana serán clasificados
como de “alto uso”, aquellos que responden del 3 al 4 serán clasificados
como de “bajo uso” y aquellos que responden “nunca” serán clasificados
como “no usuarios”. Un esquema similar de clasificación se usa para
definir a los usuarios de las 3 redes sociales. Las nuevas variables
recodificadas, se convierten a factor y se etiquetan.
table(lapop18$smedia2)
##
## 1 2 3 4 5
## 8633 4927 1286 282 231
table(lapop18$smedia5)
##
## 1 2 3 4 5
## 795 728 422 193 220
table(lapop18$smedia8)
##
## 1 2 3 4 5
## 14151 2646 495 50 87
lapop18$smedia2r = car::recode(lapop18$smedia2, "1:2=1; 3:4=2; 5=3")
lapop18$smedia5r = car::recode(lapop18$smedia5, "1:2=1; 3:4=2; 5=3")
lapop18$smedia8r = car::recode(lapop18$smedia8, "1:2=1; 3:4=2; 5=3")
lapop18$smedia2r = as.factor(lapop18$smedia2r)
lapop18$smedia5r = as.factor(lapop18$smedia5r)
lapop18$smedia8r = as.factor(lapop18$smedia8r)
levels(lapop18$smedia2r) = c("Alto uso", "Bajo uso", "No usuario")
levels(lapop18$smedia5r) = c("Alto uso", "Bajo uso", "No usuario")
levels(lapop18$smedia8r) = c("Alto uso", "Bajo uso", "No usuario")
table(lapop18$smedia2r)
##
## Alto uso Bajo uso No usuario
## 13560 1568 231
table(lapop18$smedia5r)
##
## Alto uso Bajo uso No usuario
## 1523 615 220
table(lapop18$smedia8r)
##
## Alto uso Bajo uso No usuario
## 16797 545 87
Con estas variables recodificadas, se puede calcular las medias (que
son los porcentajes) de satisfacción con la democracia por cada grupo de
consumo de información en redes sociales.
Una opción que permite mostrar muchos estadísticos por cada grupo es
describeBy
de la librería psych
. El código
para Twitter es:
library(psych)
describeBy(lapop18$pn4rr, group=lapop18$smedia5r)
##
## Descriptive statistics by group
## group: Alto uso
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1505 39.67 48.94 0 37.1 0 0 100 100 0.42 -1.82 1.26
## ------------------------------------------------------------
## group: Bajo uso
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 602 37.38 48.42 0 34.23 0 0 100 100 0.52 -1.73 1.97
## ------------------------------------------------------------
## group: No usuario
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 213 41.78 49.44 0 39.77 0 0 100 100 0.33 -1.9 3.39
Sin embargo, lo que nos interesa es calcular los intervalos de
confianza para cada grupo. En el gráfico 3.9 del reporte se presenta la
media de satisfacción con la democracia, mostrado como un punto, y los
intervalos de confianza de cada grupo, mostrados como un área gris con
límites inferior y superior. Se puede usar la librería
Rmisc
y el comando group.CI
para calcular los
intervalos de confianza de la variable satisfacción con la democracia
por grupos de consumo de información en Facebook.
library(Rmisc)
group.CI(pn4rr~smedia2r, lapop18)
Con estos datos, por ejemplo, la media de satisfacción con la
democracia entre el grupo de alto uso de información en Facebook es
37.6%. El límite inferior del intervalo de confianza es 36.7% y el
límite superior es 38.4%. Con estos datos se podría replicar un gráfico
de barras similar al 3.9.
Intervalos de confianza de satisfacción con la democracia
La forma más fácil de graficar los intervalos de confianza por grupos
es usando el comando plotmeans
.
library(gplots)
plotmeans(lapop18$pn4rr~lapop18$smedia5r,
xlab="Tipo de usuario de Twitter",
ylab="Satisfacción con la democracia",
ylim=c(0, 50),
mean.labels=T, digits=1,
connect=F
)
Esta opción muestra los intervalos de confianza pero se dificulta si
se quiere graficar las barras. La librería ggplot
nos
brinda más opciones y nos permite graficar de manera similar al gráfico
3.9 del reporte, en barras, presentar los intervalos de confianza y
agregar color. Para esto, primero se guarda un dataframe “tw.uso” con
los datos de la media y los límites superior e inferior de cada grupo,
usando el comando group.CI
. Son los datos de este dataframe
los que se usan con ggplot
y se crea un gráfico que se
guarda en un objeto “graf1”. Con esta librería se agrega la capa
geom_bar()
para definir que se quiere un gráfico de barras
de las variables especificadas en aes
. Luego, se agrega la
capa geom_errorbar()
para agregar las barras de error y
luego los valores de la media con geom_text()
. Finalmente,
se etiqueta el eje X y Y con xlab
y ylab
y se
define los límites del eje Y con ylim
.
tw.uso = group.CI(pn4rr~smedia5r, lapop18)
library(ggplot2)
graf2 = ggplot(tw.uso, aes(x=smedia5r, y=pn4rr.mean))+
geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
geom_errorbar(aes(ymin=pn4rr.lower, ymax=pn4rr.upper), width=0.2)+
geom_text(aes(label=paste(round(pn4rr.mean, 1), "%")), vjust=-4.2, size=4)+
xlab("Tipo de usuario de Twitter") + ylab("Satisfacción con la democracia (%)")+
ylim(0, 50)
graf2
Según estos resultados, la satisfacción con la democracia es más alta
en aquellos que no son usuarios de Twitter, en comparación con los
usuarios, aunque las diferencias no son estadísticamente significativas
de una comparación visual entre los intervalos de confianza.
Satisfacción con la democracia por tipo de usuario de redes
sociales
Hasta el momento se ha creado intervalos de confianza de satisfacción
con la democracia por tipo de usuarios de Twitter. El reporte agrega a
los usuarios de las tres redes sociales para ubicar tres tipos de
usuarios: usuarios de alto uso, de bajo uso y no usuarios de cualquier
red social. La forma de codificación de este tipo de usuarios de tres
redes sociales se basa en varias condiciones. Como dice el reporte:
“Usamos la misma codificación que en la anterior sección, para
distinguir entre quienes acceden con frecuencia en redes sociales
(aquellos con cuentas a las que acceden algunas veces a la semana o a
diario) y aquellos que no acceden a las redes sociales muy
frecuentemente (aquellos con cuentas a las que acceden algunas veces al
mes o algunas veces al año). También incluimos a quienes no son
usuarios: quienes no tienen ninguna cuenta en redes sociales (quienes
indican que no tienen una cuenta en Facebook, Twitter o Whatsapp) y
quienes tienen una cuenta, pero nunca la usan” (p.81). En primer lugar
identificamos a quienes usan cada red social algunas veces a la semana o
a diario como 1 y si usan cada red social algunas veces al mes o algunas
veces al año, como 0. Para esto usamos el comando ifelse
.
Luego, sumamos los valores de cada red social en una sola variable, con
valores entre 0 y 3. Se usa el comando rowSums
que permite
la suma horizontal de variables definidas, en este caso las que están en
la posición [, 89:91]
. En este comando, usamos la
especificación na.rm=T
para que la suma no tome en cuenta a
los valores perdidos.
lapop18$sm2 = ifelse(lapop18$smedia2==1 | lapop18$smedia2==2, 1, 0)
lapop18$sm5 = ifelse(lapop18$smedia5==1 | lapop18$smedia5==2, 1, 0)
lapop18$sm8 = ifelse(lapop18$smedia8==1 | lapop18$smedia8==2, 1, 0)
lapop18$anyhi = rowSums(lapop18[,89:91], na.rm=T)
table(lapop18$anyhi)
##
## 0 1 2 3
## 9831 5811 11131 1269
Partiendo de esta variable, se crea una variable que agrega las tres
redes sociales, llamada “hi_lo_non”. Primero, se crea esta variable como
un vector de NAs. Luego se le imputa valores de 1, 2, 3 o NA,
dependiendo de los valores de “anyhi o de los valores de las variables
de redes sociales. Luego se crea una nueva variable de tipo factor, con
idénticos valores que”hi_lo_non” y se etiqueta. La definición de la
condicionalidad se trabaja mediante los corchetes [...]
. De
esta manera, se define las condiciones de la siguiente manera:
La variable “hi_lo_non es igual a 1 si la variable anyhi es mayor
o igual a 1 (uso diario o algunas veces a la semana) =
lapop18$hi_lo_non[lapop18$anyhi>=1] <- 1
La variable “hi_lo_non es igual a 2 si la variable anyhi es igual
a 0 (uso algunas veces al año o nunca) =
lapop18$hi_lo_non[lapop18$anyhi==0] <- 2
La variable “hi_lo_non es igual a 3 si las variables de tenencia
de cuentas son igual a 2 (No) =
lapop18$hi_lo_non[lapop18$smedia1==2 & lapop18$smedia4==2 & lapop18$smedia7==2] <- 3
Las siguiente reglas de codificación siguen la misma lógica de
combinación de otras variables para imputar el valor 3 o NA.
lapop18$hi_lo_non = NA #se crea un vector con NAs#
lapop18$hi_lo_non[lapop18$anyhi>=1] = 1 #Se codifica 1 a los que usan diariamente o algunas veces a la semana alguna red social#
lapop18$hi_lo_non[lapop18$anyhi==0] = 2 #Se codifica como 2 a los que usan algunas veces al mes y al año alguna red social#
lapop18$hi_lo_non[lapop18$smedia1==2 & lapop18$smedia4==2 & lapop18$smedia7==2] = 3 #Se codifica como 3 a los que no tiene redes sociales#
lapop18$hi_lo_non[lapop18$smedia2==5 & lapop18$smedia5==5 & lapop18$smedia8==5] = 3 #Se codifica como 3 a los que nunca usan ninguna red social#
lapop18$hi_lo_non[lapop18$pais==3 & (lapop18$smedia2==5 | lapop18$smedia5==5 | lapop18$smedia8==5)] = 3 #Se aplica un código particular a pais 3#
lapop18$hi_lo_non[lapop18$pais==3 & (lapop18$smedia1==2 | lapop18$smedia4==2 | lapop18$smedia7==2)] = 3 #Se aplica un código particular a pais 3#
lapop18$hilon = as.factor(lapop18$hi_lo_non)
levels(lapop18$hilon) = c("Alto uso", "Bajo uso", "No usuario")
prop.table(table(lapop18$hilon))*100
##
## Alto uso Bajo uso No usuario
## 64.941873 3.480494 31.577634
Según estos datos, el 64.9% de entrevistados reportan un alto uso de
redes sociales, mientras que, en el otro extremo, se tiene 31.6% que
serían no usuarios de ninguna red social. Estos datos difieren un poco
de los reportados en el Apéndice al reporte, disponible aquí,
donde se reporte 65.34% de alto uso y 31.60% de no usuarios. Estas
diferencias pueden ser debidas a diferencias en la interpretación de las
reglas de codificación desde Stata a R.
De la misma forma que se produjo el gráfico de media de satisfacción
con la democracia por tipos de usuarios de Twitter usando
ggplot
, ahora se hará lo mismo pero para los usuarios de
las tres redes sociales, variable “hilon”.
library(Rmisc)
satis.uso = group.CI(pn4rr~hilon, lapop18)
library(ggplot2)
graf3.9 = ggplot(satis.uso, aes(x=hilon, y=pn4rr.mean))+
geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
geom_errorbar(aes(ymin=pn4rr.lower, ymax=pn4rr.upper), width=0.2)+
geom_text(aes(label=paste(round(pn4rr.mean, 1), "%")), vjust=-2.5, size=4)+
xlab("Tipo de usuario de redes sociales") + ylab("Satisfacción con la democracia (%)")+
ylim(0, 50)
graf3.9
Este gráfico sería una reproducción del que se presenta en el informe
(Gráfico 3.9 en la página 62), con una mínimas diferencias por
codificación de los datos resultantes.
Cálculos incluyendo el efecto de diseño
Resultados de tolerancia a los golpes ejecutivos ponderados
Como se mencionó, los resultados obtenidos acerca de la tolerancia de
los golpes ejecutivos, gráfico 1.7 del reporte El Pulso de la Democracia
2021, no son iguales a los obtenidos aquí. Esto es debido a que los
cálculos de más arriba no incluye el efecto de diseño.
Para poder realizar los cálculos tomando en cuenta el efecto de
diseño, se puede usar la librería survey
para definir el
diseño muestral. Primero, se tiene que adecuar la base de datos,
eliminando los valores perdidos de las variables que definen el diseño
muestral (como “weight1500”). Un paso adicional es transformar las
variables del dataframe. Esto es debido a que cuando se importan, el
sistema lee las variables como tipo “haven_labelled”, es decir, mantiene
las etiquetas de las variables, con lo que se podría producir un libro
de códigos. Esto es útil en otras ocasiones, pero genera problemas con
la librería survey
. Para esto transformamos las variables a
otro tipo con el comando sapply
.
Con la base de datos adecuada, se puede definir el diseño muestra y
se guarda en un objeto “diseno21”.
library(survey)
diseno21 = svydesign(ids = ~upm, strata = ~strata, weights = ~weight1500, nest=TRUE, data=lapop21)
La librería survey
tiene comandos nativos para calcular
la media de la variable recodificada de tolerancia a los golpes
ejecutivos. Este cálculo de la media nos brinda el porcentaje de
ciudadanos en la región que son tolerantes a los golpes ejecutivos.
svymean(~jc15ar, diseno21, na.rm=T)
## mean SE
## jc15ar 30.391 0.3926
Para calcular el intervalo de confianza de esta medida se puede
anidar el comando svymean
dentro de otro comando
confint
que nos brinda el límite inferior y superior del
intervalo de confianza.
confint(svymean(~jc15ar, diseno21, na.rm=T))
## 2.5 % 97.5 %
## jc15ar 29.62125 31.1601
Para poder replicar el gráfico 1.7 requerimos el valor del porcentaje
de ciudadanos que toleran los golpes ejecutivos por páis, así como el
intervalo de confianza de cada uno. Para este cálculo, podemos usar el
comando svyby
. Este comando requiere definir la variable a
ser calculada (~jc15ar
), la variable que define los grupos
(~paises
), el objeto que guarda el diseño muestral
(diseno21
), el estadístico que se quiere calcular
(svymean, na.rm=T
) y definir el intervalo de confianza
(vartype = "ci"
). Estos cálculos se guardan en un objeto
“golpepond”.
golpepond = svyby(~jc15ar, ~paises, diseno21, svymean, na.rm=T, vartype = "ci")
golpepond = golpepond[-c(6,20),]
De la misma manera que con el gráfico con los resultados no
poderados, usamos la librería ggplot
para replicar el
gráfico 1.7. Se debe tomar en cuenta que el comando svybar
genera columnas con nombre diferentes a los que se generan con el
comando group.CI
usado más arriba.
graf3 = ggplot(golpepond, aes(x=reorder(paises, -jc15ar), y=jc15ar))+
geom_bar(width=0.5, fill="darkslategray3", colour="#69b3a2", stat="identity")+
geom_errorbar(aes(ymin=ci_l, ymax=ci_u), width=0.2, color="darkcyan",
cex=0.4, linetype=3)+
geom_text(aes(label=paste(round(jc15ar, 0), "%")), vjust=-4.4, size=2.5)+
xlab("País") + ylab("Tolerancia a golpes ejecutivos (%)")+
ylim(0, 60)
graf3
De esta manera se ha replicado exactamente los resultados reportados
en El Pulso de la Democracia 2021.
Resultados de satisfacción con la democracia ponderados
De la misma manera que con la tolerancia a los golpes ejecutivos, se
usa la librería survey
y el comando
confint
junto al comando nativo svymean
.
library(survey)
diseno18 = svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop18)
Se puede describir la variable de satisfacción con la democracia
incorporando el factor de diseño usando el comando
svymean
.
svymean(~pn4rr, diseno18, na.rm=T)
## mean SE
## pn4rr 39.459 0.3317
Para calcular el intervalo de confianza, se tiene que anidar el
código anterior dentro del comando confint
. Este comando
calcula el intervalo de confianza al 95% por defecto. Se podría cambiar
este valor por defecto a 99% de confianza agregando la especificación
conf = 0.99
al comando.
confint(svymean(~pn4rr, diseno18, na.rm=T))
## 2.5 % 97.5 %
## pn4rr 38.80884 40.10901
También se puede calcular la media y el intervalo de confianza de
satisfacción con la democracia incorporando el efecto de diseño usando
el comando svyby
. Dentro de este comando se especifica la
variable numérica a ser descrita (~pn4rr
), la variable que
forma los grupos (~smedia5r
), el diseño muestral
(diseno18
), la función que se quiere calcular
(svymean
), que no tome en cuenta los valores perdidos
(na.rm=T
) y que incluya el intervalo de confianza de cada
grupo (vartype="ci"
).
tw.uso.weighted = svyby(~pn4rr, ~smedia5r, diseno18, svymean, na.rm=T, vartype = "ci")
tw.uso.weighted
Para poder graficar, estos cálculos se guardan en un dataframe
“tw.uso.weighted”, que incluye los datos de la media por cada grupo y el
límite inferior y superior del intervalo de confianza. De la misma
manera que con los datos que no incluyen el efecto de diseño, se usa la
librería ggplot
y se crea un gráfico que se guarda en un
objeto “graf2”. Se usan especificaciones muy similares a los ejemplos
anteriores.
graf4 = ggplot(tw.uso.weighted, aes(x=smedia5r, y=pn4rr))+
geom_bar(width=0.5, fill="darkcyan", colour="black", stat="identity")+
geom_errorbar(aes(ymin=ci_l, ymax=ci_u), width=0.2)+
geom_text(aes(label=paste(round(pn4rr, 1), "%")), vjust=-4.2, size=4)+
xlab("Tipo de usuario de Twitter") + ylab("Satisfacción con la democracia (%)")+
ylim(0, 50)
graf4
Estos resultados incluyen el efecto de diseño, pero no son
exactamente iguales a los reportados en el gráfico 3.9 del reporte El
Pulso de la Democracia de la ronda 2018/19 debido a que el cálculo de la
variable que define al tipo de usuario de Twitter es más complejo de lo
que se hace en esta sección.
LS0tCnRpdGxlOiAiSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgdXNhbmRvIGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiBubwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkVuIGVzdGUgZG9jdW1lbnRvIHZlcmVtb3MgY8OzbW8gY29uc3RydWlyIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIHVzYW5kbyBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcy4KUGFyYSBlc28sIHZhbW9zIGEgdXNhciBsb3MgcmVwb3J0ZXMgIkVsIHB1bHNvIGRlIGxhIGRlbW9jcmFjaWEiIGRlIDIwMTgvMTksIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMTgvMjAxOC0xOV9BbWVyaWNhc0Jhcm9tZXRlcl9SZWdpb25hbF9SZXBvcnRfU3BhbmlzaF9XXzAzLjI3LjIwLnBkZiksIHkgZGUgMjAyMSwgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vd3d3LnZhbmRlcmJpbHQuZWR1L2xhcG9wL2FiMjAyMS8yMDIxX0xBUE9QX0FtZXJpY2FzQmFyb21ldGVyX1B1bHNlX29mX0RlbW9jcmFjeS5wZGYpLgpFbiBsYSByb25kYSAyMDE4LzE5LCB1bmEgZGUgbGFzIHNlY2Npb25lcyBkZSBlc3RlIGluZm9ybWUsIHJlcG9ydGEgbG9zIGRhdG9zIHNvYnJlIHJlZGVzIHNvY2lhbGVzIHkgYWN0aXR1ZGVzIHBvbMOtdGljYXMuCkVuIHBhcnRpY3VsYXIsIHNlIHJlcG9ydGEsIGVuIGVsIGdyw6FmaWNvIDMuOSwgZWwgZ3JhZG8gZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSBwb3IgdGlwbyBkZSB1c3VhcmlvIGRlIHJlZGVzIHNvY2lhbGVzLgpFbiBsYSByb25kYSAyMDIxLCB1bmEgZGUgbGFzIHNlY2Npb25lcyByZXBvcnRhIGxvcyBkYXRvcyBzb2JyZSBnb2xwZXMgZWplY3V0aXZvcy4KRW4gZWwgZ3LDoWZpY28gMS43IHNlIHByZXNlbnRhIGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9yIHBhw61zLgpFbiBhbWJvcyBjYXNvcywgbG9zIHJlc3VsdGFkb3MgaW5jbHV5ZW4gbGFzIGVzdGltYWNpb25lcyBwdW50dWFsZXMgeSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEuCgojIFNvYnJlIGxhcyBiYXNlcyBkZSBkYXRvcwoKTG9zIGRhdG9zIHF1ZSB2YW1vcyBhIHVzYXIgZGViZW4gY2l0YXJzZSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiBGdWVudGU6IEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwb3IgZWwgUHJveWVjdG8gZGUgT3BpbmnDs24gUMO6YmxpY2EgZGUgQW3DqXJpY2EgTGF0aW5hIChMQVBPUCksIHd3d3cuTGFwb3BTdXJ2ZXlzLm9yZy4KRW4gZXN0ZSBkb2N1bWVudG8gc2UgY2FyZ2EgdW5hIGJhc2UgZGUgZGF0b3MgcmVjb3J0YWRhLgpFc3RhIGJhc2UgZGUgZGF0b3Mgc2UgZW5jdWVudHJhIGFsb2phZGEgZW4gZWwgcmVwb3NpdG9yaW8gIm1hdGVyaWFsc19lZHUiIGRlIGxhIGN1ZW50YSBkZSBMQVBPUCBlbiBHaXRIdWIuClNlIHJlY29taWVuZG8gbGltcGlhciBlbCBFbnZpcm9ubWVudCBhbnRlcyBkZSBwcm9jZWRlciBjb24gZXN0YSBzZWNjacOzbi4KCk1lZGlhbnRlIGxhIGxpYnJlcsOtYSBgcmlvYCB5IGVsIGNvbWFuZG8gYGltcG9ydGAgc2UgcHVlZGUgaW1wb3J0YXIgZXN0YSBiYXNlIGRlIGRhdG9zIGRlc2RlIGVzdGUgcmVwb3NpdG9yaW8uCkFkZW3DoXMsIHNlIHNlbGVjY2lvbmFuIGxvcyBkYXRvcyBkZSBwYcOtc2VzIGNvbiBjw7NkaWdvcyBtZW5vcmVzIG8gaWd1YWxlcyBhIDM1LCBlcyBkZWNpciwgc2UgZWxpbWluYSBsYXMgb2JzZXJ2YWNpb25lcyBkZSBFc3RhZG9zIFVuaWRvcyB5IENhbmFkw6EuCgpgYGB7ciBiYXNlfQpsaWJyYXJ5KHJpbykKbGFwb3AxOCA9IGltcG9ydCgiaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9sYXBvcC1jZW50cmFsL21hdGVyaWFsc19lZHUvbWFpbi9MQVBPUF9BQl9NZXJnZV8yMDE4X3YxLjAuc2F2IikKbGFwb3AxOCA9IHN1YnNldChsYXBvcDE4LCBwYWlzPD0zNSkKYGBgCgpUYW1iacOpbiBjYXJnYW1vcyBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMjEuCgpgYGB7ciBiYXNlMjF9CmxhcG9wMjEgPSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vbGFwb3AyMS5SRGF0YSIpCmxhcG9wMjEgPSBzdWJzZXQobGFwb3AyMSwgcGFpczw9MzUpCmBgYAoKIyBUb2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zCgpFbCBncsOhZmljbyAxLjcgZGVsIHJlcG9ydGUgRWwgcHVsc28gZGUgbGEgRGVtb2NyYWNpYSBwYXJhIGxhIHJvbmRhIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgMjAyMSBwcmVzZW50YSBsb3MgcmVzdWx0YWRvcyBkZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmEgdW4gZ29scGUgZWplY3V0aXZvLgpFbiBlbCBncsOhZmljbyBlc3RvcyBkYXRvcyBlc3TDoW4gcmVwcmVzZW50YWRvcyBwb3IgbGEgYWx0dXJhIGRlIGxhIGJhcnJhLgpFc3RlIGdyw6FmaWNvLCBhZGVtw6FzLCBwcmVzZW50ZSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk1JSBkZSBlc3RlIHBvcmNlbnRhamUgZW4gY2FkYSBwYcOtcywgZ3JhZmljYWRvIGNvbW8gdW5hIGzDrW5lYXMgcHVudGVhZGFzIGFscmVkZWRvciBkZSBsYSBwdW50byBtw6F4aW1vIGRlIGxhIGJhcnJhLCBxdWUgaW5kaWNhIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCiFbXShGaWd1cmUxLjcucG5nKXt3aWR0aD0iNTY0In0KCkxhIHZhcmlhYmxlIHBhcmEgY29uc3RydWlyIGVzdGUgZ3LDoWZpY28gZXMgImpjMTVhIiBxdWUgZXN0w6EgZnJhc2VhZGE6IMK/Q3JlZSB1c3RlZCBxdWUgY3VhbmRvIGVsIHBhw61zIGVuZnJlbnRhIG1vbWVudG9zIG11eSBkaWbDrWNpbGVzLCBzZSBqdXN0aWZpY2EgcXVlIGVsIHByZXNpZGVudGUgZGVsIHBhw61zIGNpZXJyZSBlbCBDb25ncmVzby9Bc2FtYmxlYSB5IGdvYmllcm5vIHNpbiBDb25ncmVzby9Bc2FtYmxlYT8KTGFzIG9wY2lvbmVzIGRlIHJlc3B1ZXN0YSBzb246CgoxLiAgU8OtIHNlIGp1c3RpZmljYQoyLiAgTm8gc2UganVzdGlmaWNhCgojIyBEZXNjcmliaWVuZG8gbGEgdG9sZXJhbmNpYSBhIGxvcyBnb2xwZXMgZWplY3V0aXZvcwoKUGFyYSBjYWxjdWxhcyBsb3MgcG9yY2VudGFqZXMgZGUgY2l1ZGFkYW5vcyBxdWUganVzdGlmaWNhbiBvIHRvbGVyYW4gbG9zIGdvbHBlcyBlamVjdXRpdm9zIHNlIHRpZW5lIHF1ZSByZWNvZGlmaWNhciBlc3RhIHZhcmlhYmxlLCBkZSB0YWwgbWFuZXJhIHF1ZSBhcXVlbGxvcyBxdWUganVzdGlmaWNhbiB0ZW5nYW4gZWwgdmFsb3IgMTAwIHkgbG9zIHF1ZSBubyBqdXN0aWZpY2FuLCBlbCB2YWxvciAwLgpFbiBlc3RlIGNhc28gc2UgdXNhIGVsIGNvbWFuZG8gYHJlY29kZWAgeSBzZSB0YWJ1bGEsIG1lZGlhbnRlIGB0YWJsZWAsIHBhcmEgdmVyaWZpY2FyIGxhIHJlY29kaWZpY2FjacOzbi4KCmBgYHtyIHRvbGVyYW5jaWF9CmxhcG9wMjEkamMxNWFyID0gY2FyOjpyZWNvZGUobGFwb3AyMSRqYzE1YSwgIjE9MTAwOyAyPTAiKQp0YWJsZShsYXBvcDIxJGpjMTVhcikKYGBgCgpQYXJhIGNhbGN1bGFyIGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3Mgc2UgcHVlZGUgdXNhciBsb3MgY29tYW5kb3MgYHRhYmxlYCB5IGBwcm9wLnRhYmxlYC4KTGEgbnVldmEgdmFyaWFibGUgImpjMTVhciIgZXMgdW5hIHZhcmlhYmxlIGR1bW15LgpFbiBlc3RlIHRpcG8gZGUgdmFyaWFibGVzLCBsYSBtZWRpYSBjb3JyZXNwb25kZSBhIGxhIHByb3BvcmNpw7NuIGRlIHJlc3B1ZXN0YXMgMTAwLgpFcyBkZWNpciwgc2kgY2FsY3VsYW1vcyBsYSBtZWRpYSBkZSBlc3RhIHZhcmlhYmxlLCBzZSBlc3TDoSBjYWxjdWxhbmRvIGVsIHBvcmNlbnRhamUgcGFyYSB0b2RvcyBsb3MgZW50cmV2aXN0YWRvcy4KRW4gZXN0YSBzZWNjacOzbiB2YW1vcyBhIHRyYXRhciBhIGVzdGEgdmFyaWFibGUgY29tbyBzaSBmdWVyYSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLgpFbiBzZW50aWRvIGVzdHJpY3RvIGVzIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBub21pbmFsLgpMb3MgY8OhbGN1bG9zIGRlIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgeSBsdWVnbyBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSwgcG9yIGxvIHRhbnRvLCBzb24gcmVmZXJlbmNpYWxlcy4KCkVsIHJlc3VsdGFkbyBpbmRpY2EgcXVlIGVuIHRvZGEgbGEgbXVlc3RyYSwgZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmFuIGxvcyBnb2xwZXMgZWplY3V0aXZvcyBlcyBkZSAyOC43JS4KCmBgYHtyIHJlc3VtZW4gdG9sZXJhbmNpYX0Kc3VtbWFyeShsYXBvcDIxJGpjMTVhcikKYGBgCgojIyBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSB0b2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zCgpQYXJhIGNhbGN1bGFyIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgYWwgOTUlIGRlIGVzdGUgcG9yY2VudGFqZSwgc2UgcHVlZGUgdXNhciBlbCBjb21hbmRvIGB0LnRlc3RgIG8gbGEgbGlicmVyw61hIGBsc3JgLCBxdWUgdGllbmUgZWwgY29tYW5kbyBgY2lNZWFuYC4KRW4gYW1ib3MgY2Fzb3MsIGVsIHJlc3VsdGFkbyBub3MgaW5kaWNhIHF1ZSBlbCBwb3JjZW50YWplIGRlIGNpdWRhZGFub3MgcXVlIHRvbGVyYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MgZW4gbGEgcmVnacOzbiBlc3TDoSBlbnRyZSAyOCUgeSAyOS4zJS4KCmBgYHtyIGljIHRvbGVyYW5jaWF9CnQudGVzdChsYXBvcDIxJGpjMTVhcikKbGlicmFyeShsc3IpCmNpTWVhbihhcy5udW1lcmljKGxhcG9wMjEkamMxNWFyKSwgbmEucm09VCkKYGBgCgojIyBUb2xlcmFuY2lhIGEgbG9zIGdvbHBlcyBlamVjdXRpdm9zIHBvciBwYcOtcwoKRWwgZ3LDoWZpY28gMS43IG11ZXN0cmEgZWwgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSB0b2xlcmFuIGxvcyBnb2xwZXMgZWplY3V0aXZvcyBwb3IgcGHDrXMuClBhcmEgcmVwbGljYXIgZXN0ZSBncsOhZmljbywgcHJpbWVybyB0ZW5lbW9zIHF1ZSBkZWZpbmlyIHF1ZSBsYSB2YXJpYWJsZSAicGFpcyIgZXMgZGUgdGlwbyBmYWN0b3IuClNlIGd1YXJkYSBlc3RlIGNhbWJpbyBlbiB1bmEgbnVldmEgdmFyaWFibGUgInBhaXNlcyIsIGxhIHF1ZSBzZSBldGlxdWV0YSBjb24gbGFzIHNpZ2xhcyBkZSBjYWRhIHBhw61zLgoKYGBge3IgcGFpc30KbGFwb3AyMSRwYWlzZXMgPSBhcy5mYWN0b3IobGFwb3AyMSRwYWlzKQpsZXZlbHMobGFwb3AyMSRwYWlzZXMpID0gYygiTVgiLCAiR1QiLCAiU1YiLCAiSE4iLCAiTkkiLCAiQ1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBOIiwgIkNPIiwgIkVDIiwgIkJPIiwgIlBFIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQWSIsICJDTCIsICJVWSIsICJCUiIsICJBUiIsICJETyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFQiLCAiSkEiLCAiR1UiKQp0YWJsZShsYXBvcDIxJHBhaXNlcykKYGBgCgpQYXJhIGNhbGN1bGFyIGVzdG9zIHBvcmNlbnRhamVzIHBvciBwYcOtcywgc2UgcHVlZGUgdXNhciB2YXJpYXMgYWx0ZXJuYXRpdmFzLgpVbmEgZGUgbGFzIG1hbmVyYXMgbcOhcyBkaXJlY3RhcyBlcyBjb24gbGEgbGlicmVyw61hIGBSbWlzY2AuCkVzdGEgbGlicmVyw61hIHRpZW5lIGVsIGNvbWFuZG8gYGdyb3VwLkNJYCwgcXVlIGNhbGN1bGEgbGEgbWVkaWEsIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZSB1bmEgdmFyaWFibGUgcG9yIGdydXBvcyBkZSBvdHJhIHZhcmlhYmxlLgpFc3RhIHRhYmxhIHNlIGd1YXJkYSBlbiB1biBvYmpldG8gbGxhbWFkbyAiZ29scGUiLgpFc3RlIGNvbWFuZG8gbm8gaW5jbHV5ZSBsYXMgZmlsYXMgZGUgbG9zIHBhw61zZXMgZG9uZGUgbm8gaGF5IGRhdG9zLCBwb3IgbG8gcXVlIG5vIGhheSBmaWxhcyBkZSBDb3N0YSBSaWNhIG5pIGRlIEd1eWFuYS4KCmBgYHtyIGljIHRvbGVyYW5jaWEgcG9yIHBhaXN9CmxpYnJhcnkoUm1pc2MpCmdvbHBlID0gZ3JvdXAuQ0koamMxNWFyfnBhaXNlcywgbGFwb3AyMSkKZ29scGUKYGBgCgpDb24gZXN0YSB0YWJsYSBwb2RlbW9zIHJlcGxpY2FyIGVsIGdyw6FmaWNvIDEuNyBjb24gbGEgbGlicmVyw61hIGBnZ3Bsb3QyYC4KUGFyYSBpbmNsdWlyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBzZSB0aWVuZSBxdWUgYWdyZWdhciBsYSBlc3BlY2lmaWNhY2nDs24gYGdlb21fZXJyb3JiYXIoKWAuCkxhIHRhYmxhICJnb2xwZSIgdGllbmUgZWwgZGF0byBkZSAieW1pbiIgZW4gbGEgY29sdW1uYSAiamMxNWFyLmxvd2VyIiB5IGVsIGRhdG8gZGUgInltYXgiIGVuIGxhIGNvbHVtbmEgImpjMTVhci51cHBlciIuCkVzdG9zIGRhdG9zIHNlIGRlYmVuIGluZ3Jlc2FyIGVuIGxhIGVzcGVjaWZpY2FjacOzbiBgYWVzYCBkZW50cm8gZGUgYGdlb21fZXJyb3JiYXJgLgpBZGVtw6FzLCBzZSB0aWVuZSBjb21vIG9wY2lvbmVzIGB3aWR0aGAgcGFyYSBlc3BlY2lmaWNhciBlbCBhbmNobyBkZSBsYXMgYmlnb3RlcyBkZSBsYXMgYmFycmFzIGRlIGVycm9yLCBgY29sb3JgIHBhcmEgZXNwZWNpZmljYXIgZWwgY29sb3IsIGBjZXhgIHBhcmEgZXNwZWNpZmljYXIgZWwgYW5jaG8gZGUgbGFzIGzDrW5lYXMgeSBgbGluZXR5cGVgIHBhcmEgZXNwZWNpZmljYXIgZWwgdGlwbyBkZSBsw61uZWFzLCBlbiBlc3RlIGNhc28gcHVudHVhZGFzLgoKUGFyYSBwb2RlciBvcmRlbmFyIGxhcyBiYXJyYXMgZGUgYWN1ZXJkbyBhbCB2YWxvciBkZSBsYSB2YXJpYWJsZSwgc2UgcHVlZGUgdXNhciBsYSBlc3BlY2lmaWNhY2nDs24gYHJlb3JkZXIoZ3J1cG8sIHZhcmlhYmxlKWAgZGVudHJvIGRlIGxhIGVzcGVjaWZpY2FjacOzbiBgYWVzYCBkZSBgZ2dwbG90YC4KCmBgYHtyIGdyYWZpY28gdG9sZXJhbmNpYSBwb3IgcGFpc30KbGlicmFyeShnZ3Bsb3QyKQpncmFmMSA9IGdncGxvdChnb2xwZSwgYWVzKHg9cmVvcmRlcihwYWlzZXMsIC1qYzE1YXIubWVhbiksIHk9amMxNWFyLm1lYW4pKSsKICBnZW9tX2Jhcih3aWR0aD0wLjUsIGZpbGw9ImRhcmtzbGF0ZWdyYXkzIiwgY29sb3VyPSIjNjliM2EyIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWpjMTVhci5sb3dlciwgeW1heD1qYzE1YXIudXBwZXIpLCB3aWR0aD0wLjQsIAogICAgICAgICAgICAgICAgY29sb3I9ImRhcmtjeWFuIiwgY2V4PTAuNCwgbGluZXR5cGU9MykrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChqYzE1YXIubWVhbiwgMSksICIlIikpLCB2anVzdD0tNC40LCBzaXplPTIuNSkrCiAgeGxhYigiUGHDrXMiKSArIHlsYWIoIlRvbGVyYW5jaWEgYSBnb2xwZXMgZWplY3V0aXZvcyAoJSkiKSsKICB5bGltKDAsIDYwKQpncmFmMQpgYGAKCkVzdG9zIGRhdG9zLCBzaW4gZW1iYXJnbywgbm8gc29uIGV4YWN0YW1lbnRlIGlndWFsZXMgYSBsb3MgcHJlc2VudGFkb3MgZW4gZWwgZ3LDoWZpY28gMS43IGRlYmlkbyBhIHF1ZSBlc3RvcyBjw6FsY3Vsb3Mgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8uCk3DoXMgYWRlbGFudGUsIHNlIHZlcsOhIGPDs21vIGluY2x1aXIgZWwgZWZlY3RvIGRlIGRpc2XDsW8gcGFyYSByZXBsaWNhciBlbCBncsOhZmljbyBleGFjdGFtZW50ZS4KCiMgU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYQoKRWwgZ3LDoWZpY28gMy45IGRlbCByZXBvcnRlIEVsIFB1bHNvIGRlIGxhIERlbW9jcmFjaWEgZGUgbGEgcm9uZGEgMjAxOC8xOSBwcmVzZW50YSBlbCBwb3JjZW50YWplIGRlIGVudHJldmlzdGFkb3MgcXVlIGVzdMOhIHNhdGlzZmVjaG8gY29uIGxhIGRlbW9jcmFjaWEgcG9yIHRpcG8gZGUgdXN1YXJpb3MgZGUgcmVkZXMgc29jaWFsZXMuCkVsIHBvcmNlbnRhamUgZXN0w6EgbWFyY2FkbyBjb21vIHVuIHB1bnRvIHkgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBjb21vIHVuIMOhcmVhIGdyaXMgYWxyZWRlZG9yIGRlIGVzdG9zIHB1bnRvcy4KCiFbXShHcmFmMy45LnBuZyl7d2lkdGg9IjQxMyJ9CgpMYSB2YXJpYWJsZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHNlIGxsYW1hICJwbjQiIHkgZXN0w6EgY29kaWZpY2FkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKMS4gIE11eSBzYXRpc2ZlY2hvCjIuICBTYXRpc2ZlY2hvCjMuICBJbnNhdGlzZmVjaG8KNC4gIE11eSBpbnNhdGlzZmVjaG8KCkxhIG5vdGEgMjEgZGUgZXN0ZSByZXBvcnRlIGluZGljYSBxdWUgIlNlIGNvZGlmaWNhIGEgbG9zIGVudHJldmlzdGFkb3MgcXVlIHNlbGVjY2lvbmFuICgxKSBvICgyKSBjb21vIHNhdGlzZmVjaG9zIGNvbiBsYSBkZW1vY3JhY2lhIi4KUG9yIGxvIHRhbnRvLCBzZSB0aWVuZSBxdWUgcmVjb2RpZmljYXIgZXN0YSB2YXJpYWJsZS4KRW4gZXN0ZSBjYXNvIHNlIHVzYSBlbCBjb21hbmRvIGByZWNvZGVgIHkgc2UgdGFidWxhLCBtZWRpYW50ZSBgdGFibGVgLCBwYXJhIHZlcmlmaWNhciBsYSByZWNvZGlmaWNhY2nDs24uCgpgYGB7ciByZWNvZGlmaWNhciBzYXRpc2ZhY2Npb24sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoY2FyKQp0YWJsZShsYXBvcDE4JHBuNCkKbGFwb3AxOCRwbjRyciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkcG40LCAiMToyPTEwMDsgMzo0PTAiKQp0YWJsZShsYXBvcDE4JHBuNHJyKQpgYGAKCkxhIG51ZXZhIHZhcmlhYmxlICJwbjRyciIgZXMgdW5hIHZhcmlhYmxlIGR1bW15LgpFbiBlc3RlIHRpcG8gZGUgdmFyaWFibGVzLCBsYSBtZWRpYSBjb3JyZXNwb25kZSBhIGxhIHByb3BvcmNpw7NuIGRlIHJlc3B1ZXN0YXMgMTAwLgpFcyBkZWNpciwgc2kgY2FsY3VsYW1vcyBsYSBtZWRpYSBkZSBlc3RhIHZhcmlhYmxlLCBzZSBlc3TDoSBjYWxjdWxhbmRvIGVsIHBvcmNlbnRhamUgcGFyYSB0b2RvcyBsb3MgZW50cmV2aXN0YWRvcy4KRW4gZXN0YSBzZWNjacOzbiB2YW1vcyBhIHRyYXRhciBhIGVzdGEgdmFyaWFibGUgY29tbyBzaSBmdWVyYSB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLgpFbiBzZW50aWRvIGVzdHJpY3RvIGVzIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBub21pbmFsLgpMb3MgY8OhbGN1bG9zIGRlIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgeSBsdWVnbyBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSwgcG9yIGxvIHRhbnRvLCBzb24gcmVmZXJlbmNpYWxlcy4KCmBgYHtyIGRlc2NyaWJpciBzYXRpc2ZhY2Npb259CnN1bW1hcnkobGFwb3AxOCRwbjRycikKYGBgCgpFc3RvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHVuYSBtZWRpYSBkZSAzOS41LCBlcyBkZWNpciBlbCAzOS41JSBkZSBsb3MgZW50cmV2aXN0YWRvcyBlc3TDoW4gc2F0aXNmZWNob3MgY29uIGxhIGRlbW9jcmFjaWEuClNlIHB1ZWRlIGNhbGN1bGFyIHRhbWJpw6luIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgZXN0YSB2YXJpYWJsZSBkZSB2YXJpYXMgZm9ybWFzLgpVbmEgcHJpbWVyYSBlcyBtZWRpYW50ZSBsYSBwcnVlYmEgdCBkZSB1bmEgbXVlc3RyYSwgdXNhbmRvIGVsIGNvbWFuZG8gYHQudGVzdGAuCk90cmEgZm9ybWEgZXMgdXNhbmRvIGVsIGNvbWFuZG8gYGNpTWVhbmAgZGUgbGEgbGlicmVyw61hIGBsc3JgLgoKYGBge3IgaWMgc2F0aXNmYWNjaW9ufQp0LnRlc3QobGFwb3AxOCRwbjRycikKbGlicmFyeShsc3IpCmNpTWVhbihsYXBvcDE4JHBuNHJyLCBuYS5ybT1UKQpgYGAKCkVzdG9zIHJlc3VsdGFkb3MgaW5kaWNhbiBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHZhcsOtYSBlbnRyZSAzOC45JSB5IDQwLjElIGNvbiA5NSUgZGUgY29uZmlhbnphLgpTZSBwb2Ryw61hIGNhbWJpYXIgZXN0ZSB2YWxvciBwb3IgZGVmZWN0byBhIDk5JSBkZSBjb25maWFuemEgYWdyZWdhbmRvIGxhIGVzcGVjaWZpY2FjacOzbiBgY29uZiA9IDAuOTlgIGFsIGNvbWFuZG8gYGNpTWVhbmAuCgojIyBTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBncnVwb3MgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gZW4gcmVkZXMgc29jaWFsZXMKCkVsIGluZm9ybWUgdXNhIHVuYSB2YXJpYWJsZSBxdWUgbWlkZSBsYSAiZXhwb3NpY2nDs24gZnJlY3VlbnRlIGEgaW5mb3JtYWNpw7NuIHBvbMOtdGljYSIuCkVzdGEgdmFyaWFibGUgc2UgY29uc3RydXllIGRlIHVuYSBtYW5lcmEgY29tcGxlamEsIHNvYnJlIGxhIGJhc2UgZGUgbGFzIDMgcmVkZXMgc29jaWFsZXMgcG9yIGxhcyBxdWUgc2UgcHJlZ3VudGEuCkVuIGVzdGUgY2FzbyB2YW1vcyBhIGVtcGV6YXIgY29uIHVuYSByZWNvZGlmaWNhY2nDs24gbcOhcyBzaW1wbGUgcGFyYSByZWNyZWFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSAic2F0aXNmYWNjacOzbiBkZSBsYSBkZW1vY3JhY2lhIiBwb3IgZ3J1cG8gZGUgZnJlY3VlbmNpYSBkZSBjb25zdW1vIGRlIGluZm9ybWFjacOzbiBkZSBjYWRhIHJlZCBzb2NpYWwuCkx1ZWdvIHNlIHByb2NlZGVyw6EgYSByZXBsaWNhciBsYSB2YXJpYWJsZSBxdWUgc2UgdXNhIGVuIGVsIHJlcG9ydGUuCkxhIGZyZWN1ZW5jaWEgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gKHZhcmlhYmxlcyAic21lZGlhMiIgcGFyYSBGYWNlYm9vaywgInNtZWRpYTUiIHBhcmEgVHdpdHRlciB5ICJzbWVkaWE4IiBwYXJhIFdoYXRzYXBwKSBkZSBjYWRhIHJlZCBzb2NpYWwgc2UgbWlkZSBlbiBsYSBzaWd1aWVudGUgZXNjYWxhOgoKMS4gIERpYXJpYW1lbnRlCjIuICBBbGd1bmFzIHZlY2VzIGEgbGEgc2VtYW5hCjMuICBBbGd1bmFzIHZlY2VzIGFsIG1lcwo0LiAgQWxndW5hcyB2ZWNlcyBhbCBhw7FvCjUuICBOdW5jYQoKVmFtb3MgYSByZWNvZGlmaWNhciBlc3RhcyB2YXJpYWJsZXMgZGUgdGFsIG1hbmVyYSBxdWUgYXF1ZWxsb3MgcXVlIHJlc3BvbmRlbiBkaWFyaWFtZW50ZSBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEgc2Vyw6FuIGNsYXNpZmljYWRvcyBjb21vIGRlICJhbHRvIHVzbyIsIGFxdWVsbG9zIHF1ZSByZXNwb25kZW4gZGVsIDMgYWwgNCBzZXLDoW4gY2xhc2lmaWNhZG9zIGNvbW8gZGUgImJham8gdXNvIiB5IGFxdWVsbG9zIHF1ZSByZXNwb25kZW4gIm51bmNhIiBzZXLDoW4gY2xhc2lmaWNhZG9zIGNvbW8gIm5vIHVzdWFyaW9zIi4KVW4gZXNxdWVtYSBzaW1pbGFyIGRlIGNsYXNpZmljYWNpw7NuIHNlIHVzYSBwYXJhIGRlZmluaXIgYSBsb3MgdXN1YXJpb3MgZGUgbGFzIDMgcmVkZXMgc29jaWFsZXMuCkxhcyBudWV2YXMgdmFyaWFibGVzIHJlY29kaWZpY2FkYXMsIHNlIGNvbnZpZXJ0ZW4gYSBmYWN0b3IgeSBzZSBldGlxdWV0YW4uCgpgYGB7ciByZWNvZGlmaWNhY2lvbiByZWRlc30KdGFibGUobGFwb3AxOCRzbWVkaWEyKQp0YWJsZShsYXBvcDE4JHNtZWRpYTUpCnRhYmxlKGxhcG9wMTgkc21lZGlhOCkKbGFwb3AxOCRzbWVkaWEyciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhMiwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWE1ciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhNSwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWE4ciA9IGNhcjo6cmVjb2RlKGxhcG9wMTgkc21lZGlhOCwgIjE6Mj0xOyAzOjQ9MjsgNT0zIikKbGFwb3AxOCRzbWVkaWEyciA9IGFzLmZhY3RvcihsYXBvcDE4JHNtZWRpYTJyKQpsYXBvcDE4JHNtZWRpYTVyID0gYXMuZmFjdG9yKGxhcG9wMTgkc21lZGlhNXIpCmxhcG9wMTgkc21lZGlhOHIgPSBhcy5mYWN0b3IobGFwb3AxOCRzbWVkaWE4cikKbGV2ZWxzKGxhcG9wMTgkc21lZGlhMnIpID0gYygiQWx0byB1c28iLCAiQmFqbyB1c28iLCAiTm8gdXN1YXJpbyIpCmxldmVscyhsYXBvcDE4JHNtZWRpYTVyKSA9IGMoIkFsdG8gdXNvIiwgIkJham8gdXNvIiwgIk5vIHVzdWFyaW8iKQpsZXZlbHMobGFwb3AxOCRzbWVkaWE4cikgPSBjKCJBbHRvIHVzbyIsICJCYWpvIHVzbyIsICJObyB1c3VhcmlvIikKdGFibGUobGFwb3AxOCRzbWVkaWEycikKdGFibGUobGFwb3AxOCRzbWVkaWE1cikKdGFibGUobGFwb3AxOCRzbWVkaWE4cikKYGBgCgpDb24gZXN0YXMgdmFyaWFibGVzIHJlY29kaWZpY2FkYXMsIHNlIHB1ZWRlIGNhbGN1bGFyIGxhcyBtZWRpYXMgKHF1ZSBzb24gbG9zIHBvcmNlbnRhamVzKSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBjYWRhIGdydXBvIGRlIGNvbnN1bW8gZGUgaW5mb3JtYWNpw7NuIGVuIHJlZGVzIHNvY2lhbGVzLgoKVW5hIG9wY2nDs24gcXVlIHBlcm1pdGUgbW9zdHJhciBtdWNob3MgZXN0YWTDrXN0aWNvcyBwb3IgY2FkYSBncnVwbyBlcyBgZGVzY3JpYmVCeWAgZGUgbGEgbGlicmVyw61hIGBwc3ljaGAuCkVsIGPDs2RpZ28gcGFyYSBUd2l0dGVyIGVzOgoKYGBge3IgbWVkaWFwb3JyZWRlczMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkocHN5Y2gpCmRlc2NyaWJlQnkobGFwb3AxOCRwbjRyciwgZ3JvdXA9bGFwb3AxOCRzbWVkaWE1cikKYGBgCgpTaW4gZW1iYXJnbywgbG8gcXVlIG5vcyBpbnRlcmVzYSBlcyBjYWxjdWxhciBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSBjYWRhIGdydXBvLgpFbiBlbCBncsOhZmljbyAzLjkgZGVsIHJlcG9ydGUgc2UgcHJlc2VudGEgbGEgbWVkaWEgZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSwgbW9zdHJhZG8gY29tbyB1biBwdW50bywgeSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgZGUgY2FkYSBncnVwbywgbW9zdHJhZG9zIGNvbW8gdW4gw6FyZWEgZ3JpcyBjb24gbMOtbWl0ZXMgaW5mZXJpb3IgeSBzdXBlcmlvci4KU2UgcHVlZGUgdXNhciBsYSBsaWJyZXLDrWEgYFJtaXNjYCB5IGVsIGNvbWFuZG8gYGdyb3VwLkNJYCBwYXJhIGNhbGN1bGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciBncnVwb3MgZGUgY29uc3VtbyBkZSBpbmZvcm1hY2nDs24gZW4gRmFjZWJvb2suCgpgYGB7ciBjaXBvcmdydXBvLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KFJtaXNjKQpncm91cC5DSShwbjRycn5zbWVkaWEyciwgbGFwb3AxOCkKYGBgCgpDb24gZXN0b3MgZGF0b3MsIHBvciBlamVtcGxvLCBsYSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIGVudHJlIGVsIGdydXBvIGRlIGFsdG8gdXNvIGRlIGluZm9ybWFjacOzbiBlbiBGYWNlYm9vayBlcyAzNy42JS4KRWwgbMOtbWl0ZSBpbmZlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBlcyAzNi43JSB5IGVsIGzDrW1pdGUgc3VwZXJpb3IgZXMgMzguNCUuCkNvbiBlc3RvcyBkYXRvcyBzZSBwb2Ryw61hIHJlcGxpY2FyIHVuIGdyw6FmaWNvIGRlIGJhcnJhcyBzaW1pbGFyIGFsIDMuOS4KCiMjIEludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEKCkxhIGZvcm1hIG3DoXMgZsOhY2lsIGRlIGdyYWZpY2FyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwb3IgZ3J1cG9zIGVzIHVzYW5kbyBlbCBjb21hbmRvIGBwbG90bWVhbnNgLgoKYGBge3IgZ3JhZnhncnVwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGdwbG90cykKcGxvdG1lYW5zKGxhcG9wMTgkcG40cnJ+bGFwb3AxOCRzbWVkaWE1ciwKICAgICAgICAgIHhsYWI9IlRpcG8gZGUgdXN1YXJpbyBkZSBUd2l0dGVyIiwKICAgICAgICAgIHlsYWI9IlNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEiLAogICAgICAgICAgeWxpbT1jKDAsIDUwKSwKICAgICAgICAgIG1lYW4ubGFiZWxzPVQsIGRpZ2l0cz0xLAogICAgICAgICAgY29ubmVjdD1GCiAgICAgICAgICkKYGBgCgpFc3RhIG9wY2nDs24gbXVlc3RyYSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGVybyBzZSBkaWZpY3VsdGEgc2kgc2UgcXVpZXJlIGdyYWZpY2FyIGxhcyBiYXJyYXMuCkxhIGxpYnJlcsOtYSBgZ2dwbG90YCBub3MgYnJpbmRhIG3DoXMgb3BjaW9uZXMgeSBub3MgcGVybWl0ZSBncmFmaWNhciBkZSBtYW5lcmEgc2ltaWxhciBhbCBncsOhZmljbyAzLjkgZGVsIHJlcG9ydGUsIGVuIGJhcnJhcywgcHJlc2VudGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSB5IGFncmVnYXIgY29sb3IuClBhcmEgZXN0bywgcHJpbWVybyBzZSBndWFyZGEgdW4gZGF0YWZyYW1lICJ0dy51c28iIGNvbiBsb3MgZGF0b3MgZGUgbGEgbWVkaWEgeSBsb3MgbMOtbWl0ZXMgc3VwZXJpb3IgZSBpbmZlcmlvciBkZSBjYWRhIGdydXBvLCB1c2FuZG8gZWwgY29tYW5kbyBgZ3JvdXAuQ0lgLgpTb24gbG9zIGRhdG9zIGRlIGVzdGUgZGF0YWZyYW1lIGxvcyBxdWUgc2UgdXNhbiBjb24gYGdncGxvdGAgeSBzZSBjcmVhIHVuIGdyw6FmaWNvIHF1ZSBzZSBndWFyZGEgZW4gdW4gb2JqZXRvICJncmFmMSIuCkNvbiBlc3RhIGxpYnJlcsOtYSBzZSBhZ3JlZ2EgbGEgY2FwYSBgZ2VvbV9iYXIoKWAgcGFyYSBkZWZpbmlyIHF1ZSBzZSBxdWllcmUgdW4gZ3LDoWZpY28gZGUgYmFycmFzIGRlIGxhcyB2YXJpYWJsZXMgZXNwZWNpZmljYWRhcyBlbiBgYWVzYC4KTHVlZ28sIHNlIGFncmVnYSBsYSBjYXBhIGBnZW9tX2Vycm9yYmFyKClgIHBhcmEgYWdyZWdhciBsYXMgYmFycmFzIGRlIGVycm9yIHkgbHVlZ28gbG9zIHZhbG9yZXMgZGUgbGEgbWVkaWEgY29uIGBnZW9tX3RleHQoKWAuCkZpbmFsbWVudGUsIHNlIGV0aXF1ZXRhIGVsIGVqZSBYIHkgWSBjb24gYHhsYWJgIHkgYHlsYWJgIHkgc2UgZGVmaW5lIGxvcyBsw61taXRlcyBkZWwgZWplIFkgY29uIGB5bGltYC4KCmBgYHtyIGdyYWZ4Z3J1cDIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnR3LnVzbyA9IGdyb3VwLkNJKHBuNHJyfnNtZWRpYTVyLCBsYXBvcDE4KQpsaWJyYXJ5KGdncGxvdDIpCmdyYWYyID0gZ2dwbG90KHR3LnVzbywgYWVzKHg9c21lZGlhNXIsIHk9cG40cnIubWVhbikpKwogIGdlb21fYmFyKHdpZHRoPTAuNSwgZmlsbD0iZGFya2N5YW4iLCBjb2xvdXI9ImJsYWNrIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXBuNHJyLmxvd2VyLCB5bWF4PXBuNHJyLnVwcGVyKSwgd2lkdGg9MC4yKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKHJvdW5kKHBuNHJyLm1lYW4sIDEpLCAiJSIpKSwgdmp1c3Q9LTQuMiwgc2l6ZT00KSsKICB4bGFiKCJUaXBvIGRlIHVzdWFyaW8gZGUgVHdpdHRlciIpICsgeWxhYigiU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSAoJSkiKSsKICB5bGltKDAsIDUwKQpncmFmMgpgYGAKClNlZ8O6biBlc3RvcyByZXN1bHRhZG9zLCBsYSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIGVzIG3DoXMgYWx0YSBlbiBhcXVlbGxvcyBxdWUgbm8gc29uIHVzdWFyaW9zIGRlIFR3aXR0ZXIsIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIHVzdWFyaW9zLCBhdW5xdWUgbGFzIGRpZmVyZW5jaWFzIG5vIHNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBkZSB1bmEgY29tcGFyYWNpw7NuIHZpc3VhbCBlbnRyZSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEuCgojIyBTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciB0aXBvIGRlIHVzdWFyaW8gZGUgcmVkZXMgc29jaWFsZXMKCkhhc3RhIGVsIG1vbWVudG8gc2UgaGEgY3JlYWRvIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEgcG9yIHRpcG8gZGUgdXN1YXJpb3MgZGUgVHdpdHRlci4KRWwgcmVwb3J0ZSBhZ3JlZ2EgYSBsb3MgdXN1YXJpb3MgZGUgbGFzIHRyZXMgcmVkZXMgc29jaWFsZXMgcGFyYSB1YmljYXIgdHJlcyB0aXBvcyBkZSB1c3VhcmlvczogdXN1YXJpb3MgZGUgYWx0byB1c28sIGRlIGJham8gdXNvIHkgbm8gdXN1YXJpb3MgZGUgY3VhbHF1aWVyIHJlZCBzb2NpYWwuCkxhIGZvcm1hIGRlIGNvZGlmaWNhY2nDs24gZGUgZXN0ZSB0aXBvIGRlIHVzdWFyaW9zIGRlIHRyZXMgcmVkZXMgc29jaWFsZXMgc2UgYmFzYSBlbiB2YXJpYXMgY29uZGljaW9uZXMuCkNvbW8gZGljZSBlbCByZXBvcnRlOiAiVXNhbW9zIGxhIG1pc21hIGNvZGlmaWNhY2nDs24gcXVlIGVuIGxhIGFudGVyaW9yIHNlY2Npw7NuLCBwYXJhIGRpc3Rpbmd1aXIgZW50cmUgcXVpZW5lcyBhY2NlZGVuIGNvbiBmcmVjdWVuY2lhIGVuIHJlZGVzIHNvY2lhbGVzIChhcXVlbGxvcyBjb24gY3VlbnRhcyBhIGxhcyBxdWUgYWNjZWRlbiBhbGd1bmFzIHZlY2VzIGEgbGEgc2VtYW5hIG8gYSBkaWFyaW8pIHkgYXF1ZWxsb3MgcXVlIG5vIGFjY2VkZW4gYSBsYXMgcmVkZXMgc29jaWFsZXMgbXV5IGZyZWN1ZW50ZW1lbnRlIChhcXVlbGxvcyBjb24gY3VlbnRhcyBhIGxhcyBxdWUgYWNjZWRlbiBhbGd1bmFzIHZlY2VzIGFsIG1lcyBvIGFsZ3VuYXMgdmVjZXMgYWwgYcOxbykuIFRhbWJpw6luIGluY2x1aW1vcyBhIHF1aWVuZXMgbm8gc29uIHVzdWFyaW9zOiBxdWllbmVzIG5vIHRpZW5lbiBuaW5ndW5hIGN1ZW50YSBlbiByZWRlcyBzb2NpYWxlcyAocXVpZW5lcyBpbmRpY2FuIHF1ZSBubyB0aWVuZW4gdW5hIGN1ZW50YSBlbiBGYWNlYm9vaywgVHdpdHRlciBvIFdoYXRzYXBwKSB5IHF1aWVuZXMgdGllbmVuIHVuYSBjdWVudGEsIHBlcm8gbnVuY2EgbGEgdXNhbiIgKHAuODEpLgpFbiBwcmltZXIgbHVnYXIgaWRlbnRpZmljYW1vcyBhIHF1aWVuZXMgdXNhbiBjYWRhIHJlZCBzb2NpYWwgYWxndW5hcyB2ZWNlcyBhIGxhIHNlbWFuYSBvIGEgZGlhcmlvIGNvbW8gMSB5IHNpIHVzYW4gY2FkYSByZWQgc29jaWFsIGFsZ3VuYXMgdmVjZXMgYWwgbWVzIG8gYWxndW5hcyB2ZWNlcyBhbCBhw7FvLCBjb21vIDAuClBhcmEgZXN0byB1c2Ftb3MgZWwgY29tYW5kbyBgaWZlbHNlYC4KTHVlZ28sIHN1bWFtb3MgbG9zIHZhbG9yZXMgZGUgY2FkYSByZWQgc29jaWFsIGVuIHVuYSBzb2xhIHZhcmlhYmxlLCBjb24gdmFsb3JlcyBlbnRyZSAwIHkgMy4KU2UgdXNhIGVsIGNvbWFuZG8gYHJvd1N1bXNgIHF1ZSBwZXJtaXRlIGxhIHN1bWEgaG9yaXpvbnRhbCBkZSB2YXJpYWJsZXMgZGVmaW5pZGFzLCBlbiBlc3RlIGNhc28gbGFzIHF1ZSBlc3TDoW4gZW4gbGEgcG9zaWNpw7NuIGBbLCA4OTo5MV1gLgpFbiBlc3RlIGNvbWFuZG8sIHVzYW1vcyBsYSBlc3BlY2lmaWNhY2nDs24gYG5hLnJtPVRgIHBhcmEgcXVlIGxhIHN1bWEgbm8gdG9tZSBlbiBjdWVudGEgYSBsb3MgdmFsb3JlcyBwZXJkaWRvcy4KCmBgYHtyIHVzdWFyaW9yZWRlc30KbGFwb3AxOCRzbTIgPSBpZmVsc2UobGFwb3AxOCRzbWVkaWEyPT0xIHwgbGFwb3AxOCRzbWVkaWEyPT0yLCAxLCAwKQpsYXBvcDE4JHNtNSA9IGlmZWxzZShsYXBvcDE4JHNtZWRpYTU9PTEgfCBsYXBvcDE4JHNtZWRpYTU9PTIsIDEsIDApCmxhcG9wMTgkc204ID0gaWZlbHNlKGxhcG9wMTgkc21lZGlhOD09MSB8IGxhcG9wMTgkc21lZGlhOD09MiwgMSwgMCkKbGFwb3AxOCRhbnloaSA9IHJvd1N1bXMobGFwb3AxOFssODk6OTFdLCBuYS5ybT1UKQp0YWJsZShsYXBvcDE4JGFueWhpKQpgYGAKClBhcnRpZW5kbyBkZSBlc3RhIHZhcmlhYmxlLCBzZSBjcmVhIHVuYSB2YXJpYWJsZSBxdWUgYWdyZWdhIGxhcyB0cmVzIHJlZGVzIHNvY2lhbGVzLCBsbGFtYWRhICJoaV9sb19ub24iLgpQcmltZXJvLCBzZSBjcmVhIGVzdGEgdmFyaWFibGUgY29tbyB1biB2ZWN0b3IgZGUgTkFzLgpMdWVnbyBzZSBsZSBpbXB1dGEgdmFsb3JlcyBkZSAxLCAyLCAzIG8gTkEsIGRlcGVuZGllbmRvIGRlIGxvcyB2YWxvcmVzIGRlICJhbnloaSBvIGRlIGxvcyB2YWxvcmVzIGRlIGxhcyB2YXJpYWJsZXMgZGUgcmVkZXMgc29jaWFsZXMuIEx1ZWdvIHNlIGNyZWEgdW5hIG51ZXZhIHZhcmlhYmxlIGRlIHRpcG8gZmFjdG9yLCBjb24gaWTDqW50aWNvcyB2YWxvcmVzIHF1ZSJoaV9sb19ub24iIHkgc2UgZXRpcXVldGEuIExhIGRlZmluaWNpw7NuIGRlIGxhIGNvbmRpY2lvbmFsaWRhZCBzZSB0cmFiYWphIG1lZGlhbnRlIGxvcyBjb3JjaGV0ZXMgYFsuLi5dYC4gRGUgZXN0YSBtYW5lcmEsIHNlIGRlZmluZSBsYXMgY29uZGljaW9uZXMgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKCi0gICBMYSB2YXJpYWJsZSAiaGlfbG9fbm9uIGVzIGlndWFsIGEgMSBzaSBsYSB2YXJpYWJsZSBhbnloaSBlcyBtYXlvciBvIGlndWFsIGEgMSAodXNvIGRpYXJpbyBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEpID0gYGxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk+PTFdIDwtIDFgCgotICAgTGEgdmFyaWFibGUgImhpX2xvX25vbiBlcyBpZ3VhbCBhIDIgc2kgbGEgdmFyaWFibGUgYW55aGkgZXMgaWd1YWwgYSAwICh1c28gYWxndW5hcyB2ZWNlcyBhbCBhw7FvIG8gbnVuY2EpID0gYGxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk9PTBdIDwtIDJgCgotICAgTGEgdmFyaWFibGUgImhpX2xvX25vbiBlcyBpZ3VhbCBhIDMgc2kgbGFzIHZhcmlhYmxlcyBkZSB0ZW5lbmNpYSBkZSBjdWVudGFzIHNvbiBpZ3VhbCBhIDIgKE5vKSA9IGBsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHNtZWRpYTE9PTIgJiBsYXBvcDE4JHNtZWRpYTQ9PTIgJiBsYXBvcDE4JHNtZWRpYTc9PTJdIDwtIDNgCgpMYXMgc2lndWllbnRlIHJlZ2xhcyBkZSBjb2RpZmljYWNpw7NuIHNpZ3VlbiBsYSBtaXNtYSBsw7NnaWNhIGRlIGNvbWJpbmFjacOzbiBkZSBvdHJhcyB2YXJpYWJsZXMgcGFyYSBpbXB1dGFyIGVsIHZhbG9yIDMgbyBOQS4KCmBgYHtyIGhpbG9ub259CmxhcG9wMTgkaGlfbG9fbm9uID0gTkEgI3NlIGNyZWEgdW4gdmVjdG9yIGNvbiBOQXMjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk+PTFdID0gMSAjU2UgY29kaWZpY2EgMSBhIGxvcyBxdWUgdXNhbiBkaWFyaWFtZW50ZSBvIGFsZ3VuYXMgdmVjZXMgYSBsYSBzZW1hbmEgYWxndW5hIHJlZCBzb2NpYWwjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkYW55aGk9PTBdID0gMiAjU2UgY29kaWZpY2EgY29tbyAyIGEgbG9zIHF1ZSB1c2FuIGFsZ3VuYXMgdmVjZXMgYWwgbWVzIHkgYWwgYcOxbyBhbGd1bmEgcmVkIHNvY2lhbCMKbGFwb3AxOCRoaV9sb19ub25bbGFwb3AxOCRzbWVkaWExPT0yICYgbGFwb3AxOCRzbWVkaWE0PT0yICYgbGFwb3AxOCRzbWVkaWE3PT0yXSA9IDMgI1NlIGNvZGlmaWNhIGNvbW8gMyBhIGxvcyBxdWUgbm8gdGllbmUgcmVkZXMgc29jaWFsZXMjCmxhcG9wMTgkaGlfbG9fbm9uW2xhcG9wMTgkc21lZGlhMj09NSAmIGxhcG9wMTgkc21lZGlhNT09NSAmIGxhcG9wMTgkc21lZGlhOD09NV0gPSAzICNTZSBjb2RpZmljYSBjb21vIDMgYSBsb3MgcXVlIG51bmNhIHVzYW4gbmluZ3VuYSByZWQgc29jaWFsIwpsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHBhaXM9PTMgJiAobGFwb3AxOCRzbWVkaWEyPT01IHwgbGFwb3AxOCRzbWVkaWE1PT01IHwgbGFwb3AxOCRzbWVkaWE4PT01KV0gPSAzICNTZSBhcGxpY2EgdW4gY8OzZGlnbyBwYXJ0aWN1bGFyIGEgcGFpcyAzIwpsYXBvcDE4JGhpX2xvX25vbltsYXBvcDE4JHBhaXM9PTMgJiAobGFwb3AxOCRzbWVkaWExPT0yIHwgbGFwb3AxOCRzbWVkaWE0PT0yIHwgbGFwb3AxOCRzbWVkaWE3PT0yKV0gPSAzICNTZSBhcGxpY2EgdW4gY8OzZGlnbyBwYXJ0aWN1bGFyIGEgcGFpcyAzIwpsYXBvcDE4JGhpbG9uID0gYXMuZmFjdG9yKGxhcG9wMTgkaGlfbG9fbm9uKQpsZXZlbHMobGFwb3AxOCRoaWxvbikgPSBjKCJBbHRvIHVzbyIsICJCYWpvIHVzbyIsICJObyB1c3VhcmlvIikKcHJvcC50YWJsZSh0YWJsZShsYXBvcDE4JGhpbG9uKSkqMTAwCmBgYAoKU2Vnw7puIGVzdG9zIGRhdG9zLCBlbCA2NC45JSBkZSBlbnRyZXZpc3RhZG9zIHJlcG9ydGFuIHVuIGFsdG8gdXNvIGRlIHJlZGVzIHNvY2lhbGVzLCBtaWVudHJhcyBxdWUsIGVuIGVsIG90cm8gZXh0cmVtbywgc2UgdGllbmUgMzEuNiUgcXVlIHNlcsOtYW4gbm8gdXN1YXJpb3MgZGUgbmluZ3VuYSByZWQgc29jaWFsLgpFc3RvcyBkYXRvcyBkaWZpZXJlbiB1biBwb2NvIGRlIGxvcyByZXBvcnRhZG9zIGVuIGVsIEFww6luZGljZSBhbCByZXBvcnRlLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4L0FwcGVuZGl4X01hdGVyaWFsX2Zvcl8yMDE4LTE5X0FtZXJpY2FzQmFyb21ldGVyX1JlcG9ydC1Db21wYXJhdGl2ZV9DaGFwdGVyc18xMC4xMy4xOS5wZGYpLCBkb25kZSBzZSByZXBvcnRlIDY1LjM0JSBkZSBhbHRvIHVzbyB5IDMxLjYwJSBkZSBubyB1c3Vhcmlvcy4KRXN0YXMgZGlmZXJlbmNpYXMgcHVlZGVuIHNlciBkZWJpZGFzIGEgZGlmZXJlbmNpYXMgZW4gbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxhcyByZWdsYXMgZGUgY29kaWZpY2FjacOzbiBkZXNkZSBTdGF0YSBhIFIuCgpEZSBsYSBtaXNtYSBmb3JtYSBxdWUgc2UgcHJvZHVqbyBlbCBncsOhZmljbyBkZSBtZWRpYSBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvciB0aXBvcyBkZSB1c3VhcmlvcyBkZSBUd2l0dGVyIHVzYW5kbyBgZ2dwbG90YCwgYWhvcmEgc2UgaGFyw6EgbG8gbWlzbW8gcGVybyBwYXJhIGxvcyB1c3VhcmlvcyBkZSBsYXMgdHJlcyByZWRlcyBzb2NpYWxlcywgdmFyaWFibGUgImhpbG9uIi4KCmBgYHtyIGdyYWYzLjl9CmxpYnJhcnkoUm1pc2MpCnNhdGlzLnVzbyA9IGdyb3VwLkNJKHBuNHJyfmhpbG9uLCBsYXBvcDE4KQpsaWJyYXJ5KGdncGxvdDIpCmdyYWYzLjkgPSBnZ3Bsb3Qoc2F0aXMudXNvLCBhZXMoeD1oaWxvbiwgeT1wbjRyci5tZWFuKSkrCiAgZ2VvbV9iYXIod2lkdGg9MC41LCBmaWxsPSJkYXJrY3lhbiIsIGNvbG91cj0iYmxhY2siLCBzdGF0PSJpZGVudGl0eSIpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49cG40cnIubG93ZXIsIHltYXg9cG40cnIudXBwZXIpLCB3aWR0aD0wLjIpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocm91bmQocG40cnIubWVhbiwgMSksICIlIikpLCB2anVzdD0tMi41LCBzaXplPTQpKwogIHhsYWIoIlRpcG8gZGUgdXN1YXJpbyBkZSByZWRlcyBzb2NpYWxlcyIpICsgeWxhYigiU2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSAoJSkiKSsKICB5bGltKDAsIDUwKQpncmFmMy45CmBgYAoKRXN0ZSBncsOhZmljbyBzZXLDrWEgdW5hIHJlcHJvZHVjY2nDs24gZGVsIHF1ZSBzZSBwcmVzZW50YSBlbiBlbCBpbmZvcm1lIChHcsOhZmljbyAzLjkgZW4gbGEgcMOhZ2luYSA2MiksIGNvbiB1bmEgbcOtbmltYXMgZGlmZXJlbmNpYXMgcG9yIGNvZGlmaWNhY2nDs24gZGUgbG9zIGRhdG9zIHJlc3VsdGFudGVzLgoKIyBSZXN1bWVuCgpFbiBlc3RlIGRvY3VtZW50byBzZSBoYSB0cmFiYWphZG8gY29uIHVuYSB2YXJpYWJsZSByZWNvZGlmaWNhZGEgZHVtbXkgKHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEpLCBsYSBxdWUgcHVlZGUgc2VyIHRyYWJhamFkYSBjb21vIHZhcmlhYmxlIG51bcOpcmljYSBwYXJhIGVsIGPDoWxjdWxvIGRlIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIHByb3BvcmNpb25lcy4KQ29uIGVzdGEgdmFyaWFibGUgc2UgaGEgY2FsY3VsYWRvIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEsIHF1ZSBzZXLDrWEgZWwgZGUgbGEgcHJvcG9yY2nDs24gZGUgZW50cmV2aXN0YWRvcyBxdWUgZXN0w6FuIHNhdGlzZmVjaG9zIGNvbiBsYSBkZW1vY3JhY2lhLgpMdWVnbywgc2UgaGEgZGVzY3JpdG8gZXN0YSB2YXJpYWJsZXMgcG9yIGdydXBvcyBkZSB1bmEgdmFyaWFibGUgZGUgZmFjdG9yIChjb25zdW1vIGRlIGluZm9ybWFjacOzbiBwb2zDrXRpY2EpLgpTZSBoYSBwcmVzZW50YWRvIGPDs21vIGNhbGN1bGFyIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSB2YXJpYWJsZSBudW3DqXJpY2EgcG9yIGdydXBvcyBkZSBsYSB2YXJpYWJsZSBkZSBmYWN0b3IuCkZpbmFsbWVudGUsIHNlIGhhIHByZXNlbnRhZG8gY8OzbW8gZ3JhZmljYXIgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBvciBncnVwb3MuCgojIEPDoWxjdWxvcyBpbmNsdXllbmRvIGVsIGVmZWN0byBkZSBkaXNlw7FvCgojIyBSZXN1bHRhZG9zIGRlIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9uZGVyYWRvcwoKQ29tbyBzZSBtZW5jaW9uw7MsIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBhY2VyY2EgZGUgbGEgdG9sZXJhbmNpYSBkZSBsb3MgZ29scGVzIGVqZWN1dGl2b3MsIGdyw6FmaWNvIDEuNyBkZWwgcmVwb3J0ZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIDIwMjEsIG5vIHNvbiBpZ3VhbGVzIGEgbG9zIG9idGVuaWRvcyBhcXXDrS4KRXN0byBlcyBkZWJpZG8gYSBxdWUgbG9zIGPDoWxjdWxvcyBkZSBtw6FzIGFycmliYSBubyBpbmNsdXllIGVsIGVmZWN0byBkZSBkaXNlw7FvLgoKUGFyYSBwb2RlciByZWFsaXphciBsb3MgY8OhbGN1bG9zIHRvbWFuZG8gZW4gY3VlbnRhIGVsIGVmZWN0byBkZSBkaXNlw7FvLCBzZSBwdWVkZSB1c2FyIGxhIGxpYnJlcsOtYSBgc3VydmV5YCBwYXJhIGRlZmluaXIgZWwgZGlzZcOxbyBtdWVzdHJhbC4KUHJpbWVybywgc2UgdGllbmUgcXVlIGFkZWN1YXIgbGEgYmFzZSBkZSBkYXRvcywgZWxpbWluYW5kbyBsb3MgdmFsb3JlcyBwZXJkaWRvcyBkZSBsYXMgdmFyaWFibGVzIHF1ZSBkZWZpbmVuIGVsIGRpc2XDsW8gbXVlc3RyYWwgKGNvbW8gIndlaWdodDE1MDAiKS4KVW4gcGFzbyBhZGljaW9uYWwgZXMgdHJhbnNmb3JtYXIgbGFzIHZhcmlhYmxlcyBkZWwgZGF0YWZyYW1lLgpFc3RvIGVzIGRlYmlkbyBhIHF1ZSBjdWFuZG8gc2UgaW1wb3J0YW4sIGVsIHNpc3RlbWEgbGVlIGxhcyB2YXJpYWJsZXMgY29tbyB0aXBvICJoYXZlbl9sYWJlbGxlZCIsIGVzIGRlY2lyLCBtYW50aWVuZSBsYXMgZXRpcXVldGFzIGRlIGxhcyB2YXJpYWJsZXMsIGNvbiBsbyBxdWUgc2UgcG9kcsOtYSBwcm9kdWNpciB1biBsaWJybyBkZSBjw7NkaWdvcy4KRXN0byBlcyDDunRpbCBlbiBvdHJhcyBvY2FzaW9uZXMsIHBlcm8gZ2VuZXJhIHByb2JsZW1hcyBjb24gbGEgbGlicmVyw61hIGBzdXJ2ZXlgLgpQYXJhIGVzdG8gdHJhbnNmb3JtYW1vcyBsYXMgdmFyaWFibGVzIGEgb3RybyB0aXBvIGNvbiBlbCBjb21hbmRvIGBzYXBwbHlgLgoKYGBge3IgcHJlcGFyYWNpb24gZGUgYmFzZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9CmxhcG9wMjEgPSBzdWJzZXQobGFwb3AyMSwgIWlzLm5hKHdlaWdodDE1MDApKQpzYXBwbHkobGFwb3AyMSwgaGF2ZW46OnphcF9sYWJlbHMpCmBgYAoKQ29uIGxhIGJhc2UgZGUgZGF0b3MgYWRlY3VhZGEsIHNlIHB1ZWRlIGRlZmluaXIgZWwgZGlzZcOxbyBtdWVzdHJhIHkgc2UgZ3VhcmRhIGVuIHVuIG9iamV0byAiZGlzZW5vMjEiLgoKYGBge3IgZGlzZW5vMjF9CmxpYnJhcnkoc3VydmV5KQpkaXNlbm8yMSA9IHN2eWRlc2lnbihpZHMgPSB+dXBtLCBzdHJhdGEgPSB+c3RyYXRhLCB3ZWlnaHRzID0gfndlaWdodDE1MDAsIG5lc3Q9VFJVRSwgZGF0YT1sYXBvcDIxKQpgYGAKCkxhIGxpYnJlcsOtYSBgc3VydmV5YCB0aWVuZSBjb21hbmRvcyBuYXRpdm9zIHBhcmEgY2FsY3VsYXIgbGEgbWVkaWEgZGUgbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhIGRlIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MuCkVzdGUgY8OhbGN1bG8gZGUgbGEgbWVkaWEgbm9zIGJyaW5kYSBlbCBwb3JjZW50YWplIGRlIGNpdWRhZGFub3MgZW4gbGEgcmVnacOzbiBxdWUgc29uIHRvbGVyYW50ZXMgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MuCgpgYGB7ciB0b2xlcmFuY2lhIHBvbmRlcmFkYX0Kc3Z5bWVhbih+amMxNWFyLCBkaXNlbm8yMSwgbmEucm09VCkKYGBgCgpQYXJhIGNhbGN1bGFyIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgZXN0YSBtZWRpZGEgc2UgcHVlZGUgYW5pZGFyIGVsIGNvbWFuZG8gYHN2eW1lYW5gIGRlbnRybyBkZSBvdHJvIGNvbWFuZG8gYGNvbmZpbnRgIHF1ZSBub3MgYnJpbmRhIGVsIGzDrW1pdGUgaW5mZXJpb3IgeSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCmBgYHtyIGljIHRvbGVyYW5jaWEgcG9uZGVyYWRhfQpjb25maW50KHN2eW1lYW4ofmpjMTVhciwgZGlzZW5vMjEsIG5hLnJtPVQpKQpgYGAKClBhcmEgcG9kZXIgcmVwbGljYXIgZWwgZ3LDoWZpY28gMS43IHJlcXVlcmltb3MgZWwgdmFsb3IgZGVsIHBvcmNlbnRhamUgZGUgY2l1ZGFkYW5vcyBxdWUgdG9sZXJhbiBsb3MgZ29scGVzIGVqZWN1dGl2b3MgcG9yIHDDoWlzLCBhc8OtIGNvbW8gZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBjYWRhIHVuby4KUGFyYSBlc3RlIGPDoWxjdWxvLCBwb2RlbW9zIHVzYXIgZWwgY29tYW5kbyBgc3Z5YnlgLgpFc3RlIGNvbWFuZG8gcmVxdWllcmUgZGVmaW5pciBsYSB2YXJpYWJsZSBhIHNlciBjYWxjdWxhZGEgKGB+amMxNWFyYCksIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgbG9zIGdydXBvcyAoYH5wYWlzZXNgKSwgZWwgb2JqZXRvIHF1ZSBndWFyZGEgZWwgZGlzZcOxbyBtdWVzdHJhbCAoYGRpc2VubzIxYCksIGVsIGVzdGFkw61zdGljbyBxdWUgc2UgcXVpZXJlIGNhbGN1bGFyIChgc3Z5bWVhbiwgbmEucm09VGApIHkgZGVmaW5pciBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIChgdmFydHlwZSA9ICJjaSJgKS4KRXN0b3MgY8OhbGN1bG9zIHNlIGd1YXJkYW4gZW4gdW4gb2JqZXRvICJnb2xwZXBvbmQiLgoKYGBge3IgdG9sZXJhbmNpYSBwb3IgcGFpcyBwb25kZXJhZGF9CmdvbHBlcG9uZCA9IHN2eWJ5KH5qYzE1YXIsIH5wYWlzZXMsIGRpc2VubzIxLCBzdnltZWFuLCBuYS5ybT1ULCB2YXJ0eXBlID0gImNpIikKZ29scGVwb25kID0gZ29scGVwb25kWy1jKDYsMjApLF0KYGBgCgpEZSBsYSBtaXNtYSBtYW5lcmEgcXVlIGNvbiBlbCBncsOhZmljbyBjb24gbG9zIHJlc3VsdGFkb3Mgbm8gcG9kZXJhZG9zLCB1c2Ftb3MgbGEgbGlicmVyw61hIGBnZ3Bsb3RgIHBhcmEgcmVwbGljYXIgZWwgZ3LDoWZpY28gMS43LgpTZSBkZWJlIHRvbWFyIGVuIGN1ZW50YSBxdWUgZWwgY29tYW5kbyBgc3Z5YmFyYCBnZW5lcmEgY29sdW1uYXMgY29uIG5vbWJyZSBkaWZlcmVudGVzIGEgbG9zIHF1ZSBzZSBnZW5lcmFuIGNvbiBlbCBjb21hbmRvIGBncm91cC5DSWAgdXNhZG8gbcOhcyBhcnJpYmEuCgpgYGB7ciBncmFmaWNvIHRvbGVyYW5jaWEgcG9uZGVyYWRhfQpncmFmMyA9IGdncGxvdChnb2xwZXBvbmQsIGFlcyh4PXJlb3JkZXIocGFpc2VzLCAtamMxNWFyKSwgeT1qYzE1YXIpKSsKICBnZW9tX2Jhcih3aWR0aD0wLjUsIGZpbGw9ImRhcmtzbGF0ZWdyYXkzIiwgY29sb3VyPSIjNjliM2EyIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWNpX2wsIHltYXg9Y2lfdSksIHdpZHRoPTAuMiwgY29sb3I9ImRhcmtjeWFuIiwKICAgICAgICAgICAgICAgIGNleD0wLjQsIGxpbmV0eXBlPTMpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocm91bmQoamMxNWFyLCAwKSwgIiUiKSksIHZqdXN0PS00LjQsIHNpemU9Mi41KSsKICB4bGFiKCJQYcOtcyIpICsgeWxhYigiVG9sZXJhbmNpYSBhIGdvbHBlcyBlamVjdXRpdm9zICglKSIpKwogIHlsaW0oMCwgNjApCmdyYWYzCmBgYAoKRGUgZXN0YSBtYW5lcmEgc2UgaGEgcmVwbGljYWRvIGV4YWN0YW1lbnRlIGxvcyByZXN1bHRhZG9zIHJlcG9ydGFkb3MgZW4gRWwgUHVsc28gZGUgbGEgRGVtb2NyYWNpYSAyMDIxLgoKIyMgUmVzdWx0YWRvcyBkZSBzYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhIHBvbmRlcmFkb3MKCkRlIGxhIG1pc21hIG1hbmVyYSBxdWUgY29uIGxhIHRvbGVyYW5jaWEgYSBsb3MgZ29scGVzIGVqZWN1dGl2b3MsIHNlIHVzYSBsYSBsaWJyZXLDrWEgYHN1cnZleWAgeSBlbCBjb21hbmRvIGBjb25maW50YGp1bnRvIGFsIGNvbWFuZG8gbmF0aXZvIGBzdnltZWFuYC4KCmBgYHtyIGRpc2VubzE4fQpsaWJyYXJ5KHN1cnZleSkKZGlzZW5vMTggPSBzdnlkZXNpZ24oaWRzID0gfnVwbSwgc3RyYXRhID0gfmVzdHJhdG9wcmksIHdlaWdodHMgPSB+d2VpZ2h0MTUwMCwgbmVzdD1UUlVFLCBkYXRhPWxhcG9wMTgpCmBgYAoKU2UgcHVlZGUgZGVzY3JpYmlyIGxhIHZhcmlhYmxlIGRlIHNhdGlzZmFjY2nDs24gY29uIGxhIGRlbW9jcmFjaWEgaW5jb3Jwb3JhbmRvIGVsIGZhY3RvciBkZSBkaXNlw7FvIHVzYW5kbyBlbCBjb21hbmRvIGBzdnltZWFuYC4KCmBgYHtyIHdlaWdodGVkcG40fQpzdnltZWFuKH5wbjRyciwgZGlzZW5vMTgsIG5hLnJtPVQpCmBgYAoKUGFyYSBjYWxjdWxhciBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphLCBzZSB0aWVuZSBxdWUgYW5pZGFyIGVsIGPDs2RpZ28gYW50ZXJpb3IgZGVudHJvIGRlbCBjb21hbmRvIGBjb25maW50YC4KRXN0ZSBjb21hbmRvIGNhbGN1bGEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbCA5NSUgcG9yIGRlZmVjdG8uClNlIHBvZHLDrWEgY2FtYmlhciBlc3RlIHZhbG9yIHBvciBkZWZlY3RvIGEgOTklIGRlIGNvbmZpYW56YSBhZ3JlZ2FuZG8gbGEgZXNwZWNpZmljYWNpw7NuIGBjb25mID0gMC45OWAgYWwgY29tYW5kby4KCmBgYHtyIHdlaWdodGVkY2l9CmNvbmZpbnQoc3Z5bWVhbih+cG40cnIsIGRpc2VubzE4LCBuYS5ybT1UKSkKYGBgCgpUYW1iacOpbiBzZSBwdWVkZSBjYWxjdWxhciBsYSBtZWRpYSB5IGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgc2F0aXNmYWNjacOzbiBjb24gbGEgZGVtb2NyYWNpYSBpbmNvcnBvcmFuZG8gZWwgZWZlY3RvIGRlIGRpc2XDsW8gdXNhbmRvIGVsIGNvbWFuZG8gYHN2eWJ5YC4KRGVudHJvIGRlIGVzdGUgY29tYW5kbyBzZSBlc3BlY2lmaWNhIGxhIHZhcmlhYmxlIG51bcOpcmljYSBhIHNlciBkZXNjcml0YSAoYH5wbjRycmApLCBsYSB2YXJpYWJsZSBxdWUgZm9ybWEgbG9zIGdydXBvcyAoYH5zbWVkaWE1cmApLCBlbCBkaXNlw7FvIG11ZXN0cmFsIChgZGlzZW5vMThgKSwgbGEgZnVuY2nDs24gcXVlIHNlIHF1aWVyZSBjYWxjdWxhciAoYHN2eW1lYW5gKSwgcXVlIG5vIHRvbWUgZW4gY3VlbnRhIGxvcyB2YWxvcmVzIHBlcmRpZG9zIChgbmEucm09VGApIHkgcXVlIGluY2x1eWEgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBjYWRhIGdydXBvIChgdmFydHlwZT0iY2kiYCkuCgpgYGB7ciB3ZWlnaHRlZGNpeGdydXBvc30KdHcudXNvLndlaWdodGVkID0gc3Z5YnkofnBuNHJyLCB+c21lZGlhNXIsIGRpc2VubzE4LCBzdnltZWFuLCBuYS5ybT1ULCB2YXJ0eXBlID0gImNpIikKdHcudXNvLndlaWdodGVkCmBgYAoKUGFyYSBwb2RlciBncmFmaWNhciwgZXN0b3MgY8OhbGN1bG9zIHNlIGd1YXJkYW4gZW4gdW4gZGF0YWZyYW1lICJ0dy51c28ud2VpZ2h0ZWQiLCBxdWUgaW5jbHV5ZSBsb3MgZGF0b3MgZGUgbGEgbWVkaWEgcG9yIGNhZGEgZ3J1cG8geSBlbCBsw61taXRlIGluZmVyaW9yIHkgc3VwZXJpb3IgZGVsIGludGVydmFsbyBkZSBjb25maWFuemEuCkRlIGxhIG1pc21hIG1hbmVyYSBxdWUgY29uIGxvcyBkYXRvcyBxdWUgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8sIHNlIHVzYSBsYSBsaWJyZXLDrWEgYGdncGxvdGAgeSBzZSBjcmVhIHVuIGdyw6FmaWNvIHF1ZSBzZSBndWFyZGEgZW4gdW4gb2JqZXRvICJncmFmMiIuClNlIHVzYW4gZXNwZWNpZmljYWNpb25lcyBtdXkgc2ltaWxhcmVzIGEgbG9zIGVqZW1wbG9zIGFudGVyaW9yZXMuCgpgYGB7ciB3ZWlnaHRlZGJhcnJhc30KZ3JhZjQgPSBnZ3Bsb3QodHcudXNvLndlaWdodGVkLCBhZXMoeD1zbWVkaWE1ciwgeT1wbjRycikpKwogIGdlb21fYmFyKHdpZHRoPTAuNSwgZmlsbD0iZGFya2N5YW4iLCBjb2xvdXI9ImJsYWNrIiwgc3RhdD0iaWRlbnRpdHkiKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWNpX2wsIHltYXg9Y2lfdSksIHdpZHRoPTAuMikrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShyb3VuZChwbjRyciwgMSksICIlIikpLCB2anVzdD0tNC4yLCBzaXplPTQpKwogIHhsYWIoIlRpcG8gZGUgdXN1YXJpbyBkZSBUd2l0dGVyIikgKyB5bGFiKCJTYXRpc2ZhY2Npw7NuIGNvbiBsYSBkZW1vY3JhY2lhICglKSIpKwogIHlsaW0oMCwgNTApCmdyYWY0CmBgYAoKRXN0b3MgcmVzdWx0YWRvcyBpbmNsdXllbiBlbCBlZmVjdG8gZGUgZGlzZcOxbywgcGVybyBubyBzb24gZXhhY3RhbWVudGUgaWd1YWxlcyBhIGxvcyByZXBvcnRhZG9zIGVuIGVsIGdyw6FmaWNvIDMuOSBkZWwgcmVwb3J0ZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIGRlIGxhIHJvbmRhIDIwMTgvMTkgZGViaWRvIGEgcXVlIGVsIGPDoWxjdWxvIGRlIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgYWwgdGlwbyBkZSB1c3VhcmlvIGRlIFR3aXR0ZXIgZXMgbcOhcyBjb21wbGVqbyBkZSBsbyBxdWUgc2UgaGFjZSBlbiBlc3RhIHNlY2Npw7NuLgo=