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 2020-2021. 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

En la asignatura de “Programación y manejo de datos en la era del Big Data”1 tenemos que hacer un trabajo individual y otro en grupo.

Este es el trabajo individual, en él me gustaría analizar el desempleo, ya que me parece un problema económico importante de tratar, dado que de este se desencadenan diversos efectos negativos, los cuales habría que tener (más) en cuenta.

Concretamente, en este trabajo analizaré la Tasa de desempleo (en España) para diferentes grupos de edad, sexo y Comunidades Autónomas, así como la compararé con la que presentan otros países de la Unión Europea.

Asimismo, analizaré brevemente algunas cuestiones que me parecen interesante, como el % de mujeres directivas que hay en los países de la OCDE y la brecha salarial existente.

A lo largo del trabajo resolveré algunas cuestiones, tales como: Qué comunidad Autónoma presenta una tasa mayor de paro? Qué grupo es el que más se ve afectado? Qué sexo sufre una tasa de paro mayor? En qué país de la Unión Europea hay más desempleo? Qué diferencias hay entre estos países? Y otras cuestiones, a mi parecer interesantes, como son: que % de mujeres acceden a puestos directivos? Como evoluciona la brecha salarial en los diferentes países de la OCDE?

1.1 ¿QUÉ ES EL DESEMPLEO?

El desempleo o paro se da siempre que hay un desajuste en el mercado laboral. Es decir, cuando la oferta de trabajo (por parte de los trabajadores) es mayor a la demanda del trabajo (por parte de las empresas)

Es decir, hay más personas que están dispuestas a ofrecer su trabajo que puestos de trabajo disponibles.

[Ampliar Imagen]

He obtenido la imagen de: aquí, página donde se explican los conceptos básicos del mercado de trabajo.

1.2 ¿CÓMO SE CALCULA LA TASA DE DESEMPLEO?

Teniendo en cuenta aquellas personas que estando en edad de trabajar, es decir, entre 16 y 65 años, y que buscan activamente empleo no lo encuentran. (Estos forman parte de la Población Activa (PA)

Por tanto: \[ Δdesempleo = (Nº desempleados / PA)*100\]

Cabe tener en cuenta que hay diferentes tipos de desempleo, algunos de ellos son:

  1. Desempleo estacional Este se debe a los cambios en la demanda de trabajo debido a las diferentes estaciones del año. Es lo que ocurre por ejemplo, con el sector turístico que absorbe nuevos trabajadores en ciertas epocas del año (verano, navidades…)

  2. Desempleo friccional Este es el voluntario y por tanto, independiente al propio funcionamiento del mercado de trabaja.2

  3. Desempleo cíclico

  4. Desempleo estructural Para combatir este será necesario programas de formación, de adpatación a nuevas tecnologías, etc.

Y ahora ya sí, voy a proceder con el análisis. Para ello lo primero que necesitaré serán los DATOS…

2. DATOS UTILIZADOS

Datos

Trabajaré con los datos que proporciona el INE - Instituto Nacional de Estadística, el Eurostat y la OCDE

El INE nos proporciona datos sobre la Tasa de paro por distintos grupos de edad, sexo y comunidad autónoma divididos por trimestres. Cogeré los correspondientes al periodo 2015T1 - 2020T3


No obstante, como advierte el INE, es necesario comentar dos aspectos:

  1. “Los datos de Ceuta y Melilla han de tomarse con precaución porque pueden estar afectados por grandes errores de muestreo”

  2. “En el 1r trimestre de 2020, como consecuencia de la declaración del Estado de alarma motivado por el COVID-19, el tamaño muestran de las entrevistras en las semanas 11-13 ha sido inferior a la de otros trimestres”

Los datos procedentes del Eurostat los obtendré mediante el paquete “Eurostat” e iran también relacionado con las tasas de desempleo en los diferentes países de la Unión Europea.

Paquetes utilizados

Estos son los paquetes que he necesitado para hacer al presente trabajo.

#Lo primero que tendremos que hacer será cargar estos paquetes. 
#(En caso de no tenerlos instalos habría que instalarlos 
#mediante install.packages("..."))
library(rio)
library(pxR)
library(tidyverse)
library(readxl)
library(eurostat)
library(ggplot2)
library(RColorBrewer)
library(gganimate)
library(gifski)
library(Cairo)
library(scales)
library(patchwork)
library(kableExtra)
library(sf)
library(dygraphs)
library(xts)
library(lubridate)
library(plotly)
library(crosstalk)
library(reactable)
library(ggThemeAssist)
library(magick)
library(cowplot)
library(forcats)
library(ggthemes)
library(DT)
library(janitor)
library(treemapify)
library(robservable)
library(packcircles)
library(viridis)
library(hrbrthemes) 
library(wordcloud2)
library(gt)
library(meme)

Tidy

Con el siguiente código importaré los datos:

datos_INE <- rio::import(here::here("datos", "datos_INE.csv"))
#Podía haber importado también con el paquete: library("pxR") (Este paquete sirve para trabajar con datos PC-Axis)    
file_name <- "http://ine.es/jaxiT3/files/t/es/px/4247.px?nocab=1"
dfINE <- read.px(file_name) %>% as.data.frame()
#Es igual que los datos con los que he trabajado. 
INE <- datos_INE %>% rename(CCAA = "Comunidades y Ciudades Autónomas")
INE <- INE %>% separate(CCAA, c("n_CCAA", "CCAA"), sep = " ")
INE <- INE %>% separate(Periodo, c("Año", "Trimestre"), sep = "_")
INE <- INE %>% 
 mutate(Trimestre = case_when(Trimestre == "T1" ~ "1", 
Trimestre == "T2" ~ "2", 
Trimestre == "T3" ~ "3",
Trimestre == "T4" ~ "4"))
INE$Total <- as.numeric(as.character(INE$Total))
#str(INE)

INE <- INE %>% rename(CCAAs = "CCAA")

INE <- INE %>%
    mutate(CCAA =
    case_when(
    CCAAs == "TotalNacional" ~ "Total Nacional",
    CCAAs == "Andalucía" ~ "Andalucía",
    CCAAs == "LaRioja" ~ "La Rioja",
    CCAAs == "CastillalaMancha" ~ "Castilla la Mancha",
    CCAAs == "Aragón" ~ "Aragón",
    CCAAs == "Canarias" ~ "Canarias",
    CCAAs == "PaísVasco" ~ "País Vasco",
    CCAAs == "Asturias" ~ "Asturias",
    CCAAs == "CastillayLeón" ~ "Castilla y León",
    CCAAs == "Extremadura" ~ "Extremadura",
    CCAAs == "Islas" ~ "Islas Baleares",
    CCAAs == "Madrid" ~ "Madrid",
    CCAAs == "Ceuta" ~ "Ceuta",
    CCAAs == "Melilla" ~ "Melilla",
    CCAAs == "Murcia" ~ "Murcia",
    CCAAs == "Cantabria" ~ "Cantabria",
    CCAAs == "Navarra" ~ "Navarra",
    CCAAs == "Cataluña" ~ "Cataluña",
    CCAAs == "Galicia" ~ "Galícia",
    CCAAs == "ComunitatValenciana" ~ "Com.Valenciana"))

INE <- INE %>% select(-CCAAs)
INE <- INE %>%relocate(CCAA, .after = n_CCAA)
INEb <- rio::import(here::here("datos", "datos_INEb.csv"))
INEb <- INEb %>% rename(CCAA = "Comunidades y Ciudades Autónomas")
INEb <- INEb %>% separate(CCAA, c("n_CCAA", "CCAA"), sep = " ")
INEB <- INEb %>% filter(CCAA != "Total_Nacional" & Edad == "De 25 a 54 años" & Periodo %in% c("2020T1", "2020T2", "2020T3"))
INEB <- INEB %>% filter(Sexo == "Ambos sexos")
INEB$Total <- as.numeric(as.character(INEB$Total))

Si quieres saber de donde he sacado los datos o necesitas consultar otros puedes darle al siguiente link: Datos del INE

Datos que necesitaré para comparar la tasa de paro con otros países de la Unión Europea. Estos los extraeré de la base de datos: EUROSTAT

Paro <- Paro %>% rename(unidad = "unit", sexo = "sex",
edad = "age", total = "isced11", localidad = "geo", Fecha = "time", valor = "values")
paro <- bind_cols(Paro,Paro_etiquetas)
paro <- paro %>% select(edad, geo, Fecha, valor)
paroa <- paro %>% separate(Fecha, c("Año", "Mes", "Dia"), sep = "-")
paroa <- paroa %>% select(geo, edad, Año, valor)
paroa <- paroa %>% filter(Año > "2007")
#rm(datos_INE, Paro, Paro_etiquetas)
rio::export(paro, here::here("datos", "paro_eurostat.csv"))
#Más datos sobre el Eurostat que necesitaré:
buscartabla <- search_eurostat(pattern = "unemployment",type = "table")

#buscartabla %>% select(title, code)

inf_paro <- get_eurostat("tespm080", time_format = "raw", keepFlags = TRUE)

labelE <- label_eurostat(inf_paro, fix_duplicated = TRUE)
df_names <- names(inf_paro)

df <- label_eurostat(inf_paro, code = df_names, fix_duplicated = TRUE)
df <- df %>% select(sex_code, age_code, geo_code, geo, time, values)
paro_joven <- df

A continuación, obtengo y filtro los datos necesarios sobre la brecha salarial en los diferentes países de la OCDE. Filtraré los datos desde 2010 hasta los últimos disponibles, que son 2018.

Los datos están para el primer decil, es decir, aquellos que corresponden al primer grupo de trabajadores (10% con menores salarios) y a los del noveno decil que pasa al contrario, estos son los que cuentan con mejores salarios.

#Importo los datos sobre la brecha salarial
brecha_salarial <- rio::import(here::here("datos", "brecha_salarial.xlsx"))
brecha_salarial <- brecha_salarial %>% select(COU, Country, Indicator, TIME, Value)

Hago lo mismo que antes, pero ahora para los datos sobre la proporción de mujeres directivas, también extraidas de la OCDE.

mujeres_directivas <- rio::import(here::here("datos", "mujeres_directivas.xlsx"))
mujeres_directivas <- mujeres_directivas %>% select(COU, Country, TIME, Value)
mujeres_directivasSpain <- mujeres_directivas %>% filter(Country == "Spain")

3. EVOLUCIÓN DEL DESEMPLEO 2015-2020

grafico1 <- ggplot(UnemploymentT, aes(Trimestre, Total, fill=Trimestre)) +
  geom_col()  + 
  scale_fill_manual(values=brewer.pal(n = 4, name = "PiYG")) +
  facet_wrap(~Año) +  
  scale_y_continuous(breaks = seq(0, 24, 3), limits = c(0, 24))  + 
  theme_test() +  
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) +
  labs(title = "Desempleo en España (%)", caption = "Datos: INE", y=NULL) + 
  theme(plot.title = element_text(size = 18, hjust = 0.5, color="darkmagenta")) +
  theme(plot.caption = element_text(size = 10, hjust = 0)) +
  geom_text(aes(y=Total, label = Total), 
    position = position_dodge(width = 0.9), size = 3.2, 
    vjust=2, col = "White")

grafico1 <- grafico1 + theme(strip.background = element_rect(colour = "black", fill = alpha("green",0.2) ))


Por lo general, y a la vista de los gráficos, el primer trimestre (enero-febrero-marzo) suele ser un mal periodo para el empleo, dado que se terminan mucho de los contratos de las temporadas de rebajas.

Como podemos observar, en 2015 la cifra era de 28,78% todo y que ha ido disminuyendo hasta el presente año, donde las cifras son bastante elevadas.

No obstante, en el año 2020, la cifra de desempleo de los meses correspondientes al primer trimestre ha sido más baja que años previos, como por ejemplo, 2018 o 2019. Pasando por tanto de 16,74% a 14,7% y 14,1% en este último año.

Aun así cabe decir, que como consecuencia de la Covid-19, el paro ha ido ido aumentanto en los sucesivos trimestres. A pesar de ello, a simple vista haber sido inferior que años anteriores. No obstante, cabe comentar qu algunos organismos internacionales esperaban que la tasa de paro aumentara, como consecuencia de la pandemia, más del 20%.

Un factor importante a tener en cuenta es que a causa de la Covid el tamaño muestral ha sido menor del 9 al 29 de marzo (semana 11-12-13) Por lo que, el Instituto Nacional de Estadística avisa que la cifra de paro podría ser realmente mayor que la que contemplan los datos: “Es probable que muchos trabajadores que hayan perdido su empleo se hayan clasificado como inactivos debido a que no han podido cumplir con las condiciones de búsqueda de trabajo que la EPA determina para que sean considerados parados” (INE, 2020)

Otra de cuestiones a resaltar es que normalmente en los meses de verano la tasa de desempleo tiende a disminuir respecto a los trimestres anteriores. En cambio, como podemos observar en el gráfico del 2020 sucedió al contrario pasando de 14,41 a 15,33 y 16,26 en los tres primeros trimestres del año. (EL cuarto trimestre no se ha considerado, dado que los datos no están todavía disponibles)

3.1 Evolución del desempleo por grupos de edad

En el siguiente gráfico, parecido a una “piramide”, se muestra la evolución de la tasa de paro diferenciando por el género y los diferentes grupos de edad: 16-19 años; 20-24 años; 25-54 años y de 55 hasta la edad de jubilación.

INEP <- INE %>%
  filter(n_CCAA == "00" & Sexo %in% c("Hombres", "Mujeres") & Edad!= "Total" & Trimestre == "3")
INEP <- INEP %>%
  filter(Edad %in% c("De 16 a 19 años", "De 20 a 24 años", "De 25 a 54 años", "De 55 y más años"))
#str(INEP)

piramide <- INEP %>% 
  mutate(TotalT = ifelse(Sexo == "Hombres", -Total, Total)) %>% 
  ggplot(aes(x=TotalT, y = Edad, fill = Sexo)) + 
  geom_col(position = "stack", alpha = 0.6, color = "black") + 
  scale_fill_manual(values = c("seagreen3", "purple")) + 
  facet_wrap(~paste("Año", Año))+ 
  theme_classic() +
  theme(legend.position = "bottom", 
    plot.caption = element_text(hjust = 0), 
    strip.text = element_text(size = 12, face = "bold")) + 
  scale_x_continuous(labels = abs) + 
  labs (x = "Tasa de desempleo (%)", y = "Grupos de edad",
    title = "Tasa de desempleo Total, según grupos de edad y género (%)",
    subtitle = "Para el 3r trimetre: julio-agosto-septiembre", 
    caption = "Elaboración propia. Datos: INE") + 
  geom_text(aes(label=Total), position = position_dodge(width = 0), 
    color = "black", 
    size = 2.19,
    hjust = 0.5,
    vjust=-1)

Como podemos observar mediante el gráfico, el grupo de edad más perjudicado por la tasa de desempleo, son aquellos que tienen entre 16 y 19 años, seguidos de los de 20 a 24 años.

Esto se debe entre otros motivos, por la falta de experiencia, que muchas empresas reclaman a la hora de contratar. Ya que, aunque muchos si dispongan de ciertos conomientos y tengan formación suficiente por haber realizado grados universitarios o cursos de formación, hay una falta de práctica y de experiencia que las empresas exigen a la hora de contratar a nuevo personal.

No obstante, como podemos ver, la tasa de desempleo en estas edades ha ido disminuyendo en los años posteriores a 2015, todo y que con la crisis actual ha vuelto a aumentar.

Asimismo, de acuerdo con los gráficos, podemos extraer que para grupos de edad a partir de 25 años, y sobretodo a partir de 55 la tasa de paro es considerablemente menor. Tiene lógica, dado que la ocupación se concentra primordialmente en aquellos cuya edad es entre 25 y 54 años.

Por otro lado, decir que, como podemos observar, para cualquier franja de edad las mujeres sufren una tasa de desempleo mayor que los hombres. A excepción del año 2016 (y 2018) donde la tasa de desempleo de las mujeres de 20-24 años era de 39,18% frente a la de los hombres que era de las mujeres 39,18%; y en el año 2017, donde la tasa de paro femenina para el el grupo de edad de 16-19 era 3,53% menor, una diferencia mínima.

Por lo que podemos concluir que los grupos sociales más castigados por el desempleo son las mujeres y los jóvenes, quienes acaban sintiéndose, muchas veces, como marginados o “desanimados” a la hora de buscar trabajo

Respecto a que las mujeres sufren una tasa de paro mayor que los hombres, queda demostrado también con el gráfico evolutivo del apartado [6. DISTRIBUCIÓN DESEMPLEO EN LA COM.VALENCIANA]

3.2 ¿Qué tasa de paro hubo en….?

#Para hacer la tabla me he inspirado en el trabajo Nombres y apellidos en España"
#de nuestros compañeros Laura Albert, Laura Borrás y Daniel Casinos. 

data <- SharedData$new(INEH) #Paso los datos a un widget que es compatible con el paquete crosstalk

bscols(widths = c(3,NA,NA),
  list( filter_checkbox("Sexo", "Sexo", data, ~Sexo, columns =1), 
    filter_checkbox("Año", "Año", data, ~Año, columns =1),
      filter_slider("Trimestre", "Trimestre",
        data, ~Trimestre, width = "100%"),
  filter_select("CCAA", "CCAA", data, ~CCAA)), 
   reactable(data, minRows = 10, defaultPageSize =  10, 
     paginationType = "jump",  showPageSizeOptions =  TRUE , 
     pageSizeOptions =  c ( 10 , 50 , 100 ),defaultColDef = colDef(
    align = "center",
    minWidth = 70,
    headerStyle = list(background = "lightgreen"),
       filterable = FALSE), highlight = TRUE,
     outlined = TRUE, columns = list(Edad = colDef(style = function(value) {
    if (value > 1) {
      color <- "#e00000"}
      else {
      color <- "#008000"
    }
    list(color = color, fontWeight = "bold")
  }), Total = colDef(name = "Valor", format = colFormat(suffix = "%")))))

La anterior tabla permite consultar la tasa en las diferentes Comunidades Autónomas de España y para diferentes grupos de edad: 16-19 años, 20-24 años, 24-54 y más de 55, que incluyte hasta la edad de jubilación. Ádemás, se puede diferenciar por sexo femenino o masculino.

4. TASA DE DESEMPLEO AÑO 2020.

Como podemos observar en esta tabla, la Comunidad Autónoma con menos porcentaje de desempleados en el año 2020 ha sido Navarra, que presentó un 4,51 de paro en el segundo trimestre para el grupo de edad de 55 a 65 años.

Menos desempleados año 2020
CCAA Sexo Edad Año Trimestre Total
Navarra Hombres De 55 y más años 2020 2 4.51

Evolución desempleo CCAA

A través del siguiente gráfico de barras podemos observar la evolución de la tasa de paro en los 3 primeros trimestres del año 2020 en las diferentes Comunidades Autónomas y concluir como ha afectado la actual pandemía en el mercado de trabajo español.

INEBb <- INEB %>% mutate(Periodoo = case_when(Periodo == "2020T3" ~ "3",
  Periodo == "2020T2" ~ "2",
  Periodo == "2020T1" ~ "1"))

INEBb <- INEBb %>% select(-Periodo) %>% 
        select(CCAA, Total, Periodoo)
INEBb <- INEBb %>%
          rename("Periodo" = "Periodoo")
#str(INEBb)
#str(INEB)
grafico2 <- ggplot(INEBb, aes(Periodo, Total, fill = Periodo)) + 
  geom_col()+
  facet_wrap(~CCAA) +
  theme_test() + 
  theme(legend.position = "none") + 
  labs(y=NULL, x=NULL) +  
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank()) + 
  labs(title = "DESEMPLEO EN LAS CCAA (3 trimestres 2020)", 
    subtitle = "De 25 a 54 años") + 
  scale_y_continuous(breaks = seq(0, 26, 2), limits = c(0, 26)) +
  theme(plot.title = element_text(size = 14, hjust = 0.5, color="turquoise4")) +
  theme(plot.subtitle = element_text(size = 19, hjust = 0.5, color="black")) +
  scale_fill_manual(values=c("seagreen","seagreen3","palegreen")) 


Al pasar el ratón por cada columna, que corresponde a los tres primeros trimestres del año 2020, nos muestra el % de desempleo que ha tenido x Comunidad Autónoma.

Cabe resaltar que las CCAA con más % de desempleados son: Andalucía, Canarias, Ceuta, Extremadura y Malilla. En estas se muestra como la tasa de paro en el tercer trimestre ha sido superior a la de los triemstres previos, excepto en Exremadura que presentó una tasa de paro superior en el primer trimestre, 23,66% (1T) frente a 19,16% (3T)

Asímismo, Ceuta para el segundo trimestre muestra una dismunicón del 6,69%, no obstante, hay que tener en cuenta que los datos obtenidos de Ceuta y Melilla han de tomarse con precaución, ya que pueden estar afectados por errores de muestreo, como he indicado al incio del trabajo.

Resaltar también, el caso del País Vasco, donde la tasa de paro se mantiene constante durante los 3 trimestres considerados (8,48%, 8,54% y 8,58%)

Por último, decir que hay que tener en cuenta que los datos, como además, podemos observar, reflejan minimamente el efecto de la pandemía, ya que no están contabilizadas las personas afectadas por ERTE (Expendientes de Regulación Temporal de Empleo)

Respecto a los ERTE, comentar que, de acuerdo con los datos ofrecidos por el Diario, Andalucía cuenta con el mayor número de ERTE (88.650) Todo y que Cataluña ha sumado el mayor número de afectados (603.105) Esto se debe a que aquí se han visto afectados sobre todo aquellos que formaban parte del sector turístico y de la automoción (Seat y Nissan tuvieron que parar por la falta de suministros durante la Covid) Así mismo, en comunidades como Madrid y Andalucía la mayoría de afectados por ERTE corresponden a empresas pequeñas que se dedican a la hosteleria, comercio o actividades culturales principalmente.

Treemapify para el 3r Trimestre

INEB3 <- INEB %>% filter(Periodo == "2020T3")
INEB3$CCAA <- recode(INEB3$CCAA, 
 "Comunitat_Valenciana"="Comunitat Valenciana", 
  "La_Rioja" = "La Rioja", 
  "Castilla_y_León" = "Castilla y León", 
  "Castilla_la_Mancha" = "Castilla la Macha", 
  "País_Vasco" = "País Vasco")

ggplot(INEB3, aes(area = Total, fill = Total, label = CCAA)) +
  geom_treemap() +
  geom_treemap_text(fontface = "italic", 
    colour = "white", place = "centre",
                    grow = FALSE) +
scale_fill_viridis_c(option = "viridis", name = "", 
  alpha = 1, begin = 0.1, end = 0.9,direction = -1,
  guide = guide_colorbar( title = "TASA DE DESEMPLEO",
    direction = "horizontal", barheight = unit(3, units = "mm"), 
    barwidth = unit(55, units = "mm"), draw.ulim = F, 
    title.position = 'top', title.hjust = 0.5, label.hjust = 0.5)) +
  theme(legend.position = "bottom")  +
  labs(title = "TASA DE DESEMPLEO EN LAS DIFERENTES CCAA PARA 2020T3",
       caption = "Datos extraidos del INE") + 
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5))  

En este gráfico se muestra la tasa de desempleo para el tercer trimestre de 2020, julio-agosto-septiembre. La leyenda nos indica que el color más clarito, corresponde a aquellas Comunidades Autónomas que han tenido una tasa de paro menor. Como se ha podido comprobar también mediante el gráfico de la “Evolución desempleo CCAA” estas son Navarra y el País Vasco, con una tasa de 8,87% y 8,58% respectivamente.

A través del treemap podemos ver confirmar como Andalucía, Canarias, Ceuta y Melilla son las Comunidades Autónomas con más tasa de desempleo, como ya se ha comentado anteriormente.

Así mismo, la Comunidad Valenciana, muestra una cifra de desempleo total, en torno al 15%.

CCAA con mayor tasa


En estas tablas se diferencia por el género y el grupo de edad, además del trimestre.

INEM <- INE %>% filter(Sexo == "Mujeres") %>%
  filter(Año == "2020")
INEM$Trimestre <- as.numeric(as.character(INEM$Trimestre))

INEMmax <- INEM %>% 
  slice_max(Total, n=1) %>% 
  select(CCAA, Sexo, Edad, Año, Trimestre, Total) %>%
  arrange(Sexo, Trimestre)

knitr::kable(INEMmax, align = "c", 
  caption = "Comunidades Autónomas con más mujeres desempleados (2020)") %>% kableExtra::kable_styling(fixed_thead = list(enabled = T, 
    background = "plum")) %>% 
  kable_paper(full_width = F) %>%
column_spec(6, color = "white", 
  background = ifelse(INEMmax$Total > 1 , "mediumvioletred")) 
Comunidades Autónomas con más mujeres desempleados (2020)
CCAA Sexo Edad Año Trimestre Total
Extremadura Mujeres De 16 a 19 años 2020 1 100
Ceuta Mujeres De 16 a 19 años 2020 1 100
La Rioja Mujeres De 16 a 19 años 2020 2 100
Ceuta Mujeres De 16 a 19 años 2020 2 100
Melilla Mujeres De 16 a 19 años 2020 2 100
Canarias Mujeres De 16 a 19 años 2020 3 100
Ceuta Mujeres De 16 a 19 años 2020 3 100
Melilla Mujeres De 16 a 19 años 2020 3 100
Comunidades Autónomas con más varones desempleados (2020)
CCAA Sexo Edad Año Trimestre Total
Ceuta Hombres De 16 a 19 años 2020 1 100
Melilla Hombres De 16 a 19 años 2020 1 100
Asturias Hombres De 16 a 19 años 2020 2 100
Ceuta Hombres De 16 a 19 años 2020 2 100
Melilla Hombres De 16 a 19 años 2020 2 100
Ceuta Hombres De 16 a 19 años 2020 3 100
Melilla Hombres De 16 a 19 años 2020 3 100

Como podemos observar, hay Comunidades Autónomas que han presentado para el año 2020 una cifra de desempleo del 100%. Además todas ellas, para el grupo de edad entre 16 y 19 años.

5. MAPAS DESEMPLEO 2020T2 SEGÚN GRUPO DE EDAD

Filtro por los datos correspondientes al segundo trimestre (abril, mayo, junio), dado que así podemos ver los efectos de la pandemia, Covid-19. Además de que el tamaño de la muestra de los datos del primer trimestre, como advierte el INE fue menor a la de los otros trimestres. (Por tanto, pienso que es mejor coger el segundo trimestre que el primero.) De igual modo, las ciudades autónomas, Ceuta y Melilla, no las he cogido para representar los datos en el Mapa, puestos que como indica el INe, estos valores pueden estar afectados por errores de muestreo.

De 16 a 24 años

#CÓDIGO USADO PARA LOS MAPAS
CCAA <- rio::import("https://github.com/perezp44/LAU2boundaries4spain/blob/master/data/CCAA.rda?raw=true")
INEMAPA <- INE %>% filter(Sexo == "Ambos sexos") %>% 
  filter(CCAA != "Total Nacional") %>% filter(Edad == "Menores de 25 años") %>% filter(Año == "2020") %>% 
  filter(Trimestre == "2") %>% 
  slice(-18) %>% 
  slice(-18)
  
#names(CCAA)
#names(INEMAPA)
canarias <- CCAA %>% filter(INECodCCAA == "05")
peninsula <- CCAA %>% filter(INECodCCAA != "05")
my_shift <- st_bbox(peninsula)[c(1,2)]- (st_bbox(canarias)[c(1,2)]) + c(-2.4, -1.1)
canarias$geometry <- canarias$geometry + my_shift
st_crs(canarias)  <- st_crs(peninsula)
peninsula_y_canarias <- rbind(peninsula, canarias)
peninsula_y_canarias <- peninsula_y_canarias %>% slice(-17)
peninsula_y_canarias = sf::st_cast(peninsula_y_canarias, "MULTIPOLYGON")

p <- ggplot(texto = "CCAA" ) + geom_sf(data = peninsula_y_canarias)

Union <- full_join(peninsula_y_canarias, INEMAPA, by = c("INECodCCAA" = "n_CCAA"))
#names(Union)
Union1 <- Union %>% select(CCAA, Edad, Trimestre, Total, geometry)
CCAA_point <- st_centroid(Union1)
CCAA_points <- cbind(Union1, st_coordinates(st_centroid(Union1$geometry)))
ggplot() + geom_sf(data = peninsula_y_canarias, fill=NA) +  
  geom_sf(data = CCAA_points, aes(geometry = geometry, fill = Total)) + 
  geom_text(data = CCAA_points, 
    aes(X, y=Y, label=percent(Total/100)),
    color = "Black", fontface = "bold",
    check_overlap = TRUE, size = 2.5) + 
  labs(subtitle = "Edad: 16-24 años")  + 
  theme_void() + 
  theme(plot.subtitle = element_text(hjust = 0.5))+ 
  scale_fill_viridis_c(direction = -1)

Para el grupo de edad más joven, este es el de 16-24 años, se puede observar, en la leyenda, como la tasa de paro comprende valores entre el 30% y casi el 60%

Siendo Cantabria la Comunidad Autónoma con más % de desempleados entre 16-24 años, estos suman 57,67%. En cambio, Aragón se muestra como la que menor tasa de deseempleo juvenil presental.

De 25 a 54 años

Los valores en este caso han cambiado, van de aproximadamente el 9% al 20%. Siendo el País Vasco la Comunidad Autónoma con menor % de desempleados para el grupo de edad de 25 a 54 años. (Mientras que tenía un 30,92% de paro juvenil) Por contra, la Comunidad Autónoma que presenta un mayor porcentaje de parados para este grupo de edad es Andalucía, seguido de Extremadura y las Islas Canarias.

También es importante tener en cuenta el número de parados de larga duración que hay entre este grupo de edad y que muchas veces puede llevar a que estos se desanimen a la hora de buscar un empleo. E incluso puede dar lugar a que realizen otras actividades que sean remuneradas pero no declaradas. Por lo que se escapen del control de las Administraciones y de las estadísticas oficiales (economia sumergida)

De 55 a 64 años

Como podemos observar, para este grupo de edad la tasa de desempleo es menor en comparación con los otros grupos considerados. Esta coge valores en torno al 5% hasta el 19%, siendo Canarias la CCAA con más porcentaje de desempleados para este rango de edad y Navarra la que menor % presenta, un 5,410%. Cabe tener en cuenta que esta es la franja de edad donde menos empleo se destruye.

6. EVOLUCIÓN DESEMPLEO SEGÚN GÉNERO

Mediante los gráficos siguientes, podemos ver como ha sido la evolución de la tasa de paro global (Sin diferenciar por grupos de edad) en los 3 primeros trimestres del año 2020. Así como que género ha presentado una tasa mayor y en qué comunidad autónoma.


¿CÓMO HA EVOLUCIONADO LA TASA DE PARO FEMENINA?

CCAA CON MÁS PARO FEMENINO (%)
CCAA Año Trimestre Total Mapa
Andalucía 2020 3 28.51


¿Y LA TASA DE PARO MASCULINA?

CCAA CON MÁS PARO MASCULINO (%)
CCAA Año Trimestre Total Mapa
Canarias 2020 3 22.59

Como podemos ver tras la evolución de los mapas y como se ha comentado anteriormente, las mujeres son las que más están sufriendo los estragos del desempleo por la pandemia. Además, los datos recogidos en la encuesta de Población Activa apuntan que en el tercer trimestre de 2020 264.700 mujeres perdieron su empleo, frente a 90.300 hombres. Por tanto, como informa Andrea Vicario en el diario digital Nueva Tribuna, la tasa de paro femenina es 4 puntos superior a la de los hombres.

#Este es el código que he utilizado para hacer los mmapas. Mismo procedimiento para el desempleo masculino.
ggplot() + geom_sf(data = peninsula_y_canarias, color = "black") +
    geom_sf(data = INEMAPAA4, aes(geometry = geometry, fill = Total)) +
  geom_sf(data = INEMAPA4b, aes(geometry = geometry, fill = Total)) +
  theme(panel.background = element_rect(fill = "azure")) +
  transition_manual(Trimestre) + theme_void() + labs(title="TASA DE DESEMPLEO FEMENINO -  Periodo: {current_frame}",
    caption = "Datos extraidos del INE") +
  theme(plot.title = element_text(size = 18,
    hjust = 0.6, color="black")) +
  scale_fill_viridis_c(direction = -1)
#Este es el código que he utilizado para hacer la tabla que nos muestra cuál ha sido la comunidad Autónoma con más desempleo femenino y en qué trimestre. Cogiendo los datos globales (No diferenciando por grupos de edad) 
#Mismo procedimiento para la tasa de paro masculina. 
INEMAPA4bb <- INEMAPA4 %>% slice_max(Total, n=1)
Mapa <- "https://2.bp.blogspot.com/-3ocbiESoRJY/UeP7h0Lf-VI/AAAAAAAABJM/bLi3UFnZaPs/s1600/ZONA+SUR.jpg"

df_max <- INEMAPA4bb %>% add_column(Mapa)
df_max <- df_max %>% select(-c(Sexo, n_CCAA, Edad))

Tabla_dfmax<- df_max %>% gt()

Tabla_dfmax <- Tabla_dfmax %>%
                   tab_header(title = md("**CCAA CON MÁS PARO FEMENINO**"))

Tabla_dfmax <- Tabla_dfmax %>%
                tab_options(heading.background.color = "black") %>% tab_options(heading.title.font.size = 15, heading.subtitle.font.size = 13,  column_labels.font.weight =  "bold")

Tabla_dfmax  %>%
  gt::text_transform(locations = cells_body(columns = vars(Mapa)), fn = function(x) {gt::web_image(x, height = 50)}) %>%  cols_align(align = "center")


7. DESEMPLEO EN LA COM.VALENCIANA

Distribución tasa desempleo

Es importante tener en cuenta que los datos represenetados en el gráfico circular corresponden al desempleo para cada grupo de edad dividido entre la suma de todos estos, para representar la proporción de cada uno y que la suma total de el 100% (Es decir, de 16 a 19 años en el segundo trimestre de 2020 en la Comunidad Valenciana hubo una tasa de paro del 77,64%. Todo y que sobre el total del paro, teniendo en cuenta la suma de todas las tasas, representó el 52,3%)

trim2 <- ggplot(INE20T2, aes("", TotalT, fill = Edad)) + 
  geom_bar(stat = "identity", color="white") +
  coord_polar(theta = "y") +  
  theme_void() +  
  scale_fill_manual(values=c("seagreen2","orchid1","olivedrab1","aquamarine")) + geom_text(aes(label=percent(TotalT/100)), 
    position = position_stack(vjust = 0.5), color = "black", size = 2.5) + 
  labs(subtitle = "Segundo trimestre") + 
  theme(plot.subtitle = element_text(hjust = 0.5)) + 
  theme(legend.position = "none") 
#Hago lo mismo para los otros trimestres y para el paro masculino-


Mediante este gráfico, podemos comprovar lo que se ha mostrado previamente, el grupo de edad que ha presentado una mayor tasa de paro ha sido el de menor edad, es deicr, aquel que va de 16-19 años. Seguido del de 20-24 años. Así mismo, observamos que el % de desempleoo femino, por lo general, ha sido superior al de los hombres en la Comunidad Valenciana, todo y que no han habido grandes diferencias.

Cabe resaltar además que en el segundo trimestre las tasas de paro fueron mayor que en el primer trimestre. Así como que del segundo al tercer trimestre, el desempleo para el grupo de edad de 16 a 19 años disminuyó, mientras que el de 20 a 24 años, también dentro de la edad considerada como paro juvenil, aumentó.


¿Qué genero presenta una tasa de paro mayor en la Comunidad Valenciana?
INEVLC <- INE %>% filter(n_CCAA == "10") %>% 
  filter(Sexo != "Ambos sexos") %>% 
  filter(Edad == "Total") %>% 
  unite(Periodo, Año:Trimestre, sep = ".")

INEVLC$Periodo <- as.numeric(as.character(INEVLC$Periodo))
INEVLC <- transform(INEVLC, Periodo = as.numeric(Periodo))

a <- ggplot(INEVLC, aes(Periodo, Total, group = Sexo, color=Sexo)) + 
  geom_line(size  = 0.9) + 
  geom_point() + 
  scale_color_manual(values=c("seagreen3","purple")) + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  theme_minimal() +
  geom_vline(xintercept = 2015) + 
  geom_hline(yintercept = 11)

a + theme(legend.position = "bottom", 
  legend.direction = "horizontal") + transition_reveal(Periodo) +  
labs(title = "EVOLUCIÓN PARO COM. VALENCIANA. Periodo: {as.integer(frame_along)}",
caption = "Elaboración propia con los datos del INE. 
  Cada punto representa un trimestre de 2015-2020", 
  y="Total paro (%)")

El anterior gráfico muestra como ha evolucionado la tasa de paro desde 2015 hasta 2020 para los diferentes trimestres del año, diferenciando por género.

Como podemos observar la tendencia en ambos géneros va a la par, en unos niveles no inferiores al 11%, que han ido disminuyendo a partir de 2015 y han vuelto a aumentar con la actual pandemía. Del mismo modo, se muestra, como se ha comentado anteriormente, que las mujeres sufren una tasa de desempleo mayor.

Respecto a esto, cabe comentar que en algunos informes, como por ejemplo el de “Brechas de género en el mercado laboral español” se explica que las mujeres por lo general suelen estar más formadas a la hora de enfrentarse al mundo laboral, sin embargo, son las que generalmente sufren una tasa de desempleo mayor, que ronda los 6 puntos de diferencia.

Además de ello, si nos centraramos en la ocupación, habría que señalar que cobran unos salarios en torno al 20% menor y que los empleos en los que están ocupadas es en la mayoría de los casos con contratos temporales y a tiempo parcial, pese a no ser lo que en un buscaban.

Evolución según grupos edad


También podemos analizar la evolución del paro por los grupos de edad y sin diferenciar el sexo. En este gráfico se aprecia lo que se ha comentado previamente, que el desempleo ha aumentado, en el tercer trimestre era mayor que en el primero. Así como que los grupos con menos edad son los que se han visto más afectados en este aspecto por la crisis sanitaria actual.

