1. Introducción
Este trabajo práctico analiza los resultados del operativo APRENDER
2024 en el área de Matemática para estudiantes de 5to/6to año de la
escuela secundaria. El dataset contiene información sobre el desempeño
de los estudiantes medido mediante la escala TRI (Teoría de Respuesta al
Ítem), con media 500 y desvío estándar 100, clasificado en cuatro
niveles: Por debajo del básico, Básico,
Satisfactorio y Avanzado.
2. Variables seleccionadas
a. Numéricas:
ptje_debajo: puntaje TRI del umbral correspondiente al
nivel Por debajo del básico
ptje_satisfactorio: puntaje TRI del umbral
correspondiente al nivel Satisfactorio
b. Cualitativas:
sector: Estatal / Privado
ambito: Rural / Urbano
3. Carga y limpieza de datos
library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(rstatix)
library(cowplot)
library(scales)
library(nortest)
library(knitr)
library(effectsize)
library(moments)
df_raw <- read_excel("aprender2024_matematica.xlsx")
cat("Dimensiones originales:", dim(df_raw), "\n")
## Dimensiones originales: 1175 1035
df <- df_raw %>%
select(
sector,
ambito,
mdesemp_Por_debajo_del_nivel_básico,
mdesemp_Satisfactorio
) %>%
rename(
ptje_debajo = mdesemp_Por_debajo_del_nivel_básico,
ptje_satisfactorio = mdesemp_Satisfactorio
) %>%
mutate(
ptje_debajo = as.numeric(ptje_debajo),
ptje_satisfactorio = as.numeric(ptje_satisfactorio),
sector = as.factor(sector),
ambito = as.factor(ambito)
) %>%
filter(!is.na(ptje_debajo), !is.na(ptje_satisfactorio))
cat("Filas originales: ", nrow(df_raw), "\n")
## Filas originales: 1175
cat("Filas después del filtro: ", nrow(df), "\n")
## Filas después del filtro: 1087
cat("Filas eliminadas (NAs): ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas (NAs): 88
Nota. A diferencia de una versión preliminar del
análisis, aquí se eliminan únicamente los registros con valores
NA, ya que las variables representan puntajes TRI (escala
con media 500 y DE 100) y no porcentajes acotados entre 0 y 100. Los
valores elevados que podrían parecer anómalos son válidos dentro de esta
escala.
4. Análisis Exploratorio
4.1 Estadísticos descriptivos
summary(df[, c("ptje_debajo", "ptje_satisfactorio")])
## ptje_debajo ptje_satisfactorio
## Min. : 2.081 Min. : 1.000
## 1st Qu.: 38.953 1st Qu.: 5.741
## Median : 92.476 Median : 18.866
## Mean : 267.765 Mean : 86.906
## 3rd Qu.: 221.385 3rd Qu.: 64.725
## Max. :9327.423 Max. :3038.227
Ambas variables presentan una marcada asimetría positiva: la media es
considerablemente mayor que la mediana en ambos casos
(ptje_debajo: mediana 92 vs. media 268;
ptje_satisfactorio: mediana 19 vs. media 87), lo que indica
la presencia de valores extremos que jalan la media hacia arriba. Esto
justifica el uso de la mediana como medida de tendencia central y del
test de Wilcoxon como prueba de comparación.
4.2 Distribución de variables numéricas
h1 <- ggplot(df, aes(x = ptje_debajo)) +
geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
coord_cartesian(xlim = c(0, quantile(df$ptje_debajo, 0.99))) +
theme_bw() +
labs(
title = "Puntaje TRI — Debajo del básico",
x = "Puntaje TRI (media=500, DE=100)",
y = "Frecuencia"
) +
theme(plot.title = element_text(hjust = 0.5))
h2 <- ggplot(df, aes(x = ptje_satisfactorio)) +
geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
coord_cartesian(xlim = c(0, quantile(df$ptje_satisfactorio, 0.99))) +
theme_bw() +
labs(
title = "Puntaje TRI — Satisfactorio",
x = "Puntaje TRI (media=500, DE=100)",
y = "Frecuencia"
) +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(h1, h2, ncol = 2)
Nota. Los histogramas evidencian una distribución
asimétrica positiva en ambas variables, con una marcada concentración de
escuelas en los puntajes más bajos y una cola derecha prolongada. Esto
indica que la mayoría de los establecimientos educativos presenta
puntajes reducidos en ambos niveles de desempeño, siendo los valores
elevados casos atípicos. Esta asimetría refuerza la decisión de utilizar
la mediana como medida de tendencia central y el test de Wilcoxon como
prueba de comparación.
4.3 Verificación de normalidad
QQ-Plots
par(mfrow = c(1, 2))
qqnorm(df$ptje_debajo,
main = "QQ-Plot — Debajo del básico",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, quantile(df$ptje_debajo, 0.99)))
qqline(df$ptje_debajo, col = "red")
qqnorm(df$ptje_satisfactorio,
main = "QQ-Plot — Satisfactorio",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, quantile(df$ptje_satisfactorio, 0.99)))
qqline(df$ptje_satisfactorio, col = "red")
par(mfrow = c(1, 1))
Nota. Los QQ-plots confirman el alejamiento de la
normalidad en ambas variables. Los puntos se desvían sistemáticamente de
la línea teórica, evidenciando una distribución asimétrica con cola
derecha pronunciada. Este resultado, junto con los tests de Lilliefors
(Tabla 1), justifica el uso del test no paramétrico de
Wilcoxon-Mann-Whitney como prueba principal en la comparación de
medias.
Test de Lilliefors
lt_debajo <- lillie.test(df$ptje_debajo)
lt_satis <- lillie.test(df$ptje_satisfactorio)
resultados_norm <- data.frame(
Variable = c("ptje_debajo", "ptje_satisfactorio"),
Test = c("Lilliefors", "Lilliefors"),
p_valor = c(round(lt_debajo$p.value, 4),
round(lt_satis$p.value, 4)),
Decision = c(
ifelse(lt_debajo$p.value > 0.05,
"No se rechaza H₀ → Normal",
"Se rechaza H₀ → No normal"),
ifelse(lt_satis$p.value > 0.05,
"No se rechaza H₀ → Normal",
"Se rechaza H₀ → No normal")
)
)
kable(resultados_norm,
col.names = c("Variable", "Test", "p-valor", "Decisión (α = 0.05)"),
align = c("l", "l", "c", "l"),
caption = "Tabla 1. Tests de normalidad para las variables numéricas.")
Tabla 1. Tests de normalidad para las variables
numéricas.
| ptje_debajo |
Lilliefors |
0 |
Se rechaza H₀ → No normal |
| ptje_satisfactorio |
Lilliefors |
0 |
Se rechaza H₀ → No normal |
Nota. El test de Lilliefors confirma la no
normalidad de ambas variables (p < 0.001), lo que justifica el uso
del test de Wilcoxon-Mann-Whitney como prueba principal en las
comparaciones. No obstante, dado el tamaño muestral (n = 1087), el
Teorema Central del Límite también respalda el uso complementario del
test t de Welch.
4.4 Variables cualitativas
cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
##
## Estatal Privado
## 789 298
print(round(prop.table(table(df$sector)) * 100, 1))
##
## Estatal Privado
## 72.6 27.4
cat("=== FRECUENCIAS ÁMBITO ===\n")
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
##
## Rural Urbano
## 387 700
print(round(prop.table(table(df$ambito)) * 100, 1))
##
## Rural Urbano
## 35.6 64.4
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
geom_bar(color = "white", alpha = 0.85, width = 0.4) +
geom_text(stat = "count",
aes(label = paste0(after_stat(count), "\n",
round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
vjust = -0.3, size = 3.5) +
scale_fill_manual(values = c("#5DADE2", "#E59866")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
theme_bw(base_size = 11) +
labs(title = "Distribución por Sector",
x = "", y = "Cantidad de escuelas") +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
b2 <- ggplot(df, aes(x = ambito, fill = ambito)) +
geom_bar(color = "white", alpha = 0.85, width = 0.4) +
geom_text(stat = "count",
aes(label = paste0(after_stat(count), "\n",
round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
vjust = -0.3, size = 3.5) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
theme_bw(base_size = 11) +
labs(title = "Distribución por Ámbito",
x = "", y = "Cantidad de escuelas") +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
plot_grid(b1, b2, ncol = 2)
Nota. El dataset comprende 1087 escuelas secundarias
relevadas en el operativo APRENDER 2024. La mayoría corresponde al
sector estatal (789 escuelas, 72.6%) y al ámbito urbano (700 escuelas,
64.4%). Este desbalance entre categorías debe tenerse en cuenta al
interpretar las comparaciones entre grupos.
5. Relación entre variables numéricas
5.1 Diagrama de dispersión
ggplot(df, aes(x = ptje_debajo, y = ptje_satisfactorio)) +
geom_point(alpha = 0.4, size = 1.5) +
geom_smooth(method = "lm", se = TRUE, color = "red") +
theme_bw() +
labs(
title = "Puntaje TRI: Debajo del básico vs. Satisfactorio",
x = "Puntaje TRI — Debajo del básico",
y = "Puntaje TRI — Satisfactorio"
) +
theme(plot.title = element_text(hjust = 0.5))
Nota. Se observa una relación positiva entre ambos
puntajes: las escuelas con mayor puntaje en el nivel Debajo del
básico también tienden a presentar mayor puntaje en el nivel
Satisfactorio. La línea roja representa el ajuste lineal con
intervalo de confianza al 95%. La concentración de puntos en valores
bajos confirma la asimetría observada en los histogramas.
5.2 Correlación de Pearson
cor.test(df$ptje_debajo, df$ptje_satisfactorio, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: df$ptje_debajo and df$ptje_satisfactorio
## t = 28.231, df = 1085, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6150943 0.6837562
## sample estimates:
## cor
## 0.6507536
Se encontró una correlación de Pearson positiva débil entre ambas
variables. Si bien estadísticamente significativa dado el tamaño
muestral, la magnitud indica una relación prácticamente irrelevante en
términos sustantivos.
6. Comparación de medias
6.1 H1: ¿El sector influye en el puntaje TRI Satisfactorio?
\[H_0: \text{La distribución del puntaje
TRI Satisfactorio es igual en escuelas estatales y privadas.}\]
\[H_1: \text{Existe diferencia en la
distribución del puntaje TRI Satisfactorio entre sectores.}\]
df %>%
group_by(sector) %>%
summarise(
media = round(mean(ptje_satisfactorio, na.rm = TRUE), 2),
mediana = round(median(ptje_satisfactorio, na.rm = TRUE), 2),
desvio = round(sd(ptje_satisfactorio, na.rm = TRUE), 2),
n = n()
)
cat("--- Test de Levene ---\n")
## --- Test de Levene ---
leveneTest(ptje_satisfactorio ~ sector, data = df)
cat("--- Test de Wilcoxon-Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon-Mann-Whitney (principal) ---
wilcox.test(ptje_satisfactorio ~ sector, data = df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: ptje_satisfactorio by sector
## W = 58894, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("--- Test t de Welch (complementario) ---\n")
## --- Test t de Welch (complementario) ---
t.test(ptje_satisfactorio ~ sector, data = df, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: ptje_satisfactorio by sector
## t = -6.5028, df = 332.6, p-value = 2.891e-10
## alternative hypothesis: true difference in means between group Estatal and group Privado is not equal to 0
## 95 percent confidence interval:
## -156.19843 -83.64484
## sample estimates:
## mean in group Estatal mean in group Privado
## 54.02934 173.95098
cat("--- Tamaño del efecto (d de Cohen) ---\n")
## --- Tamaño del efecto (d de Cohen) ---
cohens_d(ptje_satisfactorio ~ sector, data = df)
ggplot(df, aes(x = sector, y = ptje_satisfactorio, fill = sector)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
coord_cartesian(ylim = c(0, 500)) +
scale_fill_manual(values = c("#5DADE2", "#E59866")) +
theme_bw() +
labs(
title = "Puntaje TRI Satisfactorio según Sector",
x = "",
y = "Puntaje TRI — Satisfactorio"
) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
Nota. Tanto el test de Wilcoxon-Mann-Whitney como el
test de Welch coinciden en rechazar \(H_0\) (p < 0.001). Las escuelas privadas
presentan un puntaje TRI Satisfactorio significativamente mayor que las
estatales. El tamaño del efecto es muy grande (d = −1.57), lo que indica
una diferencia sustantiva y no solo estadística entre ambos
sectores.
6.2 H2: ¿El ámbito influye en el puntaje TRI Debajo del básico?
\[H_0: \text{La distribución del puntaje
TRI Debajo del básico es igual en escuelas rurales y urbanas.}\]
\[H_1: \text{Existe diferencia en la
distribución del puntaje TRI Debajo del básico entre
ámbitos.}\]
df %>%
group_by(ambito) %>%
summarise(
media = round(mean(ptje_debajo, na.rm = TRUE), 2),
mediana = round(median(ptje_debajo, na.rm = TRUE), 2),
desvio = round(sd(ptje_debajo, na.rm = TRUE), 2),
n = n()
)
cat("--- Test de Levene ---\n")
## --- Test de Levene ---
leveneTest(ptje_debajo ~ ambito, data = df)
cat("--- Test t de Welch (principal) ---\n")
## --- Test t de Welch (principal) ---
t.test(ptje_debajo ~ ambito, data = df, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: ptje_debajo by ambito
## t = -12.644, df = 714.83, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Rural and group Urbano is not equal to 0
## 95 percent confidence interval:
## -380.3442 -278.1049
## sample estimates:
## mean in group Rural mean in group Urbano
## 55.75313 384.97769
cat("--- Test de Wilcoxon-Mann-Whitney (complementario) ---\n")
## --- Test de Wilcoxon-Mann-Whitney (complementario) ---
wilcox.test(ptje_debajo ~ ambito, data = df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: ptje_debajo by ambito
## W = 42848, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("--- Tamaño del efecto (d de Cohen) ---\n")
## --- Tamaño del efecto (d de Cohen) ---
cohens_d(ptje_debajo ~ ambito, data = df)
ggplot(df, aes(x = ambito, y = ptje_debajo, fill = ambito)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
coord_cartesian(ylim = c(0, 500)) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
theme_bw() +
labs(
title = "Puntaje TRI Debajo del básico según Ámbito",
x = "",
y = "Puntaje TRI — Debajo del básico"
) +
theme(legend.position = "none",
plot.title = element_text(hjust = 0.5))
Nota. Se rechaza \(H_0\) (Wilcoxon: p < 0.001; Welch: p
< 0.001). Las escuelas urbanas presentan un puntaje TRI Debajo del
básico significativamente mayor que las rurales, resultado
contraintuitivo que puede explicarse por la mayor concentración de
matrícula y diversidad socioeconómica en contextos urbanos. El tamaño
del efecto es moderado (d = −0.65).
7. Prueba de independencia (\(\chi^2\))
\[H_0: \text{Sector y Ámbito son
independientes.}\] \[H_1: \text{Existe
asociación entre Sector y Ámbito.}\]
tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##
## Rural Urbano
## Estatal 355 434
## Privado 32 266
cat("\n--- Proporciones por fila ---\n")
##
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##
## Rural Urbano
## Estatal 45.0 55.0
## Privado 10.7 89.3
chi_test <- chisq.test(tabla_cont)
print(chi_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_cont
## X-squared = 109.22, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
##
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##
## Rural Urbano
## Estatal 280.9 508.1
## Privado 106.1 191.9
cat("--- Tamaño del efecto (V de Cramér) ---\n")
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.3169792
df_cont <- as.data.frame(tabla_cont)
names(df_cont) <- c("Sector", "Ambito", "Frecuencia")
pc1 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
geom_bar(stat = "identity", position = "dodge",
color = "white", alpha = 0.85) +
geom_text(aes(label = Frecuencia),
position = position_dodge(width = 0.9),
vjust = -0.5, size = 3.5) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
theme_bw() +
labs(title = "Frecuencia de Ámbito según Sector",
x = "", y = "Frecuencia", fill = "Ámbito") +
theme(plot.title = element_text(hjust = 0.5))
pc2 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
geom_bar(stat = "identity", position = "fill",
color = "white", alpha = 0.85) +
geom_text(aes(label = paste0(round(Frecuencia / ave(Frecuencia, Sector, FUN = sum) * 100, 1), "%")),
position = position_fill(vjust = 0.5),
size = 3.5, color = "white", fontface = "bold") +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
theme_bw() +
labs(title = "Proporción de Ámbito según Sector",
x = "", y = "Proporción", fill = "Ámbito") +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(pc1, pc2, ncol = 2)
Nota. Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una
asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Las
escuelas estatales son predominantemente rurales (45%), mientras que las
privadas son mayoritariamente urbanas (89%). Esta asociación es
relevante al interpretar los resultados anteriores, ya que sector y
ámbito no son variables independientes, lo que debe considerarse al
comparar grupos.
8. Conclusiones
El análisis de los datos del operativo APRENDER 2024 para matemática
en el nivel secundario permite extraer las siguientes conclusiones:
a. Sobre la calidad de los datos: El dataset
original contiene registros con valores NA que fueron
eliminados, conservando 1087 observaciones válidas para el análisis. Las
variables representan puntajes TRI (escala con media 500 y DE 100), no
porcentajes.
b. Sobre la distribución del desempeño: Ninguna de
las variables analizadas sigue una distribución normal, evidenciado por
los QQ-plots y el test de Lilliefors. Ambas distribuciones presentan
sesgo positivo, con gran heterogeneidad entre escuelas.
c. Sobre la relación entre variables numéricas: Se
encontró una correlación de Pearson positiva débil entre el puntaje TRI
Debajo del básico y el puntaje TRI Satisfactorio (r = 0.23, p <
0.001). La baja magnitud indica que ambas variables no son
complementarias directas y que otros factores explican la distribución
del desempeño escolar.
d. H1 — Sector y puntaje Satisfactorio: Se rechaza
\(H_0\) (Wilcoxon: p < 0.001). Las
escuelas privadas presentan un puntaje TRI Satisfactorio
significativamente mayor que las estatales. El tamaño del efecto es muy
grande (d = −1.57), indicando que la diferencia entre sectores es
sustantiva.
e. H2 — Ámbito y puntaje Debajo del básico: Se
rechaza \(H_0\) (Welch: p < 0.001).
Las escuelas urbanas presentan un puntaje TRI Debajo del básico mayor
que las rurales, resultado contraintuitivo que puede explicarse por la
mayor concentración de matrícula y diversidad socioeconómica en
contextos de vulnerabilidad social en zonas urbanas. El tamaño del
efecto es moderado (d = −0.65).
f. \(\chi^2\) — Asociación
entre Sector y Ámbito: Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una
asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Esta
asociación es relevante al interpretar los resultados anteriores, ya que
sector y ámbito no son variables independientes.
9. Referencias
Devore, J. L. (2008). Probabilidad y estadística para ingeniería
y ciencias (7ma ed.). Cengage Learning.
Pérez, S. N. (2026). Fundamentos de Estadística
[Diapositivas]. Especialización en Ciencia de Datos, Universidad
Nacional del Oeste.
Ministerio de Educación de la Nación Argentina (2024). Operativo
Nacional de Evaluación APRENDER 2024 — Resultados Matemática.
Buenos Aires: Ministerio de Educación de la Nación.
10. Anexo
Anexo A — Código y análisis interactivo
El código R completo utilizado en este trabajo, junto con los
resultados y visualizaciones en formato interactivo, se encuentra
disponible en:
Árnica, E. (2026). Análisis APRENDER 2024 — Matemática
[RMarkdown publicado en RPubs]. https://rpubs.com/eduardoarnica/tp-aprender2024
LS0tDQp0aXRsZTogJ0ZhY3RvcmVzIGFzb2NpYWRvcyBhbCByZW5kaW1pZW50byBlbiBNYXRlbcOhdGljYSBlbiBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEgYXJnZW50aW5hOg0KICB1biBhbsOhbGlzaXMgY29uIGRhdG9zIEFQUkVOREVSIDIwMjQnDQphdXRob3I6ICJDYXN0ZWxsaSwgUm9taW5hIMK3IENhcnJhemFuYSwgSmVzaWNhIMK3IMOBcm5pY2EsIEVkdWFyZG8iDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYSIpDQpgYGANCg0KPGNlbnRlcj4NCiFbIF0oZXNjdWRvLnBuZyl7d2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjE1MHB4In0NCjwvY2VudGVyPg0KDQotLS0NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCkVzdGUgdHJhYmFqbyBwcsOhY3RpY28gYW5hbGl6YSBsb3MgcmVzdWx0YWRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgZW4gZWwgw6FyZWEgZGUgTWF0ZW3DoXRpY2EgcGFyYSBlc3R1ZGlhbnRlcyBkZSA1dG8vNnRvIGHDsW8gZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhLiBFbCBkYXRhc2V0IGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSBlbCBkZXNlbXBlw7FvIGRlIGxvcyBlc3R1ZGlhbnRlcyBtZWRpZG8gbWVkaWFudGUgbGEgZXNjYWxhIFRSSSAoVGVvcsOtYSBkZSBSZXNwdWVzdGEgYWwgw410ZW0pLCBjb24gbWVkaWEgNTAwIHkgZGVzdsOtbyBlc3TDoW5kYXIgMTAwLCBjbGFzaWZpY2FkbyBlbiBjdWF0cm8gbml2ZWxlczogKlBvciBkZWJham8gZGVsIGLDoXNpY28qLCAqQsOhc2ljbyosICpTYXRpc2ZhY3RvcmlvKiB5ICpBdmFuemFkbyouDQoNCi0tLQ0KDQojIDIuIFZhcmlhYmxlcyBzZWxlY2Npb25hZGFzDQoNCioqYS4gTnVtw6lyaWNhczoqKg0KDQotIGBwdGplX2RlYmFqb2A6IHB1bnRhamUgVFJJIGRlbCB1bWJyYWwgY29ycmVzcG9uZGllbnRlIGFsIG5pdmVsICpQb3IgZGViYWpvIGRlbCBiw6FzaWNvKg0KLSBgcHRqZV9zYXRpc2ZhY3RvcmlvYDogcHVudGFqZSBUUkkgZGVsIHVtYnJhbCBjb3JyZXNwb25kaWVudGUgYWwgbml2ZWwgKlNhdGlzZmFjdG9yaW8qDQoNCioqYi4gQ3VhbGl0YXRpdmFzOioqDQoNCi0gYHNlY3RvcmA6IEVzdGF0YWwgLyBQcml2YWRvDQotIGBhbWJpdG9gOiBSdXJhbCAvIFVyYmFubw0KDQotLS0NCg0KIyAzLiBDYXJnYSB5IGxpbXBpZXphIGRlIGRhdG9zDQoNCmBgYHtyIGxpYnJlcmlhc30NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KbGlicmFyeShtb21lbnRzKQ0KYGBgDQoNCmBgYHtyIGNhcmdhfQ0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoImFwcmVuZGVyMjAyNF9tYXRlbWF0aWNhLnhsc3giKQ0KY2F0KCJEaW1lbnNpb25lcyBvcmlnaW5hbGVzOiIsIGRpbShkZl9yYXcpLCAiXG4iKQ0KYGBgDQoNCmBgYHtyIGxpbXBpZXphfQ0KZGYgPC0gZGZfcmF3ICU+JQ0KICBzZWxlY3QoDQogICAgc2VjdG9yLA0KICAgIGFtYml0bywNCiAgICBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIHJlbmFtZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgcHRqZV9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBhcy5udW1lcmljKHB0amVfZGViYWpvKSwNCiAgICBwdGplX3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHB0amVfc2F0aXNmYWN0b3JpbyksDQogICAgc2VjdG9yID0gYXMuZmFjdG9yKHNlY3RvciksDQogICAgYW1iaXRvID0gYXMuZmFjdG9yKGFtYml0bykNCiAgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwdGplX2RlYmFqbyksICFpcy5uYShwdGplX3NhdGlzZmFjdG9yaW8pKQ0KDQpjYXQoIkZpbGFzIG9yaWdpbmFsZXM6ICAgICAgICAgICIsIG5yb3coZGZfcmF3KSwgIlxuIikNCmNhdCgiRmlsYXMgZGVzcHXDqXMgZGVsIGZpbHRybzogICIsIG5yb3coZGYpLCAgICAgIlxuIikNCmNhdCgiRmlsYXMgZWxpbWluYWRhcyAoTkFzKTogICAgIiwgbnJvdyhkZl9yYXcpIC0gbnJvdyhkZiksICJcbiIpDQpgYGANCg0KPiAqKk5vdGEuKiogQSBkaWZlcmVuY2lhIGRlIHVuYSB2ZXJzacOzbiBwcmVsaW1pbmFyIGRlbCBhbsOhbGlzaXMsIGFxdcOtIHNlIGVsaW1pbmFuIMO6bmljYW1lbnRlIGxvcyByZWdpc3Ryb3MgY29uIHZhbG9yZXMgYE5BYCwgeWEgcXVlIGxhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCkgeSBubyBwb3JjZW50YWplcyBhY290YWRvcyBlbnRyZSAwIHkgMTAwLiBMb3MgdmFsb3JlcyBlbGV2YWRvcyBxdWUgcG9kcsOtYW4gcGFyZWNlciBhbsOzbWFsb3Mgc29uIHbDoWxpZG9zIGRlbnRybyBkZSBlc3RhIGVzY2FsYS4NCg0KLS0tDQoNCiMgNC4gQW7DoWxpc2lzIEV4cGxvcmF0b3Jpbw0KDQojIyA0LjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInB0amVfZGViYWpvIiwgInB0amVfc2F0aXNmYWN0b3JpbyIpXSkNCmBgYA0KDQpBbWJhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHVuYSBtYXJjYWRhIGFzaW1ldHLDrWEgcG9zaXRpdmE6IGxhIG1lZGlhIGVzIGNvbnNpZGVyYWJsZW1lbnRlIG1heW9yIHF1ZSBsYSBtZWRpYW5hIGVuIGFtYm9zIGNhc29zIChgcHRqZV9kZWJham9gOiBtZWRpYW5hIDkyIHZzLiBtZWRpYSAyNjg7IGBwdGplX3NhdGlzZmFjdG9yaW9gOiBtZWRpYW5hIDE5IHZzLiBtZWRpYSA4NyksIGxvIHF1ZSBpbmRpY2EgbGEgcHJlc2VuY2lhIGRlIHZhbG9yZXMgZXh0cmVtb3MgcXVlIGphbGFuIGxhIG1lZGlhIGhhY2lhIGFycmliYS4gRXN0byBqdXN0aWZpY2EgZWwgdXNvIGRlIGxhIG1lZGlhbmEgY29tbyBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgeSBkZWwgdGVzdCBkZSBXaWxjb3hvbiBjb21vIHBydWViYSBkZSBjb21wYXJhY2nDs24uDQoNCiMjIDQuMiBEaXN0cmlidWNpw7NuIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCmBgYHtyIGhpc3RvZ3JhbWFzLCBmaWcuY2FwPSJGaWd1cmEgMS4gRGlzdHJpYnVjacOzbiBkZWwgcHVudGFqZSBUUkkgcGFyYSBsb3Mgbml2ZWxlcyBEZWJham8gZGVsIGLDoXNpY28geSBTYXRpc2ZhY3RvcmlvLiJ9DQpoMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gcHRqZV9kZWJham8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiI0U3NEMzQyIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX2RlYmFqbywgMC45OSkpKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgIHggICAgID0gIlB1bnRhamUgVFJJIChtZWRpYT01MDAsIERFPTEwMCkiLA0KICAgIHkgICAgID0gIkZyZWN1ZW5jaWEiDQogICkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KaDIgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHB0amVfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICIjMkVDQzcxIiwgY29sb3IgPSAid2hpdGUiLCBiaW5zID0gMzApICsNCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgMC45OSkpKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIiwNCiAgICB4ICAgICA9ICJQdW50YWplIFRSSSAobWVkaWE9NTAwLCBERT0xMDApIiwNCiAgICB5ICAgICA9ICJGcmVjdWVuY2lhIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIExvcyBoaXN0b2dyYW1hcyBldmlkZW5jaWFuIHVuYSBkaXN0cmlidWNpw7NuIGFzaW3DqXRyaWNhIHBvc2l0aXZhIGVuIGFtYmFzIHZhcmlhYmxlcywgY29uIHVuYSBtYXJjYWRhIGNvbmNlbnRyYWNpw7NuIGRlIGVzY3VlbGFzIGVuIGxvcyBwdW50YWplcyBtw6FzIGJham9zIHkgdW5hIGNvbGEgZGVyZWNoYSBwcm9sb25nYWRhLiBFc3RvIGluZGljYSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVzdGFibGVjaW1pZW50b3MgZWR1Y2F0aXZvcyBwcmVzZW50YSBwdW50YWplcyByZWR1Y2lkb3MgZW4gYW1ib3Mgbml2ZWxlcyBkZSBkZXNlbXBlw7FvLCBzaWVuZG8gbG9zIHZhbG9yZXMgZWxldmFkb3MgY2Fzb3MgYXTDrXBpY29zLiBFc3RhIGFzaW1ldHLDrWEgcmVmdWVyemEgbGEgZGVjaXNpw7NuIGRlIHV0aWxpemFyIGxhIG1lZGlhbmEgY29tbyBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgeSBlbCB0ZXN0IGRlIFdpbGNveG9uIGNvbW8gcHJ1ZWJhIGRlIGNvbXBhcmFjacOzbi4NCg0KIyMgNC4zIFZlcmlmaWNhY2nDs24gZGUgbm9ybWFsaWRhZA0KDQojIyMgUVEtUGxvdHMNCg0KYGBge3IgcXFwbG90cywgZmlnLmNhcD0iRmlndXJhIDIuIEdyw6FmaWNvcyBRUSBwYXJhIHZlcmlmaWNhY2nDs24gZGUgbm9ybWFsaWRhZC4iLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCg0KcXFub3JtKGRmJHB0amVfZGViYWpvLA0KICAgICAgIG1haW4gPSAiUVEtUGxvdCDigJQgRGViYWpvIGRlbCBiw6FzaWNvIiwNCiAgICAgICB4bGFiID0gIkN1YW50aWxlcyB0ZcOzcmljb3MiLA0KICAgICAgIHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGxhIG11ZXN0cmEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfZGViYWpvLCAwLjk5KSkpDQpxcWxpbmUoZGYkcHRqZV9kZWJham8sIGNvbCA9ICJyZWQiKQ0KDQpxcW5vcm0oZGYkcHRqZV9zYXRpc2ZhY3RvcmlvLA0KICAgICAgIG1haW4gPSAiUVEtUGxvdCDigJQgU2F0aXNmYWN0b3JpbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIDAuOTkpKSkNCnFxbGluZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIGNvbCA9ICJyZWQiKQ0KDQpwYXIobWZyb3cgPSBjKDEsIDEpKQ0KYGBgDQoNCj4gKipOb3RhLioqIExvcyBRUS1wbG90cyBjb25maXJtYW4gZWwgYWxlamFtaWVudG8gZGUgbGEgbm9ybWFsaWRhZCBlbiBhbWJhcyB2YXJpYWJsZXMuIExvcyBwdW50b3Mgc2UgZGVzdsOtYW4gc2lzdGVtw6F0aWNhbWVudGUgZGUgbGEgbMOtbmVhIHRlw7NyaWNhLCBldmlkZW5jaWFuZG8gdW5hIGRpc3RyaWJ1Y2nDs24gYXNpbcOpdHJpY2EgY29uIGNvbGEgZGVyZWNoYSBwcm9udW5jaWFkYS4gRXN0ZSByZXN1bHRhZG8sIGp1bnRvIGNvbiBsb3MgdGVzdHMgZGUgTGlsbGllZm9ycyAoVGFibGEgMSksIGp1c3RpZmljYSBlbCB1c28gZGVsIHRlc3Qgbm8gcGFyYW3DqXRyaWNvIGRlIFdpbGNveG9uLU1hbm4tV2hpdG5leSBjb21vIHBydWViYSBwcmluY2lwYWwgZW4gbGEgY29tcGFyYWNpw7NuIGRlIG1lZGlhcy4NCg0KIyMjIFRlc3QgZGUgTGlsbGllZm9ycw0KDQpgYGB7ciBub3JtYWxpZGFkLXRhYmxhfQ0KbHRfZGViYWpvIDwtIGxpbGxpZS50ZXN0KGRmJHB0amVfZGViYWpvKQ0KbHRfc2F0aXMgIDwtIGxpbGxpZS50ZXN0KGRmJHB0amVfc2F0aXNmYWN0b3JpbykNCg0KcmVzdWx0YWRvc19ub3JtIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmxlID0gYygicHRqZV9kZWJham8iLCAicHRqZV9zYXRpc2ZhY3RvcmlvIiksDQogIFRlc3QgICAgID0gYygiTGlsbGllZm9ycyIsICJMaWxsaWVmb3JzIiksDQogIHBfdmFsb3IgID0gYyhyb3VuZChsdF9kZWJham8kcC52YWx1ZSwgNCksDQogICAgICAgICAgICAgICByb3VuZChsdF9zYXRpcyRwLnZhbHVlLCAgNCkpLA0KICBEZWNpc2lvbiA9IGMoDQogICAgaWZlbHNlKGx0X2RlYmFqbyRwLnZhbHVlID4gMC4wNSwNCiAgICAgICAgICAgIk5vIHNlIHJlY2hhemEgSOKCgCDihpIgTm9ybWFsIiwNCiAgICAgICAgICAgIlNlIHJlY2hhemEgSOKCgCDihpIgTm8gbm9ybWFsIiksDQogICAgaWZlbHNlKGx0X3NhdGlzJHAudmFsdWUgPiAwLjA1LA0KICAgICAgICAgICAiTm8gc2UgcmVjaGF6YSBI4oKAIOKGkiBOb3JtYWwiLA0KICAgICAgICAgICAiU2UgcmVjaGF6YSBI4oKAIOKGkiBObyBub3JtYWwiKQ0KICApDQopDQoNCmthYmxlKHJlc3VsdGFkb3Nfbm9ybSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlZhcmlhYmxlIiwgIlRlc3QiLCAicC12YWxvciIsICJEZWNpc2nDs24gKM6xID0gMC4wNSkiKSwNCiAgICAgIGFsaWduICAgICA9IGMoImwiLCAibCIsICJjIiwgImwiKSwNCiAgICAgIGNhcHRpb24gICA9ICJUYWJsYSAxLiBUZXN0cyBkZSBub3JtYWxpZGFkIHBhcmEgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzLiIpDQpgYGANCg0KPiAqKk5vdGEuKiogRWwgdGVzdCBkZSBMaWxsaWVmb3JzIGNvbmZpcm1hIGxhIG5vIG5vcm1hbGlkYWQgZGUgYW1iYXMgdmFyaWFibGVzIChwIDwgMC4wMDEpLCBsbyBxdWUganVzdGlmaWNhIGVsIHVzbyBkZWwgdGVzdCBkZSBXaWxjb3hvbi1NYW5uLVdoaXRuZXkgY29tbyBwcnVlYmEgcHJpbmNpcGFsIGVuIGxhcyBjb21wYXJhY2lvbmVzLiBObyBvYnN0YW50ZSwgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsIChuID0gMTA4NyksIGVsIFRlb3JlbWEgQ2VudHJhbCBkZWwgTMOtbWl0ZSB0YW1iacOpbiByZXNwYWxkYSBlbCB1c28gY29tcGxlbWVudGFyaW8gZGVsIHRlc3QgdCBkZSBXZWxjaC4NCg0KIyMgNC40IFZhcmlhYmxlcyBjdWFsaXRhdGl2YXMNCg0KYGBge3IgZnJlY3VlbmNpYXMtc2VjdG9yfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgU0VDVE9SID09PVxuIikNCnByaW50KHRhYmxlKGRmJHNlY3RvcikpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJHNlY3RvcikpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBmcmVjdWVuY2lhcy1hbWJpdG99DQpjYXQoIj09PSBGUkVDVUVOQ0lBUyDDgU1CSVRPID09PVxuIikNCnByaW50KHRhYmxlKGRmJGFtYml0bykpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJGFtYml0bykpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBiYXJyYXMtY3VhbGksIGZpZy5jYXA9IkZpZ3VyYSAzLiBEaXN0cmlidWNpw7NuIGRlIGVzY3VlbGFzIHNlZ8O6biBzZWN0b3IgZGUgZ2VzdGnDs24geSDDoW1iaXRvIGdlb2dyw6FmaWNvLiJ9DQpiMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLA0KICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUwKGFmdGVyX3N0YXQoY291bnQpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFmdGVyX3N0YXQoY291bnQpL3N1bShhZnRlcl9zdGF0KGNvdW50KSkgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIFNlY3RvciIsDQogICAgICAgeCA9ICIiLCB5ID0gIkNhbnRpZGFkIGRlIGVzY3VlbGFzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpiMiA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gYW1iaXRvLCBmaWxsID0gYW1iaXRvKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLA0KICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUwKGFmdGVyX3N0YXQoY291bnQpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFmdGVyX3N0YXQoY291bnQpL3N1bShhZnRlcl9zdGF0KGNvdW50KSkgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIMOBbWJpdG8iLA0KICAgICAgIHggPSAiIiwgeSA9ICJDYW50aWRhZCBkZSBlc2N1ZWxhcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGxvdF9ncmlkKGIxLCBiMiwgbmNvbCA9IDIpDQpgYGANCg0KPiAqKk5vdGEuKiogRWwgZGF0YXNldCBjb21wcmVuZGUgMTA4NyBlc2N1ZWxhcyBzZWN1bmRhcmlhcyByZWxldmFkYXMgZW4gZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQuIExhIG1heW9yw61hIGNvcnJlc3BvbmRlIGFsIHNlY3RvciBlc3RhdGFsICg3ODkgZXNjdWVsYXMsIDcyLjYlKSB5IGFsIMOhbWJpdG8gdXJiYW5vICg3MDAgZXNjdWVsYXMsIDY0LjQlKS4gRXN0ZSBkZXNiYWxhbmNlIGVudHJlIGNhdGVnb3LDrWFzIGRlYmUgdGVuZXJzZSBlbiBjdWVudGEgYWwgaW50ZXJwcmV0YXIgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgZ3J1cG9zLg0KDQotLS0NCg0KIyA1LiBSZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXMNCg0KIyMgNS4xIERpYWdyYW1hIGRlIGRpc3BlcnNpw7NuDQoNCmBgYHtyIGRpc3BlcnNpb24sIGZpZy5jYXA9IkZpZ3VyYSA0LiBEaWFncmFtYSBkZSBkaXNwZXJzacOzbjogcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHZzLiBTYXRpc2ZhY3RvcmlvLiJ9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHRqZV9kZWJham8sIHkgPSBwdGplX3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQsIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJyZWQiKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJOiBEZWJham8gZGVsIGLDoXNpY28gdnMuIFNhdGlzZmFjdG9yaW8iLA0KICAgIHggICAgID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KPiAqKk5vdGEuKiogU2Ugb2JzZXJ2YSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGFtYm9zIHB1bnRhamVzOiBsYXMgZXNjdWVsYXMgY29uIG1heW9yIHB1bnRhamUgZW4gZWwgbml2ZWwgKkRlYmFqbyBkZWwgYsOhc2ljbyogdGFtYmnDqW4gdGllbmRlbiBhIHByZXNlbnRhciBtYXlvciBwdW50YWplIGVuIGVsIG5pdmVsICpTYXRpc2ZhY3RvcmlvKi4gTGEgbMOtbmVhIHJvamEgcmVwcmVzZW50YSBlbCBhanVzdGUgbGluZWFsIGNvbiBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk1JS4gTGEgY29uY2VudHJhY2nDs24gZGUgcHVudG9zIGVuIHZhbG9yZXMgYmFqb3MgY29uZmlybWEgbGEgYXNpbWV0csOtYSBvYnNlcnZhZGEgZW4gbG9zIGhpc3RvZ3JhbWFzLg0KDQojIyA1LjIgQ29ycmVsYWNpw7NuIGRlIFBlYXJzb24NCg0KYGBge3IgY29ycmVsYWNpb259DQpjb3IudGVzdChkZiRwdGplX2RlYmFqbywgZGYkcHRqZV9zYXRpc2ZhY3RvcmlvLCBtZXRob2QgPSAicGVhcnNvbiIpDQpgYGANCg0KU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgYW1iYXMgdmFyaWFibGVzLiBTaSBiaWVuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsLCBsYSBtYWduaXR1ZCBpbmRpY2EgdW5hIHJlbGFjacOzbiBwcsOhY3RpY2FtZW50ZSBpcnJlbGV2YW50ZSBlbiB0w6lybWlub3Mgc3VzdGFudGl2b3MuDQoNCi0tLQ0KDQojIDYuIENvbXBhcmFjacOzbiBkZSBtZWRpYXMNCg0KIyMgNi4xIEgxOiDCv0VsIHNlY3RvciBpbmZsdXllIGVuIGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8/DQoNCiQkSF8wOiBcdGV4dHtMYSBkaXN0cmlidWNpw7NuIGRlbCBwdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIGVzIGlndWFsIGVuIGVzY3VlbGFzIGVzdGF0YWxlcyB5IHByaXZhZGFzLn0kJA0KJCRIXzE6IFx0ZXh0e0V4aXN0ZSBkaWZlcmVuY2lhIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8gZW50cmUgc2VjdG9yZXMufSQkDQoNCmBgYHtyIGgxLWRlc2NyaXB0aXZvc30NCmRmICU+JQ0KICBncm91cF9ieShzZWN0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9zYXRpc2ZhY3RvcmlvLCAgIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIG1lZGlhbmEgPSByb3VuZChtZWRpYW4ocHRqZV9zYXRpc2ZhY3RvcmlvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBkZXN2aW8gID0gcm91bmQoc2QocHRqZV9zYXRpc2ZhY3RvcmlvLCAgICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbiAgICAgICA9IG4oKQ0KICApDQpgYGANCg0KYGBge3IgaDEtbGV2ZW5lfQ0KY2F0KCItLS0gVGVzdCBkZSBMZXZlbmUgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwdGplX3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS13aWxjb3hvbn0NCmNhdCgiLS0tIFRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IChwcmluY2lwYWwpIC0tLVxuIikNCndpbGNveC50ZXN0KHB0amVfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXdlbGNofQ0KY2F0KCItLS0gVGVzdCB0IGRlIFdlbGNoIChjb21wbGVtZW50YXJpbykgLS0tXG4iKQ0KdC50ZXN0KHB0amVfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBoMS1jb2hlbnNkfQ0KY2F0KCItLS0gVGFtYcOxbyBkZWwgZWZlY3RvIChkIGRlIENvaGVuKSAtLS1cbiIpDQpjb2hlbnNfZChwdGplX3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS1ib3hwbG90LCBmaWcuY2FwPSJGaWd1cmEgNS4gQm94cGxvdCBkZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzZWfDum4gc2VjdG9yIGRlIGdlc3Rpw7NuLiJ9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCB5ID0gcHRqZV9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNykgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNlZ8O6biBTZWN0b3IiLA0KICAgIHggICAgID0gIiIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIFNhdGlzZmFjdG9yaW8iDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCj4gKipOb3RhLioqIFRhbnRvIGVsIHRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IGNvbW8gZWwgdGVzdCBkZSBXZWxjaCBjb2luY2lkZW4gZW4gcmVjaGF6YXIgJEhfMCQgKHAgPCAwLjAwMSkuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBwcmVzZW50YW4gdW4gcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgcXVlIGxhcyBlc3RhdGFsZXMuIEVsIHRhbWHDsW8gZGVsIGVmZWN0byBlcyBtdXkgZ3JhbmRlIChkID0g4oiSMS41NyksIGxvIHF1ZSBpbmRpY2EgdW5hIGRpZmVyZW5jaWEgc3VzdGFudGl2YSB5IG5vIHNvbG8gZXN0YWTDrXN0aWNhIGVudHJlIGFtYm9zIHNlY3RvcmVzLg0KDQojIyA2LjIgSDI6IMK/RWwgw6FtYml0byBpbmZsdXllIGVuIGVsIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbz8NCg0KJCRIXzA6IFx0ZXh0e0xhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbyBlcyBpZ3VhbCBlbiBlc2N1ZWxhcyBydXJhbGVzIHkgdXJiYW5hcy59JCQNCiQkSF8xOiBcdGV4dHtFeGlzdGUgZGlmZXJlbmNpYSBlbiBsYSBkaXN0cmlidWNpw7NuIGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gZW50cmUgw6FtYml0b3MufSQkDQoNCmBgYHtyIGgyLWRlc2NyaXB0aXZvc30NCmRmICU+JQ0KICBncm91cF9ieShhbWJpdG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9kZWJham8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX2RlYmFqbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHB0amVfZGViYWpvLCAgICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbiAgICAgICA9IG4oKQ0KICApDQpgYGANCg0KYGBge3IgaDItbGV2ZW5lfQ0KY2F0KCItLS0gVGVzdCBkZSBMZXZlbmUgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLXdlbGNofQ0KY2F0KCItLS0gVGVzdCB0IGRlIFdlbGNoIChwcmluY2lwYWwpIC0tLVxuIikNCnQudGVzdChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBoMi13aWxjb3hvbn0NCmNhdCgiLS0tIFRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IChjb21wbGVtZW50YXJpbykgLS0tXG4iKQ0Kd2lsY294LnRlc3QocHRqZV9kZWJham8gfiBhbWJpdG8sIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMi1jb2hlbnNkfQ0KY2F0KCItLS0gVGFtYcOxbyBkZWwgZWZlY3RvIChkIGRlIENvaGVuKSAtLS1cbiIpDQpjb2hlbnNfZChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLWJveHBsb3QsIGZpZy5jYXA9IkZpZ3VyYSA2LiBCb3hwbG90IGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIMOhbWJpdG8gZ2VvZ3LDoWZpY28uIn0NCmdncGxvdChkZiwgYWVzKHggPSBhbWJpdG8sIHkgPSBwdGplX2RlYmFqbywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjcpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHNlZ8O6biDDgW1iaXRvIiwNCiAgICB4ICAgICA9ICIiLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKFdpbGNveG9uOiBwIDwgMC4wMDE7IFdlbGNoOiBwIDwgMC4wMDEpLiBMYXMgZXNjdWVsYXMgdXJiYW5hcyBwcmVzZW50YW4gdW4gcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHNpZ25pZmljYXRpdmFtZW50ZSBtYXlvciBxdWUgbGFzIHJ1cmFsZXMsIHJlc3VsdGFkbyBjb250cmFpbnR1aXRpdm8gcXVlIHB1ZWRlIGV4cGxpY2Fyc2UgcG9yIGxhIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIG1hdHLDrWN1bGEgeSBkaXZlcnNpZGFkIHNvY2lvZWNvbsOzbWljYSBlbiBjb250ZXh0b3MgdXJiYW5vcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG1vZGVyYWRvIChkID0g4oiSMC42NSkuDQoNCi0tLQ0KDQojIDcuIFBydWViYSBkZSBpbmRlcGVuZGVuY2lhICgkXGNoaV4yJCkNCg0KJCRIXzA6IFx0ZXh0e1NlY3RvciB5IMOBbWJpdG8gc29uIGluZGVwZW5kaWVudGVzLn0kJA0KJCRIXzE6IFx0ZXh0e0V4aXN0ZSBhc29jaWFjacOzbiBlbnRyZSBTZWN0b3IgeSDDgW1iaXRvLn0kJA0KDQpgYGB7ciBjaGkyLXRhYmxhfQ0KdGFibGFfY29udCA8LSB0YWJsZShkZiRzZWN0b3IsIGRmJGFtYml0bykNCnByaW50KHRhYmxhX2NvbnQpDQoNCmNhdCgiXG4tLS0gUHJvcG9yY2lvbmVzIHBvciBmaWxhIC0tLVxuIikNCnByaW50KHJvdW5kKHByb3AudGFibGUodGFibGFfY29udCwgbWFyZ2luID0gMSkgKiAxMDAsIDEpKQ0KYGBgDQoNCmBgYHtyIGNoaTItdGVzdH0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGFibGFfY29udCkNCnByaW50KGNoaV90ZXN0KQ0KDQpjYXQoIlxuLS0tIEZyZWN1ZW5jaWFzIGVzcGVyYWRhcyAtLS1cbiIpDQpwcmludChyb3VuZChjaGlfdGVzdCRleHBlY3RlZCwgMSkpDQpgYGANCg0KYGBge3IgY2hpMi1jcmFtZXJ9DQpjYXQoIi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKFYgZGUgQ3JhbcOpcikgLS0tXG4iKQ0KY3JhbWVyX3YodGFibGFfY29udCkNCmBgYA0KDQpgYGB7ciBjaGkyLWdyYWZpY29zLCBmaWcuY2FwPSJGaWd1cmEgNy4gRnJlY3VlbmNpYSB5IHByb3BvcmNpw7NuIGRlIMOBbWJpdG8gc2Vnw7puIFNlY3Rvci4ifQ0KZGZfY29udCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxhX2NvbnQpDQpuYW1lcyhkZl9jb250KSA8LSBjKCJTZWN0b3IiLCAiQW1iaXRvIiwgIkZyZWN1ZW5jaWEiKQ0KDQpwYzEgPC0gZ2dwbG90KGRmX2NvbnQsIGFlcyh4ID0gU2VjdG9yLCB5ID0gRnJlY3VlbmNpYSwgZmlsbCA9IEFtYml0bykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IEZyZWN1ZW5jaWEpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSkpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRnJlY3VlbmNpYSBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJGcmVjdWVuY2lhIiwgZmlsbCA9ICLDgW1iaXRvIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGMyIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwNCiAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChGcmVjdWVuY2lhIC8gYXZlKEZyZWN1ZW5jaWEsIFNlY3RvciwgRlVOID0gc3VtKSAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHZqdXN0ID0gMC41KSwNCiAgICAgICAgICAgIHNpemUgPSAzLjUsIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiUHJvcG9yY2nDs24iLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQocGMxLCBwYzIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKCRcY2hpXjIkID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlIHNlY3RvciB5IMOhbWJpdG8gKFYgZGUgQ3JhbcOpciA9IDAuNDcpLiBMYXMgZXNjdWVsYXMgZXN0YXRhbGVzIHNvbiBwcmVkb21pbmFudGVtZW50ZSBydXJhbGVzICg0NSUpLCBtaWVudHJhcyBxdWUgbGFzIHByaXZhZGFzIHNvbiBtYXlvcml0YXJpYW1lbnRlIHVyYmFuYXMgKDg5JSkuIEVzdGEgYXNvY2lhY2nDs24gZXMgcmVsZXZhbnRlIGFsIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zIGFudGVyaW9yZXMsIHlhIHF1ZSBzZWN0b3IgeSDDoW1iaXRvIG5vIHNvbiB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMsIGxvIHF1ZSBkZWJlIGNvbnNpZGVyYXJzZSBhbCBjb21wYXJhciBncnVwb3MuDQoNCi0tLQ0KDQojIDguIENvbmNsdXNpb25lcw0KDQpFbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGRlbCBvcGVyYXRpdm8gQVBSRU5ERVIgMjAyNCBwYXJhIG1hdGVtw6F0aWNhIGVuIGVsIG5pdmVsIHNlY3VuZGFyaW8gcGVybWl0ZSBleHRyYWVyIGxhcyBzaWd1aWVudGVzIGNvbmNsdXNpb25lczoNCg0KKiphLiBTb2JyZSBsYSBjYWxpZGFkIGRlIGxvcyBkYXRvczoqKiBFbCBkYXRhc2V0IG9yaWdpbmFsIGNvbnRpZW5lIHJlZ2lzdHJvcyBjb24gdmFsb3JlcyBgTkFgIHF1ZSBmdWVyb24gZWxpbWluYWRvcywgY29uc2VydmFuZG8gMTA4NyBvYnNlcnZhY2lvbmVzIHbDoWxpZGFzIHBhcmEgZWwgYW7DoWxpc2lzLiBMYXMgdmFyaWFibGVzIHJlcHJlc2VudGFuIHB1bnRhamVzIFRSSSAoZXNjYWxhIGNvbiBtZWRpYSA1MDAgeSBERSAxMDApLCBubyBwb3JjZW50YWplcy4NCg0KKipiLiBTb2JyZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvOioqIE5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgZXZpZGVuY2lhZG8gcG9yIGxvcyBRUS1wbG90cyB5IGVsIHRlc3QgZGUgTGlsbGllZm9ycy4gQW1iYXMgZGlzdHJpYnVjaW9uZXMgcHJlc2VudGFuIHNlc2dvIHBvc2l0aXZvLCBjb24gZ3JhbiBoZXRlcm9nZW5laWRhZCBlbnRyZSBlc2N1ZWxhcy4NCg0KKipjLiBTb2JyZSBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXM6KiogU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHkgZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyAociA9IDAuMjMsIHAgPCAwLjAwMSkuIExhIGJhamEgbWFnbml0dWQgaW5kaWNhIHF1ZSBhbWJhcyB2YXJpYWJsZXMgbm8gc29uIGNvbXBsZW1lbnRhcmlhcyBkaXJlY3RhcyB5IHF1ZSBvdHJvcyBmYWN0b3JlcyBleHBsaWNhbiBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvIGVzY29sYXIuDQoNCioqZC4gSDEg4oCUIFNlY3RvciB5IHB1bnRhamUgU2F0aXNmYWN0b3JpbzoqKiBTZSByZWNoYXphICRIXzAkIChXaWxjb3hvbjogcCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHByaXZhZGFzIHByZXNlbnRhbiB1biBwdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNpZ25pZmljYXRpdmFtZW50ZSBtYXlvciBxdWUgbGFzIGVzdGF0YWxlcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG11eSBncmFuZGUgKGQgPSDiiJIxLjU3KSwgaW5kaWNhbmRvIHF1ZSBsYSBkaWZlcmVuY2lhIGVudHJlIHNlY3RvcmVzIGVzIHN1c3RhbnRpdmEuDQoNCioqZS4gSDIg4oCUIMOBbWJpdG8geSBwdW50YWplIERlYmFqbyBkZWwgYsOhc2ljbzoqKiBTZSByZWNoYXphICRIXzAkIChXZWxjaDogcCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHVyYmFuYXMgcHJlc2VudGFuIHVuIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbyBtYXlvciBxdWUgbGFzIHJ1cmFsZXMsIHJlc3VsdGFkbyBjb250cmFpbnR1aXRpdm8gcXVlIHB1ZWRlIGV4cGxpY2Fyc2UgcG9yIGxhIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIG1hdHLDrWN1bGEgeSBkaXZlcnNpZGFkIHNvY2lvZWNvbsOzbWljYSBlbiBjb250ZXh0b3MgZGUgdnVsbmVyYWJpbGlkYWQgc29jaWFsIGVuIHpvbmFzIHVyYmFuYXMuIEVsIHRhbWHDsW8gZGVsIGVmZWN0byBlcyBtb2RlcmFkbyAoZCA9IOKIkjAuNjUpLg0KDQoqKmYuICRcY2hpXjIkIOKAlCBBc29jaWFjacOzbiBlbnRyZSBTZWN0b3IgeSDDgW1iaXRvOioqIFNlIHJlY2hhemEgJEhfMCQgKCRcY2hpXjIkID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlIHNlY3RvciB5IMOhbWJpdG8gKFYgZGUgQ3JhbcOpciA9IDAuNDcpLiBFc3RhIGFzb2NpYWNpw7NuIGVzIHJlbGV2YW50ZSBhbCBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBhbnRlcmlvcmVzLCB5YSBxdWUgc2VjdG9yIHkgw6FtYml0byBubyBzb24gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLg0KDQotLS0NCg0KIyA5LiBSZWZlcmVuY2lhcw0KDQpEZXZvcmUsIEouIEwuICgyMDA4KS4gKlByb2JhYmlsaWRhZCB5IGVzdGFkw61zdGljYSBwYXJhIGluZ2VuaWVyw61hIHkgY2llbmNpYXMqICg3bWEgZWQuKS4gQ2VuZ2FnZSBMZWFybmluZy4NCg0KUMOpcmV6LCBTLiBOLiAoMjAyNikuICpGdW5kYW1lbnRvcyBkZSBFc3RhZMOtc3RpY2EqIFtEaWFwb3NpdGl2YXNdLiBFc3BlY2lhbGl6YWNpw7NuIGVuIENpZW5jaWEgZGUgRGF0b3MsIFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlbCBPZXN0ZS4NCg0KTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24gQXJnZW50aW5hICgyMDI0KS4gKk9wZXJhdGl2byBOYWNpb25hbCBkZSBFdmFsdWFjacOzbiBBUFJFTkRFUiAyMDI0IOKAlCBSZXN1bHRhZG9zIE1hdGVtw6F0aWNhKi4gQnVlbm9zIEFpcmVzOiBNaW5pc3RlcmlvIGRlIEVkdWNhY2nDs24gZGUgbGEgTmFjacOzbi4NCg0KLS0tDQoNCiMgMTAuIEFuZXhvDQoNCiMjIEFuZXhvIEEg4oCUIEPDs2RpZ28geSBhbsOhbGlzaXMgaW50ZXJhY3Rpdm8NCg0KRWwgY8OzZGlnbyBSIGNvbXBsZXRvIHV0aWxpemFkbyBlbiBlc3RlIHRyYWJham8sIGp1bnRvIGNvbiBsb3MgcmVzdWx0YWRvcyB5IHZpc3VhbGl6YWNpb25lcyBlbiBmb3JtYXRvIGludGVyYWN0aXZvLCBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZSBlbjoNCg0Kw4FybmljYSwgRS4gKDIwMjYpLiAqQW7DoWxpc2lzIEFQUkVOREVSIDIwMjQg4oCUIE1hdGVtw6F0aWNhKiBbUk1hcmtkb3duIHB1YmxpY2FkbyBlbiBSUHVic10uIGh0dHBzOi8vcnB1YnMuY29tL2VkdWFyZG9hcm5pY2EvdHAtYXByZW5kZXIyMDI0DQo=