Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. Introducción


En este trabajo, voy a tratar un tema que me parece muy importante. La desigualdad no solo trata de riqueza, patrimonio neto o de los ingresos. También abarca la facilidad que tienen las personas para acceder a los servicios de salud, la educación de calidad o los servicios públicos.

A través de este trabajo quiero analizar la desigualdad que existe en la actualidad a través de una serie de gráficos y datos.


1.2 Desigualdad


La desigualdad se puede definir como el trato desigual o diferente que indica diferencia o discriminación de un individuo hacia otro debido a su posición social, económica, religiosa, sexo, raza, color de piel, personalidad, cultura, entre otros. Por tanto, hay también diferentes tipos de desigualdad, pero voy a centrarme sobre todo en la desigualdad económica y de género.

La desigualdad económica es la diferencia que existe en la distribución de bienes, ingresos y rentas en el seno de un grupo, una sociedad, un país o entre países.

El aumento de la desigualdad ha supuesto que el 1% de las personas con mayores ingresos en el mundo reciba una proporción dos veces más elevada del crecimiento que el 50% de menores ingresos desde 1980.


knitr::include_graphics(here::here("imagenes", "desigualdad.jpg"))


2. Datos


Para poder hacer el siguiente trabajo he necesitado primero obtener una serie de datos. Los datos que he utilizado proceden del INE, a continuación, he descargado cuatro archivos en formato xls que corresponden a la tasa de pobreza, la renta por hogar, la renta por hogar según sexo y edad, y por último el coeficiente de Gini. Todos estos datos están relacionados con la desigualdad.


#DATOS TASA DE RIESGO DE POBREZA

#url <- "https://www.ine.es/jaxiT3/Datos.htm?t=9963#!tabs-tabla"
#archivo_de_destino <- here::here("Datos", "riesgo_pobreza.xls")
#download.file(url, archivo_de_destino)

#Descargaría así los datos desde el INE pero en mi caso no me funcionaba entonces he optado por descargarme las tablas y introducirlas directamente en la carpeta datos.

#Utilizamos el paquete readxl para importar datos de excel, usamos los argumentos sheet para el número de pestaña y range para seleccionar el rango de celdas que queremos importar

df_pobreza <- read_excel ("./datos/tasa_de_riesgo_de_pobreza.xls", sheet=1, range ="A8:M28")

df_renta_por_hogar <- read_excel ("./datos/Renta_por_hogar.xls", sheet=1, range = "A8:M28") 

df_renta_por_persona_y_sexo <- read_excel ("./datos/renta_por_persona_y_sexo.xls", sheet = 1, range = "A8:M12") 

# Cojo hasta el M12 en vez de coger hasta el M11 porque de la otra forma no aparecen los datos  de mujeres, más tarde arreglaré el df.

df_coeficiente_de_gini <- read_excel("./datos/coeficiente_de_gini.xls", sheet = 1, range = "A7:M9") 

2.1. Procesando los datos


En este apartado explicaré como he procesado los distintos datos para poder hacer los gráficos. En todos los casos ha sido necesario modificar los df’s originales para poderlos adaptar a cada gráfico, tabla o mapa. A partir de cada código explico de manera más especifica que he hecho en cada caso.


#DF POBREZA

