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

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


1. Introducción

Para la asignatura de “Programación y manejo de datos en la era del Big Data” he decidido realizar un ensayo (en formato rmd) sobre un tema que me ha estado rondando la cabeza desde la finalización de mi trabajo grupal sobre la inflación (La inflación en tiempos de pandemia), se trata del estudio de la sostenibilidad de la deuda española.

Resumen: La deuda pública española se sitúa por primera vez en las últimas décadas por encima del 120%, en un contexto de bajos tipos de interés, inflación elevada y con unos problemas estructurales encabezados por el problema del sistema de reparto de las pensiones públicas españolas y su estructura productiva, limitando así los factores que permiten la sostenibilidad de cualquier deuda pública en largo plazo.

The Abstract: For the first time in recent decades, Spanish public debt has risen above 120%, in a context of low interest rates, high inflation and structural problems led by the problem of the Spanish public pension distribution system and its productive structure, thus limiting the factors that allow the sustainability of any public debt in the long term.

Palabras Clave: Deuda, Sostenibilidad, España, Déficit, Gasto, Ingrsos, Pensiones, Ratio, Deuda/PIB, tasa, interés, amortización, coste.

2. Motivaciones

Al igual que la inflación, la presentación de resultados en los últimos trimestres sobre la deuda pública española se ha caracterizado por mostrar consecutivamente nuevos máximos históricos. Aunque sus causas son completamente opuestas al de la inflación (como posteriormente expondremos) considero que es un tema de estudio completamente relacionado con mi trabajo grupal, especialmente en sus conclusiones acerca de la política adoptada por el Banco Central Europeo, caracterizada por un mantenimiento de tipos de interés bajos en el corto/medio plazo.

Por similitud sobre la temática de los trabajos, note el lector que las motivaciones no van a variar en gran medida, y, por tanto, se podrían resumir en los siguientes:

  • Estudiar este fenómeno en nuestra economía doméstica. Al igual que con el caso de la inflación, el contexto de una ratio tan alta Deuda/PIB se puede catalogar como excepcional. Considero que su estudio puede ser muy útil para mi formación económica en este campo.

  • Desarrollar tanto los conocimientos económicos (teóricos y prácticos) que he adquirido en la carrera, como en el curso de R.Studio. Especialmente, mi objetivo es mejorar mis habilidades en la presentación de gráficos estáticos que resulten útiles para mis futuras presentaciones sobre datos económicos.

El objetivo del informe es tratar de dar respuesta a la siguiente pregunta:

¿Debe preocuparnos la sostenibilidad de la deuda pública española?

3. Datos utilizados


Comentarios

A continuación se adjuntan todos los datos utilizados en el informe.




Tidy


deuda <- rio::import("./datos/Deuda.xlsx")

#Piramide de Población

Pob_21 <- rio::import("./datos/Piramide.xlsx")

library(readxl)
Piramide <- read_excel("./datos/Piramide.xlsx", 
                       col_types = c("text", "text", "text", 
                                     "numeric", "numeric"))
Pob_21 <- Pob_21 %>% 
  dplyr::select(Pob,Sexo,Grupo_quinquenal) %>%
  mutate(Pob_Porcentaje = Pob/42018307)

Partidas_g_pub <- rio::import("./datos/Partidas_Gasto.xlsx")

library(readxl)
Partidas_g_pub <- read_excel("./datos/Partidas_Gasto.xlsx", 
                             col_types = c("text", "numeric", "numeric"))
library(treemap)

Partidas_g_pub_2021 <- Partidas_g_pub %>%
      filter(Time == "2021") %>%
      dplyr::select("Partidas_Gasto", "Gasto_millones") %>%
      slice_max (Gasto_millones , n = 16)

Partidas_g_pub_2016 <- Partidas_g_pub %>%
  filter(Time == "2016") %>%
  dplyr::select("Partidas_Gasto", "Gasto_millones") %>%
  slice_max (Gasto_millones , n = 16)
#Ingresos/Gastos/Déficit

cuentas_pub <- rio::import("./datos/cuentas_pub.xlsx")

Cuentas_pub <- read_excel("./datos/Cuentas_pub.xlsx", 
                          col_types = c("text", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric", 
                                        "numeric", "numeric", "numeric"))


cuentas_pub_long <- cuentas_pub %>% 
  tidyr::pivot_longer(cols = 2:27, names_to = "año")

cuentas_pub_long_gasto <- cuentas_pub_long %>%
  filter(Tipo == "Gastos") 

cuentas_pub_long_ingresos <- cuentas_pub_long %>%
  filter(Tipo == "Ingresos") 

cuentas_pub_long_df <- cuentas_pub_long %>%
  filter(Tipo == "Deficit/Superavit") 


Deficit_PIB <- rio::import("./datos/Deficit_PIB.xlsx")

Deficit_PIB <- read_excel("./datos/Deficit_PIB.xlsx", 
                          col_types = c("text", "numeric", "numeric"))
#Mapas Presión

#aa <- rio::import("./datos/PF.xlsx")

#rio::export(aa, "./datos/PF.csv")

#PF <- read_csv("./datos/PF.csv", 
#                            col_types = cols(date = col_date(format = "%Y/%m")))

#PF_long <- PF %>% 
# tidyr::pivot_longer(cols = 2:13, names_to = "time")

#rio::export(PF_long, "./datos/PF_long.csv")

PF_long <- rio::import("./datos/PF_long.csv")

library(readr)
PF_long <- read_csv("./datos/PF_long.csv", 
                    col_types = cols(time = col_date(format = "%Y/%m"), 
                                     value = col_number()))

library(tidyverse)
world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
world <- world %>% filter(subregion != "Antarctica") %>% filter(admin != "Greenland")
world <- world %>% dplyr::select(name, iso_a3, geometry)

PF_geom_europ <- left_join(PF_long, world, by = c("country" = "name")) 
 

#dependencia
library(ggflags)
library(countrycode)

#aa <- rio::import("./datos/tasa_dep.csv")

#tasa_dep <- aa %>%
#  dplyr::select(geo,TIME_PERIOD, OBS_VALUE) 

#rio::export(tasa_dep, "./datos/tasa_dep.xlsx")

#aa <- rio::import("./datos/tasa_dep.csv")

aa <- rio::import("./datos/tasa_dep.xlsx")

library(readxl)
tasa_dep <- read_excel("./datos/tasa_dep.xlsx", 
                       col_types = c("text", "numeric", "numeric", 
                                     "text"))
tasa_dep <- tasa_dep %>%
  dplyr::select(TIME_PERIOD, geo_1, OBS_VALUE)

tasa_dep$code<-tolower(countrycode(tasa_dep$geo_1, origin = 'iso2c', destination = 'iso2c'))

#Esfuerzo/Presión fiscal

#Esfuerzo/Presión fiscal

PF_long <- rio::import("./datos/PF_long.csv")

library(readr)
PF_long <- read_csv("./datos/PF_long.csv", 
                    col_types = cols(time = col_date(format = "%Y/%m"), 
                                     value = col_number()))
PF_long <- PF_long %>%
  filter(time == "2020-01-01")

#Pib_cap_eu <- rio::import("./datos/Pib_cap_eu.xlsx")

#library(readxl)

#Pib_cap_eu <- read_csv("./datos/Pib_cap_eu.xlsx", 
#                        col_types = c("text", "numeric"))

#rio::export(Pib_cap_eu, "./datos/Pib_cap_eu.csv")

Pib_cap_eu <- rio::import("./datos/Pib_cap_eu.csv")

Pib_cap_eu <- Pib_cap_eu %>%
  rename("country" = "Countries")

E_P <- left_join(Pib_cap_eu, PF_long, by = "country") 

E_P_1 <- E_P %>%
  filter(!country %in% c("Czech Republic", "malt")) %>%
  rename("Presion_fisc" = "value") %>%
  dplyr::mutate(esfuerzo_fisc = Presion_fisc/PIB_cap * 100) %>%
  dplyr::mutate(Presion_fisc = Presion_fisc/100) %>%
  dplyr::mutate(dif = Presion_fisc - esfuerzo_fisc) %>%
  tidyr::pivot_longer(cols = 4:5, names_to = "tipo")

pf <- E_P_1  %>%
  filter(tipo == "Presion_fisc")

ef <- E_P_1  %>%
  filter(tipo == "esfuerzo_fisc")

#Tabla/gráfico tipo de interés medio 

coste_deuda <- rio::import("./datos/coste_deuda.xlsx")

bb <- coste_deuda

coste_deuda_long <- coste_deuda %>% 
  tidyr::pivot_longer(cols = 2:6, names_to = "tipo") %>%
  mutate(value_1 = value/100)

#Tenedores

aa <- rio::import("./datos/Distribucion_tenedores.xlsx")

Distribucion_tenedores <- aa %>% pivot_longer(cols = 2:12, names_to = "tenedor") %>%
rename("date" = "FECHA")

#rio::export(Distribucion_tenedores,"./datos/Distribucion_tenedores.csv")

library(readr)
Dist_tenedores <- read_csv("./datos/Distribucion_tenedores.csv", 
                                   col_types = cols(date = col_date(format = "%Y/%m"), 
                                                    value = col_number()))


Dist_tenedores <- Dist_tenedores %>%
  filter (!tenedor == "TOTAL")

# Datos de la OCDE de la prevision del crecimiento del PIB eurozon

crecimiento <- read_csv("./datos/crecimiento.csv", 
                        col_types = cols(Value = col_number()))

#inflacion_esp <- read_excel("./datos/inflacion_esp.xlsx")

#inflacion_esp <- inflacion_esp  %>% pivot_longer(cols = 2:25, names_to = "date")


#rio::export(inflacion_esp,"./datos/inflacion_esp.csv")

inflacion_esp <- read_csv("./datos/inflacion_esp.csv", 
    col_types = cols(date = col_date(format = "%Y/%m")))

4. Evolución de la deuda pública española en democracia.

En primer lugar, debemos definir qué entendemos por deuda pública.

Definición técnica: La deuda pública es la deuda total que mantiene un determinado estado con inversores particulares nacionales e internacionales.

Cuando nos referimos a la deuda total hacemos referencia a la deuda de todo el conjunto de las administraciones públicas. Para nuestro caso de estudio, corresponde a la suma de la deuda del estado central, de las 17 comunidades autónomas y de todas administraciones locales.

Estamos hablando de una variable acumulativa. Esta acumulación se produce cuando el estado incurre en déficit público en un determinado ejercicio fiscal, por tanto, se ve obligado a la financiación externa mediante la emisión de una variedad de activos financieros (letras del tesoro, bonos, obligaciones, entre otros.). Todo esto con el único fin de mantener un nivel de gasto que su renta, por si sola, no le permite alcanzar. Esta deuda se va amortizando a lo largo de los ejercicios a un determinado tipo de interés (prefijado por las autoridades monertárias) que va fluctuando, para cada economía, según la confianza que tengan los mercados financieros en que el estado va a devolver el dinero.

Su sostenibilidad depende de cuatro elementos interrelacionados:

  1. El nivel de deuda del que partamos.
  2. El resultado y tendencia del saldo fiscal de los últimos ejercicios fiscales.
  3. El coste de amortización de la deuda, determinado por las expectativas del mercado y la política monetaria del banco central en concreto
  4. El crecimiento económico.

4.1. El nivel de deuda del que partamos

Con lo que corresponde al primer punto, en la actualidad (véase gráfico de la evolución de la deuda pública) disponemos de un punto de partida preocupante al alcanzar el mayor nivel de endeudamiento estatal desde finales del siglo XIX. La economía española ha experimentado un acusado crecimiento de su ratio Deuda/PIB en la última década.

Note el lector que este dato (el de punto de partida) queda completamente condicionado por la llegada de la pandemia, esto se puede apreciar en la aceleración que se produce entre 2019 y 2020. Todo esto tiene una razón económica lógica; la covid -19 ha forzado la paralización de la actividad económica. Ante este escenario, la principal estratégica para el gobierno, recordemos, con el fin de proteger a los trabajadores y el tejido empresarial y hacer frente al aumento de gasto sanitario ocasionado con la pandemia, ha sido llevar a cabo una política fiscal expansiva financiada por emisión de nueva deuda pública, respaldada casi en su totalidad por el Banco Central Europeo.


aa <- ggplot() +
  geom_col(data = deuda, aes(x = Date, y = Deuda_porcentaje_PIB, fill = Deuda_porcentaje_PIB)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_continuous(low="#F2D7D5", high="#641E16") + 
  theme(panel.background = element_rect(fill = "transparent")) +
  labs(title = "Evolución de la Deuda Española (%PIB)",
       caption = "Fuente: Elaboración propia con datos de INEbase") +
  labs (y = NULL) +
  labs(x = NULL) +
  guides (fill = FALSE)
  
aa

Aunque esta estrategia no es en sí criticable, ya que era lo que exigía la situación para hacer frente al inesperado shock, si lo es la falta de control presupuestario, especialmente en la última década una vez finalizada la crisis del 2008. Con esto entramos a analizar el punto 2.

4.2. Resultado y tendencia del saldo fiscal.

La economía española se ha caracterizado en los últimos años, a diferencia de sus vecinos europeos (Alemania, Holanda…) por la acumulación de saldos presupuestarios deficitarios. Como se puede observar (véase gráfico “Evolución Ingresos/Gastos”), en los últimos 25 años sol hemos presentado ciertos ejercicios con equilibrio presupuestario a principios del nuevo siglo y hemos presentado 3 ejercicios (2005, 2006, 2007) con superávit. Esta tendencia se agrava con la llegada de la crisis financiera del 2008, aunque queda totalmente justificada el no cumplimiento de la disciplina fiscal en época de crisis, si es verdad que en los posteriores años se ha optado por una falta de esfuerzo por reducir los desequilibrios presupuestarios estructurales de la economía española. Todo esto se traduce en lo anteriormente descrito, una menor disciplina fiscal implica un pero punto de partida para la llegada de las nuevas crisis (ejemplo claro lo hemos visto en el 2020).

Como se puede observar, una vez mejorada la situación post-crisis financiera, no se optó por la reducción del gasto público, aunque su crecimiento exponencial previo a 2008 se ralentizó bien es verdad que no se ha visto reducido, sino más bien al contrario. Una conclusión queda clara, si queremos no empeorar nuestra situación de partida (punto 1 de la sostenibilidad) debemos de empezar a ser austeros, no nos queda otra.

A medio plazo, hemos de equilibrar SÍ o SÍ nuestro presupuesto para comenzar a reducir nuestro altísimo stock de deuda pública.


bb <- ggplot() +
  geom_point(data = cuentas_pub_long_gasto, aes(x = año, y = value, color = Tipo,shape = Tipo), size = 3, color= "#A90729") +
  geom_line(data = cuentas_pub_long_gasto, aes(x = año, y = value, color = Tipo), size = 1.5, group = "value", color= "#A90729") +
  geom_point(data = cuentas_pub_long_ingresos, aes(x = año, y = value, shape = Tipo, color = Tipo),size = 4, color= "#E48297") +
  geom_line(data = cuentas_pub_long_ingresos, aes(x = año, y = value, color = Tipo), size = 1.5, group = "value", color= "#E48297") +
  scale_shape_manual(values = c(15,18)) +
  geom_col(dat = cuentas_pub_long_df, aes(x = año, y = value, fill = value)) +
  scale_fill_continuous(low="#86E1E7", high="#0597A1") +
  theme(panel.background = element_rect(fill = "transparent")) +
  labs(y = NULL) +
  labs(x= NULL) +
  guides (color = FALSE) +
  guides (shape = FALSE) +
  guides (fill = FALSE) +
  geom_text(data = Deficit_PIB, aes(Time, Value, label = Value), y= 50000, size = 2, fontface = "bold") +
  geom_text(data = Deficit_PIB, aes(Time, Value, label = "%"), y= 50000, hjust = -1.75, size = 1.5, fontface="bold") +
  annotate(geom = "text",
           x= 3,
           y = 80000,
           label = "Déficit/PIB",
           size = 2.5) +
  scale_y_continuous(breaks=c(200000, 400000, 600000), 
                     labels=c("200.000 €", "400.000 €", "600.000 €")) +
  theme(axis.text.y = element_text(size=rel(0.8), face = "bold")) +
  theme(axis.text.x = element_text(angle = 70 , hjust = 1, face = "bold")) +
  labs(title = "Evolución Ingresos/Gastos totales en millones de € (1995-2020)",
       caption = "Fuente: Elaboración propia con datos de Eurostat DataBase") 

bb

Esto requerirá de subidas de impuestos, de audaces recortes del gasto innecesario o tasas de crecimiento de la productividad mayores de las que lo hace la deuda. La fórmula está por determinar, pero una cosa queda clara, cuanto antes nos mentalicemos de que hay que equilibra nuestras cuentas, mejor para todos.

4.3. El coste de amortización de la deuda.

El lector puede pensar que estos datos en si tampoco están suponiendo en el momento que se está escribiendo este artículo un problema para la economía española. Pero, ¿a qué se debe esto?. Si estamos exponiendo que tenemos ciertos problemas estructurales en nuestro presupuesto, lo lógico (haciendo uso de las teorías económicas) sería pensar que también deberíamos tener problemas para expandir nuestra deuda en los mercados financieros. Pues bien, esto no es así, más bien lo contrario.

La respuesta a esto la tenemos (como ya apuntábamos en el trabajo grupal) en los bajos tipos de interés, como se puede observar el coste de endeudamiento desde 2002 se encuentra hasta día de hoy en ”caída libre”. Es por esto que la economía española continúa endeudándose a un coste bajo, por el momento. Existe una más que fundada expectativa de asistencia financiera por parte de la eurozona, por tanto, los mercados confían en que nuestros socios monetarios no van a permitir que se eleven demasiado los diferenciales de riesgo entre los distintos títulos de deuda estatal. De ahí que, a día de hoy, economías como la española (que no están cumpliendo con sus obligaciones fiscales) están siendo capaces de colocar sus pasivos en los mercados a tasas razonables.

Si los dos primeros elementos descritos de sostenibilidad los suspendemos, este tercero lo aprobamos con ayuda externa. La economía española, por sí sola no puede sostener niveles tan altos de endeudamiento, lo logramos gracias al respaldo que nos proporcionan el ahorro alemán, holandés, entre otros. Pero, esto no tiene por qué reproducirse en la siguiente década.

La generosidad de los países ahorradores dentro de la eurozona no es ilimitada.


Tabla


knitr::kable(coste_deuda, digits = 2) %>%
  kableExtra::kable_styling(fixed_thead = list(enabled = T,
                                               background = "#088A85"),
                            font_size = 15,
                            ) %>%
  column_spec(6,  color = "#000000", background = "#A9F5F2") 
FECHA LETRAS BONOS OBLIGACIONES RESTO TIPO MEDIO
2002 3.53 4.64 6.32 3.58 5.36
2003 2.44 4.14 5.81 3.15 4.81
2004 2.26 3.86 5.58 2.81 4.64
2005 2.26 3.27 5.24 2.82 4.38
2006 3.16 3.15 5.00 2.48 4.35
2007 4.03 3.40 4.93 1.99 4.51
2008 3.51 3.60 4.77 0.98 4.32
2009 0.88 3.07 4.56 0.73 3.54
2010 1.69 3.03 4.57 1.28 3.69
2011 3.09 3.29 4.70 1.76 4.07
2012 2.66 3.61 4.72 0.58 3.90
2013 1.23 3.53 4.74 0.92 3.73
2014 0.36 3.02 4.46 1.11 3.46
2015 0.05 2.35 4.08 1.28 3.12
2016 -0.18 1.48 3.81 1.30 2.80
2017 -0.36 1.22 3.49 1.26 2.58
2018 -0.37 0.61 3.27 1.18 2.42
2019 -0.43 0.34 2.98 1.13 2.20
2020 -0.38 0.16 2.72 1.04 1.99
2021 -0.49 0.04 2.35 0.78 1.71




Gráfico


aa <- ggplot() +
  geom_point(data = coste_deuda_long, aes(x = FECHA, y = value_1, shape = tipo, color = tipo), size = 2.5) +
  geom_line(data = coste_deuda_long, aes(x = FECHA, y = value_1, group = tipo, color = tipo), size = 1) +
  scale_shape_manual(values = c(15, 16, 17,18, 19)) +
  scale_color_manual(breaks = c("LETRAS", "BONOS", "OBLIGACIONES", "RESTO", "TIPO MEDIO"),
                    values=c("#03A6FD", "#024B73", "#15017A", "#684BF9", "#04F3F7")) +
  scale_y_continuous(labels = scales::percent) +
  theme(panel.background = element_rect(fill = "transparent")) +
  labs(title = "Evolución coste de la Deuda Española",
       caption = "Fuente: Elaboración propia con datos del Tesoro Público") +
  labs (y = NULL) +
  labs(x = NULL) +
  theme(legend.position = "bottom", 
        axis.text.x = element_text(face = "bold", size = 8),
        axis.text.y = element_text(face = "bold", size = 10)) +
  guides (shape = FALSE) +
  geom_hline(yintercept = 0,
             size = 0.75,
             colour = "#F70413",
             linetype = "twodash")

            
aa




4.4. El crecimiento económico.

Con lo que corresponde al cuarto factor de sostenibilidad poco a comentar, básicamente por una razón, es muy complicado hacer estimaciones realistas sobre el crecimiento económico. Aún más en un contexto como el actual donde la evolución de la pandemia puede marcar aún el crecimiento en los siguientes periodos. Bien es cierto que esta es un variable claves, ya es el denominador de la ratio Deuda/PIB, su evolución para una misma deuda puede cambiar considerablemente, es decir, puede ser una muy buena forma de amortizar deuda. Si tomamos en consideración las estimaciones mostradas para el crecimiento por parte de la OCDE que ya expusimos en nuestro trabajo grupal, podemos ver que si se cumplen las predicciones, hecho que me permita el lector poner en duda, hasta principios de 2023, en el mejor de los casos no vamos a recuperar los niveles pre-covid. Esto es un problema adicional a los anteriormente mencionados.


crecimiento_df <- crecimiento %>%
  dplyr::select(LOCATION, TIME, Value) %>%
  mutate(fecha = lubridate::yq(TIME)) %>%
  mutate(value = round(Value, 2)) %>%
  filter(LOCATION %in% c("ESP","EA17")) %>%
  dplyr::select(-TIME,-Value)

crecimiento <- ggplot(crecimiento_df, aes(fecha,value, color= LOCATION)) +
  geom_line(size=2, linetype=7) +
  scale_x_date(date_labels="%Y-%m",date_breaks  ="3 months") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) + 
  scale_color_manual(breaks = c("ESP","EA17"),values = c("#E04644","#7CCCE5")) +
  facet_wrap(
    vars(LOCATION), nrow = 2, ncol = 1) +
  annotate("rect",
           xmin = as.Date("2020-01-01"),
           xmax = as.Date("2020-07-01"),
           ymin = -Inf,
           ymax = Inf,
           alpha = 0.4,
           fill = "grey") + 
  geom_hline(yintercept = 100,
             size = 1,
             colour = "grey",
             linetype = "dashed") +
  
  theme(panel.grid.major = element_line(colour = "gray90"),
    panel.grid.minor = element_line(colour = NA),
    plot.title = element_text(size = 14,
        face = "bold"), panel.background = element_rect(fill = NA),
    legend.position = "none") +
  labs(title = "Predicción de crecimiento PIB Eurozona",
    x = NULL, y = NULL, colour = NULL, subtitle = "Año 2019 en base 100",
    caption = "Fuente:Elaboración propia con datos de la OCDE.") +
  theme(strip.background =element_rect(fill="#424254")) +
  theme(strip.text = element_text(colour = 'white')) +
  theme(strip.text = element_text(size =  15))