GPOINT <- ggplot(INECVLC, aes(x=Periodo, y=Edad, size = Total, color = Edad)) +
    geom_point(aes(fill=Edad, alpha = 0.2),pch=21,colour="black") +
    scale_size(range = c(9, 32), name="Total (%)")  + theme_ipsum_rc() + 
    theme(legend.position = "none", 
      panel.background = element_blank(), panel.grid  = element_blank()) +
  labs(x=NULL, y=NULL, title= "EVOLUCIÓN DEL PARO TOTAL (%)", subtitle = "En la Comunidad Valenciana", caption = "Datos: INE") + 
  geom_text(aes(label = Total), color = "black", size = 2.5) + scale_fill_manual(values=c("seagreen2","olivedrab1","aquamarine","orchid1")) 

GPOINT + theme (axis.text.x = element_text(face = "bold", colour="mediumorchid4", size=rel(1.5)),
           axis.text.y = element_text(face = "bold",
             colour="mediumorchid4", size=rel(1), hjust=0.5)) + 
  transition_states(Edad) 

8. EL DESEMPLEO EN EUROPA

Tasa de desempleo en Europa

Mediante el siguiente gráfico evolutivo, se muestra como ha ido variando la tasa de paro desde 2008 hasta 2019 en la Unión Europea.

a <- ggplot(paroag)+
  geom_col(aes(ranking,value,fill=id))+
  scale_fill_manual(values=mycolors)+
  geom_text(aes(ranking,value,label=as.factor(value)),hjust=-0.2,size=5)+
  geom_text(aes(ranking, y=0 , label = id), hjust=1.1,size=5) +
  geom_text(aes(x=10, y=max(value) , label = as.factor(date)),
    vjust = 0, hjust=0.5, alpha = 0.1,  col = "black", size = 20)+
  labs(title = "10 PAÍSES CON MAYOR DESEMPLEO EN LA UNIÓN EUROPEA (%)",
       subtitle = "De 2008-2019",
       x=NULL,
       y=NULL)+
  coord_flip(clip = "off")+
  scale_x_reverse()+
  theme_minimal()+
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.y = element_blank(),
        axis.text.x = element_blank(),
        plot.title = element_text(hjust = 0, size=20,face="bold"),
        plot.subtitle = element_text(hjust = 0, size=12, face="italic"),
        plot.margin = margin(1, 4, 1, 3, "cm"))+
  transition_states(date,transition_length = 1,state_length = 0,wrap = FALSE)
animate(a,
        nframes = 400,
        fps = 16,
        end_pause = 150,
        width = 1000,
        height = 600,
        type = "cairo")

Como se puede observar, los países que se han mantenido en los primeros puestos, han sido Greica, España, Montenegro y Macedonia.

Como podemos observar, España ha pasado de estar en el segundo lugar al incio de la crisis económica de 2008 al 4to lugar en 2019. Mientras que el aumento en Grecia ha sido más pronunciado.



DESEMPLEO PARA 6 PAÍSES EUROPEOS:

En los siguientes gráficos se mostrará el desempleo de España y de otros países de la Unión Europea: Francia, Italia, Portugal, Grecia y Finlandia.

paroF <- paro %>% filter(edad == "Y20-64") %>% filter(geo %in% c("Spain", "Italy", "France", "Portugal", "Finland", "Greece")) %>% mutate(País = case_when(geo == "Finland" ~ "Finlandia", 
geo == "France" ~ "Francia", 
geo == "Greece" ~ "Grecia",
geo == "Portugal" ~ "Portugal",
geo == "Spain" ~ "España",
geo == "Italy" ~ "Italia")) 
paroF <- paroF %>% select(-geo) %>% select(Fecha, País, valor)

ggplot(paroF, aes(Fecha, valor)) + geom_line(size = 1.2, color = "black") +
  geom_area(fill = "orchid4", size = 0.6) + 
  facet_wrap(~País) + 
  theme_stata(base_size = 12, base_family = "Arial", scheme = "s1color") +
  labs(y = "Valor (%)", x = "Año", 
    title = "TASA DE DESEMPLEO (%)", 
    caption = "Elaboración propia. Datos: Eurostat")

A través del gráfico, observamos como para estos 6 países, Grecia es la que mayor tasa de desempleo presenta seguida de España, teniendo su pico en 2014, ambas, en plena crisis económica. Por contra, Finlandia, muestra una tasa de paro con unos niveles no superiores al 10%, semejante al de Francia. Portugal, en cambio, muestra un aumento al inicio de la crisis económica y su pico en 2014 al igual que España y Grecia, todo y que con una tasa de desempleo menor que estos otros.

No obstante, hay que tener en cuenta que el mercado de trabajo de cada uno de estos países presenta unas peculiaridades diferentes sobre todo en el caso de Finlandia, que habría que considerar a la hora de hacer un análisis con más profundidad.

Por ejemplo, como curiosidad, en Finlandia, existen tres modalidades de prestación por desempleo:

  • PRESTACIÓN POR DESEMPLEO BÁSICA - La que se percibe de la Seguridad Social finesa, Kelea (Una cantidad fija en torno a 700 euros al mes o superior si se tienen hijos a cargo)

  • CAJA DE SEGURO, es decir, la mayoría de finalndeses se suscriben a un seguro por desempleo, esto se denominan “Cajas de Seguro por Desempleo”.

  • SUBSIDIO DE MERCADO LABORAL Esta es para los que no han contratado un seguro por desempleo ni han cumplido con los requisitos establecidos para cobrar la prestación básica. (Esta es otorgada también por Kela y se recibe una cantidad en torno a 700 euros)

Además, hay que tener en cuenta que el mercado de trabajo que hay en el país escandinavo es mucho más flexible que, por ejemplo, el de España, donde hay una rigideza a la baja en los salarios, lo que hace que la tasa de desempleo sea mayor que si no hubieran tanta rigidez.

Tabla

paroTabla <- paroag %>% rename("País" = id) %>% rename("Año" = date) %>% rename("Valor" = value) %>% select(País, Año, Valor)

datatable(paroTabla, 
  caption = "Tabla para consultar los datos del gráfico anterior",
  extensions = 'Buttons', 
  options = list(dom = 'Blfrtip',  buttons = c('copy', 'excel', 'pdf', 'print'), 
    pageLength = 10, 
    autoWidth = TRUE))

A través del gráfico, observamos como para estos 6 países, Grecia es la que mayor tasa de desempleo presenta seguida de España, teniendo su pico en 2014, ambas, en plena crisis económica. Por contra, Finlandia, muestra una tasa de paro con unos niveles no superiores al 10%, semejante al de Francia. Portugal, en cambio, muestra un aumento al inicio de la crisis económica y su pico en 2014 al igual que España y Grecia, todo y que con una tasa de desempleo menor que estos otros.

No obstante, hay que tener en cuenta que el mercado de trabajo de cada uno de estos países presenta unas peculiaridades diferentes sobre todo en el caso de Finlandia, que habría que considerar a la hora de hacer un análisis con más profundidad.

Por ejemplo, como curiosidad, en Finlandia, existen tres modalidades de prestación por desempleo:

  • PRESTACIÓN POR DESEMPLEO BÁSICA - La que se percibe de la Seguridad Social finesa, Kelea (Una cantidad fija en torno a 700 euros al mes o superior si se tienen hijos a cargo)

  • CAJA DE SEGURO, es decir, la mayoría de finalndeses se suscriben a un seguro por desempleo, esto se denominan “Cajas de Seguro por Desempleo”.

  • SUBSIDIO DE MERCADO LABORAL Esta es para los que no han contratado un seguro por desempleo ni han cumplido con los requisitos establecidos para cobrar la prestación básica. (Esta es otorgada también por Kela y se recibe una cantidad en torno a 700 euros)

Además, hay que tener en cuenta que el mercado de trabajo que hay en el país escandinavo es mucho más flexible que, por ejemplo, el de España, donde hay una rigideza a la baja en los salarios, lo que hace que la tasa de desempleo sea mayor que si no hubieran tanta rigidez.

EVOLUCIÓN TASA DE PARO JUVENIL

El paro juvenil incluye el paro de las personas jóvenes, definidas por las Naciones Unidas, como aquellas personas que tienen una edad comprendida entre 15 y 24 años.

Evolución del desempleo juvenil Para los 6 países escogidos también, en el gráfico anterior, estos son: Finlandia, Francia, Grecia, Italia, Portugal y España.

paroJ %>% ggplot(aes(Fecha, valor, size=valor, color=País)) + 
  geom_point(alpha = 0.8) +   
  scale_size(range = c(2, 20), name="Valor (%))")  + 
   geom_line(size = 1) +
  facet_wrap(~País) +
  scale_fill_viridis(discrete=TRUE, guide=FALSE, option="A") + 
  theme_hc() + 
  theme(legend.position = "none") + 
  labs(title = "Evolución del desempleo Juvenil - Periodo: 2005-2019", 
    subtitle = "Año: {as.integer(frame_along)}", 
    caption = "Datos extraidos del Eurostat", x=NULL, y="Valor (%)") + transition_reveal(Fecha) + 
  theme(strip.background = element_rect(colour = "black",
    fill = alpha("green",0.4)))

#Preparando los datos
paro_joven$geo <- recode(paro_joven$geo, 
 "Germany (until 1990 former territory of the FRG)"="Germany", 
  "Czechia" = "Czech Republic", 
  "North Macedonia" = "Macedonia")

paro_joven$time <- as.numeric(as.character(paro_joven$time))

world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
world_points<- st_centroid(world)
world_points <- cbind(world, st_coordinates(st_centroid(world$geometry)))

df_inner <- inner_join(world, paro_joven, by= c("sovereignt" = "geo"))
df_paro <- df_inner %>% select(sovereignt, time, values)

df_parob <- paro_joven %>% filter(time == 2013)
df_inne2r <- inner_join(world, df_parob, by= c("sovereignt" = "geo"))
df_parob <- df_inne2r %>% select(sovereignt, time, values)
ggplot() + geom_sf(data = world, color = "black") + 
    geom_sf(data = df_paro, aes(geometry = geometry, fill = values)) + 
  geom_sf(data = df_parob, aes(geometry = geometry, fill = values)) + coord_sf(xlim = c(-13.00, 36.00), ylim = c(35, 67.44), expand = FALSE) +
  theme(panel.background = element_rect(fill = "azure")) +
  transition_manual(time) + theme_void() + labs(title="PARO JUVENIL EUROPEO Año: {current_frame}", 
    caption = "Datos extraidos del Eurostat y Natural Earth") +
  theme(plot.title = element_text(size = 18,
    hjust = 0.6, color="darkmagenta")) +
  scale_fill_viridis_c(direction = -1)


9. OTROS DATOS DEL MERCADO DE TRABAJO…

Mujeres en los puestos directivos


El concepto TECHO DE CRISTAL se oirignó en un discurso de Marilyn Loden en 1978. Se define como la fuerza invisible que impide a las mujeres acceder a los cargos directivos.



Para analizar esto usaré los datos obtenidos de la OCDE sobre el % de mujeres directivas. Los datos disponibles van desde el año 2011 hasta el 2018.

En primer lugar decir que con el wordcloud podemos observar que para el 2018 los 10 países que tenían mayor % de mujeres directivas están mostrados con un mayor tamaño en las letras. Así como, los que tenían un menor % aparecen con un tamaño menor. Entre estos últimos destacaría Japón, India y Corea como países en los que menos % de mujeres pueden acceder a puestos directivos.

En el siguiente gráfico podemos ver como ha evolucionado esta variable, mujeres directivas, en España:

mujeres_directivasS <- mujeres_directivas %>% 
  filter(Country %in% c("Spain")) %>% 
  mutate(País = case_when(Country == "Spain" ~ "España")) 
mujeres_directivasS <- mujeres_directivasS %>% select(País, TIME, Value)
mujeres_directivasS$Value <- as.numeric(as.character(mujeres_directivasS$Value))
mujeres_directivasS$TIME <- as.numeric(as.character(mujeres_directivasS$TIME))
#str(mujeres_directivasS)
mujeresdirectivas_ends <- mujeres_directivasS %>% 
  filter(País == "España") %>% 
  group_by(País) %>% 
  top_n(1, TIME) %>% pull(Value) 
grafMD <- mujeres_directivasS %>% 
  ggplot(aes(x = TIME, y = Value, color = País)) + 
  geom_line(size = 1.8, color="green") + 
  geom_point(size = 2 )  + 
  scale_y_continuous(sec.axis = sec_axis(~ ., breaks = mujeresdirectivas_ends)) + 
     scale_x_continuous(expand = c(0, 0))  + 
  scale_x_continuous(breaks = seq(2011, 2018, 1), limits = c(2011, 2018)) + 
  theme_minimal() + 
  transition_reveal(TIME) + ease_aes('linear')
grafMD + labs(title = "Evolución mujeres directivas en España (%)", 
  subtitle = "Año: {as.integer(frame_along)}",
  caption = "Datos extraídos de la OCDE", x = NULL, y="VALOR (%)") + 
  theme(legend.position="none") + 
  theme(plot.title = element_text(size = 16, hjust = 0.5, face = "bold")) +
  theme(plot.subtitle = element_text(size = 14, hjust = 0.5))

Además de la evolución que podemos observar con el gráfico anterior cabe decir que, el número de mujeres directivas en España, ha crecido en 2020 hasta el 34%, según el informe de “Women in Business 2020”. Siendo este uno de los impulsos más altos de los últimos 16 años.

Por último, he comparado el % de mujeres directivas en los distintos años con otros países europeos, tales como Francia, Italia, Poturgal, Alemania y Grecia. con el fin de ver si el % de mujeres directivas es similar a estos o no.

 ggplot(mujeres_directivasP, aes(x = TIME, y = Value, color = País, group=País)) + 
  geom_line() + geom_point() + 
     scale_x_continuous(expand = c(0, 0)) + 
  scale_x_continuous(breaks = seq(2011, 2018, 1),
    limits = c(2011, 2018)) +
  geom_text(aes(label = Value), size = 2.20, nudge_y = 0.4) +
  theme_cowplot()  + geom_line(data = mujeres_directivasS, size = 1.50) +
    geom_point(data = mujeres_directivasS, size = 1.50) + 
  labs(title = "Evolución mujeres directivas (%)", 
  subtitle = "Para 5 países europeos",
  caption = "Datos extraídos de la OCDE", x = NULL, y="VALOR (%)") + 
  theme(plot.title = element_text(size = 12, hjust = 0.5, face = "bold")) +
  theme(plot.subtitle = element_text(size = 10, hjust = 0.5)) 

Como se puede observar tras el gráfico, en 2011 el porcentaje de mujeres directivas en Francia era superior al de los otros países considerados, con una tasa de 38,7%. Seguido de Portugal, España y Alemania, con unos valores idénticos y en última posición con un 23% Grecia.

La evolución de cada uno de estos países ha sido diferente. En el caso de Francia se observa una fuerta discimunicón a partir del año 2012 alcanzando su valor más bajo en 2015 con un 31,1% de mujeres directivas, valor que coincide con el de España para este mismo año.

en el caso de Portugal se muestran diferentes subidas y bajadas a lo largo de los años. En el último año disponible, 2018 el porcentaje es similar al de Francia (34% aprox)

En Grecia también se observar diferentes picos, siendo el más elevado el del año 2017, con un valor del 28,9%.

Por lo que respecta a Alemania y España, decir que la evolución ha sido similar y con unos valores bastante constantes. Todo y que partian de unos mismos valores, España presenta unas cifras superiores.

mdirect <- rbind(mujeres_directivas18,mujeres_directivas18b)
wd <- wordcloud2(mdirect, size=0.3, backgroundColor="honeydew")

La brecha salarial

Existe brecha salarial cuando el valor del trabajo de un hombre y una mujer es el mismo, pero en cambio, el salario recibido no.

En 1980 se aprobó en España el Estatuto de los Trabajadores, a partir del cual se considera ilegal pagar distinto salario por un mismo trabajo. Por ello, las diferencias se explican principalmente por jornadas laborales diferentes, el tipo de puesto en el que se encuentran o otros factores como la política de la empresa.

En los datos ofrecidos por la OCDE, para el caso de España, se muestra solo en 2010 y 2014, la brecha salarial era de 13.5% y 11.5%, respectivamente, por lo que se observa que ha disminuyó en estos cuatro años, todo y que aún persisten diferencias en el salario cobrado por un género y otro.

Asimismo, cabe comentar que las mujeres de la UE ganan alrededor de un 16% menor por hora que los hombres y que en 2019 la brecha salarial de género en España fue inferior a la media de la OCDE.

Veamos el % de brecha salarial de diferentes países de la OCDE para 2018, el último año disponible:

brecha_salarialU <- brecha_salarialF %>% 
filter(TIME == "2018")
packing <- circleProgressiveLayout(brecha_salarialU$Value, sizetype='area')
packing$radius <- 0.95*packing$radius
data <- cbind(brecha_salarialU, packing)
dat.gg <- circleLayoutVertices(packing, npoints=50)
 ggplot() + 
  geom_polygon(data = dat.gg, aes(x, y, group = id, fill=id), colour = "black", alpha = 0.6) + scale_fill_viridis(direction = -1, option = "magma") +
  geom_text(data = data, aes(x, y, size=Value, 
    label = Country), color="black") +
    geom_text(data = data, aes(x, y-1, size=Value, 
      label = Value), color="black") + 
  labs(title = "Brecha salarial de género países OCDE (%)",
    subtitle = "Calculada en la mediana.  Año: 2018", 
    caption = "Datos: OCDE. (Para España solo hay datos disponibles del 2010 y 2014)") + coord_equal() +
  theme_void() + 
  theme(legend.position="none") + 
  theme(plot.title = element_text(size = 15, hjust = 0.5)) +
  theme(plot.subtitle = element_text(size = 12, hjust = 0.5)) + 
  theme(plot.caption = element_text(size = 10, hjust = 0)) 


De acuerdo con los datos obtenidos de los 36 países que conforman la OCDE - Organización para la Cooperación y el Desarrollo Económico - el % de brecha salarial más alto es en COREA

En el gráfico siguiente se muestra la evolución de este país, que como podemos observar, no ha habido gran variación de 2010 a 2019 y el % de brecha salarial ronda unos valores muy altos, superiores al 30%.

graficoKorea <- ggplot(brechasalarialP, aes(TIME, Value)) + 
  geom_segment(aes(x=TIME, xend = TIME, y=0, yend=Value, size = 0)) + 
  geom_point(size = 2, color="gold", 
    fill = alpha("gold", 0.3), 
    alpha = 0.7, shape=25,
    stroke = 2) +  
  ggrepel::geom_label_repel(aes(label=percent(Value/100)),
    fill = "aquamarine", 
    color = "black", size= 4.5,
    box.padding = unit(1.1, "lines")) + 
  theme(plot.background = NULL, panel.background = element_blank(), panel.grid  = element_blank(),  
    axis.ticks = element_blank(), axis.text.y = element_blank()) + 
  theme(legend.position = "none") + labs(x= NULL, y=NULL,
    title= "EVOLUCIÓN BRECHA SALARIAL EN COREA (%)") + 
  theme(plot.title = element_text(size = 19, hjust = 0.5,
    color = "violetred4", face = "bold")) + 
  scale_x_continuous(breaks = seq(2010, 2019, 1), limits = c(2010, 2019)) 

graficoKorea <- graficoKorea + theme(axis.text.x = element_text(face="italic", colour="black", size=rel(2)))
  
url <- "https://www.moneyunder30.com/wp-content/uploads/2019/03/Gender-Gap.jpg"

img <- image_read(url) %>%
  image_resize("570x600") %>%
  image_colorize(15, "white")

graf <- ggdraw() + draw_image(img) + draw_plot(graficoKorea)
graf

Por tanto, como se demuestra en el gráfico, se puede concluir, que en Corea las mujeres perciben en promedio un sueldo 35,30% menor que los hombres Por lo que esto hace que Corea sea el país con mayor diferencia de salario entre los países que conforman la OCDE.

Además, cabe comentar que con la pandemia se prevé que brecha salarial entre hombres y mujeres empeorará (El Intransigente, 2020) ya que dos tercios de la población femenina perdió su trabajo el pasado mes de marzo.3

10. CONCLUSIONES

Como conclusión decir que a través del presente trabajo he tratado de analizar el mercado de trabajo, concretamente me he centrado en el desempleo. Además, como me parecía interesante resaltar algunos aspectos de este, he tratado de mostrar algunas “curiosidades” sobre el techo de cristal y la brecha de genero.

Como he nombrado en varias ocasiones a lo largo del trabajo, las mujeres y el grupo de edad más joven, este es de 16 a 24 años (Forma parte del paro juvenil) son los más afectados por la tasa de desempleo, la cual se ha agravado como consecuencia de la Pandemia. Igualmente, habría que ver cual es la evolución después de esta y si se vuelven o no a los valores previos a la crisis del 2008.

No obstante, cabe comentar también que falta para los datos del 2020 de España el cuarto trimestre, dado que el INE aún no los ha publicado. Igualmente, resulta importante destacar, que en esta Encuesta no se muestra aquellas personas que han tenido que recibir un ERTE, por lo que las cifras son más bajas que en la realidad.

Respecto a la tasa de desempleo de los países Europeos, decir que Grecia se mantiene en la cabeza. De hecho, presentaba en 2019 un 17,3% (España 14,1%) Como se puede observar, estas tasas contrastan en comparación con otros países como Finlandia. Todo y que es importante tener en cuenta las características de cada mercado de trabajo, destacando, por ejemplo, la rigidez salarial en el mercado español.

En cuanto a las mujeres directivas, decir que Colombia es el país de la OCDE que en 2018 tenía un mayor porcentaje. Asimismo, España muestra una evolución creciente, todo y que aún hay grandes diferencias entre los puestos directivos llevados a cabo por un hombre y una mujer, cosa que muestra el techo de cristal existente. Por lo que hace a la brecha salarial, también se observa cierta discriminación entre el salario ganado por los hombres y el de las mujeres, siendo Corea el país con más diferencias.

En suma, es importante tener en cuenta las características del mercado de trabajo español para poder mejorar el desempleo, que es un elemento básico para una mejora en el PIB de la economía. De igual modo, no hay que olvidar otros aspectos como la brecha salarial y el techo de cristal, que limitan la igualdad entre ambos sexos.

Referencias

Para la realización del trabajo he utilizado las siguientes páginas web:

Para obtener los datos:

Para hacer gráficos, mapas, tablas… con RStudio

Para interpretar los datos:


Para acabar este chunk incluiré mi session info:

sessioninfo::session_info() %>% details::details(summary = 'current session info') 

current session info


- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.0.2 (2020-06-22)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2021-01-17                  

- Packages -------------------------------------------------------------------
 package           * version    date       lib source                        
 assertthat          0.2.1      2019-03-21 [1] CRAN (R 4.0.2)                
 backports           1.2.0      2020-11-02 [1] CRAN (R 4.0.3)                
 bibtex              0.4.2.2    2020-01-02 [1] CRAN (R 4.0.2)                
 blob                1.2.1      2020-01-20 [1] CRAN (R 4.0.2)                
 broom               0.7.0      2020-07-09 [1] CRAN (R 4.0.2)                
 Cairo             * 1.5-12.2   2020-07-07 [1] CRAN (R 4.0.3)                
 cellranger          1.1.0      2016-07-27 [1] CRAN (R 4.0.2)                
 checkmate           2.0.0      2020-02-06 [1] CRAN (R 4.0.3)                
 class               7.3-17     2020-04-26 [2] CRAN (R 4.0.2)                
 classInt            0.4-3      2020-04-07 [1] CRAN (R 4.0.2)                
 cli                 2.2.0      2020-11-20 [1] CRAN (R 4.0.2)                
 clipr               0.7.1      2020-10-08 [1] CRAN (R 4.0.3)                
 colorspace          2.0-0      2020-11-11 [1] CRAN (R 4.0.3)                
 commonmark          1.7        2018-12-01 [1] CRAN (R 4.0.2)                
 countrycode         1.2.0      2020-05-22 [1] CRAN (R 4.0.2)                
 cowplot           * 1.1.0      2020-09-08 [1] CRAN (R 4.0.3)                
 cpp11               0.2.4      2020-11-05 [1] CRAN (R 4.0.3)                
 crayon              1.3.4      2017-09-16 [1] CRAN (R 4.0.2)                
 crosstalk         * 1.1.0.1    2020-03-13 [1] CRAN (R 4.0.2)                
 curl                4.3        2019-12-02 [1] CRAN (R 4.0.2)                
 data.table          1.13.0     2020-07-24 [1] CRAN (R 4.0.2)                
 DBI                 1.1.0      2019-12-15 [1] CRAN (R 4.0.2)                
 dbplyr              1.4.4      2020-05-27 [1] CRAN (R 4.0.2)                
 desc                1.2.0      2018-05-01 [1] CRAN (R 4.0.2)                
 details             0.2.1      2020-01-12 [1] CRAN (R 4.0.3)                
 digest              0.6.27     2020-10-24 [1] CRAN (R 4.0.3)                
 dplyr             * 1.0.2      2020-08-18 [1] CRAN (R 4.0.2)                
 DT                * 0.16       2020-10-13 [1] CRAN (R 4.0.3)                
 dygraphs          * 1.1.1.6    2018-07-11 [1] CRAN (R 4.0.3)                
 e1071               1.7-4      2020-10-14 [1] CRAN (R 4.0.3)                
 ellipsis            0.3.1      2020-05-15 [1] CRAN (R 4.0.2)                
 eurostat          * 3.6.84     2020-11-19 [1] CRAN (R 4.0.2)                
 evaluate            0.14       2019-05-28 [1] CRAN (R 4.0.2)                
 extrafont           0.17       2014-12-08 [1] CRAN (R 4.0.0)                
 extrafontdb         1.0        2012-06-11 [1] CRAN (R 4.0.0)                
 fansi               0.4.1      2020-01-08 [1] CRAN (R 4.0.2)                
 farver              2.0.3      2020-01-16 [1] CRAN (R 4.0.2)                
 fastmap             1.0.1      2019-10-08 [1] CRAN (R 4.0.2)                
 forcats           * 0.5.0      2020-03-01 [1] CRAN (R 4.0.2)                
 foreign             0.8-80     2020-05-24 [2] CRAN (R 4.0.2)                
 formatR             1.7        2019-06-11 [1] CRAN (R 4.0.3)                
 fs                  1.5.0      2020-07-31 [1] CRAN (R 4.0.3)                
 gdtools             0.2.2      2020-04-03 [1] CRAN (R 4.0.2)                
 generics            0.1.0      2020-10-31 [1] CRAN (R 4.0.3)                
 gganimate         * 1.0.7      2020-10-15 [1] CRAN (R 4.0.3)                
 ggfittext           0.9.0      2020-06-14 [1] CRAN (R 4.0.3)                
 ggplot2           * 3.3.2      2020-06-19 [1] CRAN (R 4.0.2)                
 ggrepel             0.8.2      2020-03-08 [1] CRAN (R 4.0.3)                
 ggThemeAssist     * 0.1.5      2016-08-13 [1] CRAN (R 4.0.3)                
 ggthemes          * 4.2.0      2019-05-13 [1] CRAN (R 4.0.3)                
 gifski            * 0.8.6      2018-09-28 [1] CRAN (R 4.0.3)                
 glue                1.4.2      2020-08-27 [1] CRAN (R 4.0.2)                
 gridExtra           2.3        2017-09-09 [1] CRAN (R 4.0.3)                
 gridGraphics        0.5-0      2020-02-25 [1] CRAN (R 4.0.2)                
 gt                * 0.2.2      2020-11-20 [1] Github (rstudio/gt@416ca71)   
 gtable              0.3.0      2019-03-25 [1] CRAN (R 4.0.2)                
 haven               2.3.1      2020-06-01 [1] CRAN (R 4.0.2)                
 here                1.0.0      2020-11-15 [1] CRAN (R 4.0.3)                
 highr               0.8        2019-03-20 [1] CRAN (R 4.0.2)                
 hms                 0.5.3      2020-01-08 [1] CRAN (R 4.0.2)                
 hrbrthemes        * 0.8.0      2020-03-06 [1] CRAN (R 4.0.3)                
 htmltools           0.5.0      2020-06-16 [1] CRAN (R 4.0.2)                
 htmlwidgets         1.5.2      2020-10-03 [1] CRAN (R 4.0.3)                
 httpuv              1.5.4      2020-06-06 [1] CRAN (R 4.0.2)                
 httr                1.4.2      2020-07-20 [1] CRAN (R 4.0.2)                
 janitor           * 2.0.1      2020-04-12 [1] CRAN (R 4.0.3)                
 jsonlite            1.7.2      2020-12-09 [1] CRAN (R 4.0.3)                
 kableExtra        * 1.3.1      2020-10-22 [1] CRAN (R 4.0.3)                
 KernSmooth          2.23-17    2020-04-26 [2] CRAN (R 4.0.2)                
 klippy            * 0.0.0.9500 2020-11-14 [1] Github (rlesur/klippy@378c247)
 knitr             * 1.30       2020-09-22 [1] CRAN (R 4.0.3)                
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.0.3)                
 later               1.1.0.1    2020-06-05 [1] CRAN (R 4.0.2)                
 lattice             0.20-41    2020-04-02 [2] CRAN (R 4.0.2)                
 lazyeval            0.2.2      2019-03-15 [1] CRAN (R 4.0.2)                
 lifecycle           0.2.0      2020-03-06 [1] CRAN (R 4.0.2)                
 lubridate         * 1.7.9.2    2020-11-13 [1] CRAN (R 4.0.3)                
 magick            * 2.4.0      2020-06-23 [1] CRAN (R 4.0.2)                
 magrittr            2.0.1      2020-11-17 [1] CRAN (R 4.0.3)                
 meme              * 0.2.2      2019-08-05 [1] CRAN (R 4.0.3)                
 mime                0.9        2020-02-04 [1] CRAN (R 4.0.0)                
 miniUI              0.1.1.1    2018-05-18 [1] CRAN (R 4.0.3)                
 modelr              0.1.8      2020-05-19 [1] CRAN (R 4.0.2)                
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.0.2)                
 openxlsx            4.2.2      2020-09-17 [1] CRAN (R 4.0.2)                
 packcircles       * 0.3.4      2020-12-12 [1] CRAN (R 4.0.3)                
 patchwork         * 1.1.0      2020-11-09 [1] CRAN (R 4.0.3)                
 pillar              1.4.7      2020-11-20 [1] CRAN (R 4.0.2)                
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.0.2)                
 plotly            * 4.9.2.1    2020-04-04 [1] CRAN (R 4.0.3)                
 plyr              * 1.8.6      2020-03-03 [1] CRAN (R 4.0.2)                
 png                 0.1-7      2013-12-03 [1] CRAN (R 4.0.0)                
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.0.2)                
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.0.2)                
 promises            1.1.1      2020-06-09 [1] CRAN (R 4.0.2)                
 purrr             * 0.3.4      2020-04-17 [1] CRAN (R 4.0.2)                
 pxR               * 0.42.4     2020-06-07 [1] CRAN (R 4.0.3)                
 R6                  2.5.0      2020-10-28 [1] CRAN (R 4.0.3)                
 RColorBrewer      * 1.1-2      2014-12-07 [1] CRAN (R 4.0.3)                
 Rcpp                1.0.5      2020-07-06 [1] CRAN (R 4.0.2)                
 reactable         * 0.2.3      2020-10-04 [1] CRAN (R 4.0.3)                
 reactR              0.4.3      2020-07-12 [1] CRAN (R 4.0.3)                
 readr             * 1.4.0      2020-10-05 [1] CRAN (R 4.0.3)                
 readxl            * 1.3.1      2019-03-13 [1] CRAN (R 4.0.2)                
 RefManageR          1.2.12     2019-04-03 [1] CRAN (R 4.0.2)                
 reprex              0.3.0      2019-05-16 [1] CRAN (R 4.0.2)                
 reshape2          * 1.4.4      2020-04-09 [1] CRAN (R 4.0.2)                
 rgeos               0.5-5      2020-09-07 [1] CRAN (R 4.0.3)                
 rio               * 0.5.16     2018-11-26 [1] CRAN (R 4.0.3)                
 RJSONIO           * 1.3-1.4    2020-01-15 [1] CRAN (R 4.0.3)                
 rlang               0.4.9      2020-11-26 [1] CRAN (R 4.0.3)                
 rmarkdown           2.5        2020-10-21 [1] CRAN (R 4.0.3)                
 rnaturalearth       0.1.0      2017-03-21 [1] CRAN (R 4.0.3)                
 rnaturalearthdata   0.1.0      2017-02-21 [1] CRAN (R 4.0.3)                
 robservable       * 0.2.0      2020-09-30 [1] CRAN (R 4.0.3)                
 rprojroot           2.0.2      2020-11-15 [1] CRAN (R 4.0.3)                
 rstudioapi          0.13       2020-11-12 [1] CRAN (R 4.0.3)                
 Rttf2pt1            1.3.8      2020-01-10 [1] CRAN (R 4.0.0)                
 rvest               0.3.6      2020-07-25 [1] CRAN (R 4.0.2)                
 sass                0.2.0      2020-03-18 [1] CRAN (R 4.0.3)                
 scales            * 1.1.1      2020-05-11 [1] CRAN (R 4.0.3)                
 sessioninfo         1.1.1      2018-11-05 [1] CRAN (R 4.0.2)                
 sf                * 0.9-6      2020-09-13 [1] CRAN (R 4.0.3)                
 shiny               1.5.0      2020-06-23 [1] CRAN (R 4.0.2)                
 showtext            0.9        2020-08-13 [1] CRAN (R 4.0.2)                
 showtextdb          3.0        2020-06-04 [1] CRAN (R 4.0.2)                
 snakecase           0.11.0     2019-05-25 [1] CRAN (R 4.0.3)                
 sp                  1.4-2      2020-05-20 [1] CRAN (R 4.0.2)                
 stringi             1.5.3      2020-09-09 [1] CRAN (R 4.0.2)                
 stringr           * 1.4.0      2019-02-10 [1] CRAN (R 4.0.2)                
 sysfonts            0.8.1      2020-05-08 [1] CRAN (R 4.0.2)                
 systemfonts         0.3.1      2020-09-08 [1] CRAN (R 4.0.2)                
 tibble            * 3.0.4      2020-10-12 [1] CRAN (R 4.0.3)                
 tidyr             * 1.1.2      2020-08-27 [1] CRAN (R 4.0.2)                
 tidyselect          1.1.0      2020-05-11 [1] CRAN (R 4.0.2)                
 tidyverse         * 1.3.0      2019-11-21 [1] CRAN (R 4.0.3)                
 treemapify        * 2.5.4      2020-11-19 [1] CRAN (R 4.0.3)                
 tweenr              1.0.1      2018-12-14 [1] CRAN (R 4.0.2)                
 units               0.6-7      2020-06-13 [1] CRAN (R 4.0.2)                
 vctrs               0.3.5      2020-11-17 [1] CRAN (R 4.0.3)                
 viridis           * 0.5.1      2018-03-29 [1] CRAN (R 4.0.3)                
 viridisLite       * 0.3.0      2018-02-01 [1] CRAN (R 4.0.2)                
 webshot             0.5.2      2019-11-22 [1] CRAN (R 4.0.3)                
 withr               2.3.0      2020-09-22 [1] CRAN (R 4.0.3)                
 wordcloud2        * 0.2.1      2018-01-03 [1] CRAN (R 4.0.3)                
 xfun                0.19       2020-10-30 [1] CRAN (R 4.0.3)                
 xml2                1.3.2      2020-04-23 [1] CRAN (R 4.0.2)                
 xtable              1.8-4      2019-04-21 [1] CRAN (R 4.0.2)                
 xts               * 0.12.1     2020-09-09 [1] CRAN (R 4.0.2)                
 yaml                2.2.1      2020-02-01 [1] CRAN (R 4.0.2)                
 zip                 2.1.1      2020-08-27 [1] CRAN (R 4.0.2)                
 zoo               * 1.8-8      2020-05-02 [1] CRAN (R 4.0.2)                

[1] C:/Users/noeli/OneDrive/Documentos/R/win-library/4.0
[2] C:/Program Files/R/R-4.0.2/library



  1. La web del curso: https://perezp44.github.io/intro-ds-20-21-web/↩︎

  2. Forman parte de este tipo de desempleo, por ejemplo, aquellas personas que pudiendo trabajar deciden buscar otro emeplo que se ajuste mejor a sus preferencias.↩︎

  3. Aquí puedes consultar más información sobre la Brecha salarial en Corea↩︎

LS0tDQp0aXRsZTogIkVzdHVkaW8gc29icmUgZWwgTUVSQ0FETyBERSBUUkFCQUpPIg0Kc3VidGl0bGU6ICJOb2VsaWEgU8OhbmNoZXogTWFyY2ggKG5vc2FuNUBhbHVtbmkudXYuZXMpIg0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIwIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHNlbGZfY29udGFpbmVkOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgdGhlbWU6IGZsYXRseQ0KICAgIGhpZ2hsaWdodDoga2F0ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBkZl9wcmludDoga2FibGUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmxpYnJhcnkoa2xpcHB5KSANCmxpYnJhcnkoa25pdHIpDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gNy85LCBvdXQud2lkdGggPSAiNjAlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQojLSBwYXJhIG1lam9yYXIgbG9zIGdyw6FmaWNvcywgYnVlbm8gZW4gcmVhbGlkYWQgcGFyYSBxdWUgc2UgdmVhbiBpZ3VhbCBlbiBkaXN0aW50b3MgU08NCiMtIGh0dHBzOi8vd3d3Lmp1bXBpbmdyaXZlcnMuY29tL2Jsb2cvci1rbml0ci1tYXJrZG93bi1wbmctcGRmLWdyYXBoaWNzLw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAjLSBodHRwczovL2dpdGh1Yi5jb20vdmlraW5nL3IteWFtbC9pc3N1ZXMvNDcgIChsbyBwdXNlIHggZWwgcGIgY29uIGVsIHdhcm5pbmcpIEVuIHJlYWxpZGFkIGNyZW8gcXVlIG1lam9yIHNlcsOtYSBwb25lcmxvIGVuIFJQcm9maWxlDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij48ZGl2Lz4NCg0KPGhyIGNsYXNzPSJsaW5lYS1ibGFjayI+DQoNClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIwLTIwMjEuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vbm9zYW41L3RyYWJham9fQmlnRGF0YSl7dGFyZ2V0PSJfYmxhbmsifS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjAtMjEtd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQojIyAxLiBJTlRST0RVQ0NJw5NODQoNCkVuIGxhIGFzaWduYXR1cmEgZGUgIlByb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSJbXjFdIHRlbmVtb3MgcXVlIGhhY2VyIHVuIHRyYWJham8gaW5kaXZpZHVhbCB5IG90cm8gZW4gZ3J1cG8uIA0KDQpFc3RlIGVzIGVsIHRyYWJham8gaW5kaXZpZHVhbCwgZW4gw6lsIG1lIGd1c3RhcsOtYSBhbmFsaXphciBlbCAqKmRlc2VtcGxlbyoqLCB5YSBxdWUgbWUgcGFyZWNlIHVuIHByb2JsZW1hIGVjb27Ds21pY28gaW1wb3J0YW50ZSBkZSB0cmF0YXIsIGRhZG8gcXVlIGRlIGVzdGUgc2UgZGVzZW5jYWRlbmFuIGRpdmVyc29zIGVmZWN0b3MgbmVnYXRpdm9zLCBsb3MgY3VhbGVzICBoYWJyw61hIHF1ZSB0ZW5lciAobcOhcykgZW4gY3VlbnRhLg0KDQpDb25jcmV0YW1lbnRlLCBlbiBlc3RlIHRyYWJham8gYW5hbGl6YXLDqSBsYSA8Rk9OVCBDT0xPUj0iUmVkIj5UYXNhIGRlIGRlc2VtcGxlbyAoZW4gRXNwYcOxYSkgcGFyYSBkaWZlcmVudGVzIGdydXBvcyBkZSBlZGFkLCBzZXhvIHkgQ29tdW5pZGFkZXMgQXV0w7Nub21hczwvRk9OVD4sIGFzw60gY29tbyBsYSBjb21wYXJhcsOpIGNvbiBsYSBxdWUgcHJlc2VudGFuIG90cm9zIHBhw61zZXMgZGUgbGEgVW5pw7NuIEV1cm9wZWEuIA0KDQpBc2ltaXNtbywgYW5hbGl6YXLDqSBicmV2ZW1lbnRlIGFsZ3VuYXMgY3Vlc3Rpb25lcyBxdWUgbWUgcGFyZWNlbiBpbnRlcmVzYW50ZSwgY29tbyBlbCAqKiUgZGUgbXVqZXJlcyBkaXJlY3RpdmFzKiogcXVlIGhheSBlbiBsb3MgcGHDrXNlcyBkZSBsYSBPQ0RFIHkgbGEgKipicmVjaGEgc2FsYXJpYWwqKiBleGlzdGVudGUuDQoNCkEgbG8gbGFyZ28gZGVsIHRyYWJham8gcmVzb2x2ZXLDqSBhbGd1bmFzIGN1ZXN0aW9uZXMsIHRhbGVzIGNvbW86IFF1w6kgY29tdW5pZGFkIEF1dMOzbm9tYSBwcmVzZW50YSB1bmEgdGFzYSBtYXlvciBkZSBwYXJvPyBRdcOpIGdydXBvIGVzIGVsIHF1ZSBtw6FzIHNlIHZlIGFmZWN0YWRvPyAgUXXDqSBzZXhvIHN1ZnJlIHVuYSB0YXNhIGRlIHBhcm8gbWF5b3I/IEVuIHF1w6kgcGHDrXMgZGUgbGEgVW5pw7NuIEV1cm9wZWEgaGF5IG3DoXMgZGVzZW1wbGVvPyBRdcOpIGRpZmVyZW5jaWFzIGhheSBlbnRyZSBlc3RvcyBwYcOtc2VzPyBZIG90cmFzIGN1ZXN0aW9uZXMsIGEgbWkgcGFyZWNlciBpbnRlcmVzYW50ZXMsIGNvbW8gc29uOiBxdWUgJSBkZSBtdWplcmVzIGFjY2VkZW4gYSBwdWVzdG9zIGRpcmVjdGl2b3M/IENvbW8gZXZvbHVjaW9uYSBsYSBicmVjaGEgc2FsYXJpYWwgZW4gbG9zIGRpZmVyZW50ZXMgcGHDrXNlcyBkZSBsYSBPQ0RFPw0KDQojIyMgMS4xICDCv1FVw4kgRVMgRUwgREVTRU1QTEVPPw0KDQpFbCAqKmRlc2VtcGxlbyoqIG8gKipwYXJvKiogc2UgZGEgc2llbXByZSBxdWUgaGF5IHVuIGRlc2FqdXN0ZSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwuIEVzIGRlY2lyLCBjdWFuZG8gbGEgb2ZlcnRhIGRlIHRyYWJham8gKHBvciBwYXJ0ZSBkZSBsb3MgdHJhYmFqYWRvcmVzKSBlcyBtYXlvciBhIGxhIGRlbWFuZGEgZGVsIHRyYWJham8gKHBvciBwYXJ0ZSBkZSBsYXMgZW1wcmVzYXMpDQoNCkVzIGRlY2lyLCBoYXkgbcOhcyBwZXJzb25hcyBxdWUgZXN0w6FuIGRpc3B1ZXN0YXMgYSBvZnJlY2VyIHN1IHRyYWJham8gcXVlIHB1ZXN0b3MgZGUgdHJhYmFqbyBkaXNwb25pYmxlcy4gDQoNCmBgYHtyIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iODUlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoIkltYWdlbmVzIiwgImVzcXVlbWEucG5nIikpDQpgYGANCjxhIGhyZWY9Ii4vSW1hZ2VuZXMvZXNxdWVtYS5wbmciIHRhcmdldD0iX2JsYW5rIj5bQW1wbGlhciBJbWFnZW5dPC9hPg0KDQpIZSBvYnRlbmlkbyBsYSBpbWFnZW4gZGU6IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNvbm9zdWJsaW1lLmNvbS8yMDE3LzEyL2NvbmNlcHRvcy1tZXJjYWRvLXRyYWJham8uaHRtbCJ0YXJnZXQ9Il9ibGFuayI+YXF1w608L2E+LCBww6FnaW5hIGRvbmRlIHNlIGV4cGxpY2FuIGxvcyBjb25jZXB0b3MgYsOhc2ljb3MgZGVsIG1lcmNhZG8gZGUgdHJhYmFqby4gDQoNCg0KIyMjIDEuMiAgwr9Dw5NNTyBTRSBDQUxDVUxBIExBIFRBU0EgREUgREVTRU1QTEVPPw0KDQpUZW5pZW5kbyBlbiBjdWVudGEgYXF1ZWxsYXMgcGVyc29uYXMgcXVlIGVzdGFuZG8gZW4gZWRhZCBkZSB0cmFiYWphciwgZXMgZGVjaXIsIGVudHJlIDE2IHkgNjUgYcOxb3MsIHkgcXVlIGJ1c2NhbiBhY3RpdmFtZW50ZSBlbXBsZW8gbm8gbG8gZW5jdWVudHJhbi4gKEVzdG9zIGZvcm1hbiBwYXJ0ZSBkZSBsYSA8Rk9OVCBDT0xPUj0iR3JlZW4iPioqUG9ibGFjacOzbiBBY3RpdmEgKFBBKSoqPC9GT05UPiANCg0KUG9yIHRhbnRvOiAkJCDOlGRlc2VtcGxlbyA9IChOwrogZGVzZW1wbGVhZG9zIC8gUEEpKjEwMCQkDQoNCkNhYmUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBoYXkgKipkaWZlcmVudGVzIHRpcG9zIGRlIGRlc2VtcGxlbyoqLCBhbGd1bm9zIGRlIGVsbG9zIHNvbjoNCg0KYS4gPEZPTlQgQ09MT1I9IkJsdWUiPioqRGVzZW1wbGVvIGVzdGFjaW9uYWwqKjwvRk9OVD4gRXN0ZSBzZSBkZWJlIGEgbG9zIGNhbWJpb3MgZW4gbGEgZGVtYW5kYSBkZSB0cmFiYWpvIGRlYmlkbyBhIGxhcyBkaWZlcmVudGVzIGVzdGFjaW9uZXMgZGVsIGHDsW8uIEVzIGxvIHF1ZSBvY3VycmUgcG9yIGVqZW1wbG8sIGNvbiBlbCBzZWN0b3IgdHVyw61zdGljbyBxdWUgYWJzb3JiZSBudWV2b3MgdHJhYmFqYWRvcmVzIGVuIGNpZXJ0YXMgZXBvY2FzIGRlbCBhw7FvICh2ZXJhbm8sIG5hdmlkYWRlcy4uLikNCg0KYi4gPEZPTlQgQ09MT1I9IkJsdWUiPioqRGVzZW1wbGVvIGZyaWNjaW9uYWwqKjwvRk9OVD4gRXN0ZSBlcyBlbCB2b2x1bnRhcmlvIHkgcG9yIHRhbnRvLCBpbmRlcGVuZGllbnRlIGFsIHByb3BpbyBmdW5jaW9uYW1pZW50byBkZWwgbWVyY2FkbyBkZSB0cmFiYWphLlteM10NCg0KYy4gPEZPTlQgQ09MT1I9IkJsdWUiPioqRGVzZW1wbGVvIGPDrWNsaWNvKio8L0ZPTlQ+IA0KDQpkLiA8Rk9OVCBDT0xPUj0iQmx1ZSI+KipEZXNlbXBsZW8gZXN0cnVjdHVyYWwqKjwvRk9OVD4gUGFyYSBjb21iYXRpciBlc3RlIHNlcsOhIG5lY2VzYXJpbyBwcm9ncmFtYXMgZGUgZm9ybWFjacOzbiwgZGUgYWRwYXRhY2nDs24gYSBudWV2YXMgdGVjbm9sb2fDrWFzLCBldGMuDQoNCg0KWSBhaG9yYSB5YSBzw60sIHZveSBhIHByb2NlZGVyIGNvbiBlbCBhbsOhbGlzaXMuIFBhcmEgZWxsbyBsbyBwcmltZXJvIHF1ZSBuZWNlc2l0YXLDqSBzZXLDoW4gbG9zIERBVE9TLi4uDQoNCg0KIyMgMi4gREFUT1MgVVRJTElaQURPUyB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJ2aW9sZXRyZWQiPioqRGF0b3MqKjwvRk9OVD4NCg0KVHJhYmFqYXLDqSBjb24gbG9zIGRhdG9zIHF1ZSBwcm9wb3JjaW9uYSBlbCAqKklORSoqIC0gSW5zdGl0dXRvIE5hY2lvbmFsIGRlIEVzdGFkw61zdGljYSwgZWwgKipFdXJvc3RhdCoqIHkgbGEgKipPQ0RFKioNCg0KRWwgSU5FIG5vcyBwcm9wb3JjaW9uYSBkYXRvcyBzb2JyZSBsYSA8Rk9OVCBDT0xPUj0iR3JlZW4iPioqVGFzYSBkZSBwYXJvIHBvciBkaXN0aW50b3MgZ3J1cG9zIGRlIGVkYWQsIHNleG8geSBjb211bmlkYWQgYXV0w7Nub21hKiogPC9GT05UPiBkaXZpZGlkb3MgcG9yIHRyaW1lc3RyZXMuIENvZ2Vyw6kgbG9zIGNvcnJlc3BvbmRpZW50ZXMgYWwgcGVyaW9kbyAyMDE1VDEgLSAyMDIwVDMNCg0KDQo8YnI+DQpObyBvYnN0YW50ZSwgY29tbyBhZHZpZXJ0ZSBlbCBJTkUsIGVzIG5lY2VzYXJpbyBjb21lbnRhciBkb3MgYXNwZWN0b3M6DQoNCjEuICJMb3MgZGF0b3MgZGUgQ2V1dGEgeSBNZWxpbGxhIGhhbiBkZSB0b21hcnNlIGNvbiBwcmVjYXVjacOzbiBwb3JxdWUgcHVlZGVuIGVzdGFyIGFmZWN0YWRvcyBwb3IgZ3JhbmRlcyBlcnJvcmVzIGRlIG11ZXN0cmVvIg0KDQoyLiAiRW4gZWwgMXIgdHJpbWVzdHJlIGRlIDIwMjAsIGNvbW8gY29uc2VjdWVuY2lhIGRlIGxhIGRlY2xhcmFjacOzbiBkZWwgRXN0YWRvIGRlIGFsYXJtYSBtb3RpdmFkbyBwb3IgZWwgQ09WSUQtMTksIGVsIHRhbWHDsW8gbXVlc3RyYW4gZGUgbGFzIGVudHJldmlzdHJhcyBlbiBsYXMgc2VtYW5hcyAxMS0xMyBoYSBzaWRvIGluZmVyaW9yIGEgbGEgZGUgb3Ryb3MgdHJpbWVzdHJlcyINCjxicj4NCg0KTG9zIGRhdG9zIHByb2NlZGVudGVzIGRlbCBFdXJvc3RhdCBsb3Mgb2J0ZW5kcsOpIG1lZGlhbnRlIGVsIHBhcXVldGUgIkV1cm9zdGF0IiBlIGlyYW4gdGFtYmnDqW4gcmVsYWNpb25hZG8gY29uIGxhcyB0YXNhcyBkZSBkZXNlbXBsZW8gZW4gbG9zIGRpZmVyZW50ZXMgcGHDrXNlcyBkZSBsYSBVbmnDs24gRXVyb3BlYS4gDQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKlBhcXVldGVzIHV0aWxpemFkb3MqKjwvRk9OVD4NCg0KRXN0b3Mgc29uIGxvcyBwYXF1ZXRlcyBxdWUgaGUgbmVjZXNpdGFkbyBwYXJhIGhhY2VyIGFsIHByZXNlbnRlIHRyYWJham8uIA0KYGBge3J9DQojTG8gcHJpbWVybyBxdWUgdGVuZHJlbW9zIHF1ZSBoYWNlciBzZXLDoSBjYXJnYXIgZXN0b3MgcGFxdWV0ZXMuIA0KIyhFbiBjYXNvIGRlIG5vIHRlbmVybG9zIGluc3RhbG9zIGhhYnLDrWEgcXVlIGluc3RhbGFybG9zIA0KI21lZGlhbnRlIGluc3RhbGwucGFja2FnZXMoIi4uLiIpKQ0KbGlicmFyeShyaW8pDQpsaWJyYXJ5KHB4UikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGV1cm9zdGF0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2lmc2tpKQ0KbGlicmFyeShDYWlybykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkoeHRzKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoY3Jvc3N0YWxrKQ0KbGlicmFyeShyZWFjdGFibGUpDQpsaWJyYXJ5KGdnVGhlbWVBc3Npc3QpDQpsaWJyYXJ5KG1hZ2ljaykNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeSh0cmVlbWFwaWZ5KQ0KbGlicmFyeShyb2JzZXJ2YWJsZSkNCmxpYnJhcnkocGFja2NpcmNsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpIA0KbGlicmFyeSh3b3JkY2xvdWQyKQ0KbGlicmFyeShndCkNCmxpYnJhcnkobWVtZSkNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9InZpb2xldHJlZCI+KipUaWR5Kio8L0ZPTlQ+DQoNCkNvbiBlbCBzaWd1aWVudGUgY8OzZGlnbyBpbXBvcnRhcsOpIGxvcyBkYXRvczoNCmBgYHtyIGVjaG89VFJVRSwgZXZhbD1UUlVFfQ0KZGF0b3NfSU5FIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgImRhdG9zX0lORS5jc3YiKSkNCmBgYA0KDQpgYGB7ciBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQojUG9kw61hIGhhYmVyIGltcG9ydGFkbyB0YW1iacOpbiBjb24gZWwgcGFxdWV0ZTogbGlicmFyeSgicHhSIikgKEVzdGUgcGFxdWV0ZSBzaXJ2ZSBwYXJhIHRyYWJhamFyIGNvbiBkYXRvcyBQQy1BeGlzKSAgICANCmZpbGVfbmFtZSA8LSAiaHR0cDovL2luZS5lcy9qYXhpVDMvZmlsZXMvdC9lcy9weC80MjQ3LnB4P25vY2FiPTEiDQpkZklORSA8LSByZWFkLnB4KGZpbGVfbmFtZSkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KI0VzIGlndWFsIHF1ZSBsb3MgZGF0b3MgY29uIGxvcyBxdWUgaGUgdHJhYmFqYWRvLiANCmBgYA0KDQpgYGB7cn0NCklORSA8LSBkYXRvc19JTkUgJT4lIHJlbmFtZShDQ0FBID0gIkNvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hcyIpDQpJTkUgPC0gSU5FICU+JSBzZXBhcmF0ZShDQ0FBLCBjKCJuX0NDQUEiLCAiQ0NBQSIpLCBzZXAgPSAiICIpDQpJTkUgPC0gSU5FICU+JSBzZXBhcmF0ZShQZXJpb2RvLCBjKCJBw7FvIiwgIlRyaW1lc3RyZSIpLCBzZXAgPSAiXyIpDQpJTkUgPC0gSU5FICU+JSANCiBtdXRhdGUoVHJpbWVzdHJlID0gY2FzZV93aGVuKFRyaW1lc3RyZSA9PSAiVDEiIH4gIjEiLCANClRyaW1lc3RyZSA9PSAiVDIiIH4gIjIiLCANClRyaW1lc3RyZSA9PSAiVDMiIH4gIjMiLA0KVHJpbWVzdHJlID09ICJUNCIgfiAiNCIpKQ0KSU5FJFRvdGFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORSRUb3RhbCkpDQojc3RyKElORSkNCg0KSU5FIDwtIElORSAlPiUgcmVuYW1lKENDQUFzID0gIkNDQUEiKQ0KDQpJTkUgPC0gSU5FICU+JQ0KICAgIG11dGF0ZShDQ0FBID0NCiAgICBjYXNlX3doZW4oDQogICAgQ0NBQXMgPT0gIlRvdGFsTmFjaW9uYWwiIH4gIlRvdGFsIE5hY2lvbmFsIiwNCiAgICBDQ0FBcyA9PSAiQW5kYWx1Y8OtYSIgfiAiQW5kYWx1Y8OtYSIsDQogICAgQ0NBQXMgPT0gIkxhUmlvamEiIH4gIkxhIFJpb2phIiwNCiAgICBDQ0FBcyA9PSAiQ2FzdGlsbGFsYU1hbmNoYSIgfiAiQ2FzdGlsbGEgbGEgTWFuY2hhIiwNCiAgICBDQ0FBcyA9PSAiQXJhZ8OzbiIgfiAiQXJhZ8OzbiIsDQogICAgQ0NBQXMgPT0gIkNhbmFyaWFzIiB+ICJDYW5hcmlhcyIsDQogICAgQ0NBQXMgPT0gIlBhw61zVmFzY28iIH4gIlBhw61zIFZhc2NvIiwNCiAgICBDQ0FBcyA9PSAiQXN0dXJpYXMiIH4gIkFzdHVyaWFzIiwNCiAgICBDQ0FBcyA9PSAiQ2FzdGlsbGF5TGXDs24iIH4gIkNhc3RpbGxhIHkgTGXDs24iLA0KICAgIENDQUFzID09ICJFeHRyZW1hZHVyYSIgfiAiRXh0cmVtYWR1cmEiLA0KICAgIENDQUFzID09ICJJc2xhcyIgfiAiSXNsYXMgQmFsZWFyZXMiLA0KICAgIENDQUFzID09ICJNYWRyaWQiIH4gIk1hZHJpZCIsDQogICAgQ0NBQXMgPT0gIkNldXRhIiB+ICJDZXV0YSIsDQogICAgQ0NBQXMgPT0gIk1lbGlsbGEiIH4gIk1lbGlsbGEiLA0KICAgIENDQUFzID09ICJNdXJjaWEiIH4gIk11cmNpYSIsDQogICAgQ0NBQXMgPT0gIkNhbnRhYnJpYSIgfiAiQ2FudGFicmlhIiwNCiAgICBDQ0FBcyA9PSAiTmF2YXJyYSIgfiAiTmF2YXJyYSIsDQogICAgQ0NBQXMgPT0gIkNhdGFsdcOxYSIgfiAiQ2F0YWx1w7FhIiwNCiAgICBDQ0FBcyA9PSAiR2FsaWNpYSIgfiAiR2Fsw61jaWEiLA0KICAgIENDQUFzID09ICJDb211bml0YXRWYWxlbmNpYW5hIiB+ICJDb20uVmFsZW5jaWFuYSIpKQ0KDQpJTkUgPC0gSU5FICU+JSBzZWxlY3QoLUNDQUFzKQ0KSU5FIDwtIElORSAlPiVyZWxvY2F0ZShDQ0FBLCAuYWZ0ZXIgPSBuX0NDQUEpDQpgYGANCg0KYGBge3J9DQpJTkViIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgImRhdG9zX0lORWIuY3N2IikpDQpJTkViIDwtIElORWIgJT4lIHJlbmFtZShDQ0FBID0gIkNvbXVuaWRhZGVzIHkgQ2l1ZGFkZXMgQXV0w7Nub21hcyIpDQpJTkViIDwtIElORWIgJT4lIHNlcGFyYXRlKENDQUEsIGMoIm5fQ0NBQSIsICJDQ0FBIiksIHNlcCA9ICIgIikNCklORUIgPC0gSU5FYiAlPiUgZmlsdGVyKENDQUEgIT0gIlRvdGFsX05hY2lvbmFsIiAmIEVkYWQgPT0gIkRlIDI1IGEgNTQgYcOxb3MiICYgUGVyaW9kbyAlaW4lIGMoIjIwMjBUMSIsICIyMDIwVDIiLCAiMjAyMFQzIikpDQpJTkVCIDwtIElORUIgJT4lIGZpbHRlcihTZXhvID09ICJBbWJvcyBzZXhvcyIpDQpJTkVCJFRvdGFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORUIkVG90YWwpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCklORUIgPC0gSU5FQiAlPiUgcmVuYW1lKENDQUFzID0gIkNDQUEiKQ0KSU5FQiA8LSBJTkVCICU+JQ0KICAgIG11dGF0ZShDQ0FBID0NCiAgICBjYXNlX3doZW4oDQogICAgQ0NBQXMgPT0gIlRvdGFsX05hY2lvbmFsIiB+ICJUb3RhbCBOYWNpb25hbCIsDQogICAgQ0NBQXMgPT0gIkFuZGFsdWPDrWEiIH4gIkFuZGFsdWPDrWEiLA0KICAgIG5fQ0NBQSA9PSAiMTciIH4gIkxhIFJpb2phIiwNCiAgICBuX0NDQUEgPT0gIjA4IiB+ICJDYXN0aWxsYSBsYSBNYW5jaGEiLA0KICAgIENDQUFzID09ICJBcmFnw7NuIiB+ICJBcmFnw7NuIiwNCiAgICBDQ0FBcyA9PSAiQ2FuYXJpYXMiIH4gIkNhbmFyaWFzIiwNCiAgICBuX0NDQUEgPT0gIjE2IiB+ICJQYcOtcyBWYXNjbyIsDQogICAgQ0NBQXMgPT0gIkFzdHVyaWFzIiB+ICJBc3R1cmlhcyIsDQogICAgbl9DQ0FBID09ICIwNyIgfiAiQ2FzdGlsbGEgeSBMZcOzbiIsDQogICAgQ0NBQXMgPT0gIkV4dHJlbWFkdXJhIiB+ICJFeHRyZW1hZHVyYSIsDQogICAgbl9DQ0FBID09ICIwNCIgfiAiSXNsYXMgQmFsZWFyZXMiLA0KICAgIENDQUFzID09ICJNYWRyaWQiIH4gIk1hZHJpZCIsDQogICAgQ0NBQXMgPT0gIkNldXRhIiB+ICJDZXV0YSIsDQogICAgQ0NBQXMgPT0gIk1lbGlsbGEiIH4gIk1lbGlsbGEiLA0KICAgIENDQUFzID09ICJNdXJjaWEiIH4gIk11cmNpYSIsDQogICAgQ0NBQXMgPT0gIkNhbnRhYnJpYSIgfiAiQ2FudGFicmlhIiwNCiAgICBDQ0FBcyA9PSAiTmF2YXJyYSIgfiAiTmF2YXJyYSIsDQogICAgQ0NBQXMgPT0gIkNhdGFsdcOxYSIgfiAiQ2F0YWx1w7FhIiwNCiAgICBuX0NDQUEgPT0gIjEyIiB+ICJHYWzDrWNpYSIsDQogICAgbl9DQ0FBID09ICIxMCIgfiAiQ29tLlZhbGVuY2lhbmEiKSkNCg0KSU5FQiA8LSBJTkVCICU+JSBzZWxlY3QoLUNDQUFzKQ0KSU5FQiA8LSBJTkVCICU+JXJlbG9jYXRlKENDQUEsIC5hZnRlciA9IG5fQ0NBQSkNCmBgYA0KDQoNClNpIHF1aWVyZXMgc2FiZXIgZGUgZG9uZGUgaGUgc2FjYWRvIGxvcyBkYXRvcyBvIG5lY2VzaXRhcyBjb25zdWx0YXIgb3Ryb3MgcHVlZGVzIGRhcmxlIGFsIHNpZ3VpZW50ZSBsaW5rOiA8YSBocmVmPSJodHRwczovL3d3dy5pbmUuZXMvamF4aVQzL1RhYmxhLmh0bT90PTQyNDcidGFyZ2V0PSJfYmxhbmsiPioqRGF0b3MgZGVsIElORSoqPC9hPiANCg0KDQpEYXRvcyBxdWUgbmVjZXNpdGFyw6kgcGFyYSBjb21wYXJhciBsYSB0YXNhIGRlIHBhcm8gY29uIG90cm9zIHBhw61zZXMgZGUgbGEgVW5pw7NuIEV1cm9wZWEuIEVzdG9zIGxvcyBleHRyYWVyw6kgZGUgbGEgYmFzZSBkZSBkYXRvczogPGEgaHJlZj0iaHR0cHM6Ly9lYy5ldXJvcGEuZXUvZXVyb3N0YXQvdGdtL3RhYmxlLmRvP3RhYj10YWJsZSZpbml0PTEmbGFuZ3VhZ2U9ZW4mcGNvZGU9dGVwc3Jfd2MxNzAmcGx1Z2luPTEidGFyZ2V0PSJfYmxhbmsiPioqRVVST1NUQVQqKjwvYT4NCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NClBhcm8gPC0gZ2V0X2V1cm9zdGF0KCJ0ZXBzcl93YzE3MCIpDQpQYXJvX2V0aXF1ZXRhcyA8LSBsYWJlbF9ldXJvc3RhdChQYXJvKQ0KYGBgDQoNCmBgYHtyIGVjaG89IEZBTFNFLCBldmFsPUZBTFNFfQ0KI0RlIGVzdGEgdGFibGEsIHZveSBhIGFycmVnbGFyIGxhcyBzaWd1aWVudGVzIGNvc2FzOg0KI0VuIGdlbyB2b3kgYSBwb25lciBlbCBub21icmUgZGUgbG9zIHBhw61zZXMgKENvbW8gZXN0w6EgZW4gUGFyb19ldGlxdWV0YXMpLCBjcmVvIHF1ZSBhc8OtIGVzIG3DoXMgZsOhY2lsIGRlIGlkZW50aWZpY2FyLg0KI0xhIHZhcmlhYmxlIHRpbWUgbGEgdm95IGEgc2VwYXJhciBwb3IgYcOxby4gKEVsIGRpYSB5IGVsIG1lcyBzaWVtcHJlIGVzIGVsIG1pc21vLCBlbCAxIGRlIGVuZXJvKQ0KI1NlbGVjY2lvbmFyw6kgbG9zIHZhbG9yZXMgcXVlIHZhbiBkZXMgZGUgMjAwOCBoYXN0YSBsb3Mgw7psdGltb3MgZGlzcG9uaWJsZXMsIDIwMTkuDQojTGFzIHZhcmlhYmxlcyBpc2NlZDExLiBzZXhvIHkgdW5pdCwgcGllbnNvIHF1ZSBzZSBwdWVkZW4gZWxpbWluYXIsIHlhIHF1ZSBubyBub3MgYXBvcnRhbiBuYWRhIGFkaWNpb25hbC4gDQojRW4gZXN0YSB0YWJsYSB0b2RvcyBsb3MgZGF0b3MgZXN0w6FuIGVuICUgeSBubyBzZSBkaWZlcmVuY2lhIHBvciBzZXhvLg0KYGBgDQoNCg0KYGBge3J9DQpQYXJvIDwtIFBhcm8gJT4lIHJlbmFtZSh1bmlkYWQgPSAidW5pdCIsIHNleG8gPSAic2V4IiwNCmVkYWQgPSAiYWdlIiwgdG90YWwgPSAiaXNjZWQxMSIsIGxvY2FsaWRhZCA9ICJnZW8iLCBGZWNoYSA9ICJ0aW1lIiwgdmFsb3IgPSAidmFsdWVzIikNCnBhcm8gPC0gYmluZF9jb2xzKFBhcm8sUGFyb19ldGlxdWV0YXMpDQpwYXJvIDwtIHBhcm8gJT4lIHNlbGVjdChlZGFkLCBnZW8sIEZlY2hhLCB2YWxvcikNCnBhcm9hIDwtIHBhcm8gJT4lIHNlcGFyYXRlKEZlY2hhLCBjKCJBw7FvIiwgIk1lcyIsICJEaWEiKSwgc2VwID0gIi0iKQ0KcGFyb2EgPC0gcGFyb2EgJT4lIHNlbGVjdChnZW8sIGVkYWQsIEHDsW8sIHZhbG9yKQ0KcGFyb2EgPC0gcGFyb2EgJT4lIGZpbHRlcihBw7FvID4gIjIwMDciKQ0KI3JtKGRhdG9zX0lORSwgUGFybywgUGFyb19ldGlxdWV0YXMpDQpgYGANCg0KYGBge3IsIGVjaG86ZmFsc2V9DQpyaW86OmV4cG9ydChwYXJvLCBoZXJlOjpoZXJlKCJkYXRvcyIsICJwYXJvX2V1cm9zdGF0LmNzdiIpKQ0KYGBgDQoNCmBgYHtyfQ0KI03DoXMgZGF0b3Mgc29icmUgZWwgRXVyb3N0YXQgcXVlIG5lY2VzaXRhcsOpOg0KYnVzY2FydGFibGEgPC0gc2VhcmNoX2V1cm9zdGF0KHBhdHRlcm4gPSAidW5lbXBsb3ltZW50Iix0eXBlID0gInRhYmxlIikNCg0KI2J1c2NhcnRhYmxhICU+JSBzZWxlY3QodGl0bGUsIGNvZGUpDQoNCmluZl9wYXJvIDwtIGdldF9ldXJvc3RhdCgidGVzcG0wODAiLCB0aW1lX2Zvcm1hdCA9ICJyYXciLCBrZWVwRmxhZ3MgPSBUUlVFKQ0KDQpsYWJlbEUgPC0gbGFiZWxfZXVyb3N0YXQoaW5mX3Bhcm8sIGZpeF9kdXBsaWNhdGVkID0gVFJVRSkNCmRmX25hbWVzIDwtIG5hbWVzKGluZl9wYXJvKQ0KDQpkZiA8LSBsYWJlbF9ldXJvc3RhdChpbmZfcGFybywgY29kZSA9IGRmX25hbWVzLCBmaXhfZHVwbGljYXRlZCA9IFRSVUUpDQpkZiA8LSBkZiAlPiUgc2VsZWN0KHNleF9jb2RlLCBhZ2VfY29kZSwgZ2VvX2NvZGUsIGdlbywgdGltZSwgdmFsdWVzKQ0KcGFyb19qb3ZlbiA8LSBkZg0KYGBgDQoNCkEgY29udGludWFjacOzbiwgb2J0ZW5nbyB5IGZpbHRybyBsb3MgZGF0b3MgbmVjZXNhcmlvcyBzb2JyZSBsYSBicmVjaGEgc2FsYXJpYWwgZW4gbG9zIGRpZmVyZW50ZXMgcGHDrXNlcyBkZSBsYSBPQ0RFLiBGaWx0cmFyw6kgbG9zIGRhdG9zIGRlc2RlIDIwMTAgaGFzdGEgbG9zIMO6bHRpbW9zIGRpc3BvbmlibGVzLCBxdWUgc29uIDIwMTguDQoNCkxvcyBkYXRvcyBlc3TDoW4gcGFyYSBlbCBwcmltZXIgZGVjaWwsIGVzIGRlY2lyLCBhcXVlbGxvcyBxdWUgY29ycmVzcG9uZGVuIGFsIHByaW1lciBncnVwbyBkZSB0cmFiYWphZG9yZXMgKDEwJSBjb24gbWVub3JlcyBzYWxhcmlvcykgeSBhIGxvcyBkZWwgbm92ZW5vIGRlY2lsIHF1ZSBwYXNhIGFsIGNvbnRyYXJpbywgZXN0b3Mgc29uIGxvcyBxdWUgY3VlbnRhbiBjb24gbWVqb3JlcyBzYWxhcmlvcy4NCg0KYGBge3J9DQojSW1wb3J0byBsb3MgZGF0b3Mgc29icmUgbGEgYnJlY2hhIHNhbGFyaWFsDQpicmVjaGFfc2FsYXJpYWwgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAiYnJlY2hhX3NhbGFyaWFsLnhsc3giKSkNCmJyZWNoYV9zYWxhcmlhbCA8LSBicmVjaGFfc2FsYXJpYWwgJT4lIHNlbGVjdChDT1UsIENvdW50cnksIEluZGljYXRvciwgVElNRSwgVmFsdWUpDQpgYGANCg0KSGFnbyBsbyBtaXNtbyBxdWUgYW50ZXMsIHBlcm8gYWhvcmEgcGFyYSBsb3MgZGF0b3Mgc29icmUgbGEgcHJvcG9yY2nDs24gZGUgbXVqZXJlcyBkaXJlY3RpdmFzLCB0YW1iacOpbiBleHRyYWlkYXMgZGUgbGEgT0NERS4NCg0KYGBge3J9DQptdWplcmVzX2RpcmVjdGl2YXMgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAibXVqZXJlc19kaXJlY3RpdmFzLnhsc3giKSkNCm11amVyZXNfZGlyZWN0aXZhcyA8LSBtdWplcmVzX2RpcmVjdGl2YXMgJT4lIHNlbGVjdChDT1UsIENvdW50cnksIFRJTUUsIFZhbHVlKQ0KYGBgDQoNCmBgYHtyfQ0KbXVqZXJlc19kaXJlY3RpdmFzU3BhaW4gPC0gbXVqZXJlc19kaXJlY3RpdmFzICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiU3BhaW4iKQ0KYGBgDQoNCg0KDQojIyAzLiBFVk9MVUNJw5NOIERFTCBERVNFTVBMRU8gMjAxNS0yMDIwICANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQpVbmVtcGxveW1lbnRUIDwtIElORSAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKFNleG8gPT0gIkFtYm9zIHNleG9zIikgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihFZGFkID09ICJUb3RhbCIpICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIoQ0NBQSA9PSAiVG90YWwgTmFjaW9uYWwiKQ0KDQpVbmVtcGxveW1lbnRUIDwtIFVuZW1wbG95bWVudFQgJT4lIA0KICAgICAgICAgICAgICAgICBzZWxlY3QoLWMobl9DQ0FBLCBFZGFkKSkNCg0KI3N0cihVbmVtcGxveW1lbnRUJFRvdGFsKSANCiNhcy5udW1lcmljKFVuZW1wbG95bWVudFQkVG90YWwsICByZXBsYWNlID0gVFJVRSkJDQojc3RyKFVuZW1wbG95bWVudFQkVG90YWwpIA0KDQpgYGANCg0KYGBge3J9DQpncmFmaWNvMSA8LSBnZ3Bsb3QoVW5lbXBsb3ltZW50VCwgYWVzKFRyaW1lc3RyZSwgVG90YWwsIGZpbGw9VHJpbWVzdHJlKSkgKw0KICBnZW9tX2NvbCgpICArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJld2VyLnBhbChuID0gNCwgbmFtZSA9ICJQaVlHIikpICsNCiAgZmFjZXRfd3JhcCh+QcOxbykgKyAgDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQsIDMpLCBsaW1pdHMgPSBjKDAsIDI0KSkgICsgDQogIHRoZW1lX3Rlc3QoKSArICANCiAgdGhlbWUoYXhpcy50aXRsZS54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnModGl0bGUgPSAiRGVzZW1wbGVvIGVuIEVzcGHDsWEgKCUpIiwgY2FwdGlvbiA9ICJEYXRvczogSU5FIiwgeT1OVUxMKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgaGp1c3QgPSAwLjUsIGNvbG9yPSJkYXJrbWFnZW50YSIpKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gMCkpICsNCiAgZ2VvbV90ZXh0KGFlcyh5PVRvdGFsLCBsYWJlbCA9IFRvdGFsKSwgDQogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHNpemUgPSAzLjIsIA0KICAgIHZqdXN0PTIsIGNvbCA9ICJXaGl0ZSIpDQoNCmdyYWZpY28xIDwtIGdyYWZpY28xICsgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gYWxwaGEoImdyZWVuIiwwLjIpICkpDQoNCmBgYA0KDQo8YnI+DQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG91dC53aWR0aD0iODUlIn0NCmdnZHJhdyhncmFmaWNvMSkgKyBkcmF3X2ltYWdlKGhlcmU6OmhlcmUoIi4vSW1hZ2VuZXMvUEFSTy5qcGciKSwgDQp4ID0gMS4xMiwgeSA9IDAuMjYsIGhqdXN0ID0gMSwgdmp1c3QgPSAxLCB3aWR0aCA9IDAuMzksIGhlaWdodCA9IDAuMykgDQpgYGANCg0KDQpQb3IgbG8gZ2VuZXJhbCwgeSBhIGxhIHZpc3RhIGRlIGxvcyBncsOhZmljb3MsIGVsIHByaW1lciB0cmltZXN0cmUgKGVuZXJvLWZlYnJlcm8tbWFyem8pIHN1ZWxlIHNlciB1biBtYWwgcGVyaW9kbyBwYXJhIGVsIGVtcGxlbywgZGFkbyBxdWUgc2UgdGVybWluYW4gbXVjaG8gZGUgbG9zIGNvbnRyYXRvcyBkZSBsYXMgdGVtcG9yYWRhcyBkZSByZWJhamFzLg0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGVuIDIwMTUgbGEgY2lmcmEgZXJhIGRlIDI4LDc4JSB0b2RvIHkgcXVlIGhhIGlkbyBkaXNtaW51eWVuZG8gaGFzdGEgZWwgcHJlc2VudGUgYcOxbywgZG9uZGUgbGFzIGNpZnJhcyBzb24gYmFzdGFudGUgZWxldmFkYXMuDQoNCk5vIG9ic3RhbnRlLCBlbiBlbCBhw7FvIDIwMjAsIGxhIGNpZnJhIGRlIGRlc2VtcGxlbyBkZSBsb3MgbWVzZXMgY29ycmVzcG9uZGllbnRlcyBhbCBwcmltZXIgdHJpbWVzdHJlICBoYSBzaWRvIG3DoXMgYmFqYSBxdWUgYcOxb3MgcHJldmlvcywgY29tbyBwb3IgZWplbXBsbywgMjAxOCBvIDIwMTkuIFBhc2FuZG8gcG9yIHRhbnRvIGRlIDE2LDc0JSBhIDE0LDclIHkgMTQsMSUgZW4gZXN0ZSDDumx0aW1vIGHDsW8uIA0KDQpBdW4gYXPDrSBjYWJlIGRlY2lyLCBxdWUgY29tbyBjb25zZWN1ZW5jaWEgZGUgbGEgQ292aWQtMTksIGVsIHBhcm8gaGEgaWRvIGlkbyBhdW1lbnRhbnRvIGVuIGxvcyBzdWNlc2l2b3MgdHJpbWVzdHJlcy4gQSBwZXNhciBkZSBlbGxvLCBhIHNpbXBsZSB2aXN0YSBoYWJlciBzaWRvIGluZmVyaW9yIHF1ZSBhw7FvcyBhbnRlcmlvcmVzLiBObyBvYnN0YW50ZSwgY2FiZSBjb21lbnRhciBxdSBhbGd1bm9zIG9yZ2FuaXNtb3MgaW50ZXJuYWNpb25hbGVzIGVzcGVyYWJhbiBxdWUgbGEgdGFzYSBkZSBwYXJvIGF1bWVudGFyYSwgY29tbyBjb25zZWN1ZW5jaWEgZGUgbGEgcGFuZGVtaWEsIG3DoXMgZGVsIDIwJS4gDQoNClVuIGZhY3RvciBpbXBvcnRhbnRlIGEgdGVuZXIgZW4gY3VlbnRhIGVzIHF1ZSBhIGNhdXNhIGRlIGxhIENvdmlkIGVsIHRhbWHDsW8gbXVlc3RyYWwgaGEgc2lkbyBtZW5vciBkZWwgOSBhbCAyOSBkZSBtYXJ6byAoc2VtYW5hIDExLTEyLTEzKSBQb3IgbG8gcXVlLCBlbCBJbnN0aXR1dG8gTmFjaW9uYWwgZGUgRXN0YWTDrXN0aWNhIGF2aXNhIHF1ZSBsYSBjaWZyYSBkZSBwYXJvIHBvZHLDrWEgc2VyIHJlYWxtZW50ZSBtYXlvciBxdWUgbGEgcXVlIGNvbnRlbXBsYW4gbG9zIGRhdG9zOiAiRXMgcHJvYmFibGUgcXVlIG11Y2hvcyB0cmFiYWphZG9yZXMgcXVlIGhheWFuIHBlcmRpZG8gc3UgZW1wbGVvIHNlIGhheWFuIGNsYXNpZmljYWRvIGNvbW8gaW5hY3Rpdm9zIGRlYmlkbyBhIHF1ZSBubyBoYW4gcG9kaWRvIGN1bXBsaXIgY29uIGxhcyBjb25kaWNpb25lcyBkZSBiw7pzcXVlZGEgZGUgdHJhYmFqbyBxdWUgbGEgRVBBIGRldGVybWluYSBwYXJhIHF1ZSBzZWFuIGNvbnNpZGVyYWRvcyBwYXJhZG9z4oCdIChJTkUsIDIwMjApDQoNCk90cmEgZGUgY3Vlc3Rpb25lcyBhIHJlc2FsdGFyIGVzIHF1ZSBub3JtYWxtZW50ZSBlbiBsb3MgbWVzZXMgZGUgdmVyYW5vIGxhIHRhc2EgZGUgZGVzZW1wbGVvIHRpZW5kZSBhIGRpc21pbnVpciByZXNwZWN0byBhIGxvcyB0cmltZXN0cmVzIGFudGVyaW9yZXMuIEVuIGNhbWJpbywgY29tbyBwb2RlbW9zIG9ic2VydmFyIGVuIGVsIGdyw6FmaWNvIGRlbCAyMDIwIHN1Y2VkacOzIGFsIGNvbnRyYXJpbyBwYXNhbmRvIGRlIDE0LDQxIGEgMTUsMzMgeSAxNiwyNiBlbiBsb3MgdHJlcyBwcmltZXJvcyB0cmltZXN0cmVzIGRlbCBhw7FvLiAoRUwgY3VhcnRvIHRyaW1lc3RyZSBubyBzZSBoYSBjb25zaWRlcmFkbywgZGFkbyBxdWUgbG9zIGRhdG9zIG5vIGVzdMOhbiB0b2RhdsOtYSBkaXNwb25pYmxlcykNCg0KIyMjIDMuMSBFdm9sdWNpw7NuIGRlbCBkZXNlbXBsZW8gcG9yIGdydXBvcyBkZSBlZGFkDQoNCkVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbywgcGFyZWNpZG8gYSB1bmEgInBpcmFtaWRlIiwgc2UgbXVlc3RyYSBsYSBldm9sdWNpw7NuIGRlIGxhIHRhc2EgZGUgcGFybyBkaWZlcmVuY2lhbmRvIHBvciBlbCBnw6luZXJvIHkgbG9zIGRpZmVyZW50ZXMgZ3J1cG9zIGRlIGVkYWQ6IDE2LTE5IGHDsW9zOyAyMC0yNCBhw7FvczsgMjUtNTQgYcOxb3MgeSBkZSA1NSBoYXN0YSBsYSBlZGFkIGRlIGp1YmlsYWNpw7NuLiAgDQoNCmBgYHtyfQ0KSU5FUCA8LSBJTkUgJT4lDQogIGZpbHRlcihuX0NDQUEgPT0gIjAwIiAmIFNleG8gJWluJSBjKCJIb21icmVzIiwgIk11amVyZXMiKSAmIEVkYWQhPSAiVG90YWwiICYgVHJpbWVzdHJlID09ICIzIikNCklORVAgPC0gSU5FUCAlPiUNCiAgZmlsdGVyKEVkYWQgJWluJSBjKCJEZSAxNiBhIDE5IGHDsW9zIiwgIkRlIDIwIGEgMjQgYcOxb3MiLCAiRGUgMjUgYSA1NCBhw7FvcyIsICJEZSA1NSB5IG3DoXMgYcOxb3MiKSkNCiNzdHIoSU5FUCkNCg0KcGlyYW1pZGUgPC0gSU5FUCAlPiUgDQogIG11dGF0ZShUb3RhbFQgPSBpZmVsc2UoU2V4byA9PSAiSG9tYnJlcyIsIC1Ub3RhbCwgVG90YWwpKSAlPiUgDQogIGdncGxvdChhZXMoeD1Ub3RhbFQsIHkgPSBFZGFkLCBmaWxsID0gU2V4bykpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIiwgYWxwaGEgPSAwLjYsIGNvbG9yID0gImJsYWNrIikgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygic2VhZ3JlZW4zIiwgInB1cnBsZSIpKSArIA0KICBmYWNldF93cmFwKH5wYXN0ZSgiQcOxbyIsIEHDsW8pKSsgDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCANCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSwgDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYWJzKSArIA0KICBsYWJzICh4ID0gIlRhc2EgZGUgZGVzZW1wbGVvICglKSIsIHkgPSAiR3J1cG9zIGRlIGVkYWQiLA0KICAgIHRpdGxlID0gIlRhc2EgZGUgZGVzZW1wbGVvIFRvdGFsLCBzZWfDum4gZ3J1cG9zIGRlIGVkYWQgeSBnw6luZXJvICglKSIsDQogICAgc3VidGl0bGUgPSAiUGFyYSBlbCAzciB0cmltZXRyZToganVsaW8tYWdvc3RvLXNlcHRpZW1icmUiLCANCiAgICBjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEuIERhdG9zOiBJTkUiKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsPVRvdGFsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDApLCANCiAgICBjb2xvciA9ICJibGFjayIsIA0KICAgIHNpemUgPSAyLjE5LA0KICAgIGhqdXN0ID0gMC41LA0KICAgIHZqdXN0PS0xKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI4NSUifQ0KcGlyYW1pZGUNCmBgYA0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIgbWVkaWFudGUgZWwgZ3LDoWZpY28sIGVsIGdydXBvIGRlIGVkYWQgbcOhcyBwZXJqdWRpY2FkbyBwb3IgbGEgdGFzYSBkZSBkZXNlbXBsZW8sIHNvbiBhcXVlbGxvcyBxdWUgdGllbmVuIGVudHJlIDE2IHkgMTkgYcOxb3MsIHNlZ3VpZG9zIGRlIGxvcyBkZSAyMCBhIDI0IGHDsW9zLg0KDQpFc3RvIHNlIGRlYmUgZW50cmUgb3Ryb3MgbW90aXZvcywgcG9yIGxhIGZhbHRhIGRlIGV4cGVyaWVuY2lhLCBxdWUgbXVjaGFzIGVtcHJlc2FzIHJlY2xhbWFuIGEgbGEgaG9yYSBkZSBjb250cmF0YXIuIFlhIHF1ZSwgYXVucXVlIG11Y2hvcyBzaSBkaXNwb25nYW4gZGUgY2llcnRvcyBjb25vbWllbnRvcyB5IHRlbmdhbiBmb3JtYWNpw7NuIHN1ZmljaWVudGUgcG9yIGhhYmVyIHJlYWxpemFkbyBncmFkb3MgdW5pdmVyc2l0YXJpb3MgbyBjdXJzb3MgZGUgZm9ybWFjacOzbiwgaGF5IHVuYSBmYWx0YSBkZSBwcsOhY3RpY2EgeSBkZSBleHBlcmllbmNpYSBxdWUgbGFzIGVtcHJlc2FzIGV4aWdlbiBhIGxhIGhvcmEgZGUgY29udHJhdGFyIGEgbnVldm8gcGVyc29uYWwuDQoNCk5vIG9ic3RhbnRlLCBjb21vIHBvZGVtb3MgdmVyLCBsYSB0YXNhIGRlIGRlc2VtcGxlbyBlbiBlc3RhcyBlZGFkZXMgaGEgaWRvIGRpc21pbnV5ZW5kbyBlbiBsb3MgYcOxb3MgcG9zdGVyaW9yZXMgYSAyMDE1LCB0b2RvIHkgcXVlIGNvbiBsYSBjcmlzaXMgYWN0dWFsIGhhIHZ1ZWx0byBhIGF1bWVudGFyLiANCg0KQXNpbWlzbW8sIGRlIGFjdWVyZG8gY29uIGxvcyBncsOhZmljb3MsIHBvZGVtb3MgZXh0cmFlciAgcXVlIHBhcmEgZ3J1cG9zIGRlIGVkYWQgYSBwYXJ0aXIgZGUgMjUgYcOxb3MsIHkgc29icmV0b2RvIGEgcGFydGlyIGRlIDU1IGxhIHRhc2EgZGUgcGFybyBlcyBjb25zaWRlcmFibGVtZW50ZSBtZW5vci4gVGllbmUgbMOzZ2ljYSwgZGFkbyBxdWUgbGEgb2N1cGFjacOzbiBzZSBjb25jZW50cmEgcHJpbW9yZGlhbG1lbnRlIGVuIGFxdWVsbG9zIGN1eWEgZWRhZCBlcyBlbnRyZSAyNSB5IDU0IGHDsW9zLg0KDQpQb3Igb3RybyBsYWRvLCBkZWNpciBxdWUsIGNvbW8gcG9kZW1vcyBvYnNlcnZhciwgcGFyYSBjdWFscXVpZXIgZnJhbmphIGRlIGVkYWQgbGFzIG11amVyZXMgc3VmcmVuIHVuYSB0YXNhIGRlIGRlc2VtcGxlbyBtYXlvciBxdWUgbG9zIGhvbWJyZXMuDQpBIGV4Y2VwY2nDs24gZGVsIGHDsW8gMjAxNiAoeSAyMDE4KSBkb25kZSBsYSB0YXNhIGRlIGRlc2VtcGxlbyBkZSBsYXMgbXVqZXJlcyBkZSAyMC0yNCBhw7FvcyBlcmEgZGUgMzksMTglIGZyZW50ZSBhIGxhIGRlIGxvcyBob21icmVzIHF1ZSBlcmEgZGUgbGFzIG11amVyZXMgMzksMTglOyB5IGVuIGVsIGHDsW8gMjAxNywgZG9uZGUgbGEgdGFzYSBkZSBwYXJvIGZlbWVuaW5hIHBhcmEgZWwgIGVsIGdydXBvIGRlIGVkYWQgZGUgMTYtMTkgZXJhIDMsNTMlIG1lbm9yLCB1bmEgZGlmZXJlbmNpYSBtw61uaW1hLiANCg0KPiBQb3IgbG8gcXVlIHBvZGVtb3MgY29uY2x1aXIgcXVlICoqbG9zIGdydXBvcyBzb2NpYWxlcyBtw6FzIGNhc3RpZ2Fkb3MgcG9yIGVsIGRlc2VtcGxlbyBzb24gbGFzIG11amVyZXMgeSBsb3MgasOzdmVuZXMqKiwgcXVpZW5lcyBhY2FiYW4gc2ludGnDqW5kb3NlLCBtdWNoYXMgdmVjZXMsIGNvbW8gbWFyZ2luYWRvcyBvICJkZXNhbmltYWRvcyIgYSBsYSBob3JhIGRlIGJ1c2NhciB0cmFiYWpvDQoNClJlc3BlY3RvIGEgcXVlIGxhcyBtdWplcmVzIHN1ZnJlbiB1bmEgdGFzYSBkZSBwYXJvIG1heW9yIHF1ZSBsb3MgaG9tYnJlcywgcXVlZGEgZGVtb3N0cmFkbyB0YW1iacOpbiBjb24gZWwgZ3LDoWZpY28gZXZvbHV0aXZvIGRlbCBhcGFydGFkbyBbNi4gRElTVFJJQlVDScOTTiBERVNFTVBMRU8gRU4gTEEgQ09NLlZBTEVOQ0lBTkFdDQoNCiMjIyAzLjIgwr9RdcOpIHRhc2EgZGUgcGFybyBodWJvIGVuLi4uLj8NCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KSU5FSCA8LSBJTkUgJT4lIHNlbGVjdChTZXhvLCBDQ0FBLCBFZGFkLCBBw7FvLCBUcmltZXN0cmUsIFRvdGFsKQ0KSU5FSCA8LSBJTkVIICU+JSBmaWx0ZXIoRWRhZCAlaW4lIGMoIkRlIDE2IGEgMTkgYcOxb3MiLCAiRGUgMjAgYSAyNCBhw7FvcyIsICJEZSAyNSBhIDU0IGHDsW9zIiwgIkRlIDU1IHkgbcOhcyBhw7FvcyIpKQ0KSU5FSCA8LSBJTkVIICU+JSBmaWx0ZXIoU2V4byAhPSAiQW1ib3Mgc2V4b3MiKSAlPiUNCiAgICAgICAgICAgICAgICBmaWx0ZXIoQ0NBQSAhPSAiVG90YWwgTmFjaW9uYWwiKQ0KSU5FSCRBw7FvIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORUgkQcOxbykpDQpJTkVIJFRyaW1lc3RyZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihJTkVIJFRyaW1lc3RyZSkpDQoNCmFhIDwtIElORUggJT4lDQogICAgbXV0YXRlKGVkYWQgPQ0KICAgIGNhc2Vfd2hlbigNCiAgICBFZGFkID09ICJEZSAxNiBhIDE5IGHDsW9zIiB+ICIxNi0xOSIsDQogICAgRWRhZCA9PSAiRGUgMjAgYSAyNCBhw7FvcyIgfiAiMjAtMjQiLA0KICAgIEVkYWQgPT0gIkRlIDI1IGEgNTQgYcOxb3MiIH4gIjI1LTU0IiwNCiAgICBFZGFkID09ICJEZSA1NSB5IG3DoXMgYcOxb3MiIH4gIj41NSIpKQ0KDQpJTkVIIDwtIGFhDQpJTkVIIDwtIElORUggJT4lIHNlbGVjdCgtRWRhZCkgJT4lIHJlbmFtZShFZGFkID0gImVkYWQiKSAlPiUgYXJyYW5nZShTZXhvLCBDQ0FBLCBBw7FvLCBUcmltZXN0cmUpDQpJTkVIIDwtIElORUggJT4lIHNlbGVjdChDQ0FBLCBTZXhvLCBBw7FvLCBUcmltZXN0cmUsIEVkYWQsIFRvdGFsKQ0KDQpgYGANCg0KYGBge3J9DQojUGFyYSBoYWNlciBsYSB0YWJsYSBtZSBoZSBpbnNwaXJhZG8gZW4gZWwgdHJhYmFqbyBOb21icmVzIHkgYXBlbGxpZG9zIGVuIEVzcGHDsWEiDQojZGUgbnVlc3Ryb3MgY29tcGHDsWVyb3MgTGF1cmEgQWxiZXJ0LCBMYXVyYSBCb3Jyw6FzIHkgRGFuaWVsIENhc2lub3MuIA0KDQpkYXRhIDwtIFNoYXJlZERhdGEkbmV3KElORUgpICNQYXNvIGxvcyBkYXRvcyBhIHVuIHdpZGdldCBxdWUgZXMgY29tcGF0aWJsZSBjb24gZWwgcGFxdWV0ZSBjcm9zc3RhbGsNCg0KYnNjb2xzKHdpZHRocyA9IGMoMyxOQSxOQSksDQogIGxpc3QoIGZpbHRlcl9jaGVja2JveCgiU2V4byIsICJTZXhvIiwgZGF0YSwgflNleG8sIGNvbHVtbnMgPTEpLCANCiAgICBmaWx0ZXJfY2hlY2tib3goIkHDsW8iLCAiQcOxbyIsIGRhdGEsIH5Bw7FvLCBjb2x1bW5zID0xKSwNCiAgICAgIGZpbHRlcl9zbGlkZXIoIlRyaW1lc3RyZSIsICJUcmltZXN0cmUiLA0KICAgICAgICBkYXRhLCB+VHJpbWVzdHJlLCB3aWR0aCA9ICIxMDAlIiksDQogIGZpbHRlcl9zZWxlY3QoIkNDQUEiLCAiQ0NBQSIsIGRhdGEsIH5DQ0FBKSksIA0KICAgcmVhY3RhYmxlKGRhdGEsIG1pblJvd3MgPSAxMCwgZGVmYXVsdFBhZ2VTaXplID0gIDEwLCANCiAgICAgcGFnaW5hdGlvblR5cGUgPSAianVtcCIsICBzaG93UGFnZVNpemVPcHRpb25zID0gIFRSVUUgLCANCiAgICAgcGFnZVNpemVPcHRpb25zID0gIGMgKCAxMCAsIDUwICwgMTAwICksZGVmYXVsdENvbERlZiA9IGNvbERlZigNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIG1pbldpZHRoID0gNzAsDQogICAgaGVhZGVyU3R5bGUgPSBsaXN0KGJhY2tncm91bmQgPSAibGlnaHRncmVlbiIpLA0KICAgICAgIGZpbHRlcmFibGUgPSBGQUxTRSksIGhpZ2hsaWdodCA9IFRSVUUsDQogICAgIG91dGxpbmVkID0gVFJVRSwgY29sdW1ucyA9IGxpc3QoRWRhZCA9IGNvbERlZihzdHlsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID4gMSkgew0KICAgICAgY29sb3IgPC0gIiNlMDAwMDAifQ0KICAgICAgZWxzZSB7DQogICAgICBjb2xvciA8LSAiIzAwODAwMCINCiAgICB9DQogICAgbGlzdChjb2xvciA9IGNvbG9yLCBmb250V2VpZ2h0ID0gImJvbGQiKQ0KICB9KSwgVG90YWwgPSBjb2xEZWYobmFtZSA9ICJWYWxvciIsIGZvcm1hdCA9IGNvbEZvcm1hdChzdWZmaXggPSAiJSIpKSkpKQ0KICAgICAgDQpgYGANCg0KTGEgYW50ZXJpb3IgdGFibGEgcGVybWl0ZSBjb25zdWx0YXIgbGEgdGFzYSBlbiBsYXMgZGlmZXJlbnRlcyBDb211bmlkYWRlcyBBdXTDs25vbWFzIGRlIEVzcGHDsWEgeSBwYXJhIGRpZmVyZW50ZXMgZ3J1cG9zIGRlIGVkYWQ6IDE2LTE5IGHDsW9zLCAyMC0yNCBhw7FvcywgMjQtNTQgeSBtw6FzIGRlIDU1LCBxdWUgaW5jbHV5dGUgaGFzdGEgbGEgZWRhZCBkZSBqdWJpbGFjacOzbi4gw4FkZW3DoXMsIHNlIHB1ZWRlIGRpZmVyZW5jaWFyIHBvciBzZXhvIGZlbWVuaW5vIG8gbWFzY3VsaW5vLiANCg0KDQojIyA0LiBUQVNBIERFIERFU0VNUExFTyBBw5FPIDIwMjAuIHsudGFic2V0fQ0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gZXN0YSB0YWJsYSwgbGEgQ29tdW5pZGFkIEF1dMOzbm9tYSBjb24gbWVub3MgcG9yY2VudGFqZSBkZSBkZXNlbXBsZWFkb3MgZW4gZWwgYcOxbyAyMDIwIGhhIHNpZG8gTmF2YXJyYSwgcXVlIHByZXNlbnTDsyB1biA0LDUxIGRlIHBhcm8gZW4gZWwgc2VndW5kbyB0cmltZXN0cmUgcGFyYSBlbCBncnVwbyBkZSBlZGFkIGRlIDU1IGEgNjUgYcOxb3MuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCklORU1pbiA8LSBJTkUgJT4lIGZpbHRlcihTZXhvICVpbiUgYygiTXVqZXJlcyIsICJIb21icmVzIikpICU+JSBmaWx0ZXIoQcOxbyA9PSAiMjAyMCIpDQpJTkVNaW4gPC0gSU5FTWluICU+JSBzbGljZV9taW4oVG90YWwsIG49MSkgJT4lIA0KICBzZWxlY3QoQ0NBQSwgU2V4bywgRWRhZCwgQcOxbywgVHJpbWVzdHJlLCBUb3RhbCkNCmtuaXRyOjprYWJsZShJTkVNaW4sIGFsaWduID0gImMiLCBjYXB0aW9uID0gIk1lbm9zIGRlc2VtcGxlYWRvcyBhw7FvIDIwMjAiKSAlPiUga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IGxpc3QoZW5hYmxlZCA9IFQsIGJhY2tncm91bmQgPSAicGx1bSIpKSAlPiUga2FibGVfcGFwZXIoZnVsbF93aWR0aCA9IEYpICU+JSBjb2x1bW5fc3BlYyg2LCBjb2xvciA9ICJibGFjayIsIGJhY2tncm91bmQgPSBpZmVsc2UoSU5FTWluJFRvdGFsID4gMCAsICJsaWdodGdyZWVuIikpDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJ2aW9sZXRyZWQiPioqRXZvbHVjacOzbiBkZXNlbXBsZW8gQ0NBQSoqPC9GT05UPg0KDQpBIHRyYXbDqXMgZGVsIHNpZ3VpZW50ZSBncsOhZmljbyBkZSBiYXJyYXMgcG9kZW1vcyBvYnNlcnZhciBsYSBldm9sdWNpw7NuIGRlIGxhIHRhc2EgZGUgcGFybyBlbiBsb3MgMyBwcmltZXJvcyB0cmltZXN0cmVzIGRlbCBhw7FvIDIwMjAgZW4gbGFzIGRpZmVyZW50ZXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcyB5IGNvbmNsdWlyIGNvbW8gaGEgYWZlY3RhZG8gbGEgYWN0dWFsIHBhbmRlbcOtYSBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8gZXNwYcOxb2wuDQoNCmBgYHtyfQ0KSU5FQmIgPC0gSU5FQiAlPiUgbXV0YXRlKFBlcmlvZG9vID0gY2FzZV93aGVuKFBlcmlvZG8gPT0gIjIwMjBUMyIgfiAiMyIsDQogIFBlcmlvZG8gPT0gIjIwMjBUMiIgfiAiMiIsDQogIFBlcmlvZG8gPT0gIjIwMjBUMSIgfiAiMSIpKQ0KDQpJTkVCYiA8LSBJTkVCYiAlPiUgc2VsZWN0KC1QZXJpb2RvKSAlPiUgDQogICAgICAgIHNlbGVjdChDQ0FBLCBUb3RhbCwgUGVyaW9kb28pDQpJTkVCYiA8LSBJTkVCYiAlPiUNCiAgICAgICAgICByZW5hbWUoIlBlcmlvZG8iID0gIlBlcmlvZG9vIikNCiNzdHIoSU5FQmIpDQojc3RyKElORUIpDQpgYGANCg0KYGBge3J9DQpncmFmaWNvMiA8LSBnZ3Bsb3QoSU5FQmIsIGFlcyhQZXJpb2RvLCBUb3RhbCwgZmlsbCA9IFBlcmlvZG8pKSArIA0KICBnZW9tX2NvbCgpKw0KICBmYWNldF93cmFwKH5DQ0FBKSArDQogIHRoZW1lX3Rlc3QoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgDQogIGxhYnMoeT1OVUxMLCB4PU5VTEwpICsgIA0KICB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpICsgDQogIGxhYnModGl0bGUgPSAiREVTRU1QTEVPIEVOIExBUyBDQ0FBICgzIHRyaW1lc3RyZXMgMjAyMCkiLCANCiAgICBzdWJ0aXRsZSA9ICJEZSAyNSBhIDU0IGHDsW9zIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNiwgMiksIGxpbWl0cyA9IGMoMCwgMjYpKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBoanVzdCA9IDAuNSwgY29sb3I9InR1cnF1b2lzZTQiKSkgKw0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOSwgaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzZWFncmVlbiIsInNlYWdyZWVuMyIsInBhbGVncmVlbiIpKSANCg0KDQpgYGANCg0KPGJyPg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9Ijg1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIifQ0KZ2dwbG90bHkoZ3JhZmljbzIsIHRvb2x0aXAgPSAiVG90YWwiKQ0KYGBgDQoNCkFsIHBhc2FyIGVsIHJhdMOzbiBwb3IgY2FkYSBjb2x1bW5hLCBxdWUgY29ycmVzcG9uZGUgYSBsb3MgdHJlcyBwcmltZXJvcyB0cmltZXN0cmVzIGRlbCBhw7FvIDIwMjAsIG5vcyBtdWVzdHJhIGVsICUgZGUgZGVzZW1wbGVvIHF1ZSBoYSB0ZW5pZG8geCBDb211bmlkYWQgQXV0w7Nub21hLiANCg0KQ2FiZSByZXNhbHRhciBxdWUgbGFzIENDQUEgY29uIG3DoXMgJSBkZSBkZXNlbXBsZWFkb3Mgc29uOiBBbmRhbHVjw61hLCBDYW5hcmlhcywgQ2V1dGEsIEV4dHJlbWFkdXJhIHkgTWFsaWxsYS4NCkVuIGVzdGFzIHNlIG11ZXN0cmEgY29tbyBsYSB0YXNhIGRlIHBhcm8gZW4gZWwgdGVyY2VyIHRyaW1lc3RyZSBoYSBzaWRvIHN1cGVyaW9yIGEgbGEgZGUgbG9zIHRyaWVtc3RyZXMgcHJldmlvcywgZXhjZXB0byBlbiBFeHJlbWFkdXJhIHF1ZSBwcmVzZW50w7MgdW5hIHRhc2EgZGUgcGFybyBzdXBlcmlvciBlbiBlbCBwcmltZXIgdHJpbWVzdHJlLCAyMyw2NiUgKDFUKSBmcmVudGUgYSAxOSwxNiUgKDNUKQ0KDQpBc8OtbWlzbW8sIENldXRhIHBhcmEgZWwgc2VndW5kbyB0cmltZXN0cmUgbXVlc3RyYSB1bmEgZGlzbXVuaWPDs24gZGVsIDYsNjklLCBubyBvYnN0YW50ZSwgaGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgQ2V1dGEgeSBNZWxpbGxhIGhhbiBkZSB0b21hcnNlIGNvbiBwcmVjYXVjacOzbiwgeWEgcXVlIHB1ZWRlbiBlc3RhciBhZmVjdGFkb3MgcG9yIGVycm9yZXMgZGUgbXVlc3RyZW8sICBjb21vIGhlIGluZGljYWRvIGFsIGluY2lvIGRlbCB0cmFiYWpvLiANCg0KUmVzYWx0YXIgdGFtYmnDqW4sIGVsIGNhc28gZGVsIFBhw61zIFZhc2NvLCBkb25kZSBsYSB0YXNhIGRlIHBhcm8gc2UgbWFudGllbmUgY29uc3RhbnRlIGR1cmFudGUgbG9zIDMgdHJpbWVzdHJlcyAgY29uc2lkZXJhZG9zICg4LDQ4JSwgOCw1NCUgeSA4LDU4JSkNCg0KUG9yIMO6bHRpbW8sIGRlY2lyIHF1ZSAqKmhheSBxdWUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBsb3MgZGF0b3MqKiwgY29tbyBhZGVtw6FzLCBwb2RlbW9zIG9ic2VydmFyLCAqKnJlZmxlamFuIG1pbmltYW1lbnRlIGVsIGVmZWN0byBkZSBsYSBwYW5kZW3DrWEsIHlhIHF1ZSBubyBlc3TDoW4gY29udGFiaWxpemFkYXMgbGFzIHBlcnNvbmFzIGFmZWN0YWRhcyBwb3IgRVJURSoqIChFeHBlbmRpZW50ZXMgZGUgUmVndWxhY2nDs24gVGVtcG9yYWwgZGUgRW1wbGVvKQ0KDQpSZXNwZWN0byBhIGxvcyBFUlRFLCBjb21lbnRhciBxdWUsIGRlIGFjdWVyZG8gY29uIGxvcyBkYXRvcyBvZnJlY2lkb3MgcG9yIGVsIERpYXJpbywgQW5kYWx1Y8OtYSBjdWVudGEgY29uIGVsIG1heW9yIG7Dum1lcm8gZGUgRVJURSAoODguNjUwKSBUb2RvIHkgcXVlIENhdGFsdcOxYSBoYSBzdW1hZG8gZWwgbWF5b3IgbsO6bWVybyBkZSBhZmVjdGFkb3MgKDYwMy4xMDUpIEVzdG8gc2UgZGViZSBhIHF1ZSBhcXXDrSBzZSBoYW4gdmlzdG8gYWZlY3RhZG9zIHNvYnJlIHRvZG8gYXF1ZWxsb3MgcXVlIGZvcm1hYmFuIHBhcnRlIGRlbCBzZWN0b3IgdHVyw61zdGljbyB5IGRlIGxhIGF1dG9tb2Npw7NuIChTZWF0IHkgTmlzc2FuIHR1dmllcm9uIHF1ZSBwYXJhciBwb3IgbGEgZmFsdGEgZGUgc3VtaW5pc3Ryb3MgZHVyYW50ZSBsYSBDb3ZpZCkgQXPDrSBtaXNtbywgZW4gY29tdW5pZGFkZXMgY29tbyBNYWRyaWQgeSBBbmRhbHVjw61hIGxhIG1heW9yw61hIGRlIGFmZWN0YWRvcyBwb3IgRVJURSBjb3JyZXNwb25kZW4gYSBlbXByZXNhcyBwZXF1ZcOxYXMgcXVlIHNlIGRlZGljYW4gYSBsYSBob3N0ZWxlcmlhLCBjb21lcmNpbyBvIGFjdGl2aWRhZGVzIGN1bHR1cmFsZXMgcHJpbmNpcGFsbWVudGUuDQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKlRyZWVtYXBpZnkgcGFyYSBlbCAzciBUcmltZXN0cmUqKjwvRk9OVD4NCg0KYGBge3Igb3V0LndpZHRoPSI3NSUifSANCklORUIzIDwtIElORUIgJT4lIGZpbHRlcihQZXJpb2RvID09ICIyMDIwVDMiKQ0KSU5FQjMkQ0NBQSA8LSByZWNvZGUoSU5FQjMkQ0NBQSwgDQogIkNvbXVuaXRhdF9WYWxlbmNpYW5hIj0iQ29tdW5pdGF0IFZhbGVuY2lhbmEiLCANCiAgIkxhX1Jpb2phIiA9ICJMYSBSaW9qYSIsIA0KICAiQ2FzdGlsbGFfeV9MZcOzbiIgPSAiQ2FzdGlsbGEgeSBMZcOzbiIsIA0KICAiQ2FzdGlsbGFfbGFfTWFuY2hhIiA9ICJDYXN0aWxsYSBsYSBNYWNoYSIsIA0KICAiUGHDrXNfVmFzY28iID0gIlBhw61zIFZhc2NvIikNCg0KZ2dwbG90KElORUIzLCBhZXMoYXJlYSA9IFRvdGFsLCBmaWxsID0gVG90YWwsIGxhYmVsID0gQ0NBQSkpICsNCiAgZ2VvbV90cmVlbWFwKCkgKw0KICBnZW9tX3RyZWVtYXBfdGV4dChmb250ZmFjZSA9ICJpdGFsaWMiLCANCiAgICBjb2xvdXIgPSAid2hpdGUiLCBwbGFjZSA9ICJjZW50cmUiLA0KICAgICAgICAgICAgICAgICAgICBncm93ID0gRkFMU0UpICsNCnNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJ2aXJpZGlzIiwgbmFtZSA9ICIiLCANCiAgYWxwaGEgPSAxLCBiZWdpbiA9IDAuMSwgZW5kID0gMC45LGRpcmVjdGlvbiA9IC0xLA0KICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKCB0aXRsZSA9ICJUQVNBIERFIERFU0VNUExFTyIsDQogICAgZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBiYXJoZWlnaHQgPSB1bml0KDMsIHVuaXRzID0gIm1tIiksIA0KICAgIGJhcndpZHRoID0gdW5pdCg1NSwgdW5pdHMgPSAibW0iKSwgZHJhdy51bGltID0gRiwgDQogICAgdGl0bGUucG9zaXRpb24gPSAndG9wJywgdGl0bGUuaGp1c3QgPSAwLjUsIGxhYmVsLmhqdXN0ID0gMC41KSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgICsNCiAgbGFicyh0aXRsZSA9ICJUQVNBIERFIERFU0VNUExFTyBFTiBMQVMgRElGRVJFTlRFUyBDQ0FBIFBBUkEgMjAyMFQzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICANCg0KYGBgDQoNCkVuIGVzdGUgZ3LDoWZpY28gc2UgbXVlc3RyYSBsYSB0YXNhIGRlIGRlc2VtcGxlbyBwYXJhIGVsIHRlcmNlciB0cmltZXN0cmUgZGUgMjAyMCwganVsaW8tYWdvc3RvLXNlcHRpZW1icmUuIExhIGxleWVuZGEgbm9zIGluZGljYSBxdWUgZWwgY29sb3IgbcOhcyBjbGFyaXRvLCBjb3JyZXNwb25kZSBhIGFxdWVsbGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgcXVlIGhhbiB0ZW5pZG8gdW5hIHRhc2EgZGUgcGFybyBtZW5vci4gQ29tbyBzZSBoYSBwb2RpZG8gY29tcHJvYmFyIHRhbWJpw6luIG1lZGlhbnRlIGVsIGdyw6FmaWNvIGRlIGxhICJFdm9sdWNpw7NuIGRlc2VtcGxlbyBDQ0FBIiBlc3RhcyBzb24gTmF2YXJyYSB5IGVsIFBhw61zIFZhc2NvLCBjb24gdW5hIHRhc2EgZGUgOCw4NyUgeSA4LDU4JSByZXNwZWN0aXZhbWVudGUuIA0KDQpBIHRyYXbDqXMgZGVsIHRyZWVtYXAgcG9kZW1vcyB2ZXIgY29uZmlybWFyIGNvbW8gQW5kYWx1Y8OtYSwgQ2FuYXJpYXMsIENldXRhIHkgTWVsaWxsYSBzb24gbGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgY29uIG3DoXMgdGFzYSBkZSBkZXNlbXBsZW8sIGNvbW8geWEgc2UgaGEgY29tZW50YWRvIGFudGVyaW9ybWVudGUuDQoNCkFzw60gbWlzbW8sIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBtdWVzdHJhIHVuYSBjaWZyYSBkZSBkZXNlbXBsZW8gdG90YWwsIGVuIHRvcm5vIGFsIDE1JS4gDQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKkNDQUEgY29uIG1heW9yIHRhc2EqKjwvRk9OVD4NCg0KPGJyPg0KRW4gZXN0YXMgdGFibGFzIHNlIGRpZmVyZW5jaWEgcG9yIGVsIGfDqW5lcm8geSBlbCBncnVwbyBkZSBlZGFkLCBhZGVtw6FzIGRlbCB0cmltZXN0cmUuIA0KDQpgYGB7cn0NCklORU0gPC0gSU5FICU+JSBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIpICU+JQ0KICBmaWx0ZXIoQcOxbyA9PSAiMjAyMCIpDQpJTkVNJFRyaW1lc3RyZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihJTkVNJFRyaW1lc3RyZSkpDQoNCklORU1tYXggPC0gSU5FTSAlPiUgDQogIHNsaWNlX21heChUb3RhbCwgbj0xKSAlPiUgDQogIHNlbGVjdChDQ0FBLCBTZXhvLCBFZGFkLCBBw7FvLCBUcmltZXN0cmUsIFRvdGFsKSAlPiUNCiAgYXJyYW5nZShTZXhvLCBUcmltZXN0cmUpDQoNCmtuaXRyOjprYWJsZShJTkVNbWF4LCBhbGlnbiA9ICJjIiwgDQogIGNhcHRpb24gPSAiQ29tdW5pZGFkZXMgQXV0w7Nub21hcyBjb24gbcOhcyBtdWplcmVzIGRlc2VtcGxlYWRvcyAoMjAyMCkiKSAlPiUga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IGxpc3QoZW5hYmxlZCA9IFQsIA0KICAgIGJhY2tncm91bmQgPSAicGx1bSIpKSAlPiUgDQogIGthYmxlX3BhcGVyKGZ1bGxfd2lkdGggPSBGKSAlPiUNCmNvbHVtbl9zcGVjKDYsIGNvbG9yID0gIndoaXRlIiwgDQogIGJhY2tncm91bmQgPSBpZmVsc2UoSU5FTW1heCRUb3RhbCA+IDEgLCAibWVkaXVtdmlvbGV0cmVkIikpIA0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCklORU1iIDwtIElORSAlPiUgZmlsdGVyKFNleG8gPT0gIkhvbWJyZXMiKSAlPiUNCiAgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKQ0KSU5FTWIkVHJpbWVzdHJlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORU1iJFRyaW1lc3RyZSkpDQoNCklORU1tYXhiIDwtIElORU1iICU+JSANCiAgc2xpY2VfbWF4KFRvdGFsLCBuPTEpICU+JSANCiAgc2VsZWN0KENDQUEsIFNleG8sIEVkYWQsIEHDsW8sIFRyaW1lc3RyZSwgVG90YWwpICU+JQ0KICBhcnJhbmdlKFNleG8sIFRyaW1lc3RyZSkNCg0Ka25pdHI6OmthYmxlKElORU1tYXhiLCBhbGlnbiA9ICJjIiwgY2FwdGlvbiA9ICJDb211bmlkYWRlcyBBdXTDs25vbWFzIGNvbiBtw6FzIHZhcm9uZXMgZGVzZW1wbGVhZG9zICgyMDIwKSIpICU+JSBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gbGlzdChlbmFibGVkID0gVCwgYmFja2dyb3VuZCA9ICJwbHVtIikpICU+JSBrYWJsZV9wYXBlcihmdWxsX3dpZHRoID0gRikgJT4lDQpjb2x1bW5fc3BlYyg2LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBpZmVsc2UoSU5FTW1heGIkVG90YWwgPiAxICwgIm1lZGl1bXZpb2xldHJlZCIpKSANCmBgYA0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGhheSBDb211bmlkYWRlcyBBdXTDs25vbWFzIHF1ZSBoYW4gcHJlc2VudGFkbyBwYXJhIGVsIGHDsW8gMjAyMCB1bmEgY2lmcmEgZGUgZGVzZW1wbGVvIGRlbCAxMDAlLiBBZGVtw6FzIHRvZGFzIGVsbGFzLCBwYXJhIGVsIGdydXBvIGRlIGVkYWQgZW50cmUgMTYgeSAxOSBhw7Fvcy4gDQoNCiMjIDUuIE1BUEFTIERFU0VNUExFTyAyMDIwVDIgU0VHw5pOIEdSVVBPIERFIEVEQUQgey50YWJzZXR9DQoNCkZpbHRybyBwb3IgbG9zIGRhdG9zIGNvcnJlc3BvbmRpZW50ZXMgYWwgc2VndW5kbyB0cmltZXN0cmUgKGFicmlsLCBtYXlvLCBqdW5pbyksIGRhZG8gcXVlIGFzw60gcG9kZW1vcyB2ZXIgbG9zIGVmZWN0b3MgZGUgbGEgcGFuZGVtaWEsIENvdmlkLTE5Lg0KQWRlbcOhcyBkZSBxdWUgZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhIGRlIGxvcyBkYXRvcyBkZWwgcHJpbWVyIHRyaW1lc3RyZSwgY29tbyBhZHZpZXJ0ZSBlbCBJTkUgZnVlIG1lbm9yIGEgbGEgZGUgbG9zIG90cm9zIHRyaW1lc3RyZXMuIChQb3IgdGFudG8sIHBpZW5zbyBxdWUgZXMgbWVqb3IgY29nZXIgZWwgc2VndW5kbyB0cmltZXN0cmUgcXVlIGVsIHByaW1lcm8uKSBEZSBpZ3VhbCBtb2RvLCBsYXMgY2l1ZGFkZXMgYXV0w7Nub21hcywgQ2V1dGEgeSBNZWxpbGxhLCBubyBsYXMgaGUgY29naWRvIHBhcmEgcmVwcmVzZW50YXIgbG9zIGRhdG9zIGVuIGVsIE1hcGEsIHB1ZXN0b3MgcXVlIGNvbW8gaW5kaWNhIGVsIElOZSwgZXN0b3MgdmFsb3JlcyBwdWVkZW4gZXN0YXIgYWZlY3RhZG9zIHBvciBlcnJvcmVzIGRlIG11ZXN0cmVvLg0KDQojIyMgPEZPTlQgQ09MT1I9InZpb2xldHJlZCI+KipEZSAxNiBhIDI0IGHDsW9zKio8L0ZPTlQ+DQoNCmBgYHtyIGVjaG89IEZBTFNFLCBldmFsPVRSVUV9DQpDQ0FBIDwtIHJpbzo6aW1wb3J0KCJodHRwczovL2dpdGh1Yi5jb20vcGVyZXpwNDQvTEFVMmJvdW5kYXJpZXM0c3BhaW4vYmxvYi9tYXN0ZXIvZGF0YS9DQ0FBLnJkYT9yYXc9dHJ1ZSIpDQpJTkVNQVBBIDwtIElORSAlPiUgDQogIGZpbHRlcihTZXhvID09ICJBbWJvcyBzZXhvcyIpICU+JSANCiAgZmlsdGVyKENDQUEgIT0gIlRvdGFsIE5hY2lvbmFsIikgJT4lIA0KICBmaWx0ZXIoRWRhZCA9PSAiTWVub3JlcyBkZSAyNSBhw7FvcyIpICU+JSANCiAgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKSAlPiUgDQogIGZpbHRlcihUcmltZXN0cmUgPT0gIjIiKSAlPiUgDQogIHNsaWNlKC0xOCkgJT4lIA0KICBzbGljZSgtMTgpDQogIA0KY2FuYXJpYXMgPC0gQ0NBQSAlPiUgDQogIGZpbHRlcihJTkVDb2RDQ0FBID09ICIwNSIpDQpwZW5pbnN1bGEgPC0gQ0NBQSAlPiUNCiAgZmlsdGVyKElORUNvZENDQUEgIT0gIjA1IikNCg0KbXlfc2hpZnQgPC0gc3RfYmJveChwZW5pbnN1bGEpW2MoMSwyKV0tIChzdF9iYm94KGNhbmFyaWFzKVtjKDEsMildKSArIGMoLTIuNCwgLTEuMSkNCg0KY2FuYXJpYXMkZ2VvbWV0cnkgPC0gY2FuYXJpYXMkZ2VvbWV0cnkgKyBteV9zaGlmdA0KDQpzdF9jcnMoY2FuYXJpYXMpICA8LSBzdF9jcnMocGVuaW5zdWxhKQ0KDQpwZW5pbnN1bGFfeV9jYW5hcmlhcyA8LSByYmluZChwZW5pbnN1bGEsIGNhbmFyaWFzKQ0KDQpwZW5pbnN1bGFfeV9jYW5hcmlhcyA8LSBwZW5pbnN1bGFfeV9jYW5hcmlhcyAlPiUgc2xpY2UoLTE3KQ0KDQpwZW5pbnN1bGFfeV9jYW5hcmlhcyA9IHNmOjpzdF9jYXN0KHBlbmluc3VsYV95X2NhbmFyaWFzLCAiTVVMVElQT0xZR09OIikNCg0KcCA8LSBnZ3Bsb3QodGV4dG8gPSAiQ0NBQSIgKSArIA0KICBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcykNCg0KVW5pb24gPC0gZnVsbF9qb2luKHBlbmluc3VsYV95X2NhbmFyaWFzLCBJTkVNQVBBLCBieSA9IGMoIklORUNvZENDQUEiID0gIm5fQ0NBQSIpKQ0KDQojbmFtZXMoVW5pb24pDQoNClVuaW9uMSA8LSBVbmlvbiAlPiUgc2VsZWN0KENDQUEsIEVkYWQsIFRyaW1lc3RyZSwgVG90YWwsIGdlb21ldHJ5KQ0KDQpDQ0FBX3BvaW50IDwtIHN0X2NlbnRyb2lkKFVuaW9uMSkNCg0KQ0NBQV9wb2ludHMgPC0gY2JpbmQoVW5pb24xLCBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChVbmlvbjEkZ2VvbWV0cnkpKSkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUUsICBvdXQud2lkdGg9Ijc1JSJ9DQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHBlbmluc3VsYV95X2NhbmFyaWFzLCBmaWxsPU5BKSArICANCiAgZ2VvbV9zZihkYXRhID0gQ0NBQV9wb2ludHMsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArIA0KICBnZW9tX3RleHQoZGF0YSA9IENDQUFfcG9pbnRzLCBhZXMoWCwgeT1ZLA0KICAgIGxhYmVsPXBlcmNlbnQoVG90YWwvMTAwKSksIGNvbG9yID0gIkJsYWNrIiwgDQogICAgZm9udGZhY2UgPSAiYm9sZCIsIA0KICAgIGNoZWNrX292ZXJsYXAgPSBUUlVFLCBzaXplID0gMi41KSArIA0KICBsYWJzKHN1YnRpdGxlID0gIkVkYWQ6IDE2LTI0IGHDsW9zIikgICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSkgDQpgYGANCg0KDQpgYGB7ciBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQojQ8OTRElHTyBVU0FETyBQQVJBIExPUyBNQVBBUw0KQ0NBQSA8LSByaW86OmltcG9ydCgiaHR0cHM6Ly9naXRodWIuY29tL3BlcmV6cDQ0L0xBVTJib3VuZGFyaWVzNHNwYWluL2Jsb2IvbWFzdGVyL2RhdGEvQ0NBQS5yZGE/cmF3PXRydWUiKQ0KSU5FTUFQQSA8LSBJTkUgJT4lIGZpbHRlcihTZXhvID09ICJBbWJvcyBzZXhvcyIpICU+JSANCiAgZmlsdGVyKENDQUEgIT0gIlRvdGFsIE5hY2lvbmFsIikgJT4lIGZpbHRlcihFZGFkID09ICJNZW5vcmVzIGRlIDI1IGHDsW9zIikgJT4lIGZpbHRlcihBw7FvID09ICIyMDIwIikgJT4lIA0KICBmaWx0ZXIoVHJpbWVzdHJlID09ICIyIikgJT4lIA0KICBzbGljZSgtMTgpICU+JSANCiAgc2xpY2UoLTE4KQ0KICANCiNuYW1lcyhDQ0FBKQ0KI25hbWVzKElORU1BUEEpDQpjYW5hcmlhcyA8LSBDQ0FBICU+JSBmaWx0ZXIoSU5FQ29kQ0NBQSA9PSAiMDUiKQ0KcGVuaW5zdWxhIDwtIENDQUEgJT4lIGZpbHRlcihJTkVDb2RDQ0FBICE9ICIwNSIpDQpteV9zaGlmdCA8LSBzdF9iYm94KHBlbmluc3VsYSlbYygxLDIpXS0gKHN0X2Jib3goY2FuYXJpYXMpW2MoMSwyKV0pICsgYygtMi40LCAtMS4xKQ0KY2FuYXJpYXMkZ2VvbWV0cnkgPC0gY2FuYXJpYXMkZ2VvbWV0cnkgKyBteV9zaGlmdA0Kc3RfY3JzKGNhbmFyaWFzKSAgPC0gc3RfY3JzKHBlbmluc3VsYSkNCnBlbmluc3VsYV95X2NhbmFyaWFzIDwtIHJiaW5kKHBlbmluc3VsYSwgY2FuYXJpYXMpDQpwZW5pbnN1bGFfeV9jYW5hcmlhcyA8LSBwZW5pbnN1bGFfeV9jYW5hcmlhcyAlPiUgc2xpY2UoLTE3KQ0KcGVuaW5zdWxhX3lfY2FuYXJpYXMgPSBzZjo6c3RfY2FzdChwZW5pbnN1bGFfeV9jYW5hcmlhcywgIk1VTFRJUE9MWUdPTiIpDQoNCnAgPC0gZ2dwbG90KHRleHRvID0gIkNDQUEiICkgKyBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcykNCg0KVW5pb24gPC0gZnVsbF9qb2luKHBlbmluc3VsYV95X2NhbmFyaWFzLCBJTkVNQVBBLCBieSA9IGMoIklORUNvZENDQUEiID0gIm5fQ0NBQSIpKQ0KI25hbWVzKFVuaW9uKQ0KVW5pb24xIDwtIFVuaW9uICU+JSBzZWxlY3QoQ0NBQSwgRWRhZCwgVHJpbWVzdHJlLCBUb3RhbCwgZ2VvbWV0cnkpDQpDQ0FBX3BvaW50IDwtIHN0X2NlbnRyb2lkKFVuaW9uMSkNCkNDQUFfcG9pbnRzIDwtIGNiaW5kKFVuaW9uMSwgc3RfY29vcmRpbmF0ZXMoc3RfY2VudHJvaWQoVW5pb24xJGdlb21ldHJ5KSkpDQoNCmBgYA0KDQpgYGB7ciBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHBlbmluc3VsYV95X2NhbmFyaWFzLCBmaWxsPU5BKSArICANCiAgZ2VvbV9zZihkYXRhID0gQ0NBQV9wb2ludHMsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArIA0KICBnZW9tX3RleHQoZGF0YSA9IENDQUFfcG9pbnRzLCANCiAgICBhZXMoWCwgeT1ZLCBsYWJlbD1wZXJjZW50KFRvdGFsLzEwMCkpLA0KICAgIGNvbG9yID0gIkJsYWNrIiwgZm9udGZhY2UgPSAiYm9sZCIsDQogICAgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsIHNpemUgPSAyLjUpICsgDQogIGxhYnMoc3VidGl0bGUgPSAiRWRhZDogMTYtMjQgYcOxb3MiKSAgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xKQ0KYGBgDQoNClBhcmEgZWwgZ3J1cG8gZGUgZWRhZCBtw6FzIGpvdmVuLCBlc3RlIGVzIGVsIGRlIDE2LTI0IGHDsW9zLCBzZSBwdWVkZSBvYnNlcnZhciwgZW4gbGEgbGV5ZW5kYSwgY29tbyBsYSB0YXNhIGRlIHBhcm8gY29tcHJlbmRlIHZhbG9yZXMgZW50cmUgZWwgMzAlIHkgY2FzaSBlbCA2MCUNCg0KU2llbmRvIENhbnRhYnJpYSBsYSBDb211bmlkYWQgQXV0w7Nub21hIGNvbiBtw6FzICUgZGUgZGVzZW1wbGVhZG9zIGVudHJlIDE2LTI0IGHDsW9zLCBlc3RvcyBzdW1hbiA1Nyw2NyUuIEVuIGNhbWJpbywgQXJhZ8OzbiBzZSBtdWVzdHJhIGNvbW8gbGEgcXVlIG1lbm9yIHRhc2EgZGUgZGVzZWVtcGxlbyBqdXZlbmlsIHByZXNlbnRhbC4gDQoNCg0KIyMjIDxGT05UIENPTE9SPSJ2aW9sZXRyZWQiPioqRGUgMjUgYSA1NCBhw7FvcyoqPC9GT05UPg0KDQpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWw9VFJVRX0NCiNEYXRvcyBtYXBhIGRlIDI1IGEgNTQgYcOxb3MuIA0KSU5FTUFQQTIgPC0gSU5FICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIkFtYm9zIHNleG9zIikgJT4lIA0KICBmaWx0ZXIoQ0NBQSAhPSAiVG90YWwgTmFjaW9uYWwiKSAlPiUgDQogIGZpbHRlcihFZGFkID09ICJEZSAyNSBhIDU0IGHDsW9zIikgJT4lIA0KICBmaWx0ZXIoQcOxbyA9PSAiMjAyMCIpICU+JSANCiAgZmlsdGVyKFRyaW1lc3RyZSA9PSAiMiIpICU+JQ0KICBzbGljZSgtMTgpICU+JSBzbGljZSgtMTgpDQpVbmlvbjIgPC0gZnVsbF9qb2luKHBlbmluc3VsYV95X2NhbmFyaWFzLCBJTkVNQVBBMiwgYnkgPSBjKCJJTkVDb2RDQ0FBIiA9ICJuX0NDQUEiKSkNClVuaW9uMiA8LSBVbmlvbjIgJT4lIHNlbGVjdChDQ0FBLCBFZGFkLCBUcmltZXN0cmUsIFRvdGFsLCBnZW9tZXRyeSkNCkNDQUFfcG9pbnQxIDwtIHN0X2NlbnRyb2lkKFVuaW9uMikNCkNDQUFfcG9pbnRzMSA8LSBjYmluZChVbmlvbjIsIHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKFVuaW9uMiRnZW9tZXRyeSkpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI3NSUifQ0KZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcywgZmlsbD1OQSkgKw0KICBnZW9tX3NmKGRhdGEgPSBDQ0FBX3BvaW50czEsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArIA0KICBnZW9tX3RleHQoZGF0YSA9IENDQUFfcG9pbnRzMSwgYWVzKFgsIHk9WSwgbGFiZWw9cGVyY2VudChUb3RhbC8xMDApKSwgY29sb3IgPSAiQmxhY2siLCBmb250ZmFjZSA9ICJib2xkIiwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsIHNpemUgPSAyLjUpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHN1YnRpdGxlID0gIkVkYWQ6IERlIDI1IGEgNTQgYcOxb3MiKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSkNCmBgYA0KDQpMb3MgdmFsb3JlcyBlbiBlc3RlIGNhc28gaGFuIGNhbWJpYWRvLCB2YW4gZGUgYXByb3hpbWFkYW1lbnRlIGVsIDklIGFsIDIwJS4gU2llbmRvIGVsIFBhw61zIFZhc2NvIGxhIENvbXVuaWRhZCBBdXTDs25vbWEgY29uIG1lbm9yICUgZGUgZGVzZW1wbGVhZG9zIHBhcmEgIGVsIGdydXBvIGRlIGVkYWQgZGUgMjUgYSA1NCBhw7Fvcy4gKE1pZW50cmFzIHF1ZSB0ZW7DrWEgdW4gMzAsOTIlIGRlIHBhcm8ganV2ZW5pbCkgDQpQb3IgY29udHJhLCBsYSBDb211bmlkYWQgQXV0w7Nub21hIHF1ZSBwcmVzZW50YSB1biBtYXlvciBwb3JjZW50YWplIGRlIHBhcmFkb3MgcGFyYSBlc3RlIGdydXBvIGRlIGVkYWQgZXMgQW5kYWx1Y8OtYSwgc2VndWlkbyBkZSBFeHRyZW1hZHVyYSB5IGxhcyBJc2xhcyBDYW5hcmlhcy4gDQoNClRhbWJpw6luIGVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIGVsIG7Dum1lcm8gZGUgcGFyYWRvcyBkZSBsYXJnYSBkdXJhY2nDs24gcXVlIGhheSBlbnRyZSBlc3RlIGdydXBvIGRlIGVkYWQgeSBxdWUgbXVjaGFzIHZlY2VzIHB1ZWRlIGxsZXZhciBhIHF1ZSBlc3RvcyBzZSBkZXNhbmltZW4gYSBsYSBob3JhIGRlIGJ1c2NhciB1biBlbXBsZW8uIEUgaW5jbHVzbyBwdWVkZSBkYXIgbHVnYXIgYSBxdWUgIHJlYWxpemVuIG90cmFzIGFjdGl2aWRhZGVzIHF1ZSBzZWFuIHJlbXVuZXJhZGFzIHBlcm8gbm8gZGVjbGFyYWRhcy4gUG9yIGxvIHF1ZSBzZSBlc2NhcGVuIGRlbCBjb250cm9sIGRlIGxhcyBBZG1pbmlzdHJhY2lvbmVzIHkgZGUgbGFzIGVzdGFkw61zdGljYXMgb2ZpY2lhbGVzIChlY29ub21pYSBzdW1lcmdpZGEpDQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKkRlIDU1IGEgNjQgYcOxb3MqKjwvRk9OVD4NCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KI0RhdG9zIG1hcGEgZGUgNTUgeSBtw6FzIGHDsW9zIA0KSU5FTUFQQTMgPC0gSU5FICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIkFtYm9zIHNleG9zIikgJT4lIA0KICBmaWx0ZXIoQ0NBQSAhPSAiVG90YWwgTmFjaW9uYWwiKSAlPiUgDQogIGZpbHRlcihFZGFkID09ICJEZSA1NSB5IG3DoXMgYcOxb3MiKSAlPiUgDQogIGZpbHRlcihBw7FvID09ICIyMDIwIikgJT4lIA0KICBmaWx0ZXIoVHJpbWVzdHJlID09ICIyIikgJT4lIA0KICBzbGljZSgtMTgpICU+JSANCiAgc2xpY2UoLTE4KQ0KDQpVbmlvbjMgPC0gZnVsbF9qb2luKHBlbmluc3VsYV95X2NhbmFyaWFzLCBJTkVNQVBBMywgYnkgPSBjKCJJTkVDb2RDQ0FBIiA9ICJuX0NDQUEiKSkNClVuaW9uMyA8LSBVbmlvbjMgJT4lIHNlbGVjdChDQ0FBLCBFZGFkLCBUcmltZXN0cmUsIFRvdGFsLCBnZW9tZXRyeSkNCkNDQUFfcG9pbnQzIDwtIHN0X2NlbnRyb2lkKFVuaW9uMikNCkNDQUFfcG9pbnRzMyA8LSBjYmluZChVbmlvbjMsIHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKFVuaW9uMiRnZW9tZXRyeSkpKQ0KYGBgDQoNCmBgYHtyIG91dC53aWR0aD0iNzUlIiwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcywgZmlsbD1OQSkgKyAgDQogIGdlb21fc2YoZGF0YSA9IENDQUFfcG9pbnRzMywgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBUb3RhbCkpICsgIA0KICBnZW9tX3RleHQoZGF0YSA9IENDQUFfcG9pbnRzMywgYWVzKFgsIHk9WSwgbGFiZWw9cGVyY2VudChUb3RhbC8xMDApKSwgY29sb3IgPSAiQmxhY2siLCBmb250ZmFjZSA9ICJib2xkIiwgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsIHNpemUgPSAyLjUpICsgDQogIHRoZW1lX3ZvaWQoKSArICBsYWJzKHN1YnRpdGxlID0gIkVkYWQ6IERlIDU1IGEgNjQgYcOxb3MiKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkrIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSkNCmBgYA0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIHBhcmEgZXN0ZSBncnVwbyBkZSBlZGFkIGxhIHRhc2EgZGUgZGVzZW1wbGVvIGVzIG1lbm9yIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIG90cm9zIGdydXBvcyBjb25zaWRlcmFkb3MuIEVzdGEgY29nZSB2YWxvcmVzIGVuIHRvcm5vIGFsIDUlIGhhc3RhIGVsIDE5JSwgc2llbmRvIENhbmFyaWFzIGxhIENDQUEgY29uIG3DoXMgcG9yY2VudGFqZSBkZSBkZXNlbXBsZWFkb3MgcGFyYSBlc3RlIHJhbmdvIGRlIGVkYWQgeSBOYXZhcnJhIGxhIHF1ZSBtZW5vciAlIHByZXNlbnRhLCB1biA1LDQxMCUuIA0KQ2FiZSB0ZW5lciBlbiBjdWVudGEgcXVlIGVzdGEgZXMgbGEgZnJhbmphIGRlIGVkYWQgZG9uZGUgbWVub3MgZW1wbGVvIHNlIGRlc3RydXllLiANCg0KIyMgNi4gRVZPTFVDScOTTiBERVNFTVBMRU8gU0VHw5pOIEfDiU5FUk8NCg0KTWVkaWFudGUgbG9zIGdyw6FmaWNvcyBzaWd1aWVudGVzLCBwb2RlbW9zIHZlciBjb21vIGhhIHNpZG8gbGEgZXZvbHVjacOzbiBkZSBsYSB0YXNhIGRlIHBhcm8gZ2xvYmFsIChTaW4gZGlmZXJlbmNpYXIgcG9yIGdydXBvcyBkZSBlZGFkKSBlbiBsb3MgMyBwcmltZXJvcyB0cmltZXN0cmVzIGRlbCBhw7FvIDIwMjAuIEFzw60gY29tbyBxdWUgZ8OpbmVybyBoYSBwcmVzZW50YWRvIHVuYSB0YXNhIG1heW9yIHkgZW4gcXXDqSBjb211bmlkYWQgYXV0w7Nub21hLiANCg0KPGJyPg0KDQojIyMgKirCv0PDk01PIEhBIEVWT0xVQ0lPTkFETyBMQSBUQVNBIERFIFBBUk8gRkVNRU5JTkE/KioNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQpkYXRvc19JTkUgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAiZGF0b3NfSU5FLmNzdiIpKQ0KDQpJTkUgPC0gZGF0b3NfSU5FICU+JSByZW5hbWUoQ0NBQSA9ICJDb211bmlkYWRlcyB5IENpdWRhZGVzIEF1dMOzbm9tYXMiKQ0KSU5FIDwtIElORSAlPiUgc2VwYXJhdGUoQ0NBQSwgYygibl9DQ0FBIiwgIkNDQUEiKSwgc2VwID0gIiAiKQ0KSU5FIDwtIElORSAlPiUgc2VwYXJhdGUoUGVyaW9kbywgYygiQcOxbyIsICJUcmltZXN0cmUiKSwgc2VwID0gIl8iKQ0KSU5FIDwtIElORSAlPiUNCiBtdXRhdGUoVHJpbWVzdHJlID0gY2FzZV93aGVuKFRyaW1lc3RyZSA9PSAiVDEiIH4gIjEiLA0KVHJpbWVzdHJlID09ICJUMiIgfiAiMiIsDQpUcmltZXN0cmUgPT0gIlQzIiB+ICIzIiwNClRyaW1lc3RyZSA9PSAiVDQiIH4gIjQiKSkNCklORSRUb3RhbCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihJTkUkVG90YWwpKQ0KSU5FRSA8LSBJTkUgJT4lIHJlbmFtZShDQ0FBcyA9ICJDQ0FBIikNCklORUUgPC0gSU5FRSAlPiUNCiAgICBtdXRhdGUoQ0NBQSA9DQogICAgY2FzZV93aGVuKA0KICAgIENDQUFzID09ICJBbmRhbHVjw61hIiB+ICJBbmRhbHVjw61hIiwNCiAgICBDQ0FBcyA9PSAiTGFSaW9qYSIgfiAiTGEgUmlvamEiLA0KICAgIENDQUFzID09ICJDYXN0aWxsYWxhTWFuY2hhIiB+ICJDYXN0aWxsYS1MYSBNYW5jaGEiLA0KICAgIENDQUFzID09ICJBcmFnw7NuIiB+ICJBcmFnw7NuIiwNCiAgICBDQ0FBcyA9PSAiQ2FuYXJpYXMiIH4gIkNhbmFyaWFzIiwNCiAgICBDQ0FBcyA9PSAiUGHDrXNWYXNjbyIgfiAiUGHDrXMgVmFzY28iLA0KICAgIENDQUFzID09ICJBc3R1cmlhcyIgfiAiUHJpbmNpcGFkbyBkZSBBc3R1cmlhcyIsDQogICAgQ0NBQXMgPT0gIkNhc3RpbGxheUxlw7NuIiB+ICJDYXN0aWxsYSB5IExlw7NuIiwNCiAgICBDQ0FBcyA9PSAiRXh0cmVtYWR1cmEiIH4gIkV4dHJlbWFkdXJhIiwNCiAgICBDQ0FBcyA9PSAiSXNsYXMiIH4gIklsbGVzIEJhbGVhcnMiLA0KICAgIENDQUFzID09ICJNYWRyaWQiIH4gIkNvbXVuaWRhZCBkZSBNYWRyaWQiLA0KICAgIENDQUFzID09ICJDZXV0YSIgfiAiQ2V1dGEiLA0KICAgIENDQUFzID09ICJNZWxpbGxhIiB+ICJNZWxpbGxhIiwNCiAgICBDQ0FBcyA9PSAiTXVyY2lhIiB+ICJSZWdpw7NuIGRlIE11cmNpYSIsDQogICAgQ0NBQXMgPT0gIkNhbnRhYnJpYSIgfiAiQ2FudGFicmlhIiwNCiAgICBDQ0FBcyA9PSAiTmF2YXJyYSIgfiAiQ29tdW5pZGFkIEZvcmFsIGRlIE5hdmFycmEiLA0KICAgIENDQUFzID09ICJDYXRhbHXDsWEiIH4gIkNhdGFsdcOxYSIsDQogICAgQ0NBQXMgPT0gIkdhbGljaWEiIH4gIkdhbGljaWEiLA0KICAgIENDQUFzID09ICJDb211bml0YXRWYWxlbmNpYW5hIiB+ICJDb211bmlkYWQgVmFsZW5jaWFuYSIpKQ0KDQpJTkVFIDwtIElORUUgJT4lIHNlbGVjdCgtQ0NBQXMpDQpJTkVFIDwtIElORUUgJT4lcmVsb2NhdGUoQ0NBQSwgLmFmdGVyID0gbl9DQ0FBKQ0KDQoNCklORU1BUEE0IDwtIElORUUgJT4lDQogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIikgJT4lDQogIGZpbHRlcihDQ0FBICE9ICJUb3RhbCBOYWNpb25hbCIpICU+JQ0KICBmaWx0ZXIoRWRhZCA9PSAiVG90YWwiKSAlPiUNCiAgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKSAlPiUNCmZpbHRlcihDQ0FBICE9ICJDZXV0YSIpICU+JSBmaWx0ZXIoQ0NBQSAhPSAiTWVsaWxsYSIpDQoNCkNDQUEgPC0gcmlvOjppbXBvcnQoImh0dHBzOi8vZ2l0aHViLmNvbS9wZXJlenA0NC9MQVUyYm91bmRhcmllczRzcGFpbi9ibG9iL21hc3Rlci9kYXRhL0NDQUEucmRhP3Jhdz10cnVlIikNCg0KY2FuYXJpYXMgPC0gQ0NBQSAlPiUNCiAgZmlsdGVyKElORUNvZENDQUEgPT0gIjA1IikNCnBlbmluc3VsYSA8LSBDQ0FBICU+JQ0KICBmaWx0ZXIoSU5FQ29kQ0NBQSAhPSAiMDUiKQ0KDQpteV9zaGlmdCA8LSBzdF9iYm94KHBlbmluc3VsYSlbYygxLDIpXS0gKHN0X2Jib3goY2FuYXJpYXMpW2MoMSwyKV0pICsgYygtMi40LCAtMS4xKQ0KDQpjYW5hcmlhcyRnZW9tZXRyeSA8LSBjYW5hcmlhcyRnZW9tZXRyeSArIG15X3NoaWZ0DQoNCnN0X2NycyhjYW5hcmlhcykgIDwtIHN0X2NycyhwZW5pbnN1bGEpDQoNCnBlbmluc3VsYV95X2NhbmFyaWFzIDwtIHJiaW5kKHBlbmluc3VsYSwgY2FuYXJpYXMpDQoNCnBlbmluc3VsYV95X2NhbmFyaWFzIDwtIHBlbmluc3VsYV95X2NhbmFyaWFzICU+JSBzbGljZSgtMTcpDQoNCnBlbmluc3VsYV95X2NhbmFyaWFzID0gc2Y6OnN0X2Nhc3QocGVuaW5zdWxhX3lfY2FuYXJpYXMsICJNVUxUSVBPTFlHT04iKQ0KDQpkZl9pbiA8LWlubmVyX2pvaW4ocGVuaW5zdWxhX3lfY2FuYXJpYXMsIElORU1BUEE0LCBieT0gYygiTm9tYnJlQ0NBQSIgPSAiQ0NBQSIpKQ0KSU5FTUFQQUE0IDwtIGRmX2luICU+JSBzZWxlY3QoTm9tYnJlQ0NBQSwgZ2VvbWV0cnksIFRvdGFsLCBUcmltZXN0cmUpDQoNCklORU1BUEE0YiA8LSBJTkVNQVBBQTQgJT4lIGZpbHRlcihUcmltZXN0cmUgPT0gIjEiKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KSU5FTUFQQTRiYiA8LSBJTkVNQVBBNCAlPiUgc2xpY2VfbWF4KFRvdGFsLCBuPTEpDQpNYXBhIDwtICJodHRwczovLzIuYnAuYmxvZ3Nwb3QuY29tLy0zb2NiaUVTb1JKWS9VZVA3aDBMZi1WSS9BQUFBQUFBQUJKTS9iTGkzVUZuWmFQcy9zMTYwMC9aT05BK1NVUi5qcGciDQoNCmRmX21heCA8LSBJTkVNQVBBNGJiICU+JSBhZGRfY29sdW1uKE1hcGEpDQpkZl9tYXggPC0gZGZfbWF4ICU+JSBzZWxlY3QoLWMoU2V4bywgbl9DQ0FBLCBFZGFkKSkNCg0KVGFibGFfZGZtYXg8LSBkZl9tYXggJT4lIGd0KCkNCg0KVGFibGFfZGZtYXggPC0gVGFibGFfZGZtYXggJT4lDQogICAgICAgICAgICAgICAgICAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkNDQUEgQ09OIE3DgVMgUEFSTyBGRU1FTklOTyAoJSkqKiIpKQ0KDQpUYWJsYV9kZm1heCA8LSBUYWJsYV9kZm1heCAlPiUNCiAgICAgICAgICAgICAgICB0YWJfb3B0aW9ucyhoZWFkaW5nLmJhY2tncm91bmQuY29sb3IgPSAiYmxhY2siKSAlPiUgdGFiX29wdGlvbnMoaGVhZGluZy50aXRsZS5mb250LnNpemUgPSAxNSwgaGVhZGluZy5zdWJ0aXRsZS5mb250LnNpemUgPSAxMywgIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQgPSAgImJvbGQiKQ0KDQpUYWJsYV9kZm1heCAgJT4lDQogIGd0Ojp0ZXh0X3RyYW5zZm9ybShsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSB2YXJzKE1hcGEpKSwgZm4gPSBmdW5jdGlvbih4KSB7Z3Q6OndlYl9pbWFnZSh4LCBoZWlnaHQgPSA1MCl9KSAlPiUgIGNvbHNfYWxpZ24oYWxpZ24gPSAiY2VudGVyIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHBlbmluc3VsYV95X2NhbmFyaWFzLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX3NmKGRhdGEgPSBJTkVNQVBBQTQsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArDQogIGdlb21fc2YoZGF0YSA9IElORU1BUEE0YiwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBUb3RhbCkpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImF6dXJlIikpICsNCiAgdHJhbnNpdGlvbl9tYW51YWwoVHJpbWVzdHJlKSArIHRoZW1lX3ZvaWQoKSArIGxhYnModGl0bGU9IlRBU0EgREUgREVTRU1QTEVPIEZFTUVOSU5PIC0gIFBlcmlvZG86IHtjdXJyZW50X2ZyYW1lfSIsDQogICAgY2FwdGlvbiA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsDQogICAgaGp1c3QgPSAwLjYsIGNvbG9yPSJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAiaW5mZXJubyIpDQpgYGANCg0KPGJyPg0KDQojIyMgKirCv1kgTEEgVEFTQSBERSBQQVJPIE1BU0NVTElOQT8qKg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCklORU1BUEE1IDwtIElORUUgJT4lDQogIGZpbHRlcihTZXhvID09ICJIb21icmVzIikgJT4lDQogIGZpbHRlcihDQ0FBICE9ICJUb3RhbCBOYWNpb25hbCIpICU+JQ0KICBmaWx0ZXIoRWRhZCA9PSAiVG90YWwiKSAlPiUNCiAgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKSAlPiUNCmZpbHRlcihDQ0FBICE9ICJDZXV0YSIpICU+JSBmaWx0ZXIoQ0NBQSAhPSAiTWVsaWxsYSIpDQoNCmRmX2luYiA8LWlubmVyX2pvaW4ocGVuaW5zdWxhX3lfY2FuYXJpYXMsIElORU1BUEE1LCBieT0gYygiTm9tYnJlQ0NBQSIgPSAiQ0NBQSIpKQ0KSU5FTUFQQUE1IDwtIGRmX2luYiAlPiUgc2VsZWN0KE5vbWJyZUNDQUEsIGdlb21ldHJ5LCBUb3RhbCwgVHJpbWVzdHJlKQ0KDQpJTkVNQVBBNWIgPC0gSU5FTUFQQUE1ICU+JSBmaWx0ZXIoVHJpbWVzdHJlID09ICIxIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHBlbmluc3VsYV95X2NhbmFyaWFzLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX3NmKGRhdGEgPSBJTkVNQVBBQTUsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArDQogIGdlb21fc2YoZGF0YSA9IElORU1BUEE1YiwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBUb3RhbCkpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImF6dXJlIikpICsNCiAgdHJhbnNpdGlvbl9tYW51YWwoVHJpbWVzdHJlKSArIHRoZW1lX3ZvaWQoKSArIGxhYnModGl0bGU9IlRBU0EgREUgREVTRU1QTEVPIE1BU0NVTElOTyAtIFBlcmlvZG86IHtjdXJyZW50X2ZyYW1lfSIsDQogICAgY2FwdGlvbiA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsDQogICAgaGp1c3QgPSAwLjYsIGNvbG9yPSJibGFjayIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAiaW5mZXJubyIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KSU5FTUFQQTViYiA8LSBJTkVNQVBBNSAlPiUgc2xpY2VfbWF4KFRvdGFsLCBuPTEpDQpNYXBhIDwtICJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iL2YvZjIvTG9jYWxpemFjaSVDMyVCM25fZGVfQ2FuYXJpYXNfbmV3LnN2Zy8xMjAwcHgtTG9jYWxpemFjaSVDMyVCM25fZGVfQ2FuYXJpYXNfbmV3LnN2Zy5wbmciDQoNCmRmX21heEggPC0gSU5FTUFQQTViYiAlPiUgYWRkX2NvbHVtbihNYXBhKQ0KZGZfbWF4SCA8LSBkZl9tYXhIICU+JSBzZWxlY3QoLWMoU2V4bywgbl9DQ0FBLCBFZGFkKSkNCg0KVGFibGFfZGZtYXhIPC0gZGZfbWF4SCAlPiUgZ3QoKQ0KDQpUYWJsYV9kZm1heEggPC0gVGFibGFfZGZtYXhIICU+JQ0KICAgICAgICAgICAgICAgICAgIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipDQ0FBIENPTiBNw4FTIFBBUk8gTUFTQ1VMSU5PICglKSoqIikpDQoNClRhYmxhX2RmbWF4SCA8LSBUYWJsYV9kZm1heEggJT4lDQogICAgICAgICAgICAgICAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gImJsYWNrIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTUsIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTMsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikNCg0KVGFibGFfZGZtYXhIICAlPiUNCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IHZhcnMoTWFwYSkpLCBmbiA9IGZ1bmN0aW9uKHgpIHtndDo6d2ViX2ltYWdlKHgsIGhlaWdodCA9IDUwKX0pICU+JSAgY29sc19hbGlnbihhbGlnbiA9ICJjZW50ZXIiKQ0KYGBgDQoNCkNvbW8gcG9kZW1vcyB2ZXIgdHJhcyBsYSBldm9sdWNpw7NuIGRlIGxvcyBtYXBhcyB5IGNvbW8gc2UgaGEgY29tZW50YWRvIGFudGVyaW9ybWVudGUsIGxhcyBtdWplcmVzIHNvbiBsYXMgcXVlIG3DoXMgZXN0w6FuIHN1ZnJpZW5kbyBsb3MgZXN0cmFnb3MgZGVsIGRlc2VtcGxlbyBwb3IgbGEgcGFuZGVtaWEuIA0KQWRlbcOhcywgbG9zIGRhdG9zIHJlY29naWRvcyBlbiBsYSBlbmN1ZXN0YSBkZSBQb2JsYWNpw7NuIEFjdGl2YSBhcHVudGFuIHF1ZSBlbiBlbCB0ZXJjZXIgdHJpbWVzdHJlIGRlIDIwMjAgMjY0LjcwMCBtdWplcmVzIHBlcmRpZXJvbiBzdSBlbXBsZW8sIGZyZW50ZSBhIDkwLjMwMCBob21icmVzLiBQb3IgdGFudG8sIGNvbW8gaW5mb3JtYSBBbmRyZWEgVmljYXJpbyBlbiBlbCBkaWFyaW8gZGlnaXRhbCBOdWV2YSBUcmlidW5hLCAqKmxhIHRhc2EgZGUgcGFybyBmZW1lbmluYSBlcyA0IHB1bnRvcyBzdXBlcmlvciBhIGxhIGRlIGxvcyBob21icmVzKiouDQoNCmBgYHtyIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0NCiNFc3RlIGVzIGVsIGPDs2RpZ28gcXVlIGhlIHV0aWxpemFkbyBwYXJhIGhhY2VyIGxvcyBtbWFwYXMuIE1pc21vIHByb2NlZGltaWVudG8gcGFyYSBlbCBkZXNlbXBsZW8gbWFzY3VsaW5vLg0KZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcywgY29sb3IgPSAiYmxhY2siKSArDQogICAgZ2VvbV9zZihkYXRhID0gSU5FTUFQQUE0LCBhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgZmlsbCA9IFRvdGFsKSkgKw0KICBnZW9tX3NmKGRhdGEgPSBJTkVNQVBBNGIsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gVG90YWwpKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhenVyZSIpKSArDQogIHRyYW5zaXRpb25fbWFudWFsKFRyaW1lc3RyZSkgKyB0aGVtZV92b2lkKCkgKyBsYWJzKHRpdGxlPSJUQVNBIERFIERFU0VNUExFTyBGRU1FTklOTyAtICBQZXJpb2RvOiB7Y3VycmVudF9mcmFtZX0iLA0KICAgIGNhcHRpb24gPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkUiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LA0KICAgIGhqdXN0ID0gMC42LCBjb2xvcj0iYmxhY2siKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSkNCmBgYA0KDQpgYGB7ciBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQojRXN0ZSBlcyBlbCBjw7NkaWdvIHF1ZSBoZSB1dGlsaXphZG8gcGFyYSBoYWNlciBsYSB0YWJsYSBxdWUgbm9zIG11ZXN0cmEgY3XDoWwgaGEgc2lkbyBsYSBjb211bmlkYWQgQXV0w7Nub21hIGNvbiBtw6FzIGRlc2VtcGxlbyBmZW1lbmlubyB5IGVuIHF1w6kgdHJpbWVzdHJlLiBDb2dpZW5kbyBsb3MgZGF0b3MgZ2xvYmFsZXMgKE5vIGRpZmVyZW5jaWFuZG8gcG9yIGdydXBvcyBkZSBlZGFkKSANCiNNaXNtbyBwcm9jZWRpbWllbnRvIHBhcmEgbGEgdGFzYSBkZSBwYXJvIG1hc2N1bGluYS4gDQpJTkVNQVBBNGJiIDwtIElORU1BUEE0ICU+JSBzbGljZV9tYXgoVG90YWwsIG49MSkNCk1hcGEgPC0gImh0dHBzOi8vMi5icC5ibG9nc3BvdC5jb20vLTNvY2JpRVNvUkpZL1VlUDdoMExmLVZJL0FBQUFBQUFBQkpNL2JMaTNVRm5aYVBzL3MxNjAwL1pPTkErU1VSLmpwZyINCg0KZGZfbWF4IDwtIElORU1BUEE0YmIgJT4lIGFkZF9jb2x1bW4oTWFwYSkNCmRmX21heCA8LSBkZl9tYXggJT4lIHNlbGVjdCgtYyhTZXhvLCBuX0NDQUEsIEVkYWQpKQ0KDQpUYWJsYV9kZm1heDwtIGRmX21heCAlPiUgZ3QoKQ0KDQpUYWJsYV9kZm1heCA8LSBUYWJsYV9kZm1heCAlPiUNCiAgICAgICAgICAgICAgICAgICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqQ0NBQSBDT04gTcOBUyBQQVJPIEZFTUVOSU5PKioiKSkNCg0KVGFibGFfZGZtYXggPC0gVGFibGFfZGZtYXggJT4lDQogICAgICAgICAgICAgICAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gImJsYWNrIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTUsIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTMsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikNCg0KVGFibGFfZGZtYXggICU+JQ0KICBndDo6dGV4dF90cmFuc2Zvcm0obG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gdmFycyhNYXBhKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lICBjb2xzX2FsaWduKGFsaWduID0gImNlbnRlciIpDQpgYGANCjxicj4NCg0KIyMgNy4gREVTRU1QTEVPIEVOIExBIENPTS5WQUxFTkNJQU5BIHsudGFic2V0fQ0KDQojIyMgPEZPTlQgQ09MT1I9InZpb2xldHJlZCI+KipEaXN0cmlidWNpw7NuIHRhc2EgZGVzZW1wbGVvKio8L0ZPTlQ+DQoNCkVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBsb3MgZGF0b3MgcmVwcmVzZW5ldGFkb3MgZW4gZWwgZ3LDoWZpY28gY2lyY3VsYXIgY29ycmVzcG9uZGVuIGFsIGRlc2VtcGxlbyBwYXJhIGNhZGEgZ3J1cG8gZGUgZWRhZCBkaXZpZGlkbyBlbnRyZSBsYSBzdW1hIGRlIHRvZG9zIGVzdG9zLCBwYXJhIHJlcHJlc2VudGFyIGxhIHByb3BvcmNpw7NuIGRlIGNhZGEgdW5vIHkgcXVlIGxhIHN1bWEgdG90YWwgZGUgZWwgMTAwJSAoRXMgZGVjaXIsIGRlIDE2IGEgMTkgYcOxb3MgZW4gZWwgc2VndW5kbyB0cmltZXN0cmUgZGUgMjAyMCBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSBodWJvIHVuYSB0YXNhIGRlIHBhcm8gZGVsIDc3LDY0JS4gVG9kbyB5IHF1ZSBzb2JyZSBlbCB0b3RhbCBkZWwgcGFybywgdGVuaWVuZG8gZW4gY3VlbnRhIGxhIHN1bWEgZGUgdG9kYXMgbGFzIHRhc2FzLCByZXByZXNlbnTDsyBlbCA1MiwzJSkNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KSU5FMjBUMiA8LSBJTkUgJT4lIA0KICBmaWx0ZXIoQcOxbyA9PSAiMjAyMCIpICU+JSANCiAgZmlsdGVyKFNleG8gPT0gIk11amVyZXMiKSAlPiUgDQogIGZpbHRlcihDQ0FBID09ICJDb211bml0YXRWYWxlbmNpYW5hIikgJT4lDQogIGZpbHRlcihUcmltZXN0cmUgPT0gIjIiKSAlPiUgDQogIGZpbHRlcihFZGFkICE9ICJUb3RhbCIpICU+JSANCiAgZmlsdGVyKEVkYWQgIT0gIk1lbm9yZXMgZGUgMjUgYcOxb3MiKSAlPiUgDQogIGZpbHRlcihFZGFkICE9ICIyNSB5IG3DoXMgYcOxb3MiKSAlPiUgDQogIG11dGF0ZShUb3RhbFQgPSAoVG90YWwvMTQ4LjMyKSoxMDApDQpgYGANCg0KDQpgYGB7cn0NCnRyaW0yIDwtIGdncGxvdChJTkUyMFQyLCBhZXMoIiIsIFRvdGFsVCwgZmlsbCA9IEVkYWQpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKw0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKyAgDQogIHRoZW1lX3ZvaWQoKSArICANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNlYWdyZWVuMiIsIm9yY2hpZDEiLCJvbGl2ZWRyYWIxIiwiYXF1YW1hcmluZSIpKSArIGdlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChUb3RhbFQvMTAwKSksIA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsgDQogIGxhYnMoc3VidGl0bGUgPSAiU2VndW5kbyB0cmltZXN0cmUiKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSANCiNIYWdvIGxvIG1pc21vIHBhcmEgbG9zIG90cm9zIHRyaW1lc3RyZXMgeSBwYXJhIGVsIHBhcm8gbWFzY3VsaW5vLQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KSU5FMjBUMSA8LSBJTkUgJT4lIGZpbHRlcihBw7FvID09ICIyMDIwIikgJT4lDQogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIikgJT4lIA0KICBmaWx0ZXIoQ0NBQSA9PSAiQ29tdW5pdGF0VmFsZW5jaWFuYSIpICU+JQ0KICBmaWx0ZXIoVHJpbWVzdHJlID09ICIxIikgJT4lIA0KICBmaWx0ZXIoRWRhZCAhPSAiVG90YWwiKSAlPiUgDQogIGZpbHRlcihFZGFkICE9ICJNZW5vcmVzIGRlIDI1IGHDsW9zIikgJT4lIA0KICBmaWx0ZXIoRWRhZCAhPSAiMjUgeSBtw6FzIGHDsW9zIikgJT4lIA0KICBtdXRhdGUoVG90YWxUID0gKFRvdGFsLzEwOC4yMCkqMTAwKQ0KDQp0cmltMSA8LSBnZ3Bsb3QoSU5FMjBUMSwgYWVzKCIiLCBUb3RhbFQsIGZpbGwgPSBFZGFkKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgIHRoZW1lX3ZvaWQoKSArICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2VhZ3JlZW4yIiwib3JjaGlkMSIsIm9saXZlZHJhYjEiLCJhcXVhbWFyaW5lIikpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wZXJjZW50KFRvdGFsVC8xMDApKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIA0KICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkgKyANCiAgbGFicyhzdWJ0aXRsZSA9ICJQcmltZXIgdHJpbWVzdHJlIikgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCklORTIwVDMgPC0gSU5FICU+JSBmaWx0ZXIoQcOxbyA9PSAiMjAyMCIpICU+JSBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIpICU+JSBmaWx0ZXIoQ0NBQSA9PSAiQ29tdW5pdGF0VmFsZW5jaWFuYSIpICU+JSBmaWx0ZXIoVHJpbWVzdHJlID09ICIzIikgJT4lIGZpbHRlcihFZGFkICE9ICJUb3RhbCIpICU+JSBmaWx0ZXIoRWRhZCAhPSAiTWVub3JlcyBkZSAyNSBhw7FvcyIpICU+JSBmaWx0ZXIoRWRhZCAhPSAiMjUgeSBtw6FzIGHDsW9zIikgJT4lIG11dGF0ZShUb3RhbFQgPSAoVG90YWwvMTMyLjMxKSoxMDApDQoNCnRyaW0zIDwtIGdncGxvdChJTkUyMFQzLCBhZXMoIiIsIFRvdGFsVCwgZmlsbCA9IEVkYWQpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvcj0id2hpdGUiKSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArICB0aGVtZV92b2lkKCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNlYWdyZWVuMiIsIm9yY2hpZDEiLCJvbGl2ZWRyYWIxIiwiYXF1YW1hcmluZSIpKSArIGdlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChUb3RhbFQvMTAwKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsgbGFicyhzdWJ0aXRsZSA9ICJUZXJjZXIgdHJpbWVzdHJlIikgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQojSGFnbyBsbyBtaXNtbyBwZXJvIGFob3JhIHBhcmEgbGEgZGlzdHJpYnVjacOzbiBkZWwgcGFybyBlbiBsb3MgSG9tYnJlcw0KSU5FMjBIMiA8LSBJTkUgJT4lIGZpbHRlcihBw7FvID09ICIyMDIwIikgJT4lIGZpbHRlcihTZXhvID09ICJIb21icmVzIikgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bml0YXRWYWxlbmNpYW5hIikgJT4lIGZpbHRlcihUcmltZXN0cmUgPT0gIjIiKSAlPiUgZmlsdGVyKEVkYWQgIT0gIlRvdGFsIikgJT4lIGZpbHRlcihFZGFkICE9ICJNZW5vcmVzIGRlIDI1IGHDsW9zIikgJT4lIGZpbHRlcihFZGFkICE9ICIyNSB5IG3DoXMgYcOxb3MiKSAgJT4lIG11dGF0ZShUb3RhbFQgPSAoVG90YWwvMTE0LjM4KSoxMDApDQoNClRSSU0yIDwtIGdncGxvdChJTkUyMEgyLCBhZXMoIiIsIFRvdGFsVCwgZmlsbCA9IEVkYWQpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvcj0id2hpdGUiKSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArICB0aGVtZV92b2lkKCkgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNlYWdyZWVuMiIsIm9yY2hpZDEiLCJvbGl2ZWRyYWIxIiwiYXF1YW1hcmluZSIpKSArIGdlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChUb3RhbFQvMTAwKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KDQpJTkUyME0xIDwtIElORSAlPiUgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKSAlPiUgZmlsdGVyKFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaXRhdFZhbGVuY2lhbmEiKSAlPiUgZmlsdGVyKFRyaW1lc3RyZSA9PSAiMSIpICU+JSBmaWx0ZXIoRWRhZCAhPSAiVG90YWwiKSAlPiUgZmlsdGVyKEVkYWQgIT0gIk1lbm9yZXMgZGUgMjUgYcOxb3MiKSAlPiUgZmlsdGVyKEVkYWQgIT0gIjI1IHkgbcOhcyBhw7FvcyIpICAlPiUgbXV0YXRlKFRvdGFsVCA9IChUb3RhbC84My4zNCkqMTAwKQ0KDQpUUklNMSA8LSBnZ3Bsb3QoSU5FMjBNMSwgYWVzKCIiLCBUb3RhbFQsIGZpbGwgPSBFZGFkKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKyBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKyAgdGhlbWVfdm9pZCgpICsgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzZWFncmVlbjIiLCJvcmNoaWQxIiwib2xpdmVkcmFiMSIsImFxdWFtYXJpbmUiKSkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXBlcmNlbnQoVG90YWxULzEwMCkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIA0KDQpJTkUyME0zIDwtIElORSAlPiUgZmlsdGVyKEHDsW8gPT0gIjIwMjAiKSAlPiUgZmlsdGVyKFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgZmlsdGVyKENDQUEgPT0gIkNvbXVuaXRhdFZhbGVuY2lhbmEiKSAlPiUgZmlsdGVyKFRyaW1lc3RyZSA9PSAiMyIpICU+JSBmaWx0ZXIoRWRhZCAhPSAiVG90YWwiKSAlPiUgZmlsdGVyKEVkYWQgIT0gIk1lbm9yZXMgZGUgMjUgYcOxb3MiKSAlPiUgZmlsdGVyKEVkYWQgIT0gIjI1IHkgbcOhcyBhw7FvcyIpICAlPiUgbXV0YXRlKFRvdGFsVCA9IChUb3RhbC8xMDMuNDEpKjEwMCkNCg0KVFJJTTMgPC0gZ2dwbG90KElORTIwTTMsIGFlcygiIiwgVG90YWxULCBmaWxsID0gRWRhZCkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yPSJ3aGl0ZSIpICsgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgIHRoZW1lX3ZvaWQoKSArICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Yygic2VhZ3JlZW4yIiwib3JjaGlkMSIsIm9saXZlZHJhYjEiLCJhcXVhbWFyaW5lIikpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wZXJjZW50KFRvdGFsVC8xMDApKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIuNSkNCmBgYA0KDQo8YnI+DQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI3NSUifQ0KUEFUQ0ggPC0gKHRyaW0xICsgdHJpbTIgKyB0cmltMykgLyAoVFJJTTEgKyBUUklNMiArIFRSSU0zKQ0KUEFUQ0ggKyBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiRElTVElSQlVDScOTTiBERUwgREVTRU1QTEVPIEVOIExBIENPTS5WQUxFTkNJQU5BIChBw7FvIDIwMjApIiwgc3VidGl0bGU9ICJQcmltZXJhIGZpbGEgY29ycmVzcG9uZGUgYWwgcGFybyBmZW1lbmlubywgc2VndW5kYSBhbCBtYXNjdWxpbm8iKSANCmBgYA0KDQpNZWRpYW50ZSBlc3RlIGdyw6FmaWNvLCBwb2RlbW9zIGNvbXByb3ZhciBsbyBxdWUgc2UgaGEgbW9zdHJhZG8gcHJldmlhbWVudGUsIGVsIGdydXBvIGRlIGVkYWQgcXVlIGhhIHByZXNlbnRhZG8gdW5hIG1heW9yIHRhc2EgZGUgcGFybyBoYSBzaWRvIGVsIGRlIG1lbm9yIGVkYWQsIGVzIGRlaWNyLCBhcXVlbCBxdWUgdmEgZGUgMTYtMTkgYcOxb3MuIFNlZ3VpZG8gZGVsIGRlIDIwLTI0IGHDsW9zLiANCkFzw60gbWlzbW8sIG9ic2VydmFtb3MgcXVlIGVsICUgZGUgZGVzZW1wbGVvbyBmZW1pbm8sIHBvciBsbyBnZW5lcmFsLCBoYSBzaWRvIHN1cGVyaW9yIGFsIGRlIGxvcyBob21icmVzIGVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCB0b2RvIHkgcXVlIG5vIGhhbiBoYWJpZG8gZ3JhbmRlcyBkaWZlcmVuY2lhcy4gDQoNCkNhYmUgcmVzYWx0YXIgYWRlbcOhcyBxdWUgZW4gZWwgc2VndW5kbyB0cmltZXN0cmUgbGFzIHRhc2FzIGRlIHBhcm8gZnVlcm9uIG1heW9yIHF1ZSBlbiBlbCBwcmltZXIgdHJpbWVzdHJlLiBBc8OtIGNvbW8gcXVlIGRlbCBzZWd1bmRvIGFsIHRlcmNlciB0cmltZXN0cmUsIGVsIGRlc2VtcGxlbyBwYXJhIGVsIGdydXBvIGRlIGVkYWQgZGUgMTYgYSAxOSBhw7FvcyBkaXNtaW51ecOzLCBtaWVudHJhcyBxdWUgZWwgZGUgMjAgYSAyNCBhw7FvcywgdGFtYmnDqW4gZGVudHJvIGRlIGxhIGVkYWQgY29uc2lkZXJhZGEgY29tbyBwYXJvIGp1dmVuaWwsIGF1bWVudMOzLg0KDQo8YnI+DQoNCjxjZW50ZXI+PEZPTlQgQ09MT1I9ImRlZXBwaW5rIj4qKsK/UXXDqSBnZW5lcm8gcHJlc2VudGEgdW5hIHRhc2EgZGUgcGFybyBtYXlvciBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYT8qKjwvRk9OVD48L2NlbnRlcj4NCg0KDQpgYGB7ciBvdXQud2lkdGg9Ijg1JSJ9DQpJTkVWTEMgPC0gSU5FICU+JSBmaWx0ZXIobl9DQ0FBID09ICIxMCIpICU+JSANCiAgZmlsdGVyKFNleG8gIT0gIkFtYm9zIHNleG9zIikgJT4lIA0KICBmaWx0ZXIoRWRhZCA9PSAiVG90YWwiKSAlPiUgDQogIHVuaXRlKFBlcmlvZG8sIEHDsW86VHJpbWVzdHJlLCBzZXAgPSAiLiIpDQoNCklORVZMQyRQZXJpb2RvIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORVZMQyRQZXJpb2RvKSkNCklORVZMQyA8LSB0cmFuc2Zvcm0oSU5FVkxDLCBQZXJpb2RvID0gYXMubnVtZXJpYyhQZXJpb2RvKSkNCg0KYSA8LSBnZ3Bsb3QoSU5FVkxDLCBhZXMoUGVyaW9kbywgVG90YWwsIGdyb3VwID0gU2V4bywgY29sb3I9U2V4bykpICsgDQogIGdlb21fbGluZShzaXplICA9IDAuOSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Yygic2VhZ3JlZW4zIiwicHVycGxlIikpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAyMDE1KSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMSkNCg0KYSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCANCiAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyB0cmFuc2l0aW9uX3JldmVhbChQZXJpb2RvKSArICANCmxhYnModGl0bGUgPSAiRVZPTFVDScOTTiBQQVJPIENPTS4gVkFMRU5DSUFOQS4gUGVyaW9kbzoge2FzLmludGVnZXIoZnJhbWVfYWxvbmcpfSIsDQpjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEgY29uIGxvcyBkYXRvcyBkZWwgSU5FLiANCiAgQ2FkYSBwdW50byByZXByZXNlbnRhIHVuIHRyaW1lc3RyZSBkZSAyMDE1LTIwMjAiLCANCiAgeT0iVG90YWwgcGFybyAoJSkiKQ0KDQpgYGAgDQoNCkVsIGFudGVyaW9yIGdyw6FmaWNvIG11ZXN0cmEgY29tbyBoYSBldm9sdWNpb25hZG8gbGEgdGFzYSBkZSBwYXJvIGRlc2RlIDIwMTUgaGFzdGEgMjAyMCBwYXJhIGxvcyBkaWZlcmVudGVzIHRyaW1lc3RyZXMgZGVsIGHDsW8sIGRpZmVyZW5jaWFuZG8gcG9yIGfDqW5lcm8uIA0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIgbGEgdGVuZGVuY2lhIGVuIGFtYm9zIGfDqW5lcm9zIHZhIGEgbGEgcGFyLCBlbiB1bm9zIG5pdmVsZXMgbm8gaW5mZXJpb3JlcyBhbCAxMSUsIHF1ZSBoYW4gaWRvIGRpc21pbnV5ZW5kbyBhIHBhcnRpciBkZSAyMDE1IHkgaGFuIHZ1ZWx0byBhIGF1bWVudGFyIGNvbiBsYSBhY3R1YWwgcGFuZGVtw61hLiBEZWwgbWlzbW8gbW9kbywgc2UgbXVlc3RyYSwgY29tbyBzZSBoYSBjb21lbnRhZG8gYW50ZXJpb3JtZW50ZSwgcXVlIGxhcyBtdWplcmVzIHN1ZnJlbiB1bmEgdGFzYSBkZSBkZXNlbXBsZW8gbWF5b3IuDQoNClJlc3BlY3RvIGEgZXN0bywgY2FiZSBjb21lbnRhciBxdWUgZW4gYWxndW5vcyBpbmZvcm1lcywgY29tbyBwb3IgZWplbXBsbyBlbCBkZSAiQnJlY2hhcyBkZSBnw6luZXJvIGVuIGVsIG1lcmNhZG8gbGFib3JhbCBlc3Bhw7FvbCIgc2UgZXhwbGljYSBxdWUgbGFzIG11amVyZXMgcG9yIGxvIGdlbmVyYWwgc3VlbGVuIGVzdGFyIG3DoXMgZm9ybWFkYXMgYSBsYSBob3JhIGRlIGVuZnJlbnRhcnNlIGFsIG11bmRvIGxhYm9yYWwsIHNpbiBlbWJhcmdvLCBzb24gbGFzIHF1ZSBnZW5lcmFsbWVudGUgc3VmcmVuIHVuYSB0YXNhIGRlIGRlc2VtcGxlbyBtYXlvciwgcXVlIHJvbmRhIGxvcyA2IHB1bnRvcyBkZSBkaWZlcmVuY2lhLiANCg0KQWRlbcOhcyBkZSBlbGxvLCBzaSBub3MgY2VudHJhcmFtb3MgZW4gbGEgb2N1cGFjacOzbiwgaGFicsOtYSBxdWUgc2XDsWFsYXIgcXVlIGNvYnJhbiB1bm9zIHNhbGFyaW9zIGVuIHRvcm5vIGFsIDIwJSBtZW5vciB5IHF1ZSBsb3MgZW1wbGVvcyBlbiBsb3MgcXVlIGVzdMOhbiBvY3VwYWRhcyBlcyBlbiBsYSBtYXlvcsOtYSBkZSBsb3MgY2Fzb3MgY29uIGNvbnRyYXRvcyB0ZW1wb3JhbGVzIHkgYSB0aWVtcG8gcGFyY2lhbCwgcGVzZSBhIG5vIHNlciBsbyBxdWUgZW4gdW4gYnVzY2FiYW4uDQoNCg0KIyMjIDxGT05UIENPTE9SPSJ2aW9sZXRyZWQiPioqRXZvbHVjacOzbiBzZWfDum4gZ3J1cG9zIGVkYWQqKjwvRk9OVD4NCg0KPGJyPg0KVGFtYmnDqW4gcG9kZW1vcyBhbmFsaXphciBsYSBldm9sdWNpw7NuIGRlbCBwYXJvIHBvciBsb3MgZ3J1cG9zIGRlIGVkYWQgeSBzaW4gZGlmZXJlbmNpYXIgZWwgc2V4by4gRW4gZXN0ZSBncsOhZmljbyBzZSBhcHJlY2lhIGxvIHF1ZSBzZSBoYSBjb21lbnRhZG8gcHJldmlhbWVudGUsIHF1ZSBlbCBkZXNlbXBsZW8gaGEgYXVtZW50YWRvLCBlbiBlbCB0ZXJjZXIgdHJpbWVzdHJlIGVyYSBtYXlvciBxdWUgZW4gZWwgcHJpbWVyby4gQXPDrSBjb21vIHF1ZSBsb3MgZ3J1cG9zIGNvbiBtZW5vcyBlZGFkIHNvbiBsb3MgcXVlIHNlIGhhbiB2aXN0byBtw6FzIGFmZWN0YWRvcyBlbiBlc3RlIGFzcGVjdG8gcG9yIGxhIGNyaXNpcyBzYW5pdGFyaWEgYWN0dWFsLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQpJTkVDVkxDIDwtIElORWIgJT4lIGZpbHRlcihuX0NDQUEgPT0gIjEwIiAmIFNleG8gPT0gIkFtYm9zIHNleG9zIikgJT4lIHNlbGVjdCgtbl9DQ0FBKSAlPiUgZmlsdGVyKFBlcmlvZG8gJWluJSBjKCIyMDIwVDEiLCAiMjAyMFQyIiwgIjIwMjBUMyIpKQ0KSU5FQ1ZMQyA8LSBJTkVDVkxDICU+JSBmaWx0ZXIoRWRhZCAlaW4lIGMoIkRlIDE2IGEgMTkgYcOxb3MiLCAiRGUgMjAgYSAyNCBhw7FvcyIsICJEZSAyNSBhIDU0IGHDsW9zIiwgIkRlIDU1IHkgbcOhcyBhw7FvcyIpKQ0KSU5FQ1ZMQyRDQ0FBIDwtIHJlY29kZShJTkVDVkxDJENDQUEsIA0KICJDb211bml0YXRfVmFsZW5jaWFuYSI9IkNvbXVuaXRhdCBWYWxlbmNpYW5hIikNCklORUNWTEMkRWRhZCA8LSByZWNvZGUoSU5FQ1ZMQyRFZGFkLCANCiAiRGUgNTUgeSBtw6FzIGHDsW9zIj0iNTUtNjUgYcOxb3MiLA0KICAiRGUgMTYgYSAxOSBhw7FvcyI9IjE2LTE5IGHDsW9zIiwNCiAgIkRlIDIwIGEgMjQgYcOxb3MiPSIyMC0yNCBhw7FvcyIsDQogICJEZSAyNSBhIDU0IGHDsW9zIj0iMjUtNTQgYcOxb3MiKQ0KSU5FQ1ZMQyA8LSBJTkVDVkxDICU+JSBhcnJhbmdlKEVkYWQsIFBlcmlvZG8pDQojc3RyKElORUNWTEMpDQpJTkVDVkxDJFRvdGFsIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKElORUNWTEMkVG90YWwpKQ0KYGBgDQoNCmBgYHtyIG91dC53aWR0aD0iODUlIn0NCkdQT0lOVCA8LSBnZ3Bsb3QoSU5FQ1ZMQywgYWVzKHg9UGVyaW9kbywgeT1FZGFkLCBzaXplID0gVG90YWwsIGNvbG9yID0gRWRhZCkpICsNCiAgICBnZW9tX3BvaW50KGFlcyhmaWxsPUVkYWQsIGFscGhhID0gMC4yKSxwY2g9MjEsY29sb3VyPSJibGFjayIpICsNCiAgICBzY2FsZV9zaXplKHJhbmdlID0gYyg5LCAzMiksIG5hbWU9IlRvdGFsICglKSIpICArIHRoZW1lX2lwc3VtX3JjKCkgKyANCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZCAgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgbGFicyh4PU5VTEwsIHk9TlVMTCwgdGl0bGU9ICJFVk9MVUNJw5NOIERFTCBQQVJPIFRPVEFMICglKSIsIHN1YnRpdGxlID0gIkVuIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hIiwgY2FwdGlvbiA9ICJEYXRvczogSU5FIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFRvdGFsKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzZWFncmVlbjIiLCJvbGl2ZWRyYWIxIiwiYXF1YW1hcmluZSIsIm9yY2hpZDEiKSkgDQoNCkdQT0lOVCArIHRoZW1lIChheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBjb2xvdXI9Im1lZGl1bW9yY2hpZDQiLCBzaXplPXJlbCgxLjUpKSwNCiAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwNCiAgICAgICAgICAgICBjb2xvdXI9Im1lZGl1bW9yY2hpZDQiLCBzaXplPXJlbCgxKSwgaGp1c3Q9MC41KSkgKyANCiAgdHJhbnNpdGlvbl9zdGF0ZXMoRWRhZCkgDQpgYGANCg0KDQoNCiMjIDguIEVMIERFU0VNUExFTyBFTiBFVVJPUEEgey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKlRhc2EgZGUgZGVzZW1wbGVvIGVuIEV1cm9wYSoqPC9GT05UPg0KDQpNZWRpYW50ZSBlbCBzaWd1aWVudGUgZ3LDoWZpY28gZXZvbHV0aXZvLCBzZSBtdWVzdHJhIGNvbW8gaGEgaWRvIHZhcmlhbmRvIGxhIHRhc2EgZGUgcGFybyBkZXNkZSAyMDA4IGhhc3RhIDIwMTkgZW4gbGEgVW5pw7NuIEV1cm9wZWEuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCiNQcmVwYXJhbmRvIGxvcyBkYXRvcw0KcGFyb2FnIDwtIHBhcm9hICU+JSBmaWx0ZXIoZWRhZCA9PSAiWTE1LTc0IikgJT4lIGZpbHRlcighKGdlbyAlaW4lIGMoIkV1cm8gYXJlYSAtIDE5IGNvdW50cmllcyAgKGZyb20gMjAxNSkiLCAiRXVyb3BlYW4gVW5pb24gLSAyNyBjb3VudHJpZXMgKGZyb20gMjAyMCkiLCAiRXVyb3BlYW4gVW5pb24gLSAyOCBjb3VudHJpZXMgKDIwMTMtMjAyMCkiKSkpDQpwYXJvYWckZ2VvIDwtIHJlY29kZShwYXJvYWckZ2VvLCANCiAiR2VybWFueSAodW50aWwgMTk5MCBmb3JtZXIgdGVycml0b3J5IG9mIHRoZSBGUkcpIj0iR2VybWFueSIpDQpwYXJvYWcgPC0gcGFyb2FnICU+JSBzZWxlY3QoLWVkYWQpDQpwYXJvYWcgPC0gcGFyb2FnICU+JSByZW5hbWUoImlkIiA9IGdlbykgJT4lIHJlbmFtZSgiZGF0ZSIgPSBBw7FvKSAlPiUgcmVuYW1lKCJ2YWx1ZSIgPSB2YWxvcikNCg0KcGFyb2FnIDwtIHBhcm9hZyAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lDQogIGFycmFuZ2UoZGF0ZSwgZGVzYyh2YWx1ZSkpICU+JQ0KICBtdXRhdGUocmFua2luZyA9IHJvd19udW1iZXIoKSklPiUgZmlsdGVyKHJhbmtpbmcgPD0gMTApDQoNCnBhcm9hZyRpZCA8LSBnc3ViKCJOb3J0aCBNYWNlZG9uaWEiLCAiTWFjZWRvbmlhIiwgcGFyb2FnJGlkKQ0KbmIuY29scyA8LSAyMA0KbXljb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKDExLCAiU2V0MyIpKShuYi5jb2xzKQ0KYGBgDQoNCmBgYHtyfQ0KYSA8LSBnZ3Bsb3QocGFyb2FnKSsNCiAgZ2VvbV9jb2woYWVzKHJhbmtpbmcsdmFsdWUsZmlsbD1pZCkpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bXljb2xvcnMpKw0KICBnZW9tX3RleHQoYWVzKHJhbmtpbmcsdmFsdWUsbGFiZWw9YXMuZmFjdG9yKHZhbHVlKSksaGp1c3Q9LTAuMixzaXplPTUpKw0KICBnZW9tX3RleHQoYWVzKHJhbmtpbmcsIHk9MCAsIGxhYmVsID0gaWQpLCBoanVzdD0xLjEsc2l6ZT01KSArDQogIGdlb21fdGV4dChhZXMoeD0xMCwgeT1tYXgodmFsdWUpICwgbGFiZWwgPSBhcy5mYWN0b3IoZGF0ZSkpLA0KICAgIHZqdXN0ID0gMCwgaGp1c3Q9MC41LCBhbHBoYSA9IDAuMSwgIGNvbCA9ICJibGFjayIsIHNpemUgPSAyMCkrDQogIGxhYnModGl0bGUgPSAiMTAgUEHDjVNFUyBDT04gTUFZT1IgREVTRU1QTEVPIEVOIExBIFVOScOTTiBFVVJPUEVBICglKSIsDQogICAgICAgc3VidGl0bGUgPSAiRGUgMjAwOC0yMDE5IiwNCiAgICAgICB4PU5VTEwsDQogICAgICAgeT1OVUxMKSsNCiAgY29vcmRfZmxpcChjbGlwID0gIm9mZiIpKw0KICBzY2FsZV94X3JldmVyc2UoKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplPTIwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemU9MTIsIGZhY2U9Iml0YWxpYyIpLA0KICAgICAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxLCA0LCAxLCAzLCAiY20iKSkrDQogIHRyYW5zaXRpb25fc3RhdGVzKGRhdGUsdHJhbnNpdGlvbl9sZW5ndGggPSAxLHN0YXRlX2xlbmd0aCA9IDAsd3JhcCA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSJ9DQphbmltYXRlKGEsDQogICAgICAgIG5mcmFtZXMgPSA0MDAsDQogICAgICAgIGZwcyA9IDE2LA0KICAgICAgICBlbmRfcGF1c2UgPSAxNTAsDQogICAgICAgIHdpZHRoID0gMTAwMCwNCiAgICAgICAgaGVpZ2h0ID0gNjAwLA0KICAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQoNCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIsIGxvcyBwYcOtc2VzIHF1ZSBzZSBoYW4gbWFudGVuaWRvIGVuIGxvcyBwcmltZXJvcyBwdWVzdG9zLCBoYW4gc2lkbyBHcmVpY2EsIEVzcGHDsWEsIE1vbnRlbmVncm8geSBNYWNlZG9uaWEuDQoNCkNvbW8gcG9kZW1vcyBvYnNlcnZhciwgRXNwYcOxYSBoYSBwYXNhZG8gZGUgZXN0YXIgZW4gZWwgc2VndW5kbyBsdWdhciBhbCBpbmNpbyBkZSBsYSBjcmlzaXMgZWNvbsOzbWljYSBkZSAyMDA4IGFsIDR0byBsdWdhciBlbiAyMDE5LiBNaWVudHJhcyBxdWUgZWwgYXVtZW50byBlbiBHcmVjaWEgaGEgc2lkbyBtw6FzIHByb251bmNpYWRvLiANCg0KPGJyPg0KPGJyPg0KDQo8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKkRFU0VNUExFTyBQQVJBIDYgUEHDjVNFUyBFVVJPUEVPUzoqKjwvRk9OVD4NCg0KDQpFbiBsb3Mgc2lndWllbnRlcyBncsOhZmljb3Mgc2UgbW9zdHJhcsOhIGVsIGRlc2VtcGxlbyBkZSBFc3Bhw7FhIHkgZGUgb3Ryb3MgcGHDrXNlcyBkZSBsYSBVbmnDs24gRXVyb3BlYTogRnJhbmNpYSwgSXRhbGlhLCBQb3J0dWdhbCwgR3JlY2lhIHkgRmlubGFuZGlhLiANCg0KYGBge3IsIG91dC53aWR0aD0iODUlIn0NCnBhcm9GIDwtIHBhcm8gJT4lIGZpbHRlcihlZGFkID09ICJZMjAtNjQiKSAlPiUgZmlsdGVyKGdlbyAlaW4lIGMoIlNwYWluIiwgIkl0YWx5IiwgIkZyYW5jZSIsICJQb3J0dWdhbCIsICJGaW5sYW5kIiwgIkdyZWVjZSIpKSAlPiUgbXV0YXRlKFBhw61zID0gY2FzZV93aGVuKGdlbyA9PSAiRmlubGFuZCIgfiAiRmlubGFuZGlhIiwgDQpnZW8gPT0gIkZyYW5jZSIgfiAiRnJhbmNpYSIsIA0KZ2VvID09ICJHcmVlY2UiIH4gIkdyZWNpYSIsDQpnZW8gPT0gIlBvcnR1Z2FsIiB+ICJQb3J0dWdhbCIsDQpnZW8gPT0gIlNwYWluIiB+ICJFc3Bhw7FhIiwNCmdlbyA9PSAiSXRhbHkiIH4gIkl0YWxpYSIpKSANCnBhcm9GIDwtIHBhcm9GICU+JSBzZWxlY3QoLWdlbykgJT4lIHNlbGVjdChGZWNoYSwgUGHDrXMsIHZhbG9yKQ0KDQpnZ3Bsb3QocGFyb0YsIGFlcyhGZWNoYSwgdmFsb3IpKSArIGdlb21fbGluZShzaXplID0gMS4yLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9hcmVhKGZpbGwgPSAib3JjaGlkNCIsIHNpemUgPSAwLjYpICsgDQogIGZhY2V0X3dyYXAoflBhw61zKSArIA0KICB0aGVtZV9zdGF0YShiYXNlX3NpemUgPSAxMiwgYmFzZV9mYW1pbHkgPSAiQXJpYWwiLCBzY2hlbWUgPSAiczFjb2xvciIpICsNCiAgbGFicyh5ID0gIlZhbG9yICglKSIsIHggPSAiQcOxbyIsIA0KICAgIHRpdGxlID0gIlRBU0EgREUgREVTRU1QTEVPICglKSIsIA0KICAgIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYS4gRGF0b3M6IEV1cm9zdGF0IikNCg0KYGBgDQoNCkEgdHJhdsOpcyBkZWwgZ3LDoWZpY28sIG9ic2VydmFtb3MgY29tbyBwYXJhIGVzdG9zIDYgcGHDrXNlcywgR3JlY2lhIGVzIGxhIHF1ZSBtYXlvciB0YXNhIGRlIGRlc2VtcGxlbyBwcmVzZW50YSBzZWd1aWRhIGRlIEVzcGHDsWEsIHRlbmllbmRvIHN1IHBpY28gZW4gMjAxNCwgYW1iYXMsIGVuIHBsZW5hIGNyaXNpcyBlY29uw7NtaWNhLiANClBvciBjb250cmEsIEZpbmxhbmRpYSwgbXVlc3RyYSB1bmEgdGFzYSBkZSBwYXJvIGNvbiB1bm9zIG5pdmVsZXMgbm8gc3VwZXJpb3JlcyBhbCAxMCUsIHNlbWVqYW50ZSBhbCBkZSBGcmFuY2lhLiBQb3J0dWdhbCwgZW4gY2FtYmlvLCBtdWVzdHJhIHVuIGF1bWVudG8gYWwgaW5pY2lvIGRlIGxhIGNyaXNpcyBlY29uw7NtaWNhIHkgc3UgcGljbyBlbiAyMDE0IGFsIGlndWFsIHF1ZSBFc3Bhw7FhIHkgR3JlY2lhLCB0b2RvIHkgcXVlIGNvbiB1bmEgdGFzYSBkZSBkZXNlbXBsZW8gbWVub3IgcXVlICBlc3RvcyBvdHJvcy4gDQoNCk5vIG9ic3RhbnRlLCBoYXkgcXVlICB0ZW5lciBlbiBjdWVudGEgcXVlIGVsIG1lcmNhZG8gZGUgdHJhYmFqbyBkZSBjYWRhIHVubyBkZSBlc3RvcyBwYcOtc2VzIHByZXNlbnRhIHVuYXMgcGVjdWxpYXJpZGFkZXMgZGlmZXJlbnRlcyBzb2JyZSB0b2RvIGVuIGVsIGNhc28gZGUgRmlubGFuZGlhLCBxdWUgaGFicsOtYSBxdWUgY29uc2lkZXJhciBhIGxhIGhvcmEgZGUgaGFjZXIgdW4gYW7DoWxpc2lzIGNvbiBtw6FzIHByb2Z1bmRpZGFkLiANCg0KUG9yIGVqZW1wbG8sIGNvbW8gY3VyaW9zaWRhZCwgZW4gKipGaW5sYW5kaWEqKiwgZXhpc3RlbiB0cmVzIG1vZGFsaWRhZGVzIGRlIHByZXN0YWNpw7NuIHBvciBkZXNlbXBsZW86DQoNCi0gKipQUkVTVEFDScOTTiBQT1IgREVTRU1QTEVPIELDgVNJQ0EqKiAtIExhIHF1ZSBzZSBwZXJjaWJlIGRlIGxhIFNlZ3VyaWRhZCBTb2NpYWwgZmluZXNhLCBLZWxlYSAoVW5hIGNhbnRpZGFkIGZpamEgZW4gdG9ybm8gYSA3MDAgZXVyb3MgYWwgbWVzIG8gc3VwZXJpb3Igc2kgc2UgdGllbmVuIGhpam9zIGEgY2FyZ28pDQoNCi0gKipDQUpBIERFIFNFR1VSTyoqLCBlcyBkZWNpciwgbGEgbWF5b3LDrWEgZGUgZmluYWxuZGVzZXMgc2Ugc3VzY3JpYmVuIGEgdW4gKipzZWd1cm8gcG9yIGRlc2VtcGxlbyoqLCBlc3RvIHNlIGRlbm9taW5hbiAiQ2FqYXMgZGUgU2VndXJvIHBvciBEZXNlbXBsZW8iLg0KDQotICoqU1VCU0lESU8gREUgTUVSQ0FETyBMQUJPUkFMKiogRXN0YSBlcyBwYXJhIGxvcyBxdWUgbm8gaGFuIGNvbnRyYXRhZG8gdW4gc2VndXJvIHBvciBkZXNlbXBsZW8gbmkgaGFuIGN1bXBsaWRvIGNvbiBsb3MgcmVxdWlzaXRvcyBlc3RhYmxlY2lkb3MgcGFyYSBjb2JyYXIgbGEgcHJlc3RhY2nDs24gYsOhc2ljYS4gKEVzdGEgZXMgb3RvcmdhZGEgdGFtYmnDqW4gcG9yIEtlbGEgeSBzZSByZWNpYmUgdW5hIGNhbnRpZGFkIGVuIHRvcm5vIGEgNzAwIGV1cm9zKQ0KDQpBZGVtw6FzLCBoYXkgcXVlIHRlbmVyIGVuIGN1ZW50YSBxdWUgZWwgbWVyY2FkbyBkZSB0cmFiYWpvIHF1ZSBoYXkgZW4gZWwgcGHDrXMgZXNjYW5kaW5hdm8gZXMgbXVjaG8gbcOhcyBmbGV4aWJsZSBxdWUsIHBvciBlamVtcGxvLCBlbCBkZSBFc3Bhw7FhLCBkb25kZSBoYXkgdW5hIHJpZ2lkZXphIGEgbGEgYmFqYSBlbiBsb3Mgc2FsYXJpb3MsIGxvIHF1ZSBoYWNlIHF1ZSBsYSB0YXNhIGRlIGRlc2VtcGxlbyBzZWEgbWF5b3IgcXVlIHNpIG5vIGh1YmllcmFuIHRhbnRhIHJpZ2lkZXouIA0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0idmlvbGV0cmVkIj4qKlRhYmxhKio8L0ZPTlQ+DQoNCmBgYHtyfQ0KcGFyb1RhYmxhIDwtIHBhcm9hZyAlPiUgcmVuYW1lKCJQYcOtcyIgPSBpZCkgJT4lIHJlbmFtZSgiQcOxbyIgPSBkYXRlKSAlPiUgcmVuYW1lKCJWYWxvciIgPSB2YWx1ZSkgJT4lIHNlbGVjdChQYcOtcywgQcOxbywgVmFsb3IpDQoNCmRhdGF0YWJsZShwYXJvVGFibGEsIA0KICBjYXB0aW9uID0gIlRhYmxhIHBhcmEgY29uc3VsdGFyIGxvcyBkYXRvcyBkZWwgZ3LDoWZpY28gYW50ZXJpb3IiLA0KICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCANCiAgb3B0aW9ucyA9IGxpc3QoZG9tID0gJ0JsZnJ0aXAnLCAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JyksIA0KICAgIHBhZ2VMZW5ndGggPSAxMCwgDQogICAgYXV0b1dpZHRoID0gVFJVRSkpDQpgYGANCg0KQSB0cmF2w6lzIGRlbCBncsOhZmljbywgb2JzZXJ2YW1vcyBjb21vIHBhcmEgZXN0b3MgNiBwYcOtc2VzLCBHcmVjaWEgZXMgbGEgcXVlIG1heW9yIHRhc2EgZGUgZGVzZW1wbGVvIHByZXNlbnRhIHNlZ3VpZGEgZGUgRXNwYcOxYSwgdGVuaWVuZG8gc3UgcGljbyBlbiAyMDE0LCBhbWJhcywgZW4gcGxlbmEgY3Jpc2lzIGVjb27Ds21pY2EuIA0KUG9yIGNvbnRyYSwgRmlubGFuZGlhLCBtdWVzdHJhIHVuYSB0YXNhIGRlIHBhcm8gY29uIHVub3Mgbml2ZWxlcyBubyBzdXBlcmlvcmVzIGFsIDEwJSwgc2VtZWphbnRlIGFsIGRlIEZyYW5jaWEuIFBvcnR1Z2FsLCBlbiBjYW1iaW8sIG11ZXN0cmEgdW4gYXVtZW50byBhbCBpbmljaW8gZGUgbGEgY3Jpc2lzIGVjb27Ds21pY2EgeSBzdSBwaWNvIGVuIDIwMTQgYWwgaWd1YWwgcXVlIEVzcGHDsWEgeSBHcmVjaWEsIHRvZG8geSBxdWUgY29uIHVuYSB0YXNhIGRlIGRlc2VtcGxlbyBtZW5vciBxdWUgIGVzdG9zIG90cm9zLiANCg0KTm8gb2JzdGFudGUsIGhheSBxdWUgIHRlbmVyIGVuIGN1ZW50YSBxdWUgZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGRlIGNhZGEgdW5vIGRlIGVzdG9zIHBhw61zZXMgcHJlc2VudGEgdW5hcyBwZWN1bGlhcmlkYWRlcyBkaWZlcmVudGVzIHNvYnJlIHRvZG8gZW4gZWwgY2FzbyBkZSBGaW5sYW5kaWEsIHF1ZSBoYWJyw61hIHF1ZSBjb25zaWRlcmFyIGEgbGEgaG9yYSBkZSBoYWNlciB1biBhbsOhbGlzaXMgY29uIG3DoXMgcHJvZnVuZGlkYWQuIA0KDQpQb3IgZWplbXBsbywgY29tbyBjdXJpb3NpZGFkLCBlbiAqKkZpbmxhbmRpYSoqLCBleGlzdGVuIHRyZXMgbW9kYWxpZGFkZXMgZGUgcHJlc3RhY2nDs24gcG9yIGRlc2VtcGxlbzoNCg0KLSAqKlBSRVNUQUNJw5NOIFBPUiBERVNFTVBMRU8gQsOBU0lDQSoqIC0gTGEgcXVlIHNlIHBlcmNpYmUgZGUgbGEgU2VndXJpZGFkIFNvY2lhbCBmaW5lc2EsIEtlbGVhIChVbmEgY2FudGlkYWQgZmlqYSBlbiB0b3JubyBhIDcwMCBldXJvcyBhbCBtZXMgbyBzdXBlcmlvciBzaSBzZSB0aWVuZW4gaGlqb3MgYSBjYXJnbykNCg0KLSAqKkNBSkEgREUgU0VHVVJPKiosIGVzIGRlY2lyLCBsYSBtYXlvcsOtYSBkZSBmaW5hbG5kZXNlcyBzZSBzdXNjcmliZW4gYSB1biAqKnNlZ3VybyBwb3IgZGVzZW1wbGVvKiosIGVzdG8gc2UgZGVub21pbmFuICJDYWphcyBkZSBTZWd1cm8gcG9yIERlc2VtcGxlbyIuDQoNCi0gKipTVUJTSURJTyBERSBNRVJDQURPIExBQk9SQUwqKiBFc3RhIGVzIHBhcmEgbG9zIHF1ZSBubyBoYW4gY29udHJhdGFkbyB1biBzZWd1cm8gcG9yIGRlc2VtcGxlbyBuaSBoYW4gY3VtcGxpZG8gY29uIGxvcyByZXF1aXNpdG9zIGVzdGFibGVjaWRvcyBwYXJhIGNvYnJhciBsYSBwcmVzdGFjacOzbiBiw6FzaWNhLiAoRXN0YSBlcyBvdG9yZ2FkYSB0YW1iacOpbiBwb3IgS2VsYSB5IHNlIHJlY2liZSB1bmEgY2FudGlkYWQgZW4gdG9ybm8gYSA3MDAgZXVyb3MpDQoNCkFkZW3DoXMsIGhheSBxdWUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBlbCBtZXJjYWRvIGRlIHRyYWJham8gcXVlIGhheSBlbiBlbCBwYcOtcyBlc2NhbmRpbmF2byBlcyBtdWNobyBtw6FzIGZsZXhpYmxlIHF1ZSwgcG9yIGVqZW1wbG8sIGVsIGRlIEVzcGHDsWEsIGRvbmRlIGhheSB1bmEgcmlnaWRlemEgYSBsYSBiYWphIGVuIGxvcyBzYWxhcmlvcywgbG8gcXVlIGhhY2UgcXVlIGxhIHRhc2EgZGUgZGVzZW1wbGVvIHNlYSBtYXlvciBxdWUgc2kgbm8gaHViaWVyYW4gdGFudGEgcmlnaWRlei4gDQoNCg0KIyMgRVZPTFVDScOTTiBUQVNBIERFIFBBUk8gSlVWRU5JTCANCg0KRWwgcGFybyBqdXZlbmlsIGluY2x1eWUgZWwgcGFybyBkZSBsYXMgcGVyc29uYXMgasOzdmVuZXMsIGRlZmluaWRhcyBwb3IgbGFzIE5hY2lvbmVzIFVuaWRhcywgY29tbyBhcXVlbGxhcyBwZXJzb25hcyBxdWUgdGllbmVuIHVuYSBlZGFkIGNvbXByZW5kaWRhIGVudHJlIDE1IHkgMjQgYcOxb3MuDQoNCioqRXZvbHVjacOzbiBkZWwgZGVzZW1wbGVvIGp1dmVuaWwqKg0KUGFyYSBsb3MgNiBwYcOtc2VzIGVzY29naWRvcyB0YW1iacOpbiwgZW4gZWwgZ3LDoWZpY28gYW50ZXJpb3IsIGVzdG9zIHNvbjogRmlubGFuZGlhLCBGcmFuY2lhLCBHcmVjaWEsIEl0YWxpYSwgUG9ydHVnYWwgeSBFc3Bhw7FhLiANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KcGFyb0ogPC0gcGFybyAlPiUgZmlsdGVyKGdlbyAlaW4lIGMoIlNwYWluIiwgIkZyYW5jZSIsICJQb3J0dWdhbCIsICJJdGFseSIsICJHcmVlY2UiLCAiRmlubGFuZCIpKSAlPiUgZmlsdGVyKGVkYWQgPT0gIlkxNS0yNCIpICU+JSBtdXRhdGUoUGHDrXMgPSBjYXNlX3doZW4oZ2VvID09ICJGaW5sYW5kIiB+ICJGaW5sYW5kaWEiLCAgZ2VvID09ICJGcmFuY2UiIH4gIkZyYW5jaWEiLCAgZ2VvID09ICJHcmVlY2UiIH4gIkdyZWNpYSIsIGdlbyA9PSAiUG9ydHVnYWwiIH4gIlBvcnR1Z2FsIiwgZ2VvID09ICJTcGFpbiIgfiAiRXNwYcOxYSIsIGdlbyA9PSAiSXRhbHkiIH4gIkl0YWxpYSIpKSANCnBhcm9KIDwtIHBhcm9KICU+JSBzZWxlY3QoLWdlbykgJT4lIHNlbGVjdChGZWNoYSwgUGHDrXMsIHZhbG9yKQ0KDQpwYXJvSiA8LSBwYXJvSiAlPiUgbXV0YXRlKEZlY2hhYSA9IGNhc2Vfd2hlbihGZWNoYSA9PSAiMjAwNS0wMS0wMSIgfiAyMDA1LCBGZWNoYSA9PSAiMjAwNi0wMS0wMSIgfiAyMDA2LCBGZWNoYSA9PSAiMjAwNy0wMS0wMSIgfiAyMDA3LCBGZWNoYSA9PSAiMjAwOC0wMS0wMSIgfiAyMDA4LCBGZWNoYSA9PSAiMjAwOS0wMS0wMSIgfiAyMDA5LCBGZWNoYSA9PSAiMjAxMC0wMS0wMSIgfiAyMDEwLCBGZWNoYSA9PSAiMjAxMS0wMS0wMSIgfiAyMDExLCBGZWNoYSA9PSAiMjAxMi0wMS0wMSIgfiAyMDEyLCBGZWNoYSA9PSAiMjAxMy0wMS0wMSIgfiAyMDEzLCBGZWNoYSA9PSAiMjAxNC0wMS0wMSIgfiAyMDE0LCBGZWNoYSA9PSAiMjAxNS0wMS0wMSIgfiAyMDE1LCBGZWNoYSA9PSAiMjAxNi0wMS0wMSIgfiAyMDE2LCBGZWNoYSA9PSAiMjAxNy0wMS0wMSIgfiAyMDE3LCBGZWNoYSA9PSAiMjAxOC0wMS0wMSIgfiAyMDE4LCBGZWNoYSA9PSAiMjAxOS0wMS0wMSIgfiAyMDE5KSkNCnBhcm9KIDwtIHBhcm9KICU+JSBzZWxlY3QoLUZlY2hhKSAlPiUgc2VsZWN0KEZlY2hhYSwgUGHDrXMsIHZhbG9yKQ0KcGFyb0ogPC0gcGFyb0ogJT4lIHJlbmFtZShGZWNoYSA9ICJGZWNoYWEiKQ0KDQoNCiNzdHIocGFyb0opDQpgYGANCg0KDQpgYGB7ciBvdXQud2lkdGg9IjgwJSJ9DQpwYXJvSiAlPiUgZ2dwbG90KGFlcyhGZWNoYSwgdmFsb3IsIHNpemU9dmFsb3IsIGNvbG9yPVBhw61zKSkgKyANCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKyAgIA0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCAyMCksIG5hbWU9IlZhbG9yICglKSkiKSAgKyANCiAgIGdlb21fbGluZShzaXplID0gMSkgKw0KICBmYWNldF93cmFwKH5QYcOtcykgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlzY3JldGU9VFJVRSwgZ3VpZGU9RkFMU0UsIG9wdGlvbj0iQSIpICsgDQogIHRoZW1lX2hjKCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGVsIGRlc2VtcGxlbyBKdXZlbmlsIC0gUGVyaW9kbzogMjAwNS0yMDE5IiwgDQogICAgc3VidGl0bGUgPSAiQcOxbzoge2FzLmludGVnZXIoZnJhbWVfYWxvbmcpfSIsIA0KICAgIGNhcHRpb24gPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBFdXJvc3RhdCIsIHg9TlVMTCwgeT0iVmFsb3IgKCUpIikgKyB0cmFuc2l0aW9uX3JldmVhbChGZWNoYSkgKyANCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siLA0KICAgIGZpbGwgPSBhbHBoYSgiZ3JlZW4iLDAuNCkpKQ0KYGBgDQoNCmBgYHtyfQ0KI1ByZXBhcmFuZG8gbG9zIGRhdG9zDQpwYXJvX2pvdmVuJGdlbyA8LSByZWNvZGUocGFyb19qb3ZlbiRnZW8sIA0KICJHZXJtYW55ICh1bnRpbCAxOTkwIGZvcm1lciB0ZXJyaXRvcnkgb2YgdGhlIEZSRykiPSJHZXJtYW55IiwgDQogICJDemVjaGlhIiA9ICJDemVjaCBSZXB1YmxpYyIsIA0KICAiTm9ydGggTWFjZWRvbmlhIiA9ICJNYWNlZG9uaWEiKQ0KDQpwYXJvX2pvdmVuJHRpbWUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocGFyb19qb3ZlbiR0aW1lKSkNCg0Kd29ybGQgPC0gcm5hdHVyYWxlYXJ0aDo6bmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3BvaW50czwtIHN0X2NlbnRyb2lkKHdvcmxkKQ0Kd29ybGRfcG9pbnRzIDwtIGNiaW5kKHdvcmxkLCBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZCh3b3JsZCRnZW9tZXRyeSkpKQ0KDQpkZl9pbm5lciA8LSBpbm5lcl9qb2luKHdvcmxkLCBwYXJvX2pvdmVuLCBieT0gYygic292ZXJlaWdudCIgPSAiZ2VvIikpDQpkZl9wYXJvIDwtIGRmX2lubmVyICU+JSBzZWxlY3Qoc292ZXJlaWdudCwgdGltZSwgdmFsdWVzKQ0KDQpkZl9wYXJvYiA8LSBwYXJvX2pvdmVuICU+JSBmaWx0ZXIodGltZSA9PSAyMDEzKQ0KZGZfaW5uZTJyIDwtIGlubmVyX2pvaW4od29ybGQsIGRmX3Bhcm9iLCBieT0gYygic292ZXJlaWdudCIgPSAiZ2VvIikpDQpkZl9wYXJvYiA8LSBkZl9pbm5lMnIgJT4lIHNlbGVjdChzb3ZlcmVpZ250LCB0aW1lLCB2YWx1ZXMpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSI4MCUifQ0KZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgY29sb3IgPSAiYmxhY2siKSArIA0KICAgIGdlb21fc2YoZGF0YSA9IGRmX3Bhcm8sIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gdmFsdWVzKSkgKyANCiAgZ2VvbV9zZihkYXRhID0gZGZfcGFyb2IsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gdmFsdWVzKSkgKyBjb29yZF9zZih4bGltID0gYygtMTMuMDAsIDM2LjAwKSwgeWxpbSA9IGMoMzUsIDY3LjQ0KSwgZXhwYW5kID0gRkFMU0UpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImF6dXJlIikpICsNCiAgdHJhbnNpdGlvbl9tYW51YWwodGltZSkgKyB0aGVtZV92b2lkKCkgKyBsYWJzKHRpdGxlPSJQQVJPIEpVVkVOSUwgRVVST1BFTyBBw7FvOiB7Y3VycmVudF9mcmFtZX0iLCANCiAgICBjYXB0aW9uID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgRXVyb3N0YXQgeSBOYXR1cmFsIEVhcnRoIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwNCiAgICBoanVzdCA9IDAuNiwgY29sb3I9ImRhcmttYWdlbnRhIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEpDQpgYGANCg0KDQoNCmBgYHtyIGZpZy5zaG93ID0gImhvbGQiLCBvdXQud2lkdGggPSAiNzUlIiwgZmlnLmFsaWduID0gImNlbnRlciIsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQojaW5zdGFsbC5wYWNrYWdlcygiZHlncmFwaHMiKQ0KcGFyb0QgPC0gcGFybyAlPiUgZmlsdGVyKGdlbyA9PSAiU3BhaW4iKSAlPiUgZmlsdGVyKGVkYWQgPT0gIlkxNS0yNCIpDQpkYXRhIDwtIHltZChwYXJvRCRGZWNoYSkNCmRvbiA8LSB4dHMoeCA9IHBhcm9EJHZhbG9yLCBvcmRlci5ieSA9IGRhdGEpDQpkeWdyYXBoKGRvbiwgeWxhYiA9ICJWYWxvcmVzICglKSIsIG1haW4gPSAiVGFzYSBkZXNlbXBsZW8gZW4gRXNwYcOxYS4gR3J1cG8gZGUgZWRhZDogRGUgMTUgYSAyNCBhw7FvcyIpICU+JQ0KICBkeU9wdGlvbnMoZHJhd1BvaW50cyA9IFRSVUUsIGxhYmVsc1VUQyA9IFRSVUUsIGZpbGxHcmFwaD1UUlVFLCBmaWxsQWxwaGE9MC4xLCBkcmF3R3JpZCA9IEZBTFNFLCBjb2xvcnM9IiNkODVhODQiKSAlPiUNCiAgZHlSYW5nZVNlbGVjdG9yKGZpbGxDb2xvciA9ICJhcXVhbWFyaW5lIiwgc3Ryb2tlQ29sb3IgPSAiYmxhY2siKSAlPiUNCiAgZHlDcm9zc2hhaXIoZGlyZWN0aW9uID0gInZlcnRpY2FsIikgJT4lDQogIGR5SGlnaGxpZ2h0KGhpZ2hsaWdodENpcmNsZVNpemUgPSA1LCBoaWdobGlnaHRTZXJpZXNCYWNrZ3JvdW5kQWxwaGEgPSAwLjIsIGhpZGVPbk1vdXNlT3V0ID0gRkFMU0UpICAlPiUNCiAgZHlSb2xsZXIocm9sbFBlcmlvZCA9IDEpIA0KDQpgYGANCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgOS4gT1RST1MgREFUT1MgREVMIE1FUkNBRE8gREUgVFJBQkFKTy4uLiB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJ2aW9sZXRyZWQiPioqTXVqZXJlcyBlbiBsb3MgcHVlc3RvcyBkaXJlY3Rpdm9zKio8L0ZPTlQ+DQoNCjxicj4NCjxkaXYgY2xhc3MgPSAiY2FqYS1ncmlzLWdhaW5ib3JvIj4NCkVsIGNvbmNlcHRvICoqVEVDSE8gREUgQ1JJU1RBTCoqIHNlIG9pcmlnbsOzIGVuIHVuIGRpc2N1cnNvIGRlIE1hcmlseW4gTG9kZW4gZW4gMTk3OC4gDQpTZSBkZWZpbmUgY29tbyBsYSAqKmZ1ZXJ6YSBpbnZpc2libGUgcXVlIGltcGlkZSBhIGxhcyBtdWplcmVzIGFjY2VkZXIgYSBsb3MgY2FyZ29zIGRpcmVjdGl2b3MuKioNCjwvZGl2Pg0KDQo8YnI+DQo8Y2VudGVyPjxpbWcgc3JjPSJJbWFnZW5lcy9JbWFnZW4xLnBuZyIgd2lkdGg9IjY1MHB4IiAvPjwvY2VudGVyPg0KDQo8YnI+DQpQYXJhIGFuYWxpemFyIGVzdG8gdXNhcsOpIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgbGEgT0NERSBzb2JyZSBlbCAlIGRlIG11amVyZXMgZGlyZWN0aXZhcy4gDQpMb3MgZGF0b3MgZGlzcG9uaWJsZXMgdmFuIGRlc2RlIGVsIGHDsW8gMjAxMSBoYXN0YSBlbCAyMDE4Lg0KDQpFbiBwcmltZXIgbHVnYXIgZGVjaXIgcXVlIGNvbiBlbCB3b3JkY2xvdWQgcG9kZW1vcyBvYnNlcnZhciBxdWUgcGFyYSBlbCAyMDE4IGxvcyAxMCBwYcOtc2VzIHF1ZSB0ZW7DrWFuIG1heW9yICUgZGUgbXVqZXJlcyBkaXJlY3RpdmFzIGVzdMOhbiBtb3N0cmFkb3MgY29uIHVuIG1heW9yIHRhbWHDsW8gZW4gbGFzIGxldHJhcy4gQXPDrSBjb21vLCBsb3MgcXVlIHRlbsOtYW4gdW4gbWVub3IgJSBhcGFyZWNlbiBjb24gdW4gdGFtYcOxbyBtZW5vci4gRW50cmUgZXN0b3Mgw7psdGltb3MgZGVzdGFjYXLDrWEgSmFww7NuLCBJbmRpYSB5IENvcmVhIGNvbW8gcGHDrXNlcyBlbiBsb3MgcXVlIG1lbm9zICUgZGUgbXVqZXJlcyBwdWVkZW4gYWNjZWRlciBhIHB1ZXN0b3MgZGlyZWN0aXZvcy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCm11amVyZXNfZGlyZWN0aXZhczE4IDwtIG11amVyZXNfZGlyZWN0aXZhcyAlPiUgZmlsdGVyKFRJTUUgPT0gIjIwMTgiKSANCm11amVyZXNfZGlyZWN0aXZhczE4JENvdW50cnkgPC0gcmVjb2RlKG11amVyZXNfZGlyZWN0aXZhczE4JENvdW50cnksIA0KICJDaGluYSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YpIj0iQ2hpbmEiLA0KICAiSWNlbGFuZCIgPSAiSXNsYW5kaWEiLA0KICAiUnVzc2lhIiA9ICJSdXNpYSIsDQogICJQb2xhbmQiID0gIlBvbG9uaWEiLA0KICAiTmV3IFplbGFuZCIgPSAiTnVldmEgWmVsYW5kYSIsDQogICJVbml0ZWQgU3RhdGVzIiA9ICJFc3RhZG9zIFVuaWRvcyIsDQogICJMaXRodWFuaWEiID0gIkxpdHVhbmlhIiwNCiAgIlN3ZWRlbiIgPSAiU3VlY2lhIiwNCiAgIkh1bmdhcnkiID0gIkh1bmdyaWEiKQ0KbXVqZXJlc19kaXJlY3RpdmFzMTgkVmFsdWUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIobXVqZXJlc19kaXJlY3RpdmFzMTgkVmFsdWUpKQ0KbXVqZXJlc19kaXJlY3RpdmFzMTggPC0gbXVqZXJlc19kaXJlY3RpdmFzMTggJT4lIHNsaWNlX21heChWYWx1ZSwgbj0xMCkNCm11amVyZXNfZGlyZWN0aXZhczE4IDwtIG11amVyZXNfZGlyZWN0aXZhczE4ICU+JSBzZWxlY3QoQ291bnRyeSwgVmFsdWUpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQptdWplcmVzX2RpcmVjdGl2YXMxOGIgPC0gbXVqZXJlc19kaXJlY3RpdmFzICU+JSBmaWx0ZXIoVElNRSA9PSAiMjAxOCIpIA0KbXVqZXJlc19kaXJlY3RpdmFzMThiJENvdW50cnkgPC0gcmVjb2RlKG11amVyZXNfZGlyZWN0aXZhczE4YiRDb3VudHJ5LCANCiAiQ2hpbmEgKFBlb3BsZSdzIFJlcHVibGljIG9mKSI9IkNoaW5hIiwNCiAgIkN6ZWNoIFJlcHVibGljIiA9ICJSZXDDumJsaWNhIENoZWNhIiwNCiAgIkl0YWx5IiA9ICJJdGFsaWEiLA0KICAiR3JlZWNlIiA9ICJHcmVjaWEiLA0KICAiRGVubWFyayIgPSAiRGluYW1hcmNhIiwNCiAgIk5ldGhlcmxhbmRzIiA9ICJQYcOtc2VzIEJham9zIiwNCiAgIkx1eGVtYm91cmciID0gIkx1eGVtYnVyZ28iLA0KICAiVHVya2V5IiA9ICJUdXJxdcOtYSIsDQogICJKYXBhbiIgPSAiSmFww7NuIiwNCiAgIkluZGlhIiA9ICJJbmRpYSIsDQogICJLb3JlYSIgPSAiQ29yZWEiKQ0KbXVqZXJlc19kaXJlY3RpdmFzMThiJFZhbHVlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKG11amVyZXNfZGlyZWN0aXZhczE4YiRWYWx1ZSkpDQptdWplcmVzX2RpcmVjdGl2YXMxOGIgPC0gbXVqZXJlc19kaXJlY3RpdmFzMThiICU+JSBhcnJhbmdlKFZhbHVlKSAlPiUgc2xpY2VfbWluKFZhbHVlLCBuPTEwKQ0KbXVqZXJlc19kaXJlY3RpdmFzMThiIDwtIG11amVyZXNfZGlyZWN0aXZhczE4YiAlPiUgc2VsZWN0KENvdW50cnksIFZhbHVlKQ0KDQpgYGANCg0KDQpFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gcG9kZW1vcyB2ZXIgY29tbyBoYSBldm9sdWNpb25hZG8gZXN0YSB2YXJpYWJsZSwgbXVqZXJlcyBkaXJlY3RpdmFzLCBlbiBFc3Bhw7FhOg0KDQpgYGB7cn0NCm11amVyZXNfZGlyZWN0aXZhc1MgPC0gbXVqZXJlc19kaXJlY3RpdmFzICU+JSANCiAgZmlsdGVyKENvdW50cnkgJWluJSBjKCJTcGFpbiIpKSAlPiUgDQogIG11dGF0ZShQYcOtcyA9IGNhc2Vfd2hlbihDb3VudHJ5ID09ICJTcGFpbiIgfiAiRXNwYcOxYSIpKSANCm11amVyZXNfZGlyZWN0aXZhc1MgPC0gbXVqZXJlc19kaXJlY3RpdmFzUyAlPiUgc2VsZWN0KFBhw61zLCBUSU1FLCBWYWx1ZSkNCm11amVyZXNfZGlyZWN0aXZhc1MkVmFsdWUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIobXVqZXJlc19kaXJlY3RpdmFzUyRWYWx1ZSkpDQptdWplcmVzX2RpcmVjdGl2YXNTJFRJTUUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIobXVqZXJlc19kaXJlY3RpdmFzUyRUSU1FKSkNCiNzdHIobXVqZXJlc19kaXJlY3RpdmFzUykNCm11amVyZXNkaXJlY3RpdmFzX2VuZHMgPC0gbXVqZXJlc19kaXJlY3RpdmFzUyAlPiUgDQogIGZpbHRlcihQYcOtcyA9PSAiRXNwYcOxYSIpICU+JSANCiAgZ3JvdXBfYnkoUGHDrXMpICU+JSANCiAgdG9wX24oMSwgVElNRSkgJT4lIHB1bGwoVmFsdWUpIA0KYGBgDQoNCmBgYHtyIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQuaGVpZ2h0PSI1MCUiLCBvdXQud2lkdGg9Ijc1JSJ9DQpncmFmTUQgPC0gbXVqZXJlc19kaXJlY3RpdmFzUyAlPiUgDQogIGdncGxvdChhZXMoeCA9IFRJTUUsIHkgPSBWYWx1ZSwgY29sb3IgPSBQYcOtcykpICsgDQogIGdlb21fbGluZShzaXplID0gMS44LCBjb2xvcj0iZ3JlZW4iKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAyICkgICsgDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiwgYnJlYWtzID0gbXVqZXJlc2RpcmVjdGl2YXNfZW5kcykpICsgDQogICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSAgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDExLCAyMDE4LCAxKSwgbGltaXRzID0gYygyMDExLCAyMDE4KSkgKyANCiAgdGhlbWVfbWluaW1hbCgpICsgDQogIHRyYW5zaXRpb25fcmV2ZWFsKFRJTUUpICsgZWFzZV9hZXMoJ2xpbmVhcicpDQpncmFmTUQgKyBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gbXVqZXJlcyBkaXJlY3RpdmFzIGVuIEVzcGHDsWEgKCUpIiwgDQogIHN1YnRpdGxlID0gIkHDsW86IHthcy5pbnRlZ2VyKGZyYW1lX2Fsb25nKX0iLA0KICBjYXB0aW9uID0gIkRhdG9zIGV4dHJhw61kb3MgZGUgbGEgT0NERSIsIHggPSBOVUxMLCB5PSJWQUxPUiAoJSkiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBoanVzdCA9IDAuNSkpDQpgYGANCg0KQWRlbcOhcyBkZSBsYSBldm9sdWNpw7NuIHF1ZSBwb2RlbW9zIG9ic2VydmFyIGNvbiBlbCBncsOhZmljbyBhbnRlcmlvciBjYWJlIGRlY2lyIHF1ZSwgZWwgbsO6bWVybyBkZSBtdWplcmVzIGRpcmVjdGl2YXMgZW4gRXNwYcOxYSwgaGEgY3JlY2lkbyBlbiAyMDIwIGhhc3RhIGVsIDM0JSwgc2Vnw7puIGVsIGluZm9ybWUgZGUgIldvbWVuIGluIEJ1c2luZXNzIDIwMjAiLiBTaWVuZG8gZXN0ZSB1bm8gZGUgbG9zIGltcHVsc29zIG3DoXMgYWx0b3MgZGUgbG9zIMO6bHRpbW9zIDE2IGHDsW9zLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQptdWplcmVzX2RpcmVjdGl2YXNQIDwtIG11amVyZXNfZGlyZWN0aXZhcyAlPiUgZmlsdGVyKENvdW50cnkgJWluJSBjKCJTcGFpbiIsICJGcmFuY2UiLCAiR2VybWFueSIsICJJdGxheSIsICJHcmVlY2UiLCAiUG9ydHVnYWwiKSkgJT4lIG11dGF0ZShQYcOtcyA9IGNhc2Vfd2hlbihDb3VudHJ5ID09ICJTcGFpbiIgfiAiRXNwYcOxYSIsIENvdW50cnkgPT0gIkdlcm1hbnkiIH4gIkFsZW1hbmlhIiwgQ291bnRyeSA9PSAiSXRhbHkiIH4gIkl0YWxpYSIsIENvdW50cnkgPT0iR3JlZWNlIiB+ICJHcmVjaWEiLCBDb3VudHJ5ID09ICJQb3J0dWdhbCIgfiAiUG9ydHVnYWwiICwgQ291bnRyeSA9PSAiRnJhbmNlIiB+ICJGcmFuY2lhIikpIA0KbXVqZXJlc19kaXJlY3RpdmFzUCA8LSBtdWplcmVzX2RpcmVjdGl2YXNQICU+JSBzZWxlY3QoUGHDrXMsIFRJTUUsIFZhbHVlKQ0KbXVqZXJlc19kaXJlY3RpdmFzUCRWYWx1ZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihtdWplcmVzX2RpcmVjdGl2YXNQJFZhbHVlKSkNCm11amVyZXNfZGlyZWN0aXZhc1AkVElNRSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihtdWplcmVzX2RpcmVjdGl2YXNQJFRJTUUpKQ0KYGBgDQoNClBvciDDumx0aW1vLCBoZSBjb21wYXJhZG8gZWwgJSBkZSBtdWplcmVzIGRpcmVjdGl2YXMgZW4gbG9zIGRpc3RpbnRvcyBhw7FvcyBjb24gb3Ryb3MgcGHDrXNlcyBldXJvcGVvcywgdGFsZXMgY29tbyBGcmFuY2lhLCBJdGFsaWEsIFBvdHVyZ2FsLCBBbGVtYW5pYSB5IEdyZWNpYS4gY29uIGVsIGZpbiBkZSB2ZXIgc2kgZWwgJSBkZSBtdWplcmVzIGRpcmVjdGl2YXMgZXMgc2ltaWxhciBhIGVzdG9zIG8gbm8uIA0KDQpgYGB7ciBmaWcuYWxpZ24gPSAiY2VudGVyIiwgb3V0LmhlaWdodD0iNTAlIiwgb3V0LndpZHRoPSI3NSUifQ0KIGdncGxvdChtdWplcmVzX2RpcmVjdGl2YXNQLCBhZXMoeCA9IFRJTUUsIHkgPSBWYWx1ZSwgY29sb3IgPSBQYcOtcywgZ3JvdXA9UGHDrXMpKSArIA0KICBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKSArIA0KICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDExLCAyMDE4LCAxKSwNCiAgICBsaW1pdHMgPSBjKDIwMTEsIDIwMTgpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBWYWx1ZSksIHNpemUgPSAyLjIwLCBudWRnZV95ID0gMC40KSArDQogIHRoZW1lX2Nvd3Bsb3QoKSAgKyBnZW9tX2xpbmUoZGF0YSA9IG11amVyZXNfZGlyZWN0aXZhc1MsIHNpemUgPSAxLjUwKSArDQogICAgZ2VvbV9wb2ludChkYXRhID0gbXVqZXJlc19kaXJlY3RpdmFzUywgc2l6ZSA9IDEuNTApICsgDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBtdWplcmVzIGRpcmVjdGl2YXMgKCUpIiwgDQogIHN1YnRpdGxlID0gIlBhcmEgNSBwYcOtc2VzIGV1cm9wZW9zIiwNCiAgY2FwdGlvbiA9ICJEYXRvcyBleHRyYcOtZG9zIGRlIGxhIE9DREUiLCB4ID0gTlVMTCwgeT0iVkFMT1IgKCUpIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSkgKw0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgaGp1c3QgPSAwLjUpKSANCg0KYGBgDQoNCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgdHJhcyBlbCBncsOhZmljbywgZW4gMjAxMSBlbCBwb3JjZW50YWplIGRlIG11amVyZXMgZGlyZWN0aXZhcyBlbiBGcmFuY2lhIGVyYSBzdXBlcmlvciBhbCBkZSBsb3Mgb3Ryb3MgcGHDrXNlcyBjb25zaWRlcmFkb3MsIGNvbiB1bmEgdGFzYSBkZSAzOCw3JS4gU2VndWlkbyBkZSBQb3J0dWdhbCwgRXNwYcOxYSB5IEFsZW1hbmlhLCBjb24gdW5vcyB2YWxvcmVzIGlkw6ludGljb3MgeSBlbiDDumx0aW1hIHBvc2ljacOzbiBjb24gdW4gMjMlIEdyZWNpYS4gDQoNCkxhIGV2b2x1Y2nDs24gZGUgY2FkYSB1bm8gZGUgZXN0b3MgcGHDrXNlcyBoYSBzaWRvIGRpZmVyZW50ZS4gRW4gZWwgY2FzbyBkZSBGcmFuY2lhIHNlIG9ic2VydmEgdW5hIGZ1ZXJ0YSBkaXNjaW11bmljw7NuIGEgcGFydGlyIGRlbCBhw7FvIDIwMTIgYWxjYW56YW5kbyBzdSB2YWxvciBtw6FzIGJham8gZW4gMjAxNSBjb24gdW4gMzEsMSUgZGUgbXVqZXJlcyBkaXJlY3RpdmFzLCB2YWxvciBxdWUgY29pbmNpZGUgY29uIGVsIGRlIEVzcGHDsWEgcGFyYSBlc3RlIG1pc21vIGHDsW8uDQoNCmVuIGVsIGNhc28gZGUgUG9ydHVnYWwgc2UgbXVlc3RyYW4gZGlmZXJlbnRlcyAgc3ViaWRhcyB5IGJhamFkYXMgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MuIEVuIGVsIMO6bHRpbW8gYcOxbyBkaXNwb25pYmxlLCAyMDE4IGVsIHBvcmNlbnRhamUgZXMgc2ltaWxhciBhbCBkZSBGcmFuY2lhICgzNCUgYXByb3gpDQoNCkVuIEdyZWNpYSB0YW1iacOpbiBzZSBvYnNlcnZhciBkaWZlcmVudGVzIHBpY29zLCBzaWVuZG8gZWwgbcOhcyBlbGV2YWRvIGVsIGRlbCBhw7FvIDIwMTcsIGNvbiB1biB2YWxvciBkZWwgMjgsOSUuDQoNClBvciBsbyBxdWUgcmVzcGVjdGEgYSBBbGVtYW5pYSB5IEVzcGHDsWEsIGRlY2lyIHF1ZSBsYSBldm9sdWNpw7NuIGhhIHNpZG8gc2ltaWxhciB5IGNvbiB1bm9zIHZhbG9yZXMgYmFzdGFudGUgY29uc3RhbnRlcy4gVG9kbyB5IHF1ZSBwYXJ0aWFuIGRlIHVub3MgbWlzbW9zIHZhbG9yZXMsIEVzcGHDsWEgcHJlc2VudGEgdW5hcyBjaWZyYXMgc3VwZXJpb3Jlcy4gDQoNCg0KYGBge3IgZmlnLmFsaWduID0gImNlbnRlciJ9DQptZGlyZWN0IDwtIHJiaW5kKG11amVyZXNfZGlyZWN0aXZhczE4LG11amVyZXNfZGlyZWN0aXZhczE4YikNCndkIDwtIHdvcmRjbG91ZDIobWRpcmVjdCwgc2l6ZT0wLjMsIGJhY2tncm91bmRDb2xvcj0iaG9uZXlkZXciKQ0KYGBgDQoNCg0KDQojIyMgPEZPTlQgQ09MT1I9InZpb2xldHJlZCI+KipMYSBicmVjaGEgc2FsYXJpYWwqKjwvRk9OVD4NCg0KDQpFeGlzdGUgPEZPTlQgQ09MT1I9IlJlZCI+ICoqYnJlY2hhIHNhbGFyaWFsKio8L0ZPTlQ+IGN1YW5kbyAqKmVsIHZhbG9yIGRlbCB0cmFiYWpvIGRlIHVuIGhvbWJyZSB5IHVuYSBtdWplciBlcyBlbCBtaXNtbywgcGVybyBlbiBjYW1iaW8sIGVsIHNhbGFyaW8gcmVjaWJpZG8gbm8uKioNCg0KRW4gMTk4MCBzZSBhcHJvYsOzIGVuIEVzcGHDsWEgZWwgRXN0YXR1dG8gZGUgbG9zIFRyYWJhamFkb3JlcywgYSBwYXJ0aXIgZGVsIGN1YWwgc2UgY29uc2lkZXJhIGlsZWdhbCBwYWdhciBkaXN0aW50byBzYWxhcmlvIHBvciB1biBtaXNtbyB0cmFiYWpvLiBQb3IgZWxsbywgbGFzIGRpZmVyZW5jaWFzIHNlIGV4cGxpY2FuIHByaW5jaXBhbG1lbnRlIHBvciAqKmpvcm5hZGFzIGxhYm9yYWxlcyBkaWZlcmVudGVzLCBlbCB0aXBvIGRlIHB1ZXN0byBlbiBlbCBxdWUgc2UgZW5jdWVudHJhbiBvIG90cm9zIGZhY3RvcmVzIGNvbW8gbGEgcG9sw610aWNhIGRlIGxhIGVtcHJlc2EuKioNCg0KRW4gbG9zIGRhdG9zIG9mcmVjaWRvcyBwb3IgbGEgT0NERSwgcGFyYSBlbCBjYXNvIGRlIEVzcGHDsWEsIHNlIG11ZXN0cmEgc29sbyBlbiAyMDEwIHkgMjAxNCwgbGEgYnJlY2hhIHNhbGFyaWFsIGVyYSBkZSAxMy41JSB5IDExLjUlLCByZXNwZWN0aXZhbWVudGUsIHBvciBsbyBxdWUgc2Ugb2JzZXJ2YSBxdWUgaGEgZGlzbWludXnDsyBlbiBlc3RvcyBjdWF0cm8gYcOxb3MsIHRvZG8geSBxdWUgYcO6biBwZXJzaXN0ZW4gZGlmZXJlbmNpYXMgZW4gZWwgc2FsYXJpbyBjb2JyYWRvIHBvciB1biBnw6luZXJvIHkgb3Ryby4gDQoNCkFzaW1pc21vLCBjYWJlIGNvbWVudGFyIHF1ZSBsYXMgbXVqZXJlcyBkZSBsYSBVRSBnYW5hbiBhbHJlZGVkb3IgZGUgdW4gMTYlIG1lbm9yIHBvciBob3JhIHF1ZSBsb3MgaG9tYnJlcyB5IHF1ZSBlbiAyMDE5IGxhIGJyZWNoYSBzYWxhcmlhbCBkZSBnw6luZXJvIGVuIEVzcGHDsWEgZnVlIGluZmVyaW9yIGEgbGEgbWVkaWEgZGUgbGEgT0NERS4gDQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1UUlVFfQ0KYnJlY2hhX3NhbGFyaWFsRiA8LSBicmVjaGFfc2FsYXJpYWwgJT4lIGZpbHRlcihJbmRpY2F0b3IgPT0gIkdlbmRlciB3YWdlIGdhcCBhdCBtZWRpYW4iKSAgJT4lIGZpbHRlcihDb3VudHJ5ICE9ICJPRUNEIC0gQXZlcmFnZSIpDQojc3RyKGJyZWNoYV9zYWxhcmlhbEYpDQpicmVjaGFfc2FsYXJpYWxGJFZhbHVlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGJyZWNoYV9zYWxhcmlhbEYkVmFsdSkpDQpgYGANCg0KVmVhbW9zIGVsICUgZGUgYnJlY2hhIHNhbGFyaWFsIGRlIGRpZmVyZW50ZXMgcGHDrXNlcyBkZSBsYSBPQ0RFIHBhcmEgMjAxOCwgZWwgw7psdGltbyBhw7FvIGRpc3BvbmlibGU6DQoNCmBgYHtyfQ0KYnJlY2hhX3NhbGFyaWFsVSA8LSBicmVjaGFfc2FsYXJpYWxGICU+JSANCmZpbHRlcihUSU1FID09ICIyMDE4IikNCnBhY2tpbmcgPC0gY2lyY2xlUHJvZ3Jlc3NpdmVMYXlvdXQoYnJlY2hhX3NhbGFyaWFsVSRWYWx1ZSwgc2l6ZXR5cGU9J2FyZWEnKQ0KcGFja2luZyRyYWRpdXMgPC0gMC45NSpwYWNraW5nJHJhZGl1cw0KZGF0YSA8LSBjYmluZChicmVjaGFfc2FsYXJpYWxVLCBwYWNraW5nKQ0KZGF0LmdnIDwtIGNpcmNsZUxheW91dFZlcnRpY2VzKHBhY2tpbmcsIG5wb2ludHM9NTApDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KZGF0YSRDb3VudHJ5IDwtIHJlY29kZShkYXRhJENvdW50cnksIA0KICJVbml0ZWQgS2luZ2RvbSI9IlVLIiwgDQogICJDemVjaCBSZXB1YmxpYyIgPSAiQ3plY2giLCANCiAgIlNsb3ZhayBSZXB1YmxpYyIgPSAiU2xvdmFrIiwNCiAgIk5ldyBaZWFsYW5kIiA9ICJOZXdaIiwNCiAgIlVuaXRlZCBTdGF0ZXMiID0gIlVTQSIpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSI4NSUifQ0KIGdncGxvdCgpICsgDQogIGdlb21fcG9seWdvbihkYXRhID0gZGF0LmdnLCBhZXMoeCwgeSwgZ3JvdXAgPSBpZCwgZmlsbD1pZCksIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMC42KSArIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1hZ21hIikgKw0KICBnZW9tX3RleHQoZGF0YSA9IGRhdGEsIGFlcyh4LCB5LCBzaXplPVZhbHVlLCANCiAgICBsYWJlbCA9IENvdW50cnkpLCBjb2xvcj0iYmxhY2siKSArDQogICAgZ2VvbV90ZXh0KGRhdGEgPSBkYXRhLCBhZXMoeCwgeS0xLCBzaXplPVZhbHVlLCANCiAgICAgIGxhYmVsID0gVmFsdWUpLCBjb2xvcj0iYmxhY2siKSArIA0KICBsYWJzKHRpdGxlID0gIkJyZWNoYSBzYWxhcmlhbCBkZSBnw6luZXJvIHBhw61zZXMgT0NERSAoJSkiLA0KICAgIHN1YnRpdGxlID0gIkNhbGN1bGFkYSBlbiBsYSBtZWRpYW5hLiAgQcOxbzogMjAxOCIsIA0KICAgIGNhcHRpb24gPSAiRGF0b3M6IE9DREUuIChQYXJhIEVzcGHDsWEgc29sbyBoYXkgZGF0b3MgZGlzcG9uaWJsZXMgZGVsIDIwMTAgeSAyMDE0KSIpICsgY29vcmRfZXF1YWwoKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgaGp1c3QgPSAwLjUpKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBoanVzdCA9IDAuNSkpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGhqdXN0ID0gMCkpIA0KYGBgDQoNCjxicj4NCkRlIGFjdWVyZG8gY29uIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgbG9zIDM2IHBhw61zZXMgcXVlIGNvbmZvcm1hbiBsYSBPQ0RFIC0gT3JnYW5pemFjacOzbiBwYXJhIGxhIENvb3BlcmFjacOzbiB5IGVsIERlc2Fycm9sbG8gRWNvbsOzbWljbyAtICoqZWwgJSBkZSBicmVjaGEgc2FsYXJpYWwgbcOhcyBhbHRvIGVzIGVuIENPUkVBKioNCg0KRW4gZWwgZ3LDoWZpY28gc2lndWllbnRlIHNlIG11ZXN0cmEgbGEgZXZvbHVjacOzbiBkZSBlc3RlIHBhw61zLCBxdWUgY29tbyBwb2RlbW9zIG9ic2VydmFyLCBubyBoYSBoYWJpZG8gZ3JhbiB2YXJpYWNpw7NuIGRlIDIwMTAgYSAyMDE5IHkgZWwgJSBkZSBicmVjaGEgc2FsYXJpYWwgcm9uZGEgdW5vcyB2YWxvcmVzIG11eSBhbHRvcywgc3VwZXJpb3JlcyBhbCAzMCUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCmJyZWNoYXNhbGFyaWFsUCA8LSBicmVjaGFfc2FsYXJpYWxGICU+JSBhcnJhbmdlKGRlc2MoVmFsdWUpKSAlPiUgZmlsdGVyKENvdW50cnkgPT0gIktvcmVhIikgJT4lIGZpbHRlcighKFRJTUUgJWluJSBjKCIyMDAwIiwgIjIwMDUiKSkpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSI4MCUifQ0KZ3JhZmljb0tvcmVhIDwtIGdncGxvdChicmVjaGFzYWxhcmlhbFAsIGFlcyhUSU1FLCBWYWx1ZSkpICsgDQogIGdlb21fc2VnbWVudChhZXMoeD1USU1FLCB4ZW5kID0gVElNRSwgeT0wLCB5ZW5kPVZhbHVlLCBzaXplID0gMCkpICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIGNvbG9yPSJnb2xkIiwgDQogICAgZmlsbCA9IGFscGhhKCJnb2xkIiwgMC4zKSwgDQogICAgYWxwaGEgPSAwLjcsIHNoYXBlPTI1LA0KICAgIHN0cm9rZSA9IDIpICsgIA0KICBnZ3JlcGVsOjpnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1wZXJjZW50KFZhbHVlLzEwMCkpLA0KICAgIGZpbGwgPSAiYXF1YW1hcmluZSIsIA0KICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0gNC41LA0KICAgIGJveC5wYWRkaW5nID0gdW5pdCgxLjEsICJsaW5lcyIpKSArIA0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBOVUxMLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkICA9IGVsZW1lbnRfYmxhbmsoKSwgIA0KICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgbGFicyh4PSBOVUxMLCB5PU5VTEwsDQogICAgdGl0bGU9ICJFVk9MVUNJw5NOIEJSRUNIQSBTQUxBUklBTCBFTiBDT1JFQSAoJSkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOSwgaGp1c3QgPSAwLjUsDQogICAgY29sb3IgPSAidmlvbGV0cmVkNCIsIGZhY2UgPSAiYm9sZCIpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDIwMTAsIDIwMTksIDEpLCBsaW1pdHMgPSBjKDIwMTAsIDIwMTkpKSANCg0KZ3JhZmljb0tvcmVhIDwtIGdyYWZpY29Lb3JlYSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9Iml0YWxpYyIsIGNvbG91cj0iYmxhY2siLCBzaXplPXJlbCgyKSkpDQogIA0KdXJsIDwtICJodHRwczovL3d3dy5tb25leXVuZGVyMzAuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE5LzAzL0dlbmRlci1HYXAuanBnIg0KDQppbWcgPC0gaW1hZ2VfcmVhZCh1cmwpICU+JQ0KICBpbWFnZV9yZXNpemUoIjU3MHg2MDAiKSAlPiUNCiAgaW1hZ2VfY29sb3JpemUoMTUsICJ3aGl0ZSIpDQoNCmdyYWYgPC0gZ2dkcmF3KCkgKyBkcmF3X2ltYWdlKGltZykgKyBkcmF3X3Bsb3QoZ3JhZmljb0tvcmVhKQ0KZ3JhZg0KYGBgDQoNClBvciB0YW50bywgY29tbyBzZSBkZW11ZXN0cmEgZW4gZWwgZ3LDoWZpY28sIHNlIHB1ZWRlIGNvbmNsdWlyLCBxdWUgKiplbiBDb3JlYSBsYXMgbXVqZXJlcyBwZXJjaWJlbiBlbiBwcm9tZWRpbyB1biBzdWVsZG8gMzUsMzAlIG1lbm9yIHF1ZSBsb3MgaG9tYnJlcyoqIFBvciBsbyBxdWUgZXN0byBoYWNlIHF1ZSBDb3JlYSBzZWEgZWwgcGHDrXMgY29uIG1heW9yIGRpZmVyZW5jaWEgZGUgc2FsYXJpbyBlbnRyZSBsb3MgcGHDrXNlcyBxdWUgY29uZm9ybWFuIGxhIE9DREUuDQoNCkFkZW3DoXMsIGNhYmUgY29tZW50YXIgcXVlICoqY29uIGxhIHBhbmRlbWlhIHNlIHByZXbDqSBxdWUgYnJlY2hhIHNhbGFyaWFsIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzIGVtcGVvcmFyw6EqKiAoRWwgSW50cmFuc2lnZW50ZSwgMjAyMCkgeWEgcXVlIGRvcyB0ZXJjaW9zIGRlIGxhIHBvYmxhY2nDs24gZmVtZW5pbmEgcGVyZGnDsyBzdSB0cmFiYWpvIGVsIHBhc2FkbyBtZXMgZGUgbWFyem8uW140XQ0KDQojIyAxMC4gQ09OQ0xVU0lPTkVTDQoNCkNvbW8gY29uY2x1c2nDs24gZGVjaXIgcXVlIGEgdHJhdsOpcyBkZWwgcHJlc2VudGUgdHJhYmFqbyBoZSB0cmF0YWRvIGRlIGFuYWxpemFyIGVsIG1lcmNhZG8gZGUgdHJhYmFqbywgY29uY3JldGFtZW50ZSBtZSBoZSBjZW50cmFkbyBlbiBlbCBkZXNlbXBsZW8uIEFkZW3DoXMsIGNvbW8gbWUgcGFyZWPDrWEgaW50ZXJlc2FudGUgcmVzYWx0YXIgYWxndW5vcyBhc3BlY3RvcyBkZSBlc3RlLCBoZSB0cmF0YWRvIGRlIG1vc3RyYXIgYWxndW5hcyAiY3VyaW9zaWRhZGVzIiBzb2JyZSBlbCB0ZWNobyBkZSBjcmlzdGFsIHkgbGEgYnJlY2hhIGRlIGdlbmVyby4NCg0KQ29tbyBoZSBub21icmFkbyBlbiB2YXJpYXMgb2Nhc2lvbmVzIGEgbG8gbGFyZ28gZGVsIHRyYWJham8sIGxhcyBtdWplcmVzIHkgZWwgZ3J1cG8gZGUgZWRhZCBtw6FzIGpvdmVuLCBlc3RlIGVzIGRlIDE2IGEgMjQgYcOxb3MgKEZvcm1hIHBhcnRlIGRlbCBwYXJvIGp1dmVuaWwpIHNvbiBsb3MgbcOhcyBhZmVjdGFkb3MgcG9yIGxhIHRhc2EgZGUgZGVzZW1wbGVvLCBsYSBjdWFsIHNlIGhhIGFncmF2YWRvIGNvbW8gY29uc2VjdWVuY2lhIGRlIGxhIFBhbmRlbWlhLiBJZ3VhbG1lbnRlLCBoYWJyw61hIHF1ZSB2ZXIgY3VhbCBlcyBsYSBldm9sdWNpw7NuIGRlc3B1w6lzIGRlIGVzdGEgeSBzaSBzZSB2dWVsdmVuIG8gbm8gYSBsb3MgdmFsb3JlcyBwcmV2aW9zIGEgbGEgY3Jpc2lzIGRlbCAyMDA4LiANCg0KTm8gb2JzdGFudGUsIGNhYmUgY29tZW50YXIgdGFtYmnDqW4gcXVlIGZhbHRhIHBhcmEgbG9zIGRhdG9zIGRlbCAyMDIwIGRlIEVzcGHDsWEgZWwgY3VhcnRvIHRyaW1lc3RyZSwgZGFkbyBxdWUgZWwgSU5FIGHDum4gbm8gbG9zIGhhIHB1YmxpY2Fkby4gSWd1YWxtZW50ZSwgcmVzdWx0YSBpbXBvcnRhbnRlIGRlc3RhY2FyLCBxdWUgZW4gZXN0YSBFbmN1ZXN0YSBubyBzZSBtdWVzdHJhIGFxdWVsbGFzIHBlcnNvbmFzIHF1ZSBoYW4gdGVuaWRvIHF1ZSByZWNpYmlyIHVuIEVSVEUsIHBvciBsbyBxdWUgbGFzIGNpZnJhcyBzb24gbcOhcyBiYWphcyBxdWUgZW4gbGEgcmVhbGlkYWQuDQoNClJlc3BlY3RvIGEgbGEgdGFzYSBkZSBkZXNlbXBsZW8gZGUgbG9zIHBhw61zZXMgRXVyb3Blb3MsIGRlY2lyIHF1ZSBHcmVjaWEgc2UgbWFudGllbmUgZW4gbGEgY2FiZXphLiBEZSBoZWNobywgcHJlc2VudGFiYSBlbiAyMDE5IHVuIDE3LDMlIChFc3Bhw7FhIDE0LDElKSBDb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBlc3RhcyB0YXNhcyBjb250cmFzdGFuIGVuIGNvbXBhcmFjacOzbiBjb24gb3Ryb3MgcGHDrXNlcyBjb21vIEZpbmxhbmRpYS4gVG9kbyB5IHF1ZSBlcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjYWRhIG1lcmNhZG8gZGUgdHJhYmFqbywgZGVzdGFjYW5kbywgcG9yIGVqZW1wbG8sIGxhIHJpZ2lkZXogc2FsYXJpYWwgZW4gZWwgbWVyY2FkbyBlc3Bhw7FvbC4gDQoNCkVuIGN1YW50byBhIGxhcyBtdWplcmVzIGRpcmVjdGl2YXMsIGRlY2lyIHF1ZSBDb2xvbWJpYSBlcyBlbCBwYcOtcyBkZSBsYSBPQ0RFIHF1ZSBlbiAyMDE4IHRlbsOtYSB1biBtYXlvciBwb3JjZW50YWplLiBBc2ltaXNtbywgRXNwYcOxYSBtdWVzdHJhIHVuYSBldm9sdWNpw7NuIGNyZWNpZW50ZSwgdG9kbyB5IHF1ZSBhw7puIGhheSBncmFuZGVzIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBwdWVzdG9zIGRpcmVjdGl2b3MgbGxldmFkb3MgYSBjYWJvIHBvciB1biBob21icmUgeSB1bmEgbXVqZXIsIGNvc2EgcXVlIG11ZXN0cmEgZWwgdGVjaG8gZGUgY3Jpc3RhbCBleGlzdGVudGUuIFBvciBsbyBxdWUgaGFjZSBhIGxhIGJyZWNoYSBzYWxhcmlhbCwgdGFtYmnDqW4gc2Ugb2JzZXJ2YSBjaWVydGEgZGlzY3JpbWluYWNpw7NuIGVudHJlIGVsIHNhbGFyaW8gZ2FuYWRvIHBvciBsb3MgaG9tYnJlcyB5IGVsIGRlIGxhcyBtdWplcmVzLCBzaWVuZG8gQ29yZWEgZWwgcGHDrXMgY29uIG3DoXMgZGlmZXJlbmNpYXMuDQoNCkVuIHN1bWEsIGVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBtZXJjYWRvIGRlIHRyYWJham8gZXNwYcOxb2wgcGFyYSBwb2RlciBtZWpvcmFyIGVsIGRlc2VtcGxlbywgcXVlIGVzIHVuIGVsZW1lbnRvIGLDoXNpY28gcGFyYSB1bmEgbWVqb3JhIGVuIGVsIFBJQiBkZSBsYSBlY29ub23DrWEuIERlIGlndWFsIG1vZG8sIG5vIGhheSBxdWUgb2x2aWRhciBvdHJvcyBhc3BlY3RvcyBjb21vIGxhIGJyZWNoYSBzYWxhcmlhbCB5IGVsIHRlY2hvIGRlIGNyaXN0YWwsIHF1ZSBsaW1pdGFuIGxhIGlndWFsZGFkIGVudHJlIGFtYm9zIHNleG9zLg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCnVybCA8LSBoZXJlOjpoZXJlKCJJbWFnZW5lcyIsICJQaXphcnJhLmpwZyIpDQptZW1lIDwtIG1lbWU6Om1lbWUodXJsLCBmb250ID0gIk9wZW4gU2FucyIsIHVwcGVyID0gIlkgZXN0byBlcyB0b2RvLCBcbiBHUkFDSUFTISIsIHNpemU9My41KQ0KYGBgDQoNCjxjZW50ZXI+DQohW10oSW1hZ2VuZXMvbWVtZS5wbmcpe3dpZHRoPSI1NSUifTwvY2VudGVyPg0KDQojIyBSZWZlcmVuY2lhcw0KDQpQYXJhIGxhIHJlYWxpemFjacOzbiBkZWwgdHJhYmFqbyBoZSB1dGlsaXphZG8gbGFzIHNpZ3VpZW50ZXMgcMOhZ2luYXMgd2ViOg0KDQpQYXJhIG9idGVuZXIgbG9zICoqZGF0b3MqKjoNCg0KLSA8YSBocmVmPSJodHRwOi8vd3d3Lm9lY2Qub3JnLyJ0YXJnZXQ9Il9ibGFuayI+T0VDRDwvYT4NCg0KLSA8YSBocmVmPSJodHRwczovL3d3dy5pbmUuZXMvZHluZ3MvSU5FYmFzZS9lcy9vcGVyYWNpb24uaHRtP2M9RXN0YWRpc3RpY2FfQyZjaWQ9MTI1NDczNjE3NjkxOCZtZW51PXVsdGlEYXRvcyZpZHA9MTI1NDczNTk3NjU5NSJ0YXJnZXQ9Il9ibGFuayI+SU5FPC9hPg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0InRhcmdldD0iX2JsYW5rIj5FVVJPU1RBVDwvYT4NCg0KDQpQYXJhIGhhY2VyIGdyw6FmaWNvcywgbWFwYXMsIHRhYmxhcy4uLiBjb24gKipSU3R1ZGlvKioNCg0KLSA8YSBocmVmPSJodHRwOi8vd3d3LnN0YXQuY29sdW1iaWEuZWR1L350emhlbmcvZmlsZXMvUmNvbG9yLnBkZiJ0YXJnZXQ9Il9ibGFuayI+Q29sb3JlcyBlbiBSPC9hPg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzU4Njg3NF8yMDA0NGQxYmRmNmE0ZjYwYmU1Zjg1MTEzYjBkYTVmNS5odG1sInRhcmdldD0iX2JsYW5rIj5TZXJpZXMgdGVtcG9yYWxlczwvYT4NCg0KLSA8YSBocmVmPSJodHRwczovL2dvbnphbGV6Z291dmVpYS5jb20vY29tby1zdXBlcnBvbmVyLXZhcmlhcy1ncmFmaWNhcy1lbi1nZ3Bsb3QtY29uLXIteS1yc3R1ZGlvLyI+U3VwZXJwb25lciAgdmFyaW9zIGdyw6FmaWNvcyAoUGF0Y2h3b3JrKTwvYT4NCg0KLSA8YSBocmVmPSJodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2Nyb3NzdGFsay8idGFyZ2V0PSJfYmxhbmsiPkNyb3NzdGFsazwvYT4NCg0KLSA8YSBocmVmPSJodHRwczovL3J2aWV3cy5yc3R1ZGlvLmNvbS8yMDE5LzA5LzE5L2ludHJvLXRvLWdnZm9yY2UvInRhcmdldD0iX2JsYW5rIj5nZ2ZvcmNlPC9hPg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vcnN0dWRpby1wdWJzLXN0YXRpYy5zMy5hbWF6b25hd3MuY29tLzQ2MDU2M180NDQwM2EzYjA4N2E0MTU3OTdkZTc1YmEzYjIxZDE3Yi5odG1sIj5Xb3JkY2xvdWQ8L2E+DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9ib29rZG93bi5vcmcvZ2JvY2NhcmRvL21hbnVhbC1FRC1VQ0gvY29uc3RydWNjaW9uLWRlLWdyYWZpY29zLXVzYW5kby1yc3R1ZGlvLWZ1bmNpb25hbGlkYWRlcy1iYXNpY2FzLXktdXNvLWRlbC1wYXF1ZXRlLWdncGxvdDIuaHRtbCI+Qm9va2Rvd248L2E+DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9nbGluLmdpdGh1Yi5pby9yZWFjdGFibGUvYXJ0aWNsZXMvZXhhbXBsZXMuaHRtbCI+RWplbXBsb3MgdGFibGFzPC9hPg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vMzA3LWFkZC1zcGFjZS1pbi1jaXJjbGUtcGFja2luZy5odG1sIj5SIEdyYXBoIEdhbGxlcnk8L2E+DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9ycHVicy5jb20vIj5SUHViczwvYT4NCg0KLSA8YSBocmVmPSJodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIvIj5UdXRvcmlhbGVzIHkgc2xpZGVzIHdlYiBjdXJzbzwvYT4NCg0KDQpQYXJhICoqaW50ZXJwcmV0YXIgbG9zIGRhdG9zKio6DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly93d3cuZWxtdW5kby5lcy9zb2NpZWRhZC8yMDE2LzEwLzI0LzU4MGUwM2QzY2E0NzQxMzkxYzhiNDVlNy5odG1sIj5FbCBkZXNlbXBsZW8gZW4gbGFzIG11amVyZXM8L2E+DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly93d3cubnVldmF0cmlidW5hLmVzL2FydGljdWxvL2FjdHVhbGlkYWQvZXBhLXRlcmNlci10cmltZXN0cmUtdGFzYS1wYXJvLWZlbWVuaW5hLTRwdW50b3Mtc3VwZXJpb3ItaG9tYnJlcy8yMDIwMTAyNzEwMjQxMjE4MDYwMi5odG1sIj5Db21wYXJhY2nDs24gZGVzZW1wbGVvIGZlbWVuaW5vIHkgbWFzY3VsaW5vPC9hPg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vZWxwYWlzLmNvbS9lY29ub21pYS8yMDIwLTA0LTI4L2xvcy1udWV2ZS1ncmFmaWNvcy1xdWUtZXhwbGljYW4tZWwtaW1wYWN0by1kZWwtY29yb25hdmlydXMtc29icmUtZWwtZW1wbGVvLmh0bWwiPkltcGFjdG8gZGUgbGEgQ292aWQgZW4gZWwgZGVzZW1wbGVvPC9hPg0KDQoNCi0gIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2VzLmd2YS5lcy9lcy9ub3RpY2lhcy9lbmN1ZXN0YS1kZS1wb2JsYWNpb24tYWN0aXZhLWVwYS1wcmltZXItdHJpbWVzdHJlLTIwMjAiPkVuY3Vlc3RhIGRlIHBvYmxhY2nDs24gYWN0aXZhIC0gQ29taXTDqSBFY29uw7JtaWMgaSBTb2NpYWw8L2E+DQoNCi0gIDxhIGhyZWY9Imh0dHA6Ly93d3cubWl0ZXMuZ29iLmVzL2VzL211bmRvL2NvbnNlamVyaWFzL2RpbmFtYXJjYS9wcmVndW50YXMvRmljaGVyb3MvRmlubGFuZGlhLmh0bSI+wr9Dw7NtbyBmdW5jaW9uYSBsYSBwcm90ZWNjacOzbiBwb3IgZGVzZW1wbGVvIGVuIEZpbmxhbmRpYT88L2E+DQoNCi0gIDxhIGhyZWY9Imh0dHBzOi8vYWlkYTJzYW50b3Mud29yZHByZXNzLmNvbS8yMDE1LzEwLzIyL2Rlc2VtcGxlby1lc3RydWN0dXJhbC1lbi1lc3BhbmEvIj5EZXNlbXBsZW8gZXN0cnVjdHVyYWwgZW4gRXNwYcOxYTwvYT4NCg0KLSAgPGEgaHJlZj0iaHR0cHM6Ly9lbGZlbWluaXNtby5jb20vcXVlLWVzLWVsLXRlY2hvLWRlLWNyaXN0YWwvIj7Cv1F1w6kgZXMgZWwgdGVjaG8gZGUgY3Jpc3RhbD88L2E+DQoNCi0gIDxhIGhyZWY9Imh0dHBzOi8vYmxvZy5la2xvcy5jb20uYXIvc3VlbG8tcGVnYWpvc28teS10ZWNoby1kZS1jcmlzdGFsLWJhcnJlcmFzLWludmlzaWJsZXMtcGFyYS1sYXMtbXVqZXJlcy0zYmY3MjMyMmMwNWEiPlN1ZWxvIHBlZ2Fqb3NvIHkgdGVjaG8gZGUgY3JpdHN0YWw8L2E+DQoNCi0gIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRoaXNpc3RoZXJlYWxzcGFpbi5jb20vZXMvZXNwYW5hLWVuLWVsLW11bmRvL2lndWFsZGFkL2VzcGFuYS1lbnRyZS1sb3MtcGFpc2VzLWNvbi1tYXlvci1wb3JjZW50YWplLWRlLW11amVyZXMtZGlyZWN0aXZhcy1lbi1lbXByZXNhcyI+TXVqZXJlcyBkaXJlY3RpdmFzIGVuIEVzcGHDsWE8L2E+DQoNCi0tLS0tLS0tLS0tLS0tLS0NClteMV06IExhIHdlYiBkZWwgY3Vyc286IDxhIGhyZWY9Imh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8idGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi88L2E+DQpbXjJdOiBDb21lbnRhcsOpIHRhbWJpw6luIGxvcyBlZmVjdG9zIHF1ZSBoYSB0ZW5pZG8gZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGxhIGNyaXNpIHNhbml0YXJpYSBkZWwgQ292aWQtMTkNClteM106IEZvcm1hbiBwYXJ0ZSBkZSBlc3RlIHRpcG8gZGUgZGVzZW1wbGVvLCBwb3IgZWplbXBsbywgYXF1ZWxsYXMgcGVyc29uYXMgcXVlIHB1ZGllbmRvIHRyYWJhamFyIGRlY2lkZW4gYnVzY2FyIG90cm8gZW1lcGxvIHF1ZSBzZSBhanVzdGUgbWVqb3IgYSBzdXMgcHJlZmVyZW5jaWFzLg0KW140XTogQXF1w60gcHVlZGVzIGNvbnN1bHRhciBtw6FzIGluZm9ybWFjacOzbiBzb2JyZSBsYSBCcmVjaGEgc2FsYXJpYWwgZW4gPGEgaHJlZj0iaHR0cHM6Ly9lbGludHJhbnNpZ2VudGUuY29tLzIwMjAvMDkvY29yZWEtZGVsLXN1ci1sYS1icmVjaGEtc2FsYXJpYWwtZW50cmUtaG9tYnJlcy15LW11amVyZXMtZW1wZW9yYXJhLWNvbi1sYS1wYW5kZW1pYS8idGFyZ2V0PSJfYmxhbmsiPkNvcmVhPC9hPg0KDQoNClBhcmEgYWNhYmFyIGVzdGUgY2h1bmsgaW5jbHVpcsOpIG1pIGBzZXNzaW9uIGluZm9gOg0KDQpgYGB7cn0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ2N1cnJlbnQgc2Vzc2lvbiBpbmZvJykgDQpgYGANCg==