Miembros del Equipo:
- Juan José Puebla Ruiz.
- Jhon Henry Quishpe Iza.
- Silvia Yáñez Castillo.
- Preng Biba Solares.
Cargamos Librerías
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(ggplot2)
library(lubridate)
Attaching package: ‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
library(fitdistrplus)
Loading required package: MASS
Attaching package: ‘MASS’
The following object is masked from ‘package:dplyr’:
select
Loading required package: survival
Carga de Datos del ONI
dataset<-read.csv("oni.csv", skip = 1)
colnames(dataset)<-c("Date", "Value")
dataset$Date<-as.Date(dataset$Date, format="%Y-%m-%d")
dataset<-dataset %>%
filter(Date <= '2025-02-01')
dataset
Gráfica General del ONI
dataset %>%
filter(Date <= '2025-02-01') %>%
ggplot(aes(x = Date, y = Value, fill = Value >= 0.5)) +
geom_col() +
scale_fill_manual(
values = c("TRUE" = "steelblue", "FALSE" = "pink"),
labels = c("TRUE" = "El Niño", "FALSE" = "La Niña")) +
labs(title = "Índice ONI", y = "Valor ONI", x = "Fecha", fill = "Tipo") +
theme_minimal()

Agregamos Columna para Segmentación por Decada
dataset$Decada<-year(dataset$Date)
head(dataset)
Función para obtener estadísticos y graficar la densidad decada por
decada
graph_and_stats_decade<-function(decada){
# calculo de inicio y final de decada.
min_decada = decada
max_decada = min_decada + 9
# filtro del dataset por decada.
temp_data<-dataset %>%
filter(Decada >= min_decada, Decada <= max_decada)
# gráfica de densidad de decada.
out_graph<- temp_data %>%
ggplot(aes(x=Value, y=after_stat(density))) +
geom_density(color="blue", fill="steelblue", alpha=0.5) +
ylab("Densidad") +
xlab("Valor de ONI") +
ggtitle(paste("Distribución de Datos Decada de los ", decada, "'s", sep="")) +
theme_minimal()
# lista de estadísticos
lista_estadisticos<-list(
media=mean(temp_data$Value),
varianza = var(temp_data$Value),
desvicion = sd(temp_data$Value),
curtosis = kurtosis(temp_data$Value),
sesgo = skewness(temp_data$Value)
)
# lista de salida.
out_list<-list(
estadisticos = lista_estadisticos,
grafica = out_graph
)
return(out_list)
}
Funcion para Estimar la Distribución de Probabilidad del Conjunto de
Datos.
best_fit <- function(decada) {
min_decada <- decada
max_decada <- min_decada + 9
temp_data <- dataset %>%
filter(Decada >= min_decada, Decada <= max_decada)
result <- descdist(temp_data$Value, discrete = FALSE, boot = 1000)
skew <- result$skewness
kurt <- result$kurtosis
dist_candidates <- c()
if (abs(skew) < 0.1 && abs(kurt - 3) < 0.3) {
dist_candidates <- c("norm")
} else if (abs(skew) < 0.5 && kurt < 2.5) {
dist_candidates <- c("unif")
} else if (abs(skew) < 0.5 && kurt > 3.5) {
dist_candidates <- c("t", "logis")
} else if (skew > 0.5 && kurt > 3.5) {
dist_candidates <- c("lnorm", "gamma", "weibull")
} else if (skew < -0.5 && kurt > 3.5) {
dist_candidates <- c("invgauss", "beta")
} else if (skew > 1.5) {
dist_candidates <- c("exp", "chisq")
} else {
dist_candidates <- c("norm", "lnorm", "gamma", "weibull")
}
}
Análisis por Dacada:
A continuación se muestra el análisis por cada una de las décadas
regustradas para datos del ONI, adicionalmente se muestra una
descripción de los hallazgos encontrados para cada caso.
Decada de 1950 a 1960
graph_and_stats_decade(1950)
$estadisticos
$estadisticos$media
[1] 0.05941176
$estadisticos$varianza
[1] 0.5996446
$estadisticos$desvicion
[1] 0.7743672
$estadisticos$curtosis
[1] -0.792538
$estadisticos$sesgo
[1] 0.07154767
$grafica

La forma general es simétrica alrededor de cero, pero presenta
ligeras variaciones hacia los extremos, posiblemente indicando la
presencia de eventos fríos (La Niña) y cálidos (El Niño) bien
diferenciados dentro del mismo periodo.
best_fit(1950)

En el gráfico de Cullen y Frey presentado, el punto rojo (datos
empíricos) se encuentra ubicado cerca de la región de las distribuciones
normal y uniforme, ligeramente más cercano a la normal. Esto sugiere que
la distribución de los datos del ONI durante la década de los 1950s
presenta:
- Baja asimetría (skewness cercana a cero).
- Curtosis moderada (ligeramente mayor que la curtosis de una
distribución normal).
- La dispersión de los puntos de bootstrap (círculos naranjas)
alrededor del punto central también confirma estabilidad y poca
variabilidad en la estimación.
Con base en esta gráfica, una distribución normal sería una muy buena
candidata para modelar los datos de esta década, aunque no se descarta
del todo una distribución logística o incluso una beta en ciertos
ajustes finos.
Década de 1960 a 1970
graph_and_stats_decade(1960)
$estadisticos
$estadisticos$media
[1] 0.2001667
$estadisticos$varianza
[1] 0.412158
$estadisticos$desvicion
[1] 0.6419953
$estadisticos$curtosis
[1] -0.02120938
$estadisticos$sesgo
[1] 0.7539261
$grafica

Se observa una asimetría hacia la derecha (positiva), indicando que
hubo una mayor proporción de valores bajos, pero también la presencia de
algunos valores relativamente altos. La forma general sugiere una
distribución sesgada positivamente y no presenta bimodalidad clara, se
podría hacer alguna aproximación utilzando las distribuciones:
- Log-normal
- Gamma
- O distribuciones de tipo Weibull (en caso de cola alargada)
best_fit(1960)

En esta gráfica de Cullen y Frey, correspondiente a los datos del ONI
de la década de 1960, el punto empírico (rojo) se encuentra más alejado
de la región típica de la distribución normal en comparación con la
década anterior. Se observa:
- Mayor asimetría (skewness positivo), dado que el valor cuadrado del
skewness es mayor que en los 1950s.
- Curtosis moderada-alta, aunque dentro del rango esperado para
distribuciones como gamma o log-normal.
- El patrón de los puntos de bootstrap (círculos naranjas) muestra una
dispersión mayor que en los datos de 1950s, indicando más variabilidad
en las simulaciones.
- Esta posición sugiere que distribuciones sesgadas y con colas más
pesadas, como la gamma o log-normal, serían mejores candidatas para
modelar estos datos.
La distribución normal queda descartada como una buena
aproximación.
Década de 1970 a 1980
graph_and_stats_decade(1970)
$estadisticos
$estadisticos$media
[1] -0.2274167
$estadisticos$varianza
[1] 0.7744059
$estadisticos$desvicion
[1] 0.8800033
$estadisticos$curtosis
[1] -0.214961
$estadisticos$sesgo
[1] 0.3358357
$grafica

La distribución de los valores del Índice Oceánico del Niño (ONI)
para la década de 1970 muestra una bimodalidad clara, con dos picos bien
definidos: uno hacia valores negativos y otro hacia valores positivos.
Esto indica que durante esta década ocurrieron eventos tanto fríos (La
Niña) como cálidos (El Niño) de forma diferenciada, podemos
observar:
- La forma es bastante simétrica alrededor del cero, aunque con colas
ligeramente extendidas.
- Hay mayor dispersión que en décadas anteriores.
- Es posible que una mezcla de normales (modelos de mezcla) o una beta
simétrica pudieran describir mejor este tipo de comportamiento.
Una simple distribución normal podría no capturar completamente la
bimodalidad observada.
best_fit(1970)

En el gráfico de Cullen y Frey para los datos del ONI de la década de
1970, el punto empírico (rojo) se encuentra muy cercano a la región de
la distribución normal, ligeramente desviado hacia curtosis algo mayor
que la normal teórica, se observa:
- Muy baja asimetría (skewness cercano a cero).
- Curtosis ligeramente mayor que la de una distribución normal.
- La dispersión de los puntos de bootstrap es muy reducida, lo que
indica alta estabilidad en la estimación de la forma de la distribución.
A unque visualmente en la gráfica de densidad (que vimos antes)
observamos una bimodalidad ligera, esta gráfica sugiere que,
estadísticamente, una distribución normal sigue siendo un modelo
razonablemente adecuado para esta década, pero no explica del todo la
bimodalidad.
Una mezcla de normales podría todavía ser una opción mejor si se
busca capturar completamente esa forma observada.
Década de 1980 a 1990
graph_and_stats_decade(1980)
$estadisticos
$estadisticos$media
[1] 0.0465
$estadisticos$varianza
[1] 0.8116482
$estadisticos$desvicion
[1] 0.9009152
$estadisticos$curtosis
[1] -0.3014468
$estadisticos$sesgo
[1] 0.4226644
$grafica

best_fit(1980)

La distribución de los valores del Índice Oceánico del Niño (ONI)
para la década de 1980 muestra una forma asimétrica hacia la derecha
(asimetría positiva), se observa:
- El pico de densidad está desplazado hacia valores ligeramente
negativos.
- Se observa una cola más larga en el extremo positivo, indicando
eventos con mayores valores de ONI (eventos cálidos más intensos).
- No presenta bimodalidad clara, pero la caída hacia valores positivos
es más lenta que hacia los negativos.
Con esta forma, las distribuciones candidatas más probables
serían:
- Log-normal (por la asimetría positiva y cola larga).
- Gamma.
- Weibull también podría ser una opción si se confirma la forma en la
gráfica de Cullen y Frey.
La distribución normal queda descartada debido a la asimetría
evidente.
Década de 1990 a 2000
graph_and_stats_decade(1990)
$estadisticos
$estadisticos$media
[1] 0.1648333
$estadisticos$varianza
[1] 0.851689
$estadisticos$desvicion
[1] 0.92287
$estadisticos$curtosis
[1] -0.1637131
$estadisticos$sesgo
[1] 0.2249154
$grafica

La distribución de los valores del Índice Oceánico del Niño (ONI)
para la década de 1990 muestra una forma claramente bimodal, con dos
picos bien diferenciados:
- Uno cerca de valores negativos (alrededor de -1).
- Otro más marcado en valores positivos (cercanos a 0.5 a 1).
Esto indica la presencia de eventos fríos (La Niña) y eventos cálidos
(El Niño) intensos y diferenciados durante esta década. Adicionalmente
notamos:
- La distribución no es simétrica.
- Existe una asimetría positiva moderada (cola más larga hacia valores
altos de ONI).
- Dada esta forma, distribuciones simples como la normal quedarían
descartadas.
Podrían considerarse modelos de mezcla de distribuciones (por
ejemplo, mezcla de normales) para capturar adecuadamente la bimodalidad
observada.
best_fit(1990)

En el gráfico de Cullen y Frey para los datos del ONI de la década de
1990, el punto empírico (rojo) se encuentra muy cerca de la región
correspondiente a la distribución normal, con características
importantes:
- Asimetría prácticamente nula (skewness muy cercano a 0).
- Curtosis ligeramente superior a la normal estándar, pero muy
cerca.
- Los puntos de bootstrap están muy agrupados, indicando alta
estabilidad en las estimaciones.
A pesar de que la distribución de densidad mostraba bimodalidad
visual (en la gráfica anterior), este análisis estadístico sugiere que
en términos globales, la distribución del ONI para esta década se
comporta casi como una normal.
Década de 2000 a 2010
graph_and_stats_decade(2000)
$estadisticos
$estadisticos$media
[1] -0.08108333
$estadisticos$varianza
[1] 0.4851492
$estadisticos$desvicion
[1] 0.6965266
$estadisticos$curtosis
[1] -0.4202584
$estadisticos$sesgo
[1] -0.09229351
$grafica

La distribución de los valores del Índice Oceánico del Niño (ONI)
para la década de 2000 muestra una forma asimétrica hacia la derecha
(asimetría positiva), pero menos pronunciada que en décadas anteriores,
se observa:
- Hay un pico único bien definido alrededor de 0, sin evidencia clara
de bimodalidad.
- Se percibe una cola alargada hacia valores positivos, indicando
algunos eventos cálidos más intensos.
- La densidad disminuye más lentamente hacia valores positivos que
hacia los negativos.
Debido a esta forma:
- Una distribución log-normal o gamma serían buenas candidatas para
modelar los datos.
- La distribución normal sería una aproximación razonable si se acepta
una ligera asimetría, pero no capturaría perfectamente la cola
extendida.
best_fit(2000)

En el gráfico de Cullen y Frey para los datos del ONI de la década de
2000, el punto empírico (rojo) se encuentra muy cercano a la región de
la distribución normal, con ligeros desplazamientos:
- Asimetría muy baja (skewness casi nulo).
- Curtosis apenas por encima de la esperada para una normal
teórica.
- Los puntos de bootstrap se encuentran muy concentrados alrededor del
punto central, lo que sugiere alta estabilidad estadística en las
estimaciones.
Aunque en la gráfica de densidad observamos una ligera asimetría y
una caída más lenta hacia valores positivos, este análisis sugiere que,
estadísticamente, la distribución del ONI en los 2000s se comporta
bastante parecido a una normal.
Década 2010 a 2020
graph_and_stats_decade(2010)
$estadisticos
$estadisticos$media
[1] 0.03883333
$estadisticos$varianza
[1] 0.7881869
$estadisticos$desvicion
[1] 0.8877989
$estadisticos$curtosis
[1] 0.7964092
$estadisticos$sesgo
[1] 0.7670057
$grafica