crecimiento

Todo hace indicar, al menos en un primer análisis y como una primera conclusión, si tenemos problemas en el corto plazo sobre nuestro endeudamiento.

5. Problemas propios

Dentro de la Eurozona disponemos de una gran variedad y tipologías diferentes de estructuras económicas, aunque muchas en la actualidad disponen de problemas o ratios altos de endeudamiento, la economía española presenta problemas estructurares propios que bajo mi consideración pueden lastrar en el medio plazo esa obligación de reducir nuestro endeudamiento, anteriormente mencionada. Note el lector, que por brevedad del artículo no vamos a profundizar en cada subtema, simplemente destacar los problemas de la forma los más resumida posible.

Estos problemas cabe remarcar que pueden ser clave para el estudio de sostenibilidad. ¿Por qué? Básicamente, porque todos los a continuación expuestos, tienen una implicación directa e importante en las partidas de gastos/ingresos públicos. Su estudio, puede darnos respuesta de cómo hemos de modificar nuestra estructura presupuestaria para garantizar el equilibrio presupuestario, o al menos, si queremos ser menos ambiciosos y puesto que no es objetivo mío defender o no como ha de ser el saldo presupuestario en una determinada economía, garantizar la reducción de nuestro stock de deuda.

5.1. Problema de sostenibilidad de las pensiones públicas.

En primer lugar, un problema importante es la sostenibilidad de nuestro sistema de pensiones.

En España predomina un sistema de reparto, es decir, un sistema donde las pensiones públicas cubren la mayor parte de los ingresos tras la jubilación. A grandes rasgos, el sistema se basa en que los cotizantes (población activa en un período determinado) cotizan para financiar las pensiones de los jubilados a cambio, y esto es muy importante, de devengar un derecho de pensión en el futro. Esta última consideración es clave, el cotizante no está cotizando para recibir lo que por sencillez vamos a definir como “lo ahorrado” mediante el mecanismo proporcionado por la seguridad social, sino más bien para tener derecho a una determinada pensión en el futuro . Por tanto, la cuantía a recibir en el futuro depende de la capacidad del sistema para generar liquidez, es decir, si hay buena situación económica, no se acumulan saldos deficitarios de forma consecutiva en la seguridad social y disponemos de pleno empleo y una tasa de jubilado por trabajador baja, el sistema no tiene porque fallar.

El problema es que ninguno de los supuestos de partida se cumple. Desde la llegada de la crisis financiera España acumula importantes déficits en su saldo de seguridad social, la tasa de desempleo estructural desde 1978 se sitúa por encima del 15%, la esperanza de vida en España crece todos los años situándose como una de las mayores del mundo por encima de los 83 (dato muy positivo) y, lo más preocupante, la tasa pensionista/cotizante crece exponencialmente.


aa <- ggplot(Pob_21, aes(x = Grupo_quinquenal,
                        y = Pob_Porcentaje,
                        fill = Sexo)) +
      geom_col(data = subset(Pob_21, Sexo == "Hombres") %>% 
             mutate(Pob_Porcentaje = -Pob_Porcentaje),
           width = 0.5, fill = "#0B615E") +
      geom_col(data = subset(Pob_21, Sexo == "Mujeres"),
           width = 0.5, fill = "#04B4AE") + 
      coord_flip() +
  theme(panel.background = element_rect(fill = "transparent")) +
  scale_y_continuous(
    breaks = c(seq(-0.06, -0.02, by = 0.02), 
               seq(0, 0.06, by = 0.02)),
    labels = scales::percent (c(seq(-0.06, -0.02, by = 0.02) * -1, 
               seq(0, 0.06, by = 0.02)))) +
  labs(y = "Hombre/Mujer población en %") +
  labs(x= NULL) +
  labs(title = "Pirámide de la población empadronada en España",
       caption = "Fuente: Elaboración propia con datos de INEbase") +
  annotate(geom = "text",
           x= "85 a 89",
           y = 0.035,
           label = "Mujeres",
           size = 4) +
  annotate(geom = "text",
           x= "85 a 89",
           y = - 0.035,
           label = "Hombres",
           size = 4) +
  geom_vline(xintercept = "35 a 39",
             size = 0.5,
             colour = "red",
             linetype = "dashed") +
  geom_vline(xintercept = "60 a 64",
             size = 0.5,
             colour = "red",
             linetype = "dashed")

aa

La evolución demográfica (véase pirámide poblacional y estimación para lo que resta de s.XXI sobre la tasa de dependencia) también preocupa. A medida que una sociedad envejece, aumenta el número de pensionistas respecto a la población en edad de trabajar (lo que se conoce como tasa de dependencia/vejez) por lo que, si se mantienen los otros parámetros del sistema sin cambios, el gasto en pensiones será mayor. Como se puede observar con los datos ofrecidos por el INE y Eurostat, esto especialmente va a ocurrir en los próximos 20 años, con la jubilación de la generación conocida como ”babyboomers”, salvo que se disparara la natalidad o tuviéramos una entrada masiva de migrantes con edad de trabajar en las próximas décadas.

aa <- ggplot(tasa_dep, aes(x = geo_1, OBS_VALUE, country = code, size = 10)) +
  scale_fill_brewer(palette = "Spectral") +
  geom_flag(aes(geo_1, OBS_VALUE, country = code), size = 10) +
  transition_manual(TIME_PERIOD) +
  coord_flip() +
  theme(panel.background = element_rect(fill = "#303637")) + 
  labs (x = NULL) +
  labs (y = "Tasa de dependencia vejez en %") +
  theme(panel.grid.major = element_line(colour = NA)) +
  labs(title = "Estimación para el año: {current_frame}",
       caption = "Datos de Eurostat")  + theme(axis.line = element_line(colour = "white"),
    axis.ticks = element_line(colour = "white"),
    panel.grid.major = element_line(colour = "azure3"),
    panel.grid.minor = element_line(colour = "azure3"),
    axis.title = element_text(colour = "white"),
    axis.text = element_text(colour = "azure3"),
    axis.text.y = element_text(colour = "azure3"),
    axis.text.x = element_text(colour = "white"),
    plot.title = element_text(colour = "white"),
    legend.text = element_text(colour = "azure3"),
    legend.title = element_text(colour = "azure3"),
    panel.background = element_rect(fill = "azure3",
        colour = "azure3"), plot.background = element_rect(fill = "azure3",
        colour = "azure3"), legend.key = element_rect(fill = "azure3",
        colour = "azure3"), legend.background = element_rect(fill = "azure3",
        colour = "azure3")) + labs(colour = "white")

gganimate::animate(aa, nframes = 100, fps = 25, end_pause = 1)


Sin entrar a valorar si el sistema en si es sostenible o no, una cosa queda clara, si toda esta tendencia en los últimos años sigue su cauce, el gasto en pensiones va a ser cada vez mayor. En el siguiente apartado (5.2) analizaremos porque esto puede ser un problema para la sostenibilidad de las pensiones.

5.2 Patrón de gasto público.

Como se puede observar el patrón de gasto de la economía española se caracteriza especialmente por tener un gran desembolso en el pago de pensiones. Recordemos que hemos dicho que esta partida seguramente se va a ver incrementada en el futuro. ¿Por qué es una variable tan importante? Porque representa aproximadamente un 40% del gasto total, como se puede observar, no es un dato propio de la situación económica actual, este patrón es común para todo el período del 2000, véase “patrón de gasto para 2016” (por motivos de similitud he decidido representar el 2016).

Mi hipótesis es clara, queramos o no, la principal partida a reducir el elevado gasto es la de pensiones, el problema es que cambiar ahora de sistema es una tarea casi imposible por su complejidad de implementación, además, eso implicaría un coste para alguna generación que aporta, pero posteriormente no recibiría prestación de futuro. Aunque una solución da para un artículo bastante largo, simplemente comentar que cuando mejoremos nuestro nivel de endeudamiento (principal objetivo) tendremos que empezar a cuestionarnos este problema y tratar de darle solución.

Note el lector que hay otros problemas por la parte del gasto también remarcables, el gasto en desempleo es superior a lo que destinamos a educación o sanidad, al igual (aunque este relativamente bajos los tipos) el gasto que dedicamos a la partida de pago de intereses de la deuda. Todas estas partidas agrupadas representan aproximadamente un 60% del gasto total. Bajo mi punto de vista, es al menos para reflexionar si nuestro patrón de gasto es adecuado. Mención especial quiero hacer al gasto sobre la deuda, para que note el lector la importancia de tener o no ratios elevados de deuda es que sin esta se podria destinar aproximadamente un 50% más a partidas como sanidad, educación o pensiones.

Si la decisión política para reducir el déficit es actuar sobre el gasto, las partidas en las que debemos actuar hoy son pensiones, desempleo e intereses pagados.

Con esto no estoy dando a entender que se reduzca el gasto social sin poner solución a los desequilibrios, es totalmente insensato reducir únicamente las ayudas estatales porque eso solo agrava el problema, más bien considero que debería ser al contrario. Por ejemplo, hacer que no sea necesario que existan ayudas por desempleo, fomentado el empleo, esto si sería una forma efectiva para reducir la partidas de gasto. Lo mismo puede ser aplicable para el pago de intereses, aunque no depende de nosotros en parte el tipo que pagamos por ella, si depende de nosotros modificar el rátio de endeudamiento.


Patrón de gasto público 2021.


componentes_europa <- treemap(Partidas_g_pub_2021,
                              index="Partidas_Gasto",
                              vSize="Gasto_millones",
                              type="index",
                              title = "Gasto 2021",
                              palette="Spectral",
                              border.col=c("white"), 
                              border.lwds=2, 
                              fontface.labels=1,
                              bg.labels=c("transparent"),              
                              align.labels=c("center", "center"),                                 
                              overlap.labels=0.75) 




Patrón de gasto público 2016.


componentes_europa <- treemap(Partidas_g_pub_2016,
                              index="Partidas_Gasto",
                              vSize="Gasto_millones",
                              type="index",
                              palette="Spectral",
                              border.col=c("white"), 
                              border.lwds=2, 
                              fontface.labels=1,
                              bg.labels=c("transparent"),              
                              align.labels=c("center", "center"), 
                              title = "Gasto 2016",
                              overlap.labels=0.75) 




5.3. Productividad y mercado laboral.

La producción es una clave importantísima para reducir el endeudamiento de una determinada economía. Si no aumentamos considerablemente nuestra deuda, podemos reducir la ratio simplemente haciendo crecer nuestro output. El problema en los últimos años al respecto se encuentra en la situación de nuestro mercado laboral. Disponemos altas tasa de desempleo sumado a una baja productividad desde el inicio de la democracia, esto lastra nuestro crecimiento y nos limita la posibilidad de amortizar deuda.

La principal causa del paro viene dada por la estructura de nuestro mercado de trabajo, donde se refleja una excesiva temporalidad. Para poner en contexto, en la última década, el promedio de temporalidad para España es del 25,2% frente al 13,9% de la UE. Todo esto queda estrechamente vinculado con nuestro modelo productivo, donde los servicios representan aproximadamente un 70% del PIB. A todo, hay que sumar la lacra que supone el paro juvenil, con una tasa igual o superior al 40%, líderes en nuestro entorno europeo.

Por tanto, es necesario remodelar el modelo productivo. Hay afrontar una transformación de nuestra estructura económica con la finalidad de que haya trabajo, enfocándonos hacia la industria, la tecnología y servicios de más valor añadido.

Reducir el desempleo y mitigar la precariedad del empleo, fomentando la productividad tendría que ser una prioridad absoluta.


  • Problemas del mercado laboral
  • Falta de productividad
  • Paro juvenil


5.4. ¿Pagamos pocos o muchos impuestos en españa?

Este punto, simplemente lo quiero utilizar para mostrar porque considero que en España pagamos suficientes impuestos. Por tanto, no considero que sea razonable utilizar la estrategia de incremento de ingresos públicos para reducir el déficit, como mínimo mantenerse o incluso, porque no, reducir la presión fiscal. Para estudiar si pagamos muchos o pocos impuestos utilizaremos medidas ampliamente utilizadas:

  1. Presión Fiscal : cantidad de dinero en concepto de tributos que los obligados tributarios pagan al Estado en comparación con el producto interior bruto (PIB).

  2. Esfuerzo Fiscal : indicador que se utiliza para evaluar la incidencia recaudatoria del estado en la producción de la sociedad. Este mide la relación entre el porcentaje que suponen los ingresos públicos respecto al producto interior bruto (PIB), así como a la renta per cápita.

Como son conceptos complejos y para facilitar lector la comprensión de este apartado he considerado que lo mejor es aportar un corto video donde se explica de forma mucho más detallada las diferencias y signifivados:



España, como se puede observar en el mapa mundi es uno de los países de menor presión fiscal de toda la eurozona. Paralelamente, el esfuerzo fiscal se sitúa entre los más altos, por encima de algunos países como Dinamarca, Suecia, Finlandia, etc. Como se puede observar en el gráfico de Presión vs Esfuerzo fiscal la diferencia es menor para el caso español. Esto indica que el esfuerzo exigido en el pago de impuestos es mayor para a los españoles. Esta diferencia se explica, fundamentalmente, porque el sistema fiscal español no es capaz de recaudar más dinero cuando se producen subidas de impuestos. La economía sumergida y el enorme impacto sobre la actividad productiva de un aumento de la presión fiscal explican esta distorsión. Además, el índice de presión fiscal tampoco tiene en cuenta el esfuerzo que requiere la generación de PIB, puesto que una misma presión fiscal puede exigir sacrificios fiscales muy distintos, puesto que presión fiscal y esfuerzo fiscal son conceptos diferentes.


 mapa_2 <- ggplot() +
  geom_sf(data = PF_geom_europ, aes(geometry = geometry, fill = value )) +
  theme_void()  +
  theme(plot.subtitle = element_text(family = "serif", face = "italic"),
        plot.title = element_text(family = "serif", face =  "italic")) +
  labs(title = "Mapa: Presión Fiscal", fill = "Ingresos/PIB")  +
  scale_fill_continuous(low="#FEE5FB",high="#63015A") +
  lims(y = c(35,85)) +
  lims(x = c(-35, 60)) + transition_manual(time) +
  labs(title = "Presión fiscal en el entorno europeo (2009-2020)",
       subtitle = "Periodo: {current_frame}",
       caption = "Datos extraídos de Eurostat Database") 


gganimate::animate(mapa_2, nframes = 200, fps = 25, end_pause = 6)



p <- ggplot(E_P_1) +
  geom_segment(data = ef ,
               aes(x = value, y = country,
                   yend = pf$country, xend = pf$value), 
               color = "#8D8E91",
               size = 2.5, 
               alpha = .5) +
  geom_point(aes(x = value, y = country, color = tipo), size = 4, show.legend = TRUE) +
  scale_color_manual(breaks = c("Presion_fisc","esfuerzo_fisc"), 
                     values = c("#FF0000", "#0040FF"), 
                     labels = c("Presión Fiscal", "Esfuerzo Fiscal")) +
  ggtitle("Presión Fiscal vs Esfuerzo Fiscal para la Eurozona 2020") +
  labs(caption = "Elaboración propia con datos de Eurostat") +
  theme(panel.background = element_rect(fill = "transparent")) +
  labs(x = NULL) +
  labs(y = NULL) +
  guides(color= guide_legend(title = "Indicador")) +
  theme(axis.text.x = element_text(face="bold", vjust=-0.5, size= 10)) +
  theme(axis.text.y = element_text(face="bold", vjust=1.5, size= 8)) +
  geom_text(data = ef ,
            aes(x = value, y = country, label = scales::percent(value, 2), colour = tipo), vjust = 0.25,hjust = 1.45, size = 2.75) +
  geom_text(data = pf ,
            aes(x = value, y = country, label = scales::percent(value, 2), colour = tipo), vjust = 0.25,hjust = - 0.45, size = 2.75) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.text.y = element_text(vjust = 0)) +
  theme(legend.position = "bottom")


p


6. Conclusiones

Una vez expuesto las conclusiones anteriores, podemos afirmar que la sostenibilidad va a depender en mayor medida de tres supuestos importantes:

  1. Que el crecimiento nominal del PIB retoma el dinamismo en los próximos años.
  2. Que el entorno de tipo de interés sigue siendo favorable.
  3. Que el saldo presupuestario se corrija en la próxima década.

Con lo que corresponde al primer supuesto, recordemos lo anteriormente mencionado, es muy complicado hacer estimaciones, pero si tomamos como referencia “ las más optimistas” una cosa queda clara, va a ser una bala que tardaremos mínimo 2 años en poder utilizar. En segundo lugar, el supuesto dos, bajo mi consideración el más importante en el corto plazo es la evolución de los tipos de interés. El pasado 30 de diciembre del 2021, el INE público su dato adelantado de inflación, la economía española (como ya tratamos en el trabajo grupal) sigue coleccionando récords. Como se puede observar, la inflación prosigue imparable su escalada. El IPC se ha situado en el 6,7% interanual en el mes de diciembre (frente al 5,8% previsto por los expertos), liderado una vez más por un incremento de los precios energéticos (electricidad, petróleo, gas…) que ya está permeando en el resto de la cesta de bienes y servicios.


inflacion_esp_gen <- inflacion_esp %>% filter(tipo == "general")

inflacion_esp_sub <- inflacion_esp %>% filter(tipo == "subyacente")


esp <- ggplot() +
  
  geom_line(data = inflacion_esp_gen, aes(date, value, colour = tipo), size = 1.5) +
  geom_point(data = inflacion_esp_gen, aes(date, value,  colour = tipo, shape = tipo), size = 3) +
  geom_text(data = inflacion_esp_gen, aes(date, value, label = value, colour = tipo), vjust = 2.5,hjust = 0.5, size = 3) +
  geom_text(data = inflacion_esp_gen, aes(date, value, label = "%", colour = tipo), vjust = 2.5,hjust = -1, size = 3) +
  
  geom_line(data = inflacion_esp_sub, aes(date, value,  colour = tipo), size = 1.5) +
  geom_point(data = inflacion_esp_sub, aes(date, value, colour = tipo, shape = tipo), size = 3) +
  geom_text(data = inflacion_esp_sub, aes(date, value, label = value, colour = tipo), vjust = -1.5,hjust = 0.75, size = 3) +
  geom_text(data = inflacion_esp_sub, aes(date, value, label = "%", colour = tipo), vjust = -1.5,hjust = -0.5, size = 3) +
  scale_shape_manual(values = c(15,17)) +
  
  scale_color_manual(breaks = c("general", "subyacente"),
                     values=c("#7C2203", "#F99F5C")) +
  
  geom_hline(yintercept = 0,
             size = 0.25,
             colour = "black",
             linetype = "dashed") +
  
  scale_x_date(date_labels="%b %y", date_breaks  = "1 month") +
  
  theme(axis.text.x = element_text(angle = 70, hjust = 1)) +
  
  lims(y= c(-3, 7)) +
  labs(x = NULL) +
  labs(caption = "Fuente: Elaboración propia con datos de INEbase") +
  theme(panel.grid.major = element_line(colour = NA)) + 
  theme(panel.background = element_rect(fill = "transparent")) +
  theme(legend.title=element_blank()) +
  theme(axis.title.y=element_blank(), axis.text.y=element_blank(),
        axis.ticks.y=element_blank()) +
  labs(colour = "General")  +
  theme(plot.subtitle = element_text(colour = "gray24"),
                                    panel.grid.major = element_line(colour = "white"),
                                    panel.grid.minor = element_line(colour = "white"),
                                    panel.background = element_rect(colour = "white"),
                                    legend.position = "bottom", legend.background = element_rect(fill = "transparent"),
                                    legend.direction = "horizontal") +
  labs(title = "Evolución anual del IPC", subtitle = "Índice general y subyacente.") +
  guides(shape = FALSE) 

esp

