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í.


1. Introducción

Siempre hemos oido que la eduación era clave para nosotros. No solo para nuestro desarrollo personal, si no para mejorar nuestras condiciones de vida. Además, para los que hemos estudiado economía, tambien sabemos que la educacion es un aspecto clave del crecimiento economico. En este breve trabajo, analizaremos si de verdad nos merece la pena invertir en nosotros mismos a través de la educacion, y también observaremos varios datos curiosos relacionados con la educación tales como el Informe Pisa.


2. Datos

DATOS

La mayoria de datos que he utilizado para elaborar el trabajo los he obtenido del paquete wbstats, es decir, que proceden de la base de datos del Banco Mundial. Además, para observar los datos del Informe Pisa, hemos utilizado el paquete learningtower, y, por último, para analizar la estructura salarial española por nivel de educación, nos descargarmos los datos en un excel desde el INE, y posteriormente los modificamos y representamos con R.


EJEMPLO WBSTATS

Primero de todo para obtener datos a través de wbstats hay que saber que datos queremos obtener, esto es, el indicador. Para saber el indicador, podemos realizar una busqueda de la siguiente forma:

gdp <- wbsearch(pattern = “gdp”, field = “indicator”)

Una vez hecho esto, podemos abrir el dataframe creado y filtrar que indicador queremos, en este ejemplo, filtraremos el pibpc en dolares constantes de 2011 para anular el efecto de la inflacion.

Para obtener los datos hariamos lo siguiente: wb(indicator = “6.0.GDPpc_constant”, startdate = 2000, enddate = 2016, POSIXct = TRUE))

Donde startdate y enddate son las fechas iniciales y finales respectivamente que queremos filtrar. Si queremos un país en concreto, podemos filtrar por país:

wb(indicator = “6.0.GDPpc_constant”, country = “ESP”, startdate = 2000, enddate = 2016, POSIXct = TRUE))

De todos modos, en los apartados pondremos una sección de codigo para que se pueda observar el proceso de obtencion de datos, su modificacion y su representacion.

3. “Curiosidades”

En este apartado vamos a comentar diversos datos curiosos e interesantes relacionados con la educacion en los diferentes paises del mundo, como las puntuaciones del Informe PISA y la inversion publica en educacion.

3.1 Informe Pisa

PISA

A continuacion obtendremos los datos correspondientes a el Informe PISA y elaboraremos una tabla para poder consultar estos datos.

En ella podemos consultar cualquier año, pais, categoria, etc. Por ejemplo vamos a consultar España en el año 2015. Podemos observar la media de las puntuaciones obtenidas por diferentes estudiantes para la categoria de matematicas, ciencia y lectura. Cabe destacar que los datos de esta tabla estan “arreglados”, ya que al descargarse los datos originales tenemos la puntuacion de cada estudiante en cada materia, si dispone de ordenador, estudios de los progenitores, si dispone de TV en su habitacion, etc. Nosotros solo queriamos mostrar las puntuaciones finales, si se desea ahondar mas en estos datos tan interesantes lo dejamos en manos de nuestros lectores (las instrucciones estan disponibles en el apartado de codigo).

También vamos a realizar un simple grafico para analizar la puntuacion media total (la media de las tres “asiganturas”) a lo largo de los ultimos años de España, Alemania y EEUU.

En el gráfico se puede observar como EEUU nos saca una gran ventaja a Alemania y España. Nosotros nos alternamos con Alemania, aunque estamos un mayor periodo de tiempo por arriba que los alemanes, cosa que parece que va a cambiar por la evolucion en los últimos años. Cabe destacar la gran caida de EEUU desde 2012, y una caida de España desde el mismo periodo aunque no tan pronunciada.

CODIGO

##inform pisa
install.packages("learningtower")
library(learningtower)
library(tidyr)
library(ggplot2)
library(TD)

#obtencion datos generales pisa

pisa_0018 <- load_student("all")

pisa_0018_tabla <- pisa_0018 %>% select(year, country, math, read, science)

pisa_prueba <- pisa_0018_tabla %>% group_by(year, country) %>% summarise(media_mat = mean(math, na.rm = TRUE), media_read = mean(read), media_sciencie = mean(science))


#Tabla Pisa

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

#Grafico Pisa

pisa_graf <- pisa_prueba

pisa_graf$media_total_pisa <- apply(pisa_prueba[ ,c(3,4,5)], 1, mean, na.rm = TRUE)


pisa_graf_graf <- pisa_graf %>% filter(country %in% c("ESP", "DEU", "USA"))


graf_pis <- ggplot(pisa_graf_graf, aes(x = year, y = media_total_pisa, colour = country, group = country)) +
                              geom_line() + geom_point()

graf_pis


3.2 Inversion en Educación

INVERSION

En este apartado vamos a centrarnos en la inversion publica en educacion de diferentes paises y zonas del mundo. Los datos los obtendremos de la base de datos del banco mundial. Realizaremos una tabla donde se puede consultar por año y pais el % del PIB en educacion invertido.

A continucacion, tambien hemos realizado un “Bart Chart Race” básico para ver como ha evolucionado en los últimos años la inversion en educacion de diferentes zonas del mundo.

Cabe destacar, sobre todo, que el este y el sur de Africa este, en general, a la cabeza o en los primeros puestos estos últimos años en lo que a inversion en educacion se refiere.

CODIGO

library(DT)
library(wbstats)
library(ggplot2)
library(gganimate)
library(tidyr)
library(tidyverse)


public_exp_ed<- wb(indicator =c("SE.XPD.TOTL.GD.ZS"),
                   startdate = 2000, enddate = 2020, POSIXct = TRUE)


public_exp_tab <- public_exp_ed %>% select(date, country, value)

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



public_exp_graf <- public_exp_ed %>% select(date, iso3c, country, value) %>% rename(pais = country, year = date) %>%
  filter(iso3c %in% c("EUU", "EAS", "ECS", "SAS", "AFE", "AFW", "LCN")) %>% filter(year %in% c(2010:2018)) %>% group_by(pais) %>% arrange(value)

public_exp_graf$year <- as.numeric(public_exp_graf$year)


grafico_animado_gdp <- ggplot(public_exp_graf, aes(x = pais, y = value, group = pais, fill = pais)) + geom_col() + coord_flip() + transition_time(year) + 
  labs(title = 'Year: {frame_time}', x = 'IInversion Educacion como %GDP', y = 'Conjunto Paises') + theme(legend.position = "none")


animate(grafico_animado_gdp,100,10)


4.Desempleo y Educación

DESEMPLEO

A continuacion vamos a analizar si la tasa de desempleo guarda una relacion con la educación, concretamente con el nivel de estudios. Lo haremos gracias a la base de datos del Banco Mundial, y nos centraremos en los siguientes paises: Alemania, España y EEUU. Para ello realizaremos tres gráficos y un gráfico que integre los tres anteriores. En ellos se veran las distintas tasas de desempleo a lo largo del periodo 2000-2016 desagregadas por nivel de educación(En la leyenda, ADVN = Estudios avanzados, BASC = Estudios Basicoc, INTM = Estudios Intermedios).

En los tres paises se observa el mismo patron, la evolucion de la tasa de paro es muy similar, practicamente identica, pero lo curioso es lo siguiente, en los 3 paises, la tasa de desempleo es menos cuanto mayor es el nivel de estudios. Con lo cual, podemos afirmar, al menos para estos paises, que el desempleo esta relacionado inversamente con la educacion, a mayor nivel de estudios menor nivel de desempleo.

A continuacion realizaremos el grafico “multiple” para poder apreciarlo mejor.

En este grafico se aprecia aun mejor, la situacion comentada anteriormente se da en los 3 paises. Cabe destacar, por cierto, los altos niveles de desempleo españoles, pero esto es un tema aparte.

CODIGO

#grafico desempleo por nivel de estudios, pais y año #ESPAÑA

unemp_nivel_es <- wb(country = "ESP", 
                     indicator =c("SL.UEM.BASC.ZS", "SL.UEM.INTM.ZS", "SL.UEM.ADVN.ZS"),
                     startdate = 2000, enddate = 2016, POSIXct = TRUE)


unemp_nivel_es <- unemp_nivel_es %>% select(date_ct, value, indicatorID) 


graf_es_des <- ggplot(unemp_nivel_es, aes(x = date_ct ,y = value, color = indicatorID, group = indicatorID)) + geom_point() + geom_line() + theme(panel.background = element_rect(fill = "gray28",
                                                                                                                                                                                  colour = "white"), plot.background = element_rect(fill = "aliceblue",
                                                                                                                                                                                                                                    colour = "bisque")) +labs(title = "Desempleo por nivel de Estudios ESPAÑA",
                                                                                                                                                                                                                                                              x = "Fecha", y = "Tasa Desempleo", colour = "Nivel de Estudios") + theme(panel.background = element_rect(fill = "antiquewhite"))
graf_es_des



#grafico desempleo por nivel de estudios, pais y año #EEUU

unemp_nivel_US <- wb(country = "US", 
                     indicator =c("SL.UEM.BASC.ZS", "SL.UEM.INTM.ZS", "SL.UEM.ADVN.ZS"),
                     startdate = 2000, enddate = 2016, POSIXct = TRUE)


unemp_nivel_US <- unemp_nivel_US %>% select(date_ct, value, indicatorID) 


