Introducción

El siguiente trabajo, es una sección de la Encuesta de Sueldos Kiwi 2021, realizada en el R4HR Club de R para RRHH

Estaremos publicando los resultados finales de la encuesta en 02/2022.

# Carga de librerías 
# Instalar pacman install.packages("pacman")

pacman::p_load(tidyverse, funModeling, gt, googlesheets4,gt, CGPfunctions,
               extrafont, scales, ggalt, kableExtra, wordcloud, networkD3,
               data.table)


# Carga de Datos ----
# Datos --------

## 2021 ----

# Encuesta
kiwi21 <- read.csv("https://raw.githubusercontent.com/r4hr/kiwi2021/main/data/rh_2021.csv",
                   sep = ";",
                   encoding = "UTF-8") 


kiwi21_original <- read_sheet("1nhpqDWuJoWhiVj0rIaV51-SdfnSxTpbV3Vcd3iYmyTw")

options(scipen = 999)   # Modifica la visualización de los ejes numérico a valores nominales

loadfonts(quiet = TRUE) # Permite cargar en R otros tipos de fuentes.

# Estilo limpio sin líneas de fondo
estilo <- theme(panel.grid = element_blank(),
                plot.background = element_rect(fill = "#FBFCFC"),
                panel.background = element_blank(),
                text = element_text(family = "Roboto"))

# Estilo limpio con líneas de referencia verticales en gris claro
estilov <- theme(panel.grid = element_blank(),
                 plot.background = element_rect(fill = "#FBFCFC"),
                 panel.background = element_blank(),
                 panel.grid.major.x = element_line(color = "#AEB6BF"),
                 text = element_text(family = "Roboto"))

# Estilo limpio con líneas de referencia horizontales en gris claro
estiloh <- theme(panel.grid = element_blank(),
                 plot.background = element_rect(fill = "#FBFCFC"),
                 panel.background = element_blank(),
                 panel.grid.major.y = element_line(color = "#AEB6BF"),
                 text = element_text(family = "Roboto"))

genero <- c("#1FC3AA", "#8624F5", "#FFD129", "#75838F") # Verde - Violeta - Amarillo - Gris
genero3 <- c("#8624F5","#FFD129", "#1FC3AA")

colores <-  c("#8624F5", "#1FC3AA")

azul <- "#344D7E"
verde <-  "#4A9FC7"
rosa1 <- "#B95192"
rosa2 <- "#EE5777"
naranja <- "#FF764C"
amarillo <- "#FFA600"
gris <- "#75838F"
lila <- "#755395"
rojo <- "#943126"

col4 <- c(azul, lila, rosa1, rosa2)
col5 <- c(azul, lila, rosa1, rosa2, naranja)
col6 <- c(azul, lila, rosa1, rosa2, naranja, amarillo)

# Creo un objeto con un texto que se va a repetir mucho a lo largo del análisis
fuente <- "Fuente: Encuesta KIWI de Sueldos de RRHH para Latam 2021"

# Creo objetos para formatear las etiquetas numéricas de los ejes x e y
eje_x_n <- scale_x_continuous(labels = comma_format(big.mark = ".", decimal.mark = ","))

eje_y_n <- scale_y_continuous(labels = comma_format(big.mark = ".", decimal.mark = ","))


##### Vuelta a la Oficina ####

vuelta<-kiwi21 %>% 
  select(pais, trabajo, rubro, origen_capital,nombre_area, teletrabajo:valoracion_gestion_pandemia)

A continuación presentamos las respuestas obtenidas en relación al retorno al trabajo presencial.

Teletrabajo & Presencial

Podemos observar cierta equidad entre los que estan haciendo trabajo remoto, aquellos que continuan bajo la modalidad a distancia y quienes alternan la modalidad presencial y teletrabajo:

kiwi21 %>% 
  group_by(teletrabajo) %>% 
  filter(teletrabajo !='NA')%>% 
  tally(sort = T) %>% 
    mutate(teletrabajo = fct_collapse(teletrabajo, "Mixto" = "Voy rotando entre la oficina y el teletrabajo"))%>% 
  rename("Teletrabajo" = teletrabajo,
        "Respuestas" = n) %>% 
  kbl(caption = "Respuestas Teletrabajo", ) %>% 
  kable_styling(full_width = F, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>% 
  footnote(general = fuente)
Respuestas Teletrabajo
Teletrabajo Respuestas
Si 136
No 113
Mixto 109
Note:
Fuente: Encuesta KIWI de Sueldos de RRHH para Latam 2021

Comparativa con países

Entre los países con mayor cantidad de respuestas, vemos que en el caso de Argentina dicha distribución era pareja al momento de la encuesta, siendo destacable la categoría mixta, entendiendo por tales a quienes trabajan en la oficina y en forma remota.

Las liberaciones paulatinas y en forma creciente a nivel Nacional podría ser una de las explicaciones del regreso a las oficinas. Sería interesante evaluar de quienes realizan teletrabajo, cuantos de ellos lo hacian previo a la pandemia y luego lo mantuvieron como politica de la compañia debido a la demanda de sus integrantes.

Posiblemente sea una respuesta que podamos responder en próximas ediciones.

Debido a las escasas respuestas de los otros países no podemos adentrarnos en ninguna conclusión en relación a ellos.

kiwi21 %>% 
  group_by(pais,teletrabajo) %>% 
  filter(teletrabajo !='NA')%>% 
  mutate(teletrabajo = fct_collapse(teletrabajo, "Mixto" = "Voy rotando entre la oficina y el teletrabajo")) %>%
  tally(sort = T) %>% 
  filter(n>5)%>% 
  rename("Teletrabajo" = teletrabajo,
         "País" = pais,
        "Respuestas" = n) %>% 
  kbl(caption = "Respuestas Teletrabajo", ) %>% 
  kable_styling(full_width = F, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive"))%>% 
  footnote(general = fuente)
Respuestas Teletrabajo
País Teletrabajo Respuestas
Argentina Si 106
Argentina No 90
Argentina Mixto 90
Bolivia No 8
Perú Si 8
Note:
Fuente: Encuesta KIWI de Sueldos de RRHH para Latam 2021

Por Rubro

Nos interesaba evaluar si existía alguna relación entre teletrabajo y los rubros de las industrias en la que se desempeñan las personas encuestadas.

En el siguiente cuadro podemos observar aquellos que no estan haciendo teletrabajo, es decir que realizan trabajos presenciales. Los mismos se encuentran principalmente en rubros con mayor necesidad de presencialidad, ya sea por la necesidad de producción o de prestación de servicios.

kiwi21 %>% 
  group_by(rubro) %>% 
  filter(teletrabajo !='NA')%>% 
    filter(teletrabajo =='No')%>% 
  mutate(teletrabajo = fct_collapse(teletrabajo, "Mixto" = "Voy rotando entre la oficina y el teletrabajo")) %>%
  tally(sort = T) %>% 
  filter(n>5)%>% 
  rename("Rubro" = 'rubro',
        "Respuestas" = n) %>% 
  arrange(Respuestas)%>%
  kbl(caption = "Respuestas Teletrabajo", ) %>% 
  kable_styling(full_width = F, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive"))%>% 
  footnote(general = fuente)
Respuestas Teletrabajo
Rubro Respuestas
Petróleo y producción de gas, refinación de petróleo 6
Construcción 9
Comercio 10
Industria metalúrgica, metalmecánica 10
Servicios de salud 10
Alimentación, bebidas 17
Otros 19
Note:
Fuente: Encuesta KIWI de Sueldos de RRHH para Latam 2021

Origen del Capital

Si nos focalizamos en las categorías más representativas de quienes no estan asitiendo a las oficinas o de quienes lo estan haciendo en modalidad mixta, vemos una predominancia en las empresas Nacionales.

## Limpieza variable genero ----


divT <- kiwi21 %>% 
  select(teletrabajo, origen_capital) %>% 
  filter(teletrabajo!="NA")%>%  # se saca, porque no es 
  filter(teletrabajo!="Si")%>%  # se saca, porque no es 
  mutate(teletrabajo = fct_collapse(teletrabajo, "Mixto" = "Voy rotando entre la oficina y el teletrabajo")) %>%
  group_by(teletrabajo,origen_capital) %>% 
  summarise (n = n()) %>% 
  mutate(freq = n/sum(n)) %>% 
  arrange(-n)

# Compute the cumulative percentages (top of each rectangle)
divT$ymax <- cumsum(divT$freq)

# Compute the bottom of each rectangle
divT$ymin <- c(0, head(divT$ymax, n=-1))

# Compute label position
divT$labelPosition <- (divT$ymax + divT$ymin) / 2

# Compute a good label
divT$label <- paste0(divT$origen_capital, "\n Cant: ", divT$n)

# Make the plot
ggplot(divT, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=origen_capital)) +
  geom_rect() +
  coord_polar(theta="y") + # Try to remove that to understand how the chart is built initially
  xlim(c(2, 4)) +# Try to remove that to see how to make a pie chart
  scale_fill_manual(values = c(verde, lila)) +
  theme_void() +
  theme(legend.position = "right",
        panel.background = element_blank(),
        text = element_text(family = "Roboto")) +
  labs(title = "Cantidad de respuestas según Origen del  Capital",
       subtitle = "",
       fill = "Origen", 
       caption = fuente)

Si nos limitamos a Argentina, país con mayor cantidad de respuestas, podemos confirmar que se mantiene la misma tendencia. Dicha relación guarda cierta lógica con la estructura productiva Nacional, con mayor presencia de empresas Nacionales.

Por otra parte, también podriamos suponer que las mismas no tienen tradición en implementar y mantener en el tiempo políticas de trabajo remoto, sin embargo carecemos de elementos suficientes para realizar dicho análisis.

divT2 <- kiwi21 %>% 
  select(pais, teletrabajo, origen_capital) %>% 
  filter(pais =="Argentina")%>% 
  filter(teletrabajo!="NA")%>%  # se saca, porque no es 
  filter(teletrabajo!="Si")%>%  # se saca, porque no es 
  mutate(teletrabajo = fct_collapse(teletrabajo, "Mixto" = "Voy rotando entre la oficina y el teletrabajo")) %>%
  group_by(teletrabajo,origen_capital) %>% 
  summarise (n = n()) %>% 
  mutate(freq = n/sum(n)) %>% 
  arrange(-n)

# Compute the cumulative percentages (top of each rectangle)
divT2$ymax <- cumsum(divT2$freq)

# Compute the bottom of each rectangle
divT2$ymin <- c(0, head(divT2$ymax, n=-1))

# Compute label position
divT$labelPosition <- (divT2$ymax + divT$ymin) / 2

# Compute a good label
divT2$label <- paste0(divT2$origen_capital, "\n Cant: ", divT$n)

# Make the plot
ggplot(divT2, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=origen_capital)) +
  geom_rect() +
  coord_polar(theta="y") + # Try to remove that to understand how the chart is built initially
  xlim(c(2, 4)) +# Try to remove that to see how to make a pie chart
  scale_fill_manual(values = c(verde, lila)) +
  theme_void() +
  theme(legend.position = "right",
        panel.background = element_blank(),
        text = element_text(family = "Roboto")) +
  labs(title = "Cantidad de respuestas según Origen del  Capital",
       subtitle = " Argentina",
       fill = "Origen", 
       caption = fuente)

Planes de retorno

Respecto a los planes de retorno, observamos que el 45% tiene planeado un retorno mixto, seguido por un 30% con presencialidad plena. Al momento de la encuesta, un grupo no menor aún no tenía planes en agenda, representando el 20% de las respuestas obtenidas. Por último, tan solo un 5% planificó el retorno manteniendo el trabajo remoto en forma exclusiva.

vuelta$retorno_plan <- factor(vuelta$retorno_plan, levels = c("Remoto 100%", "En evaluación","Presencial 100%","Mixto" ))
r_plan<-vuelta %>% 
  select(retorno_plan) %>%
filter(retorno_plan!="NA") %>% 
  mutate(cuenta = 1) %>% 
  group_by(retorno_plan) %>%
  summarise (n = n()) %>% 
  mutate(freq = n/sum(n)) %>% 
  arrange(-n)
vuelta %>% 
  select(retorno_plan) %>% 
  filter(retorno_plan!="NA") %>% 
  group_by(retorno_plan) %>% 
  count() %>%
  ggplot(aes(x = n, y = retorno_plan)) +
  geom_col(fill = azul) +
  estilov +
  labs(title = "Respuestas por Plan de Retorno", 
       x = "", y = "", 
       caption = fuente)

Mes de retorno

Nos interesaba indagar entre quienes planeaban el retorno a las oficinas, ya sea en forma presencial o mixta, si tenian definido un período de retorno.

Un 32% de las personas encuestadas, ya había retomado actividades presenciales. Categoría seguida por un 25%, quienes por entonces aún no tenían difinición alguna. Para quienes estaban planeando la vuelta en Noviembre de 2021, suponemos que al momento de escribir estas lineas ya se encuentran prestando servicio en forma presencial; el resto de los meses comparte similar relevancia porcentual. En el caso de la categoría “Marzo”, se refiere a todos los que tenian pensada la vuelta desde Marzo 2022 en adelante, siendo un 7% de las personas encuestadas.

r_per<-vuelta %>% 
  select(retorno_mes) %>%
filter(retorno_mes!="NA") %>% 
  mutate(cuenta = 1) %>% 
  group_by(retorno_mes) %>%
  summarise (n = n()) %>% 
  mutate(freq = n/sum(n)) %>% 
  arrange(-n)
r_mes<- vuelta %>% 
  select(retorno_plan, retorno_mes) %>% 
  filter(retorno_plan!= "Remoto 100%")%>% 
  filter(retorno_plan!="NA") %>% 
  filter(retorno_mes!="NA") %>% 
    filter(retorno_mes!="No aplica") %>% 
  mutate(retorno_mes=fct_collapse(retorno_mes, "Dic" = "Diciembre 2021"),
        retorno_mes=fct_collapse(retorno_mes, "Nov" = "Noviembre 2021"),
         retorno_mes=fct_collapse(retorno_mes, "Ene" = "Enero 2022"),
          retorno_mes=fct_collapse(retorno_mes, "Feb" = "Febrero 2022"),
          retorno_mes=fct_collapse(retorno_mes, "Mar" = "Marzo 2022 en adelante"),
          retorno_mes=fct_collapse(retorno_mes, "Actual" = "Ya volvimos 100%"),
          retorno_mes=fct_collapse(retorno_mes, "S/Def" = "No esta definido")) %>% 
  filter(retorno_mes!="Actual") # ver qué  hacer con esta categoria



r_mes$retorno_mes <- factor(r_mes$retorno_mes, levels = c( "Nov", "Dic","Ene","Feb", "Mar", "S/Def"))


r_mes %>% 
  select(retorno_mes) %>% 
  mutate(cuenta = 1) %>% 
  group_by(retorno_mes) %>%
  summarise (n = n()) %>% 
  arrange(-n)%>% 
  ggplot(aes(x = retorno_mes, y = n)) +
  geom_col(fill = azul) +
  estiloh +
  eje_y_n +
  labs(title = "Mes de Retorno",
       subtitle =  "2021 -2022",
       x = "", y = "",
       caption = fuente)

Decisión de Retorno

El retorno a las oficinas no parece ser una decisión de las personas encuentadas, ya que solo el 2% expresó dicho interés, en una clara contraposición al 72% que expresó que la misma era una decisión unilateral de las empresas. Es interesante destacar un 25% de los encuestados, cuya decisión de retorno fue tomada en forma conjunta.

Si bien sería recomendable lograr un equilibrio para las partes y reconocer que no hay una solución única, sino que dependerá de la empresa, la industria y la cultura organizacional, será fundamental para las empresas evaluar en qué condiciones se encuentra la gente que retoma, ya que si los números de las nóminas replican las tendencias presentadas en la presente encuesta, será dificil conseguir una adecuada experiencia positiva para sus colaboradores puesto que la distancia de intereses es considerablemente amplia.

dec1<-vuelta %>% 
  select(retorno_decision) %>%
filter(retorno_decision!="NA") %>% 
  filter(retorno_decision!="No aplica") %>%
  mutate(cuenta = 1) %>% 
  group_by(retorno_decision) %>%
  summarise (n = n()) %>% 
  mutate(freq = n/sum(n)) %>% 
  arrange(-n)

A través del siguiente gráfico, observamos en qué tipo de empresas trabajan las personas que respondieron la encuesta y la relación con la decisión de retorno.

r_dec <- vuelta %>% 
  select(retorno_decision, origen_capital) %>%
filter(retorno_decision!="NA") %>%
  filter(retorno_decision!="No aplica") %>%
filter(origen_capital!="NA")

r_dec$retorno_decision <- factor(r_dec$retorno_decision, levels = c( "De la empresa", "De común acuerdo","Del empleado"))


ggplot(r_dec, (aes(x = retorno_decision, fill = origen_capital))) + #Tipo de universidad y cargo
  geom_bar(position = "dodge") +
  theme(axis.text.x = element_text(angle = 360)) + 
  labs(x="",y="") +
    estilov +
  scale_fill_manual(values = c(gris, verde, azul)) +
  coord_flip() +
  labs(title = "Respuestas según decisión de retorno y origen de capital",
       subtitle = "",
       x = "", fill = "Origen del Capital",
       caption = fuente)

Días de retorno

Por último, en la siguiente table podemos ver la cantidad de días de retorno a las oficinas informado por las personas consultadas:

r_dia<- vuelta %>% 
  select(retorno_plan, retorno_dias) %>% 
  filter(retorno_plan!= "Remoto 100%")%>% 
  filter(retorno_plan!="NA") %>% 
  filter(retorno_dias!="NA") %>% 
    filter(retorno_dias!="No aplica") %>% 
  mutate(retorno_dias=fct_collapse(retorno_dias, "Libre" = "A elección de cada empleado"),
        retorno_dias=fct_collapse(retorno_dias, "1" = "1 día"),
        retorno_dias=fct_collapse(retorno_dias, "2" = "2 días"),
         retorno_dias=fct_collapse(retorno_dias, "3" = "3 días"),
          retorno_dias=fct_collapse(retorno_dias, "4" = "4 días"),
          retorno_dias=fct_collapse(retorno_dias, "5" = "5 días"),
          retorno_dias=fct_collapse(retorno_dias, "Actual" = "5 días"))



r_dia %>% 
  select(retorno_dias) %>%
filter(retorno_dias!="NA") %>% 
  filter(retorno_dias!="No aplica") %>%
  mutate(cuenta = 1) %>% 
  group_by(retorno_dias) %>%
  summarise (n = n()) %>% 
  arrange(retorno_dias)%>% 
   rename("Días" = 'retorno_dias',
          "Respuestas" = 'n')%>% 
  kbl(caption = "Cantidad de Días presenciales", ) %>% 
  kable_styling(full_width = F, position = "center",
                bootstrap_options = c("striped", "hover", "condensed", "responsive"))%>% 
  footnote(general = fuente)
Cantidad de Días presenciales
Días Respuestas
1 17
2 47
3 57
4 16
5 9
Libre 54
Note:
Fuente: Encuesta KIWI de Sueldos de RRHH para Latam 2021
LS0tDQp0aXRsZTogIjLCsCBFbmN1ZXN0YSBLSVdJIGRlIFN1ZWxkb3MgZGUgUlJISCBwYXJhIExhdGFtIDIwMjEiDQphdXRob3I6ICJSNEhSIENsdWIgZGUgUiBwYXJhIFJSSEgiDQpkYXRlOiAiMjgvMDEvMjAyMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY29zbW8NCiAgICBoaWdobGlnaHQ6IGhhZGRvY2sNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLnJldGluYSA9IDMsIG91dC53aWR0aCA9ICI4MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmBgYA0KDQoNCiMjIEludHJvZHVjY2nDs24NCg0KRWwgc2lndWllbnRlIHRyYWJham8sIGVzIHVuYSBzZWNjacOzbiBkZSBsYSBFbmN1ZXN0YSBkZSBTdWVsZG9zIEtpd2kgMjAyMSwgcmVhbGl6YWRhIGVuIGVsIFtSNEhSIENsdWIgZGUgUiBwYXJhIFJSSEhdKGh0dHBzOi8vcjRoci5jbHViKSANCg0KRXN0YXJlbW9zIHB1YmxpY2FuZG8gbG9zIHJlc3VsdGFkb3MgZmluYWxlcyBkZSBsYSBlbmN1ZXN0YSBlbiAwMi8yMDIyLg0KDQpgYGB7ciBwcmVwcm9jZXNvfQ0KIyBDYXJnYSBkZSBsaWJyZXLDrWFzIA0KIyBJbnN0YWxhciBwYWNtYW4gaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikNCg0KcGFjbWFuOjpwX2xvYWQodGlkeXZlcnNlLCBmdW5Nb2RlbGluZywgZ3QsIGdvb2dsZXNoZWV0czQsZ3QsIENHUGZ1bmN0aW9ucywNCiAgICAgICAgICAgICAgIGV4dHJhZm9udCwgc2NhbGVzLCBnZ2FsdCwga2FibGVFeHRyYSwgd29yZGNsb3VkLCBuZXR3b3JrRDMsDQogICAgICAgICAgICAgICBkYXRhLnRhYmxlKQ0KDQoNCiMgQ2FyZ2EgZGUgRGF0b3MgLS0tLQ0KIyBEYXRvcyAtLS0tLS0tLQ0KDQojIyAyMDIxIC0tLS0NCg0KIyBFbmN1ZXN0YQ0Ka2l3aTIxIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcjRoci9raXdpMjAyMS9tYWluL2RhdGEvcmhfMjAyMS5jc3YiLA0KICAgICAgICAgICAgICAgICAgIHNlcCA9ICI7IiwNCiAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICJVVEYtOCIpIA0KDQoNCmtpd2kyMV9vcmlnaW5hbCA8LSByZWFkX3NoZWV0KCIxbmhwcURXdUpvV2hpVmowcklhVjUxLVNkZm5TeFRwYlYzVmNkM2lZbXlUdyIpDQoNCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAgICMgTW9kaWZpY2EgbGEgdmlzdWFsaXphY2nDs24gZGUgbG9zIGVqZXMgbnVtw6lyaWNvIGEgdmFsb3JlcyBub21pbmFsZXMNCg0KbG9hZGZvbnRzKHF1aWV0ID0gVFJVRSkgIyBQZXJtaXRlIGNhcmdhciBlbiBSIG90cm9zIHRpcG9zIGRlIGZ1ZW50ZXMuDQoNCiMgRXN0aWxvIGxpbXBpbyBzaW4gbMOtbmVhcyBkZSBmb25kbw0KZXN0aWxvIDwtIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0ZCRkNGQyIpLA0KICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiUm9ib3RvIikpDQoNCiMgRXN0aWxvIGxpbXBpbyBjb24gbMOtbmVhcyBkZSByZWZlcmVuY2lhIHZlcnRpY2FsZXMgZW4gZ3JpcyBjbGFybw0KZXN0aWxvdiA8LSB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkJGQ0ZDIiksDQogICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjQUVCNkJGIiksDQogICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlJvYm90byIpKQ0KDQojIEVzdGlsbyBsaW1waW8gY29uIGzDrW5lYXMgZGUgcmVmZXJlbmNpYSBob3Jpem9udGFsZXMgZW4gZ3JpcyBjbGFybw0KZXN0aWxvaCA8LSB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkJGQ0ZDIiksDQogICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICIjQUVCNkJGIiksDQogICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlJvYm90byIpKQ0KDQpnZW5lcm8gPC0gYygiIzFGQzNBQSIsICIjODYyNEY1IiwgIiNGRkQxMjkiLCAiIzc1ODM4RiIpICMgVmVyZGUgLSBWaW9sZXRhIC0gQW1hcmlsbG8gLSBHcmlzDQpnZW5lcm8zIDwtIGMoIiM4NjI0RjUiLCIjRkZEMTI5IiwgIiMxRkMzQUEiKQ0KDQpjb2xvcmVzIDwtICBjKCIjODYyNEY1IiwgIiMxRkMzQUEiKQ0KDQphenVsIDwtICIjMzQ0RDdFIg0KdmVyZGUgPC0gICIjNEE5RkM3Ig0Kcm9zYTEgPC0gIiNCOTUxOTIiDQpyb3NhMiA8LSAiI0VFNTc3NyINCm5hcmFuamEgPC0gIiNGRjc2NEMiDQphbWFyaWxsbyA8LSAiI0ZGQTYwMCINCmdyaXMgPC0gIiM3NTgzOEYiDQpsaWxhIDwtICIjNzU1Mzk1Ig0Kcm9qbyA8LSAiIzk0MzEyNiINCg0KY29sNCA8LSBjKGF6dWwsIGxpbGEsIHJvc2ExLCByb3NhMikNCmNvbDUgPC0gYyhhenVsLCBsaWxhLCByb3NhMSwgcm9zYTIsIG5hcmFuamEpDQpjb2w2IDwtIGMoYXp1bCwgbGlsYSwgcm9zYTEsIHJvc2EyLCBuYXJhbmphLCBhbWFyaWxsbykNCg0KIyBDcmVvIHVuIG9iamV0byBjb24gdW4gdGV4dG8gcXVlIHNlIHZhIGEgcmVwZXRpciBtdWNobyBhIGxvIGxhcmdvIGRlbCBhbsOhbGlzaXMNCmZ1ZW50ZSA8LSAiRnVlbnRlOiBFbmN1ZXN0YSBLSVdJIGRlIFN1ZWxkb3MgZGUgUlJISCBwYXJhIExhdGFtIDIwMjEiDQoNCiMgQ3JlbyBvYmpldG9zIHBhcmEgZm9ybWF0ZWFyIGxhcyBldGlxdWV0YXMgbnVtw6lyaWNhcyBkZSBsb3MgZWplcyB4IGUgeQ0KZWplX3hfbiA8LSBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWFfZm9ybWF0KGJpZy5tYXJrID0gIi4iLCBkZWNpbWFsLm1hcmsgPSAiLCIpKQ0KDQplamVfeV9uIDwtIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoYmlnLm1hcmsgPSAiLiIsIGRlY2ltYWwubWFyayA9ICIsIikpDQoNCg0KIyMjIyMgVnVlbHRhIGEgbGEgT2ZpY2luYSAjIyMjDQoNCnZ1ZWx0YTwta2l3aTIxICU+JSANCiAgc2VsZWN0KHBhaXMsIHRyYWJham8sIHJ1YnJvLCBvcmlnZW5fY2FwaXRhbCxub21icmVfYXJlYSwgdGVsZXRyYWJham86dmFsb3JhY2lvbl9nZXN0aW9uX3BhbmRlbWlhKQ0KDQpgYGANCg0KQSBjb250aW51YWNpw7NuIHByZXNlbnRhbW9zIGxhcyByZXNwdWVzdGFzIG9idGVuaWRhcyBlbiByZWxhY2nDs24gYWwgcmV0b3JubyBhbCB0cmFiYWpvIHByZXNlbmNpYWwuIA0KDQojIyBUZWxldHJhYmFqbyAmIFByZXNlbmNpYWwNCg0KUG9kZW1vcyBvYnNlcnZhciBjaWVydGEgZXF1aWRhZCBlbnRyZSBsb3MgcXVlIGVzdGFuIGhhY2llbmRvIHRyYWJham8gcmVtb3RvLCBhcXVlbGxvcyBxdWUgY29udGludWFuIGJham8gbGEgbW9kYWxpZGFkIGEgZGlzdGFuY2lhIHkgcXVpZW5lcyBhbHRlcm5hbiAgbGEgbW9kYWxpZGFkIHByZXNlbmNpYWwgeSB0ZWxldHJhYmFqbzogDQoNCmBgYHtyfQ0KDQpraXdpMjEgJT4lIA0KICBncm91cF9ieSh0ZWxldHJhYmFqbykgJT4lIA0KICBmaWx0ZXIodGVsZXRyYWJham8gIT0nTkEnKSU+JSANCiAgdGFsbHkoc29ydCA9IFQpICU+JSANCiAgICBtdXRhdGUodGVsZXRyYWJham8gPSBmY3RfY29sbGFwc2UodGVsZXRyYWJham8sICJNaXh0byIgPSAiVm95IHJvdGFuZG8gZW50cmUgbGEgb2ZpY2luYSB5IGVsIHRlbGV0cmFiYWpvIikpJT4lIA0KICByZW5hbWUoIlRlbGV0cmFiYWpvIiA9IHRlbGV0cmFiYWpvLA0KICAgICAgICAiUmVzcHVlc3RhcyIgPSBuKSAlPiUgDQogIGtibChjYXB0aW9uID0gIlJlc3B1ZXN0YXMgVGVsZXRyYWJham8iLCApICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlKQ0KDQpgYGANCg0KIyMgQ29tcGFyYXRpdmEgY29uIHBhw61zZXMNCg0KRW50cmUgbG9zIHBhw61zZXMgY29uIG1heW9yIGNhbnRpZGFkIGRlIHJlc3B1ZXN0YXMsIHZlbW9zIHF1ZSAgZW4gZWwgY2FzbyBkZSBBcmdlbnRpbmEgZGljaGEgZGlzdHJpYnVjacOzbiAgZXJhICBwYXJlamEgYWwgbW9tZW50byBkZSBsYSBlbmN1ZXN0YSwgc2llbmRvIGRlc3RhY2FibGUgbGEgY2F0ZWdvcsOtYSBtaXh0YSwgZW50ZW5kaWVuZG8gcG9yIHRhbGVzIGEgcXVpZW5lcyB0cmFiYWphbiBlbiBsYSBvZmljaW5hIHkgZW4gZm9ybWEgcmVtb3RhLg0KDQpMYXMgbGliZXJhY2lvbmVzIHBhdWxhdGluYXMgeSBlbiBmb3JtYSBjcmVjaWVudGUgYSBuaXZlbCBOYWNpb25hbCBwb2Ryw61hIHNlciB1bmEgZGUgbGFzIGV4cGxpY2FjaW9uZXMgZGVsIHJlZ3Jlc28gYSBsYXMgb2ZpY2luYXMuIA0KU2Vyw61hIGludGVyZXNhbnRlIGV2YWx1YXIgZGUgcXVpZW5lcyByZWFsaXphbiB0ZWxldHJhYmFqbywgY3VhbnRvcyBkZSBlbGxvcyBsbyBoYWNpYW4gcHJldmlvIGEgbGEgcGFuZGVtaWEgIHkgbHVlZ28gbG8gbWFudHV2aWVyb24gY29tbyBwb2xpdGljYSBkZSBsYSBjb21wYcOxaWEgZGViaWRvIGEgbGEgZGVtYW5kYSBkZSBzdXMgaW50ZWdyYW50ZXMuDQoNClBvc2libGVtZW50ZSBzZWEgdW5hIHJlc3B1ZXN0YSBxdWUgcG9kYW1vcyByZXNwb25kZXIgZW4gcHLDs3hpbWFzIGVkaWNpb25lcy4NCg0KDQpEZWJpZG8gYSBsYXMgZXNjYXNhcyByZXNwdWVzdGFzIGRlIGxvcyBvdHJvcyBwYcOtc2VzIG5vIHBvZGVtb3MgYWRlbnRyYXJub3MgZW4gIG5pbmd1bmEgY29uY2x1c2nDs24gIGVuIHJlbGFjacOzbiBhIGVsbG9zLg0KDQoNCmBgYHtyfQ0Ka2l3aTIxICU+JSANCiAgZ3JvdXBfYnkocGFpcyx0ZWxldHJhYmFqbykgJT4lIA0KICBmaWx0ZXIodGVsZXRyYWJham8gIT0nTkEnKSU+JSANCiAgbXV0YXRlKHRlbGV0cmFiYWpvID0gZmN0X2NvbGxhcHNlKHRlbGV0cmFiYWpvLCAiTWl4dG8iID0gIlZveSByb3RhbmRvIGVudHJlIGxhIG9maWNpbmEgeSBlbCB0ZWxldHJhYmFqbyIpKSAlPiUNCiAgdGFsbHkoc29ydCA9IFQpICU+JSANCiAgZmlsdGVyKG4+NSklPiUgDQogIHJlbmFtZSgiVGVsZXRyYWJham8iID0gdGVsZXRyYWJham8sDQogICAgICAgICAiUGHDrXMiID0gcGFpcywNCiAgICAgICAgIlJlc3B1ZXN0YXMiID0gbikgJT4lIA0KICBrYmwoY2FwdGlvbiA9ICJSZXNwdWVzdGFzIFRlbGV0cmFiYWpvIiwgKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlKQ0KYGBgDQoNCg0KIyMgUG9yIFJ1YnJvIA0KDQpOb3MgaW50ZXJlc2FiYSBldmFsdWFyIHNpIGV4aXN0w61hIGFsZ3VuYSByZWxhY2nDs24gZW50cmUgIHRlbGV0cmFiYWpvIHkgbG9zIHJ1YnJvcyAgZGUgbGFzIGluZHVzdHJpYXMgZW4gbGEgcXVlIHNlIGRlc2VtcGXDsWFuIGxhcyBwZXJzb25hcyBlbmN1ZXN0YWRhcy4gDQoNCkVuIGVsIHNpZ3VpZW50ZSBjdWFkcm8gcG9kZW1vcyBvYnNlcnZhciBhcXVlbGxvcyAgcXVlIG5vIGVzdGFuIGhhY2llbmRvIHRlbGV0cmFiYWpvLCBlcyBkZWNpciBxdWUgcmVhbGl6YW4gIHRyYWJham9zIHByZXNlbmNpYWxlcy4gTG9zIG1pc21vcyAgc2UgZW5jdWVudHJhbiAgcHJpbmNpcGFsbWVudGUgZW4gIHJ1YnJvcyAgY29uIG1heW9yIG5lY2VzaWRhZCBkZSBwcmVzZW5jaWFsaWRhZCwgeWEgc2VhIHBvciBsYSBuZWNlc2lkYWQgZGUgcHJvZHVjY2nDs24gbyBkZSBwcmVzdGFjacOzbiBkZSBzZXJ2aWNpb3MuDQoNCmBgYHtyfQ0Ka2l3aTIxICU+JSANCiAgZ3JvdXBfYnkocnVicm8pICU+JSANCiAgZmlsdGVyKHRlbGV0cmFiYWpvICE9J05BJyklPiUgDQogICAgZmlsdGVyKHRlbGV0cmFiYWpvID09J05vJyklPiUgDQogIG11dGF0ZSh0ZWxldHJhYmFqbyA9IGZjdF9jb2xsYXBzZSh0ZWxldHJhYmFqbywgIk1peHRvIiA9ICJWb3kgcm90YW5kbyBlbnRyZSBsYSBvZmljaW5hIHkgZWwgdGVsZXRyYWJham8iKSkgJT4lDQogIHRhbGx5KHNvcnQgPSBUKSAlPiUgDQogIGZpbHRlcihuPjUpJT4lIA0KICByZW5hbWUoIlJ1YnJvIiA9ICdydWJybycsDQogICAgICAgICJSZXNwdWVzdGFzIiA9IG4pICU+JSANCiAgYXJyYW5nZShSZXNwdWVzdGFzKSU+JQ0KICBrYmwoY2FwdGlvbiA9ICJSZXNwdWVzdGFzIFRlbGV0cmFiYWpvIiwgKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgICAgICAgICAgICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gZnVlbnRlKQ0KDQpgYGANCg0KDQoNCiMjIE9yaWdlbiBkZWwgQ2FwaXRhbCANCg0KU2kgbm9zIGZvY2FsaXphbW9zIGVuIGxhcyBjYXRlZ29yw61hcyBtw6FzIHJlcHJlc2VudGF0aXZhcyAgZGUgcXVpZW5lcyBubyBlc3RhbiBhc2l0aWVuZG8gYSBsYXMgb2ZpY2luYXMgICBvIGRlIHF1aWVuZXMgbG8gZXN0YW4gaGFjaWVuZG8gZW4gbW9kYWxpZGFkIG1peHRhLCB2ZW1vcyB1bmEgcHJlZG9taW5hbmNpYSBlbiBsYXMgZW1wcmVzYXMgTmFjaW9uYWxlcy4NCg0KYGBge3J9DQoNCiMjIExpbXBpZXphIHZhcmlhYmxlIGdlbmVybyAtLS0tDQoNCg0KZGl2VCA8LSBraXdpMjEgJT4lIA0KICBzZWxlY3QodGVsZXRyYWJham8sIG9yaWdlbl9jYXBpdGFsKSAlPiUgDQogIGZpbHRlcih0ZWxldHJhYmFqbyE9Ik5BIiklPiUgICMgc2Ugc2FjYSwgcG9ycXVlIG5vIGVzIA0KICBmaWx0ZXIodGVsZXRyYWJham8hPSJTaSIpJT4lICAjIHNlIHNhY2EsIHBvcnF1ZSBubyBlcyANCiAgbXV0YXRlKHRlbGV0cmFiYWpvID0gZmN0X2NvbGxhcHNlKHRlbGV0cmFiYWpvLCAiTWl4dG8iID0gIlZveSByb3RhbmRvIGVudHJlIGxhIG9maWNpbmEgeSBlbCB0ZWxldHJhYmFqbyIpKSAlPiUNCiAgZ3JvdXBfYnkodGVsZXRyYWJham8sb3JpZ2VuX2NhcGl0YWwpICU+JSANCiAgc3VtbWFyaXNlIChuID0gbigpKSAlPiUgDQogIG11dGF0ZShmcmVxID0gbi9zdW0obikpICU+JSANCiAgYXJyYW5nZSgtbikNCg0KIyBDb21wdXRlIHRoZSBjdW11bGF0aXZlIHBlcmNlbnRhZ2VzICh0b3Agb2YgZWFjaCByZWN0YW5nbGUpDQpkaXZUJHltYXggPC0gY3Vtc3VtKGRpdlQkZnJlcSkNCg0KIyBDb21wdXRlIHRoZSBib3R0b20gb2YgZWFjaCByZWN0YW5nbGUNCmRpdlQkeW1pbiA8LSBjKDAsIGhlYWQoZGl2VCR5bWF4LCBuPS0xKSkNCg0KIyBDb21wdXRlIGxhYmVsIHBvc2l0aW9uDQpkaXZUJGxhYmVsUG9zaXRpb24gPC0gKGRpdlQkeW1heCArIGRpdlQkeW1pbikgLyAyDQoNCiMgQ29tcHV0ZSBhIGdvb2QgbGFiZWwNCmRpdlQkbGFiZWwgPC0gcGFzdGUwKGRpdlQkb3JpZ2VuX2NhcGl0YWwsICJcbiBDYW50OiAiLCBkaXZUJG4pDQoNCiMgTWFrZSB0aGUgcGxvdA0KZ2dwbG90KGRpdlQsIGFlcyh5bWF4PXltYXgsIHltaW49eW1pbiwgeG1heD00LCB4bWluPTMsIGZpbGw9b3JpZ2VuX2NhcGl0YWwpKSArDQogIGdlb21fcmVjdCgpICsNCiAgY29vcmRfcG9sYXIodGhldGE9InkiKSArICMgVHJ5IHRvIHJlbW92ZSB0aGF0IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjaGFydCBpcyBidWlsdCBpbml0aWFsbHkNCiAgeGxpbShjKDIsIDQpKSArIyBUcnkgdG8gcmVtb3ZlIHRoYXQgdG8gc2VlIGhvdyB0byBtYWtlIGEgcGllIGNoYXJ0DQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGModmVyZGUsIGxpbGEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlJvYm90byIpKSArDQogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgcmVzcHVlc3RhcyBzZWfDum4gT3JpZ2VuIGRlbCAgQ2FwaXRhbCIsDQogICAgICAgc3VidGl0bGUgPSAiIiwNCiAgICAgICBmaWxsID0gIk9yaWdlbiIsIA0KICAgICAgIGNhcHRpb24gPSBmdWVudGUpDQoNCmBgYA0KDQpTaSBub3MgbGltaXRhbW9zIGEgQXJnZW50aW5hLCBwYcOtcyBjb24gbWF5b3IgY2FudGlkYWQgZGUgcmVzcHVlc3RhcywgIHBvZGVtb3MgY29uZmlybWFyIHF1ZSAgc2UgbWFudGllbmUgbGEgbWlzbWEgdGVuZGVuY2lhLiBEaWNoYSByZWxhY2nDs24gZ3VhcmRhIGNpZXJ0YSBsw7NnaWNhIGNvbiBsYSBlc3RydWN0dXJhIHByb2R1Y3RpdmEgTmFjaW9uYWwsIGNvbiBtYXlvciBwcmVzZW5jaWEgZGUgZW1wcmVzYXMgTmFjaW9uYWxlcy4gDQoNClBvciBvdHJhIHBhcnRlLCB0YW1iacOpbiBwb2RyaWFtb3Mgc3Vwb25lciBxdWUgbGFzIG1pc21hcyBubyB0aWVuZW4gIHRyYWRpY2nDs24gZW4gIGltcGxlbWVudGFyIHkgbWFudGVuZXIgZW4gZWwgdGllbXBvIHBvbMOtdGljYXMgZGUgdHJhYmFqbyByZW1vdG8sIHNpbiBlbWJhcmdvIGNhcmVjZW1vcyBkZSBlbGVtZW50b3Mgc3VmaWNpZW50ZXMgIHBhcmEgcmVhbGl6YXIgZGljaG8gYW7DoWxpc2lzLiANCg0KYGBgIHtyfQ0KDQpkaXZUMiA8LSBraXdpMjEgJT4lIA0KICBzZWxlY3QocGFpcywgdGVsZXRyYWJham8sIG9yaWdlbl9jYXBpdGFsKSAlPiUgDQogIGZpbHRlcihwYWlzID09IkFyZ2VudGluYSIpJT4lIA0KICBmaWx0ZXIodGVsZXRyYWJham8hPSJOQSIpJT4lICAjIHNlIHNhY2EsIHBvcnF1ZSBubyBlcyANCiAgZmlsdGVyKHRlbGV0cmFiYWpvIT0iU2kiKSU+JSAgIyBzZSBzYWNhLCBwb3JxdWUgbm8gZXMgDQogIG11dGF0ZSh0ZWxldHJhYmFqbyA9IGZjdF9jb2xsYXBzZSh0ZWxldHJhYmFqbywgIk1peHRvIiA9ICJWb3kgcm90YW5kbyBlbnRyZSBsYSBvZmljaW5hIHkgZWwgdGVsZXRyYWJham8iKSkgJT4lDQogIGdyb3VwX2J5KHRlbGV0cmFiYWpvLG9yaWdlbl9jYXBpdGFsKSAlPiUgDQogIHN1bW1hcmlzZSAobiA9IG4oKSkgJT4lIA0KICBtdXRhdGUoZnJlcSA9IG4vc3VtKG4pKSAlPiUgDQogIGFycmFuZ2UoLW4pDQoNCiMgQ29tcHV0ZSB0aGUgY3VtdWxhdGl2ZSBwZXJjZW50YWdlcyAodG9wIG9mIGVhY2ggcmVjdGFuZ2xlKQ0KZGl2VDIkeW1heCA8LSBjdW1zdW0oZGl2VDIkZnJlcSkNCg0KIyBDb21wdXRlIHRoZSBib3R0b20gb2YgZWFjaCByZWN0YW5nbGUNCmRpdlQyJHltaW4gPC0gYygwLCBoZWFkKGRpdlQyJHltYXgsIG49LTEpKQ0KDQojIENvbXB1dGUgbGFiZWwgcG9zaXRpb24NCmRpdlQkbGFiZWxQb3NpdGlvbiA8LSAoZGl2VDIkeW1heCArIGRpdlQkeW1pbikgLyAyDQoNCiMgQ29tcHV0ZSBhIGdvb2QgbGFiZWwNCmRpdlQyJGxhYmVsIDwtIHBhc3RlMChkaXZUMiRvcmlnZW5fY2FwaXRhbCwgIlxuIENhbnQ6ICIsIGRpdlQkbikNCg0KIyBNYWtlIHRoZSBwbG90DQpnZ3Bsb3QoZGl2VDIsIGFlcyh5bWF4PXltYXgsIHltaW49eW1pbiwgeG1heD00LCB4bWluPTMsIGZpbGw9b3JpZ2VuX2NhcGl0YWwpKSArDQogIGdlb21fcmVjdCgpICsNCiAgY29vcmRfcG9sYXIodGhldGE9InkiKSArICMgVHJ5IHRvIHJlbW92ZSB0aGF0IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjaGFydCBpcyBidWlsdCBpbml0aWFsbHkNCiAgeGxpbShjKDIsIDQpKSArIyBUcnkgdG8gcmVtb3ZlIHRoYXQgdG8gc2VlIGhvdyB0byBtYWtlIGEgcGllIGNoYXJ0DQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGModmVyZGUsIGxpbGEpKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlJvYm90byIpKSArDQogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgZGUgcmVzcHVlc3RhcyBzZWfDum4gT3JpZ2VuIGRlbCAgQ2FwaXRhbCIsDQogICAgICAgc3VidGl0bGUgPSAiIEFyZ2VudGluYSIsDQogICAgICAgZmlsbCA9ICJPcmlnZW4iLCANCiAgICAgICBjYXB0aW9uID0gZnVlbnRlKQ0KYGBgDQoNCiMjICBQbGFuZXMgZGUgcmV0b3JubyANCg0KUmVzcGVjdG8gYSBsb3MgcGxhbmVzIGRlIHJldG9ybm8sIG9ic2VydmFtb3MgcXVlIGVsIDQ1JSB0aWVuZSBwbGFuZWFkbyB1biByZXRvcm5vIG1peHRvLCBzZWd1aWRvIHBvciB1biAzMCUgY29uIHByZXNlbmNpYWxpZGFkIHBsZW5hLiBBbCBtb21lbnRvIGRlIGxhIGVuY3Vlc3RhLCB1biBncnVwbyBubyBtZW5vciAgYcO6biBubyB0ZW7DrWEgIHBsYW5lcyBlbiBhZ2VuZGEsIHJlcHJlc2VudGFuZG8gZWwgMjAlIGRlIGxhcyByZXNwdWVzdGFzIG9idGVuaWRhcy4NClBvciDDumx0aW1vLCAgdGFuIHNvbG8gdW4gNSUgcGxhbmlmaWPDsyBlbCByZXRvcm5vIG1hbnRlbmllbmRvIGVsIHRyYWJham8gcmVtb3RvICBlbiBmb3JtYSBleGNsdXNpdmEuIA0KDQpgYGB7cn0NCg0KdnVlbHRhJHJldG9ybm9fcGxhbiA8LSBmYWN0b3IodnVlbHRhJHJldG9ybm9fcGxhbiwgbGV2ZWxzID0gYygiUmVtb3RvIDEwMCUiLCAiRW4gZXZhbHVhY2nDs24iLCJQcmVzZW5jaWFsIDEwMCUiLCJNaXh0byIgKSkNCnJfcGxhbjwtdnVlbHRhICU+JSANCiAgc2VsZWN0KHJldG9ybm9fcGxhbikgJT4lDQpmaWx0ZXIocmV0b3Jub19wbGFuIT0iTkEiKSAlPiUgDQogIG11dGF0ZShjdWVudGEgPSAxKSAlPiUgDQogIGdyb3VwX2J5KHJldG9ybm9fcGxhbikgJT4lDQogIHN1bW1hcmlzZSAobiA9IG4oKSkgJT4lIA0KICBtdXRhdGUoZnJlcSA9IG4vc3VtKG4pKSAlPiUgDQogIGFycmFuZ2UoLW4pDQoNCmBgYA0KDQpgYGB7cn0NCg0KdnVlbHRhICU+JSANCiAgc2VsZWN0KHJldG9ybm9fcGxhbikgJT4lIA0KICBmaWx0ZXIocmV0b3Jub19wbGFuIT0iTkEiKSAlPiUgDQogIGdyb3VwX2J5KHJldG9ybm9fcGxhbikgJT4lIA0KICBjb3VudCgpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBuLCB5ID0gcmV0b3Jub19wbGFuKSkgKw0KICBnZW9tX2NvbChmaWxsID0gYXp1bCkgKw0KICBlc3RpbG92ICsNCiAgbGFicyh0aXRsZSA9ICJSZXNwdWVzdGFzIHBvciBQbGFuIGRlIFJldG9ybm8iLCANCiAgICAgICB4ID0gIiIsIHkgPSAiIiwgDQogICAgICAgY2FwdGlvbiA9IGZ1ZW50ZSkNCg0KDQpgYGANCg0KIyMgTWVzIGRlIHJldG9ybm8NCg0KTm9zIGludGVyZXNhYmEgaW5kYWdhciBlbnRyZSBxdWllbmVzIHBsYW5lYWJhbiBlbCByZXRvcm5vIGEgbGFzIG9maWNpbmFzLCB5YSBzZWEgZW4gZm9ybWEgcHJlc2VuY2lhbCBvIG1peHRhLCBzaSB0ZW5pYW4gZGVmaW5pZG8gdW4gIHBlcsOtb2RvIGRlIHJldG9ybm8uIA0KDQpVbiAzMiUgZGUgbGFzIHBlcnNvbmFzICBlbmN1ZXN0YWRhcywgeWEgaGFiw61hIHJldG9tYWRvIGFjdGl2aWRhZGVzIHByZXNlbmNpYWxlcy4gQ2F0ZWdvcsOtYSBzZWd1aWRhIHBvciB1biAyNSUsIHF1aWVuZXMgcG9yIGVudG9uY2VzIGHDum4gIG5vIHRlbsOtYW4gIGRpZmluaWNpw7NuIGFsZ3VuYS4gUGFyYSBxdWllbmVzIGVzdGFiYW4gcGxhbmVhbmRvIGxhIHZ1ZWx0YSBlbiBOb3ZpZW1icmUgZGUgMjAyMSwgc3Vwb25lbW9zIHF1ZSBhbCBtb21lbnRvIGRlIGVzY3JpYmlyIGVzdGFzIGxpbmVhcyB5YSBzZSAgZW5jdWVudHJhbiBwcmVzdGFuZG8gc2VydmljaW8gZW4gZm9ybWEgcHJlc2VuY2lhbDsgZWwgcmVzdG8gZGUgbG9zIG1lc2VzIGNvbXBhcnRlIHNpbWlsYXIgcmVsZXZhbmNpYSBwb3JjZW50dWFsLiAgRW4gZWwgY2FzbyBkZSBsYSBjYXRlZ29yw61hICJNYXJ6byIsICBzZSByZWZpZXJlIGEgdG9kb3MgbG9zIHF1ZSB0ZW5pYW4gIHBlbnNhZGEgbGEgIHZ1ZWx0YSBkZXNkZSBNYXJ6byAyMDIyICBlbiBhZGVsYW50ZSwgc2llbmRvIHVuIDclIGRlIGxhcyAgcGVyc29uYXMgZW5jdWVzdGFkYXMuDQoNCg0KYGBge3J9DQpyX3BlcjwtdnVlbHRhICU+JSANCiAgc2VsZWN0KHJldG9ybm9fbWVzKSAlPiUNCmZpbHRlcihyZXRvcm5vX21lcyE9Ik5BIikgJT4lIA0KICBtdXRhdGUoY3VlbnRhID0gMSkgJT4lIA0KICBncm91cF9ieShyZXRvcm5vX21lcykgJT4lDQogIHN1bW1hcmlzZSAobiA9IG4oKSkgJT4lIA0KICBtdXRhdGUoZnJlcSA9IG4vc3VtKG4pKSAlPiUgDQogIGFycmFuZ2UoLW4pDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpyX21lczwtIHZ1ZWx0YSAlPiUgDQogIHNlbGVjdChyZXRvcm5vX3BsYW4sIHJldG9ybm9fbWVzKSAlPiUgDQogIGZpbHRlcihyZXRvcm5vX3BsYW4hPSAiUmVtb3RvIDEwMCUiKSU+JSANCiAgZmlsdGVyKHJldG9ybm9fcGxhbiE9Ik5BIikgJT4lIA0KICBmaWx0ZXIocmV0b3Jub19tZXMhPSJOQSIpICU+JSANCiAgICBmaWx0ZXIocmV0b3Jub19tZXMhPSJObyBhcGxpY2EiKSAlPiUgDQogIG11dGF0ZShyZXRvcm5vX21lcz1mY3RfY29sbGFwc2UocmV0b3Jub19tZXMsICJEaWMiID0gIkRpY2llbWJyZSAyMDIxIiksDQogICAgICAgIHJldG9ybm9fbWVzPWZjdF9jb2xsYXBzZShyZXRvcm5vX21lcywgIk5vdiIgPSAiTm92aWVtYnJlIDIwMjEiKSwNCiAgICAgICAgIHJldG9ybm9fbWVzPWZjdF9jb2xsYXBzZShyZXRvcm5vX21lcywgIkVuZSIgPSAiRW5lcm8gMjAyMiIpLA0KICAgICAgICAgIHJldG9ybm9fbWVzPWZjdF9jb2xsYXBzZShyZXRvcm5vX21lcywgIkZlYiIgPSAiRmVicmVybyAyMDIyIiksDQogICAgICAgICAgcmV0b3Jub19tZXM9ZmN0X2NvbGxhcHNlKHJldG9ybm9fbWVzLCAiTWFyIiA9ICJNYXJ6byAyMDIyIGVuIGFkZWxhbnRlIiksDQogICAgICAgICAgcmV0b3Jub19tZXM9ZmN0X2NvbGxhcHNlKHJldG9ybm9fbWVzLCAiQWN0dWFsIiA9ICJZYSB2b2x2aW1vcyAxMDAlIiksDQogICAgICAgICAgcmV0b3Jub19tZXM9ZmN0X2NvbGxhcHNlKHJldG9ybm9fbWVzLCAiUy9EZWYiID0gIk5vIGVzdGEgZGVmaW5pZG8iKSkgJT4lIA0KICBmaWx0ZXIocmV0b3Jub19tZXMhPSJBY3R1YWwiKSAjIHZlciBxdcOpICBoYWNlciBjb24gZXN0YSBjYXRlZ29yaWENCg0KDQoNCnJfbWVzJHJldG9ybm9fbWVzIDwtIGZhY3RvcihyX21lcyRyZXRvcm5vX21lcywgbGV2ZWxzID0gYyggIk5vdiIsICJEaWMiLCJFbmUiLCJGZWIiLCAiTWFyIiwgIlMvRGVmIikpDQoNCg0Kcl9tZXMgJT4lIA0KICBzZWxlY3QocmV0b3Jub19tZXMpICU+JSANCiAgbXV0YXRlKGN1ZW50YSA9IDEpICU+JSANCiAgZ3JvdXBfYnkocmV0b3Jub19tZXMpICU+JQ0KICBzdW1tYXJpc2UgKG4gPSBuKCkpICU+JSANCiAgYXJyYW5nZSgtbiklPiUgDQogIGdncGxvdChhZXMoeCA9IHJldG9ybm9fbWVzLCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZmlsbCA9IGF6dWwpICsNCiAgZXN0aWxvaCArDQogIGVqZV95X24gKw0KICBsYWJzKHRpdGxlID0gIk1lcyBkZSBSZXRvcm5vIiwNCiAgICAgICBzdWJ0aXRsZSA9ICAiMjAyMSAtMjAyMiIsDQogICAgICAgeCA9ICIiLCB5ID0gIiIsDQogICAgICAgY2FwdGlvbiA9IGZ1ZW50ZSkNCg0KYGBgDQoNCiMjIERlY2lzacOzbiBkZSBSZXRvcm5vDQoNCg0KRWwgcmV0b3JubyBhIGxhcyBvZmljaW5hcyBubyBwYXJlY2Ugc2VyIHVuYSBkZWNpc2nDs24gZGUgbGFzIHBlcnNvbmFzIGVuY3VlbnRhZGFzLCB5YSBxdWUgc29sbyBlbCAyJSAgZXhwcmVzw7MgZGljaG8gaW50ZXLDqXMsIGVuIHVuYSBjbGFyYSBjb250cmFwb3NpY2nDs24gYWwgNzIlIHF1ZSBleHByZXPDsyBxdWUgbGEgbWlzbWEgZXJhIHVuYSAgZGVjaXNpw7NuICB1bmlsYXRlcmFsIGRlIGxhcyBlbXByZXNhcy4gDQpFcyBpbnRlcmVzYW50ZSBkZXN0YWNhciB1biAyNSUgZGUgbG9zIGVuY3Vlc3RhZG9zLCBjdXlhIGRlY2lzacOzbiBkZSByZXRvcm5vIGZ1ZSB0b21hZGEgZW4gZm9ybWEgY29uanVudGEuIA0KDQoNClNpIGJpZW4gIHNlcsOtYSByZWNvbWVuZGFibGUgbG9ncmFyIHVuICBlcXVpbGlicmlvIHBhcmEgbGFzIHBhcnRlcyAgeSByZWNvbm9jZXIgcXVlIG5vIGhheSB1bmEgc29sdWNpw7NuDQrDum5pY2EsIHNpbm8gcXVlIGRlcGVuZGVyw6EgZGUgbGEgZW1wcmVzYSwgbGEgaW5kdXN0cmlhIHkgbGEgY3VsdHVyYSBvcmdhbml6YWNpb25hbCwgIHNlcsOhIGZ1bmRhbWVudGFsIHBhcmEgbGFzIGVtcHJlc2FzIGV2YWx1YXIgZW4gcXXDqSBjb25kaWNpb25lcyBzZSBlbmN1ZW50cmEgbGEgZ2VudGUgcXVlIHJldG9tYSwgeWEgcXVlIHNpIGxvcyBuw7ptZXJvcyBkZSAgbGFzIG7Ds21pbmFzIHJlcGxpY2FuIGxhcyB0ZW5kZW5jaWFzIHByZXNlbnRhZGFzIGVuIGxhIHByZXNlbnRlIGVuY3Vlc3RhLCBzZXLDoSBkaWZpY2lsIGNvbnNlZ3VpciAgdW5hIGFkZWN1YWRhIGV4cGVyaWVuY2lhIHBvc2l0aXZhIHBhcmEgc3VzIGNvbGFib3JhZG9yZXMgcHVlc3RvIHF1ZSBsYSBkaXN0YW5jaWEgZGUgaW50ZXJlc2VzIGVzIGNvbnNpZGVyYWJsZW1lbnRlIGFtcGxpYS4gDQoNCg0KYGBge3J9DQpkZWMxPC12dWVsdGEgJT4lIA0KICBzZWxlY3QocmV0b3Jub19kZWNpc2lvbikgJT4lDQpmaWx0ZXIocmV0b3Jub19kZWNpc2lvbiE9Ik5BIikgJT4lIA0KICBmaWx0ZXIocmV0b3Jub19kZWNpc2lvbiE9Ik5vIGFwbGljYSIpICU+JQ0KICBtdXRhdGUoY3VlbnRhID0gMSkgJT4lIA0KICBncm91cF9ieShyZXRvcm5vX2RlY2lzaW9uKSAlPiUNCiAgc3VtbWFyaXNlIChuID0gbigpKSAlPiUgDQogIG11dGF0ZShmcmVxID0gbi9zdW0obikpICU+JSANCiAgYXJyYW5nZSgtbikNCiAgDQpgYGANCg0KQSB0cmF2w6lzIGRlbCBzaWd1aWVudGUgZ3LDoWZpY28sIG9ic2VydmFtb3MgZW4gcXXDqSB0aXBvIGRlIGVtcHJlc2FzIHRyYWJhamFuIGxhcyBwZXJzb25hcyBxdWUgcmVzcG9uZGllcm9uIGxhIGVuY3Vlc3RhIHkgbGEgcmVsYWNpw7NuIGNvbiBsYSBkZWNpc2nDs24gZGUgcmV0b3Juby4NCg0KYGBge3J9DQoNCg0KDQpyX2RlYyA8LSB2dWVsdGEgJT4lIA0KICBzZWxlY3QocmV0b3Jub19kZWNpc2lvbiwgb3JpZ2VuX2NhcGl0YWwpICU+JQ0KZmlsdGVyKHJldG9ybm9fZGVjaXNpb24hPSJOQSIpICU+JQ0KICBmaWx0ZXIocmV0b3Jub19kZWNpc2lvbiE9Ik5vIGFwbGljYSIpICU+JQ0KZmlsdGVyKG9yaWdlbl9jYXBpdGFsIT0iTkEiKQ0KDQpyX2RlYyRyZXRvcm5vX2RlY2lzaW9uIDwtIGZhY3RvcihyX2RlYyRyZXRvcm5vX2RlY2lzaW9uLCBsZXZlbHMgPSBjKCAiRGUgbGEgZW1wcmVzYSIsICJEZSBjb23Dum4gYWN1ZXJkbyIsIkRlbCBlbXBsZWFkbyIpKQ0KDQoNCmdncGxvdChyX2RlYywgKGFlcyh4ID0gcmV0b3Jub19kZWNpc2lvbiwgZmlsbCA9IG9yaWdlbl9jYXBpdGFsKSkpICsgI1RpcG8gZGUgdW5pdmVyc2lkYWQgeSBjYXJnbw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzNjApKSArIA0KICBsYWJzKHg9IiIseT0iIikgKw0KICAgIGVzdGlsb3YgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKGdyaXMsIHZlcmRlLCBhenVsKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIlJlc3B1ZXN0YXMgc2Vnw7puIGRlY2lzacOzbiBkZSByZXRvcm5vIHkgb3JpZ2VuIGRlIGNhcGl0YWwiLA0KICAgICAgIHN1YnRpdGxlID0gIiIsDQogICAgICAgeCA9ICIiLCBmaWxsID0gIk9yaWdlbiBkZWwgQ2FwaXRhbCIsDQogICAgICAgY2FwdGlvbiA9IGZ1ZW50ZSkNCg0KYGBgDQoNCiMjIETDrWFzIGRlIHJldG9ybm8NCg0KUG9yIMO6bHRpbW8sIGVuIGxhIHNpZ3VpZW50ZSB0YWJsZSBwb2RlbW9zIHZlciBsYSBjYW50aWRhZCBkZSBkw61hcyBkZSByZXRvcm5vIGEgbGFzIG9maWNpbmFzIGluZm9ybWFkbyBwb3IgbGFzIHBlcnNvbmFzIGNvbnN1bHRhZGFzOg0KDQpgYGB7cn0NCg0Kcl9kaWE8LSB2dWVsdGEgJT4lIA0KICBzZWxlY3QocmV0b3Jub19wbGFuLCByZXRvcm5vX2RpYXMpICU+JSANCiAgZmlsdGVyKHJldG9ybm9fcGxhbiE9ICJSZW1vdG8gMTAwJSIpJT4lIA0KICBmaWx0ZXIocmV0b3Jub19wbGFuIT0iTkEiKSAlPiUgDQogIGZpbHRlcihyZXRvcm5vX2RpYXMhPSJOQSIpICU+JSANCiAgICBmaWx0ZXIocmV0b3Jub19kaWFzIT0iTm8gYXBsaWNhIikgJT4lIA0KICBtdXRhdGUocmV0b3Jub19kaWFzPWZjdF9jb2xsYXBzZShyZXRvcm5vX2RpYXMsICJMaWJyZSIgPSAiQSBlbGVjY2nDs24gZGUgY2FkYSBlbXBsZWFkbyIpLA0KICAgICAgICByZXRvcm5vX2RpYXM9ZmN0X2NvbGxhcHNlKHJldG9ybm9fZGlhcywgIjEiID0gIjEgZMOtYSIpLA0KICAgICAgICByZXRvcm5vX2RpYXM9ZmN0X2NvbGxhcHNlKHJldG9ybm9fZGlhcywgIjIiID0gIjIgZMOtYXMiKSwNCiAgICAgICAgIHJldG9ybm9fZGlhcz1mY3RfY29sbGFwc2UocmV0b3Jub19kaWFzLCAiMyIgPSAiMyBkw61hcyIpLA0KICAgICAgICAgIHJldG9ybm9fZGlhcz1mY3RfY29sbGFwc2UocmV0b3Jub19kaWFzLCAiNCIgPSAiNCBkw61hcyIpLA0KICAgICAgICAgIHJldG9ybm9fZGlhcz1mY3RfY29sbGFwc2UocmV0b3Jub19kaWFzLCAiNSIgPSAiNSBkw61hcyIpLA0KICAgICAgICAgIHJldG9ybm9fZGlhcz1mY3RfY29sbGFwc2UocmV0b3Jub19kaWFzLCAiQWN0dWFsIiA9ICI1IGTDrWFzIikpDQoNCg0KDQpyX2RpYSAlPiUgDQogIHNlbGVjdChyZXRvcm5vX2RpYXMpICU+JQ0KZmlsdGVyKHJldG9ybm9fZGlhcyE9Ik5BIikgJT4lIA0KICBmaWx0ZXIocmV0b3Jub19kaWFzIT0iTm8gYXBsaWNhIikgJT4lDQogIG11dGF0ZShjdWVudGEgPSAxKSAlPiUgDQogIGdyb3VwX2J5KHJldG9ybm9fZGlhcykgJT4lDQogIHN1bW1hcmlzZSAobiA9IG4oKSkgJT4lIA0KICBhcnJhbmdlKHJldG9ybm9fZGlhcyklPiUgDQogICByZW5hbWUoIkTDrWFzIiA9ICdyZXRvcm5vX2RpYXMnLA0KICAgICAgICAgICJSZXNwdWVzdGFzIiA9ICduJyklPiUgDQogIGtibChjYXB0aW9uID0gIkNhbnRpZGFkIGRlIETDrWFzIHByZXNlbmNpYWxlcyIsICkgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgICAgICAgICAgICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKSU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9IGZ1ZW50ZSkNCg0KYGBgDQoNCg0K