names(df_pobreza) = c("C.autonomas", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008")  # Cambio el nombre de las columnas para que la primera  columna se llame C. autonomas

df_pobreza1 <- df_pobreza %>% pivot_longer(cols=2:13 , names_to= "Años", values_to = "Tasa") 
# Pasamos del formato wide al formato long

df_pobreza2 <- df_pobreza1 %>% filter(C.autonomas == "Total Nacional") %>% select(Años, Tasa) 
# Filtramos primero para los datos del total nacional y después seleccionamos solo las columnas Años y Tasa, ya tenemos el df para poder hacer el primer gráfico

df_pobreza3 <- df_pobreza1 %>% filter(C.autonomas != "Total Nacional", Años=="2019") %>% slice_max(n=19, Tasa) 
# Filtramos primero para obtener solo los datos de las diferentes comunidades autónomas, eliminando el total nacional y filtramos solo los datos del año 2019, además ordenamos con slice_max las comunidades de mayor a menor.


#Preparo el df para el mapa que muestra las tasas por C.Autónomas

CCAA <- rio::import("https://github.com/perezp44/LAU2boundaries4spain/blob/master/data/CCAA.rda?raw=true") #Cargamos el conjunto de datos de las CCAA para obtener las geometrias.

#Después quería hacer un df juntando el de CCAA y el df_pobreza2 pero tuve un problema al juntarlos porque en el df CCAA esta Ceuta y Melilla juntos y en los datos que yo tenia Ceuta y Melilla estaban por separado. Entonces tuve que crear una nueva variable que recogiera los dos datos.

df_pobreza3$Tasa[1] #Almacenamos la tasa de Ceuta
#> [1] 40.6

df_pobreza3$Tasa[2] #Almacenamos la tasa de Melilla
#> [1] 35.7

df_wide <- df_pobreza3 %>% pivot_wider(names_from= C.autonomas, values_from = Tasa) # Pasamos  el df de long a wider para tener las C.autónomas en columnas y así poder añadir la nueva variable.

names(df_wide) = c("Años", "Ceuta", "Melilla", "Extremadura", "Andalucía", "Canarias", "Región de Murcia", "Castilla-La Mancha", "Comunidad Valenciana", "Principado de Asturias", "Galicia", "Aragón", "Cantabria", "Comunidad de Madrid", "Cataluña", "Castilla y León", "La Rioja", "Illes Balears", "País Vasco", "Comunidad Foral de Navarra") #Cambio los nombres de las variables para que sea más fácil hacer modificaciones.

df_wide1 <- df_wide %>% mutate( "Ciudades Autónomas de Ceuta y Melilla"= (Ceuta + Melilla)/2) #Con mutate() cremaos la nueva variable que recoge los datos de Ceuta y Melilla juntos y hacemos la media de los dos para obtener la tasa de pobreza.

df_pobreza4 <- df_wide1 %>% pivot_longer(cols = 2:21, names_to= "C.autonomas", values_to= "Tasa") %>% filter(C.autonomas != "Ceuta") %>% filter(C.autonomas!="Melilla") %>% slice_max(n=18, Tasa) #Ahora usamos filter para eliminar Ceuta y Melilla ya que ahora las tenemos de forma conjunta, y volvemos a ordenar los datos con slice.

dfCCAApobreza <- full_join(df_pobreza4, CCAA, by= c("C.autonomas" = "NombreCCAA")) #Hacemos un full_join para unir ambos df's.


#DF RENTA POR HOGAR


#Modificamos el df que representa la renta por hogar

names(df_renta_por_hogar) = c("C.autonomas", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008") #Cambio el nombre de la columna 1 

df_long <- df_renta_por_hogar %>%pivot_longer(cols = 2:13, names_to= "Años", values_to = "Renta neta media por hogar") # Pasamos de formato wide a long.

df_renta_por_hogar1 <- df_long %>% filter( C.autonomas == "Total Nacional") %>% select(Años,`Renta neta media por hogar`) # Filtramos para obtener el Total Nacional y seleccionamos Años y Renta neta media por hogar


df_renta_por_hogar2 <- df_long %>% filter(C.autonomas != "Total Nacional", Años=="2019") %>% slice_max(n=19, `Renta neta media por hogar`) #A partir de este df hare un mapa de España que represente la renta por hogar de las distintas comunidades autónomas, en este df tenemos el mismo problema que con el anterior de la tasa de pobreza y tendremos que crear una nueva variable que represente ceuta y melilla de forma conjunta.


#Almacenamos los datos de las dos variables


df_renta_por_hogar2$`Renta neta media por hogar`[7] #Almacenamos la renta por hogar de Ceuta
#> [1] 30432

df_renta_por_hogar2$`Renta neta media por hogar`[1] #Almacenamos la renta por hogar de Melilla
#> [1] 37552

df_wide2 <- df_renta_por_hogar2 %>% pivot_wider(names_from= C.autonomas, values_from = `Renta neta media por hogar`) #Pasamos de long a wide

names(df_wide2) = c("Años","Melilla", "País Vasco", "Comunidad de Madrid", "Comunidad Foral de Navarra", "Cataluña", "Illes Balears", "Ceuta", "La Rioja", "Aragón", "Cantabria", "Principado de Asturias", "Castilla y León", "Galicia", "Comunidad Valenciana", "Castilla-La Mancha", "Canarias", "Región de Murcia", "Andalucía", "Extremadura") # Cambiamos los nombres de las variables para poder hacer mejor las transformaciones.

df_wide3 <- df_wide2 %>% mutate( "Ciudades Autónomas de Ceuta y Melilla"= (Ceuta + Melilla)/2) # Con mutate() cremaos la nueva variable que recoge los datos de Ceuta y Melilla juntos y hacemos la media de los dos para obtener la renta por hogar.

df_renta_por_hogar3 <- df_wide3 %>% pivot_longer(cols = 2:21, names_to= "C.autonomas", values_to= "Renta neta media por hogar") %>% filter(C.autonomas != "Ceuta") %>% filter(C.autonomas!="Melilla") %>% slice_max(n=18, `Renta neta media por hogar`) # Ahora usamos filter para eliminar Ceuta y Melilla ya que ahora las tenemos de forma conjunta, y volvemos a ordenar los datos con slice.

dfCCAArenta <- full_join(df_renta_por_hogar3, CCAA, by= c("C.autonomas" = "NombreCCAA")) # Hacemos un full_join para unir ambos df's.


#DF RENTA MEDIA POR PERSONA Y SEXO

#Modificamos el df que representa la renta neta media por persona y sexo.

names(df_renta_por_persona_y_sexo) = c("Genero", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008") #Renombramos las variables

df_renta_por_persona_y_sexo1 <- df_renta_por_persona_y_sexo %>% filter(Genero != "Ambos sexos") # Eliminamos ambos sexos

df_renta_por_persona_y_sexo2 <- df_renta_por_persona_y_sexo1 %>% pivot_longer(cols = 2:13, names_to= "Años", values_to = "Renta neta media por persona") # Pasamos de formato wide a long.

# DF COEFICIENTE DE GINI

#Modificamos el df que representa el coeficiente de gini

names(df_coeficiente_de_gini) = c("Tipo", "2019", "2018", "2017", "2016", "2015", "2014", "2013", "2012", "2011", "2010", "2009", "2008") # Renombramos las variables.

df_coeficiente_de_gini1 <- df_coeficiente_de_gini %>% pivot_longer(cols = 2:13, names_to= "Años", values_to= "Coeficientes de Gini") # Pasamos de formato wide a long.


#Limpieza de df's utilizados, voy a dejar solo los que he utilizado para hacer gráficos, mapas o tablas.

objetos_no_borrar <-c("df_pobreza", "df_pobreza2", "df_pobreza4", "dfCCAApobreza", "df_renta_por_hogar", "df_renta_por_hogar1", "df_renta_por_hogar2", "df_renta_por_hogar3","dfCCAArenta", "df_renta_por_persona_y_sexo2", "df_coeficiente_de_gini1")
rm(list = ls()[!ls() %in% objetos_no_borrar])

3. Población en riesgo de pobreza


En primer lugar, consideramos que están en riesgo de pobreza aquellas personas que viven en hogares cuya renta es inferior al 60% de la mediana de la renta de su país o territorio, cuyos ingresos están por debajo del “Umbral de pobreza”. Además, hay que tener en cuenta que no mide pobreza absoluta, sino cuantas personas tienen ingresos bajos en relación al conjunto de la población.

El umbral de pobreza es un indicador del nivel de vida medio de la población. Cuanto mayor sea el umbral de pobreza, mayor es en principio el nivel de vida de una sociedad. Por tanto, un incremento del umbral de pobreza, con un mantenimiento del riesgo de pobreza indica que el nivel de ingresos de la población general mejora y lo contrario ocurre si el umbral de pobreza disminuye.


3.1 Gráfico 1: Tasa de pobreza en España



En el siguiente gráfico podemos ver representada la tasa de pobreza de España desde 2008 a 2019. En 2019 presentó un porcentaje de 20,7% de la población en riesgo de pobreza, como podemos ver ha disminuido respecto al año anterior en 0,8 puntos, en 2018 la tasa era de 21,5%.

En 2008 aumenta la tasa en riesgo de pobreza a causa de la crisis económica y sigue aumentando hasta 2016. También podemos ver que a pesar de que en algunos años como en 2013 donde la tasa es menor respecto al 2012, presenta una tendencia alcista de 2008 a 2016. A partir de 2016 la situación mejora y continua disminuyendo hasta 2019.

En cuanto a la situación actual, la organización Oxfam ha alertado de que el impacto socioeconómico de la pandemia podría aumentar en más de 1,1 millones las personas en situación de pobreza en España, hasta alcanzar los 10,9 millones, el 23,07% de la población.

3.2 Gráfico 2: Tasa de pobreza por CCAA

En este gráfico he querido mostrar la tasa de pobreza por Comunidades autónomas. Además en la siguiente pestaña he añadido una tabla para poder observar los datos de cada Comunidad autónoma de forma más sencilla.

En primer lugar, nos encontramos con que las Comunidades autónomas que presentan una mayor Tasa de pobreza són: las Ciudades Autónomas de Ceuta y Melilla, Extremadura, Andalucía y Canarias.

En segundo lugar, podemos observar que las Comunidades Autónomas con menor tasa son: Comunidad Foral de Navarra, País Vasco y Illes Balears.

3.3 Tabla datos: Tasa de pobreza por CCAA

Años C.autonomas Tasa
2019 Ciudades Autónomas de Ceuta y Melilla 38.15
2019 Extremadura 31.50
2019 Andalucía 31.30
2019 Canarias 28.50
2019 Región de Murcia 27.70
2019 Castilla-La Mancha 26.20
2019 Comunidad Valenciana 23.70
2019 Principado de Asturias 20.70
2019 Galicia 20.00
2019 Aragón 17.90
2019 Cantabria 17.30
2019 Comunidad de Madrid 15.00
2019 Cataluña 13.90
2019 Castilla y León 12.90
2019 La Rioja 12.30
2019 Illes Balears 12.00
2019 País Vasco 10.00
2019 Comunidad Foral de Navarra 7.70


4. Renta anual neta media por hogar


La renta anual neta media del hogar son los ingresos netos percibidos durante el año anterior al de la entrevista por los miembros del hogar, que son los que proporcionan la información para la elaboración de la encuesta.

Estos ingresos se componen de: los ingresos del trabajo por cuenta ajena, beneficios/pérdidas del trabajo por cuenta propia, prestaciones sociales, rentas procedentes de esquemas privados de pensiones no relacionados con el trabajo, rentas del capital y de la propiedad, transferencias entre hogares, ingresos percibidos por menores y el resultado de la declaración por el IRPF y por el Impuesto sobre el Patrimonio. No se incluyen las componentes no monetarias, salvo el coche de empresa.


4.1 Gráfico 3: Renta neta media por hogar en España



El siguiente gráfico representa la renta media por hogar desde 2008 a 2019. En 2008 la renta anual neta media por hogar era de 28.787 euros. A partir de 2009 empieza a disminuir de 30.045 a 29.634 en 2010.

Podemos observar como de 2010 a 2015 la tendencia que sigue la renta anual neta media por hogar es a la baja hasta que en 2016 aumenta hasta 2019.


4.1.1 Gráfico 4: Renta neta media por hogar CCAA


El gráfico representa la Renta neta media anual por hogar por Comunidades Autónomas. Podemos observar que las comunidades con mayor renta neta media anual són: País Vasco, Comunidad de Madrid y Comunidad de Foral de Navarra. En cambio, encontramos entre las comunidades que presentan menor renta neta media anual a Extremadura, Andalucía y Región de Murcía.

4.1.2 Tabla datos: Renta neta media por hogar CCAA

Años C.autonomas Renta neta media por hogar
2019 País Vasco 36399
2019 Comunidad de Madrid 35587
2019 Comunidad Foral de Navarra 34612
2019 Ciudades Autónomas de Ceuta y Melilla 33992
2019 Cataluña 33321
2019 Illes Balears 32179
2019 La Rioja 30162
2019 Aragón 29672
2019 Cantabria 29144
2019 Principado de Asturias 27897
2019 Castilla y León 27679
2019 Galicia 27541
2019 Comunidad Valenciana 26176
2019 Castilla-La Mancha 24853
2019 Canarias 24565
2019 Región de Murcia 24448
2019 Andalucía 23826
2019 Extremadura 21611


4.2 Renta neta media por persona y sexo


A continuación, vamos a observar un gráfico que representa la renta neta media por persona según el género. La diferencia de unos datos a otros se puede explicar a causa de la brecha salarial de género en España. La diferencia del salario anual entre un hombre y una mujer es de 4.915 euros, según datos que ofrecen los Técnicos del Ministerio de Hacienda.

Las principales causas de la brecha salarial són: discriminación en el lugar de trabajo, dificultad de conciliar la vida laboral y familiar, diferentes salarios por sectores y escasez de liderazgo de mujeres en puestos de alto nivel.


4.2.1 Gráfico 5: Renta media por persona por género



En este gráfico he querido mostrar la renta neta anual media por sexo distinguiendo entre Hombres y Mujeres para poder ver mejor las diferencias. Además, en el gráfico se muestra el total que está calculado como la media de los resultados de Hombres y Mujeres.

En el gráfico podemos ver a simple vista como los hombres representados por la línea roja presenta una renta mayor que las mujeres, representadas con una linea verde, que presentan una renta menor. Esta diferencia entre rentas se mantiene desde 2008 a 2019 aunque podemos ver que en algunos periodos esta diferencia disminuye y en cambio en otros se hace mayor.

El año donde esta diferencia es menor es en 2013 donde los Hombres tienen una renta media anual de 10.576 y las Mujeres de 10.488. Y el año donde esta diferencia es mayor es en 2009 con una renta de 11.561 en el caso de los hombres y de 11.080 en el caso de las mujeres.


5. Coeficiente de Gini


El indice de Gini se utiliza para analizar el grado de inequidad en la distribución respecto a los ingresos. Este indicador toma valores entre cero y uno (o entre 0 y 100 si esta en porcentaje). Si el indicador toma el 0 representaría la perfecta igualdad, todas las personas tienen los mismos ingresos, en cambio si el indicador toma el valor de 1 significaría que todo el ingreso nacional estaría en manos de una única persona, perfecta desigualdad.

Se calcula con la siguiente fórmula: \[ 1- \sum_{k=1}^n (X_k + X_{k-1})(Y_k- Y_{k-1}) \]

5.1 Gráfico 6: Coeficiente de Gini con alquiler imputado



En el gráfico podemos observar cómo en general aumenta de 2008 a 2014 lo que supondría un aumento de la desigualdad, pero a partir de 2015 va disminuyendo hasta 2019 que alcanza un porcentaje de 33. Aunque los datos son menores respecto a años anteriores todavía queda mucho por hacer ya que a día de hoy no hemos recuperado los datos de 2008.


6. Conclusión


En este trabajo he analizado distintas variables para poder observar la situación de españa respecto a la desigualdad. La desigualdad sigue siendo un problema, centrandonos en la tasa de pobreza todavía no hemos recuperado los niveles que teníamos en 2008. Además como ya he mencionado la situación actual de la pandemia va a contribuir a empeorar los niveles de desigualdad incrementando la pobreza ya que són muchas las personas que se han quedado sin empleo y han visto disminuidos sus ingresos.

Por otra parte, la renta neta anual por hogar según los datos es mayor que en 2008 pero todavía queda disminuir los efectos de la brecha salarial sobre la diferencia de ingresos entre hombres y mujeres. Algunas de las medidas que pueden contribuir a disminuirlas són: el impulso de políticas públicas que se centren en el acceso a la educación y capacitación profesional, incorporación de estímulos derivados de medidas la adopción de sellos de calidad y de igualdad de género empresarial o medidas de apoyo a la conciliación para proteger la maternidad, entre otras.

Por último, el coeficiente de Gini aunque es menor que en años anteriores tampoco hemos alacanzado los datos de 2008. Hacen faltan políticas que ayuden a disminuir la desigualdad existente. Políticas que ayudan a disminuirla són: acceso universal a educación de calidad, tributación progresiva, desarrollo y nutrición en la primera infancia, entre otras.

7. Trabajos en los que te has basado


En este trabajo he cogido ideas fundamentalmente de una página llamada epdata donde encontré una serie de gráficos basados en la tasa de pobreza, en la renta neta anual media y el coeficiente de Gini. En esta página se puede ver varios ejemplos de gráficos y tomé el ejemplo de los gráficos que podía hacer para mi trabajo.

También he buscado información en distintas páginas para obtener más información acerca de la desigualdad y además he buscado tutoriales de r para poder hacer el trabajo. En la bibliografia se puede encontrar las distintas páginas que he utilizado para elaborarlo.


LS0tDQp0aXRsZTogIkxhIERlc2lndWFsZGFkIg0Kc3VidGl0bGU6ICJMYXVyYSBCb3Jyw6FzIFBhcmllbnRlIChsYXVib3BhQGFsdW1uaS51di5lcykiICMtIHBvbmdvIHTDuiBub21icmUgYWjDrSBwYXJhIHEgYXBhcmV6Y2EgbcOhcyBncmFuZGUgcSBlbCBkZSBsYSBVVg0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkVuZXJvIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGAxNy8wMS8yMWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dUaGVtZUFzc2lzdCkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdnc3BhdGlhbCkNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSANCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQpib2R5IHsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCIuL2ltYWdlbmVzL2JsdWVfd2FsbHBhcGVyLmpwZyIpDQogIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQ7DQogIGJhY2tncm91bmQtc2l6ZTogMTAwJTsNCn0NCg0KZGl2IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIzMSwgMjU0LCAxKSAvKiA1NSUgb3BhcXVlIHdoaXRlICovOw0KICBwYWRkaW5nOiAwLjEwZW07DQp9DQpgYGANCg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij48ZGl2Lz4NCg0KPGhyIGNsYXNzPSJsaW5lYS1ibGFjayI+DQoNClRyYWJham8gZWxhYm9yYWRvIHBhcmEgbGEgYXNpZ25hdHVyYSAiUHJvZ3JhbWFjacOzbiB5IG1hbmVqbyBkZSBkYXRvcyBlbiBsYSBlcmEgZGVsIEJpZyBEYXRhIiBkZSBsYSBVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEgZHVyYW50ZSBlbCBjdXJzbyAyMDIwLTIwMjEuIEVsIHJlcG8gZGVsIHRyYWJham8gZXN0w6EgW2FxdcOtXShodHRwczovL2dpdGh1Yi5jb20vTGF1cmEzNjk5L3RyYWJham9fQmlnRGF0YSl7dGFyZ2V0PSJfYmxhbmsifS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjAtMjEtd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCg0KPGhyIGNsYXNzPSJsaW5lYS1yZWQiPg0KDQojICoxLiBJbnRyb2R1Y2Npw7NuKg0KDQo8YnI+DQogPGZvbnQgc2l6ZT0iMyI+RW4gZXN0ZSB0cmFiYWpvLCB2b3kgYSB0cmF0YXIgdW4gdGVtYSBxdWUgbWUgcGFyZWNlIG11eSBpbXBvcnRhbnRlLiBMYSBkZXNpZ3VhbGRhZCBubyBzb2xvIHRyYXRhIGRlIHJpcXVlemEsIHBhdHJpbW9uaW8gbmV0byBvIGRlIGxvcyBpbmdyZXNvcy4gVGFtYmnDqW4gYWJhcmNhIGxhIGZhY2lsaWRhZCBxdWUgdGllbmVuIGxhcyBwZXJzb25hcyBwYXJhIGFjY2VkZXIgYSBsb3Mgc2VydmljaW9zIGRlIHNhbHVkLCBsYSBlZHVjYWNpw7NuIGRlIGNhbGlkYWQgbyBsb3Mgc2VydmljaW9zIHDDumJsaWNvcy4NCg0KQSB0cmF2w6lzIGRlIGVzdGUgdHJhYmFqbyBxdWllcm8gYW5hbGl6YXIgbGEgZGVzaWd1YWxkYWQgcXVlIGV4aXN0ZSBlbiBsYSBhY3R1YWxpZGFkIGEgdHJhdsOpcyBkZSB1bmEgc2VyaWUgZGUgZ3LDoWZpY29zIHkgZGF0b3MuPC9mb250Pg0KDQo8YnI+DQoNCiMjICoxLjIgRGVzaWd1YWxkYWQqDQoNCjxicj4NCg0KIDxmb250IHNpemU9IjMiPkxhICoqZGVzaWd1YWxkYWQqKiBzZSBwdWVkZSBkZWZpbmlyIGNvbW8gZWwgdHJhdG8gZGVzaWd1YWwgbyBkaWZlcmVudGUgcXVlIGluZGljYSBkaWZlcmVuY2lhIG8gZGlzY3JpbWluYWNpw7NuIGRlIHVuIGluZGl2aWR1byBoYWNpYSBvdHJvIGRlYmlkbyBhIHN1IHBvc2ljacOzbiBzb2NpYWwsIGVjb27Ds21pY2EsIHJlbGlnaW9zYSwgc2V4bywgcmF6YSwgY29sb3IgZGUgcGllbCwgcGVyc29uYWxpZGFkLCBjdWx0dXJhLCBlbnRyZSBvdHJvcy4gUG9yIHRhbnRvLCBoYXkgdGFtYmnDqW4gZGlmZXJlbnRlcyB0aXBvcyBkZSBkZXNpZ3VhbGRhZCwgcGVybyB2b3kgYSBjZW50cmFybWUgc29icmUgdG9kbyBlbiBsYSBkZXNpZ3VhbGRhZCBlY29uw7NtaWNhIHkgZGUgZ8OpbmVyby4NCg0KKipMYSBkZXNpZ3VhbGRhZCBlY29uw7NtaWNhKiogZXMgbGEgZGlmZXJlbmNpYSBxdWUgZXhpc3RlIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGUgYmllbmVzLCBpbmdyZXNvcyB5IHJlbnRhcyBlbiBlbCBzZW5vIGRlIHVuIGdydXBvLCB1bmEgc29jaWVkYWQsIHVuIHBhw61zIG8gZW50cmUgcGHDrXNlcy4NCg0KRWwgYXVtZW50byBkZSBsYSBkZXNpZ3VhbGRhZCBoYSBzdXB1ZXN0byBxdWUgZWwgMSUgZGUgbGFzIHBlcnNvbmFzIGNvbiBtYXlvcmVzIGluZ3Jlc29zIGVuIGVsIG11bmRvIHJlY2liYSB1bmEgcHJvcG9yY2nDs24gZG9zIHZlY2VzIG3DoXMgZWxldmFkYSBkZWwgY3JlY2ltaWVudG8gcXVlIGVsIDUwJSBkZSBtZW5vcmVzIGluZ3Jlc29zIGRlc2RlIDE5ODAuPC9mb250Pg0KDQoNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1UUlVFfQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJkZXNpZ3VhbGRhZC5qcGciKSkNCg0KYGBgDQoNCg0KPGJyPg0KDQojICoyLiBEYXRvcyoNCjxicj4NCiA8Zm9udCBzaXplPSIzIj5QYXJhIHBvZGVyIGhhY2VyIGVsIHNpZ3VpZW50ZSB0cmFiYWpvIGhlIG5lY2VzaXRhZG8gcHJpbWVybyBvYnRlbmVyIHVuYSBzZXJpZSBkZSBkYXRvcy4gTG9zIGRhdG9zIHF1ZSBoZSB1dGlsaXphZG8gcHJvY2VkZW4gZGVsIElORSwgYSBjb250aW51YWNpw7NuLCBoZSBkZXNjYXJnYWRvIGN1YXRybyBhcmNoaXZvcyBlbiBmb3JtYXRvIHhscyBxdWUgY29ycmVzcG9uZGVuIGEgbGEgdGFzYSBkZSBwb2JyZXphLCBsYSByZW50YSBwb3IgaG9nYXIsIGxhIHJlbnRhIHBvciBob2dhciBzZWfDum4gc2V4byB5IGVkYWQsIHkgcG9yIMO6bHRpbW8gZWwgY29lZmljaWVudGUgZGUgR2luaS4gVG9kb3MgZXN0b3MgZGF0b3MgZXN0w6FuIHJlbGFjaW9uYWRvcyBjb24gbGEgZGVzaWd1YWxkYWQuPC9mb250Pg0KDQo8YnI+DQoNCmBgYHtyLCBldmFsID0gVFJVRX0NCiNEQVRPUyBUQVNBIERFIFJJRVNHTyBERSBQT0JSRVpBDQoNCiN1cmwgPC0gImh0dHBzOi8vd3d3LmluZS5lcy9qYXhpVDMvRGF0b3MuaHRtP3Q9OTk2MyMhdGFicy10YWJsYSINCiNhcmNoaXZvX2RlX2Rlc3Rpbm8gPC0gaGVyZTo6aGVyZSgiRGF0b3MiLCAicmllc2dvX3BvYnJlemEueGxzIikNCiNkb3dubG9hZC5maWxlKHVybCwgYXJjaGl2b19kZV9kZXN0aW5vKQ0KDQojRGVzY2FyZ2Fyw61hIGFzw60gbG9zIGRhdG9zIGRlc2RlIGVsIElORSBwZXJvIGVuIG1pIGNhc28gbm8gbWUgZnVuY2lvbmFiYSBlbnRvbmNlcyBoZSBvcHRhZG8gcG9yIGRlc2Nhcmdhcm1lIGxhcyB0YWJsYXMgeSBpbnRyb2R1Y2lybGFzIGRpcmVjdGFtZW50ZSBlbiBsYSBjYXJwZXRhIGRhdG9zLg0KDQojVXRpbGl6YW1vcyBlbCBwYXF1ZXRlIHJlYWR4bCBwYXJhIGltcG9ydGFyIGRhdG9zIGRlIGV4Y2VsLCB1c2Ftb3MgbG9zIGFyZ3VtZW50b3Mgc2hlZXQgcGFyYSBlbCBuw7ptZXJvIGRlIHBlc3Rhw7FhIHkgcmFuZ2UgcGFyYSBzZWxlY2Npb25hciBlbCByYW5nbyBkZSBjZWxkYXMgcXVlIHF1ZXJlbW9zIGltcG9ydGFyDQoNCmRmX3BvYnJlemEgPC0gcmVhZF9leGNlbCAoIi4vZGF0b3MvdGFzYV9kZV9yaWVzZ29fZGVfcG9icmV6YS54bHMiLCBzaGVldD0xLCByYW5nZSA9IkE4Ok0yOCIpDQoNCmRmX3JlbnRhX3Bvcl9ob2dhciA8LSByZWFkX2V4Y2VsICgiLi9kYXRvcy9SZW50YV9wb3JfaG9nYXIueGxzIiwgc2hlZXQ9MSwgcmFuZ2UgPSAiQTg6TTI4IikgDQoNCmRmX3JlbnRhX3Bvcl9wZXJzb25hX3lfc2V4byA8LSByZWFkX2V4Y2VsICgiLi9kYXRvcy9yZW50YV9wb3JfcGVyc29uYV95X3NleG8ueGxzIiwgc2hlZXQgPSAxLCByYW5nZSA9ICJBODpNMTIiKSANCg0KIyBDb2pvIGhhc3RhIGVsIE0xMiBlbiB2ZXogZGUgY29nZXIgaGFzdGEgZWwgTTExIHBvcnF1ZSBkZSBsYSBvdHJhIGZvcm1hIG5vIGFwYXJlY2VuIGxvcyBkYXRvcyAgZGUgbXVqZXJlcywgbcOhcyB0YXJkZSBhcnJlZ2xhcsOpIGVsIGRmLg0KDQpkZl9jb2VmaWNpZW50ZV9kZV9naW5pIDwtIHJlYWRfZXhjZWwoIi4vZGF0b3MvY29lZmljaWVudGVfZGVfZ2luaS54bHMiLCBzaGVldCA9IDEsIHJhbmdlID0gIkE3Ok05IikgDQoNCmBgYA0KIyMgKjIuMS4gUHJvY2VzYW5kbyBsb3MgZGF0b3MqDQoNCjxicj4NCiA8Zm9udCBzaXplPSIzIj5FbiBlc3RlIGFwYXJ0YWRvIGV4cGxpY2Fyw6kgY29tbyBoZSBwcm9jZXNhZG8gbG9zIGRpc3RpbnRvcyBkYXRvcyBwYXJhIHBvZGVyIGhhY2VyIGxvcyBncsOhZmljb3MuIEVuIHRvZG9zIGxvcyBjYXNvcyBoYSBzaWRvIG5lY2VzYXJpbyBtb2RpZmljYXIgbG9zIGRmJ3Mgb3JpZ2luYWxlcyBwYXJhIHBvZGVybG9zIGFkYXB0YXIgYSBjYWRhIGdyw6FmaWNvLCB0YWJsYSBvIG1hcGEuIEEgcGFydGlyIGRlIGNhZGEgY8OzZGlnbyBleHBsaWNvIGRlIG1hbmVyYSBtw6FzIGVzcGVjaWZpY2EgcXVlIGhlIGhlY2hvIGVuIGNhZGEgY2Fzby48L2ZvbnQ+DQoNCmBgYHtyLCBldmFsID0gVFJVRX0NCg0KI0RGIFBPQlJFWkENCg0KbmFtZXMoZGZfcG9icmV6YSkgPSBjKCJDLmF1dG9ub21hcyIsICIyMDE5IiwgIjIwMTgiLCAiMjAxNyIsICIyMDE2IiwgIjIwMTUiLCAiMjAxNCIsICIyMDEzIiwgIjIwMTIiLCAiMjAxMSIsICIyMDEwIiwgIjIwMDkiLCAiMjAwOCIpICAjIENhbWJpbyBlbCBub21icmUgZGUgbGFzIGNvbHVtbmFzIHBhcmEgcXVlIGxhIHByaW1lcmEgIGNvbHVtbmEgc2UgbGxhbWUgQy4gYXV0b25vbWFzDQoNCmRmX3BvYnJlemExIDwtIGRmX3BvYnJlemEgJT4lIHBpdm90X2xvbmdlcihjb2xzPTI6MTMgLCBuYW1lc190bz0gIkHDsW9zIiwgdmFsdWVzX3RvID0gIlRhc2EiKSANCiMgUGFzYW1vcyBkZWwgZm9ybWF0byB3aWRlIGFsIGZvcm1hdG8gbG9uZw0KDQpkZl9wb2JyZXphMiA8LSBkZl9wb2JyZXphMSAlPiUgZmlsdGVyKEMuYXV0b25vbWFzID09ICJUb3RhbCBOYWNpb25hbCIpICU+JSBzZWxlY3QoQcOxb3MsIFRhc2EpIA0KIyBGaWx0cmFtb3MgcHJpbWVybyBwYXJhIGxvcyBkYXRvcyBkZWwgdG90YWwgbmFjaW9uYWwgeSBkZXNwdcOpcyBzZWxlY2Npb25hbW9zIHNvbG8gbGFzIGNvbHVtbmFzIEHDsW9zIHkgVGFzYSwgeWEgdGVuZW1vcyBlbCBkZiBwYXJhIHBvZGVyIGhhY2VyIGVsIHByaW1lciBncsOhZmljbw0KDQpkZl9wb2JyZXphMyA8LSBkZl9wb2JyZXphMSAlPiUgZmlsdGVyKEMuYXV0b25vbWFzICE9ICJUb3RhbCBOYWNpb25hbCIsIEHDsW9zPT0iMjAxOSIpICU+JSBzbGljZV9tYXgobj0xOSwgVGFzYSkgDQojIEZpbHRyYW1vcyBwcmltZXJvIHBhcmEgb2J0ZW5lciBzb2xvIGxvcyBkYXRvcyBkZSBsYXMgZGlmZXJlbnRlcyBjb211bmlkYWRlcyBhdXTDs25vbWFzLCBlbGltaW5hbmRvIGVsIHRvdGFsIG5hY2lvbmFsIHkgZmlsdHJhbW9zIHNvbG8gbG9zIGRhdG9zIGRlbCBhw7FvIDIwMTksIGFkZW3DoXMgb3JkZW5hbW9zIGNvbiBzbGljZV9tYXggbGFzIGNvbXVuaWRhZGVzIGRlIG1heW9yIGEgbWVub3IuDQoNCg0KI1ByZXBhcm8gZWwgZGYgcGFyYSBlbCBtYXBhIHF1ZSBtdWVzdHJhIGxhcyB0YXNhcyBwb3IgQy5BdXTDs25vbWFzDQoNCkNDQUEgPC0gcmlvOjppbXBvcnQoImh0dHBzOi8vZ2l0aHViLmNvbS9wZXJlenA0NC9MQVUyYm91bmRhcmllczRzcGFpbi9ibG9iL21hc3Rlci9kYXRhL0NDQUEucmRhP3Jhdz10cnVlIikgI0NhcmdhbW9zIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIGxhcyBDQ0FBIHBhcmEgb2J0ZW5lciBsYXMgZ2VvbWV0cmlhcy4NCg0KI0Rlc3B1w6lzIHF1ZXLDrWEgaGFjZXIgdW4gZGYganVudGFuZG8gZWwgZGUgQ0NBQSB5IGVsIGRmX3BvYnJlemEyIHBlcm8gdHV2ZSB1biBwcm9ibGVtYSBhbCBqdW50YXJsb3MgcG9ycXVlIGVuIGVsIGRmIENDQUEgZXN0YSBDZXV0YSB5IE1lbGlsbGEganVudG9zIHkgZW4gbG9zIGRhdG9zIHF1ZSB5byB0ZW5pYSBDZXV0YSB5IE1lbGlsbGEgZXN0YWJhbiBwb3Igc2VwYXJhZG8uIEVudG9uY2VzIHR1dmUgcXVlIGNyZWFyIHVuYSBudWV2YSB2YXJpYWJsZSBxdWUgcmVjb2dpZXJhIGxvcyBkb3MgZGF0b3MuDQoNCmRmX3BvYnJlemEzJFRhc2FbMV0gI0FsbWFjZW5hbW9zIGxhIHRhc2EgZGUgQ2V1dGENCg0KZGZfcG9icmV6YTMkVGFzYVsyXSAjQWxtYWNlbmFtb3MgbGEgdGFzYSBkZSBNZWxpbGxhDQoNCmRmX3dpZGUgPC0gZGZfcG9icmV6YTMgJT4lIHBpdm90X3dpZGVyKG5hbWVzX2Zyb209IEMuYXV0b25vbWFzLCB2YWx1ZXNfZnJvbSA9IFRhc2EpICMgUGFzYW1vcyAgZWwgZGYgZGUgbG9uZyBhIHdpZGVyIHBhcmEgdGVuZXIgbGFzIEMuYXV0w7Nub21hcyBlbiBjb2x1bW5hcyB5IGFzw60gcG9kZXIgYcOxYWRpciBsYSBudWV2YSB2YXJpYWJsZS4NCg0KbmFtZXMoZGZfd2lkZSkgPSBjKCJBw7FvcyIsICJDZXV0YSIsICJNZWxpbGxhIiwgIkV4dHJlbWFkdXJhIiwgIkFuZGFsdWPDrWEiLCAiQ2FuYXJpYXMiLCAiUmVnacOzbiBkZSBNdXJjaWEiLCAiQ2FzdGlsbGEtTGEgTWFuY2hhIiwgIkNvbXVuaWRhZCBWYWxlbmNpYW5hIiwgIlByaW5jaXBhZG8gZGUgQXN0dXJpYXMiLCAiR2FsaWNpYSIsICJBcmFnw7NuIiwgIkNhbnRhYnJpYSIsICJDb211bmlkYWQgZGUgTWFkcmlkIiwgIkNhdGFsdcOxYSIsICJDYXN0aWxsYSB5IExlw7NuIiwgIkxhIFJpb2phIiwgIklsbGVzIEJhbGVhcnMiLCAiUGHDrXMgVmFzY28iLCAiQ29tdW5pZGFkIEZvcmFsIGRlIE5hdmFycmEiKSAjQ2FtYmlvIGxvcyBub21icmVzIGRlIGxhcyB2YXJpYWJsZXMgcGFyYSBxdWUgc2VhIG3DoXMgZsOhY2lsIGhhY2VyIG1vZGlmaWNhY2lvbmVzLg0KDQpkZl93aWRlMSA8LSBkZl93aWRlICU+JSBtdXRhdGUoICJDaXVkYWRlcyBBdXTDs25vbWFzIGRlIENldXRhIHkgTWVsaWxsYSI9IChDZXV0YSArIE1lbGlsbGEpLzIpICNDb24gbXV0YXRlKCkgY3JlbWFvcyBsYSBudWV2YSB2YXJpYWJsZSBxdWUgcmVjb2dlIGxvcyBkYXRvcyBkZSBDZXV0YSB5IE1lbGlsbGEganVudG9zIHkgaGFjZW1vcyBsYSBtZWRpYSBkZSBsb3MgZG9zIHBhcmEgb2J0ZW5lciBsYSB0YXNhIGRlIHBvYnJlemEuDQoNCmRmX3BvYnJlemE0IDwtIGRmX3dpZGUxICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDI6MjEsIG5hbWVzX3RvPSAiQy5hdXRvbm9tYXMiLCB2YWx1ZXNfdG89ICJUYXNhIikgJT4lIGZpbHRlcihDLmF1dG9ub21hcyAhPSAiQ2V1dGEiKSAlPiUgZmlsdGVyKEMuYXV0b25vbWFzIT0iTWVsaWxsYSIpICU+JSBzbGljZV9tYXgobj0xOCwgVGFzYSkgI0Fob3JhIHVzYW1vcyBmaWx0ZXIgcGFyYSBlbGltaW5hciBDZXV0YSB5IE1lbGlsbGEgeWEgcXVlIGFob3JhIGxhcyB0ZW5lbW9zIGRlIGZvcm1hIGNvbmp1bnRhLCB5IHZvbHZlbW9zIGEgb3JkZW5hciBsb3MgZGF0b3MgY29uIHNsaWNlLg0KDQpkZkNDQUFwb2JyZXphIDwtIGZ1bGxfam9pbihkZl9wb2JyZXphNCwgQ0NBQSwgYnk9IGMoIkMuYXV0b25vbWFzIiA9ICJOb21icmVDQ0FBIikpICNIYWNlbW9zIHVuIGZ1bGxfam9pbiBwYXJhIHVuaXIgYW1ib3MgZGYncy4NCg0KDQojREYgUkVOVEEgUE9SIEhPR0FSDQoNCg0KI01vZGlmaWNhbW9zIGVsIGRmIHF1ZSByZXByZXNlbnRhIGxhIHJlbnRhIHBvciBob2dhcg0KDQpuYW1lcyhkZl9yZW50YV9wb3JfaG9nYXIpID0gYygiQy5hdXRvbm9tYXMiLCAiMjAxOSIsICIyMDE4IiwgIjIwMTciLCAiMjAxNiIsICIyMDE1IiwgIjIwMTQiLCAiMjAxMyIsICIyMDEyIiwgIjIwMTEiLCAiMjAxMCIsICIyMDA5IiwgIjIwMDgiKSAjQ2FtYmlvIGVsIG5vbWJyZSBkZSBsYSBjb2x1bW5hIDEgDQoNCmRmX2xvbmcgPC0gZGZfcmVudGFfcG9yX2hvZ2FyICU+JXBpdm90X2xvbmdlcihjb2xzID0gMjoxMywgbmFtZXNfdG89ICJBw7FvcyIsIHZhbHVlc190byA9ICJSZW50YSBuZXRhIG1lZGlhIHBvciBob2dhciIpICMgUGFzYW1vcyBkZSBmb3JtYXRvIHdpZGUgYSBsb25nLg0KDQpkZl9yZW50YV9wb3JfaG9nYXIxIDwtIGRmX2xvbmcgJT4lIGZpbHRlciggQy5hdXRvbm9tYXMgPT0gIlRvdGFsIE5hY2lvbmFsIikgJT4lIHNlbGVjdChBw7FvcyxgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgKSAjIEZpbHRyYW1vcyBwYXJhIG9idGVuZXIgZWwgVG90YWwgTmFjaW9uYWwgeSBzZWxlY2Npb25hbW9zIEHDsW9zIHkgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXINCg0KDQpkZl9yZW50YV9wb3JfaG9nYXIyIDwtIGRmX2xvbmcgJT4lIGZpbHRlcihDLmF1dG9ub21hcyAhPSAiVG90YWwgTmFjaW9uYWwiLCBBw7Fvcz09IjIwMTkiKSAlPiUgc2xpY2VfbWF4KG49MTksIGBSZW50YSBuZXRhIG1lZGlhIHBvciBob2dhcmApICNBIHBhcnRpciBkZSBlc3RlIGRmIGhhcmUgdW4gbWFwYSBkZSBFc3Bhw7FhIHF1ZSByZXByZXNlbnRlIGxhIHJlbnRhIHBvciBob2dhciBkZSBsYXMgZGlzdGludGFzIGNvbXVuaWRhZGVzIGF1dMOzbm9tYXMsIGVuIGVzdGUgZGYgdGVuZW1vcyBlbCBtaXNtbyBwcm9ibGVtYSBxdWUgY29uIGVsIGFudGVyaW9yIGRlIGxhIHRhc2EgZGUgcG9icmV6YSB5IHRlbmRyZW1vcyBxdWUgY3JlYXIgdW5hIG51ZXZhIHZhcmlhYmxlIHF1ZSByZXByZXNlbnRlIGNldXRhIHkgbWVsaWxsYSBkZSBmb3JtYSBjb25qdW50YS4NCg0KDQojQWxtYWNlbmFtb3MgbG9zIGRhdG9zIGRlIGxhcyBkb3MgdmFyaWFibGVzDQoNCg0KZGZfcmVudGFfcG9yX2hvZ2FyMiRgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgWzddICNBbG1hY2VuYW1vcyBsYSByZW50YSBwb3IgaG9nYXIgZGUgQ2V1dGENCg0KZGZfcmVudGFfcG9yX2hvZ2FyMiRgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgWzFdICNBbG1hY2VuYW1vcyBsYSByZW50YSBwb3IgaG9nYXIgZGUgTWVsaWxsYQ0KDQpkZl93aWRlMiA8LSBkZl9yZW50YV9wb3JfaG9nYXIyICU+JSBwaXZvdF93aWRlcihuYW1lc19mcm9tPSBDLmF1dG9ub21hcywgdmFsdWVzX2Zyb20gPSBgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgKSAjUGFzYW1vcyBkZSBsb25nIGEgd2lkZQ0KDQpuYW1lcyhkZl93aWRlMikgPSBjKCJBw7FvcyIsIk1lbGlsbGEiLCAiUGHDrXMgVmFzY28iLCAiQ29tdW5pZGFkIGRlIE1hZHJpZCIsICJDb211bmlkYWQgRm9yYWwgZGUgTmF2YXJyYSIsICJDYXRhbHXDsWEiLCAiSWxsZXMgQmFsZWFycyIsICJDZXV0YSIsICJMYSBSaW9qYSIsICJBcmFnw7NuIiwgIkNhbnRhYnJpYSIsICJQcmluY2lwYWRvIGRlIEFzdHVyaWFzIiwgIkNhc3RpbGxhIHkgTGXDs24iLCAiR2FsaWNpYSIsICJDb211bmlkYWQgVmFsZW5jaWFuYSIsICJDYXN0aWxsYS1MYSBNYW5jaGEiLCAiQ2FuYXJpYXMiLCAiUmVnacOzbiBkZSBNdXJjaWEiLCAiQW5kYWx1Y8OtYSIsICJFeHRyZW1hZHVyYSIpICMgQ2FtYmlhbW9zIGxvcyBub21icmVzIGRlIGxhcyB2YXJpYWJsZXMgcGFyYSBwb2RlciBoYWNlciBtZWpvciBsYXMgdHJhbnNmb3JtYWNpb25lcy4NCg0KZGZfd2lkZTMgPC0gZGZfd2lkZTIgJT4lIG11dGF0ZSggIkNpdWRhZGVzIEF1dMOzbm9tYXMgZGUgQ2V1dGEgeSBNZWxpbGxhIj0gKENldXRhICsgTWVsaWxsYSkvMikgIyBDb24gbXV0YXRlKCkgY3JlbWFvcyBsYSBudWV2YSB2YXJpYWJsZSBxdWUgcmVjb2dlIGxvcyBkYXRvcyBkZSBDZXV0YSB5IE1lbGlsbGEganVudG9zIHkgaGFjZW1vcyBsYSBtZWRpYSBkZSBsb3MgZG9zIHBhcmEgb2J0ZW5lciBsYSByZW50YSBwb3IgaG9nYXIuDQoNCmRmX3JlbnRhX3Bvcl9ob2dhcjMgPC0gZGZfd2lkZTMgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gMjoyMSwgbmFtZXNfdG89ICJDLmF1dG9ub21hcyIsIHZhbHVlc190bz0gIlJlbnRhIG5ldGEgbWVkaWEgcG9yIGhvZ2FyIikgJT4lIGZpbHRlcihDLmF1dG9ub21hcyAhPSAiQ2V1dGEiKSAlPiUgZmlsdGVyKEMuYXV0b25vbWFzIT0iTWVsaWxsYSIpICU+JSBzbGljZV9tYXgobj0xOCwgYFJlbnRhIG5ldGEgbWVkaWEgcG9yIGhvZ2FyYCkgIyBBaG9yYSB1c2Ftb3MgZmlsdGVyIHBhcmEgZWxpbWluYXIgQ2V1dGEgeSBNZWxpbGxhIHlhIHF1ZSBhaG9yYSBsYXMgdGVuZW1vcyBkZSBmb3JtYSBjb25qdW50YSwgeSB2b2x2ZW1vcyBhIG9yZGVuYXIgbG9zIGRhdG9zIGNvbiBzbGljZS4NCg0KZGZDQ0FBcmVudGEgPC0gZnVsbF9qb2luKGRmX3JlbnRhX3Bvcl9ob2dhcjMsIENDQUEsIGJ5PSBjKCJDLmF1dG9ub21hcyIgPSAiTm9tYnJlQ0NBQSIpKSAjIEhhY2Vtb3MgdW4gZnVsbF9qb2luIHBhcmEgdW5pciBhbWJvcyBkZidzLg0KDQoNCiNERiBSRU5UQSBNRURJQSBQT1IgUEVSU09OQSBZIFNFWE8NCg0KI01vZGlmaWNhbW9zIGVsIGRmIHF1ZSByZXByZXNlbnRhIGxhIHJlbnRhIG5ldGEgbWVkaWEgcG9yIHBlcnNvbmEgeSBzZXhvLg0KDQpuYW1lcyhkZl9yZW50YV9wb3JfcGVyc29uYV95X3NleG8pID0gYygiR2VuZXJvIiwgIjIwMTkiLCAiMjAxOCIsICIyMDE3IiwgIjIwMTYiLCAiMjAxNSIsICIyMDE0IiwgIjIwMTMiLCAiMjAxMiIsICIyMDExIiwgIjIwMTAiLCAiMjAwOSIsICIyMDA4IikgI1Jlbm9tYnJhbW9zIGxhcyB2YXJpYWJsZXMNCg0KZGZfcmVudGFfcG9yX3BlcnNvbmFfeV9zZXhvMSA8LSBkZl9yZW50YV9wb3JfcGVyc29uYV95X3NleG8gJT4lIGZpbHRlcihHZW5lcm8gIT0gIkFtYm9zIHNleG9zIikgIyBFbGltaW5hbW9zIGFtYm9zIHNleG9zDQoNCmRmX3JlbnRhX3Bvcl9wZXJzb25hX3lfc2V4bzIgPC0gZGZfcmVudGFfcG9yX3BlcnNvbmFfeV9zZXhvMSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjEzLCBuYW1lc190bz0gIkHDsW9zIiwgdmFsdWVzX3RvID0gIlJlbnRhIG5ldGEgbWVkaWEgcG9yIHBlcnNvbmEiKSAjIFBhc2Ftb3MgZGUgZm9ybWF0byB3aWRlIGEgbG9uZy4NCg0KIyBERiBDT0VGSUNJRU5URSBERSBHSU5JDQoNCiNNb2RpZmljYW1vcyBlbCBkZiBxdWUgcmVwcmVzZW50YSBlbCBjb2VmaWNpZW50ZSBkZSBnaW5pDQoNCm5hbWVzKGRmX2NvZWZpY2llbnRlX2RlX2dpbmkpID0gYygiVGlwbyIsICIyMDE5IiwgIjIwMTgiLCAiMjAxNyIsICIyMDE2IiwgIjIwMTUiLCAiMjAxNCIsICIyMDEzIiwgIjIwMTIiLCAiMjAxMSIsICIyMDEwIiwgIjIwMDkiLCAiMjAwOCIpICMgUmVub21icmFtb3MgbGFzIHZhcmlhYmxlcy4NCg0KZGZfY29lZmljaWVudGVfZGVfZ2luaTEgPC0gZGZfY29lZmljaWVudGVfZGVfZ2luaSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjEzLCBuYW1lc190bz0gIkHDsW9zIiwgdmFsdWVzX3RvPSAiQ29lZmljaWVudGVzIGRlIEdpbmkiKSAjIFBhc2Ftb3MgZGUgZm9ybWF0byB3aWRlIGEgbG9uZy4NCg0KDQojTGltcGllemEgZGUgZGYncyB1dGlsaXphZG9zLCB2b3kgYSBkZWphciBzb2xvIGxvcyBxdWUgaGUgdXRpbGl6YWRvIHBhcmEgaGFjZXIgZ3LDoWZpY29zLCBtYXBhcyBvIHRhYmxhcy4NCg0Kb2JqZXRvc19ub19ib3JyYXIgPC1jKCJkZl9wb2JyZXphIiwgImRmX3BvYnJlemEyIiwgImRmX3BvYnJlemE0IiwgImRmQ0NBQXBvYnJlemEiLCAiZGZfcmVudGFfcG9yX2hvZ2FyIiwgImRmX3JlbnRhX3Bvcl9ob2dhcjEiLCAiZGZfcmVudGFfcG9yX2hvZ2FyMiIsICJkZl9yZW50YV9wb3JfaG9nYXIzIiwiZGZDQ0FBcmVudGEiLCAiZGZfcmVudGFfcG9yX3BlcnNvbmFfeV9zZXhvMiIsICJkZl9jb2VmaWNpZW50ZV9kZV9naW5pMSIpDQpybShsaXN0ID0gbHMoKVshbHMoKSAlaW4lIG9iamV0b3Nfbm9fYm9ycmFyXSkNCg0KDQoNCg0KDQoNCg0KDQoNCmBgYA0KDQojICozLiBQb2JsYWNpw7NuIGVuIHJpZXNnbyBkZSBwb2JyZXphKg0KDQo8YnI+DQoNCiA8Zm9udCBzaXplPSIzIj5FbiBwcmltZXIgbHVnYXIsIGNvbnNpZGVyYW1vcyBxdWUgZXN0w6FuIGVuIHJpZXNnbyBkZSBwb2JyZXphIGFxdWVsbGFzIHBlcnNvbmFzIHF1ZSB2aXZlbiBlbiBob2dhcmVzIGN1eWEgcmVudGEgZXMgaW5mZXJpb3IgYWwgNjAlIGRlIGxhIG1lZGlhbmEgZGUgbGEgcmVudGEgZGUgc3UgcGHDrXMgbyB0ZXJyaXRvcmlvLCBjdXlvcyBpbmdyZXNvcyBlc3TDoW4gcG9yIGRlYmFqbyBkZWwgIlVtYnJhbCBkZSBwb2JyZXphIi4gQWRlbcOhcywgaGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgcXVlIG5vIG1pZGUgcG9icmV6YSBhYnNvbHV0YSwgc2lubyBjdWFudGFzIHBlcnNvbmFzIHRpZW5lbiBpbmdyZXNvcyBiYWpvcyBlbiByZWxhY2nDs24gYWwgY29uanVudG8gZGUgbGEgcG9ibGFjacOzbi4NCg0KRWwgdW1icmFsIGRlIHBvYnJlemEgZXMgdW4gaW5kaWNhZG9yIGRlbCBuaXZlbCBkZSB2aWRhIG1lZGlvIGRlIGxhIHBvYmxhY2nDs24uIEN1YW50byBtYXlvciBzZWEgZWwgdW1icmFsIGRlIHBvYnJlemEsIG1heW9yIGVzIGVuIHByaW5jaXBpbyBlbCBuaXZlbCBkZSB2aWRhIGRlIHVuYSBzb2NpZWRhZC4gUG9yIHRhbnRvLCB1biBpbmNyZW1lbnRvIGRlbCB1bWJyYWwgZGUgcG9icmV6YSwgY29uIHVuIG1hbnRlbmltaWVudG8gZGVsIHJpZXNnbyBkZSBwb2JyZXphIGluZGljYSBxdWUgZWwgbml2ZWwgZGUgaW5ncmVzb3MgZGUgbGEgcG9ibGFjacOzbiBnZW5lcmFsIG1lam9yYSB5IGxvIGNvbnRyYXJpbyBvY3VycmUgc2kgZWwgdW1icmFsIGRlIHBvYnJlemEgZGlzbWludXllLjwvZm9udD4NCg0KPGJyPg0KDQojIyAqMy4xIEdyw6FmaWNvIDE6IFRhc2EgZGUgcG9icmV6YSBlbiBFc3Bhw7FhICp7LnRhYnNldH0NCg0KPGJyPg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsPSBUUlVFfQ0KDQoNCiBhIDwtIGdncGxvdChkZl9wb2JyZXphMiwgYWVzKEHDsW9zLCBUYXNhLCBncm91cCA9IDEpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICAjIE1lIHNhbGlhIHVuIGVycm9yIChFYWNoIGdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgb25lIG9ic2VydmF0aW9uLiBEbyB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIGdyb3VwIGFlc3RoZXRpYz8pIHkgbm8gY29uc2VndcOtYSBtb3N0cmFyIGxvcyBkYXRvcyBjb24gZWwgZ2VvbV9saW5lKCksIGhlIGJ1c2NhZG8gdW5hIHNvbHVjacOzbiBlbiBpbnRlcm5ldCB5IGxvIHF1ZSBtZSBoYSBmdW5jaW9uYWRvIGhhIHNpZG8gYcOxYWRpciBncm91cD0xLg0KDQphICsgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIA0KICAgIGZhY2UgPSAiaXRhbGljIiwgY29sb3VyID0gImdyYXkyNiIsIGhqdXN0ID0gMC41KSwgDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZC5pdGFsaWMiLCANCiAgICAgICAgY29sb3VyID0gImdyYXkyNCIpLCBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjYpLCANCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBjb2xvdXIgPSAiZ3JheTUiKSwgDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCANCiAgICAgICAgc2l6ZSA9IDE1LCBmYWNlID0gImJvbGQuaXRhbGljIiwgDQogICAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IDEuNSksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5OTQiLCANCiAgICAgICAgc2l6ZSA9IDAuOSksIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImxpZ2h0Y3lhbjIiLCANCiAgICAgICAgY29sb3VyID0gImdyYXk3Iiwgc2l6ZSA9IDAuNywgbGluZXR5cGUgPSAiZGFzaGVkIikpICtsYWJzKHRpdGxlID0gIlRBU0EgREUgUE9CUkVaQSIsIHN1YnRpdGxlID0gIihEZXNkZSAyMDA4IGEgMjAxOSBlbiBFc3Bhw7FhKSIsIA0KICAgIGNhcHRpb24gPSAiRGF0b3MgcHJvdmluaWVudGVzIGRlbCBJTkUiKQ0KDQoNCmBgYA0KIA0KPGJyPg0KDQogPGZvbnQgc2l6ZT0iMyI+RW4gZWwgc2lndWllbnRlIGdyw6FmaWNvIHBvZGVtb3MgdmVyIHJlcHJlc2VudGFkYSBsYSB0YXNhIGRlIHBvYnJlemEgZGUgRXNwYcOxYSBkZXNkZSAyMDA4IGEgMjAxOS4gRW4gMjAxOSBwcmVzZW50w7MgdW4gcG9yY2VudGFqZSBkZSAyMCw3JSBkZSBsYSBwb2JsYWNpw7NuIGVuIHJpZXNnbyBkZSBwb2JyZXphLCBjb21vIHBvZGVtb3MgdmVyIGhhIGRpc21pbnVpZG8gcmVzcGVjdG8gYWwgYcOxbyBhbnRlcmlvciBlbiAwLDggcHVudG9zLCBlbiAyMDE4IGxhIHRhc2EgZXJhIGRlIDIxLDUlLiANCg0KRW4gMjAwOCBhdW1lbnRhIGxhIHRhc2EgZW4gcmllc2dvIGRlIHBvYnJlemEgYSBjYXVzYSBkZSBsYSBjcmlzaXMgZWNvbsOzbWljYSB5IHNpZ3VlIGF1bWVudGFuZG8gaGFzdGEgMjAxNi4gVGFtYmnDqW4gcG9kZW1vcyB2ZXIgcXVlIGEgcGVzYXIgZGUgcXVlIGVuIGFsZ3Vub3MgYcOxb3MgY29tbyBlbiAyMDEzIGRvbmRlIGxhIHRhc2EgZXMgbWVub3IgcmVzcGVjdG8gYWwgMjAxMiwgcHJlc2VudGEgdW5hICB0ZW5kZW5jaWEgYWxjaXN0YSBkZSAyMDA4IGEgMjAxNi4gQSBwYXJ0aXIgZGUgMjAxNiBsYSBzaXR1YWNpw7NuIG1lam9yYSB5IGNvbnRpbnVhIGRpc21pbnV5ZW5kbyBoYXN0YSAyMDE5Lg0KDQpFbiBjdWFudG8gYSBsYSBzaXR1YWNpw7NuIGFjdHVhbCwgbGEgb3JnYW5pemFjacOzbiBPeGZhbSBoYSBhbGVydGFkbyBkZSBxdWUgZWwgaW1wYWN0byBzb2Npb2Vjb27Ds21pY28gZGUgbGEgcGFuZGVtaWEgcG9kcsOtYSBhdW1lbnRhciBlbiBtw6FzIGRlIDEsMSBtaWxsb25lcyBsYXMgcGVyc29uYXMgZW4gc2l0dWFjacOzbiBkZSBwb2JyZXphIGVuIEVzcGHDsWEsIGhhc3RhIGFsY2FuemFyIGxvcyAxMCw5IG1pbGxvbmVzLCBlbCAyMywwNyUgZGUgbGEgcG9ibGFjacOzbi48L2ZvbnQ+DQo8YnI+DQoNCg0KIyMjIDMuMiBHcsOhZmljbyAyOiBUYXNhIGRlIHBvYnJlemEgcG9yIENDQUEgey50YWJzZXR9DQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWw9IFRSVUV9DQoNCg0KQ0NBQV9wb2ludHMgPC0gY2JpbmQoZGZDQ0FBcG9icmV6YSwgc3RfY29vcmRpbmF0ZXMoc3RfY2VudHJvaWQoZGZDQ0FBcG9icmV6YSRnZW9tZXRyeSkpKQ0KDQpwPC0gZ2dwbG90KGRhdGEgPSBkZkNDQUFwb2JyZXphLCBhZXMoZ2VvbWV0cnkgPWdlb21ldHJ5KSkgK2dlb21fc2YoYWVzKGZpbGwgPSBUYXNhKSkgKyBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIiwgdHJhbnM9ICJzcXJ0IikgKyANCiAgbGFicyh0aXRsZSA9ICJHcsOhZmljbyAyOiBUYXNhIGRlIFBvYnJlemEgcG9yIENvbXVuaWRhZGVzIEF1dG9ub21hcyIpICsgYW5ub3RhdGlvbl9zY2FsZSgpICsgDQogIGFubm90YXRpb25fbm9ydGhfYXJyb3cobG9jYXRpb249J3RyJykgI0NyZWFtb3MgZWwgbWFwYSwgYcOxYWRlIHVuYSBmbGVjaGEgcXVlIGluZGljYSBlbCBub3J0ZSB5IHVuYSBlc2NhbGEuDQoNCnAgKyBnZW9tX3RleHQoZGF0YSA9IENDQUFfcG9pbnRzLCBhZXMoeCA9IFgsIHkgPSBZLCBsYWJlbD0gQy5hdXRvbm9tYXMpLCBjb2xvciA9ICJncmF5MCIsIGZvbnRmYWNlID0gImJvbGQiLCBjaGVja19vdmVybGFwID0gRkFMU0UsIHNpemUgPSAxLjcpICNMbyBwdXNlIGEgZXNlIHRhbWHDsW8gZGUgbGV0cmEgcG9ycXVlIHNpIHBvbmdvIDEuOCBvIG1hcyBjYW50YWJyaWEgeSBsYSBjb211bmlkYWQgdmFsZW5jaWFuYSBkZXNhcGFyZWNlbiBhbCBzb2xhcGFyc2UgY29uIG90cm9zIG5vbWJyZXMNCg0KDQoNCmBgYA0KDQogPGZvbnQgc2l6ZT0iMyI+RW4gZXN0ZSBncsOhZmljbyBoZSBxdWVyaWRvIG1vc3RyYXIgbGEgdGFzYSBkZSBwb2JyZXphIHBvciBDb211bmlkYWRlcyBhdXTDs25vbWFzLiBBZGVtw6FzIGVuIGxhIHNpZ3VpZW50ZSBwZXN0YcOxYSBoZSBhw7FhZGlkbyB1bmEgdGFibGEgcGFyYSBwb2RlciBvYnNlcnZhciBsb3MgZGF0b3MgZGUgY2FkYSBDb211bmlkYWQgYXV0w7Nub21hIGRlIGZvcm1hIG3DoXMgc2VuY2lsbGEuDQoNCkVuIHByaW1lciBsdWdhciwgbm9zIGVuY29udHJhbW9zIGNvbiBxdWUgbGFzIENvbXVuaWRhZGVzIGF1dMOzbm9tYXMgcXVlIHByZXNlbnRhbiB1bmEgbWF5b3IgVGFzYSBkZSBwb2JyZXphIHPDs246IGxhcyBDaXVkYWRlcyBBdXTDs25vbWFzIGRlIENldXRhIHkgTWVsaWxsYSwgRXh0cmVtYWR1cmEsIEFuZGFsdWPDrWEgeSBDYW5hcmlhcy4NCg0KRW4gc2VndW5kbyBsdWdhciwgcG9kZW1vcyBvYnNlcnZhciBxdWUgbGFzIENvbXVuaWRhZGVzIEF1dMOzbm9tYXMgY29uIG1lbm9yIHRhc2Egc29uOiBDb211bmlkYWQgRm9yYWwgZGUgTmF2YXJyYSwgUGHDrXMgVmFzY28geSBJbGxlcyBCYWxlYXJzLjwvZm9udD4NCg0KDQojIyMgMy4zIFRhYmxhIGRhdG9zOiBUYXNhIGRlIHBvYnJlemEgcG9yIENDQUEgey50YWJzZXR9DQoNCg0KYGBge3IsIGVjaG89IEZBTFNFLCBldmFsPSBUUlVFfQ0KDQprbml0cjo6a2FibGUoZGZfcG9icmV6YTQsIGZvcm1hdCA9ICJodG1sIikgJT4lIA0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IGxpc3QoZW5hYmxlZCA9IFQsIGJhY2tncm91bmQgPSAibGlnaHRzYWxtb24iKSkNCg0KDQpgYGANCg0KPGJyPg0KDQoNCiMgKjQuIFJlbnRhIGFudWFsIG5ldGEgbWVkaWEgcG9yIGhvZ2FyKg0KDQo8YnI+DQogPGZvbnQgc2l6ZT0iMyI+KipMYSByZW50YSBhbnVhbCBuZXRhIG1lZGlhIGRlbCBob2dhcioqIHNvbiBsb3MgaW5ncmVzb3MgbmV0b3MgcGVyY2liaWRvcyBkdXJhbnRlIGVsIGHDsW8gYW50ZXJpb3IgYWwgZGUgbGEgZW50cmV2aXN0YSBwb3IgbG9zIG1pZW1icm9zIGRlbCBob2dhciwgcXVlIHNvbiBsb3MgcXVlIHByb3BvcmNpb25hbiBsYSBpbmZvcm1hY2nDs24gcGFyYSBsYSBlbGFib3JhY2nDs24gZGUgbGEgZW5jdWVzdGEuIA0KDQpFc3RvcyBpbmdyZXNvcyBzZSBjb21wb25lbiBkZTogbG9zIGluZ3Jlc29zIGRlbCB0cmFiYWpvIHBvciBjdWVudGEgYWplbmEsIGJlbmVmaWNpb3MvcMOpcmRpZGFzIGRlbCB0cmFiYWpvIHBvciBjdWVudGEgcHJvcGlhLCBwcmVzdGFjaW9uZXMgc29jaWFsZXMsIHJlbnRhcyBwcm9jZWRlbnRlcyBkZSBlc3F1ZW1hcyBwcml2YWRvcyBkZSBwZW5zaW9uZXMgbm8gcmVsYWNpb25hZG9zIGNvbiBlbCB0cmFiYWpvLCByZW50YXMgZGVsIGNhcGl0YWwgeSBkZSBsYSBwcm9waWVkYWQsIHRyYW5zZmVyZW5jaWFzIGVudHJlIGhvZ2FyZXMsIGluZ3Jlc29zIHBlcmNpYmlkb3MgcG9yIG1lbm9yZXMgeSBlbCByZXN1bHRhZG8gZGUgbGEgZGVjbGFyYWNpw7NuIHBvciBlbCBJUlBGIHkgcG9yIGVsIEltcHVlc3RvIHNvYnJlIGVsIFBhdHJpbW9uaW8uIE5vIHNlIGluY2x1eWVuIGxhcyBjb21wb25lbnRlcyBubyBtb25ldGFyaWFzLCBzYWx2byBlbCBjb2NoZSBkZSBlbXByZXNhLjwvZm9udD4NCg0KPGJyPg0KDQojIyAqNC4xIEdyw6FmaWNvIDM6IFJlbnRhIG5ldGEgbWVkaWEgcG9yIGhvZ2FyIGVuIEVzcGHDsWEqIHsudGFic2V0fQ0KDQo8YnI+DQoNCmBgYHtyLCBlY2hvPSBGQUxTRSwgZXZhbD0gVFJVRX0NCg0KYiA8LSBnZ3Bsb3QoZGZfcmVudGFfcG9yX2hvZ2FyMSwgYWVzKEHDsW9zLCBgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgICkpICsgZ2VvbV9jb2woZmlsbD0gIm1lZGl1bXB1cnBsZTIiKSANCg0KYiArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCANCiAgICBjb2xvdXIgPSAiZ3JheTE1IiwgaGp1c3QgPSAwLjUpLCBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCANCiAgICBmYWNlID0gImJvbGQuaXRhbGljIiwgY29sb3VyID0gImdyYXkyNCIpLCANCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgDQogICAgICAgIGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMS43NSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIA0KICAgICAgICBjb2xvdXIgPSAiZ3JheTExIiksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgDQogICAgICAgIHNpemUgPSAxNSwgZmFjZSA9ICJib2xkLml0YWxpYyIsIA0KICAgICAgICBoanVzdCA9IDAuNSwgdmp1c3QgPSAxLjc1KSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyYXk5MyIsIA0KICAgICAgICBzaXplID0gMS4zKSwgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAibGF2ZW5kZXIiLCANCiAgICAgICAgY29sb3VyID0gImdyYXk3IiwgbGluZXR5cGUgPSAiZGFzaGVkIikpICtsYWJzKHRpdGxlID0gIlJFTlRBIE5FVEEgTUVESUEgUE9SIEhPR0FSIiwgDQogICAgeCA9ICJBw5FPUyIsIHkgPSAiUkVOVEEgTkVUQSBNRURJQSBQT1IgSE9HQVIiLCANCiAgICBzdWJ0aXRsZSA9ICIoRGVzZGUgMjAwOCBhIDIwMTkgZW4gRXNwYcOxYSkiLCANCiAgICBjYXB0aW9uID0gIkRhdG9zIHByb3ZlbmllbnRlIGRlbCBJTkUiKQ0KDQoNCg0KYGBgDQoNCjxicj4NCg0KIDxmb250IHNpemU9IjMiPkVsIHNpZ3VpZW50ZSBncsOhZmljbyByZXByZXNlbnRhIGxhIHJlbnRhIG1lZGlhIHBvciBob2dhciBkZXNkZSAyMDA4IGEgMjAxOS4gRW4gMjAwOCBsYSByZW50YSBhbnVhbCBuZXRhIG1lZGlhIHBvciBob2dhciBlcmEgZGUgMjguNzg3IGV1cm9zLiBBIHBhcnRpciBkZSAyMDA5IGVtcGllemEgYSBkaXNtaW51aXIgZGUgMzAuMDQ1IGEgMjkuNjM0IGVuIDIwMTAuIA0KDQpQb2RlbW9zIG9ic2VydmFyIGNvbW8gZGUgMjAxMCBhIDIwMTUgbGEgdGVuZGVuY2lhIHF1ZSBzaWd1ZSBsYSByZW50YSBhbnVhbCBuZXRhIG1lZGlhIHBvciBob2dhciBlcyBhIGxhIGJhamEgaGFzdGEgcXVlIGVuIDIwMTYgYXVtZW50YSBoYXN0YSAyMDE5LiA8L2ZvbnQ+DQoNCjxicj4NCg0KIyMjIDQuMS4xIEdyw6FmaWNvIDQ6IFJlbnRhIG5ldGEgbWVkaWEgcG9yIGhvZ2FyIENDQUEgey50YWJzZXR9DQogDQpgYGB7ciwgb3V0LndpZHRoPSI4MCUiLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KDQpDQ0FBX3BvaW50czEgPC0gY2JpbmQoZGZDQ0FBcmVudGEsIHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKGRmQ0NBQXJlbnRhJGdlb21ldHJ5KSkpDQoNCnA8LSBnZ3Bsb3QoZGF0YSA9IGRmQ0NBQXJlbnRhLCBhZXMoZ2VvbWV0cnkgPWdlb21ldHJ5KSkgK2dlb21fc2YoYWVzKGZpbGwgPSBgUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXJgICkpICsgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIHRyYW5zPSAic3FydCIpICsgDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gNDogUmVudGEgbmV0YSBtZWRpYSBwb3IgaG9nYXIgcG9yIENvbXVuaWRhZGVzIEF1dG9ub21hcyIpICsgYW5ub3RhdGlvbl9zY2FsZSgpICsgDQogIGFubm90YXRpb25fbm9ydGhfYXJyb3cobG9jYXRpb249J3RyJykgI0NyZWFtb3MgZWwgbWFwYSwgYcOxYWRlIHVuYSBmbGVjaGEgcXVlIGluZGljYSBlbCBub3J0ZSB5IHVuYSBlc2NhbGEuDQpwICsgZ2VvbV90ZXh0KGRhdGEgPSBDQ0FBX3BvaW50cywgYWVzKHggPSBYLCB5ID0gWSwgbGFiZWw9IEMuYXV0b25vbWFzKSwgY29sb3IgPSAiZ3JheTAiLCBmb250ZmFjZSA9ICJib2xkIiwgY2hlY2tfb3ZlcmxhcCA9IEZBTFNFLCBzaXplID0gMS43KSAjTG8gcHVzZSBhIGVzZSB0YW1hw7FvIGRlIGxldHJhIHBvcnF1ZSBzaSBwb25nbyAxLjggbyBtYXMgY2FudGFicmlhIHkgbGEgY29tdW5pZGFkIHZhbGVuY2lhbmEgZGVzYXBhcmVjZW4gYWwgc29sYXBhcnNlIGNvbiBvdHJvcyBub21icmVzDQoNCmBgYA0KDQo8YnI+DQogPGZvbnQgc2l6ZT0iMyI+RWwgZ3LDoWZpY28gcmVwcmVzZW50YSBsYSBSZW50YSBuZXRhIG1lZGlhIGFudWFsIHBvciBob2dhciBwb3IgQ29tdW5pZGFkZXMgQXV0w7Nub21hcy4gUG9kZW1vcyBvYnNlcnZhciBxdWUgbGFzIGNvbXVuaWRhZGVzIGNvbiBtYXlvciByZW50YSBuZXRhIG1lZGlhIGFudWFsIHPDs246IFBhw61zIFZhc2NvLCBDb211bmlkYWQgZGUgTWFkcmlkIHkgQ29tdW5pZGFkIGRlIEZvcmFsIGRlIE5hdmFycmEuIEVuIGNhbWJpbywgZW5jb250cmFtb3MgZW50cmUgbGFzIGNvbXVuaWRhZGVzIHF1ZSBwcmVzZW50YW4gbWVub3IgcmVudGEgbmV0YSBtZWRpYSBhbnVhbCBhIEV4dHJlbWFkdXJhLCBBbmRhbHVjw61hIHkgUmVnacOzbiBkZSBNdXJjw61hLjwvZm9udD4NCg0KIyMjIDQuMS4yIFRhYmxhIGRhdG9zOiBSZW50YSBuZXRhIG1lZGlhIHBvciBob2dhciBDQ0FBIHsudGFic2V0fQ0KDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWw9IFRSVUV9DQprbml0cjo6a2FibGUoZGZfcmVudGFfcG9yX2hvZ2FyMywgZm9ybWF0ID0gImh0bWwiKSAlPiUgDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gbGlzdChlbmFibGVkID0gVCwgYmFja2dyb3VuZCA9ICJsaWdodHBpbmsiKSkNCg0KDQpgYGANCg0KPGJyPg0KDQojIyAqNC4yIFJlbnRhIG5ldGEgbWVkaWEgcG9yIHBlcnNvbmEgeSBzZXhvKg0KDQo8YnI+DQoNCg0KPGZvbnQgc2l6ZT0iMyI+IEEgY29udGludWFjacOzbiwgdmFtb3MgYSBvYnNlcnZhciB1biBncsOhZmljbyBxdWUgcmVwcmVzZW50YSBsYSByZW50YSBuZXRhIG1lZGlhIHBvciBwZXJzb25hIHNlZ8O6biBlbCBnw6luZXJvLiBMYSBkaWZlcmVuY2lhIGRlIHVub3MgZGF0b3MgYSBvdHJvcyBzZSBwdWVkZSBleHBsaWNhciBhIGNhdXNhIGRlIGxhIGJyZWNoYSBzYWxhcmlhbCBkZSBnw6luZXJvIGVuIEVzcGHDsWEuIExhIGRpZmVyZW5jaWEgZGVsIHNhbGFyaW8gYW51YWwgZW50cmUgdW4gaG9tYnJlIHkgdW5hIG11amVyIGVzIGRlIDQuOTE1IGV1cm9zLCBzZWfDum4gZGF0b3MgcXVlIG9mcmVjZW4gbG9zIFTDqWNuaWNvcyBkZWwgTWluaXN0ZXJpbyBkZSBIYWNpZW5kYS4NCg0KTGFzIHByaW5jaXBhbGVzIGNhdXNhcyBkZSBsYSBicmVjaGEgc2FsYXJpYWwgc8OzbjogZGlzY3JpbWluYWNpw7NuIGVuIGVsIGx1Z2FyIGRlIHRyYWJham8sIGRpZmljdWx0YWQgZGUgY29uY2lsaWFyIGxhIHZpZGEgbGFib3JhbCB5IGZhbWlsaWFyLCBkaWZlcmVudGVzIHNhbGFyaW9zIHBvciBzZWN0b3JlcyB5IGVzY2FzZXogZGUgbGlkZXJhemdvIGRlIG11amVyZXMgZW4gcHVlc3RvcyBkZSBhbHRvIG5pdmVsLjwvZm9udD4NCg0KPGJyPg0KDQojIyAqNC4yLjEgR3LDoWZpY28gNTogUmVudGEgbWVkaWEgcG9yIHBlcnNvbmEgcG9yIGfDqW5lcm8qDQoNCjxicj4NCmBgYHtyLCBlY2hvPSBGQUxTRSwgZXZhbD0gVFJVRX0NCmRmX3JlbnRhX3Bvcl9wZXJzb25hX3lfc2V4bzMgPC0gZGZfcmVudGFfcG9yX3BlcnNvbmFfeV9zZXhvMiAlPiUgbXV0YXRlKEHDsW8gPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihBw7FvcykpKSAlPiUgc2VsZWN0KCJHZW5lcm8iLCAiUmVudGEgbmV0YSBtZWRpYSBwb3IgcGVyc29uYSIsICJBw7FvIikNCg0KYyA8LSBnZ3Bsb3QoZGZfcmVudGFfcG9yX3BlcnNvbmFfeV9zZXhvMywgYWVzKEHDsW8sIGBSZW50YSBuZXRhIG1lZGlhIHBvciBwZXJzb25hYCwgY29sb3IgPSBHZW5lcm8sIGdyb3VwPSBHZW5lcm8pKSArIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICMrIHRyYW5zaXRpb25fcmV2ZWFsKEHDsW8pLCBpYmEgYSBoYWNlciB1biBncsOhZmljbyBhbmltYWRvLCBmdW5jaW9uYSBubyBoYXkgbmluZ3VuIGVycm9yIGN1YW5kbyBsbyBjYXJnbyBlbiByLCBwZXJvIGN1YW5kbyBsZSBkb3kgYSBrbml0IG5vIGNhcmdhLCBwdWVkZSB0aXJhcnNlIGhvcmFzLg0KDQogICNFbiBlc3RlIGdyYWZpY28gaGUgdnVlbHRvIGEgdGVuZXIgZWwgZXJyb3IgKCBFYWNoIGdyb3VwIGNvbnNpc3RzIG9mIG9ubHkgb25lIG9ic2VydmF0aW9uLiBEbyB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIGdyb3VwIGFlc3RoZXRpYz8pIGxvIGhlIGFycmVnbGFkbyB1dGlsaXphbmRvIGdyb3VwIHkgYXNvY2lhbmRvbG8gYSBsYSB2YXJpYWJsZSBHZW5lcm8uIEHDsWFkaXIgdW5hIGRvYmxlIHBlc3Rhw7FhIHBhcmEgcG9uZXIgdW5hIHRhYmxhIGNvbiBsb3MgZGF0b3MgcGFyYSBhc2kgcG9kZXIgdmVyIGxvcyBkaWZlcmVudGVzIGRhdG8gc2VndW4gZWwgZ2VuZXJvLg0KIGMgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgDQogICAgY29sb3VyID0gImdyYXkyMiIsIGhqdXN0ID0gMC41KSwgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgDQogICAgY29sb3VyID0gImdyYXkyMiIpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjcpLCANCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgDQogICAgICAgIGZhY2UgPSAiYm9sZCIsIHZqdXN0ID0gMS43NSksIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIA0KICAgICAgICBjb2xvdXIgPSAiZ3JheTQiKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCANCiAgICAgICAgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQuaXRhbGljIiwgDQogICAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IDEuNzUpLCBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTk1IiwgDQogICAgICAgIHNpemUgPSAwLjYpLCBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJyb3N5YnJvd24zIiwgDQogICAgICAgIGNvbG91ciA9ICJncmF5MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpKSArbGFicyh0aXRsZSA9ICJSRU5UQSBNRURJQSBQT1IgUEVSU09OQSIsIA0KICAgIHggPSAiQcORT1MiLCB5ID0gIlJFTlRBIE1FRElBIFBPUiBQRVJTT05BIiwgDQogICAgc3VidGl0bGUgPSAiKERlc2RlIDIwMDggYSAyMDE5IGVuIEVzcGHDsWEpIiwgDQogICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpDQoNCmBgYA0KDQo8YnI+DQogPGZvbnQgc2l6ZT0iMyI+RW4gZXN0ZSBncsOhZmljbyBoZSBxdWVyaWRvIG1vc3RyYXIgbGEgcmVudGEgbmV0YSBhbnVhbCBtZWRpYSBwb3Igc2V4byBkaXN0aW5ndWllbmRvIGVudHJlIEhvbWJyZXMgeSBNdWplcmVzIHBhcmEgcG9kZXIgdmVyIG1lam9yIGxhcyBkaWZlcmVuY2lhcy4gQWRlbcOhcywgZW4gZWwgZ3LDoWZpY28gc2UgbXVlc3RyYSBlbCB0b3RhbCBxdWUgZXN0w6EgY2FsY3VsYWRvIGNvbW8gbGEgbWVkaWEgZGUgbG9zIHJlc3VsdGFkb3MgZGUgSG9tYnJlcyB5IE11amVyZXMuDQoNCkVuIGVsIGdyw6FmaWNvIHBvZGVtb3MgdmVyIGEgc2ltcGxlIHZpc3RhIGNvbW8gbG9zIGhvbWJyZXMgcmVwcmVzZW50YWRvcyBwb3IgbGEgbMOtbmVhIHJvamEgcHJlc2VudGEgdW5hIHJlbnRhIG1heW9yIHF1ZSBsYXMgbXVqZXJlcywgcmVwcmVzZW50YWRhcyBjb24gdW5hIGxpbmVhIHZlcmRlLCBxdWUgcHJlc2VudGFuIHVuYSByZW50YSBtZW5vci4gRXN0YSBkaWZlcmVuY2lhIGVudHJlIHJlbnRhcyBzZSBtYW50aWVuZSBkZXNkZSAyMDA4IGEgMjAxOSBhdW5xdWUgcG9kZW1vcyB2ZXIgcXVlIGVuIGFsZ3Vub3MgcGVyaW9kb3MgZXN0YSBkaWZlcmVuY2lhIGRpc21pbnV5ZSB5IGVuIGNhbWJpbyBlbiBvdHJvcyBzZSBoYWNlIG1heW9yLg0KDQpFbCBhw7FvIGRvbmRlIGVzdGEgZGlmZXJlbmNpYSBlcyBtZW5vciBlcyBlbiAyMDEzIGRvbmRlIGxvcyBIb21icmVzIHRpZW5lbiB1bmEgcmVudGEgbWVkaWEgYW51YWwgZGUgMTAuNTc2IHkgbGFzIE11amVyZXMgZGUgMTAuNDg4LiBZIGVsIGHDsW8gZG9uZGUgZXN0YSBkaWZlcmVuY2lhIGVzIG1heW9yIGVzIGVuIDIwMDkgY29uIHVuYSByZW50YSBkZSAxMS41NjEgZW4gZWwgY2FzbyBkZSBsb3MgaG9tYnJlcyB5IGRlIDExLjA4MCBlbiBlbCBjYXNvIGRlIGxhcyBtdWplcmVzLiA8L2ZvbnQ+DQoNCjxicj4NCg0KIyAqNS4gQ29lZmljaWVudGUgZGUgR2luaSoNCjxicj4NCg0KDQogPGZvbnQgc2l6ZT0iMyI+RWwgaW5kaWNlIGRlIEdpbmkgc2UgdXRpbGl6YSBwYXJhIGFuYWxpemFyIGVsIGdyYWRvIGRlIGluZXF1aWRhZCBlbiBsYSBkaXN0cmlidWNpw7NuIHJlc3BlY3RvIGEgbG9zIGluZ3Jlc29zLiBFc3RlIGluZGljYWRvciB0b21hIHZhbG9yZXMgZW50cmUgY2VybyB5IHVubyAobyBlbnRyZSAwIHkgMTAwIHNpIGVzdGEgZW4gcG9yY2VudGFqZSkuIFNpIGVsIGluZGljYWRvciB0b21hIGVsIDAgcmVwcmVzZW50YXLDrWEgbGEgcGVyZmVjdGEgaWd1YWxkYWQsIHRvZGFzIGxhcyBwZXJzb25hcyB0aWVuZW4gbG9zIG1pc21vcyBpbmdyZXNvcywgZW4gY2FtYmlvIHNpIGVsIGluZGljYWRvciB0b21hIGVsIHZhbG9yIGRlIDEgc2lnbmlmaWNhcsOtYSBxdWUgdG9kbyBlbCBpbmdyZXNvIG5hY2lvbmFsIGVzdGFyw61hIGVuIG1hbm9zIGRlIHVuYSDDum5pY2EgcGVyc29uYSwgcGVyZmVjdGEgZGVzaWd1YWxkYWQuPC9mb250Pg0KDQpTZSBjYWxjdWxhIGNvbiBsYSBzaWd1aWVudGUgZsOzcm11bGE6DQokJCAxLSBcc3VtX3trPTF9Xm4gKFhfayArIFhfe2stMX0pKFlfay0gWV97ay0xfSkgJCQNCjxicj4NCg0KIyMgKjUuMSBHcsOhZmljbyA2OiBDb2VmaWNpZW50ZSBkZSBHaW5pIGNvbiBhbHF1aWxlciBpbXB1dGFkbyoNCg0KYGBge3IsZWNobyA9IEZBTFNFLCBldmFsID0gRkFMU0V9DQpzaG93Q29scyA8LSBmdW5jdGlvbihjbD1jb2xvcnMoKSwgYmcgPSAiZ3JleSIsDQogICAgICAgICAgICAgICAgICAgICBjZXggPSAwLjc1LCByb3QgPSAzMCkgew0KICAgIG0gPC0gY2VpbGluZyhzcXJ0KG4gPC1sZW5ndGgoY2wpKSkNCiAgICBsZW5ndGgoY2wpIDwtIG0qbTsgY20gPC0gbWF0cml4KGNsLCBtKQ0KICAgIHJlcXVpcmUoImdyaWQiKQ0KICAgIGdyaWQubmV3cGFnZSgpOyB2cCA8LSB2aWV3cG9ydCh3ID0gLjkyLCBoID0gLjkyKQ0KICAgIGdyaWQucmVjdChncD1ncGFyKGZpbGw9YmcpKQ0KICAgIGdyaWQudGV4dChjbSwgeCA9IGNvbChjbSkvbSwgeSA9IHJldihyb3coY20pKS9tLCByb3QgPSByb3QsDQogICAgICAgICAgICAgIHZwPXZwLCBncD1ncGFyKGNleCA9IGNleCwgY29sID0gY20pKQ0KICB9DQpzaG93Q29scyhjbD0gY29sb3JzKCksIGJnPSJncmF5MzMiLCByb3Q9MzAsIGNleD0wLjc1KSAjSGUgdXRpbGl6YWRvIGVzdGUgY29kaWdvIHBhcmEgdmVyIGxvcyBkaWZlcmVudGVzIGNvZGlnb3MgZGUgbG9zIGNvbG9yZXMNCg0KYGBgDQo8YnI+DQoNCmBgYHtyLCBlY2hvPSBGQUxTRSwgZXZhbD0gVFJVRX0NCg0KDQpkIDwtIGdncGxvdChkZl9jb2VmaWNpZW50ZV9kZV9naW5pMSwgYWVzKEHDsW9zLCBgQ29lZmljaWVudGVzIGRlIEdpbmlgLCBmaWxsPSBUaXBvKSkgKyBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKyAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNreWJsdWUxIiwgImxpZ2h0cGluazEiKSkNCg0KZCArIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIA0KICAgIGZhY2UgPSAiYm9sZC5pdGFsaWMiLCBjb2xvdXIgPSAiZ3JheTI0IiksIA0KICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNyksIA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNyksIA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCANCiAgICAgICAgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSAxLjc1KSwgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgDQogICAgICAgIGNvbG91ciA9ICJncmF5MTYiKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCANCiAgICAgICAgc2l6ZSA9IDE1LCBmYWNlID0gImJvbGQuaXRhbGljIiwgDQogICAgICAgIGhqdXN0ID0gMC41LCB2anVzdCA9IDEuNSksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5OTQiKSwgDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYWxpY2VibHVlIiwgDQogICAgICAgIGNvbG91ciA9ICJibGFjayIsIGxpbmV0eXBlID0gImRhc2hlZCIpKSArbGFicyh0aXRsZSA9ICJDT0VGSUNJRU5URVMgREUgR0lOSSIsIHggPSAiQcORT1MiLCANCiAgICB5ID0gIkNPRUZJQ0lFTlRFUyBERSBHSU5JIiwgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORSIpDQoNCg0KYGBgDQogPGJyPg0KIA0KIDxmb250IHNpemU9IjMiPkVuIGVsIGdyw6FmaWNvIHBvZGVtb3Mgb2JzZXJ2YXIgY8OzbW8gZW4gZ2VuZXJhbCBhdW1lbnRhIGRlIDIwMDggYSAyMDE0IGxvIHF1ZSBzdXBvbmRyw61hIHVuIGF1bWVudG8gZGUgbGEgZGVzaWd1YWxkYWQsIHBlcm8gYSBwYXJ0aXIgZGUgMjAxNSB2YSBkaXNtaW51eWVuZG8gaGFzdGEgMjAxOSBxdWUgYWxjYW56YSB1biBwb3JjZW50YWplIGRlIDMzLiBBdW5xdWUgbG9zIGRhdG9zIHNvbiBtZW5vcmVzIHJlc3BlY3RvIGEgYcOxb3MgYW50ZXJpb3JlcyB0b2RhdsOtYSBxdWVkYSBtdWNobyBwb3IgaGFjZXIgeWEgcXVlIGEgZMOtYSBkZSBob3kgbm8gaGVtb3MgcmVjdXBlcmFkbyBsb3MgZGF0b3MgZGUgMjAwOC48L2ZvbnQ+DQoNCjxicj4NCg0KIyAqNi4gQ29uY2x1c2nDs24qDQo8YnI+DQo8Zm9udCBzaXplPSIzIj5FbiBlc3RlIHRyYWJham8gaGUgYW5hbGl6YWRvIGRpc3RpbnRhcyB2YXJpYWJsZXMgcGFyYSBwb2RlciBvYnNlcnZhciBsYSBzaXR1YWNpw7NuIGRlIGVzcGHDsWEgcmVzcGVjdG8gYSBsYSBkZXNpZ3VhbGRhZC4gTGEgZGVzaWd1YWxkYWQgc2lndWUgc2llbmRvIHVuIHByb2JsZW1hLCBjZW50cmFuZG9ub3MgZW4gbGEgdGFzYSBkZSBwb2JyZXphIHRvZGF2w61hIG5vIGhlbW9zIHJlY3VwZXJhZG8gbG9zIG5pdmVsZXMgcXVlIHRlbsOtYW1vcyBlbiAyMDA4LiBBZGVtw6FzIGNvbW8geWEgaGUgbWVuY2lvbmFkbyBsYSBzaXR1YWNpw7NuIGFjdHVhbCBkZSBsYSBwYW5kZW1pYSB2YSBhIGNvbnRyaWJ1aXIgYSBlbXBlb3JhciBsb3Mgbml2ZWxlcyBkZSBkZXNpZ3VhbGRhZCBpbmNyZW1lbnRhbmRvIGxhIHBvYnJlemEgeWEgcXVlIHPDs24gbXVjaGFzIGxhcyBwZXJzb25hcyBxdWUgc2UgaGFuIHF1ZWRhZG8gc2luIGVtcGxlbyB5IGhhbiB2aXN0byBkaXNtaW51aWRvcyBzdXMgaW5ncmVzb3MuDQoNClBvciBvdHJhIHBhcnRlLCBsYSByZW50YSBuZXRhIGFudWFsIHBvciBob2dhciBzZWfDum4gbG9zIGRhdG9zIGVzIG1heW9yIHF1ZSBlbiAyMDA4IHBlcm8gdG9kYXbDrWEgcXVlZGEgZGlzbWludWlyIGxvcyBlZmVjdG9zIGRlIGxhIGJyZWNoYSBzYWxhcmlhbCBzb2JyZSBsYSBkaWZlcmVuY2lhIGRlIGluZ3Jlc29zIGVudHJlIGhvbWJyZXMgeSBtdWplcmVzLiBBbGd1bmFzIGRlIGxhcyBtZWRpZGFzIHF1ZSBwdWVkZW4gY29udHJpYnVpciBhIGRpc21pbnVpcmxhcyBzw7NuOiBlbCBpbXB1bHNvIGRlIHBvbMOtdGljYXMgcMO6YmxpY2FzIHF1ZSBzZSBjZW50cmVuIGVuIGVsIGFjY2VzbyBhIGxhIGVkdWNhY2nDs24geSBjYXBhY2l0YWNpw7NuIHByb2Zlc2lvbmFsLCBpbmNvcnBvcmFjacOzbiBkZSBlc3TDrW11bG9zIGRlcml2YWRvcyBkZSBtZWRpZGFzIGxhIGFkb3BjacOzbiBkZSBzZWxsb3MgZGUgY2FsaWRhZCB5IGRlIGlndWFsZGFkIGRlIGfDqW5lcm8gZW1wcmVzYXJpYWwgbyBtZWRpZGFzIGRlIGFwb3lvIGEgbGEgY29uY2lsaWFjacOzbiBwYXJhIHByb3RlZ2VyIGxhIG1hdGVybmlkYWQsIGVudHJlIG90cmFzLg0KDQpQb3Igw7psdGltbywgZWwgY29lZmljaWVudGUgZGUgR2luaSBhdW5xdWUgZXMgbWVub3IgcXVlIGVuIGHDsW9zIGFudGVyaW9yZXMgdGFtcG9jbyBoZW1vcyBhbGFjYW56YWRvIGxvcyBkYXRvcyBkZSAyMDA4LiBIYWNlbiBmYWx0YW4gcG9sw610aWNhcyBxdWUgYXl1ZGVuIGEgZGlzbWludWlyIGxhIGRlc2lndWFsZGFkIGV4aXN0ZW50ZS4gUG9sw610aWNhcyBxdWUgYXl1ZGFuIGEgZGlzbWludWlybGEgc8OzbjogYWNjZXNvIHVuaXZlcnNhbCBhIGVkdWNhY2nDs24gZGUgY2FsaWRhZCwgdHJpYnV0YWNpw7NuIHByb2dyZXNpdmEsIGRlc2Fycm9sbG8geSBudXRyaWNpw7NuIGVuIGxhIHByaW1lcmEgaW5mYW5jaWEsIGVudHJlIG90cmFzLjwvZm9udD4NCjxicj4NCg0KIyAqNy4gVHJhYmFqb3MgZW4gbG9zIHF1ZSB0ZSBoYXMgYmFzYWRvKg0KDQo8YnI+DQogPGZvbnQgc2l6ZT0iMyI+RW4gZXN0ZSB0cmFiYWpvIGhlIGNvZ2lkbyBpZGVhcyBmdW5kYW1lbnRhbG1lbnRlIGRlIHVuYSBww6FnaW5hIGxsYW1hZGEgKmVwZGF0YSogZG9uZGUgZW5jb250csOpIHVuYSBzZXJpZSBkZSBncsOhZmljb3MgYmFzYWRvcyBlbiBsYSB0YXNhIGRlIHBvYnJlemEsIGVuIGxhIHJlbnRhIG5ldGEgYW51YWwgbWVkaWEgeSBlbCBjb2VmaWNpZW50ZSBkZSBHaW5pLiBFbiBlc3RhIHDDoWdpbmEgc2UgcHVlZGUgdmVyIHZhcmlvcyBlamVtcGxvcyBkZSBncsOhZmljb3MgeSB0b23DqSBlbCBlamVtcGxvIGRlIGxvcyBncsOhZmljb3MgcXVlIHBvZMOtYSBoYWNlciBwYXJhIG1pIHRyYWJham8uDQogDQpUYW1iacOpbiBoZSBidXNjYWRvIGluZm9ybWFjacOzbiBlbiBkaXN0aW50YXMgcMOhZ2luYXMgcGFyYSBvYnRlbmVyIG3DoXMgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsYSBkZXNpZ3VhbGRhZCB5IGFkZW3DoXMgaGUgYnVzY2FkbyB0dXRvcmlhbGVzIGRlIHIgcGFyYSBwb2RlciBoYWNlciBlbCB0cmFiYWpvLiBFbiBsYSBiaWJsaW9ncmFmaWEgc2UgcHVlZGUgZW5jb250cmFyIGxhcyBkaXN0aW50YXMgcMOhZ2luYXMgcXVlIGhlIHV0aWxpemFkbyBwYXJhIGVsYWJvcmFybG8uPC9mb250Pg0KDQo8YnI+DQoNCiMgKjguIEJpYmxpb2dyYWbDrWEqDQoNCiA8Zm9udCBzaXplPSIzIj5QYXJhIGxhIHJlYWxpemFjacOzbiBkZSBlc3RlIHRyYWJham8gaGUgdXRpbGl6YWRvOjwvZm9udD4NCg0KLSBbRGF0b3MgSU5FXShodHRwczovL3d3dy5pbmUuZXMvZHluZ3MvSU5FYmFzZS9lcy9vcGVyYWNpb24uaHRtP2M9RXN0YWRpc3RpY2FfQyZjaWQ9MTI1NDczNjE3NjgwNyZtZW51PXVsdGlEYXRvcyZpZHA9MTI1NDczNTk3NjYwOCkNCg0KLSBbSW5mb3JtYWNpw7NuIHNvYnJlIGRlc2lndWFsZGFkXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9EZXNpZ3VhbGRhZF9zb2NpYWwpDQoNCi0gW0dyw6FmaWNvcyBFcGRhdGFdKGh0dHBzOi8vd3d3LmVwZGF0YS5lcy9kYXRvcy9wb2JyZXphLWVuY3Vlc3RhLWNvbmRpY2lvbmVzLXZpZGEtaW5lLWVzdGFkaXN0aWNhcy1ncmFmaWNvcy1kYXRvcy85NS9lc3BhbmEvMTA2KQ0KDQotIFtJbmZvcm1hY2nDs24gc29icmUgZGVzaWd1YWxkYWQgZWNvbsOzbWljYV0oaHR0cHM6Ly9lYWNudXIub3JnL2Jsb2cvZGVzaWd1YWxkYWQtZWNvbm9taWNhLXF1ZS1lcy10Y19hbHQ0NTY2NG5fb19wc3RuX29fcHN0Lz90Y19hbHQ9NDczNDImbl9vX3BzdD1uX29fcHN0Jm5fb2t3PV9iX19jXzUyNjkzOTM4MTYwJmdjbGlkPUNqMEtDUWlBb2FiX0JSQ3hBUklzQU5NeDRTNmR4eTN3Z2E5OTByYXRPQUdrcW83Z1oxZ2E2dkFBOEpPMjFxWVJoNU9nQ29GM3VCWHFrRXdhQW1vdEVBTHdfd2NCKQ0KDQotIFtQb2JyZXphIGVuIGxhIHBhbmRlbWlhXShodHRwczovL2VscGFpcy5jb20vc29jaWVkYWQvMjAyMC0xMC0xNC9sYS1wYW5kZW1pYS1hZ3JhdmFyYS11bmEtcG9icmV6YS15YS1lbnF1aXN0YWRhLWVuLWVzcGFuYS5odG1sIzp+OnRleHQ9TGElMjBvcmdhbml6YWNpJUMzJUIzbiUyME94ZmFtJTIwSW50ZXJtJUMzJUIzbiUyMGhhLCUyQzA3JTI1JTIwZGUlMjBsYSUyMHBvYmxhY2klQzMlQjNuLikNCg0KLSBbRGF0b3MgSU5FXShodHRwczovL3d3dy5pbmUuZXMvc3MvU2F0ZWxsaXRlP0w9ZXNfRVMmYz1JTkVTZWNjaW9uX0MmY2lkPTEyNTk5MjU5NDk0NjcmcD0xMjU0NzM1MTEwNjcyJnBhZ2VuYW1lPVByb2R1Y3Rvc1lTZXJ2aWNpb3MlMkZQWVNMYXlvdXQmcGFyYW0xPVBZU0RldGFsbGUmcGFyYW0zPTEyNTk5MjQ4MjI4ODgpDQoNCi0gW0JyZWNoYSBzYWxhcmlhbF0oaHR0cHM6Ly9mYWN0b3JpYWxoci5lcy9ibG9nL2JyZWNoYS1zYWxhcmlhbC1nZW5lcm8vKQ0KDQotIFtEZXNpZ3VhbGRhZCBkYXRvc10oaHR0cHM6Ly9uZXdzLnVuLm9yZy9lcy9zdG9yeS8yMDE5LzA3LzE0NTkzNDEpDQoNCi0gW1R1dG9yaWFsIFIgcGVyc29uYWxpemFyIGdyw6FmaWNvc10oaHR0cHM6Ly9ycHVicy5jb20vUm9ydGl6ZHUvMTQwMTkwKQ0KDQotIFtSaWVzZ28gZGUgUG9icmV6YV0oaHR0cHM6Ly9kYXRvc21hY3JvLmV4cGFuc2lvbi5jb20vZGVtb2dyYWZpYS9yaWVzZ28tcG9icmV6YS9lc3BhbmEpDQoNCi0gW1BlcnNvbmFsaXphciBNYXBhc10oaHR0cHM6Ly9tYXBwaW5nZ2lzLmNvbS8yMDE5LzA3L2NyZWFjaW9uLWRlLW1hcGFzLWNvbi1yLXktZ2dwbG90Mi8pDQoNCg0KDQo=