graf_US_des <- ggplot(unemp_nivel_US, aes(x = date_ct ,y = value, color = indicatorID, group = indicatorID)) + geom_point() + geom_line() + theme(panel.background = element_rect(fill = "gray28",
                                                                                                                                                                                  colour = "white"), plot.background = element_rect(fill = "aliceblue",
                                                                                                                                                                                                                                    colour = "bisque")) +labs(title = "Desempleo por nivel de Estudios EEUU",
                                                                                                                                                                                                                                                             x = "Fecha", y = "Tasa Desempleo", colour = "Nivel de Estudios") + theme(panel.background = element_rect(fill = "antiquewhite")) 
graf_US_des

#grafico desempleo por nivel de estudios, pais y año #ALEMANIA                                          

unemp_nivel_DEU <- wb(country = "DEU", 
                      indicator =c("SL.UEM.BASC.ZS", "SL.UEM.INTM.ZS", "SL.UEM.ADVN.ZS"),
                      startdate = 2000, enddate = 2016, POSIXct = TRUE)


unemp_nivel_DEU <- unemp_nivel_DEU %>% select(date_ct, value, indicatorID) 


graf_DEU_des <- ggplot(unemp_nivel_DEU, aes(x = date_ct ,y = value, color = indicatorID, group = indicatorID)) + geom_point() + geom_line() + theme(panel.background = element_rect(fill = "gray28",
                                                                                                                                                                                    colour = "white"), plot.background = element_rect(fill = "aliceblue",
                                                                                                                                                                                                                                      colour = "bisque")) +labs(title = "Desempleo por nivel de Estudios ALEMANIA",
                                                                                                                                                                                                                                                                x = "Fecha", y = "Tasa Desempleo", colour = "Nivel de Estudios") + theme(panel.background = element_rect(fill = "antiquewhite")) 

graf_DEU_des


#Combinacio graficos anteriores

unemp_nivel <- wb(country = c("DEU", "ESP", "US"), 
                  indicator =c("SL.UEM.BASC.ZS", "SL.UEM.INTM.ZS", "SL.UEM.ADVN.ZS"),
                  startdate = 2000, enddate = 2016, POSIXct = TRUE)

des_tres_pais <- ggplot(unemp_nivel, aes(x = date_ct ,y = value, color = indicatorID, group = indicatorID)) + geom_point() + geom_line() + theme(panel.background = element_rect(fill = "gray28",
                                                                                                                                                                                 colour = "white"), plot.background = element_rect(fill = "aliceblue",
                                                                                                                                                                                                                                   colour = "bisque")) +labs(title = "Desempleo por nivel de Estudios",
                                                                                                                                                                                                                                                             x = "Fecha", y = "Tasa Desempleo", colour = "Nivel de Estudios") + theme(panel.background = element_rect(fill = "antiquewhite")) +
  facet_wrap(~country)

des_tres_pais


5.Salarios y Educacion en España

SALARIOS

Por último, vamos a analizar el salario por nivel de estudios gracias a los datos que nos proporciona el INE respecto a la estructura salarial. Para ello nos hemos descargado una hoja de excel del INE y la hemos importado a R para poder visualizarla.

Como observamos en el gráfico, pasa algo similar a lo comentado en el apartado del desempleo, a mayor nivel de estudios, mayor salario bruto mensual, siendo los mayores salarios para los estudios superiores y los menores para los analfabetos.

CODIGO

salarios <- rio::import(here::here("datos", "Salarios_nivel_educacion.xlsx"))

salarios <- salarios %>% select(`NIVELES DE FORMACION`, Periodo, Total) 

salarios <- as.data.frame(salarios)

salarios <- salarios %>% rename( Salario_bruto_mensual = Total, Fecha = Periodo, Nivel_Formacion = `NIVELES DE FORMACION`)



graf_salarios <- ggplot(salarios, aes(x = Fecha, y = Salario_bruto_mensual, color = Nivel_Formacion, group = Nivel_Formacion))+ geom_line() + geom_point() + 
  theme(plot.margin = unit (c(1,1,1,1), "cm")) +
  theme(panel.background = element_rect(size = 1),
    plot.background = element_rect(size = 0),
    legend.position = "top", legend.direction = "horizontal")  + theme(panel.background = element_rect(fill = "gray81")) + theme(legend.position = "bottom") +labs(title = "Salario por nivel de educacion",
    subtitle = "España, 2014/2020") + theme(legend.background = element_rect(fill = "gray93"))
    

ggplotly(graf_salarios)

6. Conclusion

A traves del breve trabajo realizado, he llegado a la conclusion de que desde el punto de vista personal, nos merece la pena y mucho invertir en nosotros mismos a través de la educación, ya que, como vimos en los apartados 4 y 5, un mayor nivel de educacion (entendida como un mayor nivel de estudios) nos proporciona una mayor probabilidad de encontrar empleo y además con un salario mayor en comparacion con otros individuos con menor nivel de estudios. Podemos afirmar, sin ninguna duda, que invertir en nuestra educacion es muy rentable.

7. Bibliografía

Estructura salarial

Datos wbstats

Bart Chart Race





Información de mi R-sesión:

- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2022-01-03                  

- Packages -------------------------------------------------------------------
 package       * version    date       lib source                        
 assertthat      0.2.1      2019-03-21 [1] CRAN (R 4.1.1)                
 backports       1.2.1      2020-12-09 [1] CRAN (R 4.1.0)                
 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.1)                
 cellranger      1.1.0      2016-07-27 [1] CRAN (R 4.1.1)                
 cli             3.0.1      2021-07-17 [1] CRAN (R 4.1.1)                
 clipr           0.7.1      2020-10-08 [1] CRAN (R 4.1.1)                
 colorspace      2.0-2      2021-06-24 [1] CRAN (R 4.1.1)                
 crayon          1.4.2      2021-10-29 [1] CRAN (R 4.1.1)                
 crosstalk       1.1.1      2021-01-12 [1] CRAN (R 4.1.1)                
 curl            4.3.2      2021-06-23 [1] CRAN (R 4.1.1)                
 data.table      1.14.0     2021-02-21 [1] CRAN (R 4.1.1)                
 DBI             1.1.1      2021-01-15 [1] CRAN (R 4.1.1)                
 dbplyr          2.1.1      2021-04-06 [1] CRAN (R 4.1.1)                
 desc            1.3.0      2021-03-05 [1] CRAN (R 4.1.1)                
 details         0.2.1      2020-01-12 [1] CRAN (R 4.1.1)                
 digest          0.6.28     2021-09-23 [1] CRAN (R 4.1.1)                
 dplyr         * 1.0.7      2021-06-18 [1] CRAN (R 4.1.1)                
 DT            * 0.19       2021-09-02 [1] CRAN (R 4.1.1)                
 ellipsis        0.3.2      2021-04-29 [1] CRAN (R 4.1.1)                
 evaluate        0.14       2019-05-28 [1] CRAN (R 4.1.1)                
 fansi           0.5.0      2021-05-25 [1] CRAN (R 4.1.1)                
 farver          2.1.0      2021-02-28 [1] CRAN (R 4.1.1)                
 fastmap         1.1.0      2021-01-25 [1] CRAN (R 4.1.1)                
 forcats       * 0.5.1      2021-01-27 [1] CRAN (R 4.1.1)                
 foreign         0.8-81     2020-12-22 [2] CRAN (R 4.1.1)                
 fs              1.5.0      2020-07-31 [1] CRAN (R 4.1.1)                
 generics        0.1.1      2021-10-25 [1] CRAN (R 4.1.1)                
 gganimate     * 1.0.7      2020-10-15 [1] CRAN (R 4.1.1)                
 ggplot2       * 3.3.5      2021-06-25 [1] CRAN (R 4.1.1)                
 gifski          1.4.3-1    2021-05-02 [1] CRAN (R 4.1.1)                
 glue            1.5.0      2021-11-07 [1] CRAN (R 4.1.2)                
 gtable          0.3.0      2019-03-25 [1] CRAN (R 4.1.1)                
 haven           2.4.3      2021-08-04 [1] CRAN (R 4.1.1)                
 here            1.0.1      2020-12-13 [1] CRAN (R 4.1.1)                
 highr           0.9        2021-04-16 [1] CRAN (R 4.1.1)                
 hms             1.1.1      2021-09-26 [1] CRAN (R 4.1.2)                
 htmltools       0.5.2      2021-08-25 [1] CRAN (R 4.1.1)                
 htmlwidgets     1.5.4      2021-09-08 [1] CRAN (R 4.1.1)                
 httr            1.4.2      2020-07-20 [1] CRAN (R 4.1.1)                
 jquerylib       0.1.4      2021-04-26 [1] CRAN (R 4.1.1)                
 jsonlite        1.7.2      2020-12-09 [1] CRAN (R 4.1.1)                
 klippy        * 0.0.0.9500 2021-12-14 [1] Github (rlesur/klippy@378c247)
 knitr         * 1.36       2021-09-29 [1] CRAN (R 4.1.1)                
 labeling        0.4.2      2020-10-20 [1] CRAN (R 4.1.0)                
 lazyeval        0.2.2      2019-03-15 [1] CRAN (R 4.1.1)                
 learningtower * 1.0.0      2021-09-06 [1] CRAN (R 4.1.2)                
 lifecycle       1.0.1      2021-09-24 [1] CRAN (R 4.1.1)                
 lubridate       1.7.10     2021-02-26 [1] CRAN (R 4.1.1)                
 magrittr        2.0.1      2020-11-17 [1] CRAN (R 4.1.1)                
 modelr          0.1.8      2020-05-19 [1] CRAN (R 4.1.1)                
 munsell         0.5.0      2018-06-12 [1] CRAN (R 4.1.1)                
 openxlsx        4.2.4      2021-06-16 [1] CRAN (R 4.1.1)                
 pillar          1.6.4      2021-10-18 [1] CRAN (R 4.1.1)                
 pkgconfig       2.0.3      2019-09-22 [1] CRAN (R 4.1.1)                
 plotly        * 4.9.4.1    2021-06-18 [1] CRAN (R 4.1.1)                
 plyr            1.8.6      2020-03-03 [1] CRAN (R 4.1.1)                
 png             0.1-7      2013-12-03 [1] CRAN (R 4.1.0)                
 prettyunits     1.1.1      2020-01-24 [1] CRAN (R 4.1.1)                
 progress        1.2.2      2019-05-16 [1] CRAN (R 4.1.1)                
 purrr         * 0.3.4      2020-04-17 [1] CRAN (R 4.1.1)                
 R6              2.5.1      2021-08-19 [1] CRAN (R 4.1.1)                
 Rcpp            1.0.7      2021-07-07 [1] CRAN (R 4.1.1)                
 readr         * 2.0.2      2021-09-27 [1] CRAN (R 4.1.1)                
 readxl          1.3.1      2019-03-13 [1] CRAN (R 4.1.1)                
 reprex          2.0.1      2021-08-05 [1] CRAN (R 4.1.1)                
 rio             0.5.27     2021-06-21 [1] CRAN (R 4.1.1)                
 rlang           0.4.12     2021-10-18 [1] CRAN (R 4.1.1)                
 rmarkdown       2.11       2021-09-14 [1] CRAN (R 4.1.1)                
 rprojroot       2.0.2      2020-11-15 [1] CRAN (R 4.1.1)                
 rstudioapi      0.13       2020-11-12 [1] CRAN (R 4.1.1)                
 rvest           1.0.2      2021-10-16 [1] CRAN (R 4.1.2)                
 sass            0.4.0      2021-05-12 [1] CRAN (R 4.1.1)                
 scales          1.1.1      2020-05-11 [1] CRAN (R 4.1.1)                
 sessioninfo     1.1.1      2018-11-05 [1] CRAN (R 4.1.1)                
 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.1)                
 tibble        * 3.1.4      2021-08-25 [1] CRAN (R 4.1.1)                
 tidyr         * 1.1.3      2021-03-03 [1] CRAN (R 4.1.1)                
 tidyselect      1.1.1      2021-04-30 [1] CRAN (R 4.1.1)                
 tidyverse     * 1.3.1      2021-04-15 [1] CRAN (R 4.1.1)                
 tweenr          1.0.2      2021-03-23 [1] CRAN (R 4.1.1)                
 tzdb            0.1.2      2021-07-20 [1] CRAN (R 4.1.1)                
 utf8            1.2.2      2021-07-24 [1] CRAN (R 4.1.1)                
 vctrs           0.3.8      2021-04-29 [1] CRAN (R 4.1.1)                
 viridisLite     0.4.0      2021-04-13 [1] CRAN (R 4.1.1)                
 wbstats       * 1.0.4      2020-12-05 [1] CRAN (R 4.1.1)                
 withr           2.4.2      2021-04-18 [1] CRAN (R 4.1.1)                
 xfun            0.28       2021-11-04 [1] CRAN (R 4.1.2)                
 xml2            1.3.2      2020-04-23 [1] CRAN (R 4.1.1)                
 yaml            2.2.1      2020-02-01 [1] CRAN (R 4.1.0)                
 zip             2.2.0      2021-05-31 [1] CRAN (R 4.1.1)                

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