Con lo que corresponde al tercer supuesto, déjeme el lector poner en duda que algún gobierno tenga la valentía de hacer las reformas estructurales que hemos planteado, solo en al caso de proponer un ajuste en el sistema de pensiones públicas puede tener un coste político de elevadas dimensiones, recordemos que estamos hablando de aproximadamente de 9.000.000 de pensionistas, es de decir, de votantes. Dato que por cierto va en exponencial aumento.

Otro aspecto interrelacionado con estos tres supuestos los tenemos en la distribución por tenedores de deuda pública española. Como se puede observar, aproximadamente el 50% de la deuda pública española está en manos de inversores extranjeros, adicionalmente, más el 25% corresponde al BCE y el Banco de España. Recordemos que estamos dentro de la eurozona, sin autoridad monetaria, todo queda supeditado a este respecto por el BCE. Tenemos uno de las ratios más elevados de la eurozona, si no empezamos a hacernos nuestras propias cuentas, rápidamente la euro-cámara las hará por nosotros. Los bancos centrales han incrementado su presencia en los últimos 5 años gracias a la flexibilización cuantitativa del BCE, pero esto no va a durar para siempre, la expansión monetaria más tarde que pronto tocará su fin, y, desgraciadamente, no nos pilla preparados parados (alumnos a día de hoy) para afrontar el difícil reto, que no imposible, de reducir nuestro endeudamiento.


aa <- ggplot() +
  geom_col(data = Dist_tenedores, aes(x = reorder(tenedor, value), y = value, fill = value)) +
  scale_fill_continuous(low="#5CD1FE", high="#025271") + 
  coord_flip() +
  guides (fill = FALSE)+
  labs (y = NULL) +
  labs(x = NULL) +
  theme(axis.text.x = element_text(size = 7.5, face = "bold"),
        axis.text.y = element_text(size = 8, face = "bold")) +
  theme(panel.background = element_rect(fill = "transparent")) +
  labs(title = "Distribución por tenedores de la deuda (2002-2020)",
       subtitle = "Periodo: {current_frame}",
       caption = "Fuente: Elaboración propia con datos del Tesoro Público") +
  transition_manual(date) +
  scale_y_continuous(labels = scales::unit_format(unit = "M€", scale = 1e+0))
 


gganimate::animate(aa, nframes = 100, fps = 10, end_pause = 50)

Al igual que con la inflación, debemos empezar a tomarnos muy enserio la situación de nuestro endeudamiento.

