======================================================================================================================

Lectura inicial

# Lectura habitual
datos <- read.csv("ParqueAutomotor_Aire/DATOS_DE_CALIDAD_DEL_AIRE_EN_COLOMBIA_2011-2017.csv")

# Con biblioteca data.table
datos <- data.table::fread(file = "DATOS_DE_CALIDAD_DEL_AIRE_EN_COLOMBIA_2011-2017.csv",
                           sep = ",", dec = ".")

Datos de calidad de aire

Conversión a formato .Rdata

# Conversión a formato .Rdata
save(datos, file = "aire.Rdata", compress = "xz")

Cargando datos en formato .Rdata

load("ParqueAutomotor_Aire/aire.Rdata")

Estructura interna

str(datos)
'data.frame':   15657064 obs. of  16 variables:
 $ Fecha                         : Factor w/ 61368 levels "01/01/2011 01:00:00 a. m.",..: 46965 46968 46946 46948 46950 46952 46954 46956 46958 46960 ...
 $ Autoridad.Ambiental           : Factor w/ 27 levels "AMVA","CAM","CAR",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Nombre.de.la.estación         : Factor w/ 337 levels "Aeropuerto","Albania",..: 15 15 15 15 15 15 15 15 15 15 ...
 $ Tecnología                    : Factor w/ 2 levels "Automática","Manual": 1 1 1 1 1 1 1 1 1 1 ...
 $ Latitud                       : num  6.33 6.33 6.33 6.33 6.33 ...
 $ Longitud                      : num  -75.6 -75.6 -75.6 -75.6 -75.6 ...
 $ Código.del.departamento       : int  5 5 5 5 5 5 5 5 5 5 ...
 $ Departamento                  : Factor w/ 23 levels "ANTIOQUIA","ARAUCA",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Código.del.municipio          : int  5088 5088 5088 5088 5088 5088 5088 5088 5088 5088 ...
 $ Nombre.del.municipio          : Factor w/ 150 levels "AGUSTÍN CODAZZI",..: 16 16 16 16 16 16 16 16 16 16 ...
 $ Tipo.de.estación              : Factor w/ 2 levels "Fija","Indicativa": 1 1 1 1 1 1 1 1 1 1 ...
 $ Tiempo.de.exposición          : int  1 1 1 1 1 1 1 1 1 1 ...
 $ Variable                      : Factor w/ 20 levels "CO","Dirección del Viento",..: 8 8 8 8 8 8 8 8 8 8 ...
 $ Unidades                      : Factor w/ 9 levels "%","°","°C","m/s",..: 9 9 9 9 9 9 9 9 9 9 ...
 $ Concentración                 : num  4.88 22.41 48.72 95.86 116.58 ...
 $ Nueva.columna.georreferenciada: Factor w/ 329 levels "(1.216489, -77.282944)",..: 234 234 234 234 234 234 234 234 234 234 ...

Depuración de datos

Datos de aire por departamento

# Bibliotecas
library(dplyr)
library(lubridate)

# Depuración
aire <- datos %>% 
  mutate(Fecha = as.Date(as.character(Fecha), format = "%d/%m/%Y"),
         Año = year(Fecha)) %>% 
  select(Año, Departamento, Nombre.del.municipio, Tiempo.de.exposición,
         Variable, Unidades, Concentración) %>% 
  rename(mpio = Nombre.del.municipio, texpo = Tiempo.de.exposición)

aire <- aire %>% 
  mutate(Año = factor(Año))

# Datos por departamento
filtro <- c("CO", "NO", "NO2", "O3", "PM10", "PM2.5", "PST", "SO2")
depto_aire <- aire %>%
  filter(Variable %in% filtro) %>% 
  group_by(Año, Departamento, Variable, Unidades) %>% 
  summarise(promedio = round(mean(Concentración), digits = 2),
            minimo = round(min(Concentración), digits = 2),
            maximo = round(max(Concentración), digits = 2),
            mediana = round(median(Concentración), digits = 2),
            p98 = round(quantile(Concentración, probs = 0.98), digits = 2))
head(depto_aire)

# Guardando datos de aire por departamento
save(depto_aire, file = "ParqueAutomotor_Aire/Aire_depto.Rdata")

Datos de aire por municipio

# Datos por municipio
mpio_aire <- aire %>%
  filter(Variable %in% filtro) %>% 
  group_by(Año, mpio, Variable, Unidades) %>% 
  summarise(promedio = round(mean(Concentración), digits = 2),
            minimo = round(min(Concentración), digits = 2),
            maximo = round(max(Concentración), digits = 2),
            mediana = round(median(Concentración), digits = 2),
            p98 = round(quantile(Concentración, probs = 0.98), digits = 2))
head(mpio_aire)

# Guardando datos de aire por municipio
save(mpio_aire, file = "ParqueAutomotor_Aire/Aire_mpio.Rdata")

Datos parque automotor

Por departamento

Datos 2013

auto13 <- data.table::fread(file = "ParqueAutomotor_Aire/Parque_Automotor_2013.csv",
                               sep = ",", dec = ".")

# Datos por departamento
auto13_depto <- auto13 %>%
  group_by(Departamento) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2013", 32))

auto13_depto

Datos 2014

auto14 <- data.table::fread(file = "ParqueAutomotor_Aire/Parque_Automotor_2014.csv",
                               sep = ",", dec = ".")

# Datos por departamento
auto14_depto <- auto14 %>%
  group_by(Departamento) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2014", 32))

auto14_depto

Datos 2015

auto15 <- data.table::fread(file = "ParqueAutomotor_Aire/Parque_Automotor_2015.csv",
                               sep = ",", dec = ".")

# Datos por departamento
auto15_depto <- auto15 %>%
  group_by(Departamento) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2015", 32))

auto15_depto

Datos 2016

auto16 <- data.table::fread(file = "ParqueAutomotor_Aire/Parque_Automotor_2016.csv",
                               sep = ",", dec = ".")

# Datos por departamento 
auto16_depto <- auto16 %>%
  group_by(Departamento) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2016", 32))

auto16_depto

Datos 2017

auto17 <- data.table::fread(file = "ParqueAutomotor_Aire/Parque_Automotor_2017.csv",
                               sep = ",", dec = ".")

# Datos por departamento 
auto17_depto <- auto17 %>%
  group_by(Departamento) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2017", 32))

auto17_depto

Parque automotor por departamento 2013-2017

autos_depto <- rbind(auto13_depto, auto14_depto, auto15_depto, auto16_depto,
                     auto17_depto)
save(autos_depto, file = "ParqueAutomotor_Aire/Autos_depto.Rdata")
load("ParqueAutomotor_Aire/Autos_depto.Rdata")
autos_depto

Por municipio

Datos 2013

# Datos por Ciudad
auto13_Ciudad <- auto13 %>%
  group_by(Ciudad) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2013", n()))

auto13_Ciudad

Datos 2014

# Datos por Ciudad en 
auto14_Ciudad <- auto14 %>%
  group_by(Ciudad) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2014", n()))

auto14_Ciudad

Datos 2015

# Datos por Ciudad en 
auto15_Ciudad <- auto15 %>%
  group_by(Ciudad) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2015", n()))

auto15_Ciudad

Datos 2016

# Datos por Ciudad
auto16_Ciudad <- auto16 %>%
  group_by(Ciudad) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2016", n()))

auto16_Ciudad

Datos 2017

auto17_Ciudad <- auto17 %>%
  group_by(Ciudad) %>% 
  summarise(Total = n()) %>% 
  mutate(Año = rep("2017", n()))

auto17_Ciudad

Parque automotor por municipio 2013-2017

autos_ciudad <- rbind(auto13_Ciudad, auto14_Ciudad, auto15_Ciudad, auto16_Ciudad,
                      auto17_Ciudad)
save(autos_ciudad, file = "ParqueAutomotor_Aire/Autos_ciudad.Rdata")
load("ParqueAutomotor_Aire/Autos_ciudad.Rdata")
autos_ciudad

Unión de datos

Por departamento

# Lectura de datos de aire por departamento y año
load("ParqueAutomotor_Aire/Aire_depto.Rdata")
depto_aire <- depto_aire %>% 
  ungroup() %>% 
  mutate(Departamento = tolower(Departamento),
         Departamento = gsub("á", "a", Departamento),
         Departamento = gsub("é", "e", Departamento),
         Departamento = gsub("í", "i", Departamento),
         Departamento = gsub("ó", "o", Departamento),
         Departamento = gsub("ú", "u", Departamento))

# Lectura de datos parque automotor por departamento y año
load("ParqueAutomotor_Aire/Autos_depto.Rdata")
autos_depto <- autos_depto %>% 
  mutate(Departamento = tolower(Departamento),
         Departamento = gsub("á", "a", Departamento),
         Departamento = gsub("é", "e", Departamento),
         Departamento = gsub("í", "i", Departamento),
         Departamento = gsub("ó", "o", Departamento),
         Departamento = gsub("ú", "u", Departamento))

# Unión de datos
df_depto <- inner_join(depto_aire, autos_depto, by = c("Departamento", "Año"))