La distribución de los valores del Índice Oceánico del Niño (ONI)
para la década de 2010 muestra una asimetría positiva moderada, con
características muy interesantes:
- Pico principal en valores ligeramente negativos (cercanos a
-0.5).
- Cola larga hacia valores positivos, extendiéndose hasta alrededor de
2.
Hay un pequeño segundo aumento en la densidad cerca de 2, aunque
mucho menos pronunciado que el pico principal (podría interpretarse como
una ligera bimodalidad), se puede observar:
- El comportamiento sugiere que no es completamente simétrica.
- Distribuciones candidatas: log-normal, gamma o una posible mezcla de
normales si se desea capturar el pequeño segundo aumento en valores
altos.
La distribución normal sería una mala elección por la evidente
asimetría y cola larga.
best_fit(2010)

En el gráfico de Cullen y Frey correspondiente a los datos del ONI de
la década de 2010, el punto empírico (rojo) se ubica más alejado de la
normalidad en comparación con décadas anteriores, se observa:
- Asimetría positiva moderada (el square of skewness es mayor que
0).
- Curtosis más elevada en comparación a una distribución normal,
acercándose hacia regiones de distribuciones como la gamma o la
log-normal.
- Los puntos de bootstrap (naranjas) están más dispersos que en
décadas anteriores, indicando mayor variabilidad en la forma de los
datos.
La asimetría positiva y la presencia de colas largas hacen que la
normal no sea una buena opción. Distribuciones log-normal o gamma serían
las más adecuadas para modelar los datos de esta década.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyMgTWllbWJyb3MgZGVsIEVxdWlwbzoKLSBKdWFuIEpvc8OpIFB1ZWJsYSBSdWl6LgotIEpob24gSGVucnkgUXVpc2hwZSBJemEuCi0gU2lsdmlhIFnDocOxZXogQ2FzdGlsbG8uCi0gUHJlbmcgQmliYSBTb2xhcmVzLgoKCiMgQ2FyZ2Ftb3MgTGlicmVyw61hcwpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZml0ZGlzdHJwbHVzKQpsaWJyYXJ5KGUxMDcxKQpgYGAKCiMgQ2FyZ2EgZGUgRGF0b3MgZGVsIE9OSQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGFzZXQ8LXJlYWQuY3N2KCJvbmkuY3N2Iiwgc2tpcCA9IDEpCmNvbG5hbWVzKGRhdGFzZXQpPC1jKCJEYXRlIiwgIlZhbHVlIikKZGF0YXNldCREYXRlPC1hcy5EYXRlKGRhdGFzZXQkRGF0ZSwgZm9ybWF0PSIlWS0lbS0lZCIpCgpkYXRhc2V0PC1kYXRhc2V0ICU+JQogIGZpbHRlcihEYXRlIDw9ICcyMDI1LTAyLTAxJykKCmRhdGFzZXQKYGBgCgojIEdyw6FmaWNhIEdlbmVyYWwgZGVsIE9OSQpgYGB7cn0KZGF0YXNldCAlPiUKICBmaWx0ZXIoRGF0ZSA8PSAnMjAyNS0wMi0wMScpICU+JSAKZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IFZhbHVlLCBmaWxsID0gVmFsdWUgPj0gMC41KSkgKwogIGdlb21fY29sKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKAogICAgdmFsdWVzID0gYygiVFJVRSIgPSAic3RlZWxibHVlIiwgIkZBTFNFIiA9ICJwaW5rIiksCiAgICBsYWJlbHMgPSBjKCJUUlVFIiA9ICJFbCBOacOxbyIsICJGQUxTRSIgPSAiTGEgTmnDsWEiKSkgKwogIGxhYnModGl0bGUgPSAiw41uZGljZSBPTkkiLCB5ID0gIlZhbG9yIE9OSSIsIHggPSAiRmVjaGEiLCBmaWxsID0gIlRpcG8iKSArCnRoZW1lX21pbmltYWwoKQpgYGAKIyBBZ3JlZ2Ftb3MgQ29sdW1uYSBwYXJhIFNlZ21lbnRhY2nDs24gcG9yIERlY2FkYQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdGFzZXQkRGVjYWRhPC15ZWFyKGRhdGFzZXQkRGF0ZSkKaGVhZChkYXRhc2V0KQpgYGAKCiMgRnVuY2nDs24gcGFyYSBvYnRlbmVyIGVzdGFkw61zdGljb3MgeSBncmFmaWNhciBsYSBkZW5zaWRhZCBkZWNhZGEgcG9yIGRlY2FkYQpgYGB7ciBlY2hvPVRSVUV9CmdyYXBoX2FuZF9zdGF0c19kZWNhZGU8LWZ1bmN0aW9uKGRlY2FkYSl7CiAgCiAgIyBjYWxjdWxvIGRlIGluaWNpbyB5IGZpbmFsIGRlIGRlY2FkYS4KICBtaW5fZGVjYWRhID0gZGVjYWRhCiAgbWF4X2RlY2FkYSA9IG1pbl9kZWNhZGEgKyA5CiAgCiAgIyBmaWx0cm8gZGVsIGRhdGFzZXQgcG9yIGRlY2FkYS4KICB0ZW1wX2RhdGE8LWRhdGFzZXQgJT4lCiAgICBmaWx0ZXIoRGVjYWRhID49IG1pbl9kZWNhZGEsIERlY2FkYSA8PSBtYXhfZGVjYWRhKQogIAogICMgZ3LDoWZpY2EgZGUgZGVuc2lkYWQgZGUgZGVjYWRhLgogIG91dF9ncmFwaDwtIHRlbXBfZGF0YSAlPiUKICAgIGdncGxvdChhZXMoeD1WYWx1ZSwgeT1hZnRlcl9zdGF0KGRlbnNpdHkpKSkgKwogICAgZ2VvbV9kZW5zaXR5KGNvbG9yPSJibHVlIiwgZmlsbD0ic3RlZWxibHVlIiwgYWxwaGE9MC41KSArCiAgICB5bGFiKCJEZW5zaWRhZCIpICsKICAgIHhsYWIoIlZhbG9yIGRlIE9OSSIpICsKICAgIGdndGl0bGUocGFzdGUoIkRpc3RyaWJ1Y2nDs24gZGUgRGF0b3MgRGVjYWRhIGRlIGxvcyAiLCBkZWNhZGEsICIncyIsIHNlcD0iIikpICsKICAgIHRoZW1lX21pbmltYWwoKQogIAogICMgbGlzdGEgZGUgZXN0YWTDrXN0aWNvcwogIGxpc3RhX2VzdGFkaXN0aWNvczwtbGlzdCgKICAgIG1lZGlhPW1lYW4odGVtcF9kYXRhJFZhbHVlKSwKICAgIHZhcmlhbnphID0gdmFyKHRlbXBfZGF0YSRWYWx1ZSksCiAgICBkZXN2aWNpb24gPSBzZCh0ZW1wX2RhdGEkVmFsdWUpLAogICAgY3VydG9zaXMgPSBrdXJ0b3Npcyh0ZW1wX2RhdGEkVmFsdWUpLAogICAgc2VzZ28gPSBza2V3bmVzcyh0ZW1wX2RhdGEkVmFsdWUpCiAgKQogIAogICMgbGlzdGEgZGUgc2FsaWRhLgogIG91dF9saXN0PC1saXN0KAogICAgZXN0YWRpc3RpY29zID0gbGlzdGFfZXN0YWRpc3RpY29zLAogICAgZ3JhZmljYSA9IG91dF9ncmFwaAogICkKICAKICByZXR1cm4ob3V0X2xpc3QpCn0KYGBgCgoKIyBGdW5jaW9uIHBhcmEgRXN0aW1hciBsYSBEaXN0cmlidWNpw7NuIGRlIFByb2JhYmlsaWRhZCBkZWwgQ29uanVudG8gZGUgRGF0b3MuCmBgYHtyIGVjaG89VFJVRX0KYmVzdF9maXQgPC0gZnVuY3Rpb24oZGVjYWRhKSB7CiAgCiAgbWluX2RlY2FkYSA8LSBkZWNhZGEKICBtYXhfZGVjYWRhIDwtIG1pbl9kZWNhZGEgKyA5CiAgCiAgdGVtcF9kYXRhIDwtIGRhdGFzZXQgJT4lCiAgICBmaWx0ZXIoRGVjYWRhID49IG1pbl9kZWNhZGEsIERlY2FkYSA8PSBtYXhfZGVjYWRhKQogIAogIHJlc3VsdCA8LSBkZXNjZGlzdCh0ZW1wX2RhdGEkVmFsdWUsIGRpc2NyZXRlID0gRkFMU0UsIGJvb3QgPSAxMDAwKQogIHNrZXcgPC0gcmVzdWx0JHNrZXduZXNzCiAga3VydCA8LSByZXN1bHQka3VydG9zaXMKICAKICBkaXN0X2NhbmRpZGF0ZXMgPC0gYygpCiAgCiAgaWYgKGFicyhza2V3KSA8IDAuMSAmJiBhYnMoa3VydCAtIDMpIDwgMC4zKSB7CiAgICBkaXN0X2NhbmRpZGF0ZXMgPC0gYygibm9ybSIpCiAgfSBlbHNlIGlmIChhYnMoc2tldykgPCAwLjUgJiYga3VydCA8IDIuNSkgewogICAgZGlzdF9jYW5kaWRhdGVzIDwtIGMoInVuaWYiKQogIH0gZWxzZSBpZiAoYWJzKHNrZXcpIDwgMC41ICYmIGt1cnQgPiAzLjUpIHsKICAgIGRpc3RfY2FuZGlkYXRlcyA8LSBjKCJ0IiwgImxvZ2lzIikKICB9IGVsc2UgaWYgKHNrZXcgPiAwLjUgJiYga3VydCA+IDMuNSkgewogICAgZGlzdF9jYW5kaWRhdGVzIDwtIGMoImxub3JtIiwgImdhbW1hIiwgIndlaWJ1bGwiKQogIH0gZWxzZSBpZiAoc2tldyA8IC0wLjUgJiYga3VydCA+IDMuNSkgewogICAgZGlzdF9jYW5kaWRhdGVzIDwtIGMoImludmdhdXNzIiwgImJldGEiKQogIH0gZWxzZSBpZiAoc2tldyA+IDEuNSkgewogICAgZGlzdF9jYW5kaWRhdGVzIDwtIGMoImV4cCIsICJjaGlzcSIpCiAgfSBlbHNlIHsKICAgIGRpc3RfY2FuZGlkYXRlcyA8LSBjKCJub3JtIiwgImxub3JtIiwgImdhbW1hIiwgIndlaWJ1bGwiKQogIH0KfQpgYGAKCgojIEFuw6FsaXNpcyBwb3IgRGFjYWRhOgoKQSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmEgZWwgYW7DoWxpc2lzIHBvciBjYWRhIHVuYSBkZSBsYXMgZMOpY2FkYXMgcmVndXN0cmFkYXMgcGFyYSBkYXRvcyBkZWwgT05JLCBhZGljaW9uYWxtZW50ZSBzZSBtdWVzdHJhIHVuYSBkZXNjcmlwY2nDs24gZGUgbG9zIGhhbGxhemdvcyBlbmNvbnRyYWRvcyBwYXJhIGNhZGEgY2Fzby4KCiMjIERlY2FkYSBkZSAxOTUwIGEgMTk2MAoKYGBge3IgZWNobz1UUlVFfQpncmFwaF9hbmRfc3RhdHNfZGVjYWRlKDE5NTApCmBgYAoKTGEgZm9ybWEgZ2VuZXJhbCBlcyBzaW3DqXRyaWNhIGFscmVkZWRvciBkZSBjZXJvLCBwZXJvIHByZXNlbnRhIGxpZ2VyYXMgdmFyaWFjaW9uZXMgaGFjaWEgbG9zIGV4dHJlbW9zLCBwb3NpYmxlbWVudGUgaW5kaWNhbmRvIGxhIHByZXNlbmNpYSBkZSBldmVudG9zIGZyw61vcyAoTGEgTmnDsWEpIHkgY8OhbGlkb3MgKEVsIE5pw7FvKSBiaWVuIGRpZmVyZW5jaWFkb3MgZGVudHJvIGRlbCBtaXNtbyBwZXJpb2RvLgoKYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQpiZXN0X2ZpdCgxOTUwKQpgYGAKCkVuIGVsIGdyw6FmaWNvIGRlIEN1bGxlbiB5IEZyZXkgcHJlc2VudGFkbywgZWwgcHVudG8gcm9qbyAoZGF0b3MgZW1ww61yaWNvcykgc2UgZW5jdWVudHJhIHViaWNhZG8gY2VyY2EgZGUgbGEgcmVnacOzbiBkZSBsYXMgZGlzdHJpYnVjaW9uZXMgbm9ybWFsIHkgdW5pZm9ybWUsIGxpZ2VyYW1lbnRlIG3DoXMgY2VyY2FubyBhIGxhIG5vcm1hbC4KRXN0byBzdWdpZXJlIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBkYXRvcyBkZWwgT05JIGR1cmFudGUgbGEgZMOpY2FkYSBkZSBsb3MgMTk1MHMgcHJlc2VudGE6CgoqIEJhamEgYXNpbWV0csOtYSAoc2tld25lc3MgY2VyY2FuYSBhIGNlcm8pLgoqIEN1cnRvc2lzIG1vZGVyYWRhIChsaWdlcmFtZW50ZSBtYXlvciBxdWUgbGEgY3VydG9zaXMgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsKS4KKiBMYSBkaXNwZXJzacOzbiBkZSBsb3MgcHVudG9zIGRlIGJvb3RzdHJhcCAoY8OtcmN1bG9zIG5hcmFuamFzKSBhbHJlZGVkb3IgZGVsIHB1bnRvIGNlbnRyYWwgdGFtYmnDqW4gY29uZmlybWEgZXN0YWJpbGlkYWQgeSBwb2NhIHZhcmlhYmlsaWRhZCBlbiBsYSBlc3RpbWFjacOzbi4KCkNvbiBiYXNlIGVuIGVzdGEgZ3LDoWZpY2EsIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBzZXLDrWEgdW5hIG11eSBidWVuYSBjYW5kaWRhdGEgcGFyYSBtb2RlbGFyIGxvcyBkYXRvcyBkZSBlc3RhIGTDqWNhZGEsIGF1bnF1ZSBubyBzZSBkZXNjYXJ0YSBkZWwgdG9kbyB1bmEgZGlzdHJpYnVjacOzbiBsb2fDrXN0aWNhIG8gaW5jbHVzbyB1bmEgYmV0YSBlbiBjaWVydG9zIGFqdXN0ZXMgZmlub3MuCgojIETDqWNhZGEgZGUgMTk2MCBhIDE5NzAKYGBge3IgZWNobz1UUlVFfQpncmFwaF9hbmRfc3RhdHNfZGVjYWRlKDE5NjApCmBgYAoKClNlIG9ic2VydmEgdW5hIGFzaW1ldHLDrWEgaGFjaWEgbGEgZGVyZWNoYSAocG9zaXRpdmEpLCBpbmRpY2FuZG8gcXVlIGh1Ym8gdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIHZhbG9yZXMgYmFqb3MsIHBlcm8gdGFtYmnDqW4gbGEgcHJlc2VuY2lhIGRlIGFsZ3Vub3MgdmFsb3JlcyByZWxhdGl2YW1lbnRlIGFsdG9zLiBMYSBmb3JtYSBnZW5lcmFsIHN1Z2llcmUgdW5hIGRpc3RyaWJ1Y2nDs24gc2VzZ2FkYSBwb3NpdGl2YW1lbnRlIHkgbm8gcHJlc2VudGEgYmltb2RhbGlkYWQgY2xhcmEsIHNlIHBvZHLDrWEgaGFjZXIgYWxndW5hIGFwcm94aW1hY2nDs24gdXRpbHphbmRvIGxhcyBkaXN0cmlidWNpb25lczoKCiogTG9nLW5vcm1hbAoqIEdhbW1hCiogTyBkaXN0cmlidWNpb25lcyBkZSB0aXBvIFdlaWJ1bGwgKGVuIGNhc28gZGUgY29sYSBhbGFyZ2FkYSkKCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmVzdF9maXQoMTk2MCkKYGBgCkVuIGVzdGEgZ3LDoWZpY2EgZGUgQ3VsbGVuIHkgRnJleSwgY29ycmVzcG9uZGllbnRlIGEgbG9zIGRhdG9zIGRlbCBPTkkgZGUgbGEgZMOpY2FkYSBkZSAxOTYwLCBlbCBwdW50byBlbXDDrXJpY28gKHJvam8pIHNlIGVuY3VlbnRyYSBtw6FzIGFsZWphZG8gZGUgbGEgcmVnacOzbiB0w61waWNhIGRlIGxhIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGVuIGNvbXBhcmFjacOzbiBjb24gbGEgZMOpY2FkYSBhbnRlcmlvci4KU2Ugb2JzZXJ2YToKCiogTWF5b3IgYXNpbWV0csOtYSAoc2tld25lc3MgcG9zaXRpdm8pLCBkYWRvIHF1ZSBlbCB2YWxvciBjdWFkcmFkbyBkZWwgc2tld25lc3MgZXMgbWF5b3IgcXVlIGVuIGxvcyAxOTUwcy4KKiBDdXJ0b3NpcyBtb2RlcmFkYS1hbHRhLCBhdW5xdWUgZGVudHJvIGRlbCByYW5nbyBlc3BlcmFkbyBwYXJhIGRpc3RyaWJ1Y2lvbmVzIGNvbW8gZ2FtbWEgbyBsb2ctbm9ybWFsLgoqIEVsIHBhdHLDs24gZGUgbG9zIHB1bnRvcyBkZSBib290c3RyYXAgKGPDrXJjdWxvcyBuYXJhbmphcykgbXVlc3RyYSB1bmEgZGlzcGVyc2nDs24gbWF5b3IgcXVlIGVuIGxvcyBkYXRvcyBkZSAxOTUwcywgaW5kaWNhbmRvIG3DoXMgdmFyaWFiaWxpZGFkIGVuIGxhcyBzaW11bGFjaW9uZXMuCiogRXN0YSBwb3NpY2nDs24gc3VnaWVyZSBxdWUgZGlzdHJpYnVjaW9uZXMgc2VzZ2FkYXMgeSBjb24gY29sYXMgbcOhcyBwZXNhZGFzLCBjb21vIGxhIGdhbW1hIG8gbG9nLW5vcm1hbCwgc2Vyw61hbiBtZWpvcmVzIGNhbmRpZGF0YXMgcGFyYSBtb2RlbGFyIGVzdG9zIGRhdG9zLgoKTGEgZGlzdHJpYnVjacOzbiBub3JtYWwgcXVlZGEgZGVzY2FydGFkYSBjb21vIHVuYSBidWVuYSBhcHJveGltYWNpw7NuLgoKIyBEw6ljYWRhIGRlIDE5NzAgYSAxOTgwCgpgYGB7ciBlY2hvPVRSVUV9CmdyYXBoX2FuZF9zdGF0c19kZWNhZGUoMTk3MCkKYGBgCgoKTGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgdmFsb3JlcyBkZWwgw41uZGljZSBPY2XDoW5pY28gZGVsIE5pw7FvIChPTkkpIHBhcmEgbGEgZMOpY2FkYSBkZSAxOTcwIG11ZXN0cmEgdW5hIGJpbW9kYWxpZGFkIGNsYXJhLCBjb24gZG9zIHBpY29zIGJpZW4gZGVmaW5pZG9zOiB1bm8gaGFjaWEgdmFsb3JlcyBuZWdhdGl2b3MgeSBvdHJvIGhhY2lhIHZhbG9yZXMgcG9zaXRpdm9zLgpFc3RvIGluZGljYSBxdWUgZHVyYW50ZSBlc3RhIGTDqWNhZGEgb2N1cnJpZXJvbiBldmVudG9zIHRhbnRvIGZyw61vcyAoTGEgTmnDsWEpIGNvbW8gY8OhbGlkb3MgKEVsIE5pw7FvKSBkZSBmb3JtYSBkaWZlcmVuY2lhZGEsIHBvZGVtb3Mgb2JzZXJ2YXI6CgoqIExhIGZvcm1hIGVzIGJhc3RhbnRlIHNpbcOpdHJpY2EgYWxyZWRlZG9yIGRlbCBjZXJvLCBhdW5xdWUgY29uIGNvbGFzIGxpZ2VyYW1lbnRlIGV4dGVuZGlkYXMuCiogSGF5IG1heW9yIGRpc3BlcnNpw7NuIHF1ZSBlbiBkw6ljYWRhcyBhbnRlcmlvcmVzLgoqIEVzIHBvc2libGUgcXVlIHVuYSBtZXpjbGEgZGUgbm9ybWFsZXMgKG1vZGVsb3MgZGUgbWV6Y2xhKSBvIHVuYSBiZXRhIHNpbcOpdHJpY2EgcHVkaWVyYW4gZGVzY3JpYmlyIG1lam9yIGVzdGUgdGlwbyBkZSBjb21wb3J0YW1pZW50by4KClVuYSBzaW1wbGUgZGlzdHJpYnVjacOzbiBub3JtYWwgcG9kcsOtYSBubyBjYXB0dXJhciBjb21wbGV0YW1lbnRlIGxhIGJpbW9kYWxpZGFkIG9ic2VydmFkYS4KCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJlc3RfZml0KDE5NzApCmBgYApFbiBlbCBncsOhZmljbyBkZSBDdWxsZW4geSBGcmV5IHBhcmEgbG9zIGRhdG9zIGRlbCBPTkkgZGUgbGEgZMOpY2FkYSBkZSAxOTcwLCBlbCBwdW50byBlbXDDrXJpY28gKHJvam8pIHNlIGVuY3VlbnRyYSBtdXkgY2VyY2FubyBhIGxhIHJlZ2nDs24gZGUgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGxpZ2VyYW1lbnRlIGRlc3ZpYWRvIGhhY2lhIGN1cnRvc2lzIGFsZ28gbWF5b3IgcXVlIGxhIG5vcm1hbCB0ZcOzcmljYSwgc2Ugb2JzZXJ2YToKCiogTXV5IGJhamEgYXNpbWV0csOtYSAoc2tld25lc3MgY2VyY2FubyBhIGNlcm8pLgoqIEN1cnRvc2lzIGxpZ2VyYW1lbnRlIG1heW9yIHF1ZSBsYSBkZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuCiogTGEgZGlzcGVyc2nDs24gZGUgbG9zIHB1bnRvcyBkZSBib290c3RyYXAgZXMgbXV5IHJlZHVjaWRhLCBsbyBxdWUgaW5kaWNhIGFsdGEgZXN0YWJpbGlkYWQgZW4gbGEgZXN0aW1hY2nDs24gZGUgbGEgZm9ybWEgZGUgbGEgZGlzdHJpYnVjacOzbi4KQQp1bnF1ZSB2aXN1YWxtZW50ZSBlbiBsYSBncsOhZmljYSBkZSBkZW5zaWRhZCAocXVlIHZpbW9zIGFudGVzKSBvYnNlcnZhbW9zIHVuYSBiaW1vZGFsaWRhZCBsaWdlcmEsIGVzdGEgZ3LDoWZpY2Egc3VnaWVyZSBxdWUsIGVzdGFkw61zdGljYW1lbnRlLCB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgc2lndWUgc2llbmRvIHVuIG1vZGVsbyByYXpvbmFibGVtZW50ZSBhZGVjdWFkbyBwYXJhIGVzdGEgZMOpY2FkYSwgcGVybyBubyBleHBsaWNhIGRlbCB0b2RvIGxhIGJpbW9kYWxpZGFkLgoKVW5hIG1lemNsYSBkZSBub3JtYWxlcyBwb2Ryw61hIHRvZGF2w61hIHNlciB1bmEgb3BjacOzbiBtZWpvciBzaSBzZSBidXNjYSBjYXB0dXJhciBjb21wbGV0YW1lbnRlIGVzYSBmb3JtYSBvYnNlcnZhZGEuCgojIETDqWNhZGEgZGUgMTk4MCBhIDE5OTAKYGBge3IgZWNobz1UUlVFfQpncmFwaF9hbmRfc3RhdHNfZGVjYWRlKDE5ODApCmBgYAoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiZXN0X2ZpdCgxOTgwKQpgYGAKTGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgdmFsb3JlcyBkZWwgw41uZGljZSBPY2XDoW5pY28gZGVsIE5pw7FvIChPTkkpIHBhcmEgbGEgZMOpY2FkYSBkZSAxOTgwIG11ZXN0cmEgdW5hIGZvcm1hIGFzaW3DqXRyaWNhIGhhY2lhIGxhIGRlcmVjaGEgKGFzaW1ldHLDrWEgcG9zaXRpdmEpLCBzZSBvYnNlcnZhOgoKKiBFbCBwaWNvIGRlIGRlbnNpZGFkIGVzdMOhIGRlc3BsYXphZG8gaGFjaWEgdmFsb3JlcyBsaWdlcmFtZW50ZSBuZWdhdGl2b3MuCiogU2Ugb2JzZXJ2YSB1bmEgY29sYSBtw6FzIGxhcmdhIGVuIGVsIGV4dHJlbW8gcG9zaXRpdm8sIGluZGljYW5kbyBldmVudG9zIGNvbiBtYXlvcmVzIHZhbG9yZXMgZGUgT05JIChldmVudG9zIGPDoWxpZG9zIG3DoXMgaW50ZW5zb3MpLgoqIE5vIHByZXNlbnRhIGJpbW9kYWxpZGFkIGNsYXJhLCBwZXJvIGxhIGNhw61kYSBoYWNpYSB2YWxvcmVzIHBvc2l0aXZvcyBlcyBtw6FzIGxlbnRhIHF1ZSBoYWNpYSBsb3MgbmVnYXRpdm9zLgoKQ29uIGVzdGEgZm9ybWEsIGxhcyBkaXN0cmlidWNpb25lcyBjYW5kaWRhdGFzIG3DoXMgcHJvYmFibGVzIHNlcsOtYW46CgoqIExvZy1ub3JtYWwgKHBvciBsYSBhc2ltZXRyw61hIHBvc2l0aXZhIHkgY29sYSBsYXJnYSkuCiogR2FtbWEuCiogV2VpYnVsbCB0YW1iacOpbiBwb2Ryw61hIHNlciB1bmEgb3BjacOzbiBzaSBzZSBjb25maXJtYSBsYSBmb3JtYSBlbiBsYSBncsOhZmljYSBkZSBDdWxsZW4geSBGcmV5LgoKTGEgZGlzdHJpYnVjacOzbiBub3JtYWwgcXVlZGEgZGVzY2FydGFkYSBkZWJpZG8gYSBsYSBhc2ltZXRyw61hIGV2aWRlbnRlLgoKIyBEw6ljYWRhIGRlIDE5OTAgYSAyMDAwCmBgYHtyIGVjaG89VFJVRX0KZ3JhcGhfYW5kX3N0YXRzX2RlY2FkZSgxOTkwKQpgYGAKCkxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHZhbG9yZXMgZGVsIMONbmRpY2UgT2Nlw6FuaWNvIGRlbCBOacOxbyAoT05JKSBwYXJhIGxhIGTDqWNhZGEgZGUgMTk5MCBtdWVzdHJhIHVuYSBmb3JtYSBjbGFyYW1lbnRlIGJpbW9kYWwsIGNvbiBkb3MgcGljb3MgYmllbiBkaWZlcmVuY2lhZG9zOgoKKiBVbm8gY2VyY2EgZGUgdmFsb3JlcyBuZWdhdGl2b3MgKGFscmVkZWRvciBkZSAtMSkuCiogT3RybyBtw6FzIG1hcmNhZG8gZW4gdmFsb3JlcyBwb3NpdGl2b3MgKGNlcmNhbm9zIGEgMC41IGEgMSkuCgpFc3RvIGluZGljYSBsYSBwcmVzZW5jaWEgZGUgZXZlbnRvcyBmcsOtb3MgKExhIE5pw7FhKSB5IGV2ZW50b3MgY8OhbGlkb3MgKEVsIE5pw7FvKSBpbnRlbnNvcyB5IGRpZmVyZW5jaWFkb3MgZHVyYW50ZSBlc3RhIGTDqWNhZGEuIEFkaWNpb25hbG1lbnRlIG5vdGFtb3M6CgoqIExhIGRpc3RyaWJ1Y2nDs24gbm8gZXMgc2ltw6l0cmljYS4KKiBFeGlzdGUgdW5hIGFzaW1ldHLDrWEgcG9zaXRpdmEgbW9kZXJhZGEgKGNvbGEgbcOhcyBsYXJnYSBoYWNpYSB2YWxvcmVzIGFsdG9zIGRlIE9OSSkuCiogRGFkYSBlc3RhIGZvcm1hLCBkaXN0cmlidWNpb25lcyBzaW1wbGVzIGNvbW8gbGEgbm9ybWFsIHF1ZWRhcsOtYW4gZGVzY2FydGFkYXMuCgpQb2Ryw61hbiBjb25zaWRlcmFyc2UgbW9kZWxvcyBkZSBtZXpjbGEgZGUgZGlzdHJpYnVjaW9uZXMgKHBvciBlamVtcGxvLCBtZXpjbGEgZGUgbm9ybWFsZXMpIHBhcmEgY2FwdHVyYXIgYWRlY3VhZGFtZW50ZSBsYSBiaW1vZGFsaWRhZCBvYnNlcnZhZGEuCgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJlc3RfZml0KDE5OTApCmBgYAoKRW4gZWwgZ3LDoWZpY28gZGUgQ3VsbGVuIHkgRnJleSBwYXJhIGxvcyBkYXRvcyBkZWwgT05JIGRlIGxhIGTDqWNhZGEgZGUgMTk5MCwgZWwgcHVudG8gZW1ww61yaWNvIChyb2pvKSBzZSBlbmN1ZW50cmEgbXV5IGNlcmNhIGRlIGxhIHJlZ2nDs24gY29ycmVzcG9uZGllbnRlIGEgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGNvbiBjYXJhY3RlcsOtc3RpY2FzIGltcG9ydGFudGVzOgoKKiBBc2ltZXRyw61hIHByw6FjdGljYW1lbnRlIG51bGEgKHNrZXduZXNzIG11eSBjZXJjYW5vIGEgMCkuCiogQ3VydG9zaXMgbGlnZXJhbWVudGUgc3VwZXJpb3IgYSBsYSBub3JtYWwgZXN0w6FuZGFyLCBwZXJvIG11eSBjZXJjYS4KKiBMb3MgcHVudG9zIGRlIGJvb3RzdHJhcCBlc3TDoW4gbXV5IGFncnVwYWRvcywgaW5kaWNhbmRvIGFsdGEgZXN0YWJpbGlkYWQgZW4gbGFzIGVzdGltYWNpb25lcy4KCkEgcGVzYXIgZGUgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZGVuc2lkYWQgbW9zdHJhYmEgYmltb2RhbGlkYWQgdmlzdWFsIChlbiBsYSBncsOhZmljYSBhbnRlcmlvciksIGVzdGUgYW7DoWxpc2lzIGVzdGFkw61zdGljbyBzdWdpZXJlIHF1ZSBlbiB0w6lybWlub3MgZ2xvYmFsZXMsIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIE9OSSBwYXJhIGVzdGEgZMOpY2FkYSBzZSBjb21wb3J0YSBjYXNpIGNvbW8gdW5hIG5vcm1hbC4KCiMgRMOpY2FkYSBkZSAyMDAwIGEgMjAxMApgYGB7ciBlY2hvPVRSVUV9CmdyYXBoX2FuZF9zdGF0c19kZWNhZGUoMjAwMCkKYGBgCgpMYSBkaXN0cmlidWNpw7NuIGRlIGxvcyB2YWxvcmVzIGRlbCDDjW5kaWNlIE9jZcOhbmljbyBkZWwgTmnDsW8gKE9OSSkgcGFyYSBsYSBkw6ljYWRhIGRlIDIwMDAgbXVlc3RyYSB1bmEgZm9ybWEgYXNpbcOpdHJpY2EgaGFjaWEgbGEgZGVyZWNoYSAoYXNpbWV0csOtYSBwb3NpdGl2YSksIHBlcm8gbWVub3MgcHJvbnVuY2lhZGEgcXVlIGVuIGTDqWNhZGFzIGFudGVyaW9yZXMsIHNlIG9ic2VydmE6CgoqIEhheSB1biBwaWNvIMO6bmljbyBiaWVuIGRlZmluaWRvIGFscmVkZWRvciBkZSAwLCBzaW4gZXZpZGVuY2lhIGNsYXJhIGRlIGJpbW9kYWxpZGFkLgoqIFNlIHBlcmNpYmUgdW5hIGNvbGEgYWxhcmdhZGEgaGFjaWEgdmFsb3JlcyBwb3NpdGl2b3MsIGluZGljYW5kbyBhbGd1bm9zIGV2ZW50b3MgY8OhbGlkb3MgbcOhcyBpbnRlbnNvcy4KKiBMYSBkZW5zaWRhZCBkaXNtaW51eWUgbcOhcyBsZW50YW1lbnRlIGhhY2lhIHZhbG9yZXMgcG9zaXRpdm9zIHF1ZSBoYWNpYSBsb3MgbmVnYXRpdm9zLgoKRGViaWRvIGEgZXN0YSBmb3JtYToKCiogVW5hIGRpc3RyaWJ1Y2nDs24gbG9nLW5vcm1hbCBvIGdhbW1hIHNlcsOtYW4gYnVlbmFzIGNhbmRpZGF0YXMgcGFyYSBtb2RlbGFyIGxvcyBkYXRvcy4KKiBMYSBkaXN0cmlidWNpw7NuIG5vcm1hbCBzZXLDrWEgdW5hIGFwcm94aW1hY2nDs24gcmF6b25hYmxlIHNpIHNlIGFjZXB0YSB1bmEgbGlnZXJhIGFzaW1ldHLDrWEsIHBlcm8gbm8gY2FwdHVyYXLDrWEgcGVyZmVjdGFtZW50ZSBsYSBjb2xhIGV4dGVuZGlkYS4KCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmVzdF9maXQoMjAwMCkKYGBgCgpFbiBlbCBncsOhZmljbyBkZSBDdWxsZW4geSBGcmV5IHBhcmEgbG9zIGRhdG9zIGRlbCBPTkkgZGUgbGEgZMOpY2FkYSBkZSAyMDAwLCBlbCBwdW50byBlbXDDrXJpY28gKHJvam8pIHNlIGVuY3VlbnRyYSBtdXkgY2VyY2FubyBhIGxhIHJlZ2nDs24gZGUgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGNvbiBsaWdlcm9zIGRlc3BsYXphbWllbnRvczoKCiogQXNpbWV0csOtYSBtdXkgYmFqYSAoc2tld25lc3MgY2FzaSBudWxvKS4KKiBDdXJ0b3NpcyBhcGVuYXMgcG9yIGVuY2ltYSBkZSBsYSBlc3BlcmFkYSBwYXJhIHVuYSBub3JtYWwgdGXDs3JpY2EuCiogTG9zIHB1bnRvcyBkZSBib290c3RyYXAgc2UgZW5jdWVudHJhbiBtdXkgY29uY2VudHJhZG9zIGFscmVkZWRvciBkZWwgcHVudG8gY2VudHJhbCwgbG8gcXVlIHN1Z2llcmUgYWx0YSBlc3RhYmlsaWRhZCBlc3RhZMOtc3RpY2EgZW4gbGFzIGVzdGltYWNpb25lcy4KCkF1bnF1ZSBlbiBsYSBncsOhZmljYSBkZSBkZW5zaWRhZCBvYnNlcnZhbW9zIHVuYSBsaWdlcmEgYXNpbWV0csOtYSB5IHVuYSBjYcOtZGEgbcOhcyBsZW50YSBoYWNpYSB2YWxvcmVzIHBvc2l0aXZvcywgZXN0ZSBhbsOhbGlzaXMgc3VnaWVyZSBxdWUsIGVzdGFkw61zdGljYW1lbnRlLCBsYSBkaXN0cmlidWNpw7NuIGRlbCBPTkkgZW4gbG9zIDIwMDBzIHNlIGNvbXBvcnRhIGJhc3RhbnRlIHBhcmVjaWRvIGEgdW5hIG5vcm1hbC4KCiMgRMOpY2FkYSAyMDEwIGEgMjAyMApgYGB7ciBlY2hvPVRSVUV9CmdyYXBoX2FuZF9zdGF0c19kZWNhZGUoMjAxMCkKYGBgCgpMYSBkaXN0cmlidWNpw7NuIGRlIGxvcyB2YWxvcmVzIGRlbCDDjW5kaWNlIE9jZcOhbmljbyBkZWwgTmnDsW8gKE9OSSkgcGFyYSBsYSBkw6ljYWRhIGRlIDIwMTAgbXVlc3RyYSB1bmEgYXNpbWV0csOtYSBwb3NpdGl2YSBtb2RlcmFkYSwgY29uIGNhcmFjdGVyw61zdGljYXMgbXV5IGludGVyZXNhbnRlczoKCiogUGljbyBwcmluY2lwYWwgZW4gdmFsb3JlcyBsaWdlcmFtZW50ZSBuZWdhdGl2b3MgKGNlcmNhbm9zIGEgLTAuNSkuCiogQ29sYSBsYXJnYSBoYWNpYSB2YWxvcmVzIHBvc2l0aXZvcywgZXh0ZW5kacOpbmRvc2UgaGFzdGEgYWxyZWRlZG9yIGRlIDIuCgpIYXkgdW4gcGVxdWXDsW8gc2VndW5kbyBhdW1lbnRvIGVuIGxhIGRlbnNpZGFkIGNlcmNhIGRlIDIsIGF1bnF1ZSBtdWNobyBtZW5vcyBwcm9udW5jaWFkbyBxdWUgZWwgcGljbyBwcmluY2lwYWwgKHBvZHLDrWEgaW50ZXJwcmV0YXJzZSBjb21vIHVuYSBsaWdlcmEgYmltb2RhbGlkYWQpLCBzZSBwdWVkZSBvYnNlcnZhcjoKCiogRWwgY29tcG9ydGFtaWVudG8gc3VnaWVyZSBxdWUgbm8gZXMgY29tcGxldGFtZW50ZSBzaW3DqXRyaWNhLgoqIERpc3RyaWJ1Y2lvbmVzIGNhbmRpZGF0YXM6IGxvZy1ub3JtYWwsIGdhbW1hIG8gdW5hIHBvc2libGUgbWV6Y2xhIGRlIG5vcm1hbGVzIHNpIHNlIGRlc2VhIGNhcHR1cmFyIGVsIHBlcXVlw7FvIHNlZ3VuZG8gYXVtZW50byBlbiB2YWxvcmVzIGFsdG9zLgoKTGEgZGlzdHJpYnVjacOzbiBub3JtYWwgc2Vyw61hIHVuYSBtYWxhIGVsZWNjacOzbiBwb3IgbGEgZXZpZGVudGUgYXNpbWV0csOtYSB5IGNvbGEgbGFyZ2EuCgoKYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpiZXN0X2ZpdCgyMDEwKQpgYGAKRW4gZWwgZ3LDoWZpY28gZGUgQ3VsbGVuIHkgRnJleSBjb3JyZXNwb25kaWVudGUgYSBsb3MgZGF0b3MgZGVsIE9OSSBkZSBsYSBkw6ljYWRhIGRlIDIwMTAsIGVsIHB1bnRvIGVtcMOtcmljbyAocm9qbykgc2UgdWJpY2EgbcOhcyBhbGVqYWRvIGRlIGxhIG5vcm1hbGlkYWQgZW4gY29tcGFyYWNpw7NuIGNvbiBkw6ljYWRhcyBhbnRlcmlvcmVzLCBzZSBvYnNlcnZhOgoKKiBBc2ltZXRyw61hIHBvc2l0aXZhIG1vZGVyYWRhIChlbCBzcXVhcmUgb2Ygc2tld25lc3MgZXMgbWF5b3IgcXVlIDApLgoqIEN1cnRvc2lzIG3DoXMgZWxldmFkYSBlbiBjb21wYXJhY2nDs24gYSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGFjZXJjw6FuZG9zZSBoYWNpYSByZWdpb25lcyBkZSBkaXN0cmlidWNpb25lcyBjb21vIGxhIGdhbW1hIG8gbGEgbG9nLW5vcm1hbC4KKiBMb3MgcHVudG9zIGRlIGJvb3RzdHJhcCAobmFyYW5qYXMpIGVzdMOhbiBtw6FzIGRpc3BlcnNvcyBxdWUgZW4gZMOpY2FkYXMgYW50ZXJpb3JlcywgaW5kaWNhbmRvIG1heW9yIHZhcmlhYmlsaWRhZCBlbiBsYSBmb3JtYSBkZSBsb3MgZGF0b3MuCgpMYSBhc2ltZXRyw61hIHBvc2l0aXZhIHkgbGEgcHJlc2VuY2lhIGRlIGNvbGFzIGxhcmdhcyBoYWNlbiBxdWUgbGEgbm9ybWFsIG5vIHNlYSB1bmEgYnVlbmEgb3BjacOzbi4KRGlzdHJpYnVjaW9uZXMgbG9nLW5vcm1hbCBvIGdhbW1hIHNlcsOtYW4gbGFzIG3DoXMgYWRlY3VhZGFzIHBhcmEgbW9kZWxhciBsb3MgZGF0b3MgZGUgZXN0YSBkw6ljYWRhLgoKCg==