Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2021-2022. El repo del trabajo está aquí.

La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


knitr::include_graphics(here::here("imagenes", "Poblacion_Mundial.jpeg"))

1. Introducción

El número total de habitantes del planeta Tierra se triplicó entre 1950 y 2010, y si las estimaciones son correctas, podría cuatriplicarse para el año 2050.

2. Datos

Los datos provienen de la página web de Naciones Unidas, donde puedes encontrar datos tanto de la evolución de la población hasta la actualidad, como datos sobre predicción de los niveles de población, clasificandolos por países, continente, desarrollo económico, etc. La predicción sobre crecimiento esta condicionada por el valor esperado de las tasas de natalidad. Por lo que Naciones unidas estima la evolución del crecimiento considerando una tasa de natalidad creciente,constante o decreciente.

2.1. Procesando los datos

Lo primero es cargar los datos. En este caso utilicé la función rio para cargar los datos.Para poder mostrar la diferencia en niveles de población cargue el paquete “rnaturalearth” para poder utilizar la variable “geometría”, y así luego poder aplicar la función geom_sf(). También convertí algunos data frame en formato largo para poder manipular mejor los datos.

world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
world <-world |> filter(continent != "Antarctica") 
df <- rio::import(here::here("datos", "DatosP.xlsx"))
dc <- rio::import(here::here("datos", "DatosCont.xlsx"))
df <-df[,-1]
df_noworld<-df[-1,]
df <-select(df,-Notes,-Variant,-`Parent code`,-`Country code`)
data_long <- df %>% pivot_longer(cols = 3:73, names_to = "año")
data_long<-data_long %>% mutate(año=as.numeric(año)) 
data_long<-data_long %>% na.omit() 
df_w<- data_long %>% filter( Type== "World")

Para este trabajo se han tomado los datos considerando una tasa de natalidad constante. A continuación se mostrará una tabla donde se puede ver los niveles de población por países en el periodo comprendido de 1950 a 2020.

Tabla1 <- data_long %>% DT::datatable(filter = 'top', extensions = 'Buttons',options = list(dom = 'Blfrtip',buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),pageLength = 5, autoWidth = TRUE ))
Tabla1

3. Una población en crecimiento: Cálculos con r

3.1. Tasa de crecimiento desde 1950

Con los datos con los que contaba quise mostrar como había sido el crecimiento de la población desde 1950 hasta la actualidad. Para ello tomamos como año base 1950, y calculamos la tasa de crecimiento año a año.

Tasa de crecimiento= (población inicial-población final)/población inicial

aa <- df_w %>%
  arrange %>% mutate(crec_pob_1_anyo = value - lag(value)) %>%
  mutate(crec_pob_desde_1950 = value - first(value)) %>%
  mutate(crec_pob_percent = crec_pob_desde_1950 / first(value) *100) %>% ungroup()

aa<-aa[-1,]

bb<-aa %>% filter(año%in%c(1960,1970,1980,1990,2000,2010,2020))

bb<- bb %>% mutate(año=as.character(año))

#Crecimiento de la población desde 1950, crecimiento ininterrumpido
p<-ggplot(bb,aes(x=año,y=crec_pob_percent,fill= año))+geom_bar(stat='identity', 
           color = "white", 
           show.legend = FALSE) +labs(title = "Crecimiento población desde 1950 hasta 2020",x= "Año",y= "Tasa de crecimeinto(Año base 1950)", color = "Año")+
  geom_text(aes(label = round(crec_pob_percent, digits = 2)), 
            position = position_dodge(0.9), 
            vjust= 1.2, 
            size = 5, 
            color = "white")+
  scale_x_discrete(label=c(1960,1970,1980,1990,2000,2010,2020)) + 
  scale_y_continuous(labels = scales::comma)
p

3.2. Crecimiento anual

Lo siguiente fue hacer un cálculo similar, pero midiendo el crecimiento año a año. Cabe resaltar que fue en la década de los 80-90 dónde se observa un crecimiento más elevado. Aunque fue desde 1950 a 1970 donde nació la generación coloquialmente llamada babyboomers,durante los años 80-90 se observa un crecimiento elevado en la población.

p1<-ggplot(bb,aes(x=año,y=crec_pob_1_anyo,fill=año))+geom_bar(stat='identity', 
                                                              color = "white", 
                                                              show.legend = FALSE) +labs(title = "Crecimiento de la población anual",x= "Año",y= NULL, color = "Año")+
  geom_text(aes(label = round(crec_pob_1_anyo, digits = 0)), 
            position = position_dodge(0.9), 
            vjust= 1.2, 
            size = 5, 
            color = "white")+
  scale_x_discrete(label=c(1960,1970,1980,1990,2000,2010,2020))+
  theme_minimal()
p1

4. Población 2020

4.1. Los países más poblados: China e India

China (1.440 millones) e India (1.390 millones) són los países con mayor población. Los dos países tienen más de 1.000 millones de personas y representan el 19% y 18% de la población mundial respectivamente. Las estimaciones predicen que sobre el año 2027, India superará a China como el país más poblado del mundo. Sin embargo, se estima que China reducirá su población en 31.400 millones (un 2.2% menos) entre 2019 y 2050.

df_noworld <-select(df_noworld,-Notes,-Type,-`Parent code`)
noworld_long<-df_noworld %>% pivot_longer(cols = 4:74, names_to = "año")

cc<-noworld_long %>% filter(año==2020) %>% select(Region,value) 

df_world <- full_join(world, cc, by = c("name" = "Region") )
df_world<-df_world[1:240,]
df_world<-df_world %>% mutate(pob_est=as.character(pop_est))

df_world2 <-df_world %>% mutate(Poblacion=pop_est/10^6)
df_world2<- df_world2 %>% select(Poblacion)

pw<- ggplot(df_world2) + geom_sf(aes(geometry = geometry, fill = Poblacion))+ theme(panel.grid.major = element_line(colour = "white"), panel.grid.minor= element_line(colour = "white"))+labs(title = "Población mundial 2020",fill=" Población \n en millones") + theme(plot.title = element_text(size = 20, face = "bold", hjust = 0.5),plot.subtitle = element_text(size = 20, hjust = 0.5))+ theme(panel.background = element_rect(fill = "white"))+scale_fill_gradientn(colours=c("#FFFFFFFF","#CCFDFFFF","#99F8FFFF","#66F0FFFF","#33E4FFFF","#00AACCFF","#007A99FF"))+theme(plot.title = element_text(size = 15, face = "bold",hjust = 0.5),plot.subtitle = element_text(hjust = 0.5), axis.line = element_blank(),axis.text = element_blank(), axis.title = element_blank(),axis.ticks = element_blank(),legend.title = element_text(face = "bold"),legend.position = "bottom",legend.direction = "horizontal", panel.background = element_rect(colour= "white", size= 1, fill ="white"))
pw


text <- cc $ Region
docs <- Corpus (VectorSource (text))
frecuencia <- cc $ value

datanube<-data.frame(word=text,freq=frecuencia)

wordcloud2(datanube, shape= "circle", size = 0.8)

4.2. TOP 10 Países más poblados

En el mundo hay 194 países reconocidos por la ONU, con su propio gobierno y completa independencia. Solo 10 países, es decir el 0,05% de los países del mundo, concentran más del 50% de la población mundial. En concreto estos países representan el 57,79% del global.

La siguiente tabla muestra el porcentaje de cada país sobre el total de la población mundial.

data <- data.frame ( category = c("China", "India", "United States of America", "Indonesia","Pakistan","Brazil","Nigeria","Bangladesh","Russian Federation","Mexico","Resto de Países"),count=c(18.5,17.7,4.25,3.51,2.83,2.73,2.64,2.11,1.87,1.65,42.21))

knitr::kable(data)
category count
China 18.50
India 17.70
United States of America 4.25
Indonesia 3.51
Pakistan 2.83
Brazil 2.73
Nigeria 2.64
Bangladesh 2.11
Russian Federation 1.87
Mexico 1.65
Resto de Países 42.21

#Para hacer este data frame primero estimamos los 10 países más poblados y después construimos un nuevo dataframe
#top10_2020<-cc %>%  slice_max(value,n=10)
#df_w2<-df_w %>% filter(año==2020) %>% select(value,Region) 

#df_percent<- full_join(df_w2, top10_2020, by = c("Region" = "Region","value"="value"))