# Guardando y cargando datos df_depto
save(df_depto, file = "ParqueAutomotor_Aire/df_depto.Rdata")
load("ParqueAutomotor_Aire/df_depto.Rdata")

df_depto

Por municipio

# Lectura de datoa de aire por municipio y año
load("ParqueAutomotor_Aire/Aire_mpio.Rdata")
mpio_aire <- mpio_aire %>% 
  ungroup() %>% 
  mutate(mpio = tolower(mpio),
         mpio = gsub("á", "a", mpio),
         mpio = gsub("é", "e", mpio),
         mpio = gsub("í", "i", mpio),
         mpio = gsub("ó", "o", mpio),
         mpio = gsub("ú", "u", mpio))

# Lectura de datos parque automotor por municipio y año
load("ParqueAutomotor_Aire/Autos_ciudad.Rdata")
autos_mpio <- autos_ciudad %>%
  rename(mpio = Ciudad) %>% 
  mutate(mpio = tolower(mpio),
         mpio = gsub("á", "a", mpio),
         mpio = gsub("é", "e", mpio),
         mpio = gsub("í", "i", mpio),
         mpio = gsub("ó", "o", mpio),
         mpio = gsub("ú", "u", mpio))

# Unión de datos
df_mpio <- inner_join(mpio_aire, autos_mpio, by = c("mpio", "Año"))

# Guardando y cargando datos df_mpio
save(df_mpio, file = "ParqueAutomotor_Aire/df_mpio.Rdata")
load("ParqueAutomotor_Aire/df_mpio.Rdata")
df_mpio

Gráficos exploratorios

Por departamento

# Datos necesarios para graficar
load("ParqueAutomotor_Aire/df_depto.Rdata") # datos completos por departamento

# Ajustando datos por departamento
df_depto <- df_depto %>% 
  mutate(Año = factor(Año),
         Departamento = factor(Departamento)) %>% 
  droplevels()
  • Estructura interna:
str(df_depto)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   295 obs. of  10 variables:
 $ Año         : Factor w/ 5 levels "2013","2014",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Departamento: Factor w/ 22 levels "antioquia","arauca",..: 1 1 1 1 1 1 1 5 6 6 ...
 $ Variable    : Factor w/ 8 levels "CO","NO","NO2",..: 1 2 3 4 5 6 7 5 5 6 ...
 $ Unidades    : Factor w/ 1 level "µg/m3": 1 1 1 1 1 1 1 1 1 1 ...
 $ promedio    : num  1397.1 24 31.4 33.6 51.5 ...
 $ minimo      : num  115 0 0 0 1 ...
 $ maximo      : num  8363 412 670 242 472 ...
 $ mediana     : num  1145.6 11 28.2 23.4 46.5 ...
 $ p98         : num  4238.7 122 84.9 118.2 120 ...
 $ Total       : int  130860 130860 130860 130860 130860 130860 130860 12466 18462 18462 ...

Parque automotor vs calidad de aire promedio

# Biblioteca ggplot2, tidyr y RColorBrewer
library(ggplot2)
library(tidyr)

# Identificación de filas con datos atípicos
which(df_depto$Variable == "NO" & df_depto$promedio >= 40)    # fila 231
which(df_depto$Variable == "NO2" & df_depto$promedio >= 100)  # fila 291
which(df_depto$Variable == "O3" & df_depto$promedio >= 100)   # fila 243
which(df_depto$Variable == "PM10" & df_depto$promedio >= 100) # fila 280
which(df_depto$Variable == "PM2.5" & df_depto$promedio >= 40) # fila 239
which(df_depto$Variable == "SO2" & df_depto$promedio >= 500)  # fila 264

# Vector de filas a seleccionar
filas <- c(which(df_depto$Variable == "NO" & df_depto$promedio >= 40),
           which(df_depto$Variable == "NO2" & df_depto$promedio >= 100),
           which(df_depto$Variable == "O3" & df_depto$promedio >= 100),
           which(df_depto$Variable == "PM10" & df_depto$promedio >= 100),
           which(df_depto$Variable == "PM2.5" & df_depto$promedio >= 40),
           which(df_depto$Variable == "SO2" & df_depto$promedio >= 500))

# Relación del parque automotor vs calidad de aire
df_depto %>%
  slice(-filas)%>% 
  ggplot(data = ., mapping = aes(x = Total, y = promedio)) +
  facet_wrap(facets = ~Variable, scales = "free_y") +
  geom_point() +
  geom_smooth(method = lm, se = FALSE, aes(color = "blue"), lwd = 0.7) +
  geom_smooth(method = "loess", se = FALSE,  aes(color = "red"), lwd = 0.7) +
  scale_color_identity(guide = "legend",
                       name = "Modelo:",
                       breaks = c("blue", "red"),
                       labels = c("Lineal", "Loess")) +
  labs(x = "Número de carros (n)", y = "Promedio µg/m3",
       title = "Relación del parque automotor vs calidad de aire",
       subtitle = "Colombia 2013-2017", 
       caption = "Cada punto representa un departamento.") +
  theme_linedraw() +
  theme(legend.position = "bottom")

Parque automotor vs calidad de aire Percentil 98

df_depto %>%
  slice(-filas)%>% 
  ggplot(data = ., mapping = aes(x = Total, y = p98)) +
  facet_wrap(facets = ~Variable, scales = "free_y") +
  geom_point() +
  geom_smooth(method = lm, se = FALSE, aes(color = "blue"), lwd = 0.7) +
  geom_smooth(method = "loess", se = FALSE,  aes(color = "red"), lwd = 0.7) +
  scale_color_identity(guide = "legend",
                       name = "Modelo:",
                       breaks = c("blue", "red"),
                       labels = c("Lineal", "Loess")) +
  labs(x = "Número de carros (n)", y = "Percentil 98 µg/m3",
       title = "Relación del parque automotor vs calidad de aire",
       subtitle = "Colombia 2013-2017", 
       caption = "Cada punto representa un departamento.") +
  theme_linedraw() +
  theme(legend.position = "bottom")
  

Por municipio

# Datos necesarios para graficar
load("ParqueAutomotor_Aire/df_mpio.Rdata")  # datos completos por municipio

# Ajustando datos por municipio
df_mpio <- df_mpio %>% 
  mutate(Año = factor(Año),
         mpio = factor(mpio)) %>% 
  droplevels()
  • Estructura interna:
# Estructura interna df_depto
str(df_mpio)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   632 obs. of  10 variables:
 $ Año     : Factor w/ 5 levels "2013","2014",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ mpio    : Factor w/ 73 levels "agustin codazzi",..: 2 2 6 7 7 9 9 9 9 10 ...
 $ Variable: Factor w/ 8 levels "CO","NO","NO2",..: 5 7 5 4 5 2 3 4 5 1 ...
 $ Unidades: Factor w/ 1 level "µg/m3": 1 1 1 1 1 1 1 1 1 1 ...
 $ promedio: num  29.2 59.9 20.6 33.6 29.1 ...
 $ minimo  : num  5.24 19.74 10 0.2 10.13 ...
 $ maximo  : num  77.9 110.7 40 188.8 54.3 ...
 $ mediana : num  27.1 56.4 20 29.1 28.5 ...
 $ p98     : num  69.4 105 30.8 83.4 52 ...
 $ Total   : int  197 197 6470 780 780 1713 1713 1713 1713 11000 ...

Parque automotor vs calidad de aire promedio

# Identificación de filas con datos atípicos
which(df_mpio$Variable == "NO" & df_mpio$promedio >= 90)    
which(df_depto$Variable == "NO2" & df_mpio$promedio >= 250)
which(df_depto$Variable == "O3" & df_mpio$promedio >= 500)
which(df_depto$Variable == "PM10" & df_mpio$promedio >= 100)
which(df_depto$Variable == "SO2" & df_mpio$promedio >= 500)

# Vector de filas a seleccionar
filas2 <- c(which(df_mpio$Variable == "NO" & df_mpio$promedio >= 90),
           which(df_depto$Variable == "NO2" & df_mpio$promedio >= 250),
           which(df_depto$Variable == "O3" & df_mpio$promedio >= 500),
           which(df_depto$Variable == "PM10" & df_mpio$promedio >= 100),
           which(df_depto$Variable == "SO2" & df_mpio$promedio >= 500))

# Relación del parque automotor vs calidad de aire
df_mpio %>%
  slice(-filas2) %>%   
  ggplot(data = ., mapping = aes(x = Total, y = promedio)) +
  facet_wrap(facets = ~Variable, scales = "free_y") +
  geom_point() +
  geom_smooth(method = lm, se = FALSE, aes(color = "blue"), lwd = 0.7) +
  geom_smooth(method = "loess", se = FALSE,  aes(color = "red"), lwd = 0.7) +
  scale_color_identity(guide = "legend",
                       name = "Modelo:",
                       breaks = c("blue", "red"),
                       labels = c("Lineal", "Loess")) +
  labs(x = "Número de carros (n)", y = "Promedio µg/m3",
       title = "Relación del parque automotor vs calidad de aire",
       subtitle = "Colombia 2013-2017", 
       caption = "Cada punto representa un municipio.") +
  theme_linedraw() +
  theme(legend.position = "bottom")