LS0tDQp0aXRsZTogIkFuYWxpc2lzIGRlIGxhIEVkdWNhY2lvbiINCnN1YnRpdGxlOiAiQWxlamFuZHJvIFBlcmV6IFNhbmNoaXoocGVzYW5hMkBhbHVtbmkudXYuZXMpIiAjLSBwb25nbyB0w7ogbm9tYnJlIGFow60gcGFyYSBxIGFwYXJlemNhIG3DoXMgZ3JhbmRlIHEgZWwgZGUgbGEgVVYNCmF1dGhvcjogIlVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCmRhdGU6ICJFbmVybyBkZSAyMDIyIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpICAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDAuNjI4LCBvdXQud2lkdGggPSAiNzUlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQ0KYGBgDQoNCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh3YnN0YXRzKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsZWFybmluZ3Rvd2VyKQ0KbGlicmFyeShwbG90bHkpDQpgYGANCg0KDQoNCg0KDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIHNvbG8gSEFTIGRlIFNVU1RJVFVJUiAicGVyZXpwNDQiIHBvciB0dSB1c3VhcmlvIGRlIEdpdGh1Yi0tPg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9hbGVqYW5kcm91di90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBIQVMgREUgQ0FNQklBUiBOQURBLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNClNpZW1wcmUgaGVtb3Mgb2lkbyBxdWUgbGEgZWR1YWNpw7NuIGVyYSBjbGF2ZSBwYXJhIG5vc290cm9zLiBObyBzb2xvIHBhcmEgbnVlc3RybyBkZXNhcnJvbGxvIHBlcnNvbmFsLCBzaSBubyBwYXJhIG1lam9yYXIgbnVlc3RyYXMgY29uZGljaW9uZXMgZGUgdmlkYS4gQWRlbcOhcywgcGFyYSBsb3MgcXVlIGhlbW9zIGVzdHVkaWFkbw0KZWNvbm9tw61hLCB0YW1iaWVuIHNhYmVtb3MgcXVlIGxhIGVkdWNhY2lvbiBlcyB1biBhc3BlY3RvIGNsYXZlIGRlbCBjcmVjaW1pZW50byBlY29ub21pY28uIEVuIGVzdGUgYnJldmUgdHJhYmFqbywgYW5hbGl6YXJlbW9zIHNpIGRlIHZlcmRhZCBub3MgbWVyZWNlIGxhIHBlbmEgaW52ZXJ0aXIgZW4gbm9zb3Ryb3MgbWlzbW9zIGEgDQp0cmF2w6lzIGRlIGxhIGVkdWNhY2lvbiwgeSB0YW1iacOpbiBvYnNlcnZhcmVtb3MgdmFyaW9zIGRhdG9zIGN1cmlvc29zIHJlbGFjaW9uYWRvcyBjb24gbGEgZWR1Y2FjacOzbiB0YWxlcyBjb21vIGVsIEluZm9ybWUgUGlzYS4NCg0KPGJyPg0KDQoNCg0KIyAyLiBEYXRvcyB7LnRhYnNldH0NCg0KIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipEQVRPUyoqPC9GT05UPg0KDQpMYSBtYXlvcmlhIGRlIGRhdG9zIHF1ZSBoZSB1dGlsaXphZG8gcGFyYSBlbGFib3JhciBlbCB0cmFiYWpvIGxvcyBoZSBvYnRlbmlkbyBkZWwgcGFxdWV0ZSB3YnN0YXRzLCBlcyBkZWNpciwgcXVlIHByb2NlZGVuIGRlIGxhIGJhc2UgZGUgZGF0b3MgZGVsIEJhbmNvIE11bmRpYWwuIEFkZW3DoXMsIHBhcmEgb2JzZXJ2YXIgbG9zIGRhdG9zIGRlbCBJbmZvcm1lIFBpc2EsIGhlbW9zIHV0aWxpemFkbyBlbCBwYXF1ZXRlIGxlYXJuaW5ndG93ZXIsIHksIHBvciDDumx0aW1vLCBwYXJhIGFuYWxpemFyIGxhIGVzdHJ1Y3R1cmEgc2FsYXJpYWwgZXNwYcOxb2xhIHBvciBuaXZlbCBkZSBlZHVjYWNpw7NuLCBub3MgZGVzY2FyZ2FybW9zIGxvcyBkYXRvcyBlbiB1biBleGNlbCBkZXNkZSBlbCBJTkUsIHkgcG9zdGVyaW9ybWVudGUgbG9zIG1vZGlmaWNhbW9zIHkgcmVwcmVzZW50YW1vcyBjb24gUi4NCg0KPGJyPg0KDQojIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKkVKRU1QTE8gV0JTVEFUUyoqPC9GT05UPg0KDQpQcmltZXJvIGRlIHRvZG8gcGFyYSBvYnRlbmVyIGRhdG9zIGEgdHJhdsOpcyBkZSB3YnN0YXRzIGhheSBxdWUgc2FiZXIgcXVlIGRhdG9zIHF1ZXJlbW9zIG9idGVuZXIsIGVzdG8gZXMsIGVsIGluZGljYWRvci4NClBhcmEgc2FiZXIgZWwgaW5kaWNhZG9yLCBwb2RlbW9zIHJlYWxpemFyIHVuYSBidXNxdWVkYSBkZSBsYSBzaWd1aWVudGUgZm9ybWE6DQoNCmdkcCA8LSB3YnNlYXJjaChwYXR0ZXJuID0gImdkcCIsIGZpZWxkID0gImluZGljYXRvciIpDQoNClVuYSB2ZXogaGVjaG8gZXN0bywgcG9kZW1vcyBhYnJpciBlbCBkYXRhZnJhbWUgY3JlYWRvIHkgZmlsdHJhciBxdWUgaW5kaWNhZG9yIHF1ZXJlbW9zLCBlbiBlc3RlIGVqZW1wbG8sIGZpbHRyYXJlbW9zIGVsIHBpYnBjIGVuIGRvbGFyZXMgY29uc3RhbnRlcyBkZSAyMDExIHBhcmEgYW51bGFyIGVsIGVmZWN0byBkZSBsYSBpbmZsYWNpb24uDQoNCg0KUGFyYSBvYnRlbmVyIGxvcyBkYXRvcyAgaGFyaWFtb3MgbG8gc2lndWllbnRlOiB3YihpbmRpY2F0b3IgPSAiNi4wLkdEUHBjX2NvbnN0YW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAwMCwgZW5kZGF0ZSA9IDIwMTYsIFBPU0lYY3QgPSBUUlVFKSkNCiAgICAgICAgICAgICAgICAgICAgICAgIA0KRG9uZGUgc3RhcnRkYXRlIHkgZW5kZGF0ZSBzb24gbGFzIGZlY2hhcyBpbmljaWFsZXMgeSBmaW5hbGVzIHJlc3BlY3RpdmFtZW50ZSBxdWUgcXVlcmVtb3MgZmlsdHJhci4gU2kgcXVlcmVtb3MgdW4gcGHDrXMgZW4gY29uY3JldG8sIHBvZGVtb3MgZmlsdHJhciBwb3IgcGHDrXM6DQoNCndiKGluZGljYXRvciA9ICI2LjAuR0RQcGNfY29uc3RhbnQiLA0KICAgICAgICAgICAgICAgIGNvdW50cnkgPSAiRVNQIiwNCiAgICAgICAgICAgICAgICAgIHN0YXJ0ZGF0ZSA9IDIwMDAsIGVuZGRhdGUgPSAyMDE2LCBQT1NJWGN0ID0gVFJVRSkpDQoNCkRlIHRvZG9zIG1vZG9zLCBlbiBsb3MgYXBhcnRhZG9zIHBvbmRyZW1vcyB1bmEgc2VjY2nDs24gZGUgY29kaWdvIHBhcmEgcXVlIHNlIHB1ZWRhIG9ic2VydmFyIGVsIHByb2Nlc28gZGUgb2J0ZW5jaW9uIGRlIGRhdG9zLCBzdSBtb2RpZmljYWNpb24geSBzdSByZXByZXNlbnRhY2lvbi4NCg0KIyAzLiAiQ3VyaW9zaWRhZGVzIiANCg0KRW4gZXN0ZSBhcGFydGFkbyB2YW1vcyBhIGNvbWVudGFyIGRpdmVyc29zIGRhdG9zIGN1cmlvc29zIGUgaW50ZXJlc2FudGVzIHJlbGFjaW9uYWRvcyBjb24gbGEgZWR1Y2FjaW9uIGVuIGxvcyBkaWZlcmVudGVzIHBhaXNlcyBkZWwgbXVuZG8sIGNvbW8gbGFzIHB1bnR1YWNpb25lcyBkZWwgSW5mb3JtZSBQSVNBIHkgbGEgaW52ZXJzaW9uIHB1YmxpY2EgZW4gZWR1Y2FjaW9uLg0KDQojIyAzLjEgSW5mb3JtZSBQaXNhICB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqUElTQSoqPC9GT05UPg0KDQpBIGNvbnRpbnVhY2lvbiBvYnRlbmRyZW1vcyBsb3MgZGF0b3MgY29ycmVzcG9uZGllbnRlcyBhIGVsIEluZm9ybWUgUElTQSB5IGVsYWJvcmFyZW1vcyB1bmEgdGFibGEgcGFyYSBwb2RlciBjb25zdWx0YXIgZXN0b3MgZGF0b3MuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShsZWFybmluZ3Rvd2VyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoRFQpDQoNCnBpc2FfMDAxOCA8LSBsb2FkX3N0dWRlbnQoImFsbCIpDQoNCnBpc2FfMDAxOF90YWJsYSA8LSBwaXNhXzAwMTggJT4lIHNlbGVjdCh5ZWFyLCBjb3VudHJ5LCBtYXRoLCByZWFkLCBzY2llbmNlKQ0KDQpwaXNhX3BydWViYSA8LSBwaXNhXzAwMThfdGFibGEgJT4lIGdyb3VwX2J5KHllYXIsIGNvdW50cnkpICU+JSBzdW1tYXJpc2UobWVkaWFfbWF0ID0gbWVhbihtYXRoLCBuYS5ybSA9IFRSVUUpLCBtZWRpYV9yZWFkID0gbWVhbihyZWFkKSwgbWVkaWFfc2NpZW5jaWUgPSBtZWFuKHNjaWVuY2UpKQ0KDQoNCnBpc2FfcHJ1ZWJhICU+JSBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAidG9wIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDUsIGF1dG9XaWR0aCA9IFRSVUUgKSkNCmBgYA0KRW4gZWxsYSBwb2RlbW9zIGNvbnN1bHRhciBjdWFscXVpZXIgYcOxbywgcGFpcywgY2F0ZWdvcmlhLCBldGMuIFBvciBlamVtcGxvIHZhbW9zIGEgY29uc3VsdGFyIEVzcGHDsWEgZW4gZWwgYcOxbyAyMDE1LiBQb2RlbW9zIG9ic2VydmFyIGxhIG1lZGlhIGRlIGxhcyBwdW50dWFjaW9uZXMgb2J0ZW5pZGFzIHBvciBkaWZlcmVudGVzIGVzdHVkaWFudGVzIHBhcmEgbGEgY2F0ZWdvcmlhIGRlIG1hdGVtYXRpY2FzLCBjaWVuY2lhIHkgbGVjdHVyYS4gQ2FiZSBkZXN0YWNhciBxdWUgbG9zIGRhdG9zIGRlIGVzdGEgdGFibGEgZXN0YW4gImFycmVnbGFkb3MiLCB5YSBxdWUgYWwgZGVzY2FyZ2Fyc2UgbG9zIGRhdG9zIG9yaWdpbmFsZXMgdGVuZW1vcyBsYSBwdW50dWFjaW9uIGRlIGNhZGEgZXN0dWRpYW50ZSBlbiBjYWRhIG1hdGVyaWEsIHNpIGRpc3BvbmUgZGUgb3JkZW5hZG9yLCBlc3R1ZGlvcyBkZSBsb3MgcHJvZ2VuaXRvcmVzLCBzaSBkaXNwb25lIGRlIFRWIGVuIHN1IGhhYml0YWNpb24sIGV0Yy4gTm9zb3Ryb3Mgc29sbyBxdWVyaWFtb3MgbW9zdHJhciBsYXMgcHVudHVhY2lvbmVzIGZpbmFsZXMsIHNpIHNlIGRlc2VhIGFob25kYXIgbWFzIGVuIGVzdG9zIGRhdG9zIHRhbiBpbnRlcmVzYW50ZXMgbG8gZGVqYW1vcyBlbiBtYW5vcyBkZSBudWVzdHJvcyBsZWN0b3JlcyAobGFzIGluc3RydWNjaW9uZXMgZXN0YW4gZGlzcG9uaWJsZXMgZW4gZWwgYXBhcnRhZG8gZGUgY29kaWdvKS4NCg0KDQoNClRhbWJpw6luIHZhbW9zIGEgcmVhbGl6YXIgdW4gc2ltcGxlIGdyYWZpY28gcGFyYSBhbmFsaXphciBsYSBwdW50dWFjaW9uIG1lZGlhIHRvdGFsIChsYSBtZWRpYSBkZSBsYXMgdHJlcyAiYXNpZ2FudHVyYXMiKSBhIGxvIGxhcmdvIGRlIGxvcyB1bHRpbW9zIGHDsW9zIGRlIEVzcGHDsWEsIEFsZW1hbmlhIHkgRUVVVS4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwaXNhX2dyYWYgPC0gcGlzYV9wcnVlYmENCg0KcGlzYV9ncmFmJG1lZGlhX3RvdGFsX3Bpc2EgPC0gYXBwbHkocGlzYV9wcnVlYmFbICxjKDMsNCw1KV0sIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkNCg0KDQpwaXNhX2dyYWZfZ3JhZiA8LSBwaXNhX2dyYWYgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiRVNQIiwgIkRFVSIsICJVU0EiKSkNCg0KDQpncmFmX3BpcyA8LSBnZ3Bsb3QocGlzYV9ncmFmX2dyYWYsIGFlcyh4ID0geWVhciwgeSA9IG1lZGlhX3RvdGFsX3Bpc2EsIGNvbG91ciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpDQoNCmdyYWZfcGlzDQpgYGANCkVuIGVsIGdyw6FmaWNvIHNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gRUVVVSBub3Mgc2FjYSB1bmEgZ3JhbiB2ZW50YWphIGEgQWxlbWFuaWEgeSBFc3Bhw7FhLiBOb3NvdHJvcyBub3MgYWx0ZXJuYW1vcyBjb24gQWxlbWFuaWEsIGF1bnF1ZSBlc3RhbW9zIHVuIG1heW9yIHBlcmlvZG8gZGUgdGllbXBvIHBvciBhcnJpYmEgcXVlIGxvcyBhbGVtYW5lcywgY29zYSBxdWUgcGFyZWNlIHF1ZSB2YSBhIGNhbWJpYXIgcG9yIGxhIGV2b2x1Y2lvbiBlbiBsb3Mgw7psdGltb3MgYcOxb3MuIENhYmUgZGVzdGFjYXIgbGEgZ3JhbiBjYWlkYSBkZSBFRVVVIGRlc2RlIDIwMTIsIHkgdW5hIGNhaWRhIGRlIEVzcGHDsWEgZGVzZGUgZWwgbWlzbW8gcGVyaW9kbyBhdW5xdWUgbm8gdGFuIHByb251bmNpYWRhLg0KDQoNCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqQ09ESUdPKio8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGluY2x1ZGU9VFJVRX0NCiMjaW5mb3JtIHBpc2ENCmluc3RhbGwucGFja2FnZXMoImxlYXJuaW5ndG93ZXIiKQ0KbGlicmFyeShsZWFybmluZ3Rvd2VyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoVEQpDQoNCiNvYnRlbmNpb24gZGF0b3MgZ2VuZXJhbGVzIHBpc2ENCg0KcGlzYV8wMDE4IDwtIGxvYWRfc3R1ZGVudCgiYWxsIikNCg0KcGlzYV8wMDE4X3RhYmxhIDwtIHBpc2FfMDAxOCAlPiUgc2VsZWN0KHllYXIsIGNvdW50cnksIG1hdGgsIHJlYWQsIHNjaWVuY2UpDQoNCnBpc2FfcHJ1ZWJhIDwtIHBpc2FfMDAxOF90YWJsYSAlPiUgZ3JvdXBfYnkoeWVhciwgY291bnRyeSkgJT4lIHN1bW1hcmlzZShtZWRpYV9tYXQgPSBtZWFuKG1hdGgsIG5hLnJtID0gVFJVRSksIG1lZGlhX3JlYWQgPSBtZWFuKHJlYWQpLCBtZWRpYV9zY2llbmNpZSA9IG1lYW4oc2NpZW5jZSkpDQoNCg0KI1RhYmxhIFBpc2ENCg0KbGlicmFyeShEVCkNCnBpc2FfcHJ1ZWJhICU+JSBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgPSAidG9wIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDUsIGF1dG9XaWR0aCA9IFRSVUUgKSkNCg0KI0dyYWZpY28gUGlzYQ0KDQpwaXNhX2dyYWYgPC0gcGlzYV9wcnVlYmENCg0KcGlzYV9ncmFmJG1lZGlhX3RvdGFsX3Bpc2EgPC0gYXBwbHkocGlzYV9wcnVlYmFbICxjKDMsNCw1KV0sIDEsIG1lYW4sIG5hLnJtID0gVFJVRSkNCg0KDQpwaXNhX2dyYWZfZ3JhZiA8LSBwaXNhX2dyYWYgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiRVNQIiwgIkRFVSIsICJVU0EiKSkNCg0KDQpncmFmX3BpcyA8LSBnZ3Bsb3QocGlzYV9ncmFmX2dyYWYsIGFlcyh4ID0geWVhciwgeSA9IG1lZGlhX3RvdGFsX3Bpc2EsIGNvbG91ciA9IGNvdW50cnksIGdyb3VwID0gY291bnRyeSkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpDQoNCmdyYWZfcGlzDQpgYGANCjxicj4NCg0KIyMgMy4yIEludmVyc2lvbiBlbiBFZHVjYWNpw7NuICB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqSU5WRVJTSU9OKio8L0ZPTlQ+DQoNCkVuIGVzdGUgYXBhcnRhZG8gdmFtb3MgYSBjZW50cmFybm9zIGVuIGxhIGludmVyc2lvbiBwdWJsaWNhIGVuIGVkdWNhY2lvbiBkZSBkaWZlcmVudGVzIHBhaXNlcyB5ICB6b25hcyBkZWwgbXVuZG8uIExvcyBkYXRvcyBsb3Mgb2J0ZW5kcmVtb3MgZGUgbGEgYmFzZSBkZSBkYXRvcyBkZWwgYmFuY28gbXVuZGlhbC4gUmVhbGl6YXJlbW9zIHVuYSB0YWJsYSBkb25kZSBzZSBwdWVkZSBjb25zdWx0YXIgcG9yIGHDsW8geSBwYWlzIGVsICUgZGVsIFBJQiBlbiBlZHVjYWNpb24gaW52ZXJ0aWRvLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnB1YmxpY19leHBfZWQ8LSB3YihpbmRpY2F0b3IgPWMoIlNFLlhQRC5UT1RMLkdELlpTIiksDQogICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAwMCwgZW5kZGF0ZSA9IDIwMjAsIFBPU0lYY3QgPSBUUlVFKQ0KDQoNCnB1YmxpY19leHBfdGFiIDwtIHB1YmxpY19leHBfZWQgJT4lIHNlbGVjdChkYXRlLCBjb3VudHJ5LCB2YWx1ZSkNCg0KcHVibGljX2V4cF90YWIgJT4lIERUOjpkYXRhdGFibGUoZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JsZnJ0aXAnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQ0KYGBgDQoNCg0KQSBjb250aW51Y2FjaW9uLCB0YW1iaWVuIGhlbW9zIHJlYWxpemFkbyB1biAiQmFydCBDaGFydCBSYWNlIiBiw6FzaWNvIHBhcmEgdmVyIGNvbW8gaGEgZXZvbHVjaW9uYWRvIGVuIGxvcyDDumx0aW1vcyBhw7FvcyBsYSBpbnZlcnNpb24gZW4gZWR1Y2FjaW9uIGRlIGRpZmVyZW50ZXMgem9uYXMgZGVsIG11bmRvLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnB1YmxpY19leHBfZ3JhZiA8LSBwdWJsaWNfZXhwX2VkICU+JSBzZWxlY3QoZGF0ZSwgaXNvM2MsIGNvdW50cnksIHZhbHVlKSAlPiUgcmVuYW1lKHBhaXMgPSBjb3VudHJ5LCB5ZWFyID0gZGF0ZSkgJT4lDQogIGZpbHRlcihpc28zYyAlaW4lIGMoIkVVVSIsICJFQVMiLCAiRUNTIiwgIlNBUyIsICJBRkUiLCAiQUZXIiwgIkxDTiIpKSAlPiUgZmlsdGVyKHllYXIgJWluJSBjKDIwMTA6MjAxOCkpICU+JSBncm91cF9ieShwYWlzKSAlPiUgYXJyYW5nZSh2YWx1ZSkNCg0KDQpwdWJsaWNfZXhwX2dyYWYkeWVhciA8LSBhcy5udW1lcmljKHB1YmxpY19leHBfZ3JhZiR5ZWFyKQ0KDQoNCmdyYWZpY29fYW5pbWFkb19nZHAgPC0gZ2dwbG90KHB1YmxpY19leHBfZ3JhZiwgYWVzKHggPSBwYWlzLCB5ID0gdmFsdWUsIGdyb3VwID0gcGFpcywgZmlsbCA9IHBhaXMpKSArIGdlb21fY29sKCkgKyBjb29yZF9mbGlwKCkgKyB0cmFuc2l0aW9uX3RpbWUoeWVhcikgKyANCiAgbGFicyh0aXRsZSA9ICdZZWFyOiB7ZnJhbWVfdGltZX0nLCB4ID0gJ0lJbnZlcnNpb24gRWR1Y2FjaW9uIGNvbW8gJUdEUCcsIHkgPSAnQ29uanVudG8gUGFpc2VzJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KYW5pbWF0ZShncmFmaWNvX2FuaW1hZG9fZ2RwLDEwMCwxMCkNCmBgYA0KQ2FiZSBkZXN0YWNhciwgc29icmUgdG9kbywgcXVlIGVsIGVzdGUgeSBlbCBzdXIgZGUgQWZyaWNhIGVzdGUsIGVuIGdlbmVyYWwsIGEgbGEgY2FiZXphIG8gZW4gbG9zIHByaW1lcm9zIHB1ZXN0b3MgZXN0b3Mgw7psdGltb3MgYcOxb3MgZW4gbG8gcXVlIGEgaW52ZXJzaW9uIGVuIGVkdWNhY2lvbiBzZSByZWZpZXJlLg0KDQojIyMgPEZPTlQgQ09MT1I9ImQzYTQ2YSI+KipDT0RJR08qKjwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbGlicmFyeShEVCkNCmxpYnJhcnkod2JzdGF0cykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQoNCnB1YmxpY19leHBfZWQ8LSB3YihpbmRpY2F0b3IgPWMoIlNFLlhQRC5UT1RMLkdELlpTIiksDQogICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAwMCwgZW5kZGF0ZSA9IDIwMjAsIFBPU0lYY3QgPSBUUlVFKQ0KDQoNCnB1YmxpY19leHBfdGFiIDwtIHB1YmxpY19leHBfZWQgJT4lIHNlbGVjdChkYXRlLCBjb3VudHJ5LCB2YWx1ZSkNCg0KcHVibGljX2V4cF90YWIgJT4lIERUOjpkYXRhdGFibGUoZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JsZnJ0aXAnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQ0KDQoNCg0KcHVibGljX2V4cF9ncmFmIDwtIHB1YmxpY19leHBfZWQgJT4lIHNlbGVjdChkYXRlLCBpc28zYywgY291bnRyeSwgdmFsdWUpICU+JSByZW5hbWUocGFpcyA9IGNvdW50cnksIHllYXIgPSBkYXRlKSAlPiUNCiAgZmlsdGVyKGlzbzNjICVpbiUgYygiRVVVIiwgIkVBUyIsICJFQ1MiLCAiU0FTIiwgIkFGRSIsICJBRlciLCAiTENOIikpICU+JSBmaWx0ZXIoeWVhciAlaW4lIGMoMjAxMDoyMDE4KSkgJT4lIGdyb3VwX2J5KHBhaXMpICU+JSBhcnJhbmdlKHZhbHVlKQ0KDQpwdWJsaWNfZXhwX2dyYWYkeWVhciA8LSBhcy5udW1lcmljKHB1YmxpY19leHBfZ3JhZiR5ZWFyKQ0KDQoNCmdyYWZpY29fYW5pbWFkb19nZHAgPC0gZ2dwbG90KHB1YmxpY19leHBfZ3JhZiwgYWVzKHggPSBwYWlzLCB5ID0gdmFsdWUsIGdyb3VwID0gcGFpcywgZmlsbCA9IHBhaXMpKSArIGdlb21fY29sKCkgKyBjb29yZF9mbGlwKCkgKyB0cmFuc2l0aW9uX3RpbWUoeWVhcikgKyANCiAgbGFicyh0aXRsZSA9ICdZZWFyOiB7ZnJhbWVfdGltZX0nLCB4ID0gJ0lJbnZlcnNpb24gRWR1Y2FjaW9uIGNvbW8gJUdEUCcsIHkgPSAnQ29uanVudG8gUGFpc2VzJykgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KYW5pbWF0ZShncmFmaWNvX2FuaW1hZG9fZ2RwLDEwMCwxMCkNCg0KYGBgDQo8YnI+DQoNCg0KDQojIDQuRGVzZW1wbGVvIHkgRWR1Y2FjacOzbiB7LnRhYnNldH0NCg0KDQoNCiMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqREVTRU1QTEVPKio8L0ZPTlQ+DQoNCkEgY29udGludWFjaW9uIHZhbW9zIGEgYW5hbGl6YXIgc2kgbGEgdGFzYSBkZSBkZXNlbXBsZW8gZ3VhcmRhIHVuYSByZWxhY2lvbiBjb24gbGEgZWR1Y2FjacOzbiwgY29uY3JldGFtZW50ZSBjb24gZWwgbml2ZWwgZGUgZXN0dWRpb3MuIExvIGhhcmVtb3MgZ3JhY2lhcyBhIGxhIGJhc2UgZGUgZGF0b3MgZGVsIEJhbmNvIE11bmRpYWwsIHkgbm9zIGNlbnRyYXJlbW9zIGVuIGxvcyBzaWd1aWVudGVzIHBhaXNlczogQWxlbWFuaWEsIEVzcGHDsWEgeSBFRVVVLiBQYXJhIGVsbG8gcmVhbGl6YXJlbW9zIHRyZXMgZ3LDoWZpY29zIHkgdW4gZ3LDoWZpY28gcXVlIGludGVncmUgbG9zIHRyZXMgYW50ZXJpb3Jlcy4gRW4gZWxsb3Mgc2UgdmVyYW4gbGFzIGRpc3RpbnRhcyB0YXNhcyBkZSBkZXNlbXBsZW8gYSBsbyBsYXJnbyBkZWwgcGVyaW9kbyAyMDAwLTIwMTYgZGVzYWdyZWdhZGFzIHBvciBuaXZlbCBkZSBlZHVjYWNpw7NuKEVuIGxhIGxleWVuZGEsIEFEVk4gPSBFc3R1ZGlvcyBhdmFuemFkb3MsIEJBU0MgPSBFc3R1ZGlvcyBCYXNpY29jLCBJTlRNID0gRXN0dWRpb3MgSW50ZXJtZWRpb3MpLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdW5lbXBfbml2ZWxfZXMgPC0gd2IoY291bnRyeSA9ICJFU1AiLCANCiAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9YygiU0wuVUVNLkJBU0MuWlMiLCAiU0wuVUVNLklOVE0uWlMiLCAiU0wuVUVNLkFEVk4uWlMiKSwNCiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZGF0ZSA9IDIwMDAsIGVuZGRhdGUgPSAyMDE2LCBQT1NJWGN0ID0gVFJVRSkNCg0KDQp1bmVtcF9uaXZlbF9lcyA8LSB1bmVtcF9uaXZlbF9lcyAlPiUgc2VsZWN0KGRhdGVfY3QsIHZhbHVlLCBpbmRpY2F0b3JJRCkgDQoNCg0KZ3JhZl9lc19kZXMgPC0gZ2dwbG90KHVuZW1wX25pdmVsX2VzLCBhZXMoeCA9IGRhdGVfY3QgLHkgPSB2YWx1ZSwgY29sb3IgPSBpbmRpY2F0b3JJRCwgZ3JvdXAgPSBpbmRpY2F0b3JJRCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKCkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAid2hpdGUiKSwgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYWxpY2VibHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJiaXNxdWUiKSkgK2xhYnModGl0bGUgPSAiRGVzZW1wbGVvIHBvciBuaXZlbCBkZSBFc3R1ZGlvcyBFc3Bhw7FhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJGZWNoYSIsIHkgPSAiVGFzYSBEZXNlbXBsZW8iLCBjb2xvdXIgPSAiTml2ZWwgZGUgRXN0dWRpb3MiKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbnRpcXVld2hpdGUiKSkgDQoNCg0KZ2dwbG90bHkoZ3JhZl9lc19kZXMpDQoNCg0KDQojZ3JhZmljbyBkZXNlbXBsZW8gcG9yIG5pdmVsIGRlIGVzdHVkaW9zLCBwYWlzIHkgYcOxbyAjRUVVVQ0KDQp1bmVtcF9uaXZlbF9VUyA8LSB3Yihjb3VudHJ5ID0gIlVTIiwgDQogICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPWMoIlNMLlVFTS5CQVNDLlpTIiwgIlNMLlVFTS5JTlRNLlpTIiwgIlNMLlVFTS5BRFZOLlpTIiksDQogICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCg0KdW5lbXBfbml2ZWxfVVMgPC0gdW5lbXBfbml2ZWxfVVMgJT4lIHNlbGVjdChkYXRlX2N0LCB2YWx1ZSwgaW5kaWNhdG9ySUQpIA0KDQoNCmdyYWZfVVNfZGVzIDwtIGdncGxvdCh1bmVtcF9uaXZlbF9VUywgYWVzKHggPSBkYXRlX2N0ICx5ID0gdmFsdWUsIGNvbG9yID0gaW5kaWNhdG9ySUQsIGdyb3VwID0gaW5kaWNhdG9ySUQpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkyOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiksIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImFsaWNlYmx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmlzcXVlIikpICtsYWJzKHRpdGxlID0gIkRlc2VtcGxlbyBwb3Igbml2ZWwgZGUgRXN0dWRpb3MgRUVVVSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRmVjaGEiLCB5ID0gIlRhc2EgRGVzZW1wbGVvIiwgY29sb3VyID0gIk5pdmVsIGRlIEVzdHVkaW9zIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpIA0KDQpnZ3Bsb3RseShncmFmX1VTX2RlcykNCg0KI2dyYWZpY28gZGVzZW1wbGVvIHBvciBuaXZlbCBkZSBlc3R1ZGlvcywgcGFpcyB5IGHDsW8gI0FMRU1BTklBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCnVuZW1wX25pdmVsX0RFVSA8LSB3Yihjb3VudHJ5ID0gIkRFVSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9YygiU0wuVUVNLkJBU0MuWlMiLCAiU0wuVUVNLklOVE0uWlMiLCAiU0wuVUVNLkFEVk4uWlMiKSwNCiAgICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCg0KdW5lbXBfbml2ZWxfREVVIDwtIHVuZW1wX25pdmVsX0RFVSAlPiUgc2VsZWN0KGRhdGVfY3QsIHZhbHVlLCBpbmRpY2F0b3JJRCkgDQoNCg0KZ3JhZl9ERVVfZGVzIDwtIGdncGxvdCh1bmVtcF9uaXZlbF9ERVUsIGFlcyh4ID0gZGF0ZV9jdCAseSA9IHZhbHVlLCBjb2xvciA9IGluZGljYXRvcklELCBncm91cCA9IGluZGljYXRvcklEKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiksIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImFsaWNlYmx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJiaXNxdWUiKSkgK2xhYnModGl0bGUgPSAiRGVzZW1wbGVvIHBvciBuaXZlbCBkZSBFc3R1ZGlvcyBBTEVNQU5JQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJGZWNoYSIsIHkgPSAiVGFzYSBEZXNlbXBsZW8iLCBjb2xvdXIgPSAiTml2ZWwgZGUgRXN0dWRpb3MiKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbnRpcXVld2hpdGUiKSkgDQoNCmdncGxvdGx5KGdyYWZfREVVX2RlcykNCmBgYA0KRW4gbG9zIHRyZXMgcGFpc2VzIHNlIG9ic2VydmEgZWwgbWlzbW8gcGF0cm9uLCBsYSBldm9sdWNpb24gZGUgbGEgdGFzYSBkZSBwYXJvIGVzIG11eSBzaW1pbGFyLCBwcmFjdGljYW1lbnRlIGlkZW50aWNhLCBwZXJvIGxvIGN1cmlvc28gZXMgbG8gc2lndWllbnRlLCBlbiBsb3MgMyBwYWlzZXMsIGxhIHRhc2EgZGUgZGVzZW1wbGVvIGVzIG1lbm9zIGN1YW50byBtYXlvciBlcyBlbCBuaXZlbCBkZSBlc3R1ZGlvcy4gQ29uIGxvIGN1YWwsIHBvZGVtb3MgYWZpcm1hciwgYWwgbWVub3MgcGFyYSBlc3RvcyBwYWlzZXMsIHF1ZSBlbCBkZXNlbXBsZW8gZXN0YSByZWxhY2lvbmFkbyBpbnZlcnNhbWVudGUgY29uIGxhIGVkdWNhY2lvbiwgYSBtYXlvciBuaXZlbCBkZSBlc3R1ZGlvcyBtZW5vciBuaXZlbCBkZSBkZXNlbXBsZW8uDQoNCg0KQSBjb250aW51YWNpb24gcmVhbGl6YXJlbW9zIGVsIGdyYWZpY28gIm11bHRpcGxlIiBwYXJhIHBvZGVyIGFwcmVjaWFybG8gbWVqb3IuDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KdW5lbXBfbml2ZWwgPC0gd2IoY291bnRyeSA9IGMoIkRFVSIsICJFU1AiLCAiVVMiKSwgDQogICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPWMoIlNMLlVFTS5CQVNDLlpTIiwgIlNMLlVFTS5JTlRNLlpTIiwgIlNMLlVFTS5BRFZOLlpTIiksDQogICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCmRlc190cmVzX3BhaXMgPC0gZ2dwbG90KHVuZW1wX25pdmVsLCBhZXMoeCA9IGRhdGVfY3QgLHkgPSB2YWx1ZSwgY29sb3IgPSBpbmRpY2F0b3JJRCwgZ3JvdXAgPSBpbmRpY2F0b3JJRCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKCkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbGljZWJsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmlzcXVlIikpICtsYWJzKHRpdGxlID0gIkRlc2VtcGxlbyBwb3Igbml2ZWwgZGUgRXN0dWRpb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRmVjaGEiLCB5ID0gIlRhc2EgRGVzZW1wbGVvIiwgY29sb3VyID0gIk5pdmVsIGRlIEVzdHVkaW9zIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpICsNCiAgZmFjZXRfd3JhcCh+Y291bnRyeSkNCg0KZGVzX3RyZXNfcGFpcw0KYGBgDQpFbiBlc3RlIGdyYWZpY28gc2UgYXByZWNpYSBhdW4gbWVqb3IsIGxhIHNpdHVhY2lvbiBjb21lbnRhZGEgYW50ZXJpb3JtZW50ZSBzZSBkYSBlbiBsb3MgMyBwYWlzZXMuIENhYmUgZGVzdGFjYXIsIHBvciBjaWVydG8sIGxvcyBhbHRvcyBuaXZlbGVzIGRlIGRlc2VtcGxlbyBlc3Bhw7FvbGVzLCBwZXJvIGVzdG8gZXMgdW4gdGVtYSBhcGFydGUuDQoNCiMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqQ09ESUdPKio8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGluY2x1ZGU9VFJVRX0NCiNncmFmaWNvIGRlc2VtcGxlbyBwb3Igbml2ZWwgZGUgZXN0dWRpb3MsIHBhaXMgeSBhw7FvICNFU1BBw5FBDQoNCnVuZW1wX25pdmVsX2VzIDwtIHdiKGNvdW50cnkgPSAiRVNQIiwgDQogICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPWMoIlNMLlVFTS5CQVNDLlpTIiwgIlNMLlVFTS5JTlRNLlpTIiwgIlNMLlVFTS5BRFZOLlpTIiksDQogICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCg0KdW5lbXBfbml2ZWxfZXMgPC0gdW5lbXBfbml2ZWxfZXMgJT4lIHNlbGVjdChkYXRlX2N0LCB2YWx1ZSwgaW5kaWNhdG9ySUQpIA0KDQoNCmdyYWZfZXNfZGVzIDwtIGdncGxvdCh1bmVtcF9uaXZlbF9lcywgYWVzKHggPSBkYXRlX2N0ICx5ID0gdmFsdWUsIGNvbG9yID0gaW5kaWNhdG9ySUQsIGdyb3VwID0gaW5kaWNhdG9ySUQpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXkyOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiksIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImFsaWNlYmx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmlzcXVlIikpICtsYWJzKHRpdGxlID0gIkRlc2VtcGxlbyBwb3Igbml2ZWwgZGUgRXN0dWRpb3MgRVNQQcORQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRmVjaGEiLCB5ID0gIlRhc2EgRGVzZW1wbGVvIiwgY29sb3VyID0gIk5pdmVsIGRlIEVzdHVkaW9zIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpDQpncmFmX2VzX2Rlcw0KDQoNCg0KI2dyYWZpY28gZGVzZW1wbGVvIHBvciBuaXZlbCBkZSBlc3R1ZGlvcywgcGFpcyB5IGHDsW8gI0VFVVUNCg0KdW5lbXBfbml2ZWxfVVMgPC0gd2IoY291bnRyeSA9ICJVUyIsIA0KICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID1jKCJTTC5VRU0uQkFTQy5aUyIsICJTTC5VRU0uSU5UTS5aUyIsICJTTC5VRU0uQURWTi5aUyIpLA0KICAgICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAwMCwgZW5kZGF0ZSA9IDIwMTYsIFBPU0lYY3QgPSBUUlVFKQ0KDQoNCnVuZW1wX25pdmVsX1VTIDwtIHVuZW1wX25pdmVsX1VTICU+JSBzZWxlY3QoZGF0ZV9jdCwgdmFsdWUsIGluZGljYXRvcklEKSANCg0KDQpncmFmX1VTX2RlcyA8LSBnZ3Bsb3QodW5lbXBfbml2ZWxfVVMsIGFlcyh4ID0gZGF0ZV9jdCAseSA9IHZhbHVlLCBjb2xvciA9IGluZGljYXRvcklELCBncm91cCA9IGluZGljYXRvcklEKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbGljZWJsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJpc3F1ZSIpKSArbGFicyh0aXRsZSA9ICJEZXNlbXBsZW8gcG9yIG5pdmVsIGRlIEVzdHVkaW9zIEVFVVUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRmVjaGEiLCB5ID0gIlRhc2EgRGVzZW1wbGVvIiwgY29sb3VyID0gIk5pdmVsIGRlIEVzdHVkaW9zIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpIA0KZ3JhZl9VU19kZXMNCg0KI2dyYWZpY28gZGVzZW1wbGVvIHBvciBuaXZlbCBkZSBlc3R1ZGlvcywgcGFpcyB5IGHDsW8gI0FMRU1BTklBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCnVuZW1wX25pdmVsX0RFVSA8LSB3Yihjb3VudHJ5ID0gIkRFVSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9YygiU0wuVUVNLkJBU0MuWlMiLCAiU0wuVUVNLklOVE0uWlMiLCAiU0wuVUVNLkFEVk4uWlMiKSwNCiAgICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCg0KdW5lbXBfbml2ZWxfREVVIDwtIHVuZW1wX25pdmVsX0RFVSAlPiUgc2VsZWN0KGRhdGVfY3QsIHZhbHVlLCBpbmRpY2F0b3JJRCkgDQoNCg0KZ3JhZl9ERVVfZGVzIDwtIGdncGxvdCh1bmVtcF9uaXZlbF9ERVUsIGFlcyh4ID0gZGF0ZV9jdCAseSA9IHZhbHVlLCBjb2xvciA9IGluZGljYXRvcklELCBncm91cCA9IGluZGljYXRvcklEKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5MjgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gIndoaXRlIiksIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImFsaWNlYmx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJiaXNxdWUiKSkgK2xhYnModGl0bGUgPSAiRGVzZW1wbGVvIHBvciBuaXZlbCBkZSBFc3R1ZGlvcyBBTEVNQU5JQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICJGZWNoYSIsIHkgPSAiVGFzYSBEZXNlbXBsZW8iLCBjb2xvdXIgPSAiTml2ZWwgZGUgRXN0dWRpb3MiKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbnRpcXVld2hpdGUiKSkgDQoNCmdyYWZfREVVX2Rlcw0KDQoNCiNDb21iaW5hY2lvIGdyYWZpY29zIGFudGVyaW9yZXMNCg0KdW5lbXBfbml2ZWwgPC0gd2IoY291bnRyeSA9IGMoIkRFVSIsICJFU1AiLCAiVVMiKSwgDQogICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPWMoIlNMLlVFTS5CQVNDLlpTIiwgIlNMLlVFTS5JTlRNLlpTIiwgIlNMLlVFTS5BRFZOLlpTIiksDQogICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLCBlbmRkYXRlID0gMjAxNiwgUE9TSVhjdCA9IFRSVUUpDQoNCmRlc190cmVzX3BhaXMgPC0gZ2dwbG90KHVuZW1wX25pdmVsLCBhZXMoeCA9IGRhdGVfY3QgLHkgPSB2YWx1ZSwgY29sb3IgPSBpbmRpY2F0b3JJRCwgZ3JvdXAgPSBpbmRpY2F0b3JJRCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9saW5lKCkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTI4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbGljZWJsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmlzcXVlIikpICtsYWJzKHRpdGxlID0gIkRlc2VtcGxlbyBwb3Igbml2ZWwgZGUgRXN0dWRpb3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAiRmVjaGEiLCB5ID0gIlRhc2EgRGVzZW1wbGVvIiwgY29sb3VyID0gIk5pdmVsIGRlIEVzdHVkaW9zIikgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYW50aXF1ZXdoaXRlIikpICsNCiAgZmFjZXRfd3JhcCh+Y291bnRyeSkNCg0KZGVzX3RyZXNfcGFpcw0KYGBgDQo8YnI+DQoNCiMgNS5TYWxhcmlvcyB5IEVkdWNhY2lvbiBlbiBFc3Bhw7FhIHsudGFic2V0fQ0KDQojIyA8Rk9OVCBDT0xPUj0iZDNhNDZhIj4qKlNBTEFSSU9TKio8L0ZPTlQ+DQoNClBvciDDumx0aW1vLCB2YW1vcyBhIGFuYWxpemFyIGVsIHNhbGFyaW8gcG9yIG5pdmVsIGRlIGVzdHVkaW9zIGdyYWNpYXMgYSBsb3MgZGF0b3MgcXVlIG5vcyBwcm9wb3JjaW9uYSBlbCBJTkUgcmVzcGVjdG8gYSBsYSBlc3RydWN0dXJhIHNhbGFyaWFsLiBQYXJhIGVsbG8gbm9zIGhlbW9zIGRlc2NhcmdhZG8gdW5hIGhvamEgZGUgZXhjZWwgZGVsIElORSB5IGxhIGhlbW9zIGltcG9ydGFkbyBhIFIgcGFyYSBwb2RlciB2aXN1YWxpemFybGEuIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkocGxvdGx5KQ0KDQpzYWxhcmlvcyA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJTYWxhcmlvc19uaXZlbF9lZHVjYWNpb24ueGxzeCIpKQ0KDQpzYWxhcmlvcyA8LSBzYWxhcmlvcyAlPiUgc2VsZWN0KGBOSVZFTEVTIERFIEZPUk1BQ0lPTmAsIFBlcmlvZG8sIFRvdGFsKSANCg0Kc2FsYXJpb3MgPC0gYXMuZGF0YS5mcmFtZShzYWxhcmlvcykNCg0Kc2FsYXJpb3MgPC0gc2FsYXJpb3MgJT4lIHJlbmFtZSggU2FsYXJpb19icnV0b19tZW5zdWFsID0gVG90YWwsIEZlY2hhID0gUGVyaW9kbywgTml2ZWxfRm9ybWFjaW9uID0gYE5JVkVMRVMgREUgRk9STUFDSU9OYCkNCg0KDQoNCmdyYWZfc2FsYXJpb3MgPC0gZ2dwbG90KHNhbGFyaW9zLCBhZXMoeCA9IEZlY2hhLCB5ID0gU2FsYXJpb19icnV0b19tZW5zdWFsLCBjb2xvciA9IE5pdmVsX0Zvcm1hY2lvbiwgZ3JvdXAgPSBOaXZlbF9Gb3JtYWNpb24pKSsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKyANCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0IChjKDEsMSwxLDEpLCAiY20iKSkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KHNpemUgPSAxKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKSAgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTgxIikpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICtsYWJzKHRpdGxlID0gIlNhbGFyaW8gcG9yIG5pdmVsIGRlIGVkdWNhY2lvbiIsDQogICAgc3VidGl0bGUgPSAiRXNwYcOxYSwgMjAxNC8yMDIwIikgKyB0aGVtZShsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXk5MyIpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCiAgICANCg0KZ2dwbG90bHkoZ3JhZl9zYWxhcmlvcykNCmBgYA0KQ29tbyBvYnNlcnZhbW9zIGVuIGVsIGdyw6FmaWNvLCBwYXNhIGFsZ28gc2ltaWxhciBhIGxvIGNvbWVudGFkbyBlbiBlbCBhcGFydGFkbyBkZWwgZGVzZW1wbGVvLCBhIG1heW9yIG5pdmVsIGRlIGVzdHVkaW9zLCBtYXlvciBzYWxhcmlvIGJydXRvIG1lbnN1YWwsIHNpZW5kbyBsb3MgbWF5b3JlcyBzYWxhcmlvcyBwYXJhIGxvcyBlc3R1ZGlvcyBzdXBlcmlvcmVzIHkgbG9zIG1lbm9yZXMgcGFyYSBsb3MgYW5hbGZhYmV0b3MuDQoNCiMjIDxGT05UIENPTE9SPSJkM2E0NmEiPioqQ09ESUdPKio8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGluY2x1ZGU9VFJVRX0NCnNhbGFyaW9zIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgIlNhbGFyaW9zX25pdmVsX2VkdWNhY2lvbi54bHN4IikpDQoNCnNhbGFyaW9zIDwtIHNhbGFyaW9zICU+JSBzZWxlY3QoYE5JVkVMRVMgREUgRk9STUFDSU9OYCwgUGVyaW9kbywgVG90YWwpIA0KDQpzYWxhcmlvcyA8LSBhcy5kYXRhLmZyYW1lKHNhbGFyaW9zKQ0KDQpzYWxhcmlvcyA8LSBzYWxhcmlvcyAlPiUgcmVuYW1lKCBTYWxhcmlvX2JydXRvX21lbnN1YWwgPSBUb3RhbCwgRmVjaGEgPSBQZXJpb2RvLCBOaXZlbF9Gb3JtYWNpb24gPSBgTklWRUxFUyBERSBGT1JNQUNJT05gKQ0KDQoNCg0KZ3JhZl9zYWxhcmlvcyA8LSBnZ3Bsb3Qoc2FsYXJpb3MsIGFlcyh4ID0gRmVjaGEsIHkgPSBTYWxhcmlvX2JydXRvX21lbnN1YWwsIGNvbG9yID0gTml2ZWxfRm9ybWFjaW9uLCBncm91cCA9IE5pdmVsX0Zvcm1hY2lvbikpKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArIA0KICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQgKGMoMSwxLDEsMSksICJjbSIpKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3Qoc2l6ZSA9IDEpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChzaXplID0gMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIpICArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5ODEiKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgK2xhYnModGl0bGUgPSAiU2FsYXJpbyBwb3Igbml2ZWwgZGUgZWR1Y2FjaW9uIiwNCiAgICBzdWJ0aXRsZSA9ICJFc3Bhw7FhLCAyMDE0LzIwMjAiKSArIHRoZW1lKGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTkzIikpDQogICAgDQoNCmdncGxvdGx5KGdyYWZfc2FsYXJpb3MpDQpgYGANCg0KDQoNCg0KIyA2LiBDb25jbHVzaW9uDQoNCkEgdHJhdmVzIGRlbCBicmV2ZSB0cmFiYWpvIHJlYWxpemFkbywgaGUgbGxlZ2FkbyBhIGxhIGNvbmNsdXNpb24gZGUgcXVlIGRlc2RlIGVsIHB1bnRvIGRlIHZpc3RhIHBlcnNvbmFsLCBub3MgbWVyZWNlIGxhIHBlbmEgeSBtdWNobyBpbnZlcnRpciBlbiBub3NvdHJvcyBtaXNtb3MgYSB0cmF2w6lzIGRlIGxhIGVkdWNhY2nDs24sIHlhIHF1ZSwgY29tbyB2aW1vcyBlbiBsb3MgYXBhcnRhZG9zIDQgeSA1LCB1biBtYXlvciBuaXZlbCBkZSBlZHVjYWNpb24gKGVudGVuZGlkYSBjb21vIHVuIG1heW9yIG5pdmVsIGRlIGVzdHVkaW9zKSBub3MgcHJvcG9yY2lvbmEgdW5hIG1heW9yIHByb2JhYmlsaWRhZCBkZSBlbmNvbnRyYXIgZW1wbGVvIHkgYWRlbcOhcyBjb24gdW4gc2FsYXJpbyBtYXlvciBlbiBjb21wYXJhY2lvbiBjb24gb3Ryb3MgaW5kaXZpZHVvcyBjb24gbWVub3Igbml2ZWwgZGUgZXN0dWRpb3MuIFBvZGVtb3MgYWZpcm1hciwgc2luIG5pbmd1bmEgZHVkYSwgcXVlIGludmVydGlyIGVuIG51ZXN0cmEgZWR1Y2FjaW9uIGVzIG11eSByZW50YWJsZS4NCg0KDQojIDcuIEJpYmxpb2dyYWbDrWENCg0KW0VzdHJ1Y3R1cmEgc2FsYXJpYWxdKGh0dHBzOi8vcnB1YnMuY29tL2pvc2NhbmkvZXNhbGFyaWFsKQ0KDQpbRGF0b3Mgd2JzdGF0c10oaHR0cHM6Ly9maW5hbnphc3pvbmUuY29tL3BhcXVldGVzLWRlc2Nhcmdhci1kYXRvcy1yLykNCg0KW0JhcnQgQ2hhcnQgUmFjZV0oaHR0cHM6Ly9taWNoYWVsdG90aC5tZS9ob3ctdG8tY3JlYXRlLWEtYmFyLWNoYXJ0LXJhY2UtaW4tci1tYXBwaW5nLXVuaXRlZC1zdGF0ZXMtY2l0eS1wb3B1bGF0aW9uLTE3OTAtMjAxMC5odG1sKQ0KDQoNCjxicj48YnI+DQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Kc2Vzc2lvbmluZm86OnNlc3Npb25faW5mbygpICU+JSBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAnSW5mb3JtYWNpw7NuIGRlIG1pIFItc2VzacOzbjonKSANCmBgYA0KDQoNCjxicj48YnI+DQoNCjxkaXYgY2xhc3M9InRvY2lmeS1leHRlbmQtcGFnZSIgZGF0YS11bmlxdWU9InRvY2lmeS1leHRlbmQtcGFnZSIgc3R5bGU9ImhlaWdodDogMDsiPjwvZGl2Pg0KPGJyPjxicj4NCg0KPGRpdiBjbGFzcz0idG9jaWZ5LWV4dGVuZC1wYWdlIiBkYXRhLXVuaXF1ZT0idG9jaWZ5LWV4dGVuZC1wYWdlIiBzdHlsZT0iaGVpZ2h0OiAwOyI+PC9kaXY+DQo=