Miembros del Equipo:

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:

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:

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:

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:

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:

Con esta forma, las distribuciones candidatas más probables serían:

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:

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:

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:

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:

Debido a esta forma:

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:

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:

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:

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:

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==