#df_percent<-df_percent %>% mutate(porcentaje=value/7794798.7*100)
#df_percent2<-df_percent[-1,]


data <- data.frame ( category = c("China", "India", "United States of America", "Indonesia","Pakistan","Brazil","Nigeria","Bangladesh","Russian Federation","Mexico","Resto de Países"),count=c(18.5,17.7,4.25,3.51,2.83,2.73,2.64,2.11,1.87,1.65,42.21))

data$fraction = data$count / sum(data$count)
data$ymax = cumsum(data$fraction)

data$ymin = c(0, head(data$ymax, n=-1))

red<-ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=category)) +geom_rect() +coord_polar(theta="y")+xlim(c(2, 4))+theme_void() +labs(title = "TOP 10 \n Países más poblados",fill = NULL) +theme (plot.title = element_text (hjust = 0.5 ),legend.title = element_text(face= "bold"),legend.position = "bottom",legend.direction = "horizontal")
red

5. Datos sobre continentes

Más del 50% de la población mundial se concentra en Asia, seguido de África con algo más de un 17%, un 10% en Europa (750 millones), un 8% en Latinoamérica y el Caribe (650 millones) y el 5% restante en América del Norte (370 millones) y Oceanía (43 millones).

#Para hacer los calculos sobre porcentajes: 
#long_contw<-dc %>% pivot_longer(cols = 2:152, names_to = "año")
#long_contw_2020<-long_contw %>% filter(año == 2020)

#ss<- long_contw%>%  pivot_wider(names_from = "Region", values_from = "value")

#cont_per<-ss %>% filter(año==2020) %>% mutate(percent_asia=Asia/World*100) %>% mutate(percent_africa=Africa/World*100) %>% mutate(percent_Europa=Europe/World*100) %>% mutate(percent_Oceania=Oceania/World*100) %>% mutate(percent_NorteA=`Northern America`/World*100) %>% mutate(percent_LatinA=`Latin America and the Caribbean`/World*100)

group<-c("África", "Asia","Europa","Latino América y Caribe","Norte América","Oceanía")

value<-c(17.2, 59.5,9.59,8.39,4.73,2)

datatree<-data.frame(group,value)

tree <- treemap(datatree,
        index="group",
        vSize="value",
        type="index", align.labels=list(
          c("center", "center"), 
          c("right", "bottom")),palette="Pastel2",title = "% Población mundial por continentes" )

5.1.Evolución de la población de 1950 hasta 2020

En 1950, la estimación para la población mundial era de 2.600 millones de personas. En 1987 se alcanzaron los 5.000 millones, y en 1999, los 6.000 millones. Para octubre de 2011, la estimación para la población mundial era de 7.000 millones de personas. Y en los próximos 30 años se espera que la población mundial aumente en 2.000 millones de personas, se pasaría de los 7.700 millones de personas que hay en la actualidad a 9.700 millones en 2050,llegando a un máximo de 11.000 millones de personas para 2100.


dc<-dc[-1,]
long_cont<-dc %>% pivot_longer(cols = 2:152, names_to = "año")

long_cont<-long_cont %>% mutate(año=as.numeric(año))%>% mutate(value=value/10^6)

evcont <- ggplot(long_cont,aes(x= año, y= value)) + 
  labs(title = "Evolución población por continente",
       x= "Año",
       y= "Población",
       color = "Region") +geom_point(aes(color= Region), size= 3) +
  geom_line(aes(color= Region), size= 1.5)+
  theme_minimal() +
  theme(plot.title = element_text(size = 15, face = "bold",
                                  hjust = 0.5),
        axis.title.x = element_text(size = 10, hjust = 1,
                                    vjust = 0),
        axis.title.y = element_text(size = 10, hjust = 1, vjust = 1),
        legend.title = element_text(face = "bold"))+ labs(y = "Población en miles de millones", color = "Continente")

evcont+transition_reveal(año) + view_follow()

5.2. África, el continente que más rápido crece

Se estima que la mitad del crecimiento demográfico mundial desde hoy hasta 2050 tendrá lugar en África. Este continente cuenta con la tasa de crecimiento demográfico más alta, y se prevé que para 2050 el África subsahariana doble su población. Lo que indica un rápido crecimiento de la población, y aunque se reduzcan considerablemente los niveles de fecundidad en los próximos años, y a pesar de la incertidumbre que existe en cuanto a las próximas tendencias de fecundidad en África, hay una alta cantidad de de jóvenes en este continente que alcanzarán la edad adulta en pocos años y también tendrán hijos. África desempeñará un papel esencial en cuanto a las dimensiones y la distribución de la población mundial en las próximas décadas.


long_contw<-dc %>% pivot_longer(cols = 2:152, names_to = "año")
long_contw_F<-long_contw %>% filter(año %in% (2021:2100)) %>% mutate(value=value/10^6)

long_contw_F<- long_contw_F %>% mutate(año=as.numeric(año))

evcont2 <- ggplot(long_contw_F,aes(x= año, y= value)) + 
  labs(title = "Evolución población por continente",
       x= "Año",
       y= "Población",
       color = "Region") +
  geom_point(aes(color= Region), size= 3) +
  geom_line(aes(color= Region), size= 1.5)+
  theme_minimal() +
  theme(plot.title = element_text(size = 15, face = "bold",
                                  hjust = 0.5),
        axis.title.x = element_text(size = 10, hjust = 1,
                                    vjust = 0),
        axis.title.y = element_text(size = 10, hjust = 0.5, vjust = 1),
        legend.title = element_text(face = "bold"))+ labs(y = "Población en miles de millones", color = "Continente")

evcont2

6. Trabajos en los que te has basado

Para hacer este trabajo tomé como referencia un articulo publicado en la página web de Naciones Unidas, podréis encontrarlo mediante este enlace https://www.un.org/es/global-issues/population. También tome como referencia algunos gráficos publicados en Statista. https://es.statista.com/estadisticas/635122/evolucion-de-la-poblacion-mundial/. Y sobre todo me sirvieron de guía los tutoriales de la página web del curso https://perezp44.github.io/intro-ds-21-22-web , así como los trabajos de mis compañeros, tanto de este curso como de cursos anteriores.

7. Bibilografía

https://perezp44.github.io/intro-ds-21-22-web/index.html .

https://r-charts.com

https://rpubs.com/

https://concepto.de/crecimiento-poblacional/

Información de mi R-sesión:

- Session info  --------------------------------------------------------------
 hash: woman firefighter: medium-light skin tone, strawberry, airplane

 setting  value
 version  R version 4.1.2 (2021-11-01)
 os       Windows 10 x64 (build 18363)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Spanish_Spain.1252
 ctype    Spanish_Spain.1252
 tz       Europe/Paris
 date     2022-01-03
 pandoc   2.11.4 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package           * version     date (UTC) lib source
 assertthat          0.2.1       2019-03-21 [1] CRAN (R 4.1.2)
 backports           1.3.0       2021-10-27 [1] CRAN (R 4.1.1)
 broom               0.7.10      2021-10-31 [1] CRAN (R 4.1.2)
 bslib               0.3.1       2021-10-06 [1] CRAN (R 4.1.2)
 cellranger          1.1.0       2016-07-27 [1] CRAN (R 4.1.2)
 class               7.3-19      2021-05-03 [2] CRAN (R 4.1.2)
 classInt            0.4-3       2020-04-07 [1] CRAN (R 4.1.2)
 cli                 3.1.0       2021-10-27 [1] CRAN (R 4.1.2)
 clipr               0.7.1       2020-10-08 [1] CRAN (R 4.1.2)
 colorspace          2.0-2       2021-06-24 [1] CRAN (R 4.1.2)
 crayon              1.4.2       2021-10-29 [1] CRAN (R 4.1.2)
 crosstalk           1.2.0       2021-11-04 [1] CRAN (R 4.1.2)
 curl                4.3.2       2021-06-23 [1] CRAN (R 4.1.2)
 data.table          1.14.2      2021-09-27 [1] CRAN (R 4.1.2)
 DBI                 1.1.2       2021-12-20 [1] CRAN (R 4.1.2)
 dbplyr              2.1.1       2021-04-06 [1] CRAN (R 4.1.2)
 desc                1.4.0       2021-09-28 [1] CRAN (R 4.1.2)
 details             0.2.1       2020-01-12 [1] CRAN (R 4.1.2)
 digest              0.6.28      2021-09-23 [1] CRAN (R 4.1.2)
 dplyr             * 1.0.7       2021-06-18 [1] CRAN (R 4.1.1)
 DT                  0.20        2021-11-15 [1] CRAN (R 4.1.2)
 e1071               1.7-9       2021-09-16 [1] CRAN (R 4.1.2)
 ellipsis            0.3.2       2021-04-29 [1] CRAN (R 4.1.2)
 evaluate            0.14        2019-05-28 [1] CRAN (R 4.1.2)
 extrafont           0.17        2014-12-08 [1] CRAN (R 4.1.1)
 extrafontdb         1.0         2012-06-11 [1] CRAN (R 4.1.1)
 fansi               0.5.0       2021-05-25 [1] CRAN (R 4.1.2)
 farver              2.1.0       2021-02-28 [1] CRAN (R 4.1.2)
 fastmap             1.1.0       2021-01-25 [1] CRAN (R 4.1.2)
 forcats           * 0.5.1       2021-01-27 [1] CRAN (R 4.1.2)
 foreign             0.8-81      2020-12-22 [2] CRAN (R 4.1.2)
 fs                  1.5.0       2020-07-31 [1] CRAN (R 4.1.2)
 gdtools             0.2.3       2021-01-06 [1] CRAN (R 4.1.2)
 generics            0.1.1       2021-10-25 [1] CRAN (R 4.1.2)
 gganimate         * 1.0.7       2020-10-15 [1] CRAN (R 4.1.2)
 ggplot2           * 3.3.5       2021-06-25 [1] CRAN (R 4.1.2)
 ggwordcloud       * 0.5.0       2019-06-02 [1] CRAN (R 4.1.2)
 glue                1.5.0       2021-11-07 [1] CRAN (R 4.1.2)
 gridBase            0.4-7       2014-02-24 [1] CRAN (R 4.1.2)
 gt                * 0.3.1       2021-08-07 [1] CRAN (R 4.1.2)
 gtable              0.3.0       2019-03-25 [1] CRAN (R 4.1.2)
 haven               2.4.3       2021-08-04 [1] CRAN (R 4.1.2)
 here                1.0.1       2020-12-13 [1] CRAN (R 4.1.2)
 highr               0.9         2021-04-16 [1] CRAN (R 4.1.2)
 hms                 1.1.1       2021-09-26 [1] CRAN (R 4.1.2)
 hrbrthemes        * 0.8.6       2021-12-09 [1] Github (hrbrmstr/hrbrthemes@3e8d949)
 htmltools           0.5.2       2021-08-25 [1] CRAN (R 4.1.2)
 htmlwidgets         1.5.4       2021-09-08 [1] CRAN (R 4.1.2)
 httpuv              1.6.4       2021-12-14 [1] CRAN (R 4.1.2)
 httr                1.4.2       2020-07-20 [1] CRAN (R 4.1.2)
 igraph              1.2.10      2021-12-15 [1] CRAN (R 4.1.2)
 jquerylib           0.1.4       2021-04-26 [1] CRAN (R 4.1.2)
 jsonlite            1.7.2       2020-12-09 [1] CRAN (R 4.1.2)
 KernSmooth          2.23-20     2021-05-03 [2] CRAN (R 4.1.2)
 klippy            * 0.0.0.9500  2021-12-01 [1] Github (rlesur/klippy@378c247)
 knitr             * 1.37        2021-12-16 [1] CRAN (R 4.1.2)
 labeling            0.4.2       2020-10-20 [1] CRAN (R 4.1.1)
 later               1.3.0       2021-08-18 [1] CRAN (R 4.1.2)
 lattice             0.20-45     2021-09-22 [2] CRAN (R 4.1.2)
 lazyeval            0.2.2       2019-03-15 [1] CRAN (R 4.1.2)
 lifecycle           1.0.1       2021-09-24 [1] CRAN (R 4.1.2)
 lubridate           1.8.0       2021-10-07 [1] CRAN (R 4.1.2)
 magick              2.7.3       2021-08-18 [1] CRAN (R 4.1.2)
 magrittr            2.0.1       2020-11-17 [1] CRAN (R 4.1.2)
 mime                0.12        2021-09-28 [1] CRAN (R 4.1.1)
 modelr              0.1.8       2020-05-19 [1] CRAN (R 4.1.2)
 munsell             0.5.0       2018-06-12 [1] CRAN (R 4.1.2)
 NLP               * 0.2-1       2020-10-14 [1] CRAN (R 4.1.1)
 openxlsx            4.2.4       2021-06-16 [1] CRAN (R 4.1.2)
 patchwork         * 1.1.1       2020-12-17 [1] CRAN (R 4.1.2)
 pillar              1.6.4       2021-10-18 [1] CRAN (R 4.1.2)
 pkgconfig           2.0.3       2019-09-22 [1] CRAN (R 4.1.2)
 plotly            * 4.10.0.9000 2021-12-02 [1] Github (plotly/plotly@e6cc271)
 plyr                1.8.6       2020-03-03 [1] CRAN (R 4.1.2)
 png               * 0.1-7       2013-12-03 [1] CRAN (R 4.1.1)
 prettyunits         1.1.1       2020-01-24 [1] CRAN (R 4.1.2)
 progress            1.2.2       2019-05-16 [1] CRAN (R 4.1.2)
 promises            1.2.0.1     2021-02-11 [1] CRAN (R 4.1.2)
 proxy               0.4-26      2021-06-07 [1] CRAN (R 4.1.2)
 purrr             * 0.3.4       2020-04-17 [1] CRAN (R 4.1.2)
 R6                  2.5.1       2021-08-19 [1] CRAN (R 4.1.2)
 RColorBrewer        1.1-2       2014-12-07 [1] CRAN (R 4.1.1)
 Rcpp                1.0.7       2021-07-07 [1] CRAN (R 4.1.2)
 readr             * 2.1.0       2021-11-11 [1] CRAN (R 4.1.2)
 readxl              1.3.1       2019-03-13 [1] CRAN (R 4.1.2)
 remotes           * 2.4.1       2021-09-29 [1] CRAN (R 4.1.2)
 reprex              2.0.1       2021-08-05 [1] CRAN (R 4.1.2)
 rio                 0.5.29      2021-11-22 [1] CRAN (R 4.1.2)
 rlang               0.4.12      2021-10-18 [1] CRAN (R 4.1.2)
 rmarkdown           2.11        2021-09-14 [1] CRAN (R 4.1.2)
 rnaturalearth     * 0.1.0       2017-03-21 [1] CRAN (R 4.1.2)
 rnaturalearthdata * 0.1.0       2017-02-21 [1] CRAN (R 4.1.2)
 rprojroot           2.0.2       2020-11-15 [1] CRAN (R 4.1.2)
 rstudioapi          0.13        2020-11-12 [1] CRAN (R 4.1.2)
 Rttf2pt1            1.3.9       2021-07-22 [1] CRAN (R 4.1.1)
 rvest               1.0.2       2021-10-16 [1] CRAN (R 4.1.2)
 s2                  1.0.7       2021-09-28 [1] CRAN (R 4.1.2)
 sass                0.4.0       2021-05-12 [1] CRAN (R 4.1.2)
 scales              1.1.1       2020-05-11 [1] CRAN (R 4.1.2)
 sessioninfo         1.2.1       2021-11-02 [1] CRAN (R 4.1.2)
 sf                * 1.0-4       2021-11-14 [1] CRAN (R 4.1.2)
 shiny               1.7.1       2021-10-02 [1] CRAN (R 4.1.2)
 slam                0.1-49      2021-11-17 [1] CRAN (R 4.1.2)
 sp                  1.4-6       2021-11-14 [1] CRAN (R 4.1.2)
 stringi             1.7.5       2021-10-04 [1] CRAN (R 4.1.1)
 stringr           * 1.4.0       2019-02-10 [1] CRAN (R 4.1.2)
 systemfonts         1.0.3       2021-10-13 [1] CRAN (R 4.1.2)
 tibble            * 3.1.6       2021-11-07 [1] CRAN (R 4.1.2)
 tidyr             * 1.1.4       2021-09-27 [1] CRAN (R 4.1.2)
 tidyselect          1.1.1       2021-04-30 [1] CRAN (R 4.1.2)
 tidyverse         * 1.3.1       2021-04-15 [1] CRAN (R 4.1.2)
 tm                * 0.7-8       2020-11-18 [1] CRAN (R 4.1.2)
 treemap           * 2.4-3       2021-08-22 [1] CRAN (R 4.1.2)
 tweenr              1.0.2       2021-03-23 [1] CRAN (R 4.1.2)
 tzdb                0.2.0       2021-10-27 [1] CRAN (R 4.1.2)
 units               0.7-2       2021-06-08 [1] CRAN (R 4.1.2)
 utf8                1.2.2       2021-07-24 [1] CRAN (R 4.1.2)
 vctrs               0.3.8       2021-04-29 [1] CRAN (R 4.1.2)
 viridisLite         0.4.0       2021-04-13 [1] CRAN (R 4.1.2)
 withr               2.4.3       2021-11-30 [1] CRAN (R 4.1.2)
 wk                  0.5.0       2021-07-13 [1] CRAN (R 4.1.2)
 wordcloud2        * 0.2.1       2018-01-03 [1] CRAN (R 4.1.2)
 xfun                0.28        2021-11-04 [1] CRAN (R 4.1.2)
 xml2                1.3.2       2020-04-23 [1] CRAN (R 4.1.2)
 xtable              1.8-4       2019-04-21 [1] CRAN (R 4.1.2)
 yaml                2.2.1       2020-02-01 [1] CRAN (R 4.1.1)
 zip                 2.2.0       2021-05-31 [1] CRAN (R 4.1.2)

 [1] C:/Users/remeg/OneDrive/Documentos/R/win-library/4.1
 [2] C:/Program Files/R/R-4.1.2/library

------------------------------------------------------------------------------


LS0tDQp0aXRsZTogIk5hY2lvbmVzIFVuaWRhczogRGF0b3Mgc29icmUgcG9ibGFjacOzbiINCnN1YnRpdGxlOiAiQ2Fyb2xpbmEgRXNww60gR2FyY8OtYShjYWVzZ2FyMkBhbHVtbmkudXYuZXMpIiANCmF1dGhvcjogIlVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCmRhdGU6ICJEaWNpZW1icmUgZGUgMjAyMSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgIA0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d3b3JkY2xvdWQpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoInJuYXR1cmFsZWFydGgiKQ0KbGlicmFyeSgicm5hdHVyYWxlYXJ0aGRhdGEiKQ0KbGlicmFyeShyZW1vdGVzKQ0KbGlicmFyeShndCkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHBuZykNCmxpYnJhcnkoZ3JpZCkNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShzZikNCmxpYnJhcnkod29yZGNsb3VkMikNCmxpYnJhcnkodG0pDQpsaWJyYXJ5KHRyZWVtYXApDQpgYGANCg0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjgyOCwgb3V0LndpZHRoID0gIjkwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIHNvbG8gSEFTIGRlIFNVU1RJVFVJUiAicGVyZXpwNDQiIHBvciB0dSB1c3VhcmlvIGRlIEdpdGh1Yi0tPg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9wZXJlenA0NC90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBIQVMgREUgQ0FNQklBUiBOQURBLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KYGBge3J9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJQb2JsYWNpb25fTXVuZGlhbC5qcGVnIikpDQpgYGANCg0KDQojIFsxLiBJbnRyb2R1Y2Npw7NuXXsudmVyZGVjaXRvfQ0KRWwgbsO6bWVybyB0b3RhbCBkZSBoYWJpdGFudGVzIGRlbCBwbGFuZXRhIFRpZXJyYSBzZSB0cmlwbGljw7MgZW50cmUgMTk1MCB5IDIwMTAsIHkgc2kgbGFzIGVzdGltYWNpb25lcyBzb24gY29ycmVjdGFzLCBwb2Ryw61hIGN1YXRyaXBsaWNhcnNlIHBhcmEgZWwgYcOxbyAyMDUwLg0KDQoNCjwhLS0gWW8gbm8gdXNhcsOtYSBDU1MsIGJhc3RhbnRlIHRyYWJham8gdGVuw6lpcywgcGVybyAuLi4gc2kgdXNhcyBDU1MgcGFyYSB0dW5lYXIgdHUgaHRtbCBwb2Ryw6FzIGRlamFybG8gbcOhcyBib25pdG8sIG8gYWwgbWVub3MgbcOhcyBhIHR1IGd1c3RvLiBQb3IgZWplbXBsbywgcG9kcsOhcyBmw6FjaWxtZW50ZSBjYW1iaWFyIGVsIHRhbWHDsW8gZGUgYWxndW5hcyBwYWxhYnJhcywgcG9yIGVqZW1wbG8sICoqW3VuYXMgcGFsYWJyYXMgZW4gZ3JhbmRlIHkgZW4gbmVncml0YV17LmxhcmdlfSoqLCBhdW5xdWUgc2kgZXN0YXMgdXNhbmRvIENTUyBzYWxkcsOhbiBlbiB2ZXJkZSBwb3JxdWUgZW4gZWwgQ1NTIGhlIHB1ZXN0byBxdWUgbGEgbmVncml0YSBzYWxnYSBlbiB2ZXJkZS4gUG9yIGVqZW1wbG8sIHBvZHLDoXMgcG9uZXIgZsOhY2lsbWVudGUgW3VuYXMgcGFsYWJyYXMgZW4gcHVycGxlXXsucHVycGxlfSwgeSBhaG9yYSwgW1tlbiBncmFuZGUgeSBlbiByb2ppdG9dey5yb2ppdG99XXsubGFyZ2V9Li0tPg0KDQojIDIuIERhdG9zIDwvRk9OVD4gIVtdKGltYWdlbmVzL25hY2lvbmVzdW5pZGFzLmdpZil7d2lkdGg9IjE1JSJ9PC9GT05UPg0KDQpMb3MgZGF0b3MgcHJvdmllbmVuIGRlIGxhIHDDoWdpbmEgd2ViIGRlICoqTmFjaW9uZXMgVW5pZGFzKiosIGRvbmRlIHB1ZWRlcyBlbmNvbnRyYXIgZGF0b3MgdGFudG8gZGUgbGEgZXZvbHVjacOzbiBkZSBsYSBwb2JsYWNpw7NuIGhhc3RhIGxhIGFjdHVhbGlkYWQsIGNvbW8gZGF0b3Mgc29icmUgcHJlZGljY2nDs24gZGUgbG9zIG5pdmVsZXMgZGUgcG9ibGFjacOzbiwgY2xhc2lmaWNhbmRvbG9zIHBvciBwYcOtc2VzLCBjb250aW5lbnRlLCBkZXNhcnJvbGxvIGVjb27Ds21pY28sIGV0Yy4gDQpMYSBwcmVkaWNjacOzbiBzb2JyZSBjcmVjaW1pZW50byBlc3RhIGNvbmRpY2lvbmFkYSBwb3IgZWwgdmFsb3IgZXNwZXJhZG8gZGUgbGFzIHRhc2FzIGRlIG5hdGFsaWRhZC4gUG9yIGxvIHF1ZSBOYWNpb25lcyB1bmlkYXMgZXN0aW1hIGxhIGV2b2x1Y2nDs24gZGVsIGNyZWNpbWllbnRvIGNvbnNpZGVyYW5kbyB1bmEgdGFzYSBkZSBuYXRhbGlkYWQgY3JlY2llbnRlLGNvbnN0YW50ZSBvIGRlY3JlY2llbnRlLiANCg0KDQojIyAyLjEuIFByb2Nlc2FuZG8gbG9zIGRhdG9zDQoNCkxvIHByaW1lcm8gZXMgY2FyZ2FyIGxvcyBkYXRvcy4gRW4gZXN0ZSBjYXNvIHV0aWxpY8OpIGxhIGZ1bmNpw7NuICoqcmlvKiogcGFyYSBjYXJnYXIgbG9zIGRhdG9zLlBhcmEgcG9kZXIgbW9zdHJhciBsYSBkaWZlcmVuY2lhIGVuIG5pdmVsZXMgZGUgcG9ibGFjacOzbiBjYXJndWUgZWwgcGFxdWV0ZSAqKiJybmF0dXJhbGVhcnRoIioqIHBhcmEgcG9kZXIgdXRpbGl6YXIgbGEgdmFyaWFibGUgImdlb21ldHLDrWEiLCB5IGFzw60gbHVlZ28gcG9kZXIgYXBsaWNhciBsYSBmdW5jacOzbiBnZW9tX3NmKCkuIFRhbWJpw6luIGNvbnZlcnTDrSBhbGd1bm9zIGRhdGEgZnJhbWUgZW4gZm9ybWF0byBsYXJnbyBwYXJhIHBvZGVyIG1hbmlwdWxhciBtZWpvciBsb3MgZGF0b3MuDQoNCmBgYHtyLCBldmFsID0gVFJVRX0NCndvcmxkIDwtIHJuYXR1cmFsZWFydGg6Om5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZCA8LXdvcmxkIHw+IGZpbHRlcihjb250aW5lbnQgIT0gIkFudGFyY3RpY2EiKSANCmRmIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgIkRhdG9zUC54bHN4IikpDQpkYyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJEYXRvc0NvbnQueGxzeCIpKQ0KZGYgPC1kZlssLTFdDQpkZl9ub3dvcmxkPC1kZlstMSxdDQpkZiA8LXNlbGVjdChkZiwtTm90ZXMsLVZhcmlhbnQsLWBQYXJlbnQgY29kZWAsLWBDb3VudHJ5IGNvZGVgKQ0KZGF0YV9sb25nIDwtIGRmICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDM6NzMsIG5hbWVzX3RvID0gImHDsW8iKQ0KZGF0YV9sb25nPC1kYXRhX2xvbmcgJT4lIG11dGF0ZShhw7FvPWFzLm51bWVyaWMoYcOxbykpIA0KZGF0YV9sb25nPC1kYXRhX2xvbmcgJT4lIG5hLm9taXQoKSANCmRmX3c8LSBkYXRhX2xvbmcgJT4lIGZpbHRlciggVHlwZT09ICJXb3JsZCIpDQpgYGANCg0KUGFyYSBlc3RlIHRyYWJham8gc2UgaGFuIHRvbWFkbyBsb3MgZGF0b3MgY29uc2lkZXJhbmRvIHVuYSB0YXNhIGRlIG5hdGFsaWRhZCBjb25zdGFudGUuIEEgY29udGludWFjacOzbiBzZSBtb3N0cmFyw6EgdW5hIHRhYmxhIGRvbmRlIHNlIHB1ZWRlIHZlciBsb3Mgbml2ZWxlcyBkZSBwb2JsYWNpw7NuIHBvciBwYcOtc2VzIGVuIGVsIHBlcmlvZG8gY29tcHJlbmRpZG8gZGUgMTk1MCBhIDIwMjAuIA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KVGFibGExIDwtIGRhdGFfbG9uZyAlPiUgRFQ6OmRhdGF0YWJsZShmaWx0ZXIgPSAndG9wJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJyxvcHRpb25zID0gbGlzdChkb20gPSAnQmxmcnRpcCcsYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpLHBhZ2VMZW5ndGggPSA1LCBhdXRvV2lkdGggPSBUUlVFICkpDQpUYWJsYTENCmBgYA0KDQoNCg0KIyAzLiBVbmEgcG9ibGFjacOzbiBlbiBjcmVjaW1pZW50bzogQ8OhbGN1bG9zIGNvbiByDQoNCiMjIDMuMS4gVGFzYSBkZSBjcmVjaW1pZW50byBkZXNkZSAxOTUwDQoNCkNvbiBsb3MgZGF0b3MgY29uIGxvcyBxdWUgY29udGFiYSBxdWlzZSBtb3N0cmFyIGNvbW8gaGFiw61hIHNpZG8gZWwgY3JlY2ltaWVudG8gZGUgbGEgcG9ibGFjacOzbiBkZXNkZSAxOTUwIGhhc3RhIGxhIGFjdHVhbGlkYWQuIFBhcmEgZWxsbyB0b21hbW9zIGNvbW8gYcOxbyBiYXNlIDE5NTAsIHkgY2FsY3VsYW1vcyBsYSB0YXNhIGRlIGNyZWNpbWllbnRvIGHDsW8gYSBhw7FvLg0KDQo+IFRhc2EgZGUgY3JlY2ltaWVudG89IChwb2JsYWNpw7NuIGluaWNpYWwtcG9ibGFjacOzbiBmaW5hbCkvcG9ibGFjacOzbiBpbmljaWFsDQogDQpgYGB7cn0NCmFhIDwtIGRmX3cgJT4lDQogIGFycmFuZ2UgJT4lIG11dGF0ZShjcmVjX3BvYl8xX2FueW8gPSB2YWx1ZSAtIGxhZyh2YWx1ZSkpICU+JQ0KICBtdXRhdGUoY3JlY19wb2JfZGVzZGVfMTk1MCA9IHZhbHVlIC0gZmlyc3QodmFsdWUpKSAlPiUNCiAgbXV0YXRlKGNyZWNfcG9iX3BlcmNlbnQgPSBjcmVjX3BvYl9kZXNkZV8xOTUwIC8gZmlyc3QodmFsdWUpICoxMDApICU+JSB1bmdyb3VwKCkNCg0KYWE8LWFhWy0xLF0NCg0KYmI8LWFhICU+JSBmaWx0ZXIoYcOxbyVpbiVjKDE5NjAsMTk3MCwxOTgwLDE5OTAsMjAwMCwyMDEwLDIwMjApKQ0KDQpiYjwtIGJiICU+JSBtdXRhdGUoYcOxbz1hcy5jaGFyYWN0ZXIoYcOxbykpDQoNCiNDcmVjaW1pZW50byBkZSBsYSBwb2JsYWNpw7NuIGRlc2RlIDE5NTAsIGNyZWNpbWllbnRvIGluaW50ZXJydW1waWRvDQpwPC1nZ3Bsb3QoYmIsYWVzKHg9YcOxbyx5PWNyZWNfcG9iX3BlcmNlbnQsZmlsbD0gYcOxbykpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgDQogICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgDQogICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtsYWJzKHRpdGxlID0gIkNyZWNpbWllbnRvIHBvYmxhY2nDs24gZGVzZGUgMTk1MCBoYXN0YSAyMDIwIix4PSAiQcOxbyIseT0gIlRhc2EgZGUgY3JlY2ltZWludG8oQcOxbyBiYXNlIDE5NTApIiwgY29sb3IgPSAiQcOxbyIpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoY3JlY19wb2JfcGVyY2VudCwgZGlnaXRzID0gMikpLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgDQogICAgICAgICAgICB2anVzdD0gMS4yLCANCiAgICAgICAgICAgIHNpemUgPSA1LCANCiAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIikrDQogIHNjYWxlX3hfZGlzY3JldGUobGFiZWw9YygxOTYwLDE5NzAsMTk4MCwxOTkwLDIwMDAsMjAxMCwyMDIwKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpDQpwDQpgYGANCg0KIyMgMy4yLiBDcmVjaW1pZW50byBhbnVhbA0KDQpMbyBzaWd1aWVudGUgZnVlIGhhY2VyIHVuIGPDoWxjdWxvIHNpbWlsYXIsIHBlcm8gbWlkaWVuZG8gZWwgY3JlY2ltaWVudG8gYcOxbyBhIGHDsW8uIENhYmUgcmVzYWx0YXIgcXVlIGZ1ZSBlbiBsYSBkw6ljYWRhIGRlIGxvcyA4MC05MCBkw7NuZGUgc2Ugb2JzZXJ2YSB1biBjcmVjaW1pZW50byBtw6FzIGVsZXZhZG8uIEF1bnF1ZSBmdWUgZGVzZGUgMTk1MCBhIDE5NzAgZG9uZGUgbmFjacOzIGxhIGdlbmVyYWNpw7NuIGNvbG9xdWlhbG1lbnRlIGxsYW1hZGEgYmFieWJvb21lcnMsZHVyYW50ZSBsb3MgYcOxb3MgODAtOTAgc2Ugb2JzZXJ2YSB1biBjcmVjaW1pZW50byBlbGV2YWRvIGVuIGxhIHBvYmxhY2nDs24uDQoNCmBgYHtyfQ0KcDE8LWdncGxvdChiYixhZXMoeD1hw7FvLHk9Y3JlY19wb2JfMV9hbnlvLGZpbGw9YcOxbykpK2dlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICtsYWJzKHRpdGxlID0gIkNyZWNpbWllbnRvIGRlIGxhIHBvYmxhY2nDs24gYW51YWwiLHg9ICJBw7FvIix5PSBOVUxMLCBjb2xvciA9ICJBw7FvIikrDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChjcmVjX3BvYl8xX2FueW8sIGRpZ2l0cyA9IDApKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIA0KICAgICAgICAgICAgdmp1c3Q9IDEuMiwgDQogICAgICAgICAgICBzaXplID0gNSwgDQogICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIpKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVsPWMoMTk2MCwxOTcwLDE5ODAsMTk5MCwyMDAwLDIwMTAsMjAyMCkpKw0KICB0aGVtZV9taW5pbWFsKCkNCnAxDQpgYGANCg0KDQojIDQuIFBvYmxhY2nDs24gMjAyMA0KDQojIyA0LjEuIExvcyBwYcOtc2VzIG3DoXMgcG9ibGFkb3M6IENoaW5hIGUgSW5kaWENCkNoaW5hICgxLjQ0MCBtaWxsb25lcykgZSBJbmRpYSAoMS4zOTAgbWlsbG9uZXMpIHPDs24gbG9zIHBhw61zZXMgY29uIG1heW9yIHBvYmxhY2nDs24uIExvcyBkb3MgcGHDrXNlcyB0aWVuZW4gbcOhcyBkZSAxLjAwMCBtaWxsb25lcyBkZSBwZXJzb25hcyB5IHJlcHJlc2VudGFuIGVsIDE5JSB5IDE4JSBkZSBsYSBwb2JsYWNpw7NuIG11bmRpYWwgcmVzcGVjdGl2YW1lbnRlLiBMYXMgZXN0aW1hY2lvbmVzIHByZWRpY2VuIHF1ZSBzb2JyZSBlbCBhw7FvIDIwMjcsIEluZGlhIHN1cGVyYXLDoSBhIENoaW5hIGNvbW8gZWwgcGHDrXMgbcOhcyBwb2JsYWRvIGRlbCBtdW5kby4gU2luIGVtYmFyZ28sIHNlIGVzdGltYSBxdWUgQ2hpbmEgcmVkdWNpcsOhIHN1IHBvYmxhY2nDs24gZW4gMzEuNDAwIG1pbGxvbmVzICh1biAyLjIlIG1lbm9zKSBlbnRyZSAyMDE5IHkgMjA1MC4NCg0KYGBge3J9DQpkZl9ub3dvcmxkIDwtc2VsZWN0KGRmX25vd29ybGQsLU5vdGVzLC1UeXBlLC1gUGFyZW50IGNvZGVgKQ0Kbm93b3JsZF9sb25nPC1kZl9ub3dvcmxkICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDQ6NzQsIG5hbWVzX3RvID0gImHDsW8iKQ0KDQpjYzwtbm93b3JsZF9sb25nICU+JSBmaWx0ZXIoYcOxbz09MjAyMCkgJT4lIHNlbGVjdChSZWdpb24sdmFsdWUpIA0KDQpkZl93b3JsZCA8LSBmdWxsX2pvaW4od29ybGQsIGNjLCBieSA9IGMoIm5hbWUiID0gIlJlZ2lvbiIpICkNCmRmX3dvcmxkPC1kZl93b3JsZFsxOjI0MCxdDQpkZl93b3JsZDwtZGZfd29ybGQgJT4lIG11dGF0ZShwb2JfZXN0PWFzLmNoYXJhY3Rlcihwb3BfZXN0KSkNCg0KZGZfd29ybGQyIDwtZGZfd29ybGQgJT4lIG11dGF0ZShQb2JsYWNpb249cG9wX2VzdC8xMF42KQ0KZGZfd29ybGQyPC0gZGZfd29ybGQyICU+JSBzZWxlY3QoUG9ibGFjaW9uKQ0KDQpwdzwtIGdncGxvdChkZl93b3JsZDIpICsgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgZmlsbCA9IFBvYmxhY2lvbikpKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJ3aGl0ZSIpLCBwYW5lbC5ncmlkLm1pbm9yPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIndoaXRlIikpK2xhYnModGl0bGUgPSAiUG9ibGFjacOzbiBtdW5kaWFsIDIwMjAiLGZpbGw9IiBQb2JsYWNpw7NuIFxuIGVuIG1pbGxvbmVzIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBoanVzdCA9IDAuNSkpKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkrc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3Vycz1jKCIjRkZGRkZGRkYiLCIjQ0NGREZGRkYiLCIjOTlGOEZGRkYiLCIjNjZGMEZGRkYiLCIjMzNFNEZGRkYiLCIjMDBBQUNDRkYiLCIjMDA3QTk5RkYiKSkrdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIsaGp1c3QgPSAwLjUpLHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyPSAid2hpdGUiLCBzaXplPSAxLCBmaWxsID0id2hpdGUiKSkNCnB3DQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCnRleHQgPC0gY2MgJCBSZWdpb24NCmRvY3MgPC0gQ29ycHVzIChWZWN0b3JTb3VyY2UgKHRleHQpKQ0KZnJlY3VlbmNpYSA8LSBjYyAkIHZhbHVlDQoNCmRhdGFudWJlPC1kYXRhLmZyYW1lKHdvcmQ9dGV4dCxmcmVxPWZyZWN1ZW5jaWEpDQoNCndvcmRjbG91ZDIoZGF0YW51YmUsIHNoYXBlPSAiY2lyY2xlIiwgc2l6ZSA9IDAuOCkNCmBgYA0KDQoNCg0KIyMgNC4yLiBUT1AgMTAgUGHDrXNlcyBtw6FzIHBvYmxhZG9zDQoNCkVuIGVsIG11bmRvIGhheSAxOTQgcGHDrXNlcyByZWNvbm9jaWRvcyBwb3IgbGEgT05VLCBjb24gc3UgcHJvcGlvIGdvYmllcm5vIHkgY29tcGxldGEgaW5kZXBlbmRlbmNpYS4gU29sbyAxMCBwYcOtc2VzLCBlcyBkZWNpciBlbCAwLDA1JSBkZSBsb3MgcGHDrXNlcyBkZWwgbXVuZG8sIGNvbmNlbnRyYW4gbcOhcyBkZWwgNTAlIGRlIGxhIHBvYmxhY2nDs24gbXVuZGlhbC4gRW4gY29uY3JldG8gZXN0b3MgcGHDrXNlcyByZXByZXNlbnRhbiBlbCA1Nyw3OSUgZGVsIGdsb2JhbC4NCg0KTGEgc2lndWllbnRlIHRhYmxhIG11ZXN0cmEgZWwgcG9yY2VudGFqZSBkZSBjYWRhIHBhw61zIHNvYnJlIGVsIHRvdGFsIGRlIGxhIHBvYmxhY2nDs24gbXVuZGlhbC4NCg0KYGBge3J9DQpkYXRhIDwtIGRhdGEuZnJhbWUgKCBjYXRlZ29yeSA9IGMoIkNoaW5hIiwgIkluZGlhIiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJJbmRvbmVzaWEiLCJQYWtpc3RhbiIsIkJyYXppbCIsIk5pZ2VyaWEiLCJCYW5nbGFkZXNoIiwiUnVzc2lhbiBGZWRlcmF0aW9uIiwiTWV4aWNvIiwiUmVzdG8gZGUgUGHDrXNlcyIpLGNvdW50PWMoMTguNSwxNy43LDQuMjUsMy41MSwyLjgzLDIuNzMsMi42NCwyLjExLDEuODcsMS42NSw0Mi4yMSkpDQoNCmtuaXRyOjprYWJsZShkYXRhKQ0KYGBgDQoNCg0KYGBge3J9DQoNCiNQYXJhIGhhY2VyIGVzdGUgZGF0YSBmcmFtZSBwcmltZXJvIGVzdGltYW1vcyBsb3MgMTAgcGHDrXNlcyBtw6FzIHBvYmxhZG9zIHkgZGVzcHXDqXMgY29uc3RydWltb3MgdW4gbnVldm8gZGF0YWZyYW1lDQojdG9wMTBfMjAyMDwtY2MgJT4lICBzbGljZV9tYXgodmFsdWUsbj0xMCkNCiNkZl93MjwtZGZfdyAlPiUgZmlsdGVyKGHDsW89PTIwMjApICU+JSBzZWxlY3QodmFsdWUsUmVnaW9uKSANCg0KI2RmX3BlcmNlbnQ8LSBmdWxsX2pvaW4oZGZfdzIsIHRvcDEwXzIwMjAsIGJ5ID0gYygiUmVnaW9uIiA9ICJSZWdpb24iLCJ2YWx1ZSI9InZhbHVlIikpDQoNCiNkZl9wZXJjZW50PC1kZl9wZXJjZW50ICU+JSBtdXRhdGUocG9yY2VudGFqZT12YWx1ZS83Nzk0Nzk4LjcqMTAwKQ0KI2RmX3BlcmNlbnQyPC1kZl9wZXJjZW50Wy0xLF0NCg0KDQpkYXRhIDwtIGRhdGEuZnJhbWUgKCBjYXRlZ29yeSA9IGMoIkNoaW5hIiwgIkluZGlhIiwgIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJJbmRvbmVzaWEiLCJQYWtpc3RhbiIsIkJyYXppbCIsIk5pZ2VyaWEiLCJCYW5nbGFkZXNoIiwiUnVzc2lhbiBGZWRlcmF0aW9uIiwiTWV4aWNvIiwiUmVzdG8gZGUgUGHDrXNlcyIpLGNvdW50PWMoMTguNSwxNy43LDQuMjUsMy41MSwyLjgzLDIuNzMsMi42NCwyLjExLDEuODcsMS42NSw0Mi4yMSkpDQoNCmRhdGEkZnJhY3Rpb24gPSBkYXRhJGNvdW50IC8gc3VtKGRhdGEkY291bnQpDQpkYXRhJHltYXggPSBjdW1zdW0oZGF0YSRmcmFjdGlvbikNCg0KZGF0YSR5bWluID0gYygwLCBoZWFkKGRhdGEkeW1heCwgbj0tMSkpDQoNCnJlZDwtZ2dwbG90KGRhdGEsIGFlcyh5bWF4PXltYXgsIHltaW49eW1pbiwgeG1heD00LCB4bWluPTMsIGZpbGw9Y2F0ZWdvcnkpKSArZ2VvbV9yZWN0KCkgK2Nvb3JkX3BvbGFyKHRoZXRhPSJ5IikreGxpbShjKDIsIDQpKSt0aGVtZV92b2lkKCkgK2xhYnModGl0bGUgPSAiVE9QIDEwIFxuIFBhw61zZXMgbcOhcyBwb2JsYWRvcyIsZmlsbCA9IE5VTEwpICt0aGVtZSAocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCAoaGp1c3QgPSAwLjUgKSxsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZT0gImJvbGQiKSxsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIixsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQ0KcmVkDQoNCmBgYA0KDQoNCiMgNS4gRGF0b3Mgc29icmUgY29udGluZW50ZXMNCg0KTcOhcyBkZWwgNTAlIGRlIGxhIHBvYmxhY2nDs24gbXVuZGlhbCBzZSBjb25jZW50cmEgZW4gQXNpYSwgc2VndWlkbyBkZSDDgWZyaWNhIGNvbiBhbGdvIG3DoXMgZGUgdW4gMTclLCB1biAxMCUgZW4gRXVyb3BhICg3NTAgbWlsbG9uZXMpLCB1biA4JSBlbiBMYXRpbm9hbcOpcmljYSB5IGVsIENhcmliZSAoNjUwIG1pbGxvbmVzKSB5IGVsIDUlIHJlc3RhbnRlIGVuIEFtw6lyaWNhIGRlbCBOb3J0ZSAoMzcwIG1pbGxvbmVzKSB5IE9jZWFuw61hICg0MyBtaWxsb25lcykuDQoNCmBgYHtyfQ0KI1BhcmEgaGFjZXIgbG9zIGNhbGN1bG9zIHNvYnJlIHBvcmNlbnRhamVzOiANCiNsb25nX2NvbnR3PC1kYyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjE1MiwgbmFtZXNfdG8gPSAiYcOxbyIpDQojbG9uZ19jb250d18yMDIwPC1sb25nX2NvbnR3ICU+JSBmaWx0ZXIoYcOxbyA9PSAyMDIwKQ0KDQojc3M8LSBsb25nX2NvbnR3JT4lICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gIlJlZ2lvbiIsIHZhbHVlc19mcm9tID0gInZhbHVlIikNCg0KI2NvbnRfcGVyPC1zcyAlPiUgZmlsdGVyKGHDsW89PTIwMjApICU+JSBtdXRhdGUocGVyY2VudF9hc2lhPUFzaWEvV29ybGQqMTAwKSAlPiUgbXV0YXRlKHBlcmNlbnRfYWZyaWNhPUFmcmljYS9Xb3JsZCoxMDApICU+JSBtdXRhdGUocGVyY2VudF9FdXJvcGE9RXVyb3BlL1dvcmxkKjEwMCkgJT4lIG11dGF0ZShwZXJjZW50X09jZWFuaWE9T2NlYW5pYS9Xb3JsZCoxMDApICU+JSBtdXRhdGUocGVyY2VudF9Ob3J0ZUE9YE5vcnRoZXJuIEFtZXJpY2FgL1dvcmxkKjEwMCkgJT4lIG11dGF0ZShwZXJjZW50X0xhdGluQT1gTGF0aW4gQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbmAvV29ybGQqMTAwKQ0KDQpncm91cDwtYygiw4FmcmljYSIsICJBc2lhIiwiRXVyb3BhIiwiTGF0aW5vIEFtw6lyaWNhIHkgQ2FyaWJlIiwiTm9ydGUgQW3DqXJpY2EiLCJPY2VhbsOtYSIpDQoNCnZhbHVlPC1jKDE3LjIsIDU5LjUsOS41OSw4LjM5LDQuNzMsMikNCg0KZGF0YXRyZWU8LWRhdGEuZnJhbWUoZ3JvdXAsdmFsdWUpDQoNCnRyZWUgPC0gdHJlZW1hcChkYXRhdHJlZSwNCiAgICAgICAgaW5kZXg9Imdyb3VwIiwNCiAgICAgICAgdlNpemU9InZhbHVlIiwNCiAgICAgICAgdHlwZT0iaW5kZXgiLCBhbGlnbi5sYWJlbHM9bGlzdCgNCiAgICAgICAgICBjKCJjZW50ZXIiLCAiY2VudGVyIiksIA0KICAgICAgICAgIGMoInJpZ2h0IiwgImJvdHRvbSIpKSxwYWxldHRlPSJQYXN0ZWwyIix0aXRsZSA9ICIlIFBvYmxhY2nDs24gbXVuZGlhbCBwb3IgY29udGluZW50ZXMiICkNCg0KYGBgDQoNCg0KIyMgNS4xLkV2b2x1Y2nDs24gZGUgbGEgcG9ibGFjacOzbiBkZSAxOTUwIGhhc3RhIDIwMjANCg0KRW4gMTk1MCwgbGEgZXN0aW1hY2nDs24gcGFyYSBsYSBwb2JsYWNpw7NuIG11bmRpYWwgZXJhIGRlIDIuNjAwIG1pbGxvbmVzIGRlIHBlcnNvbmFzLiBFbiAxOTg3IHNlIGFsY2FuemFyb24gbG9zIDUuMDAwIG1pbGxvbmVzLCB5IGVuIDE5OTksIGxvcyA2LjAwMCBtaWxsb25lcy4NClBhcmEgb2N0dWJyZSBkZSAyMDExLCBsYSBlc3RpbWFjacOzbiBwYXJhIGxhIHBvYmxhY2nDs24gbXVuZGlhbCBlcmEgZGUgNy4wMDAgbWlsbG9uZXMgZGUgcGVyc29uYXMuIFkgZW4gbG9zIHByw7N4aW1vcyAzMCBhw7FvcyBzZSBlc3BlcmEgcXVlIGxhIHBvYmxhY2nDs24gbXVuZGlhbCBhdW1lbnRlIGVuIDIuMDAwIG1pbGxvbmVzIGRlIHBlcnNvbmFzLCBzZSBwYXNhcsOtYSBkZSBsb3MgNy43MDAgbWlsbG9uZXMgZGUgcGVyc29uYXMgcXVlIGhheSBlbiBsYSBhY3R1YWxpZGFkIGEgOS43MDAgbWlsbG9uZXMgZW4gMjA1MCxsbGVnYW5kbyBhIHVuIG3DoXhpbW8gZGUgMTEuMDAwIG1pbGxvbmVzIGRlIHBlcnNvbmFzIHBhcmEgMjEwMC4gDQoNCmBgYHtyfQ0KDQpkYzwtZGNbLTEsXQ0KbG9uZ19jb250PC1kYyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjE1MiwgbmFtZXNfdG8gPSAiYcOxbyIpDQoNCmxvbmdfY29udDwtbG9uZ19jb250ICU+JSBtdXRhdGUoYcOxbz1hcy5udW1lcmljKGHDsW8pKSU+JSBtdXRhdGUodmFsdWU9dmFsdWUvMTBeNikNCg0KZXZjb250IDwtIGdncGxvdChsb25nX2NvbnQsYWVzKHg9IGHDsW8sIHk9IHZhbHVlKSkgKyANCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBvYmxhY2nDs24gcG9yIGNvbnRpbmVudGUiLA0KICAgICAgIHg9ICJBw7FvIiwNCiAgICAgICB5PSAiUG9ibGFjacOzbiIsDQogICAgICAgY29sb3IgPSAiUmVnaW9uIikgK2dlb21fcG9pbnQoYWVzKGNvbG9yPSBSZWdpb24pLCBzaXplPSAzKSArDQogIGdlb21fbGluZShhZXMoY29sb3I9IFJlZ2lvbiksIHNpemU9IDEuNSkrDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBmYWNlID0gImJvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpKyBsYWJzKHkgPSAiUG9ibGFjacOzbiBlbiBtaWxlcyBkZSBtaWxsb25lcyIsIGNvbG9yID0gIkNvbnRpbmVudGUiKQ0KDQpldmNvbnQrdHJhbnNpdGlvbl9yZXZlYWwoYcOxbykgKyB2aWV3X2ZvbGxvdygpDQpgYGANCg0KIyMgNS4yLiDDgWZyaWNhLCBlbCBjb250aW5lbnRlIHF1ZSBtw6FzIHLDoXBpZG8gY3JlY2UNCg0KU2UgZXN0aW1hIHF1ZSBsYSBtaXRhZCBkZWwgY3JlY2ltaWVudG8gZGVtb2dyw6FmaWNvIG11bmRpYWwgZGVzZGUgaG95IGhhc3RhIDIwNTAgdGVuZHLDoSBsdWdhciBlbiDDgWZyaWNhLiBFc3RlIGNvbnRpbmVudGUgY3VlbnRhIGNvbiBsYSB0YXNhIGRlIGNyZWNpbWllbnRvIGRlbW9ncsOhZmljbyBtw6FzIGFsdGEsIHkgc2UgcHJldsOpIHF1ZSBwYXJhIDIwNTAgZWwgw4FmcmljYSBzdWJzYWhhcmlhbmEgZG9ibGUgc3UgcG9ibGFjacOzbi4gTG8gcXVlIGluZGljYSB1biByw6FwaWRvIGNyZWNpbWllbnRvIGRlIGxhIHBvYmxhY2nDs24sIHkgYXVucXVlIHNlIHJlZHV6Y2FuIGNvbnNpZGVyYWJsZW1lbnRlIGxvcyBuaXZlbGVzIGRlIGZlY3VuZGlkYWQgZW4gbG9zIHByw7N4aW1vcyBhw7FvcywgeSBhIHBlc2FyIGRlIGxhIGluY2VydGlkdW1icmUgcXVlIGV4aXN0ZSBlbiBjdWFudG8gYSBsYXMgcHLDs3hpbWFzIHRlbmRlbmNpYXMgZGUgZmVjdW5kaWRhZCBlbiDDgWZyaWNhLCBoYXkgdW5hIGFsdGEgY2FudGlkYWQgZGUgZGUgasOzdmVuZXMgZW4gZXN0ZSBjb250aW5lbnRlIHF1ZSBhbGNhbnphcsOhbiBsYSBlZGFkIGFkdWx0YSBlbiBwb2NvcyBhw7FvcyB5IHRhbWJpw6luIHRlbmRyw6FuIGhpam9zLg0Kw4FmcmljYSBkZXNlbXBlw7FhcsOhIHVuIHBhcGVsIGVzZW5jaWFsIGVuIGN1YW50byBhIGxhcyBkaW1lbnNpb25lcyB5IGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgcG9ibGFjacOzbiBtdW5kaWFsIGVuIGxhcyBwcsOzeGltYXMgZMOpY2FkYXMuDQoNCmBgYHtyfQ0KDQpsb25nX2NvbnR3PC1kYyAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjE1MiwgbmFtZXNfdG8gPSAiYcOxbyIpDQpsb25nX2NvbnR3X0Y8LWxvbmdfY29udHcgJT4lIGZpbHRlcihhw7FvICVpbiUgKDIwMjE6MjEwMCkpICU+JSBtdXRhdGUodmFsdWU9dmFsdWUvMTBeNikNCg0KbG9uZ19jb250d19GPC0gbG9uZ19jb250d19GICU+JSBtdXRhdGUoYcOxbz1hcy5udW1lcmljKGHDsW8pKQ0KDQpldmNvbnQyIDwtIGdncGxvdChsb25nX2NvbnR3X0YsYWVzKHg9IGHDsW8sIHk9IHZhbHVlKSkgKyANCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIHBvYmxhY2nDs24gcG9yIGNvbnRpbmVudGUiLA0KICAgICAgIHg9ICJBw7FvIiwNCiAgICAgICB5PSAiUG9ibGFjacOzbiIsDQogICAgICAgY29sb3IgPSAiUmVnaW9uIikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj0gUmVnaW9uKSwgc2l6ZT0gMykgKw0KICBnZW9tX2xpbmUoYWVzKGNvbG9yPSBSZWdpb24pLCBzaXplPSAxLjUpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgZmFjZSA9ICJib2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDEpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpKyBsYWJzKHkgPSAiUG9ibGFjacOzbiBlbiBtaWxlcyBkZSBtaWxsb25lcyIsIGNvbG9yID0gIkNvbnRpbmVudGUiKQ0KDQpldmNvbnQyDQpgYGANCg0KDQojIDYuIFRyYWJham9zIGVuIGxvcyBxdWUgdGUgaGFzIGJhc2Fkbw0KDQpQYXJhIGhhY2VyIGVzdGUgdHJhYmFqbyB0b23DqSBjb21vIHJlZmVyZW5jaWEgdW4gYXJ0aWN1bG8gcHVibGljYWRvIGVuIGxhIHDDoWdpbmEgd2ViIGRlIE5hY2lvbmVzIFVuaWRhcywgcG9kcsOpaXMgZW5jb250cmFybG8gbWVkaWFudGUgZXN0ZSBlbmxhY2UgPGh0dHBzOi8vd3d3LnVuLm9yZy9lcy9nbG9iYWwtaXNzdWVzL3BvcHVsYXRpb24+Lg0KVGFtYmnDqW4gdG9tZSBjb21vIHJlZmVyZW5jaWEgYWxndW5vcyBncsOhZmljb3MgcHVibGljYWRvcyBlbiBTdGF0aXN0YS4gPGh0dHBzOi8vZXMuc3RhdGlzdGEuY29tL2VzdGFkaXN0aWNhcy82MzUxMjIvZXZvbHVjaW9uLWRlLWxhLXBvYmxhY2lvbi1tdW5kaWFsLz4uDQpZIHNvYnJlIHRvZG8gbWUgc2lydmllcm9uIGRlIGd1w61hIGxvcyB0dXRvcmlhbGVzIGRlIGxhIHDDoWdpbmEgd2ViIGRlbCBjdXJzbyA8aHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViPiAsIGFzw60gY29tbyBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zLCB0YW50byBkZSBlc3RlIGN1cnNvIGNvbW8gZGUgY3Vyc29zIGFudGVyaW9yZXMuDQoNCg0KIyBbNy4gQmliaWxvZ3JhZsOtYV17LnZlcmRlY2l0b30NCg0KDQo8aHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjEtMjItd2ViL2luZGV4Lmh0bWw+IC4NCg0KPGh0dHBzOi8vci1jaGFydHMuY29tPg0KDQo8aHR0cHM6Ly9ycHVicy5jb20vPg0KDQo8aHR0cHM6Ly9jb25jZXB0by5kZS9jcmVjaW1pZW50by1wb2JsYWNpb25hbC8+DQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ0luZm9ybWFjacOzbiBkZSBtaSBSLXNlc2nDs246JykgDQpgYGANCg0KDQo=