LS0tDQp0aXRsZTogIlNvc3RlbmliaWxkYWQgZGUgbGEgZGV1ZGEgcMO6YmxpY2EgZXNwYcOxb2xhIg0KYXV0aG9yOiAiVmljZW50IE1vbXBvIENyZXNwbyAobW9tY3Jlc0BhbHVtbmkudXYuZXMpLiBcblxuIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCmRhdGU6ICJEaWNpZW1icmUgZGUgMjAyMSAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNzczogIi4vYXNzZXRzL2VzdGlsb18xLmNzcyINCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KICAgIHRoZW1lOiBkYXJrDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgZGZfcHJpbnQ6IGthYmxlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpICAgI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoZ2dmbGFncykNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpvcHRpb25zKGtuaXRyLnRhYmxlLmZvcm1hdCA9ICJodG1sIikNCmxpYnJhcnkoc3RyZWFtZ3JhcGgpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoeHRzKQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkodHJlZW1hcCkNCmxpYnJhcnkoZ2lmc2tpKQ0KbGlicmFyeShyZ2RhbCkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShwbmcpDQpsaWJyYXJ5KGVxdWF0aW9tYXRpYykgI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJkYXRhbG9yYXgvZXF1YXRpb21hdGljIikNCmxpYnJhcnkodmVtYmVkcikgI2luc3RhbGwucGFja2FnZXMoInZlbWJlZHIiKQ0KDQpwYWNtYW46OnBfbG9hZChyYXN0ZXIsIHJnZGwsIHJnZW9zLCBicm9vbSkNCnBhY21hbjo6cF9sb2FkKGtuaXRyLCBoZXJlLCB0aWR5dmVyc2UsIHBhdGNod29yaywgZ2dyZXBlbCkNCnBhY21hbjo6cF9sb2FkKHNmLCBybmF0dXJhbGVhcnRoLCBybmF0dXJhbGVhcnRoZGF0YSwgZ2dzcGF0aWFsLCBtYXB2aWV3LCBsZWFmZW0sIGxlYWZsZXQpDQoNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImRncnR3by9nZ2FuaW1hdGUiKQ0KI2luc3RhbGwucGFja2FnZXMgKCJ0cmVlbWFwIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJocmJydGhlbWVzIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImhyYnJtc3RyL3N0cmVhbWdyYXBoIikNCiNpZiAoIXJlcXVpcmUoImRldnRvb2xzIikpIA0KICAjaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQ0KDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJzam1nYXJuaWVyL3ZpcmlkaXMiKQ0KDQpgYGANCg0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYyOCwgb3V0LndpZHRoID0gIjk1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPjxkaXYvPg0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4NClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIxLTIwMjIuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vVmljZW50TW9tcG8vdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiANCg0KPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBleGFjdGFtZW50ZSBpZ3VhbCwgTk8gaGFzIGRlIGNhbWJpYXIgbmFkYS0tPg0KDQpMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4NCg0KPGhyIGNsYXNzPSJsaW5lYS1yZWQiPg0KDQoNCiMjIDEuIEludHJvZHVjY2nDs24NCg0KUGFyYSBsYSBhc2lnbmF0dXJhIGRlICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGhlIGRlY2lkaWRvIHJlYWxpemFyIHVuIGVuc2F5byAoZW4gZm9ybWF0byBybWQpIHNvYnJlIHVuIHRlbWEgcXVlIG1lIGhhIGVzdGFkbyByb25kYW5kbyBsYSBjYWJlemEgZGVzZGUgbGEgZmluYWxpemFjacOzbiBkZSBtaSB0cmFiYWpvIGdydXBhbCBzb2JyZSBsYSBpbmZsYWNpw7NuICgqTGEgaW5mbGFjacOzbiBlbiB0aWVtcG9zIGRlIHBhbmRlbWlhKiksIHNlIHRyYXRhIGRlbCBlc3R1ZGlvIGRlIGxhICoqc29zdGVuaWJpbGlkYWQgZGUgbGEgZGV1ZGEgZXNwYcOxb2xhKiouIA0KDQoqKlJlc3VtZW46KiogTGEgZGV1ZGEgcMO6YmxpY2EgZXNwYcOxb2xhIHNlIHNpdMO6YSBwb3IgcHJpbWVyYSB2ZXogZW4gbGFzIMO6bHRpbWFzIGTDqWNhZGFzIHBvciBlbmNpbWEgZGVsIDEyMCUsIGVuIHVuIGNvbnRleHRvIGRlIGJham9zIHRpcG9zIGRlIGludGVyw6lzLCBpbmZsYWNpw7NuIGVsZXZhZGEgeSBjb24gdW5vcyBwcm9ibGVtYXMgZXN0cnVjdHVyYWxlcyBlbmNhYmV6YWRvcyBwb3IgZWwgcHJvYmxlbWEgZGVsIHNpc3RlbWEgZGUgcmVwYXJ0byBkZSBsYXMgcGVuc2lvbmVzIHDDumJsaWNhcyBlc3Bhw7FvbGFzIHkgc3UgZXN0cnVjdHVyYSBwcm9kdWN0aXZhLCBsaW1pdGFuZG8gYXPDrSBsb3MgZmFjdG9yZXMgcXVlIHBlcm1pdGVuIGxhIHNvc3RlbmliaWxpZGFkIGRlIGN1YWxxdWllciBkZXVkYSBww7pibGljYSBlbiBsYXJnbyBwbGF6by4NCg0KKipUaGUgQWJzdHJhY3Q6KiogRm9yIHRoZSBmaXJzdCB0aW1lIGluIHJlY2VudCBkZWNhZGVzLCBTcGFuaXNoIHB1YmxpYyBkZWJ0IGhhcyByaXNlbiBhYm92ZSAxMjAlLCBpbiBhIGNvbnRleHQgb2YgbG93IGludGVyZXN0IHJhdGVzLCBoaWdoIGluZmxhdGlvbiBhbmQgc3RydWN0dXJhbCBwcm9ibGVtcyBsZWQgYnkgdGhlIHByb2JsZW0gb2YgdGhlIFNwYW5pc2ggcHVibGljIHBlbnNpb24gZGlzdHJpYnV0aW9uIHN5c3RlbSBhbmQgaXRzIHByb2R1Y3RpdmUgc3RydWN0dXJlLCB0aHVzIGxpbWl0aW5nIHRoZSBmYWN0b3JzIHRoYXQgYWxsb3cgdGhlIHN1c3RhaW5hYmlsaXR5IG9mIGFueSBwdWJsaWMgZGVidCBpbiB0aGUgbG9uZyB0ZXJtLg0KDQoqKlBhbGFicmFzIENsYXZlOioqIERldWRhLCBTb3N0ZW5pYmlsaWRhZCwgRXNwYcOxYSwgRMOpZmljaXQsIEdhc3RvLCBJbmdyc29zLCBQZW5zaW9uZXMsIFJhdGlvLCBEZXVkYS9QSUIsIHRhc2EsIGludGVyw6lzLCBhbW9ydGl6YWNpw7NuLCBjb3N0ZS4NCg0KIyMgMi4gTW90aXZhY2lvbmVzDQoNCkFsIGlndWFsIHF1ZSBsYSAqaW5mbGFjacOzbiosIGxhIHByZXNlbnRhY2nDs24gZGUgcmVzdWx0YWRvcyBlbiBsb3Mgw7psdGltb3MgdHJpbWVzdHJlcyBzb2JyZSBsYSAgKipkZXVkYSBww7pibGljYSBlc3Bhw7FvbGEqKiBzZSBoYSBjYXJhY3Rlcml6YWRvIHBvciBtb3N0cmFyIGNvbnNlY3V0aXZhbWVudGUgKipudWV2b3MgbcOheGltb3MgaGlzdMOzcmljb3MqKi4gIEF1bnF1ZSBzdXMgY2F1c2FzIHNvbiBjb21wbGV0YW1lbnRlIG9wdWVzdGFzIGFsIGRlIGxhIGluZmxhY2nDs24gKGNvbW8gcG9zdGVyaW9ybWVudGUgZXhwb25kcmVtb3MpIGNvbnNpZGVybyBxdWUgZXMgdW4gdGVtYSBkZSBlc3R1ZGlvIGNvbXBsZXRhbWVudGUgcmVsYWNpb25hZG8gY29uIG1pICp0cmFiYWpvIGdydXBhbCosIGVzcGVjaWFsbWVudGUgZW4gc3VzIGNvbmNsdXNpb25lcyBhY2VyY2EgZGUgbGEgcG9sw610aWNhIGFkb3B0YWRhIHBvciBlbCBCYW5jbyBDZW50cmFsIEV1cm9wZW8sIGNhcmFjdGVyaXphZGEgcG9yIHVuIG1hbnRlbmltaWVudG8gZGUgdGlwb3MgZGUgaW50ZXLDqXMgYmFqb3MgZW4gZWwgY29ydG8vbWVkaW8gcGxhem8uIA0KDQpQb3Igc2ltaWxpdHVkIHNvYnJlIGxhIHRlbcOhdGljYSBkZSBsb3MgdHJhYmFqb3MsIG5vdGUgZWwgbGVjdG9yIHF1ZSBsYXMgbW90aXZhY2lvbmVzIG5vIHZhbiBhIHZhcmlhciBlbiBncmFuIG1lZGlkYSwgeSwgcG9yIHRhbnRvLCBzZSBwb2Ryw61hbiByZXN1bWlyIGVuIGxvcyBzaWd1aWVudGVzOg0KDQotCUVzdHVkaWFyIGVzdGUgZmVuw7NtZW5vIGVuIG51ZXN0cmEgZWNvbm9tw61hIGRvbcOpc3RpY2EuIEFsIGlndWFsIHF1ZSBjb24gZWwgY2FzbyBkZSBsYSBpbmZsYWNpw7NuLCBlbCBjb250ZXh0byBkZSB1bmEgcmF0aW8gdGFuIGFsdGEgRGV1ZGEvUElCIHNlIHB1ZWRlIGNhdGFsb2dhciBjb21vIGV4Y2VwY2lvbmFsLiBDb25zaWRlcm8gcXVlIHN1IGVzdHVkaW8gcHVlZGUgc2VyIG11eSDDunRpbCBwYXJhIG1pIGZvcm1hY2nDs24gZWNvbsOzbWljYSBlbiBlc3RlIGNhbXBvLg0KDQotCURlc2Fycm9sbGFyIHRhbnRvIGxvcyBjb25vY2ltaWVudG9zIGVjb27Ds21pY29zICh0ZcOzcmljb3MgeSBwcsOhY3RpY29zKSBxdWUgaGUgYWRxdWlyaWRvIGVuIGxhIGNhcnJlcmEsIGNvbW8gZW4gZWwgY3Vyc28gZGUgUi5TdHVkaW8uIEVzcGVjaWFsbWVudGUsIG1pIG9iamV0aXZvIGVzIG1lam9yYXIgbWlzIGhhYmlsaWRhZGVzIGVuIGxhIHByZXNlbnRhY2nDs24gZGUgKipncsOhZmljb3MgZXN0w6F0aWNvcyoqIHF1ZSByZXN1bHRlbiDDunRpbGVzIHBhcmEgbWlzIGZ1dHVyYXMgcHJlc2VudGFjaW9uZXMgc29icmUgZGF0b3MgZWNvbsOzbWljb3MuDQoNCkVsIG9iamV0aXZvIGRlbCBpbmZvcm1lIGVzIHRyYXRhciBkZSBkYXIgcmVzcHVlc3RhIGEgbGEgc2lndWllbnRlIHByZWd1bnRhOg0KDQo+IMK/RGViZSBwcmVvY3VwYXJub3MgbGEgc29zdGVuaWJpbGlkYWQgZGUgbGEgZGV1ZGEgcMO6YmxpY2EgZXNwYcOxb2xhPw0KDQojIyAzLiBEYXRvcyB1dGlsaXphZG9zey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KPGJyPg0KDQojIyMgQ29tZW50YXJpb3MNCg0KQSBjb250aW51YWNpw7NuIHNlIGFkanVudGFuIHRvZG9zIGxvcyBkYXRvcyB1dGlsaXphZG9zIGVuIGVsIGluZm9ybWUuDQoNCjxicj48YnI+DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUaWR5IA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQpkZXVkYSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9EZXVkYS54bHN4IikNCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQoNCiNQaXJhbWlkZSBkZSBQb2JsYWNpw7NuDQoNClBvYl8yMSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9QaXJhbWlkZS54bHN4IikNCg0KbGlicmFyeShyZWFkeGwpDQpQaXJhbWlkZSA8LSByZWFkX2V4Y2VsKCIuL2RhdG9zL1BpcmFtaWRlLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIikpDQpQb2JfMjEgPC0gUG9iXzIxICU+JSANCiAgZHBseXI6OnNlbGVjdChQb2IsU2V4byxHcnVwb19xdWlucXVlbmFsKSAlPiUNCiAgbXV0YXRlKFBvYl9Qb3JjZW50YWplID0gUG9iLzQyMDE4MzA3KQ0KDQpgYGANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KUGFydGlkYXNfZ19wdWIgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvUGFydGlkYXNfR2FzdG8ueGxzeCIpDQoNCmxpYnJhcnkocmVhZHhsKQ0KUGFydGlkYXNfZ19wdWIgPC0gcmVhZF9leGNlbCgiLi9kYXRvcy9QYXJ0aWRhc19HYXN0by54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIikpDQpsaWJyYXJ5KHRyZWVtYXApDQoNClBhcnRpZGFzX2dfcHViXzIwMjEgPC0gUGFydGlkYXNfZ19wdWIgJT4lDQogICAgICBmaWx0ZXIoVGltZSA9PSAiMjAyMSIpICU+JQ0KICAgICAgZHBseXI6OnNlbGVjdCgiUGFydGlkYXNfR2FzdG8iLCAiR2FzdG9fbWlsbG9uZXMiKSAlPiUNCiAgICAgIHNsaWNlX21heCAoR2FzdG9fbWlsbG9uZXMgLCBuID0gMTYpDQoNClBhcnRpZGFzX2dfcHViXzIwMTYgPC0gUGFydGlkYXNfZ19wdWIgJT4lDQogIGZpbHRlcihUaW1lID09ICIyMDE2IikgJT4lDQogIGRwbHlyOjpzZWxlY3QoIlBhcnRpZGFzX0dhc3RvIiwgIkdhc3RvX21pbGxvbmVzIikgJT4lDQogIHNsaWNlX21heCAoR2FzdG9fbWlsbG9uZXMgLCBuID0gMTYpDQoNCmBgYA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KI0luZ3Jlc29zL0dhc3Rvcy9Ew6lmaWNpdA0KDQpjdWVudGFzX3B1YiA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9jdWVudGFzX3B1Yi54bHN4IikNCg0KQ3VlbnRhc19wdWIgPC0gcmVhZF9leGNlbCgiLi9kYXRvcy9DdWVudGFzX3B1Yi54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpDQoNCg0KY3VlbnRhc19wdWJfbG9uZyA8LSBjdWVudGFzX3B1YiAlPiUgDQogIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9IDI6MjcsIG5hbWVzX3RvID0gImHDsW8iKQ0KDQpjdWVudGFzX3B1Yl9sb25nX2dhc3RvIDwtIGN1ZW50YXNfcHViX2xvbmcgJT4lDQogIGZpbHRlcihUaXBvID09ICJHYXN0b3MiKSANCg0KY3VlbnRhc19wdWJfbG9uZ19pbmdyZXNvcyA8LSBjdWVudGFzX3B1Yl9sb25nICU+JQ0KICBmaWx0ZXIoVGlwbyA9PSAiSW5ncmVzb3MiKSANCg0KY3VlbnRhc19wdWJfbG9uZ19kZiA8LSBjdWVudGFzX3B1Yl9sb25nICU+JQ0KICBmaWx0ZXIoVGlwbyA9PSAiRGVmaWNpdC9TdXBlcmF2aXQiKSANCg0KDQpEZWZpY2l0X1BJQiA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9EZWZpY2l0X1BJQi54bHN4IikNCg0KRGVmaWNpdF9QSUIgPC0gcmVhZF9leGNlbCgiLi9kYXRvcy9EZWZpY2l0X1BJQi54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIikpDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQojTWFwYXMgUHJlc2nDs24NCg0KI2FhIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL1BGLnhsc3giKQ0KDQojcmlvOjpleHBvcnQoYWEsICIuL2RhdG9zL1BGLmNzdiIpDQoNCiNQRiA8LSByZWFkX2NzdigiLi9kYXRvcy9QRi5jc3YiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyhkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLyVtIikpKQ0KDQojUEZfbG9uZyA8LSBQRiAlPiUgDQojIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9IDI6MTMsIG5hbWVzX3RvID0gInRpbWUiKQ0KDQojcmlvOjpleHBvcnQoUEZfbG9uZywgIi4vZGF0b3MvUEZfbG9uZy5jc3YiKQ0KDQpQRl9sb25nIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL1BGX2xvbmcuY3N2IikNCg0KbGlicmFyeShyZWFkcikNClBGX2xvbmcgPC0gcmVhZF9jc3YoIi4vZGF0b3MvUEZfbG9uZy5jc3YiLCANCiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyh0aW1lID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLyVtIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sX251bWJlcigpKSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQp3b3JsZCA8LSBybmF0dXJhbGVhcnRoOjpuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0Kd29ybGQgPC0gd29ybGQgJT4lIGZpbHRlcihzdWJyZWdpb24gIT0gIkFudGFyY3RpY2EiKSAlPiUgZmlsdGVyKGFkbWluICE9ICJHcmVlbmxhbmQiKQ0Kd29ybGQgPC0gd29ybGQgJT4lIGRwbHlyOjpzZWxlY3QobmFtZSwgaXNvX2EzLCBnZW9tZXRyeSkNCg0KUEZfZ2VvbV9ldXJvcCA8LSBsZWZ0X2pvaW4oUEZfbG9uZywgd29ybGQsIGJ5ID0gYygiY291bnRyeSIgPSAibmFtZSIpKSANCiANCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQoNCiNkZXBlbmRlbmNpYQ0KbGlicmFyeShnZ2ZsYWdzKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCg0KI2FhIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3Rhc2FfZGVwLmNzdiIpDQoNCiN0YXNhX2RlcCA8LSBhYSAlPiUNCiMgIGRwbHlyOjpzZWxlY3QoZ2VvLFRJTUVfUEVSSU9ELCBPQlNfVkFMVUUpIA0KDQojcmlvOjpleHBvcnQodGFzYV9kZXAsICIuL2RhdG9zL3Rhc2FfZGVwLnhsc3giKQ0KDQojYWEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvdGFzYV9kZXAuY3N2IikNCg0KYWEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvdGFzYV9kZXAueGxzeCIpDQoNCmxpYnJhcnkocmVhZHhsKQ0KdGFzYV9kZXAgPC0gcmVhZF9leGNlbCgiLi9kYXRvcy90YXNhX2RlcC54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiKSkNCnRhc2FfZGVwIDwtIHRhc2FfZGVwICU+JQ0KICBkcGx5cjo6c2VsZWN0KFRJTUVfUEVSSU9ELCBnZW9fMSwgT0JTX1ZBTFVFKQ0KDQp0YXNhX2RlcCRjb2RlPC10b2xvd2VyKGNvdW50cnljb2RlKHRhc2FfZGVwJGdlb18xLCBvcmlnaW4gPSAnaXNvMmMnLCBkZXN0aW5hdGlvbiA9ICdpc28yYycpKQ0KDQpgYGANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KI0VzZnVlcnpvL1ByZXNpw7NuIGZpc2NhbA0KDQojRXNmdWVyem8vUHJlc2nDs24gZmlzY2FsDQoNClBGX2xvbmcgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvUEZfbG9uZy5jc3YiKQ0KDQpsaWJyYXJ5KHJlYWRyKQ0KUEZfbG9uZyA8LSByZWFkX2NzdigiLi9kYXRvcy9QRl9sb25nLmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKHRpbWUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVkvJW0iKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2xfbnVtYmVyKCkpKQ0KUEZfbG9uZyA8LSBQRl9sb25nICU+JQ0KICBmaWx0ZXIodGltZSA9PSAiMjAyMC0wMS0wMSIpDQoNCiNQaWJfY2FwX2V1IDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL1BpYl9jYXBfZXUueGxzeCIpDQoNCiNsaWJyYXJ5KHJlYWR4bCkNCg0KI1BpYl9jYXBfZXUgPC0gcmVhZF9jc3YoIi4vZGF0b3MvUGliX2NhcF9ldS54bHN4IiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIikpDQoNCiNyaW86OmV4cG9ydChQaWJfY2FwX2V1LCAiLi9kYXRvcy9QaWJfY2FwX2V1LmNzdiIpDQoNClBpYl9jYXBfZXUgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvUGliX2NhcF9ldS5jc3YiKQ0KDQpQaWJfY2FwX2V1IDwtIFBpYl9jYXBfZXUgJT4lDQogIHJlbmFtZSgiY291bnRyeSIgPSAiQ291bnRyaWVzIikNCg0KRV9QIDwtIGxlZnRfam9pbihQaWJfY2FwX2V1LCBQRl9sb25nLCBieSA9ICJjb3VudHJ5IikgDQoNCkVfUF8xIDwtIEVfUCAlPiUNCiAgZmlsdGVyKCFjb3VudHJ5ICVpbiUgYygiQ3plY2ggUmVwdWJsaWMiLCAibWFsdCIpKSAlPiUNCiAgcmVuYW1lKCJQcmVzaW9uX2Zpc2MiID0gInZhbHVlIikgJT4lDQogIGRwbHlyOjptdXRhdGUoZXNmdWVyem9fZmlzYyA9IFByZXNpb25fZmlzYy9QSUJfY2FwICogMTAwKSAlPiUNCiAgZHBseXI6Om11dGF0ZShQcmVzaW9uX2Zpc2MgPSBQcmVzaW9uX2Zpc2MvMTAwKSAlPiUNCiAgZHBseXI6Om11dGF0ZShkaWYgPSBQcmVzaW9uX2Zpc2MgLSBlc2Z1ZXJ6b19maXNjKSAlPiUNCiAgdGlkeXI6OnBpdm90X2xvbmdlcihjb2xzID0gNDo1LCBuYW1lc190byA9ICJ0aXBvIikNCg0KcGYgPC0gRV9QXzEgICU+JQ0KICBmaWx0ZXIodGlwbyA9PSAiUHJlc2lvbl9maXNjIikNCg0KZWYgPC0gRV9QXzEgICU+JQ0KICBmaWx0ZXIodGlwbyA9PSAiZXNmdWVyem9fZmlzYyIpDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQoNCiNUYWJsYS9ncsOhZmljbyB0aXBvIGRlIGludGVyw6lzIG1lZGlvIA0KDQpjb3N0ZV9kZXVkYSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9jb3N0ZV9kZXVkYS54bHN4IikNCg0KYmIgPC0gY29zdGVfZGV1ZGENCg0KY29zdGVfZGV1ZGFfbG9uZyA8LSBjb3N0ZV9kZXVkYSAlPiUgDQogIHRpZHlyOjpwaXZvdF9sb25nZXIoY29scyA9IDI6NiwgbmFtZXNfdG8gPSAidGlwbyIpICU+JQ0KICBtdXRhdGUodmFsdWVfMSA9IHZhbHVlLzEwMCkNCg0KDQpgYGANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KI1RlbmVkb3Jlcw0KDQphYSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9EaXN0cmlidWNpb25fdGVuZWRvcmVzLnhsc3giKQ0KDQpEaXN0cmlidWNpb25fdGVuZWRvcmVzIDwtIGFhICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDI6MTIsIG5hbWVzX3RvID0gInRlbmVkb3IiKSAlPiUNCnJlbmFtZSgiZGF0ZSIgPSAiRkVDSEEiKQ0KDQojcmlvOjpleHBvcnQoRGlzdHJpYnVjaW9uX3RlbmVkb3JlcywiLi9kYXRvcy9EaXN0cmlidWNpb25fdGVuZWRvcmVzLmNzdiIpDQoNCmxpYnJhcnkocmVhZHIpDQpEaXN0X3RlbmVkb3JlcyA8LSByZWFkX2NzdigiLi9kYXRvcy9EaXN0cmlidWNpb25fdGVuZWRvcmVzLmNzdiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKGRhdGUgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJVkvJW0iKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2xfbnVtYmVyKCkpKQ0KDQoNCkRpc3RfdGVuZWRvcmVzIDwtIERpc3RfdGVuZWRvcmVzICU+JQ0KICBmaWx0ZXIgKCF0ZW5lZG9yID09ICJUT1RBTCIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQojIERhdG9zIGRlIGxhIE9DREUgZGUgbGEgcHJldmlzaW9uIGRlbCBjcmVjaW1pZW50byBkZWwgUElCIGV1cm96b24NCg0KY3JlY2ltaWVudG8gPC0gcmVhZF9jc3YoIi4vZGF0b3MvY3JlY2ltaWVudG8uY3N2IiwgDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKFZhbHVlID0gY29sX251bWJlcigpKSkNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQojaW5mbGFjaW9uX2VzcCA8LSByZWFkX2V4Y2VsKCIuL2RhdG9zL2luZmxhY2lvbl9lc3AueGxzeCIpDQoNCiNpbmZsYWNpb25fZXNwIDwtIGluZmxhY2lvbl9lc3AgICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDI6MjUsIG5hbWVzX3RvID0gImRhdGUiKQ0KDQoNCiNyaW86OmV4cG9ydChpbmZsYWNpb25fZXNwLCIuL2RhdG9zL2luZmxhY2lvbl9lc3AuY3N2IikNCg0KaW5mbGFjaW9uX2VzcCA8LSByZWFkX2NzdigiLi9kYXRvcy9pbmZsYWNpb25fZXNwLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoZGF0ZSA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlWS8lbSIpKSkNCg0KYGBgDQoNCiMjIDQuIEV2b2x1Y2nDs24gZGUgbGEgZGV1ZGEgcMO6YmxpY2EgZXNwYcOxb2xhIGVuIGRlbW9jcmFjaWEuDQoNCkVuIHByaW1lciBsdWdhciwgZGViZW1vcyBkZWZpbmlyIHF1w6kgZW50ZW5kZW1vcyBwb3IgZGV1ZGEgcMO6YmxpY2EuDQoNCj4gKipEZWZpbmljacOzbiB0w6ljbmljYSoqOiBMYSBkZXVkYSBww7pibGljYSBlcyBsYSAqZGV1ZGEgdG90YWwqIHF1ZSBtYW50aWVuZSB1biBkZXRlcm1pbmFkbyBlc3RhZG8gY29uIGludmVyc29yZXMgcGFydGljdWxhcmVzIG5hY2lvbmFsZXMgZSBpbnRlcm5hY2lvbmFsZXMuIA0KDQpDdWFuZG8gbm9zIHJlZmVyaW1vcyBhIGxhICoqZGV1ZGEgdG90YWwqKiBoYWNlbW9zIHJlZmVyZW5jaWEgYSAqKmxhIGRldWRhIGRlIHRvZG8gZWwgY29uanVudG8gZGUgbGFzIGFkbWluaXN0cmFjaW9uZXMgcMO6YmxpY2FzKiouIFBhcmEgbnVlc3RybyBjYXNvIGRlIGVzdHVkaW8sIGNvcnJlc3BvbmRlIGEgbGEgc3VtYSBkZSBsYSBkZXVkYSBkZWwgZXN0YWRvIGNlbnRyYWwsIGRlIGxhcyAxNyBjb211bmlkYWRlcyBhdXTDs25vbWFzIHkgZGUgdG9kYXMgYWRtaW5pc3RyYWNpb25lcyBsb2NhbGVzLg0KDQpFc3RhbW9zIGhhYmxhbmRvIGRlIHVuYSAqKnZhcmlhYmxlIGFjdW11bGF0aXZhKiouIEVzdGEgYWN1bXVsYWNpw7NuIHNlIHByb2R1Y2UgY3VhbmRvIGVsIGVzdGFkbyBpbmN1cnJlIGVuIGTDqWZpY2l0IHDDumJsaWNvIGVuIHVuIGRldGVybWluYWRvIGVqZXJjaWNpbyBmaXNjYWwsIHBvciB0YW50bywgc2UgdmUgb2JsaWdhZG8gYSBsYSBmaW5hbmNpYWNpw7NuIGV4dGVybmEgbWVkaWFudGUgbGEgZW1pc2nDs24gZGUgIHVuYSB2YXJpZWRhZCBkZSBhY3Rpdm9zIGZpbmFuY2llcm9zICgqbGV0cmFzIGRlbCB0ZXNvcm8sIGJvbm9zLCBvYmxpZ2FjaW9uZXMsIGVudHJlIG90cm9zLiopLiBUb2RvIGVzdG8gY29uIGVsIMO6bmljbyBmaW4gZGUgbWFudGVuZXIgdW4gbml2ZWwgZGUgZ2FzdG8gcXVlIHN1IHJlbnRhLCBwb3Igc2kgc29sYSwgbm8gbGUgcGVybWl0ZSBhbGNhbnphci4gRXN0YSBkZXVkYSBzZSB2YSBhbW9ydGl6YW5kbyBhIGxvIGxhcmdvIGRlIGxvcyBlamVyY2ljaW9zIGEgdW4gZGV0ZXJtaW5hZG8gKip0aXBvIGRlIGludGVyw6lzKiogKHByZWZpamFkbyBwb3IgbGFzIGF1dG9yaWRhZGVzIG1vbmVydMOhcmlhcykgcXVlIHZhIGZsdWN0dWFuZG8sIHBhcmEgY2FkYSBlY29ub23DrWEsIHNlZ8O6biBsYSBjb25maWFuemEgcXVlIHRlbmdhbiBsb3MgbWVyY2Fkb3MgZmluYW5jaWVyb3MgIGVuIHF1ZSBlbCBlc3RhZG8gdmEgYSBkZXZvbHZlciBlbCBkaW5lcm8uDQoNClN1ICoqc29zdGVuaWJpbGlkYWQqKiBkZXBlbmRlIGRlIGN1YXRybyBlbGVtZW50b3MgaW50ZXJyZWxhY2lvbmFkb3M6IA0KDQoxLiAqKkVsIG5pdmVsIGRlIGRldWRhIGRlbCBxdWUgcGFydGFtb3MqKi4NCjIuICoqRWwgcmVzdWx0YWRvIHkgdGVuZGVuY2lhIGRlbCBzYWxkbyBmaXNjYWwqKiBkZSBsb3Mgw7psdGltb3MgZWplcmNpY2lvcyBmaXNjYWxlcy4NCjMuICoqRWwgY29zdGUgZGUgYW1vcnRpemFjacOzbiBkZSBsYSBkZXVkYSoqLCBkZXRlcm1pbmFkbyBwb3IgbGFzIGV4cGVjdGF0aXZhcyBkZWwgbWVyY2FkbyB5IGxhIHBvbMOtdGljYSBtb25ldGFyaWEgZGVsIGJhbmNvIGNlbnRyYWwgZW4gY29uY3JldG8NCjQuICoqRWwgY3JlY2ltaWVudG8gZWNvbsOzbWljbyoqLg0KDQoNCiMjIyA0LjEuIEVsIG5pdmVsIGRlIGRldWRhIGRlbCBxdWUgcGFydGFtb3MNCg0KQ29uIGxvIHF1ZSBjb3JyZXNwb25kZSBhbCAqKnByaW1lciBwdW50byoqLCBlbiBsYSBhY3R1YWxpZGFkICh2w6lhc2UgZ3LDoWZpY28gZGUgbGEgZXZvbHVjacOzbiBkZSBsYSBkZXVkYSBww7pibGljYSkgZGlzcG9uZW1vcyBkZSB1biBwdW50byBkZSBwYXJ0aWRhIHByZW9jdXBhbnRlIGFsIGFsY2FuemFyIGVsICoqbWF5b3Igbml2ZWwgZGUgZW5kZXVkYW1pZW50byBlc3RhdGFsIGRlc2RlIGZpbmFsZXMgZGVsIHNpZ2xvIFhJWCoqLiBMYSBlY29ub23DrWEgZXNwYcOxb2xhIGhhIGV4cGVyaW1lbnRhZG8gdW4gYWN1c2FkbyBjcmVjaW1pZW50byBkZSBzdSByYXRpbyBEZXVkYS9QSUIgZW4gbGEgw7psdGltYSBkw6ljYWRhLg0KDQpOb3RlIGVsIGxlY3RvciBxdWUgZXN0ZSBkYXRvICgqZWwgZGUgcHVudG8gZGUgcGFydGlkYSopIHF1ZWRhIGNvbXBsZXRhbWVudGUgY29uZGljaW9uYWRvIHBvciBsYSBsbGVnYWRhIGRlIGxhIHBhbmRlbWlhLCBlc3RvIHNlIHB1ZWRlIGFwcmVjaWFyIGVuIGxhIGFjZWxlcmFjacOzbiBxdWUgc2UgcHJvZHVjZSBlbnRyZSAyMDE5IHkgMjAyMC4gVG9kbyBlc3RvIHRpZW5lIHVuYSByYXrDs24gZWNvbsOzbWljYSBsw7NnaWNhOyBsYSBjb3ZpZCAtMTkgaGEgZm9yemFkbyBsYSBwYXJhbGl6YWNpw7NuIGRlIGxhIGFjdGl2aWRhZCBlY29uw7NtaWNhLiBBbnRlIGVzdGUgZXNjZW5hcmlvLCBsYSBwcmluY2lwYWwgZXN0cmF0w6lnaWNhIHBhcmEgZWwgZ29iaWVybm8sIHJlY29yZGVtb3MsIGNvbiBlbCBmaW4gZGUgcHJvdGVnZXIgYSBsb3MgdHJhYmFqYWRvcmVzIHkgZWwgdGVqaWRvIGVtcHJlc2FyaWFsIHkgaGFjZXIgZnJlbnRlIGFsIGF1bWVudG8gZGUgZ2FzdG8gc2FuaXRhcmlvIG9jYXNpb25hZG8gY29uIGxhIHBhbmRlbWlhLCBoYSAgc2lkbyBsbGV2YXIgYSBjYWJvIHVuYSBwb2zDrXRpY2EgZmlzY2FsIGV4cGFuc2l2YSBmaW5hbmNpYWRhIHBvciBlbWlzacOzbiBkZSBudWV2YSBkZXVkYSBww7pibGljYSwgcmVzcGFsZGFkYSBjYXNpIGVuIHN1IHRvdGFsaWRhZCBwb3IgZWwgQmFuY28gQ2VudHJhbCBFdXJvcGVvLg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQoNCmFhIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGRldWRhLCBhZXMoeCA9IERhdGUsIHkgPSBEZXVkYV9wb3JjZW50YWplX1BJQiwgZmlsbCA9IERldWRhX3BvcmNlbnRhamVfUElCKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArDQogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3c9IiNGMkQ3RDUiLCBoaWdoPSIjNjQxRTE2IikgKyANCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IikpICsNCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhIERldWRhIEVzcGHDsW9sYSAoJVBJQikiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZSBJTkViYXNlIikgKw0KICBsYWJzICh5ID0gTlVMTCkgKw0KICBsYWJzKHggPSBOVUxMKSArDQogIGd1aWRlcyAoZmlsbCA9IEZBTFNFKQ0KICANCmFhDQoNCmBgYA0KDQoNCkF1bnF1ZSBlc3RhIGVzdHJhdGVnaWEgbm8gZXMgZW4gc8OtIGNyaXRpY2FibGUsIHlhIHF1ZSBlcmEgbG8gcXVlIGV4aWfDrWEgbGEgc2l0dWFjacOzbiBwYXJhIGhhY2VyIGZyZW50ZSBhbCBpbmVzcGVyYWRvIHNob2NrLCBzaSBsbyBlcyBsYSBmYWx0YSBkZSBjb250cm9sIHByZXN1cHVlc3RhcmlvLCBlc3BlY2lhbG1lbnRlIGVuIGxhIMO6bHRpbWEgZMOpY2FkYSB1bmEgdmV6IGZpbmFsaXphZGEgbGEgY3Jpc2lzIGRlbCAyMDA4LiBDb24gZXN0byBlbnRyYW1vcyBhIGFuYWxpemFyIGVsICoqcHVudG8gMioqLg0KDQoNCiMjIyA0LjIuIFJlc3VsdGFkbyB5IHRlbmRlbmNpYSBkZWwgc2FsZG8gZmlzY2FsLg0KDQpMYSBlY29ub23DrWEgZXNwYcOxb2xhIHNlIGhhIGNhcmFjdGVyaXphZG8gZW4gbG9zIMO6bHRpbW9zIGHDsW9zLCBhIGRpZmVyZW5jaWEgZGUgc3VzIHZlY2lub3MgZXVyb3Blb3MgKCpBbGVtYW5pYSwgSG9sYW5kYeKApiopIHBvciBsYSAqKmFjdW11bGFjacOzbiBkZSBzYWxkb3MgcHJlc3VwdWVzdGFyaW9zIGRlZmljaXRhcmlvcyoqLiBDb21vIHNlIHB1ZWRlIG9ic2VydmFyICh2w6lhc2UgZ3LDoWZpY28g4oCcKkV2b2x1Y2nDs24gSW5ncmVzb3MvR2FzdG9zKuKAnSksIGVuIGxvcyDDumx0aW1vcyAyNSBhw7FvcyBzb2wgaGVtb3MgcHJlc2VudGFkbyBjaWVydG9zIGVqZXJjaWNpb3MgY29uIGVxdWlsaWJyaW8gcHJlc3VwdWVzdGFyaW8gYSBwcmluY2lwaW9zIGRlbCBudWV2byBzaWdsbyB5ICoqaGVtb3MgcHJlc2VudGFkbyAzIGVqZXJjaWNpb3MgKCoyMDA1LCAyMDA2LCAyMDA3KikgY29uIHN1cGVyw6F2aXQqKi4gRXN0YSB0ZW5kZW5jaWEgc2UgYWdyYXZhIGNvbiBsYSBsbGVnYWRhIGRlIGxhIGNyaXNpcyBmaW5hbmNpZXJhIGRlbCAyMDA4LCBhdW5xdWUgcXVlZGEgdG90YWxtZW50ZSBqdXN0aWZpY2FkYSBlbCBubyBjdW1wbGltaWVudG8gZGUgbGEgZGlzY2lwbGluYSBmaXNjYWwgZW4gw6lwb2NhIGRlIGNyaXNpcywgc2kgZXMgdmVyZGFkIHF1ZSBlbiBsb3MgcG9zdGVyaW9yZXMgYcOxb3Mgc2UgaGEgb3B0YWRvIHBvciB1bmEgKipmYWx0YSBkZSBlc2Z1ZXJ6byBwb3IgcmVkdWNpciBsb3MgZGVzZXF1aWxpYnJpb3MgcHJlc3VwdWVzdGFyaW9zIGVzdHJ1Y3R1cmFsZXMgZGUgbGEgZWNvbm9tw61hIGVzcGHDsW9sYSoqLiBUb2RvIGVzdG8gc2UgdHJhZHVjZSBlbiBsbyBhbnRlcmlvcm1lbnRlIGRlc2NyaXRvLCB1bmEgbWVub3IgZGlzY2lwbGluYSBmaXNjYWwgaW1wbGljYSB1biAqKnBlcm8gcHVudG8gZGUgcGFydGlkYSoqIHBhcmEgbGEgbGxlZ2FkYSBkZSBsYXMgbnVldmFzIGNyaXNpcyAoZWplbXBsbyBjbGFybyBsbyBoZW1vcyB2aXN0byBlbiBlbCAyMDIwKS4NCg0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgdW5hIHZleiBtZWpvcmFkYSBsYSBzaXR1YWNpw7NuIHBvc3QtY3Jpc2lzIGZpbmFuY2llcmEsIG5vIHNlIG9wdMOzIHBvciBsYSByZWR1Y2Npw7NuIGRlbCBnYXN0byBww7pibGljbywgYXVucXVlIHN1IGNyZWNpbWllbnRvIGV4cG9uZW5jaWFsIHByZXZpbyBhIDIwMDggc2UgcmFsZW50aXrDsyBiaWVuIGVzIHZlcmRhZCBxdWUgbm8gc2UgaGEgdmlzdG8gcmVkdWNpZG8sIHNpbm8gbcOhcyBiaWVuIGFsIGNvbnRyYXJpby4gVW5hIGNvbmNsdXNpw7NuIHF1ZWRhIGNsYXJhLCBzaSBxdWVyZW1vcyBubyBlbXBlb3JhciBudWVzdHJhIHNpdHVhY2nDs24gZGUgcGFydGlkYSAoKnB1bnRvIDEgZGUgbGEgc29zdGVuaWJpbGlkYWQqKSBkZWJlbW9zIGRlIGVtcGV6YXIgYSAqKnNlciBhdXN0ZXJvcyoqLCAqbm8gbm9zIHF1ZWRhIG90cmEqLiANCg0KPiAqKkEgbWVkaW8gcGxhem8sIGhlbW9zIGRlIGVxdWlsaWJyYXIgU8ONIG8gU8ONIG51ZXN0cm8gcHJlc3VwdWVzdG8gcGFyYSBjb21lbnphciBhIHJlZHVjaXIgbnVlc3RybyBhbHTDrXNpbW8gc3RvY2sgZGUgZGV1ZGEgcMO6YmxpY2EuKioNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KYmIgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjdWVudGFzX3B1Yl9sb25nX2dhc3RvLCBhZXMoeCA9IGHDsW8sIHkgPSB2YWx1ZSwgY29sb3IgPSBUaXBvLHNoYXBlID0gVGlwbyksIHNpemUgPSAzLCBjb2xvcj0gIiNBOTA3MjkiKSArDQogIGdlb21fbGluZShkYXRhID0gY3VlbnRhc19wdWJfbG9uZ19nYXN0bywgYWVzKHggPSBhw7FvLCB5ID0gdmFsdWUsIGNvbG9yID0gVGlwbyksIHNpemUgPSAxLjUsIGdyb3VwID0gInZhbHVlIiwgY29sb3I9ICIjQTkwNzI5IikgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjdWVudGFzX3B1Yl9sb25nX2luZ3Jlc29zLCBhZXMoeCA9IGHDsW8sIHkgPSB2YWx1ZSwgc2hhcGUgPSBUaXBvLCBjb2xvciA9IFRpcG8pLHNpemUgPSA0LCBjb2xvcj0gIiNFNDgyOTciKSArDQogIGdlb21fbGluZShkYXRhID0gY3VlbnRhc19wdWJfbG9uZ19pbmdyZXNvcywgYWVzKHggPSBhw7FvLCB5ID0gdmFsdWUsIGNvbG9yID0gVGlwbyksIHNpemUgPSAxLjUsIGdyb3VwID0gInZhbHVlIiwgY29sb3I9ICIjRTQ4Mjk3IikgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxOCkpICsNCiAgZ2VvbV9jb2woZGF0ID0gY3VlbnRhc19wdWJfbG9uZ19kZiwgYWVzKHggPSBhw7FvLCB5ID0gdmFsdWUsIGZpbGwgPSB2YWx1ZSkpICsNCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdz0iIzg2RTFFNyIsIGhpZ2g9IiMwNTk3QTEiKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpKSArDQogIGxhYnMoeSA9IE5VTEwpICsNCiAgbGFicyh4PSBOVUxMKSArDQogIGd1aWRlcyAoY29sb3IgPSBGQUxTRSkgKw0KICBndWlkZXMgKHNoYXBlID0gRkFMU0UpICsNCiAgZ3VpZGVzIChmaWxsID0gRkFMU0UpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBEZWZpY2l0X1BJQiwgYWVzKFRpbWUsIFZhbHVlLCBsYWJlbCA9IFZhbHVlKSwgeT0gNTAwMDAsIHNpemUgPSAyLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBnZW9tX3RleHQoZGF0YSA9IERlZmljaXRfUElCLCBhZXMoVGltZSwgVmFsdWUsIGxhYmVsID0gIiUiKSwgeT0gNTAwMDAsIGhqdXN0ID0gLTEuNzUsIHNpemUgPSAxLjUsIGZvbnRmYWNlPSJib2xkIikgKw0KICBhbm5vdGF0ZShnZW9tID0gInRleHQiLA0KICAgICAgICAgICB4PSAzLA0KICAgICAgICAgICB5ID0gODAwMDAsDQogICAgICAgICAgIGxhYmVsID0gIkTDqWZpY2l0L1BJQiIsDQogICAgICAgICAgIHNpemUgPSAyLjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1jKDIwMDAwMCwgNDAwMDAwLCA2MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCIyMDAuMDAwIOKCrCIsICI0MDAuMDAwIOKCrCIsICI2MDAuMDAwIOKCrCIpKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9cmVsKDAuOCksIGZhY2UgPSAiYm9sZCIpKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzAgLCBoanVzdCA9IDEsIGZhY2UgPSAiYm9sZCIpKSArDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBJbmdyZXNvcy9HYXN0b3MgdG90YWxlcyBlbiBtaWxsb25lcyBkZSDigqwgKDE5OTUtMjAyMCkiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZSBFdXJvc3RhdCBEYXRhQmFzZSIpIA0KDQpiYg0KDQpgYGANCg0KRXN0byByZXF1ZXJpcsOhIGRlIHN1YmlkYXMgZGUgaW1wdWVzdG9zLCBkZSBhdWRhY2VzIHJlY29ydGVzIGRlbCBnYXN0byBpbm5lY2VzYXJpbyBvIHRhc2FzIGRlIGNyZWNpbWllbnRvIGRlIGxhIHByb2R1Y3RpdmlkYWQgbWF5b3JlcyBkZSBsYXMgcXVlIGxvIGhhY2UgbGEgZGV1ZGEuIExhIGbDs3JtdWxhIGVzdMOhIHBvciBkZXRlcm1pbmFyLCBwZXJvIHVuYSBjb3NhIHF1ZWRhIGNsYXJhLCAqKmN1YW50byBhbnRlcyBub3MgbWVudGFsaWNlbW9zIGRlIHF1ZSBoYXkgcXVlIGVxdWlsaWJyYSBudWVzdHJhcyBjdWVudGFzLCAgbWVqb3IgcGFyYSB0b2Rvcy4qKg0KDQoNCiMjIyA0LjMuIEVsIGNvc3RlIGRlIGFtb3J0aXphY2nDs24gZGUgbGEgZGV1ZGEuIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVsIGxlY3RvciBwdWVkZSBwZW5zYXIgcXVlIGVzdG9zIGRhdG9zIGVuIHNpIHRhbXBvY28gZXN0w6FuIHN1cG9uaWVuZG8gZW4gZWwgbW9tZW50byBxdWUgc2UgZXN0w6EgZXNjcmliaWVuZG8gZXN0ZSBhcnTDrWN1bG8gdW4gcHJvYmxlbWEgcGFyYSBsYSBlY29ub23DrWEgZXNwYcOxb2xhLiBQZXJvLCDCv2EgcXXDqSBzZSBkZWJlIGVzdG8/LiBTaSBlc3RhbW9zIGV4cG9uaWVuZG8gcXVlIHRlbmVtb3MgY2llcnRvcyBwcm9ibGVtYXMgKiplc3RydWN0dXJhbGVzKiogZW4gbnVlc3RybyBwcmVzdXB1ZXN0bywgbG8gbMOzZ2ljbyAoKmhhY2llbmRvIHVzbyBkZSBsYXMgdGVvcsOtYXMgZWNvbsOzbWljYXMqKSBzZXLDrWEgcGVuc2FyIHF1ZSB0YW1iacOpbiAqKmRlYmVyw61hbW9zIHRlbmVyIHByb2JsZW1hcyBwYXJhIGV4cGFuZGlyIG51ZXN0cmEgZGV1ZGEgZW4gbG9zIG1lcmNhZG9zIGZpbmFuY2llcm9zKiouIFB1ZXMgYmllbiwgZXN0byBubyBlcyBhc8OtLCBtw6FzIGJpZW4gbG8gY29udHJhcmlvLg0KDQpMYSAqKnJlc3B1ZXN0YSoqIGEgZXN0byBsYSB0ZW5lbW9zICgqY29tbyB5YSBhcHVudMOhYmFtb3MgZW4gZWwgdHJhYmFqbyBncnVwYWwqKSBlbiBsb3MgKipiYWpvcyB0aXBvcyBkZSBpbnRlcsOpcyoqLCBjb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVsIGNvc3RlIGRlIGVuZGV1ZGFtaWVudG8gZGVzZGUgMjAwMiBzZSBlbmN1ZW50cmEgaGFzdGEgZMOtYSBkZSBob3kgZW4gKuKAnWNhw61kYSBsaWJyZeKAnSouIEVzIHBvciBlc3RvIHF1ZSAqKmxhIGVjb25vbcOtYSBlc3Bhw7FvbGEgY29udGluw7phIGVuZGV1ZMOhbmRvc2UgYSB1biBjb3N0ZSBiYWpvKiosIHBvciBlbCBtb21lbnRvLiBFeGlzdGUgdW5hIG3DoXMgcXVlIGZ1bmRhZGEgZXhwZWN0YXRpdmEgZGUgKmFzaXN0ZW5jaWEgZmluYW5jaWVyYSogcG9yIHBhcnRlIGRlIGxhIGV1cm96b25hLCBwb3IgdGFudG8sICoqbG9zIG1lcmNhZG9zIGNvbmbDrWFuIGVuIHF1ZSBudWVzdHJvcyBzb2Npb3MgbW9uZXRhcmlvcyBubyB2YW4gYSBwZXJtaXRpciBxdWUgc2UgZWxldmVuIGRlbWFzaWFkbyBsb3MgZGlmZXJlbmNpYWxlcyBkZSByaWVzZ28gZW50cmUgbG9zIGRpc3RpbnRvcyB0w610dWxvcyBkZSBkZXVkYSBlc3RhdGFsKiouIERlIGFow60gcXVlLCBhIGTDrWEgZGUgaG95LCBlY29ub23DrWFzIGNvbW8gbGEgZXNwYcOxb2xhICgqcXVlIG5vIGVzdMOhbiBjdW1wbGllbmRvIGNvbiBzdXMgb2JsaWdhY2lvbmVzIGZpc2NhbGVzKikgZXN0w6FuIHNpZW5kbyBjYXBhY2VzIGRlIGNvbG9jYXIgc3VzIHBhc2l2b3MgZW4gbG9zIG1lcmNhZG9zIGEgdGFzYXMgcmF6b25hYmxlcy4NCg0KU2kgbG9zIGRvcyBwcmltZXJvcyBlbGVtZW50b3MgZGVzY3JpdG9zIGRlIHNvc3RlbmliaWxpZGFkIGxvcyBzdXNwZW5kZW1vcywgZXN0ZSB0ZXJjZXJvICoqbG8gYXByb2JhbW9zIGNvbiBheXVkYSBleHRlcm5hKiouIExhIGVjb25vbcOtYSBlc3Bhw7FvbGEsICoqcG9yIHPDrSBzb2xhIG5vIHB1ZWRlIHNvc3RlbmVyIG5pdmVsZXMgdGFuIGFsdG9zIGRlIGVuZGV1ZGFtaWVudG8qKiwgbG8gbG9ncmFtb3MgZ3JhY2lhcyBhbCByZXNwYWxkbyBxdWUgbm9zIHByb3BvcmNpb25hbiBlbCBhaG9ycm8gYWxlbcOhbiwgaG9sYW5kw6lzLCBlbnRyZSBvdHJvcy4gUGVybywgKiplc3RvIG5vIHRpZW5lIHBvciBxdcOpIHJlcHJvZHVjaXJzZSBlbiBsYSBzaWd1aWVudGUgZMOpY2FkYSoqLg0KDQo+IExhIGdlbmVyb3NpZGFkIGRlIGxvcyBwYcOtc2VzIGFob3JyYWRvcmVzIGRlbnRybyBkZSBsYSBldXJvem9uYSBubyBlcyBpbGltaXRhZGEuDQoNCjxicj4NCg0KIyMjIyBUYWJsYQ0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFLCBvdXQud2lkdGggPSAiNzUlIn0NCg0Ka25pdHI6OmthYmxlKGNvc3RlX2RldWRhLCBkaWdpdHMgPSAyKSAlPiUNCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhmaXhlZF90aGVhZCA9IGxpc3QoZW5hYmxlZCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSAiIzA4OEE4NSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSA9IDE1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJT4lDQogIGNvbHVtbl9zcGVjKDYsICBjb2xvciA9ICIjMDAwMDAwIiwgYmFja2dyb3VuZCA9ICIjQTlGNUYyIikgDQogIA0KDQpgYGANCjxicj48YnI+DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIyMgR3LDoWZpY28NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KYWEgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBjb3N0ZV9kZXVkYV9sb25nLCBhZXMoeCA9IEZFQ0hBLCB5ID0gdmFsdWVfMSwgc2hhcGUgPSB0aXBvLCBjb2xvciA9IHRpcG8pLCBzaXplID0gMi41KSArDQogIGdlb21fbGluZShkYXRhID0gY29zdGVfZGV1ZGFfbG9uZywgYWVzKHggPSBGRUNIQSwgeSA9IHZhbHVlXzEsIGdyb3VwID0gdGlwbywgY29sb3IgPSB0aXBvKSwgc2l6ZSA9IDEpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsIDE2LCAxNywxOCwgMTkpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChicmVha3MgPSBjKCJMRVRSQVMiLCAiQk9OT1MiLCAiT0JMSUdBQ0lPTkVTIiwgIlJFU1RPIiwgIlRJUE8gTUVESU8iKSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoIiMwM0E2RkQiLCAiIzAyNEI3MyIsICIjMTUwMTdBIiwgIiM2ODRCRjkiLCAiIzA0RjNGNyIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IikpICsNCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGNvc3RlIGRlIGxhIERldWRhIEVzcGHDsW9sYSIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBUZXNvcm8gUMO6YmxpY28iKSArDQogIGxhYnMgKHkgPSBOVUxMKSArDQogIGxhYnMoeCA9IE5VTEwpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gOCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMCkpICsNCiAgZ3VpZGVzIChzaGFwZSA9IEZBTFNFKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IDAuNzUsDQogICAgICAgICAgICAgY29sb3VyID0gIiNGNzA0MTMiLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gInR3b2Rhc2giKQ0KDQogICAgICAgICAgICANCmFhDQoNCmBgYA0KPGJyPjxicj4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQojIyMgNC40LiBFbCBjcmVjaW1pZW50byBlY29uw7NtaWNvLg0KDQpDb24gbG8gcXVlIGNvcnJlc3BvbmRlIGFsIGN1YXJ0byBmYWN0b3IgZGUgc29zdGVuaWJpbGlkYWQgcG9jbyBhIGNvbWVudGFyLCBiw6FzaWNhbWVudGUgcG9yIHVuYSByYXrDs24sICoqZXMgbXV5IGNvbXBsaWNhZG8gaGFjZXIgZXN0aW1hY2lvbmVzIHJlYWxpc3RhcyBzb2JyZSBlbCBjcmVjaW1pZW50byBlY29uw7NtaWNvKiouIEHDum4gbcOhcyBlbiB1biBjb250ZXh0byBjb21vIGVsIGFjdHVhbCBkb25kZSBsYSBldm9sdWNpw7NuIGRlIGxhIHBhbmRlbWlhIHB1ZWRlIG1hcmNhciBhw7puIGVsIGNyZWNpbWllbnRvIGVuIGxvcyBzaWd1aWVudGVzIHBlcmlvZG9zLiBCaWVuIGVzIGNpZXJ0byBxdWUgZXN0YSBlcyB1biB2YXJpYWJsZSBjbGF2ZXMsIHlhIGVzIGVsIGRlbm9taW5hZG9yIGRlIGxhIHJhdGlvIERldWRhL1BJQiwgc3UgZXZvbHVjacOzbiAqKnBhcmEgdW5hIG1pc21hIGRldWRhKiogcHVlZGUgY2FtYmlhciBjb25zaWRlcmFibGVtZW50ZSwgZXMgZGVjaXIsIHB1ZWRlIHNlciB1bmEgbXV5IGJ1ZW5hIGZvcm1hIGRlIGFtb3J0aXphciBkZXVkYS4gU2kgdG9tYW1vcyBlbiBjb25zaWRlcmFjacOzbiBsYXMgZXN0aW1hY2lvbmVzIG1vc3RyYWRhcyBwYXJhIGVsIGNyZWNpbWllbnRvIHBvciBwYXJ0ZSBkZSBsYSBPQ0RFIHF1ZSB5YSBleHB1c2ltb3MgZW4gbnVlc3RybyB0cmFiYWpvIGdydXBhbCwgcG9kZW1vcyB2ZXIgcXVlIHNpIHNlIGN1bXBsZW4gbGFzIHByZWRpY2Npb25lcywgaGVjaG8gcXVlIG1lIHBlcm1pdGEgZWwgbGVjdG9yIHBvbmVyIGVuIGR1ZGEsIGhhc3RhIHByaW5jaXBpb3MgZGUgMjAyMywgZW4gKiplbCBtZWpvciBkZSBsb3MgY2Fzb3MqKiBubyB2YW1vcyBhIHJlY3VwZXJhciBsb3Mgbml2ZWxlcyBwcmUtY292aWQuIEVzdG8gZXMgdW4gcHJvYmxlbWEgYWRpY2lvbmFsIGEgbG9zIGFudGVyaW9ybWVudGUgbWVuY2lvbmFkb3MuIA0KDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRSwgb3V0LndpZHRoID0gIjgwJSJ9DQoNCmNyZWNpbWllbnRvX2RmIDwtIGNyZWNpbWllbnRvICU+JQ0KICBkcGx5cjo6c2VsZWN0KExPQ0FUSU9OLCBUSU1FLCBWYWx1ZSkgJT4lDQogIG11dGF0ZShmZWNoYSA9IGx1YnJpZGF0ZTo6eXEoVElNRSkpICU+JQ0KICBtdXRhdGUodmFsdWUgPSByb3VuZChWYWx1ZSwgMikpICU+JQ0KICBmaWx0ZXIoTE9DQVRJT04gJWluJSBjKCJFU1AiLCJFQTE3IikpICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1USU1FLC1WYWx1ZSkNCg0KY3JlY2ltaWVudG8gPC0gZ2dwbG90KGNyZWNpbWllbnRvX2RmLCBhZXMoZmVjaGEsdmFsdWUsIGNvbG9yPSBMT0NBVElPTikpICsNCiAgZ2VvbV9saW5lKHNpemU9MiwgbGluZXR5cGU9NykgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9sYWJlbHM9IiVZLSVtIixkYXRlX2JyZWFrcyAgPSIzIG1vbnRocyIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKGJyZWFrcyA9IGMoIkVTUCIsIkVBMTciKSx2YWx1ZXMgPSBjKCIjRTA0NjQ0IiwiIzdDQ0NFNSIpKSArDQogIGZhY2V0X3dyYXAoDQogICAgdmFycyhMT0NBVElPTiksIG5yb3cgPSAyLCBuY29sID0gMSkgKw0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW4gPSBhcy5EYXRlKCIyMDIwLTAxLTAxIiksDQogICAgICAgICAgIHhtYXggPSBhcy5EYXRlKCIyMDIwLTA3LTAxIiksDQogICAgICAgICAgIHltaW4gPSAtSW5mLA0KICAgICAgICAgICB5bWF4ID0gSW5mLA0KICAgICAgICAgICBhbHBoYSA9IDAuNCwNCiAgICAgICAgICAgZmlsbCA9ICJncmV5IikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMTAwLA0KICAgICAgICAgICAgIHNpemUgPSAxLA0KICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5IiwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIA0KICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmF5OTAiKSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9IE5BKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwNCiAgICAgICAgZmFjZSA9ICJib2xkIiksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh0aXRsZSA9ICJQcmVkaWNjacOzbiBkZSBjcmVjaW1pZW50byBQSUIgRXVyb3pvbmEiLA0KICAgIHggPSBOVUxMLCB5ID0gTlVMTCwgY29sb3VyID0gTlVMTCwgc3VidGl0bGUgPSAiQcOxbyAyMDE5IGVuIGJhc2UgMTAwIiwNCiAgICBjYXB0aW9uID0gIkZ1ZW50ZTpFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZSBsYSBPQ0RFLiIpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9ZWxlbWVudF9yZWN0KGZpbGw9IiM0MjQyNTQiKSkgKw0KICB0aGVtZShzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICd3aGl0ZScpKSArDQogIHRoZW1lKHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9ICAxNSkpDQoNCmNyZWNpbWllbnRvDQoNCmBgYA0KDQoNClRvZG8gaGFjZSBpbmRpY2FyLCBhbCBtZW5vcyBlbiB1biBwcmltZXIgYW7DoWxpc2lzIHkgY29tbyB1bmEgcHJpbWVyYSBjb25jbHVzacOzbiwgKipzaSB0ZW5lbW9zIHByb2JsZW1hcyBlbiBlbCBjb3J0byBwbGF6byBzb2JyZSBudWVzdHJvIGVuZGV1ZGFtaWVudG8qKi4NCg0KIyMgNS4gUHJvYmxlbWFzIHByb3Bpb3MNCg0KRGVudHJvIGRlIGxhIEV1cm96b25hIGRpc3BvbmVtb3MgZGUgdW5hIGdyYW4gdmFyaWVkYWQgeSB0aXBvbG9nw61hcyBkaWZlcmVudGVzIGRlIGVzdHJ1Y3R1cmFzIGVjb27Ds21pY2FzLCBhdW5xdWUgbXVjaGFzIGVuIGxhIGFjdHVhbGlkYWQgZGlzcG9uZW4gZGUgcHJvYmxlbWFzIG8gcmF0aW9zIGFsdG9zIGRlIGVuZGV1ZGFtaWVudG8sIGxhIGVjb25vbcOtYSBlc3Bhw7FvbGEgcHJlc2VudGEgKipwcm9ibGVtYXMgZXN0cnVjdHVyYXJlcyBwcm9waW9zKiogcXVlICpiYWpvIG1pIGNvbnNpZGVyYWNpw7NuKiBwdWVkZW4gbGFzdHJhciBlbiBlbCBtZWRpbyBwbGF6byBlc2Egb2JsaWdhY2nDs24gZGUgcmVkdWNpciBudWVzdHJvIGVuZGV1ZGFtaWVudG8sIGFudGVyaW9ybWVudGUgbWVuY2lvbmFkYS4gTm90ZSBlbCBsZWN0b3IsIHF1ZSBwb3IgYnJldmVkYWQgZGVsIGFydMOtY3VsbyBubyB2YW1vcyBhIHByb2Z1bmRpemFyIGVuIGNhZGEgc3VidGVtYSwgc2ltcGxlbWVudGUgZGVzdGFjYXIgbG9zIHByb2JsZW1hcyBkZSBsYSBmb3JtYSBsb3MgbcOhcyByZXN1bWlkYSBwb3NpYmxlLg0KDQpFc3RvcyAqKnByb2JsZW1hcyoqIGNhYmUgcmVtYXJjYXIgcXVlICoqcHVlZGVuIHNlciBjbGF2ZSoqIHBhcmEgZWwgZXN0dWRpbyBkZSBzb3N0ZW5pYmlsaWRhZC4gwr9Qb3IgcXXDqT8gQsOhc2ljYW1lbnRlLCBwb3JxdWUgdG9kb3MgbG9zIGEgY29udGludWFjacOzbiBleHB1ZXN0b3MsIHRpZW5lbiB1bmEgaW1wbGljYWNpw7NuIGRpcmVjdGEgZSBpbXBvcnRhbnRlIGVuIGxhcyBwYXJ0aWRhcyBkZSBnYXN0b3MvaW5ncmVzb3MgcMO6YmxpY29zLiBTdSBlc3R1ZGlvLCBwdWVkZSBkYXJub3MgcmVzcHVlc3RhIGRlIGPDs21vIGhlbW9zIGRlIG1vZGlmaWNhciBudWVzdHJhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgcGFyYSBnYXJhbnRpemFyIGVsIGVxdWlsaWJyaW8gcHJlc3VwdWVzdGFyaW8sIG8gYWwgbWVub3MsICpzaSBxdWVyZW1vcyBzZXIgbWVub3MgYW1iaWNpb3NvcyB5IHB1ZXN0byBxdWUgbm8gZXMgb2JqZXRpdm8gbcOtbyBkZWZlbmRlciBvIG5vIGNvbW8gaGEgZGUgc2VyIGVsIHNhbGRvIHByZXN1cHVlc3RhcmlvIGVuIHVuYSBkZXRlcm1pbmFkYSBlY29ub23DrWEqLCBnYXJhbnRpemFyIGxhIHJlZHVjY2nDs24gZGUgbnVlc3RybyAqc3RvY2sqIGRlIGRldWRhLg0KDQojIyMgNS4xLiBQcm9ibGVtYSBkZSBzb3N0ZW5pYmlsaWRhZCBkZSBsYXMgcGVuc2lvbmVzIHDDumJsaWNhcy4NCg0KRW4gcHJpbWVyIGx1Z2FyLCB1biBwcm9ibGVtYSBpbXBvcnRhbnRlIGVzIGxhICoqc29zdGVuaWJpbGlkYWQgZGUgbnVlc3RybyBzaXN0ZW1hIGRlIHBlbnNpb25lcyoqLiANCg0KRW4gRXNwYcOxYSAqKnByZWRvbWluYSB1biBzaXN0ZW1hIGRlIHJlcGFydG8qKiwgZXMgZGVjaXIsIHVuIHNpc3RlbWEgZG9uZGUgbGFzIHBlbnNpb25lcyBww7pibGljYXMgY3VicmVuIGxhIG1heW9yIHBhcnRlIGRlIGxvcyBpbmdyZXNvcyB0cmFzIGxhIGp1YmlsYWNpw7NuLiBBIGdyYW5kZXMgcmFzZ29zLCBlbCBzaXN0ZW1hIHNlIGJhc2EgZW4gcXVlIGxvcyBjb3RpemFudGVzICgqcG9ibGFjacOzbiBhY3RpdmEgZW4gdW4gcGVyw61vZG8gZGV0ZXJtaW5hZG8qKSBjb3RpemFuIHBhcmEgZmluYW5jaWFyIGxhcyBwZW5zaW9uZXMgZGUgbG9zIGp1YmlsYWRvcyBhIGNhbWJpbywgeSBlc3RvIGVzICoqbXV5IGltcG9ydGFudGUqKiwgZGUgKipkZXZlbmdhciB1biBkZXJlY2hvIGRlIHBlbnNpw7NuIGVuIGVsIGZ1dHJvKiouIEVzdGEgw7psdGltYSBjb25zaWRlcmFjacOzbiBlcyBjbGF2ZSwgZWwgKipjb3RpemFudGUgbm8gZXN0w6EgY290aXphbmRvIHBhcmEgcmVjaWJpciBsbyBxdWUgcG9yIHNlbmNpbGxleiB2YW1vcyBhIGRlZmluaXIgY29tbyDigJxsbyBhaG9ycmFkb+KAnSBtZWRpYW50ZSBlbCBtZWNhbmlzbW8gcHJvcG9yY2lvbmFkbyBwb3IgbGEgc2VndXJpZGFkIHNvY2lhbCoqLCBzaW5vIG3DoXMgYmllbiBwYXJhIHRlbmVyICoqZGVyZWNobyBhIHVuYSBkZXRlcm1pbmFkYSBwZW5zacOzbiBlbiBlbCBmdXR1cm8qKiAuIFBvciB0YW50bywgbGEgY3VhbnTDrWEgYSByZWNpYmlyIGVuIGVsIGZ1dHVybyBkZXBlbmRlIGRlIGxhIGNhcGFjaWRhZCBkZWwgc2lzdGVtYSBwYXJhIGdlbmVyYXIgbGlxdWlkZXosIGVzIGRlY2lyLCBzaSBoYXkgYnVlbmEgc2l0dWFjacOzbiBlY29uw7NtaWNhLCBubyBzZSBhY3VtdWxhbiBzYWxkb3MgZGVmaWNpdGFyaW9zIGRlIGZvcm1hIGNvbnNlY3V0aXZhIGVuIGxhIHNlZ3VyaWRhZCBzb2NpYWwgeSBkaXNwb25lbW9zIGRlIHBsZW5vIGVtcGxlbyB5IHVuYSB0YXNhIGRlIGp1YmlsYWRvIHBvciB0cmFiYWphZG9yIGJhamEsIGVsIHNpc3RlbWEgbm8gdGllbmUgcG9ycXVlIGZhbGxhci4NCg0KRWwgcHJvYmxlbWEgZXMgcXVlIG5pbmd1bm8gZGUgbG9zIHN1cHVlc3RvcyBkZSBwYXJ0aWRhIHNlIGN1bXBsZS4gRGVzZGUgbGEgbGxlZ2FkYSBkZSBsYSBjcmlzaXMgZmluYW5jaWVyYSBFc3Bhw7FhICoqYWN1bXVsYSBpbXBvcnRhbnRlcyBkw6lmaWNpdHMgZW4gc3Ugc2FsZG8gZGUgc2VndXJpZGFkIHNvY2lhbCoqLCBsYSAqKnRhc2EgZGUgZGVzZW1wbGVvIGVzdHJ1Y3R1cmFsKiogZGVzZGUgMTk3OCBzZSBzaXTDumEgcG9yIGVuY2ltYSBkZWwgKioxNSUqKiwgKipsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBFc3Bhw7FhIGNyZWNlIHRvZG9zIGxvcyBhw7FvcyoqIHNpdHXDoW5kb3NlIGNvbW8gdW5hIGRlIGxhcyBtYXlvcmVzIGRlbCBtdW5kbyBwb3IgZW5jaW1hIGRlIGxvcyA4MyAoZGF0byBtdXkgcG9zaXRpdm8pIHksIGxvIG3DoXMgcHJlb2N1cGFudGUsIGxhICoqdGFzYSBwZW5zaW9uaXN0YS9jb3RpemFudGUgY3JlY2UgZXhwb25lbmNpYWxtZW50ZSoqLiANCg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQphYSA8LSBnZ3Bsb3QoUG9iXzIxLCBhZXMoeCA9IEdydXBvX3F1aW5xdWVuYWwsDQogICAgICAgICAgICAgICAgICAgICAgICB5ID0gUG9iX1BvcmNlbnRhamUsDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gU2V4bykpICsNCiAgICAgIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoUG9iXzIxLCBTZXhvID09ICJIb21icmVzIikgJT4lIA0KICAgICAgICAgICAgIG11dGF0ZShQb2JfUG9yY2VudGFqZSA9IC1Qb2JfUG9yY2VudGFqZSksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gIiMwQjYxNUUiKSArDQogICAgICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KFBvYl8yMSwgU2V4byA9PSAiTXVqZXJlcyIpLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICIjMDRCNEFFIikgKyANCiAgICAgIGNvb3JkX2ZsaXAoKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpKSArDQogIHNjYWxlX3lfY29udGludW91cygNCiAgICBicmVha3MgPSBjKHNlcSgtMC4wNiwgLTAuMDIsIGJ5ID0gMC4wMiksIA0KICAgICAgICAgICAgICAgc2VxKDAsIDAuMDYsIGJ5ID0gMC4wMikpLA0KICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCAoYyhzZXEoLTAuMDYsIC0wLjAyLCBieSA9IDAuMDIpICogLTEsIA0KICAgICAgICAgICAgICAgc2VxKDAsIDAuMDYsIGJ5ID0gMC4wMikpKSkgKw0KICBsYWJzKHkgPSAiSG9tYnJlL011amVyIHBvYmxhY2nDs24gZW4gJSIpICsNCiAgbGFicyh4PSBOVUxMKSArDQogIGxhYnModGl0bGUgPSAiUGlyw6FtaWRlIGRlIGxhIHBvYmxhY2nDs24gZW1wYWRyb25hZGEgZW4gRXNwYcOxYSIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlIElORWJhc2UiKSArDQogIGFubm90YXRlKGdlb20gPSAidGV4dCIsDQogICAgICAgICAgIHg9ICI4NSBhIDg5IiwNCiAgICAgICAgICAgeSA9IDAuMDM1LA0KICAgICAgICAgICBsYWJlbCA9ICJNdWplcmVzIiwNCiAgICAgICAgICAgc2l6ZSA9IDQpICsNCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwNCiAgICAgICAgICAgeD0gIjg1IGEgODkiLA0KICAgICAgICAgICB5ID0gLSAwLjAzNSwNCiAgICAgICAgICAgbGFiZWwgPSAiSG9tYnJlcyIsDQogICAgICAgICAgIHNpemUgPSA0KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9ICIzNSBhIDM5IiwNCiAgICAgICAgICAgICBzaXplID0gMC41LA0KICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIjYwIGEgNjQiLA0KICAgICAgICAgICAgIHNpemUgPSAwLjUsDQogICAgICAgICAgICAgY29sb3VyID0gInJlZCIsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikNCg0KYWENCmBgYA0KDQoqKkxhIGV2b2x1Y2nDs24gZGVtb2dyw6FmaWNhKiogKCp2w6lhc2UgcGlyw6FtaWRlIHBvYmxhY2lvbmFsIHkgZXN0aW1hY2nDs24gcGFyYSBsbyBxdWUgcmVzdGEgZGUgcy5YWEkgc29icmUgbGEgdGFzYSBkZSBkZXBlbmRlbmNpYSopIHRhbWJpw6luIHByZW9jdXBhLiBBIG1lZGlkYSBxdWUgdW5hIHNvY2llZGFkIGVudmVqZWNlLCBhdW1lbnRhIGVsIG7Dum1lcm8gZGUgcGVuc2lvbmlzdGFzIHJlc3BlY3RvIGEgbGEgcG9ibGFjacOzbiBlbiBlZGFkIGRlIHRyYWJhamFyIChsbyBxdWUgc2UgY29ub2NlIGNvbW8gKnRhc2EgZGUgZGVwZW5kZW5jaWEvdmVqZXoqKSBwb3IgbG8gcXVlLCAqKnNpIHNlIG1hbnRpZW5lbiBsb3Mgb3Ryb3MgcGFyw6FtZXRyb3MgZGVsIHNpc3RlbWEgc2luIGNhbWJpb3MsIGVsIGdhc3RvIGVuIHBlbnNpb25lcyBzZXLDoSBtYXlvcioqLiBDb21vIHNlIHB1ZWRlIG9ic2VydmFyIGNvbiBsb3MgZGF0b3Mgb2ZyZWNpZG9zIHBvciBlbCAqSU5FKiB5ICpFdXJvc3RhdCosIGVzdG8gZXNwZWNpYWxtZW50ZSB2YSBhIG9jdXJyaXIgZW4gbG9zIHByw7N4aW1vcyAyMCBhw7FvcywgY29uIGxhIGp1YmlsYWNpw7NuIGRlIGxhIGdlbmVyYWNpw7NuIGNvbm9jaWRhIGNvbW8gKuKAnWJhYnlib29tZXJz4oCdKiwgc2Fsdm8gcXVlIHNlIGRpc3BhcmFyYSBsYSBuYXRhbGlkYWQgbyB0dXZpw6lyYW1vcyB1bmEgZW50cmFkYSAqKm1hc2l2YSoqIGRlIG1pZ3JhbnRlcyBjb24gZWRhZCBkZSB0cmFiYWphciBlbiBsYXMgcHLDs3hpbWFzIGTDqWNhZGFzLiANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRSwgb3V0LndpZHRoID0gIjY1JSJ9DQphYSA8LSBnZ3Bsb3QodGFzYV9kZXAsIGFlcyh4ID0gZ2VvXzEsIE9CU19WQUxVRSwgY291bnRyeSA9IGNvZGUsIHNpemUgPSAxMCkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpICsNCiAgZ2VvbV9mbGFnKGFlcyhnZW9fMSwgT0JTX1ZBTFVFLCBjb3VudHJ5ID0gY29kZSksIHNpemUgPSAxMCkgKw0KICB0cmFuc2l0aW9uX21hbnVhbChUSU1FX1BFUklPRCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzMwMzYzNyIpKSArIA0KICBsYWJzICh4ID0gTlVMTCkgKw0KICBsYWJzICh5ID0gIlRhc2EgZGUgZGVwZW5kZW5jaWEgdmVqZXogZW4gJSIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSBOQSkpICsNCiAgbGFicyh0aXRsZSA9ICJFc3RpbWFjacOzbiBwYXJhIGVsIGHDsW86IHtjdXJyZW50X2ZyYW1lfSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRvcyBkZSBFdXJvc3RhdCIpICArIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAid2hpdGUiKSwNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJ3aGl0ZSIpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImF6dXJlMyIpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImF6dXJlMyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyID0gIndoaXRlIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJhenVyZTMiKSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYXp1cmUzIiksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gIndoaXRlIiksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAid2hpdGUiKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYXp1cmUzIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJhenVyZTMiKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYXp1cmUzIiwNCiAgICAgICAgY29sb3VyID0gImF6dXJlMyIpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhenVyZTMiLA0KICAgICAgICBjb2xvdXIgPSAiYXp1cmUzIiksIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhenVyZTMiLA0KICAgICAgICBjb2xvdXIgPSAiYXp1cmUzIiksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYXp1cmUzIiwNCiAgICAgICAgY29sb3VyID0gImF6dXJlMyIpKSArIGxhYnMoY29sb3VyID0gIndoaXRlIikNCg0KZ2dhbmltYXRlOjphbmltYXRlKGFhLCBuZnJhbWVzID0gMTAwLCBmcHMgPSAyNSwgZW5kX3BhdXNlID0gMSkNCg0KYGBgDQoNCjxicj4NCg0KU2luIGVudHJhciBhIHZhbG9yYXIgc2kgZWwgc2lzdGVtYSBlbiBzaSBlcyBzb3N0ZW5pYmxlIG8gbm8sIHVuYSBjb3NhIHF1ZWRhIGNsYXJhLCBzaSB0b2RhIGVzdGEgdGVuZGVuY2lhIGVuIGxvcyDDumx0aW1vcyBhw7FvcyBzaWd1ZSBzdSBjYXVjZSwgZWwgKipnYXN0byBlbiBwZW5zaW9uZXMgdmEgYSBzZXIgY2FkYSB2ZXogbWF5b3IqKi4gRW4gZWwgc2lndWllbnRlIGFwYXJ0YWRvICgqNS4yKikgYW5hbGl6YXJlbW9zIHBvcnF1ZSBlc3RvIHB1ZWRlIHNlciB1biBwcm9ibGVtYSBwYXJhIGxhIHNvc3RlbmliaWxpZGFkIGRlIGxhcyBwZW5zaW9uZXMuDQoNCiMjIyA1LjIgUGF0csOzbiBkZSBnYXN0byBww7pibGljby4gey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciBlbCBwYXRyw7NuIGRlIGdhc3RvIGRlIGxhIGVjb25vbcOtYSBlc3Bhw7FvbGEgc2UgY2FyYWN0ZXJpemEgKiplc3BlY2lhbG1lbnRlKiogcG9yIHRlbmVyIHVuICoqZ3JhbiBkZXNlbWJvbHNvIGVuIGVsIHBhZ28gZGUgcGVuc2lvbmVzKiouIFJlY29yZGVtb3MgcXVlIGhlbW9zIGRpY2hvIHF1ZSBlc3RhIHBhcnRpZGEgKnNlZ3VyYW1lbnRlKiBzZSB2YSBhIHZlciBpbmNyZW1lbnRhZGEgZW4gZWwgZnV0dXJvLiDCv1BvciBxdcOpIGVzIHVuYSB2YXJpYWJsZSB0YW4gaW1wb3J0YW50ZT8gUG9ycXVlIHJlcHJlc2VudGEgYXByb3hpbWFkYW1lbnRlIHVuIDQwJSBkZWwgZ2FzdG8gdG90YWwsIGNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIsICoqbm8gZXMgdW4gZGF0byBwcm9waW8gZGUgbGEgc2l0dWFjacOzbiBlY29uw7NtaWNhIGFjdHVhbCoqLCBlc3RlIHBhdHLDs24gZXMgY29tw7puIHBhcmEgdG9kbyBlbCBwZXLDrW9kbyBkZWwgMjAwMCwgdsOpYXNlICoicGF0csOzbiBkZSBnYXN0byBwYXJhIDIwMTYiKiAoKnBvciBtb3Rpdm9zIGRlIHNpbWlsaXR1ZCBoZSBkZWNpZGlkbyByZXByZXNlbnRhciBlbCAyMDE2KikuIA0KDQpNaSBoaXDDs3Rlc2lzIGVzIGNsYXJhLCBxdWVyYW1vcyBvIG5vLCBsYSBwcmluY2lwYWwgcGFydGlkYSBhIHJlZHVjaXIgZWwgZWxldmFkbyBnYXN0byBlcyBsYSBkZSBwZW5zaW9uZXMsIGVsIHByb2JsZW1hICBlcyBxdWUgY2FtYmlhciBhaG9yYSBkZSBzaXN0ZW1hIGVzIHVuYSB0YXJlYSBjYXNpIGltcG9zaWJsZSBwb3Igc3UgY29tcGxlamlkYWQgZGUgaW1wbGVtZW50YWNpw7NuLCBhZGVtw6FzLCBlc28gaW1wbGljYXLDrWEgdW4gY29zdGUgcGFyYSBhbGd1bmEgZ2VuZXJhY2nDs24gcXVlIGFwb3J0YSwgcGVybyBwb3N0ZXJpb3JtZW50ZSBubyByZWNpYmlyw61hIHByZXN0YWNpw7NuIGRlIGZ1dHVyby4gQXVucXVlIHVuYSBzb2x1Y2nDs24gZGEgcGFyYSB1biBhcnTDrWN1bG8gYmFzdGFudGUgbGFyZ28sIHNpbXBsZW1lbnRlIGNvbWVudGFyIHF1ZSBjdWFuZG8gbWVqb3JlbW9zIG51ZXN0cm8gbml2ZWwgZGUgZW5kZXVkYW1pZW50byAoKipwcmluY2lwYWwgb2JqZXRpdm8qKikgdGVuZHJlbW9zIHF1ZSBlbXBlemFyIGEgY3Vlc3Rpb25hcm5vcyBlc3RlIHByb2JsZW1hIHkgdHJhdGFyIGRlIGRhcmxlIHNvbHVjacOzbi4gDQoNCk5vdGUgZWwgbGVjdG9yIHF1ZSBoYXkgb3Ryb3MgcHJvYmxlbWFzIHBvciBsYSBwYXJ0ZSBkZWwgZ2FzdG8gdGFtYmnDqW4gcmVtYXJjYWJsZXMsIGVsIGdhc3RvIGVuIGRlc2VtcGxlbyBlcyBzdXBlcmlvciBhIGxvIHF1ZSBkZXN0aW5hbW9zIGEgZWR1Y2FjacOzbiBvIHNhbmlkYWQsIGFsIGlndWFsICgqKmF1bnF1ZSBlc3RlIHJlbGF0aXZhbWVudGUgYmFqb3MgbG9zIHRpcG9zKiopIGVsIGdhc3RvIHF1ZSBkZWRpY2Ftb3MgYSBsYSBwYXJ0aWRhIGRlIHBhZ28gZGUgaW50ZXJlc2VzIGRlIGxhIGRldWRhLiBUb2RhcyBlc3RhcyBwYXJ0aWRhcyBhZ3J1cGFkYXMgcmVwcmVzZW50YW4gYXByb3hpbWFkYW1lbnRlIHVuIDYwJSBkZWwgZ2FzdG8gdG90YWwuIEJham8gbWkgcHVudG8gZGUgdmlzdGEsIGVzIGFsIG1lbm9zIHBhcmEgcmVmbGV4aW9uYXIgc2kgbnVlc3RybyBwYXRyw7NuIGRlIGdhc3RvIGVzIGFkZWN1YWRvLiBNZW5jacOzbiBlc3BlY2lhbCBxdWllcm8gaGFjZXIgYWwgZ2FzdG8gc29icmUgbGEgZGV1ZGEsIHBhcmEgcXVlIG5vdGUgZWwgbGVjdG9yIGxhIGltcG9ydGFuY2lhIGRlIHRlbmVyIG8gbm8gcmF0aW9zIGVsZXZhZG9zIGRlIGRldWRhIGVzIHF1ZSBzaW4gZXN0YSBzZSBwb2RyaWEgZGVzdGluYXIgYXByb3hpbWFkYW1lbnRlIHVuIDUwJSBtw6FzIGEgcGFydGlkYXMgY29tbyBzYW5pZGFkLCBlZHVjYWNpw7NuIG8gcGVuc2lvbmVzLg0KDQo+IFNpIGxhIGRlY2lzacOzbiBwb2zDrXRpY2EgcGFyYSByZWR1Y2lyIGVsIGTDqWZpY2l0IGVzIGFjdHVhciBzb2JyZSBlbCBnYXN0bywgbGFzIHBhcnRpZGFzIGVuIGxhcyBxdWUgZGViZW1vcyBhY3R1YXIgaG95IHNvbiBwZW5zaW9uZXMsIGRlc2VtcGxlbyBlIGludGVyZXNlcyBwYWdhZG9zLg0KDQpDb24gZXN0byAqKm5vIGVzdG95IGRhbmRvIGEgZW50ZW5kZXIgcXVlIHNlIHJlZHV6Y2EgZWwgZ2FzdG8gc29jaWFsIHNpbiBwb25lciBzb2x1Y2nDs24gYSBsb3MgZGVzZXF1aWxpYnJpb3MqKiwgZXMgdG90YWxtZW50ZSAqaW5zZW5zYXRvKiByZWR1Y2lyIMO6bmljYW1lbnRlIGxhcyBheXVkYXMgZXN0YXRhbGVzIHBvcnF1ZSBlc28gc29sbyBhZ3JhdmEgZWwgcHJvYmxlbWEsIG3DoXMgYmllbiBjb25zaWRlcm8gcXVlIGRlYmVyw61hIHNlciBhbCBjb250cmFyaW8uIFBvciBlamVtcGxvLCBoYWNlciBxdWUgbm8gc2VhIG5lY2VzYXJpbyBxdWUgZXhpc3RhbiBheXVkYXMgcG9yIGRlc2VtcGxlbywgKipmb21lbnRhZG8gZWwgZW1wbGVvKiosIGVzdG8gc2kgc2Vyw61hIHVuYSBmb3JtYSBlZmVjdGl2YSBwYXJhIHJlZHVjaXIgbGEgcGFydGlkYXMgZGUgZ2FzdG8uIExvIG1pc21vIHB1ZWRlIHNlciBhcGxpY2FibGUgcGFyYSBlbCBwYWdvIGRlIGludGVyZXNlcywgYXVucXVlIG5vIGRlcGVuZGUgZGUgbm9zb3Ryb3MgZW4gcGFydGUgZWwgdGlwbyBxdWUgcGFnYW1vcyBwb3IgZWxsYSwgc2kgZGVwZW5kZSBkZSBub3NvdHJvcyBtb2RpZmljYXIgZWwgcsOhdGlvIGRlIGVuZGV1ZGFtaWVudG8uDQoNCjxicj4NCg0KIyMjIyBQYXRyw7NuIGRlIGdhc3RvIHDDumJsaWNvIDIwMjEuDQoNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5nPSBGQUxTRX0NCg0KY29tcG9uZW50ZXNfZXVyb3BhIDwtIHRyZWVtYXAoUGFydGlkYXNfZ19wdWJfMjAyMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PSJQYXJ0aWRhc19HYXN0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2U2l6ZT0iR2FzdG9fbWlsbG9uZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iaW5kZXgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR2FzdG8gMjAyMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlPSJTcGVjdHJhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIuY29sPWMoIndoaXRlIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLmx3ZHM9MiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250ZmFjZS5sYWJlbHM9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnLmxhYmVscz1jKCJ0cmFuc3BhcmVudCIpLCAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbi5sYWJlbHM9YygiY2VudGVyIiwgImNlbnRlciIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcC5sYWJlbHM9MC43NSkgDQoNCmBgYA0KPGJyPjxicj4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMjIyBQYXRyw7NuIGRlIGdhc3RvIHDDumJsaWNvIDIwMTYuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0V9DQoNCmNvbXBvbmVudGVzX2V1cm9wYSA8LSB0cmVlbWFwKFBhcnRpZGFzX2dfcHViXzIwMTYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleD0iUGFydGlkYXNfR2FzdG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlNpemU9Ikdhc3RvX21pbGxvbmVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImluZGV4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGU9IlNwZWN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5jb2w9Yygid2hpdGUiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIubHdkcz0yLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRmYWNlLmxhYmVscz0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmcubGFiZWxzPWMoInRyYW5zcGFyZW50IiksICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLmxhYmVscz1jKCJjZW50ZXIiLCAiY2VudGVyIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR2FzdG8gMjAxNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVybGFwLmxhYmVscz0wLjc1KSANCg0KYGBgDQo8YnI+PGJyPg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyMgNS4zLiBQcm9kdWN0aXZpZGFkIHkgbWVyY2FkbyBsYWJvcmFsLg0KDQpMYSAqKnByb2R1Y2Npw7NuIGVzIHVuYSBjbGF2ZSBpbXBvcnRhbnTDrXNpbWEgcGFyYSByZWR1Y2lyIGVsIGVuZGV1ZGFtaWVudG8qKiBkZSB1bmEgZGV0ZXJtaW5hZGEgZWNvbm9tw61hLiBTaSBubyBhdW1lbnRhbW9zIGNvbnNpZGVyYWJsZW1lbnRlIG51ZXN0cmEgZGV1ZGEsIHBvZGVtb3MgcmVkdWNpciBsYSByYXRpbyBzaW1wbGVtZW50ZSBoYWNpZW5kbyBjcmVjZXIgbnVlc3RybyBvdXRwdXQuIEVsIHByb2JsZW1hIGVuIGxvcyDDumx0aW1vcyBhw7FvcyBhbCByZXNwZWN0byBzZSBlbmN1ZW50cmEgZW4gbGEgc2l0dWFjacOzbiBkZSBudWVzdHJvIG1lcmNhZG8gbGFib3JhbC4gRGlzcG9uZW1vcyAqKmFsdGFzIHRhc2EgZGUgZGVzZW1wbGVvKiogc3VtYWRvIGEgdW5hICoqYmFqYSBwcm9kdWN0aXZpZGFkICoqIGRlc2RlIGVsIGluaWNpbyBkZSBsYSBkZW1vY3JhY2lhLCBlc3RvIGxhc3RyYSBudWVzdHJvIGNyZWNpbWllbnRvIHkgbm9zICoqbGltaXRhIGxhIHBvc2liaWxpZGFkIGRlIGFtb3J0aXphciBkZXVkYSoqLg0KDQpMYSAqKnByaW5jaXBhbCBjYXVzYSoqIGRlbCBwYXJvIHZpZW5lIGRhZGEgcG9yIGxhIGVzdHJ1Y3R1cmEgZGUgbnVlc3RybyBtZXJjYWRvIGRlIHRyYWJham8sIGRvbmRlIHNlIHJlZmxlamEgdW5hICoqZXhjZXNpdmEgdGVtcG9yYWxpZGFkKiouIFBhcmEgcG9uZXIgZW4gY29udGV4dG8sIGVuIGxhIMO6bHRpbWEgZMOpY2FkYSwgZWwgcHJvbWVkaW8gZGUgdGVtcG9yYWxpZGFkIHBhcmEgRXNwYcOxYSBlcyBkZWwgMjUsMiUgZnJlbnRlIGFsIDEzLDklIGRlIGxhIFVFLiBUb2RvIGVzdG8gcXVlZGEgZXN0cmVjaGFtZW50ZSB2aW5jdWxhZG8gY29uIG51ZXN0cm8gbW9kZWxvIHByb2R1Y3Rpdm8sIGRvbmRlIGxvcyBzZXJ2aWNpb3MgcmVwcmVzZW50YW4gYXByb3hpbWFkYW1lbnRlIHVuIDcwJSBkZWwgUElCLiBBIHRvZG8sIGhheSBxdWUgc3VtYXIgbGEgbGFjcmEgcXVlIHN1cG9uZSBlbCBwYXJvIGp1dmVuaWwsIGNvbiB1bmEgdGFzYSBpZ3VhbCBvIHN1cGVyaW9yIGFsIDQwJSwgbMOtZGVyZXMgZW4gbnVlc3RybyBlbnRvcm5vIGV1cm9wZW8uDQoNClBvciB0YW50bywgZXMgbmVjZXNhcmlvICoqcmVtb2RlbGFyIGVsIG1vZGVsbyBwcm9kdWN0aXZvKiouIEhheSBhZnJvbnRhciB1bmEgdHJhbnNmb3JtYWNpw7NuIGRlIG51ZXN0cmEgZXN0cnVjdHVyYSBlY29uw7NtaWNhIGNvbiBsYSBmaW5hbGlkYWQgZGUgcXVlIGhheWEgdHJhYmFqbywgZW5mb2PDoW5kb25vcyBoYWNpYSBsYSBpbmR1c3RyaWEsIGxhIHRlY25vbG9nw61hIHkgc2VydmljaW9zIGRlIG3DoXMgdmFsb3IgYcOxYWRpZG8uDQoNCg0KPioqUmVkdWNpciBlbCBkZXNlbXBsZW8geSBtaXRpZ2FyIGxhIHByZWNhcmllZGFkIGRlbCBlbXBsZW8sIGZvbWVudGFuZG8gbGEgcHJvZHVjdGl2aWRhZCoqIHRlbmRyw61hIHF1ZSBzZXIgdW5hIHByaW9yaWRhZCBhYnNvbHV0YS4NCg0KPGJyPg0KDQo6OjogY29sdW1ucw0KOjo6IHsuY29sdW1uIHdpZHRoPSIzMiUifQ0KLSAgICoqUHJvYmxlbWFzIGRlbCBtZXJjYWRvIGxhYm9yYWwqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiNjAlIn0NCnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9KdWFuTHVpc19KRy9zdGF0dXMvMTQ3Mzk0MDk4MTk3NjI4OTI4MT9zPTIwIiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBtYXh3aWR0aCA9IDQwMCkNCmBgYA0KOjo6DQoNCjo6OiB7LmNvbHVtbiB3aWR0aD0iMSUifQ0KPCEtLSBhbiBlbXB0eSBEaXYgKHdpdGggYSB3aGl0ZSBzcGFjZSkgaGFjaWVuZG8gZGUgc2VwYXJhZG9yIC0tPg0KOjo6DQoNCjo6OiB7LmNvbHVtbiB3aWR0aD0iMzIlIn0NCi0gICAqKkZhbHRhIGRlIHByb2R1Y3RpdmlkYWQqKg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiNjAlIn0NCnR3ZWV0cm1kOjp0d2VldF9lbWJlZCgiaHR0cHM6Ly90d2l0dGVyLmNvbS9lbEVjb25vbWlzdGFlcy9zdGF0dXMvMTQ3NDczODUwNjU2ODE5NjA5OD9zPTIwIiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBtYXh3aWR0aCA9IDQwMCkNCmBgYA0KOjo6DQoNCjo6OiB7LmNvbHVtbiB3aWR0aD0iMSUifQ0KPCEtLSBhbiBlbXB0eSBEaXYgKHdpdGggYSB3aGl0ZSBzcGFjZSkgaGFjaWVuZG8gZGUgc2VwYXJhZG9yIC0tPg0KOjo6DQoNCjo6OiB7LmNvbHVtbiB3aWR0aD0iMzIlIn0NCi0gICAqKlBhcm8ganV2ZW5pbCoqDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI2MCUifQ0KdHdlZXRybWQ6OnR3ZWV0X2VtYmVkKCJodHRwczovL3R3aXR0ZXIuY29tL0VVX1NvY2lhbC9zdGF0dXMvMTMwMTUyODI3MDY5MzkwMDI4OD9zPTIwIiwgdGhlbWUgPSAibGlnaHQiLCBhbGlnbiA9ICJjZW50ZXIiLCBkbnQgPSBUUlVFLCBtYXh3aWR0aCA9IDQwMCkNCmBgYA0KOjo6DQo6OjoNCg0KPGJyPg0KDQojIyMgNS40LiDCv1BhZ2Ftb3MgcG9jb3MgbyBtdWNob3MgaW1wdWVzdG9zIGVuIGVzcGHDsWE/DQoNCkVzdGUgcHVudG8sIHNpbXBsZW1lbnRlIGxvIHF1aWVybyB1dGlsaXphciBwYXJhIG1vc3RyYXIgcG9ycXVlIGNvbnNpZGVybyBxdWUgZW4gRXNwYcOxYSAqKnBhZ2Ftb3Mgc3VmaWNpZW50ZXMgaW1wdWVzdG9zKiouIFBvciB0YW50bywgbm8gY29uc2lkZXJvIHF1ZSBzZWEgcmF6b25hYmxlIHV0aWxpemFyIGxhIGVzdHJhdGVnaWEgZGUgaW5jcmVtZW50byBkZSBpbmdyZXNvcyBww7pibGljb3MgcGFyYSByZWR1Y2lyIGVsIGTDqWZpY2l0LCBjb21vIG3DrW5pbW8gbWFudGVuZXJzZSBvIGluY2x1c28sIHBvcnF1ZSBubywgcmVkdWNpciBsYSBwcmVzacOzbiBmaXNjYWwuIA0KUGFyYSBlc3R1ZGlhciBzaSBwYWdhbW9zIG11Y2hvcyBvIHBvY29zIGltcHVlc3RvcyB1dGlsaXphcmVtb3MgbWVkaWRhcyBhbXBsaWFtZW50ZSB1dGlsaXphZGFzOg0KDQoxLiAqKlByZXNpw7NuIEZpc2NhbCoqIDogKmNhbnRpZGFkIGRlIGRpbmVybyBlbiBjb25jZXB0byBkZSB0cmlidXRvcyBxdWUgbG9zIG9ibGlnYWRvcyB0cmlidXRhcmlvcyBwYWdhbiBhbCBFc3RhZG8gZW4gY29tcGFyYWNpw7NuIGNvbiBlbCBwcm9kdWN0byBpbnRlcmlvciBicnV0byAoUElCKS4qDQoNCjIuICoqRXNmdWVyem8gRmlzY2FsKiogOiAgKmluZGljYWRvciBxdWUgc2UgdXRpbGl6YSBwYXJhIGV2YWx1YXIgbGEgaW5jaWRlbmNpYSByZWNhdWRhdG9yaWEgZGVsIGVzdGFkbyBlbiBsYSBwcm9kdWNjacOzbiBkZSBsYSBzb2NpZWRhZC4gRXN0ZSBtaWRlIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBwb3JjZW50YWplIHF1ZSBzdXBvbmVuIGxvcyBpbmdyZXNvcyBww7pibGljb3MgcmVzcGVjdG8gYWwgcHJvZHVjdG8gaW50ZXJpb3IgYnJ1dG8gKFBJQiksIGFzw60gY29tbyBhIGxhIHJlbnRhIHBlciBjw6FwaXRhLioNCg0KQ29tbyBzb24gY29uY2VwdG9zIGNvbXBsZWpvcyB5IHBhcmEgZmFjaWxpdGFyIGxlY3RvciBsYSBjb21wcmVuc2nDs24gZGUgZXN0ZSBhcGFydGFkbyBoZSBjb25zaWRlcmFkbyBxdWUgbG8gbWVqb3IgZXMgYXBvcnRhciB1biBjb3J0byB2aWRlbyBkb25kZSBzZSBleHBsaWNhIGRlIGZvcm1hIG11Y2hvIG3DoXMgZGV0YWxsYWRhIGxhcyBkaWZlcmVuY2lhcyB5IHNpZ25pZml2YWRvczoNCg0KPGJyPg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KZW1iZWRfdXJsKCJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTBPMm1KRHdXSnQwJnQ9NDM0cyIpICU+JQ0KICAgIHVzZV9hbGlnbigiY2VudGVyIikgJT4lDQogICAgdXNlX3JvdW5kZWQoKQ0KDQpgYGANCg0KPGJyPg0KDQpFc3Bhw7FhLCBjb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGVsIG1hcGEgbXVuZGkgZXMgdW5vIGRlIGxvcyAqKnBhw61zZXMgZGUgbWVub3IgcHJlc2nDs24gZmlzY2FsIGRlIHRvZGEgbGEgZXVyb3pvbmEqKi4gUGFyYWxlbGFtZW50ZSwgZWwgKiplc2Z1ZXJ6byBmaXNjYWwgc2Ugc2l0w7phIGVudHJlIGxvcyBtw6FzIGFsdG9zKiosIHBvciBlbmNpbWEgZGUgYWxndW5vcyBwYcOtc2VzIGNvbW8gRGluYW1hcmNhLCBTdWVjaWEsIEZpbmxhbmRpYSwgZXRjLiBDb21vIHNlIHB1ZWRlIG9ic2VydmFyIGVuIGVsIGdyw6FmaWNvIGRlICpQcmVzacOzbiB2cyBFc2Z1ZXJ6byBmaXNjYWwqIGxhIGRpZmVyZW5jaWEgZXMgbWVub3IgcGFyYSBlbCBjYXNvIGVzcGHDsW9sLiBFc3RvIGluZGljYSBxdWUgZWwgKiplc2Z1ZXJ6byBleGlnaWRvIGVuIGVsIHBhZ28gZGUgaW1wdWVzdG9zIGVzIG1heW9yKiogcGFyYSBhIGxvcyBlc3Bhw7FvbGVzLiBFc3RhIGRpZmVyZW5jaWEgc2UgZXhwbGljYSwgZnVuZGFtZW50YWxtZW50ZSwgcG9ycXVlIGVsIHNpc3RlbWEgZmlzY2FsIGVzcGHDsW9sIG5vIGVzIGNhcGF6IGRlIHJlY2F1ZGFyIG3DoXMgZGluZXJvIGN1YW5kbyBzZSBwcm9kdWNlbiBzdWJpZGFzIGRlIGltcHVlc3Rvcy4gTGEgZWNvbm9tw61hIHN1bWVyZ2lkYSB5IGVsIGVub3JtZSBpbXBhY3RvIHNvYnJlIGxhIGFjdGl2aWRhZCBwcm9kdWN0aXZhIGRlIHVuIGF1bWVudG8gZGUgbGEgcHJlc2nDs24gZmlzY2FsIGV4cGxpY2FuIGVzdGEgZGlzdG9yc2nDs24uIEFkZW3DoXMsIGVsIMOtbmRpY2UgZGUgcHJlc2nDs24gZmlzY2FsIHRhbXBvY28gdGllbmUgZW4gY3VlbnRhIGVsIGVzZnVlcnpvIHF1ZSByZXF1aWVyZSBsYSBnZW5lcmFjacOzbiBkZSBQSUIsIHB1ZXN0byBxdWUgdW5hIG1pc21hIHByZXNpw7NuIGZpc2NhbCBwdWVkZSBleGlnaXIgc2FjcmlmaWNpb3MgZmlzY2FsZXMgbXV5IGRpc3RpbnRvcywgcHVlc3RvIHF1ZSBwcmVzacOzbiBmaXNjYWwgeSBlc2Z1ZXJ6byBmaXNjYWwgc29uIGNvbmNlcHRvcyBkaWZlcmVudGVzLg0KDQogDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQogbWFwYV8yIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0gUEZfZ2VvbV9ldXJvcCwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSB2YWx1ZSApKSArDQogIHRoZW1lX3ZvaWQoKSAgKw0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIGZhY2UgPSAiaXRhbGljIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgZmFjZSA9ICAiaXRhbGljIikpICsNCiAgbGFicyh0aXRsZSA9ICJNYXBhOiBQcmVzacOzbiBGaXNjYWwiLCBmaWxsID0gIkluZ3Jlc29zL1BJQiIpICArDQogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3c9IiNGRUU1RkIiLGhpZ2g9IiM2MzAxNUEiKSArDQogIGxpbXMoeSA9IGMoMzUsODUpKSArDQogIGxpbXMoeCA9IGMoLTM1LCA2MCkpICsgdHJhbnNpdGlvbl9tYW51YWwodGltZSkgKw0KICBsYWJzKHRpdGxlID0gIlByZXNpw7NuIGZpc2NhbCBlbiBlbCBlbnRvcm5vIGV1cm9wZW8gKDIwMDktMjAyMCkiLA0KICAgICAgIHN1YnRpdGxlID0gIlBlcmlvZG86IHtjdXJyZW50X2ZyYW1lfSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRvcyBleHRyYcOtZG9zIGRlIEV1cm9zdGF0IERhdGFiYXNlIikgDQoNCg0KZ2dhbmltYXRlOjphbmltYXRlKG1hcGFfMiwgbmZyYW1lcyA9IDIwMCwgZnBzID0gMjUsIGVuZF9wYXVzZSA9IDYpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZz0gRkFMU0UsIG91dC53aWR0aCA9ICI4NSUifQ0KDQpwIDwtIGdncGxvdChFX1BfMSkgKw0KICBnZW9tX3NlZ21lbnQoZGF0YSA9IGVmICwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gdmFsdWUsIHkgPSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgIHllbmQgPSBwZiRjb3VudHJ5LCB4ZW5kID0gcGYkdmFsdWUpLCANCiAgICAgICAgICAgICAgIGNvbG9yID0gIiM4RDhFOTEiLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDIuNSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IC41KSArDQogIGdlb21fcG9pbnQoYWVzKHggPSB2YWx1ZSwgeSA9IGNvdW50cnksIGNvbG9yID0gdGlwbyksIHNpemUgPSA0LCBzaG93LmxlZ2VuZCA9IFRSVUUpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGJyZWFrcyA9IGMoIlByZXNpb25fZmlzYyIsImVzZnVlcnpvX2Zpc2MiKSwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjRkYwMDAwIiwgIiMwMDQwRkYiKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQcmVzacOzbiBGaXNjYWwiLCAiRXNmdWVyem8gRmlzY2FsIikpICsNCiAgZ2d0aXRsZSgiUHJlc2nDs24gRmlzY2FsIHZzIEVzZnVlcnpvIEZpc2NhbCBwYXJhIGxhIEV1cm96b25hIDIwMjAiKSArDQogIGxhYnMoY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGNvbiBkYXRvcyBkZSBFdXJvc3RhdCIpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IikpICsNCiAgbGFicyh4ID0gTlVMTCkgKw0KICBsYWJzKHkgPSBOVUxMKSArDQogIGd1aWRlcyhjb2xvcj0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkluZGljYWRvciIpKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0tMC41LCBzaXplPSAxMCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PTEuNSwgc2l6ZT0gOCkpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBlZiAsDQogICAgICAgICAgICBhZXMoeCA9IHZhbHVlLCB5ID0gY291bnRyeSwgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQodmFsdWUsIDIpLCBjb2xvdXIgPSB0aXBvKSwgdmp1c3QgPSAwLjI1LGhqdXN0ID0gMS40NSwgc2l6ZSA9IDIuNzUpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBwZiAsDQogICAgICAgICAgICBhZXMoeCA9IHZhbHVlLCB5ID0gY291bnRyeSwgbGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQodmFsdWUsIDIpLCBjb2xvdXIgPSB0aXBvKSwgdmp1c3QgPSAwLjI1LGhqdXN0ID0gLSAwLjQ1LCBzaXplID0gMi43NSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMCkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpDQoNCg0KcA0KDQpgYGANCg0KPGJyPg0KDQoNCiMjIDYuIENvbmNsdXNpb25lcw0KDQpVbmEgdmV6IGV4cHVlc3RvIGxhcyBjb25jbHVzaW9uZXMgYW50ZXJpb3JlcywgcG9kZW1vcyBhZmlybWFyIHF1ZSAqKmxhIHNvc3RlbmliaWxpZGFkIHZhIGEgZGVwZW5kZXIqKiBlbiBtYXlvciBtZWRpZGEgZGUgKip0cmVzIHN1cHVlc3RvcyoqIGltcG9ydGFudGVzOiANCg0KMSkgKipRdWUgZWwgY3JlY2ltaWVudG8gbm9taW5hbCBkZWwgUElCIHJldG9tYSBlbCBkaW5hbWlzbW8gZW4gbG9zIHByw7N4aW1vcyBhw7Fvcy4qKg0KMikgKipRdWUgZWwgZW50b3JubyBkZSB0aXBvIGRlIGludGVyw6lzIHNpZ3VlIHNpZW5kbyBmYXZvcmFibGUuKioNCjMpICoqUXVlIGVsIHNhbGRvIHByZXN1cHVlc3RhcmlvIHNlIGNvcnJpamEgZW4gbGEgcHLDs3hpbWEgZMOpY2FkYS4qKg0KDQpDb24gbG8gcXVlIGNvcnJlc3BvbmRlIGFsICoqcHJpbWVyIHN1cHVlc3RvKiosIHJlY29yZGVtb3MgbG8gYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvLCBlcyBtdXkgY29tcGxpY2FkbyBoYWNlciBlc3RpbWFjaW9uZXMsIHBlcm8gc2kgdG9tYW1vcyBjb21vIHJlZmVyZW5jaWEg4oCcICpsYXMgbcOhcyBvcHRpbWlzdGFzKuKAnSB1bmEgY29zYSBxdWVkYSBjbGFyYSwgdmEgYSBzZXIgdW5hICpiYWxhKiBxdWUgdGFyZGFyZW1vcyBtw61uaW1vIDIgYcOxb3MgZW4gcG9kZXIgdXRpbGl6YXIuDQpFbiBzZWd1bmRvIGx1Z2FyLCAqKmVsIHN1cHVlc3RvIGRvcyoqLCBiYWpvIG1pIGNvbnNpZGVyYWNpw7NuIGVsICoqbcOhcyBpbXBvcnRhbnRlIGVuIGVsIGNvcnRvIHBsYXpvKiogZXMgbGEgZXZvbHVjacOzbiBkZSBsb3MgdGlwb3MgZGUgaW50ZXLDqXMuIEVsIHBhc2FkbyAzMCBkZSBkaWNpZW1icmUgZGVsIDIwMjEsIGVsIElORSBww7pibGljbyBzdSBkYXRvIGFkZWxhbnRhZG8gZGUgaW5mbGFjacOzbiwgbGEgZWNvbm9tw61hIGVzcGHDsW9sYSAoKmNvbW8geWEgdHJhdGFtb3MgZW4gZWwgdHJhYmFqbyBncnVwYWwqKSBzaWd1ZSBjb2xlY2Npb25hbmRvIHLDqWNvcmRzLiBDb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBsYSBpbmZsYWNpw7NuIHByb3NpZ3VlIGltcGFyYWJsZSBzdSBlc2NhbGFkYS4gRWwgKipJUEMgc2UgaGEgc2l0dWFkbyBlbiBlbCA2LDclIGludGVyYW51YWwqKiBlbiBlbCBtZXMgZGUgZGljaWVtYnJlIChmcmVudGUgYWwgNSw4JSBwcmV2aXN0byBwb3IgbG9zIGV4cGVydG9zKSwgbGlkZXJhZG8gdW5hIHZleiBtw6FzIHBvciB1biBpbmNyZW1lbnRvIGRlIGxvcyBwcmVjaW9zIGVuZXJnw6l0aWNvcyAoZWxlY3RyaWNpZGFkLCBwZXRyw7NsZW8sIGdhcy4uLikgcXVlIHlhIGVzdMOhIHBlcm1lYW5kbyBlbiBlbCByZXN0byBkZSBsYSBjZXN0YSBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MuIA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQppbmZsYWNpb25fZXNwX2dlbiA8LSBpbmZsYWNpb25fZXNwICU+JSBmaWx0ZXIodGlwbyA9PSAiZ2VuZXJhbCIpDQoNCmluZmxhY2lvbl9lc3Bfc3ViIDwtIGluZmxhY2lvbl9lc3AgJT4lIGZpbHRlcih0aXBvID09ICJzdWJ5YWNlbnRlIikNCg0KDQplc3AgPC0gZ2dwbG90KCkgKw0KICANCiAgZ2VvbV9saW5lKGRhdGEgPSBpbmZsYWNpb25fZXNwX2dlbiwgYWVzKGRhdGUsIHZhbHVlLCBjb2xvdXIgPSB0aXBvKSwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBpbmZsYWNpb25fZXNwX2dlbiwgYWVzKGRhdGUsIHZhbHVlLCAgY29sb3VyID0gdGlwbywgc2hhcGUgPSB0aXBvKSwgc2l6ZSA9IDMpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBpbmZsYWNpb25fZXNwX2dlbiwgYWVzKGRhdGUsIHZhbHVlLCBsYWJlbCA9IHZhbHVlLCBjb2xvdXIgPSB0aXBvKSwgdmp1c3QgPSAyLjUsaGp1c3QgPSAwLjUsIHNpemUgPSAzKSArDQogIGdlb21fdGV4dChkYXRhID0gaW5mbGFjaW9uX2VzcF9nZW4sIGFlcyhkYXRlLCB2YWx1ZSwgbGFiZWwgPSAiJSIsIGNvbG91ciA9IHRpcG8pLCB2anVzdCA9IDIuNSxoanVzdCA9IC0xLCBzaXplID0gMykgKw0KICANCiAgZ2VvbV9saW5lKGRhdGEgPSBpbmZsYWNpb25fZXNwX3N1YiwgYWVzKGRhdGUsIHZhbHVlLCAgY29sb3VyID0gdGlwbyksIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9wb2ludChkYXRhID0gaW5mbGFjaW9uX2VzcF9zdWIsIGFlcyhkYXRlLCB2YWx1ZSwgY29sb3VyID0gdGlwbywgc2hhcGUgPSB0aXBvKSwgc2l6ZSA9IDMpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBpbmZsYWNpb25fZXNwX3N1YiwgYWVzKGRhdGUsIHZhbHVlLCBsYWJlbCA9IHZhbHVlLCBjb2xvdXIgPSB0aXBvKSwgdmp1c3QgPSAtMS41LGhqdXN0ID0gMC43NSwgc2l6ZSA9IDMpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBpbmZsYWNpb25fZXNwX3N1YiwgYWVzKGRhdGUsIHZhbHVlLCBsYWJlbCA9ICIlIiwgY29sb3VyID0gdGlwbyksIHZqdXN0ID0gLTEuNSxoanVzdCA9IC0wLjUsIHNpemUgPSAzKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE3KSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKGJyZWFrcyA9IGMoImdlbmVyYWwiLCAic3VieWFjZW50ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoIiM3QzIyMDMiLCAiI0Y5OUY1QyIpKSArDQogIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSAwLjI1LA0KICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICANCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzPSIlYiAleSIsIGRhdGVfYnJlYWtzICA9ICIxIG1vbnRoIikgKw0KICANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3MCwgaGp1c3QgPSAxKSkgKw0KICANCiAgbGltcyh5PSBjKC0zLCA3KSkgKw0KICBsYWJzKHggPSBOVUxMKSArDQogIGxhYnMoY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlIElORWJhc2UiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gTkEpKSArIA0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKSkgKw0KICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueT1lbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55PWVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKGNvbG91ciA9ICJHZW5lcmFsIikgICsNCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiZ3JheTI0IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJ3aGl0ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAid2hpdGUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gIndoaXRlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ0cmFuc3BhcmVudCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gYW51YWwgZGVsIElQQyIsIHN1YnRpdGxlID0gIsONbmRpY2UgZ2VuZXJhbCB5IHN1YnlhY2VudGUuIikgKw0KICBndWlkZXMoc2hhcGUgPSBGQUxTRSkgDQoNCmVzcA0KDQoNCmBgYA0KDQoNCkNvbiBsbyBxdWUgY29ycmVzcG9uZGUgYWwgKip0ZXJjZXIgc3VwdWVzdG8qKiwgZMOpamVtZSBlbCBsZWN0b3IgcG9uZXIgZW4gZHVkYSBxdWUgYWxnw7puIGdvYmllcm5vIHRlbmdhIGxhIHZhbGVudMOtYSBkZSBoYWNlciBsYXMgcmVmb3JtYXMgZXN0cnVjdHVyYWxlcyBxdWUgaGVtb3MgcGxhbnRlYWRvLCBzb2xvIGVuIGFsIGNhc28gZGUgcHJvcG9uZXIgdW4gYWp1c3RlIGVuIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIHDDumJsaWNhcyBwdWVkZSB0ZW5lciB1biBjb3N0ZSBwb2zDrXRpY28gZGUgZWxldmFkYXMgZGltZW5zaW9uZXMsIHJlY29yZGVtb3MgcXVlIGVzdGFtb3MgaGFibGFuZG8gZGUgYXByb3hpbWFkYW1lbnRlIGRlIDkuMDAwLjAwMCBkZSBwZW5zaW9uaXN0YXMsIGVzIGRlIGRlY2lyLCBkZSB2b3RhbnRlcy4gRGF0byBxdWUgcG9yIGNpZXJ0byB2YSBlbiBleHBvbmVuY2lhbCBhdW1lbnRvLg0KDQpPdHJvIGFzcGVjdG8gaW50ZXJyZWxhY2lvbmFkbyBjb24gZXN0b3MgdHJlcyBzdXB1ZXN0b3MgbG9zIHRlbmVtb3MgZW4gbGEgZGlzdHJpYnVjacOzbiBwb3IgdGVuZWRvcmVzIGRlIGRldWRhIHDDumJsaWNhIGVzcGHDsW9sYS4gQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgYXByb3hpbWFkYW1lbnRlIGVsICoqNTAlIGRlIGxhIGRldWRhIHDDumJsaWNhIGVzcGHDsW9sYSBlc3TDoSBlbiBtYW5vcyBkZSBpbnZlcnNvcmVzIGV4dHJhbmplcm9zKiosIGFkaWNpb25hbG1lbnRlLCBtw6FzIGVsIDI1JSBjb3JyZXNwb25kZSBhbCBCQ0UgeSBlbCBCYW5jbyBkZSBFc3Bhw7FhLiAgUmVjb3JkZW1vcyBxdWUgZXN0YW1vcyBkZW50cm8gZGUgbGEgZXVyb3pvbmEsICoqc2luIGF1dG9yaWRhZCBtb25ldGFyaWEqKiwgdG9kbyBxdWVkYSBzdXBlZGl0YWRvIGEgZXN0ZSByZXNwZWN0byBwb3IgZWwgQkNFLiBUZW5lbW9zIHVubyBkZSBsYXMgcmF0aW9zIG3DoXMgZWxldmFkb3MgZGUgbGEgZXVyb3pvbmEsICoqc2kgbm8gZW1wZXphbW9zIGEgaGFjZXJub3MgbnVlc3RyYXMgcHJvcGlhcyBjdWVudGFzLCByw6FwaWRhbWVudGUgbGEgKmV1cm8tY8OhbWFyYSogbGFzIGhhcsOhIHBvciBub3NvdHJvcyoqLiBMb3MgYmFuY29zIGNlbnRyYWxlcyBoYW4gaW5jcmVtZW50YWRvIHN1IHByZXNlbmNpYSBlbiBsb3Mgw7psdGltb3MgNSBhw7FvcyBncmFjaWFzIGEgbGEgZmxleGliaWxpemFjacOzbiBjdWFudGl0YXRpdmEgZGVsIEJDRSwgcGVybyBlc3RvIG5vIHZhIGEgZHVyYXIgcGFyYSBzaWVtcHJlLCBsYSBleHBhbnNpw7NuIG1vbmV0YXJpYSBtw6FzIHRhcmRlIHF1ZSBwcm9udG8gdG9jYXLDoSBzdSBmaW4sIHksIGRlc2dyYWNpYWRhbWVudGUsIG5vIG5vcyBwaWxsYSBwcmVwYXJhZG9zIHBhcmFkb3MgKCphbHVtbm9zIGEgZMOtYSBkZSBob3kqKSBwYXJhIGFmcm9udGFyIGVsIGRpZsOtY2lsIHJldG8sIHF1ZSBubyAqKmltcG9zaWJsZSoqLCBkZSByZWR1Y2lyIG51ZXN0cm8gZW5kZXVkYW1pZW50by4NCg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmc9IEZBTFNFfQ0KDQphYSA8LSBnZ3Bsb3QoKSArDQogIGdlb21fY29sKGRhdGEgPSBEaXN0X3RlbmVkb3JlcywgYWVzKHggPSByZW9yZGVyKHRlbmVkb3IsIHZhbHVlKSwgeSA9IHZhbHVlLCBmaWxsID0gdmFsdWUpKSArDQogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3c9IiM1Q0QxRkUiLCBoaWdoPSIjMDI1MjcxIikgKyANCiAgY29vcmRfZmxpcCgpICsNCiAgZ3VpZGVzIChmaWxsID0gRkFMU0UpKw0KICBsYWJzICh5ID0gTlVMTCkgKw0KICBsYWJzKHggPSBOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LjUsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIikpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInRyYW5zcGFyZW50IikpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciB0ZW5lZG9yZXMgZGUgbGEgZGV1ZGEgKDIwMDItMjAyMCkiLA0KICAgICAgIHN1YnRpdGxlID0gIlBlcmlvZG86IHtjdXJyZW50X2ZyYW1lfSIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgY29uIGRhdG9zIGRlbCBUZXNvcm8gUMO6YmxpY28iKSArDQogIHRyYW5zaXRpb25fbWFudWFsKGRhdGUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6dW5pdF9mb3JtYXQodW5pdCA9ICJN4oKsIiwgc2NhbGUgPSAxZSswKSkNCiANCg0KDQpnZ2FuaW1hdGU6OmFuaW1hdGUoYWEsIG5mcmFtZXMgPSAxMDAsIGZwcyA9IDEwLCBlbmRfcGF1c2UgPSA1MCkNCg0KYGBgDQoNCj4gQWwgaWd1YWwgcXVlIGNvbiBsYSBpbmZsYWNpw7NuLCBkZWJlbW9zIGVtcGV6YXIgYSB0b21hcm5vcyBtdXkgZW5zZXJpbyBsYSBzaXR1YWNpw7NuIGRlIG51ZXN0cm8gZW5kZXVkYW1pZW50by4NCg0KIyMgNy4gUmVmZXJlbmNpYXMgDQoNCjxicj4NCg0KLSBbUMOhZ2luYSB3ZWIgZGUgSW5lQmFzZV0oaHR0cHM6Ly93d3cuaW5lLmVzL2R5bmdzL0lORWJhc2UvbGlzdGFvcGVyYWNpb25lcy5odG0pDQoNCi0gW1DDoWdpbmEgd2ViIGRlIEV1cm9zdGF0RGF0YWJhc2VdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L2RhdGEvZGF0YWJhc2UpDQoNCi0gW1DDoWdpbmEgd2ViIGRlIEVjb25vbWlwZWRpYV0oaHR0cHM6Ly9lY29ub21pcGVkaWEuY29tLykNCg0KLSBbUMOhZ2luYSB3ZWIgZGUgbGEgRGlyZWNjacOzbiBHZW5lcmFsIGRlbCBUZXNvcm8gUMO6YmxpY29dKGh0dHBzOi8vd3d3LnRlc29yby5lcy9jYSkNCg0KLSBBcnTDrWN1bG8gZGVsIGVjb25vbWlzdGE6IFtFc3Bhw7FhIGVzdMOhIGVudHJlIGxvcyBjaW5jbyBwYcOtc2VzIGRlIGxhIE9DREUgY29uIG1heW9yIGVzZnVlcnpvIGZpc2NhbF0oaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmVzL2Vjb25vbWlhL25vdGljaWFzLzEwNzI0MDMyLzA4LzIwL0VzcGFuYS1lc3RhLWVudHJlLWxvcy1jaW5jby1wYWlzZXMtZGUtbGEtT0NERS1jb24tbWF5b3ItZXNmdWVyem8tZmlzY2FsLmh0bWwpDQoNCi0gQXJ0w61jdWxvIEp1YW4gUmFtw7NuIFJhbGxvOiBbVG9tYXJzZSBlbiBzZXJpbyBsYSBkZXVkYV0oaHR0cHM6Ly9ibG9ncy5lbGNvbmZpZGVuY2lhbC5jb20vZWNvbm9taWEvbGFpc3Nlei1mYWlyZS8yMDIwLTA5LTE0L2RldWRhLXBpYi1lc3BhbmEtdG9tYXJzZS1lbi1zZXJpb18yNzQ2MTA3LykNCg0KLSBBZHJpw6AgTW9ycm9uIFNhbG1vbmVybywgQ2FpeGFCYW5rIFJlc2VhcmNoIFvCv0RlYmUgcHJlb2N1cGFybm9zIGxhIHNvc3RlbmliaWxpZGFkIGRlIGxhIGRldWRhIHDDumJsaWNhIGVuIGxhIGV1cm96b25hP10oaHR0cHM6Ly93d3cuY2FpeGFiYW5rcmVzZWFyY2guY29tL2VzL2Vjb25vbWlhLXktbWVyY2Fkb3Mvc2VjdG9yLXB1YmxpY28vZGViZS1wcmVvY3VwYXJub3Mtc29zdGVuaWJpbGlkYWQtZGV1ZGEtcHVibGljYS1ldXJvem9uYSkNCg0KLSBDYW5hbCBkZSBZb3V0dWJlIFtFY29ub21pYVBpbGxzXShodHRwczovL3d3dy55b3V0dWJlLmNvbS9jL0Vjb25vbWljUGlsbHMpDQoNCi0gTWUgaGUgaW5zcGlyYWRvIGVuIGVsIHRyYWJham8gW+KAnEluZmxhY2nDs24gZW4gdGllbXBvcyBkZSBwYW5kZW1pYeKAnSBoYSBzaWRvIGVsYWJvcmFkbyBwb3IgSmVzdXMgTGxvcmV0IFF1ZXJvLCBGcmFuY2lzY28gTWFydMOtbmV6IENhYmFsbGVybyB5IFZpY2VudCBNb21ww7MgQ3Jlc3BvXShodHRwczovL2dpdGh1Yi5jb20vZnJhbjIyMDAvdHJhYmFqb19CaWdEYXRhX2VxdWlwbykgDQoNCi0gW1DDoWdpbmEgd2ViIFRoZSBSIEdyYXBoIEdhbGxlcnldKGh0dHBzOi8vd3d3LnItZ3JhcGgtZ2FsbGVyeS5jb20vKQ0KDQotIEFydMOtY3VsbyBkZWwgZWNvbm9taXN0YTogW0xhIGluZmxhY2nDs24gbm8gZW5jdWVudHJhIHRlY2hvIGVuIEVzcGHDsWFdKGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5lcy9lY29ub21pYS9ub3RpY2lhcy8xMTU0NTg0OS8xMi8yMS9MYS1pbmZsYWNpb24tbm8tZW5jdWVudHJhLXRlY2hvLWVuLUVzcGFuYS1lbC1JUEMtc2UtZGlzcGFyYS1hbC02Ny1lbi1kaWNpZW1icmUteS10b2NhLW1heGltb3MtZGUtdHJlcy1kZWNhZGFzLmh0bWwpDQoNCi0gQXJ0w61jdWxvIGRlIEFkcmnDoW4gRnJhbmNpc2NvIFZhcmVsYTogW0ludmVyc29yZXMgZXh0cmFuamVyb3MsIGJhbmNvcyBjZW50cmFsZXMgZSBpbnN0aXR1Y2lvbmVzIGV1cm9wZWFzXShodHRwczovL3d3dy5idXNpbmVzc2luc2lkZXIuZXMvY2FzaS1taXRhZC1kZXVkYS1wdWJsaWNhLWVzcGFub2xhLW1hbm9zLWV4dHJhbmplcmFzLTU0MTM5OSkNCg0K