Parque automotor vs calidad de aire Percentil 98

df_mpio %>%
  slice(-filas2)%>% 
  ggplot(data = ., mapping = aes(x = Total, y = p98)) +
  facet_wrap(facets = ~Variable, scales = "free_y") +
  geom_point() +
  geom_smooth(method = lm, se = FALSE, aes(color = "blue"), lwd = 0.7) +
  geom_smooth(method = "loess", se = FALSE,  aes(color = "red"), lwd = 0.7) +
  scale_color_identity(guide = "legend",
                       name = "Modelo:",
                       breaks = c("blue", "red"),
                       labels = c("Lineal", "Loess")) +
  labs(x = "Número de carros (n)", y = "Percentil 98 µg/m3",
       title = "Relación del parque automotor vs calidad de aire",
       subtitle = "Colombia 2013-2017", 
       caption = "Cada punto representa un municipio.") +
  theme_linedraw() +
  theme(legend.position = "bottom")s
  

LS0tCnRpdGxlOiAiQW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZWwgcGFycXVlIGF1dG9tb3RvciB2cyBsYSBjYWxpZGFkIGRlbCBhaXJlIgpzdWJ0aXRsZTogIkNvbG9tYmlhIDIwMTMtMjAxNyIKYXV0aG9yOiAiRWRpbWVyIERhdmlkIEphcmFtaWxsbyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoqKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qKgpgYGB7ciwgZWNobz1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBlY2hvID0gVFJVRSkgICAgICAgICAgICAgICAgICAgICAgIApgYGAKCiMgTGVjdHVyYSBpbmljaWFsCgpgYGB7cn0KIyBMZWN0dXJhIGhhYml0dWFsCmRhdG9zIDwtIHJlYWQuY3N2KCJQYXJxdWVBdXRvbW90b3JfQWlyZS9EQVRPU19ERV9DQUxJREFEX0RFTF9BSVJFX0VOX0NPTE9NQklBXzIwMTEtMjAxNy5jc3YiKQoKIyBDb24gYmlibGlvdGVjYSBkYXRhLnRhYmxlCmRhdG9zIDwtIGRhdGEudGFibGU6OmZyZWFkKGZpbGUgPSAiREFUT1NfREVfQ0FMSURBRF9ERUxfQUlSRV9FTl9DT0xPTUJJQV8yMDExLTIwMTcuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCBkZWMgPSAiLiIpCmBgYAoKIyBEYXRvcyBkZSBjYWxpZGFkIGRlIGFpcmUKCiMjIENvbnZlcnNpw7NuIGEgZm9ybWF0byBgLlJkYXRhYAoKYGBge3J9CiMgQ29udmVyc2nDs24gYSBmb3JtYXRvIC5SZGF0YQpzYXZlKGRhdG9zLCBmaWxlID0gImFpcmUuUmRhdGEiLCBjb21wcmVzcyA9ICJ4eiIpCmBgYAoKIyMgQ2FyZ2FuZG8gZGF0b3MgZW4gZm9ybWF0byBgLlJkYXRhYAoKYGBge3J9CmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL2FpcmUuUmRhdGEiKQpgYGAKCiMjIEVzdHJ1Y3R1cmEgaW50ZXJuYQoKYGBge3J9CnN0cihkYXRvcykKYGBgCgojIyBEZXB1cmFjacOzbiBkZSBkYXRvcwoKIyMjIERhdG9zIGRlIGFpcmUgcG9yIGRlcGFydGFtZW50bwoKYGBge3J9CiMgQmlibGlvdGVjYXMKbGlicmFyeShkcGx5cikKbGlicmFyeShsdWJyaWRhdGUpCgojIERlcHVyYWNpw7NuCmFpcmUgPC0gZGF0b3MgJT4lIAogIG11dGF0ZShGZWNoYSA9IGFzLkRhdGUoYXMuY2hhcmFjdGVyKEZlY2hhKSwgZm9ybWF0ID0gIiVkLyVtLyVZIiksCiAgICAgICAgIEHDsW8gPSB5ZWFyKEZlY2hhKSkgJT4lIAogIHNlbGVjdChBw7FvLCBEZXBhcnRhbWVudG8sIE5vbWJyZS5kZWwubXVuaWNpcGlvLCBUaWVtcG8uZGUuZXhwb3NpY2nDs24sCiAgICAgICAgIFZhcmlhYmxlLCBVbmlkYWRlcywgQ29uY2VudHJhY2nDs24pICU+JSAKICByZW5hbWUobXBpbyA9IE5vbWJyZS5kZWwubXVuaWNpcGlvLCB0ZXhwbyA9IFRpZW1wby5kZS5leHBvc2ljacOzbikKCmFpcmUgPC0gYWlyZSAlPiUgCiAgbXV0YXRlKEHDsW8gPSBmYWN0b3IoQcOxbykpCgojIERhdG9zIHBvciBkZXBhcnRhbWVudG8KZmlsdHJvIDwtIGMoIkNPIiwgIk5PIiwgIk5PMiIsICJPMyIsICJQTTEwIiwgIlBNMi41IiwgIlBTVCIsICJTTzIiKQpkZXB0b19haXJlIDwtIGFpcmUgJT4lCiAgZmlsdGVyKFZhcmlhYmxlICVpbiUgZmlsdHJvKSAlPiUgCiAgZ3JvdXBfYnkoQcOxbywgRGVwYXJ0YW1lbnRvLCBWYXJpYWJsZSwgVW5pZGFkZXMpICU+JSAKICBzdW1tYXJpc2UocHJvbWVkaW8gPSByb3VuZChtZWFuKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIG1pbmltbyA9IHJvdW5kKG1pbihDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBtYXhpbW8gPSByb3VuZChtYXgoQ29uY2VudHJhY2nDs24pLCBkaWdpdHMgPSAyKSwKICAgICAgICAgICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBwOTggPSByb3VuZChxdWFudGlsZShDb25jZW50cmFjacOzbiwgcHJvYnMgPSAwLjk4KSwgZGlnaXRzID0gMikpCmhlYWQoZGVwdG9fYWlyZSkKCiMgR3VhcmRhbmRvIGRhdG9zIGRlIGFpcmUgcG9yIGRlcGFydGFtZW50bwpzYXZlKGRlcHRvX2FpcmUsIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvQWlyZV9kZXB0by5SZGF0YSIpCmBgYAoKYGBge3J9CiMgQmlibGlvdGVjYXMKbGlicmFyeShkcGx5cikKbGlicmFyeShsdWJyaWRhdGUpCgojIERlcHVyYWNpw7NuCmFpcmUgPC0gZGF0b3MgJT4lIAogIG11dGF0ZShGZWNoYSA9IGFzLkRhdGUoYXMuY2hhcmFjdGVyKEZlY2hhKSwgZm9ybWF0ID0gIiVkLyVtLyVZIiksCiAgICAgICAgIEHDsW8gPSB5ZWFyKEZlY2hhKSkgJT4lIAogIHNlbGVjdChBw7FvLCBEZXBhcnRhbWVudG8sIE5vbWJyZS5kZWwubXVuaWNpcGlvLCBUaWVtcG8uZGUuZXhwb3NpY2nDs24sCiAgICAgICAgIFZhcmlhYmxlLCBVbmlkYWRlcywgQ29uY2VudHJhY2nDs24pICU+JSAKICByZW5hbWUobXBpbyA9IE5vbWJyZS5kZWwubXVuaWNpcGlvLCB0ZXhwbyA9IFRpZW1wby5kZS5leHBvc2ljacOzbikKCmFpcmUgPC0gYWlyZSAlPiUgCiAgbXV0YXRlKEHDsW8gPSBmYWN0b3IoQcOxbykpCgojIERhdG9zIHBvciBkZXBhcnRhbWVudG8KZmlsdHJvIDwtIGMoIkNPIiwgIk5PIiwgIk5PMiIsICJPMyIsICJQTTEwIiwgIlBNMi41IiwgIlBTVCIsICJTTzIiKQpkZXB0b19haXJlIDwtIGFpcmUgJT4lCiAgZmlsdGVyKFZhcmlhYmxlICVpbiUgZmlsdHJvKSAlPiUgCiAgZ3JvdXBfYnkoQcOxbywgRGVwYXJ0YW1lbnRvLCBWYXJpYWJsZSwgVW5pZGFkZXMpICU+JSAKICBzdW1tYXJpc2UocHJvbWVkaW8gPSByb3VuZChtZWFuKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIG1pbmltbyA9IHJvdW5kKG1pbihDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBtYXhpbW8gPSByb3VuZChtYXgoQ29uY2VudHJhY2nDs24pLCBkaWdpdHMgPSAyKSwKICAgICAgICAgICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBwOTggPSByb3VuZChxdWFudGlsZShDb25jZW50cmFjacOzbiwgcHJvYnMgPSAwLjk4KSwgZGlnaXRzID0gMikpCmhlYWQoZGVwdG9fYWlyZSkKCiMgR3VhcmRhbmRvIGRhdG9zIGRlIGFpcmUgcG9yIGRlcGFydGFtZW50bwpzYXZlKGRlcHRvX2FpcmUsIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvQWlyZV9kZXB0by5SZGF0YSIpCmBgYAoKCgojIyMgRGF0b3MgZGUgYWlyZSBwb3IgbXVuaWNpcGlvCgpgYGB7cn0KIyBEYXRvcyBwb3IgbXVuaWNpcGlvCm1waW9fYWlyZSA8LSBhaXJlICU+JQogIGZpbHRlcihWYXJpYWJsZSAlaW4lIGZpbHRybykgJT4lIAogIGdyb3VwX2J5KEHDsW8sIG1waW8sIFZhcmlhYmxlLCBVbmlkYWRlcykgJT4lIAogIHN1bW1hcmlzZShwcm9tZWRpbyA9IHJvdW5kKG1lYW4oQ29uY2VudHJhY2nDs24pLCBkaWdpdHMgPSAyKSwKICAgICAgICAgICAgbWluaW1vID0gcm91bmQobWluKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIG1heGltbyA9IHJvdW5kKG1heChDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBtZWRpYW5hID0gcm91bmQobWVkaWFuKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIHA5OCA9IHJvdW5kKHF1YW50aWxlKENvbmNlbnRyYWNpw7NuLCBwcm9icyA9IDAuOTgpLCBkaWdpdHMgPSAyKSkKaGVhZChtcGlvX2FpcmUpCgojIEd1YXJkYW5kbyBkYXRvcyBkZSBhaXJlIHBvciBtdW5pY2lwaW8Kc2F2ZShtcGlvX2FpcmUsIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvQWlyZV9tcGlvLlJkYXRhIikKYGBgCgpgYGB7cn0KIyBEYXRvcyBwb3IgbXVuaWNpcGlvCm1waW9fYWlyZSA8LSBhaXJlICU+JQogIGZpbHRlcihWYXJpYWJsZSAlaW4lIGZpbHRybykgJT4lIAogIGdyb3VwX2J5KEHDsW8sIG1waW8sIFZhcmlhYmxlLCBVbmlkYWRlcykgJT4lIAogIHN1bW1hcmlzZShwcm9tZWRpbyA9IHJvdW5kKG1lYW4oQ29uY2VudHJhY2nDs24pLCBkaWdpdHMgPSAyKSwKICAgICAgICAgICAgbWluaW1vID0gcm91bmQobWluKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIG1heGltbyA9IHJvdW5kKG1heChDb25jZW50cmFjacOzbiksIGRpZ2l0cyA9IDIpLAogICAgICAgICAgICBtZWRpYW5hID0gcm91bmQobWVkaWFuKENvbmNlbnRyYWNpw7NuKSwgZGlnaXRzID0gMiksCiAgICAgICAgICAgIHA5OCA9IHJvdW5kKHF1YW50aWxlKENvbmNlbnRyYWNpw7NuLCBwcm9icyA9IDAuOTgpLCBkaWdpdHMgPSAyKSkKaGVhZChtcGlvX2FpcmUpCgojIEd1YXJkYW5kbyBkYXRvcyBkZSBhaXJlIHBvciBtdW5pY2lwaW8Kc2F2ZShtcGlvX2FpcmUsIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvQWlyZV9tcGlvLlJkYXRhIikKYGBgCgoKIyBEYXRvcyBwYXJxdWUgYXV0b21vdG9yCgojIyBQb3IgZGVwYXJ0YW1lbnRvCgojIyMgRGF0b3MgMjAxMwoKYGBge3J9CmF1dG8xMyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlID0gIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL1BhcnF1ZV9BdXRvbW90b3JfMjAxMy5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCBkZWMgPSAiLiIpCgojIERhdG9zIHBvciBkZXBhcnRhbWVudG8KYXV0bzEzX2RlcHRvIDwtIGF1dG8xMyAlPiUKICBncm91cF9ieShEZXBhcnRhbWVudG8pICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxMyIsIDMyKSkKCmF1dG8xM19kZXB0bwpgYGAKCmBgYHtyfQphdXRvMTMgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9QYXJxdWVfQXV0b21vdG9yXzIwMTMuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgZGVjID0gIi4iKQoKIyBEYXRvcyBwb3IgZGVwYXJ0YW1lbnRvIAphdXRvMTNfZGVwdG8gPC0gYXV0bzEzICU+JQogIGdyb3VwX2J5KERlcGFydGFtZW50bykgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDEzIiwgMzIpKQoKYXV0bzEzX2RlcHRvCmBgYAoKIyMjIERhdG9zIDIwMTQKCmBgYHtyfQphdXRvMTQgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9QYXJxdWVfQXV0b21vdG9yXzIwMTQuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgZGVjID0gIi4iKQoKIyBEYXRvcyBwb3IgZGVwYXJ0YW1lbnRvCmF1dG8xNF9kZXB0byA8LSBhdXRvMTQgJT4lCiAgZ3JvdXBfYnkoRGVwYXJ0YW1lbnRvKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTQiLCAzMikpCgphdXRvMTRfZGVwdG8KYGBgCgpgYGB7cn0KYXV0bzE0IDwtIGRhdGEudGFibGU6OmZyZWFkKGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvUGFycXVlX0F1dG9tb3Rvcl8yMDE0LmNzdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLCIsIGRlYyA9ICIuIikKCiMgRGF0b3MgcG9yIGRlcGFydGFtZW50bwphdXRvMTRfZGVwdG8gPC0gYXV0bzE0ICU+JQogIGdyb3VwX2J5KERlcGFydGFtZW50bykgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDE0IiwgMzIpKQoKYXV0bzE0X2RlcHRvCmBgYAoKIyMjIERhdG9zIDIwMTUKCmBgYHtyfQphdXRvMTUgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9QYXJxdWVfQXV0b21vdG9yXzIwMTUuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgZGVjID0gIi4iKQoKIyBEYXRvcyBwb3IgZGVwYXJ0YW1lbnRvCmF1dG8xNV9kZXB0byA8LSBhdXRvMTUgJT4lCiAgZ3JvdXBfYnkoRGVwYXJ0YW1lbnRvKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTUiLCAzMikpCgphdXRvMTVfZGVwdG8KYGBgCgpgYGB7cn0KYXV0bzE1IDwtIGRhdGEudGFibGU6OmZyZWFkKGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvUGFycXVlX0F1dG9tb3Rvcl8yMDE1LmNzdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLCIsIGRlYyA9ICIuIikKCiMgRGF0b3MgcG9yIGRlcGFydGFtZW50bwphdXRvMTVfZGVwdG8gPC0gYXV0bzE1ICU+JQogIGdyb3VwX2J5KERlcGFydGFtZW50bykgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDE1IiwgMzIpKQoKYXV0bzE1X2RlcHRvCmBgYAoKIyMjIERhdG9zIDIwMTYKCmBgYHtyfQphdXRvMTYgPC0gZGF0YS50YWJsZTo6ZnJlYWQoZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9QYXJxdWVfQXV0b21vdG9yXzIwMTYuY3N2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgZGVjID0gIi4iKQoKIyBEYXRvcyBwb3IgZGVwYXJ0YW1lbnRvIAphdXRvMTZfZGVwdG8gPC0gYXV0bzE2ICU+JQogIGdyb3VwX2J5KERlcGFydGFtZW50bykgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDE2IiwgMzIpKQoKYXV0bzE2X2RlcHRvCmBgYAoKYGBge3J9CmF1dG8xNiA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlID0gIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL1BhcnF1ZV9BdXRvbW90b3JfMjAxNi5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCBkZWMgPSAiLiIpCgojIERhdG9zIHBvciBkZXBhcnRhbWVudG8gCmF1dG8xNl9kZXB0byA8LSBhdXRvMTYgJT4lCiAgZ3JvdXBfYnkoRGVwYXJ0YW1lbnRvKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTYiLCAzMikpCgphdXRvMTZfZGVwdG8KYGBgCgojIyMgRGF0b3MgMjAxNwoKYGBge3J9CmF1dG8xNyA8LSBkYXRhLnRhYmxlOjpmcmVhZChmaWxlID0gIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL1BhcnF1ZV9BdXRvbW90b3JfMjAxNy5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIiwiLCBkZWMgPSAiLiIpCgojIERhdG9zIHBvciBkZXBhcnRhbWVudG8gCmF1dG8xN19kZXB0byA8LSBhdXRvMTcgJT4lCiAgZ3JvdXBfYnkoRGVwYXJ0YW1lbnRvKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTciLCAzMikpCgphdXRvMTdfZGVwdG8KYGBgCgpgYGB7cn0KYXV0bzE3IDwtIGRhdGEudGFibGU6OmZyZWFkKGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvUGFycXVlX0F1dG9tb3Rvcl8yMDE3LmNzdiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiLCIsIGRlYyA9ICIuIikKCiMgRGF0b3MgcG9yIGRlcGFydGFtZW50byAKYXV0bzE3X2RlcHRvIDwtIGF1dG8xNyAlPiUKICBncm91cF9ieShEZXBhcnRhbWVudG8pICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxNyIsIDMyKSkKCmF1dG8xN19kZXB0bwpgYGAKCgojIyMgUGFycXVlIGF1dG9tb3RvciBwb3IgZGVwYXJ0YW1lbnRvIDIwMTMtMjAxNwoKYGBge3J9CmF1dG9zX2RlcHRvIDwtIHJiaW5kKGF1dG8xM19kZXB0bywgYXV0bzE0X2RlcHRvLCBhdXRvMTVfZGVwdG8sIGF1dG8xNl9kZXB0bywKICAgICAgICAgICAgICAgICAgICAgYXV0bzE3X2RlcHRvKQpzYXZlKGF1dG9zX2RlcHRvLCBmaWxlID0gIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL0F1dG9zX2RlcHRvLlJkYXRhIikKbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvQXV0b3NfZGVwdG8uUmRhdGEiKQphdXRvc19kZXB0bwpgYGAKCmBgYHtyfQphdXRvc19kZXB0byA8LSByYmluZChhdXRvMTNfZGVwdG8sIGF1dG8xNF9kZXB0bywgYXV0bzE1X2RlcHRvLCBhdXRvMTZfZGVwdG8sCiAgICAgICAgICAgICAgICAgICAgIGF1dG8xN19kZXB0bykKc2F2ZShhdXRvc19kZXB0bywgZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19kZXB0by5SZGF0YSIpCmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL0F1dG9zX2RlcHRvLlJkYXRhIikKYXV0b3NfZGVwdG8KYGBgCgojIyBQb3IgbXVuaWNpcGlvCgojIyMgRGF0b3MgMjAxMwoKYGBge3J9CiMgRGF0b3MgcG9yIENpdWRhZAphdXRvMTNfQ2l1ZGFkIDwtIGF1dG8xMyAlPiUKICBncm91cF9ieShDaXVkYWQpICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxMyIsIG4oKSkpCgphdXRvMTNfQ2l1ZGFkCmBgYAoKYGBge3J9CiMgRGF0b3MgcG9yIENpdWRhZAphdXRvMTNfQ2l1ZGFkIDwtIGF1dG8xMyAlPiUKICBncm91cF9ieShDaXVkYWQpICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxMyIsIG4oKSkpCgphdXRvMTNfQ2l1ZGFkCmBgYAoKIyMjIERhdG9zIDIwMTQKCmBgYHtyfQojIERhdG9zIHBvciBDaXVkYWQgZW4gCmF1dG8xNF9DaXVkYWQgPC0gYXV0bzE0ICU+JQogIGdyb3VwX2J5KENpdWRhZCkgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDE0IiwgbigpKSkKCmF1dG8xNF9DaXVkYWQKYGBgCgpgYGB7cn0KIyBEYXRvcyBwb3IgQ2l1ZGFkIGVuIAphdXRvMTRfQ2l1ZGFkIDwtIGF1dG8xNCAlPiUKICBncm91cF9ieShDaXVkYWQpICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxNCIsIG4oKSkpCgphdXRvMTRfQ2l1ZGFkCmBgYAoKIyMjIERhdG9zIDIwMTUKCmBgYHtyfQojIERhdG9zIHBvciBDaXVkYWQgZW4gCmF1dG8xNV9DaXVkYWQgPC0gYXV0bzE1ICU+JQogIGdyb3VwX2J5KENpdWRhZCkgJT4lIAogIHN1bW1hcmlzZShUb3RhbCA9IG4oKSkgJT4lIAogIG11dGF0ZShBw7FvID0gcmVwKCIyMDE1IiwgbigpKSkKCmF1dG8xNV9DaXVkYWQKYGBgCgpgYGB7cn0KIyBEYXRvcyBwb3IgQ2l1ZGFkIGVuIAphdXRvMTVfQ2l1ZGFkIDwtIGF1dG8xNSAlPiUKICBncm91cF9ieShDaXVkYWQpICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxNSIsIG4oKSkpCgphdXRvMTVfQ2l1ZGFkCmBgYAoKIyMjIERhdG9zIDIwMTYKCmBgYHtyfQojIERhdG9zIHBvciBDaXVkYWQKYXV0bzE2X0NpdWRhZCA8LSBhdXRvMTYgJT4lCiAgZ3JvdXBfYnkoQ2l1ZGFkKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTYiLCBuKCkpKQoKYXV0bzE2X0NpdWRhZApgYGAKCmBgYHtyfQojIERhdG9zIHBvciBDaXVkYWQKYXV0bzE2X0NpdWRhZCA8LSBhdXRvMTYgJT4lCiAgZ3JvdXBfYnkoQ2l1ZGFkKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTYiLCBuKCkpKQoKYXV0bzE2X0NpdWRhZApgYGAKCiMjIyBEYXRvcyAyMDE3CgpgYGB7cn0KYXV0bzE3X0NpdWRhZCA8LSBhdXRvMTcgJT4lCiAgZ3JvdXBfYnkoQ2l1ZGFkKSAlPiUgCiAgc3VtbWFyaXNlKFRvdGFsID0gbigpKSAlPiUgCiAgbXV0YXRlKEHDsW8gPSByZXAoIjIwMTciLCBuKCkpKQoKYXV0bzE3X0NpdWRhZApgYGAKCmBgYHtyfQphdXRvMTdfQ2l1ZGFkIDwtIGF1dG8xNyAlPiUKICBncm91cF9ieShDaXVkYWQpICU+JSAKICBzdW1tYXJpc2UoVG90YWwgPSBuKCkpICU+JSAKICBtdXRhdGUoQcOxbyA9IHJlcCgiMjAxNyIsIG4oKSkpCgphdXRvMTdfQ2l1ZGFkCmBgYAoKCiMjIyBQYXJxdWUgYXV0b21vdG9yIHBvciBtdW5pY2lwaW8gMjAxMy0yMDE3CgpgYGB7cn0KYXV0b3NfY2l1ZGFkIDwtIHJiaW5kKGF1dG8xM19DaXVkYWQsIGF1dG8xNF9DaXVkYWQsIGF1dG8xNV9DaXVkYWQsIGF1dG8xNl9DaXVkYWQsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvMTdfQ2l1ZGFkKQpzYXZlKGF1dG9zX2NpdWRhZCwgZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19jaXVkYWQuUmRhdGEiKQpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19jaXVkYWQuUmRhdGEiKQphdXRvc19jaXVkYWQKYGBgCgpgYGB7cn0KYXV0b3NfY2l1ZGFkIDwtIHJiaW5kKGF1dG8xM19DaXVkYWQsIGF1dG8xNF9DaXVkYWQsIGF1dG8xNV9DaXVkYWQsIGF1dG8xNl9DaXVkYWQsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvMTdfQ2l1ZGFkKQpzYXZlKGF1dG9zX2NpdWRhZCwgZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19jaXVkYWQuUmRhdGEiKQpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19jaXVkYWQuUmRhdGEiKQphdXRvc19jaXVkYWQKYGBgCgojIFVuacOzbiBkZSBkYXRvcwoKIyMgUG9yIGRlcGFydGFtZW50bwoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiMgTGVjdHVyYSBkZSBkYXRvcyBkZSBhaXJlIHBvciBkZXBhcnRhbWVudG8geSBhw7FvCmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL0FpcmVfZGVwdG8uUmRhdGEiKQpkZXB0b19haXJlIDwtIGRlcHRvX2FpcmUgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKERlcGFydGFtZW50byA9IHRvbG93ZXIoRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw6EiLCAiYSIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsOpIiwgImUiLCBEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDrSIsICJpIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw7MiLCAibyIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsO6IiwgInUiLCBEZXBhcnRhbWVudG8pKQoKIyBMZWN0dXJhIGRlIGRhdG9zIHBhcnF1ZSBhdXRvbW90b3IgcG9yIGRlcGFydGFtZW50byB5IGHDsW8KbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvQXV0b3NfZGVwdG8uUmRhdGEiKQphdXRvc19kZXB0byA8LSBhdXRvc19kZXB0byAlPiUgCiAgbXV0YXRlKERlcGFydGFtZW50byA9IHRvbG93ZXIoRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw6EiLCAiYSIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsOpIiwgImUiLCBEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDrSIsICJpIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw7MiLCAibyIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsO6IiwgInUiLCBEZXBhcnRhbWVudG8pKQoKIyBVbmnDs24gZGUgZGF0b3MKZGZfZGVwdG8gPC0gaW5uZXJfam9pbihkZXB0b19haXJlLCBhdXRvc19kZXB0bywgYnkgPSBjKCJEZXBhcnRhbWVudG8iLCAiQcOxbyIpKQoKIyBHdWFyZGFuZG8geSBjYXJnYW5kbyBkYXRvcyBkZl9kZXB0bwpzYXZlKGRmX2RlcHRvLCBmaWxlID0gIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL2RmX2RlcHRvLlJkYXRhIikKbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvZGZfZGVwdG8uUmRhdGEiKQoKZGZfZGVwdG8KYGBgCgpgYGB7ciwgbWVzc2FnZT1GQUxTRX0KIyBMZWN0dXJhIGRlIGRhdG9zIGRlIGFpcmUgcG9yIGRlcGFydGFtZW50byB5IGHDsW8KbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvQWlyZV9kZXB0by5SZGF0YSIpCmRlcHRvX2FpcmUgPC0gZGVwdG9fYWlyZSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoRGVwYXJ0YW1lbnRvID0gdG9sb3dlcihEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDoSIsICJhIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw6kiLCAiZSIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsOtIiwgImkiLCBEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDsyIsICJvIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw7oiLCAidSIsIERlcGFydGFtZW50bykpCgojIExlY3R1cmEgZGUgZGF0b3MgcGFycXVlIGF1dG9tb3RvciBwb3IgZGVwYXJ0YW1lbnRvIHkgYcOxbwpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9BdXRvc19kZXB0by5SZGF0YSIpCmF1dG9zX2RlcHRvIDwtIGF1dG9zX2RlcHRvICU+JSAKICBtdXRhdGUoRGVwYXJ0YW1lbnRvID0gdG9sb3dlcihEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDoSIsICJhIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw6kiLCAiZSIsIERlcGFydGFtZW50byksCiAgICAgICAgIERlcGFydGFtZW50byA9IGdzdWIoIsOtIiwgImkiLCBEZXBhcnRhbWVudG8pLAogICAgICAgICBEZXBhcnRhbWVudG8gPSBnc3ViKCLDsyIsICJvIiwgRGVwYXJ0YW1lbnRvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZ3N1Yigiw7oiLCAidSIsIERlcGFydGFtZW50bykpCgojIFVuacOzbiBkZSBkYXRvcwpkZl9kZXB0byA8LSBpbm5lcl9qb2luKGRlcHRvX2FpcmUsIGF1dG9zX2RlcHRvLCBieSA9IGMoIkRlcGFydGFtZW50byIsICJBw7FvIikpCgojIEd1YXJkYW5kbyB5IGNhcmdhbmRvIGRhdG9zIGRmX2RlcHRvCnNhdmUoZGZfZGVwdG8sIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvZGZfZGVwdG8uUmRhdGEiKQpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9kZl9kZXB0by5SZGF0YSIpCgpkZl9kZXB0bwpgYGAKCiMjIFBvciBtdW5pY2lwaW8KCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQojIExlY3R1cmEgZGUgZGF0b2EgZGUgYWlyZSBwb3IgbXVuaWNpcGlvIHkgYcOxbwpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9BaXJlX21waW8uUmRhdGEiKQptcGlvX2FpcmUgPC0gbXBpb19haXJlICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShtcGlvID0gdG9sb3dlcihtcGlvKSwKICAgICAgICAgbXBpbyA9IGdzdWIoIsOhIiwgImEiLCBtcGlvKSwKICAgICAgICAgbXBpbyA9IGdzdWIoIsOpIiwgImUiLCBtcGlvKSwKICAgICAgICAgbXBpbyA9IGdzdWIoIsOtIiwgImkiLCBtcGlvKSwKICAgICAgICAgbXBpbyA9IGdzdWIoIsOzIiwgIm8iLCBtcGlvKSwKICAgICAgICAgbXBpbyA9IGdzdWIoIsO6IiwgInUiLCBtcGlvKSkKCiMgTGVjdHVyYSBkZSBkYXRvcyBwYXJxdWUgYXV0b21vdG9yIHBvciBtdW5pY2lwaW8geSBhw7FvCmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL0F1dG9zX2NpdWRhZC5SZGF0YSIpCmF1dG9zX21waW8gPC0gYXV0b3NfY2l1ZGFkICU+JQogIHJlbmFtZShtcGlvID0gQ2l1ZGFkKSAlPiUgCiAgbXV0YXRlKG1waW8gPSB0b2xvd2VyKG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw6EiLCAiYSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw6kiLCAiZSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw60iLCAiaSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw7MiLCAibyIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw7oiLCAidSIsIG1waW8pKQoKIyBVbmnDs24gZGUgZGF0b3MKZGZfbXBpbyA8LSBpbm5lcl9qb2luKG1waW9fYWlyZSwgYXV0b3NfbXBpbywgYnkgPSBjKCJtcGlvIiwgIkHDsW8iKSkKCiMgR3VhcmRhbmRvIHkgY2FyZ2FuZG8gZGF0b3MgZGZfbXBpbwpzYXZlKGRmX21waW8sIGZpbGUgPSAiUGFycXVlQXV0b21vdG9yX0FpcmUvZGZfbXBpby5SZGF0YSIpCmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL2RmX21waW8uUmRhdGEiKQpkZl9tcGlvCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CiMgTGVjdHVyYSBkZSBkYXRvYSBkZSBhaXJlIHBvciBtdW5pY2lwaW8geSBhw7FvCmxvYWQoIlBhcnF1ZUF1dG9tb3Rvcl9BaXJlL0FpcmVfbXBpby5SZGF0YSIpCm1waW9fYWlyZSA8LSBtcGlvX2FpcmUgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKG1waW8gPSB0b2xvd2VyKG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw6EiLCAiYSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw6kiLCAiZSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw60iLCAiaSIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw7MiLCAibyIsIG1waW8pLAogICAgICAgICBtcGlvID0gZ3N1Yigiw7oiLCAidSIsIG1waW8pKQoKIyBMZWN0dXJhIGRlIGRhdG9zIHBhcnF1ZSBhdXRvbW90b3IgcG9yIG11bmljaXBpbyB5IGHDsW8KbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvQXV0b3NfY2l1ZGFkLlJkYXRhIikKYXV0b3NfbXBpbyA8LSBhdXRvc19jaXVkYWQgJT4lCiAgcmVuYW1lKG1waW8gPSBDaXVkYWQpICU+JSAKICBtdXRhdGUobXBpbyA9IHRvbG93ZXIobXBpbyksCiAgICAgICAgIG1waW8gPSBnc3ViKCLDoSIsICJhIiwgbXBpbyksCiAgICAgICAgIG1waW8gPSBnc3ViKCLDqSIsICJlIiwgbXBpbyksCiAgICAgICAgIG1waW8gPSBnc3ViKCLDrSIsICJpIiwgbXBpbyksCiAgICAgICAgIG1waW8gPSBnc3ViKCLDsyIsICJvIiwgbXBpbyksCiAgICAgICAgIG1waW8gPSBnc3ViKCLDuiIsICJ1IiwgbXBpbykpCgojIFVuacOzbiBkZSBkYXRvcwpkZl9tcGlvIDwtIGlubmVyX2pvaW4obXBpb19haXJlLCBhdXRvc19tcGlvLCBieSA9IGMoIm1waW8iLCAiQcOxbyIpKQoKIyBHdWFyZGFuZG8geSBjYXJnYW5kbyBkYXRvcyBkZl9tcGlvCnNhdmUoZGZfbXBpbywgZmlsZSA9ICJQYXJxdWVBdXRvbW90b3JfQWlyZS9kZl9tcGlvLlJkYXRhIikKbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvZGZfbXBpby5SZGF0YSIpCmRmX21waW8KYGBgCgojIEdyw6FmaWNvcyBleHBsb3JhdG9yaW9zCgojIyBQb3IgZGVwYXJ0YW1lbnRvCgpgYGB7cn0KIyBEYXRvcyBuZWNlc2FyaW9zIHBhcmEgZ3JhZmljYXIKbG9hZCgiUGFycXVlQXV0b21vdG9yX0FpcmUvZGZfZGVwdG8uUmRhdGEiKSAjIGRhdG9zIGNvbXBsZXRvcyBwb3IgZGVwYXJ0YW1lbnRvCgojIEFqdXN0YW5kbyBkYXRvcyBwb3IgZGVwYXJ0YW1lbnRvCmRmX2RlcHRvIDwtIGRmX2RlcHRvICU+JSAKICBtdXRhdGUoQcOxbyA9IGZhY3RvcihBw7FvKSwKICAgICAgICAgRGVwYXJ0YW1lbnRvID0gZmFjdG9yKERlcGFydGFtZW50bykpICU+JSAKICBkcm9wbGV2ZWxzKCkKYGBgCgogIC0gKipFc3RydWN0dXJhIGludGVybmE6KioKCmBgYHtyfQpzdHIoZGZfZGVwdG8pCmBgYAoKIyMjIFBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlIHByb21lZGlvCgpgYGB7cn0KIyBCaWJsaW90ZWNhIGdncGxvdDIsIHRpZHlyIHkgUkNvbG9yQnJld2VyCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0aWR5cikKCiMgSWRlbnRpZmljYWNpw7NuIGRlIGZpbGFzIGNvbiBkYXRvcyBhdMOtcGljb3MKd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIk5PIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDQwKSAgICAjIGZpbGEgMjMxCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJOTzIiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSAgIyBmaWxhIDI5MQp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTzMiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSAgICMgZmlsYSAyNDMKd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlBNMTAiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSAjIGZpbGEgMjgwCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJQTTIuNSIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSA0MCkgIyBmaWxhIDIzOQp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiU08yIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDUwMCkgICMgZmlsYSAyNjQKCiMgVmVjdG9yIGRlIGZpbGFzIGEgc2VsZWNjaW9uYXIKZmlsYXMgPC0gYyh3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTk8iICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gNDApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJOTzIiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTzMiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiUE0xMCIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSAxMDApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJQTTIuNSIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSA0MCksCiAgICAgICAgICAgd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlNPMiIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSA1MDApKQoKIyBSZWxhY2nDs24gZGVsIHBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlCmRmX2RlcHRvICU+JQogIHNsaWNlKC1maWxhcyklPiUgCiAgZ2dwbG90KGRhdGEgPSAuLCBtYXBwaW5nID0gYWVzKHggPSBUb3RhbCwgeSA9IHByb21lZGlvKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gflZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UsIGFlcyhjb2xvciA9ICJibHVlIiksIGx3ZCA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsICBhZXMoY29sb3IgPSAicmVkIiksIGx3ZCA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2lkZW50aXR5KGd1aWRlID0gImxlZ2VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJNb2RlbG86IiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJibHVlIiwgInJlZCIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkxpbmVhbCIsICJMb2VzcyIpKSArCiAgbGFicyh4ID0gIk7Dum1lcm8gZGUgY2Fycm9zIChuKSIsIHkgPSAiUHJvbWVkaW8gwrVnL20zIiwKICAgICAgIHRpdGxlID0gIlJlbGFjacOzbiBkZWwgcGFycXVlIGF1dG9tb3RvciB2cyBjYWxpZGFkIGRlIGFpcmUiLAogICAgICAgc3VidGl0bGUgPSAiQ29sb21iaWEgMjAxMy0yMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIkNhZGEgcHVudG8gcmVwcmVzZW50YSB1biBkZXBhcnRhbWVudG8uIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTF9CiMgQmlibGlvdGVjYSBnZ3Bsb3QyLCB0aWR5ciB5IFJDb2xvckJyZXdlcgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXIpCgojIElkZW50aWZpY2FjacOzbiBkZSBmaWxhcyBjb24gZGF0b3MgYXTDrXBpY29zCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJOTyIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSA0MCkgICAgIyBmaWxhIDIzMQp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTk8yIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDEwMCkgICMgZmlsYSAyOTEKd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIk8zIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDEwMCkgICAjIGZpbGEgMjQzCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJQTTEwIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDEwMCkgIyBmaWxhIDI4MAp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiUE0yLjUiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gNDApICMgZmlsYSAyMzkKd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlNPMiIgJiBkZl9kZXB0byRwcm9tZWRpbyA+PSA1MDApICAjIGZpbGEgMjY0CgojIFZlY3RvciBkZSBmaWxhcyBhIHNlbGVjY2lvbmFyCmZpbGFzIDwtIGMod2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIk5PIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDQwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTk8yIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDEwMCksCiAgICAgICAgICAgd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIk8zIiAmIGRmX2RlcHRvJHByb21lZGlvID49IDEwMCksCiAgICAgICAgICAgd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlBNMTAiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gMTAwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiUE0yLjUiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gNDApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJTTzIiICYgZGZfZGVwdG8kcHJvbWVkaW8gPj0gNTAwKSkKCiMgUmVsYWNpw7NuIGRlbCBwYXJxdWUgYXV0b21vdG9yIHZzIGNhbGlkYWQgZGUgYWlyZQpkZl9kZXB0byAlPiUKICBzbGljZSgtZmlsYXMpJT4lIAogIGdncGxvdChkYXRhID0gLiwgbWFwcGluZyA9IGFlcyh4ID0gVG90YWwsIHkgPSBwcm9tZWRpbykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH5WYXJpYWJsZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFLCBhZXMoY29sb3IgPSAiYmx1ZSIpLCBsd2QgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCAgYWVzKGNvbG9yID0gInJlZCIpLCBsd2QgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9pZGVudGl0eShndWlkZSA9ICJsZWdlbmQiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiTW9kZWxvOiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiYmx1ZSIsICJyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMaW5lYWwiLCAiTG9lc3MiKSkgKwogIGxhYnMoeCA9ICJOw7ptZXJvIGRlIGNhcnJvcyAobikiLCB5ID0gIlByb21lZGlvIMK1Zy9tMyIsCiAgICAgICB0aXRsZSA9ICJSZWxhY2nDs24gZGVsIHBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlIiwKICAgICAgIHN1YnRpdGxlID0gIkNvbG9tYmlhIDIwMTMtMjAxNyIsIAogICAgICAgY2FwdGlvbiA9ICJDYWRhIHB1bnRvIHJlcHJlc2VudGEgdW4gZGVwYXJ0YW1lbnRvLiIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgojIyMgUGFycXVlIGF1dG9tb3RvciB2cyBjYWxpZGFkIGRlIGFpcmUgUGVyY2VudGlsIDk4CgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTF9CmRmX2RlcHRvICU+JQogIHNsaWNlKC1maWxhcyklPiUgCiAgZ2dwbG90KGRhdGEgPSAuLCBtYXBwaW5nID0gYWVzKHggPSBUb3RhbCwgeSA9IHA5OCkpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH5WYXJpYWJsZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFLCBhZXMoY29sb3IgPSAiYmx1ZSIpLCBsd2QgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCAgYWVzKGNvbG9yID0gInJlZCIpLCBsd2QgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9pZGVudGl0eShndWlkZSA9ICJsZWdlbmQiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiTW9kZWxvOiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiYmx1ZSIsICJyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMaW5lYWwiLCAiTG9lc3MiKSkgKwogIGxhYnMoeCA9ICJOw7ptZXJvIGRlIGNhcnJvcyAobikiLCB5ID0gIlBlcmNlbnRpbCA5OCDCtWcvbTMiLAogICAgICAgdGl0bGUgPSAiUmVsYWNpw7NuIGRlbCBwYXJxdWUgYXV0b21vdG9yIHZzIGNhbGlkYWQgZGUgYWlyZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJDb2xvbWJpYSAyMDEzLTIwMTciLCAKICAgICAgIGNhcHRpb24gPSAiQ2FkYSBwdW50byByZXByZXNlbnRhIHVuIGRlcGFydGFtZW50by4iKSArCiAgdGhlbWVfbGluZWRyYXcoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCiAgCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTExfQpkZl9kZXB0byAlPiUKICBzbGljZSgtZmlsYXMpJT4lIAogIGdncGxvdChkYXRhID0gLiwgbWFwcGluZyA9IGFlcyh4ID0gVG90YWwsIHkgPSBwOTgpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+VmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSwgYWVzKGNvbG9yID0gImJsdWUiKSwgbHdkID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgIGFlcyhjb2xvciA9ICJyZWQiKSwgbHdkID0gMC43KSArCiAgc2NhbGVfY29sb3JfaWRlbnRpdHkoZ3VpZGUgPSAibGVnZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk1vZGVsbzoiLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoImJsdWUiLCAicmVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTGluZWFsIiwgIkxvZXNzIikpICsKICBsYWJzKHggPSAiTsO6bWVybyBkZSBjYXJyb3MgKG4pIiwgeSA9ICJQZXJjZW50aWwgOTggwrVnL20zIiwKICAgICAgIHRpdGxlID0gIlJlbGFjacOzbiBkZWwgcGFycXVlIGF1dG9tb3RvciB2cyBjYWxpZGFkIGRlIGFpcmUiLAogICAgICAgc3VidGl0bGUgPSAiQ29sb21iaWEgMjAxMy0yMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIkNhZGEgcHVudG8gcmVwcmVzZW50YSB1biBkZXBhcnRhbWVudG8uIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQogIApgYGAKCiMjIFBvciBtdW5pY2lwaW8KCmBgYHtyfQojIERhdG9zIG5lY2VzYXJpb3MgcGFyYSBncmFmaWNhcgpsb2FkKCJQYXJxdWVBdXRvbW90b3JfQWlyZS9kZl9tcGlvLlJkYXRhIikgICMgZGF0b3MgY29tcGxldG9zIHBvciBtdW5pY2lwaW8KCiMgQWp1c3RhbmRvIGRhdG9zIHBvciBtdW5pY2lwaW8KZGZfbXBpbyA8LSBkZl9tcGlvICU+JSAKICBtdXRhdGUoQcOxbyA9IGZhY3RvcihBw7FvKSwKICAgICAgICAgbXBpbyA9IGZhY3RvcihtcGlvKSkgJT4lIAogIGRyb3BsZXZlbHMoKQpgYGAKCiAgLSAqKkVzdHJ1Y3R1cmEgaW50ZXJuYToqKgoKYGBge3J9CiMgRXN0cnVjdHVyYSBpbnRlcm5hIGRmX2RlcHRvCnN0cihkZl9tcGlvKQpgYGAKCiMjIyBQYXJxdWUgYXV0b21vdG9yIHZzIGNhbGlkYWQgZGUgYWlyZSBwcm9tZWRpbwoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTExfQojIElkZW50aWZpY2FjacOzbiBkZSBmaWxhcyBjb24gZGF0b3MgYXTDrXBpY29zCndoaWNoKGRmX21waW8kVmFyaWFibGUgPT0gIk5PIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gOTApICAgIAp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTk8yIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gMjUwKQp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTzMiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSA1MDApCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJQTTEwIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gMTAwKQp3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiU08yIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gNTAwKQoKIyBWZWN0b3IgZGUgZmlsYXMgYSBzZWxlY2Npb25hcgpmaWxhczIgPC0gYyh3aGljaChkZl9tcGlvJFZhcmlhYmxlID09ICJOTyIgJiBkZl9tcGlvJHByb21lZGlvID49IDkwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTk8yIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gMjUwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiTzMiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSA1MDApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJQTTEwIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gMTAwKSwKICAgICAgICAgICB3aGljaChkZl9kZXB0byRWYXJpYWJsZSA9PSAiU08yIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gNTAwKSkKCiMgUmVsYWNpw7NuIGRlbCBwYXJxdWUgYXV0b21vdG9yIHZzIGNhbGlkYWQgZGUgYWlyZQpkZl9tcGlvICU+JQogIHNsaWNlKC1maWxhczIpICU+JSAgIAogIGdncGxvdChkYXRhID0gLiwgbWFwcGluZyA9IGFlcyh4ID0gVG90YWwsIHkgPSBwcm9tZWRpbykpICsKICBmYWNldF93cmFwKGZhY2V0cyA9IH5WYXJpYWJsZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFLCBhZXMoY29sb3IgPSAiYmx1ZSIpLCBsd2QgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCAgYWVzKGNvbG9yID0gInJlZCIpLCBsd2QgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9pZGVudGl0eShndWlkZSA9ICJsZWdlbmQiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiTW9kZWxvOiIsCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygiYmx1ZSIsICJyZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMaW5lYWwiLCAiTG9lc3MiKSkgKwogIGxhYnMoeCA9ICJOw7ptZXJvIGRlIGNhcnJvcyAobikiLCB5ID0gIlByb21lZGlvIMK1Zy9tMyIsCiAgICAgICB0aXRsZSA9ICJSZWxhY2nDs24gZGVsIHBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlIiwKICAgICAgIHN1YnRpdGxlID0gIkNvbG9tYmlhIDIwMTMtMjAxNyIsIAogICAgICAgY2FwdGlvbiA9ICJDYWRhIHB1bnRvIHJlcHJlc2VudGEgdW4gbXVuaWNpcGlvLiIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTF9CiMgSWRlbnRpZmljYWNpw7NuIGRlIGZpbGFzIGNvbiBkYXRvcyBhdMOtcGljb3MKd2hpY2goZGZfbXBpbyRWYXJpYWJsZSA9PSAiTk8iICYgZGZfbXBpbyRwcm9tZWRpbyA+PSA5MCkgICAgCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJOTzIiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSAyNTApCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJPMyIgJiBkZl9tcGlvJHByb21lZGlvID49IDUwMCkKd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlBNMTAiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSAxMDApCndoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJTTzIiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSA1MDApCgojIFZlY3RvciBkZSBmaWxhcyBhIHNlbGVjY2lvbmFyCmZpbGFzMiA8LSBjKHdoaWNoKGRmX21waW8kVmFyaWFibGUgPT0gIk5PIiAmIGRmX21waW8kcHJvbWVkaW8gPj0gOTApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJOTzIiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSAyNTApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJPMyIgJiBkZl9tcGlvJHByb21lZGlvID49IDUwMCksCiAgICAgICAgICAgd2hpY2goZGZfZGVwdG8kVmFyaWFibGUgPT0gIlBNMTAiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSAxMDApLAogICAgICAgICAgIHdoaWNoKGRmX2RlcHRvJFZhcmlhYmxlID09ICJTTzIiICYgZGZfbXBpbyRwcm9tZWRpbyA+PSA1MDApKQoKIyBSZWxhY2nDs24gZGVsIHBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlCmRmX21waW8gJT4lCiAgc2xpY2UoLWZpbGFzMikgJT4lICAgCiAgZ2dwbG90KGRhdGEgPSAuLCBtYXBwaW5nID0gYWVzKHggPSBUb3RhbCwgeSA9IHByb21lZGlvKSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gflZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UsIGFlcyhjb2xvciA9ICJibHVlIiksIGx3ZCA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsICBhZXMoY29sb3IgPSAicmVkIiksIGx3ZCA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2lkZW50aXR5KGd1aWRlID0gImxlZ2VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJNb2RlbG86IiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJibHVlIiwgInJlZCIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkxpbmVhbCIsICJMb2VzcyIpKSArCiAgbGFicyh4ID0gIk7Dum1lcm8gZGUgY2Fycm9zIChuKSIsIHkgPSAiUHJvbWVkaW8gwrVnL20zIiwKICAgICAgIHRpdGxlID0gIlJlbGFjacOzbiBkZWwgcGFycXVlIGF1dG9tb3RvciB2cyBjYWxpZGFkIGRlIGFpcmUiLAogICAgICAgc3VidGl0bGUgPSAiQ29sb21iaWEgMjAxMy0yMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIkNhZGEgcHVudG8gcmVwcmVzZW50YSB1biBtdW5pY2lwaW8uIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCiMjIyBQYXJxdWUgYXV0b21vdG9yIHZzIGNhbGlkYWQgZGUgYWlyZSBQZXJjZW50aWwgOTgKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMX0KZGZfbXBpbyAlPiUKICBzbGljZSgtZmlsYXMyKSU+JSAKICBnZ3Bsb3QoZGF0YSA9IC4sIG1hcHBpbmcgPSBhZXMoeCA9IFRvdGFsLCB5ID0gcDk4KSkgKwogIGZhY2V0X3dyYXAoZmFjZXRzID0gflZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIHNlID0gRkFMU0UsIGFlcyhjb2xvciA9ICJibHVlIiksIGx3ZCA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UsICBhZXMoY29sb3IgPSAicmVkIiksIGx3ZCA9IDAuNykgKwogIHNjYWxlX2NvbG9yX2lkZW50aXR5KGd1aWRlID0gImxlZ2VuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJNb2RlbG86IiwKICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKCJibHVlIiwgInJlZCIpLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkxpbmVhbCIsICJMb2VzcyIpKSArCiAgbGFicyh4ID0gIk7Dum1lcm8gZGUgY2Fycm9zIChuKSIsIHkgPSAiUGVyY2VudGlsIDk4IMK1Zy9tMyIsCiAgICAgICB0aXRsZSA9ICJSZWxhY2nDs24gZGVsIHBhcnF1ZSBhdXRvbW90b3IgdnMgY2FsaWRhZCBkZSBhaXJlIiwKICAgICAgIHN1YnRpdGxlID0gIkNvbG9tYmlhIDIwMTMtMjAxNyIsIAogICAgICAgY2FwdGlvbiA9ICJDYWRhIHB1bnRvIHJlcHJlc2VudGEgdW4gbXVuaWNpcGlvLiIpICsKICB0aGVtZV9saW5lZHJhdygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIilzCiAgCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTExfQpkZl9tcGlvICU+JQogIHNsaWNlKC1maWxhczIpJT4lIAogIGdncGxvdChkYXRhID0gLiwgbWFwcGluZyA9IGFlcyh4ID0gVG90YWwsIHkgPSBwOTgpKSArCiAgZmFjZXRfd3JhcChmYWNldHMgPSB+VmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgc2UgPSBGQUxTRSwgYWVzKGNvbG9yID0gImJsdWUiKSwgbHdkID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgIGFlcyhjb2xvciA9ICJyZWQiKSwgbHdkID0gMC43KSArCiAgc2NhbGVfY29sb3JfaWRlbnRpdHkoZ3VpZGUgPSAibGVnZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk1vZGVsbzoiLAogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoImJsdWUiLCAicmVkIiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTGluZWFsIiwgIkxvZXNzIikpICsKICBsYWJzKHggPSAiTsO6bWVybyBkZSBjYXJyb3MgKG4pIiwgeSA9ICJQZXJjZW50aWwgOTggwrVnL20zIiwKICAgICAgIHRpdGxlID0gIlJlbGFjacOzbiBkZWwgcGFycXVlIGF1dG9tb3RvciB2cyBjYWxpZGFkIGRlIGFpcmUiLAogICAgICAgc3VidGl0bGUgPSAiQ29sb21iaWEgMjAxMy0yMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIkNhZGEgcHVudG8gcmVwcmVzZW50YSB1biBtdW5pY2lwaW8uIikgKwogIHRoZW1lX2xpbmVkcmF3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQogIApgYGA=