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í.
1. Introducción
En el presente trabajo se lleva a cabo un análisis de Austria, se lleva a cabo tanto un análisis económico para determinar como funciona el país economicamente y un analisis de la calidad de vida en Austria así como también un poco más a nivel turístico que es lo que se podría visitar tanto si decides ir de viaje como si decides irte a vivir.
1.1 Breve historia
Austria es uno de los 10 países más ricos del mundo en términos de PIB per cápita y ocupa el décimo primer puesto de los países con mayor PIB de la Unión Europea. Tiene una economía social de mercado bien desarrollada y un nivel de vida muy elevado. El sistema educativo austriaco presenta un nivel muy alto. Hasta hace pocos años, el acceso a la universidad era prácticamente gratuito (refiriéndose al estado económico). Hoy se debe pagar una cuota, que es baja si se compara con otros países. La calidad de vida en Austria es excepcional y cuenta con servicios sociales de primera calidad, tanto en previsión sanitaria como en compatibilidad entre el trabajo y la familia.
El sistema de seguridad social en Austria es amplio, obligatorio y financiado a través de impuestos. La seguridad social incluye prestaciones para todos los empleados y sus parientes en caso de asistencia médica, desempleo, baja por maternidad y jubilación, así como asistencia social pública para ciudadanos necesitados.
3.Análisis económico
3.1 TIPOS DE INTERÉS
austriatipo <- datos %>%
select(año,tipointeres)
graficoaus <- ggplot(austriatipo,aes(año,tipointeres)) +
geom_line(color= "navyblue", size = 2) +
theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
labs(title = "Evolución de los tipos de interés",
subtitle = "Austria 2000-2021",
caption = "Datos extraídos de Eurostat",
y = "mil. mill. $",
x = "Año")
graficoaus
eeuutipo <- datos %>%
select(año,tipointeresee)
graficoeeuu <- ggplot(eeuutipo,aes(año,tipointeresee)) +
geom_line(color= "navyblue", size = 2) +
theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
labs(title = "Evolución de los tipos de interés",
subtitle = "EEUU 2011-2021",
caption = "Datos extraídos de Eurostat",
y = "mil. mill. $",
x = "Año")
graficoeeuu
Se puede observar como la trayectoria de ambos países es paulatinamente opuesta. A partir del año 2011 ambos países experimentaron un descenso del tipo de interés pero dicho descenso es más significativo en la zona euro. Esto se debió a que en esa situación la crisis de 2008 afectó tanto a EEUU como a Europa, se buscaba estimular el crecimiento a través de la demanda y la inversión y a su vez llevar a la inflación a su objetivo, cercano al 2% anual. Sin embargo a partir del año 2015 la trayectoria de EEUU fue empezar a subir los tipos de interés mientras que Europa siguió en una situación bajista de tipos. Europa se divide entre quienes ruegan por la prolongación de los tipos bajos de interés y quienes ponen velas al BCE para que deje respirar a los bancos y a los ahorradores. BCE está atrapado en su política de tipos, pero posiblemente buscando opciones para hacer una transición ordenada de tipos negativos a tipos cero, lo que puede ser parecido si, efectivamente, se consiguiera hacer de forma ordenada y sin generar expectativas de inflación, pero no se trata de una tarea fácil. Mientras que buscan esa transición se prevé que la pandemia va a prolongar el periodo de bajos tipos de interés.
La Reserva Federal de Estados Unidos (Fed) aprobó en diciembre de 2015 , siete años después de la caída de Lehman Brothers, una subida de tipos de interés leve pero cargada de simbolismo. Fue la primera desde junio de 2006 y significa el punto final a una era de estímulos monetarios sin precedente.
3.2 TIPOS DE CAMBIO
austriacambio <- datos %>%
select(año,tipocambio)
ggplot(austriacambio) +
geom_line(aes(año, tipocambio),color= "blue") +
geom_smooth(aes(año, tipocambio),color= "blue")+
theme(axis.text.x = element_text(angle = 60, hjust = 1)) +
labs(title = "Tipo de cambio",
subtitle = "Alemania 2000-2019",
y = "",
x = "Año")+
theme(
panel.background = element_rect(fill ='#272635' ,
colour = '#272635',
size = 0.5, linetype = "solid"),
plot.background = element_rect(fill ='#272635' ,
colour = '#272635',
size = 0.5, linetype = "solid"),
panel.grid.major = element_line(size = 0.5, linetype = 'solid',
colour = '#CECECE'),
panel.grid.minor = element_line(size = 0.25, linetype = 'solid',
colour = '#CECECE'),
axis.text.x =element_text(colour='#CECECE'),
axis.text.y =element_text(colour='#CECECE'),
plot.title = element_text(colour = '#CECECE'),
axis.title.x = element_text(colour = "#CECECE"),
axis.title.y = element_text(colour = "#CECECE")
)
Se puede observar la evolución del tipo de cambio euro/dólar, durante todo ese periodo la bajada más drástica que tuvo fue en el periodo 2014-2015, 2014 fue el año de la moneda estadounidense; su acelerón habla de la robustez de la recuperación económica estadounidense frente a una Europa y un Japón renqueantes y en general, de un clima de incertidumbre que anima a los inversores a resguardarse en la moneda de referencia. El arranque de 2015 en los mercados viene determinado por un dólar caro. Teniendo esto en cuenta podemos observar como 2014 fue el año del cambio y se puede relacionar con la tabla de los tipos de interés ya que mientras el ritmo de expansión se aceleró con fuerza en el 2T’14 en EE.UU y la economía continuó creciendo con fuerza en el tramo final de 2014 y en 2015, la recuperación de la Eurozona se frenó de forma significativa. El BCE empezó a aplicar una serie de medidas de política monetaria sin precedentes en la UEM. Además de haber situado los tipos de interés en mínimos históricos, el BCE está proporcionando financiación muy barata a las entidades que ofrezcan crédito a través de los TLTROs mientras que la FED por el contrario,diseñó la estrategia de normalización de su política monetaria.
3.3 PIB
pibaus <- datos %>%
select(año,pib,pibee)
grafpib <- ggplot( data= pibaus, aes(x=año, y=pib))
grafpib + geom_line() +
geom_point() +
ggtitle("Evolución del PIB 2000-2020") +
theme_solarized() +
ylab("Pib") +
transition_reveal(año)+
labs(subtitle = "En millones")
Como refleja el gráfico, Austria ha experimentado un aumento sostenido del PIB a lo largo de los años, en cambio, a partir de finales de 2019 se puede apreciar una bajada ocasionada por el COVID19 . Cuando el PIB de un país aumenta es una buena señal para la economía y afecta a todas las personas del territorio. Dicho aumento significa que están aumentando de forma general el consumo, el gasto y la inversión en Austria. Esto suele desencadenar un efecto positivo en la economía, ya que estos aumentos hacen crecer los ingresos de las empresas, las familias y las administraciones, las cuales tendrán más capital para invertir y crear empleo. Lo que de nuevo hace crecer el consumo y el gasto (al haber más personas con capacidad de consumir). Es por ello que cuando sube el PIB suelen crecer el empleo y aumentar los salarios de los trabajadores.
3.4 BALANZA DE PAGOS
balanzapagos <- balanzacompleta %>%
select(GEO,TIME,Value)%>%
filter(TIME %in% c(2019,2020))
DT::datatable(balanzapagos)
3.5 INFLACIÓN
inflacion <- datos %>%
select(año,inflacion)
graficoin <- inflacion %>%
ggplot( aes(año, inflacion, size = 0.75, color= "orange")) +
geom_point() +
theme_bw()+
theme(legend.position = "none") +
labs(x = NULL) + labs(title= "Austria") +
theme(panel.background = element_rect(fill = 'wheat1', colour = 'red')) + theme(panel.background = element_rect(fill = "#C9DAF1"),
plot.background = element_rect(fill = "#C9DAF1",
colour = "#C9DAF1"))
ggplotly(graficoin)
inflacioneeuu <- datos %>%
select(año,inflacionee)
graficoinee <- inflacioneeuu %>%
ggplot( aes(año, inflacionee, size = 0.75, color= "orange")) +
geom_point() +
theme_bw()+
theme(legend.position = "none") +
labs(x = NULL) + labs(title= "EEUU") +
theme(panel.background = element_rect(fill = 'wheat1', colour = 'red')) + theme(panel.background = element_rect(fill = "#C9DAF1"),
plot.background = element_rect(fill = "#C9DAF1",
colour = "#C9DAF1"))
ggplotly(graficoinee)
Como podemos observar la inflación de 2009 a 2011 tanto en Austria como en EEUU han ido en aumento, esto quiere decir que los bienes y servicios en el país se han vuelto cada vez más caros a lo largo de los años. A partir de 2011 la evolución de la inflación en Austria ha sido más paulatina que en EEUU, cuya evolución tiene más picos. Austria a partir de 2011 ha conseguido mantener la inflación (más o menos) alrededor del objetivo del BCE (2%).
4. ¿Se vive bien en Austria?
4.1 EMPLEO TEMPORAL
empleopaises <- empleotemporal %>% filter(GEO %in% c("Austria","Spain", "Italy", "Germany", "United Kingdom", "Grecee","France","Estonia", "Malta")) %>%
select(TIME,GEO,Value)
ggplot(subset(empleopaises), aes(reorder(GEO,Value),Value,fill=Value)) + geom_bar(stat = "identity") + theme(legend.position = "none")+ggtitle("Empleo temporal") + xlab("Paises") + ylab("Porcentaje de empleo temporal") + coord_flip() + theme(panel.background = element_rect(fill = "#D9E0EB"),
plot.background = element_rect(fill = ("#D9E0EB")) + theme(axis.title.x=element_blank()),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
Como se puede observar Austria es el país con mayor empleo temporal lo cual puede tener dos interpretaciones, por una parte que es un país bastante generador de empleo lo cual sería un indicador relativamente bueno, o por el contrario puede suponer que Austria tiene mas empleo temporal que fijo lo cual pone bastante en riesgo a los trabajadores y genera empleos precarios. Ante esta disyuntiva he decidido sacar otra gráfica que hace referencia a la exclusión social.
4.2 RIESGO DE EXCLUSIÓN SOCIAL
rexclusion <- exclusion %>%
select(GEO,Value,TIME)%>% filter(GEO %in% c("Austria","Spain", "Italy", "Germany", "United Kingdom", "Grecee","France","Estonia", "Malta"))
riesgo <- ggplot(rexclusion, aes(x=TIME, y=Value, group=GEO, color=GEO)) +
geom_point(alpha=0.6) +
geom_abline(intercept=0, slope=1, linetype="dashed") +
geom_smooth(method="lm", se=FALSE) +
labs(title = "Riesgo exclusión social", subtitle = "Europa") +
theme(plot.title = element_text(hjust = 0.5)) +
guides(color=guide_legend(reverse=TRUE)) + theme(axis.title.y=element_blank(),
axis.text.y=element_blank(),
axis.ticks.y=element_blank())
ggplotly(riesgo)
En este gráfico Austria es el país con menor riesgo de exclusión social, lo que implica que tiene los suficientes recursos para ofrecer a sus ciudadanos sin que estos padezcan necesidades, lo cual implica que además de generar empleo como hemos visto arriba, de este gráfico se extrae el hecho de que a pesar de que genera mucho empleo temporal el cual genera más riesgo de desempleo, las compensaciones y la calidad de vida que ofrece a sus ciudadanos es muy alta por lo que se podría considerar la cantidad de empleo temporal como algo positivo. ## 4.3 DESEMPLEO
desempleoeu <- desempleoo %>%
select(TIME,GEO,Value)%>%
slice_max(Value, n = 9)
desempleoeu
2021Q3 |
Spain |
14.6 |
2021Q3 |
Italy |
8.9 |
2021Q3 |
France |
7.9 |
2021Q3 |
Finland |
6.9 |
2021Q3 |
Belgium |
6.5 |
2021Q3 |
Estonia |
5.7 |
2021Q3 |
Ireland |
5.7 |
2021Q3 |
Austria |
5.3 |
2021Q3 |
Denmark |
4.8 |
dfgrafico1 <- ggplot(desempleoeu, aes(GEO, color=Value)) +
geom_bar(fill=NA) +
coord_flip() +
theme(panel.background = element_rect(fill = 'lightblue1')) + theme(panel.background = element_rect(fill = "#7FFFD4"),
plot.background = element_rect(fill = "#7FFFD4"),
legend.background = element_rect(fill = "#7FFFD4"))
ggplotly(dfgrafico1)
Austria junto con Alemania es el país con menos desempleo, se trata de un país pequeño el cual ha sabido aprovechar sus ventajas y a ha sabido destacar en aspectos muy importantes como lo es la educación. Partiendo de la premisa de que los jovenes que terminan sus estudios salen muy preparados para introducirse en el mercado laboral, tal y como lo demuestran los informes PISA, en el cual suelen destacar bastante.
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBlY29uw7NtaWNvIGF1c3Ryw61hY28iDQpzdWJ0aXRsZTogIm1pcmVpYShtaXlhbm9ALnV2LmVzKSIgDQphdXRob3I6ICJVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiDQpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjEgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCiAgICB0aGVtZTogcGFwZXINCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMyANCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OmZsZXg7fQ0KaDEudGl0bGUge2ZvbnQtc2l6ZTogNDAgcHg7Y29sb3I6ICMxRTFFMUV9DQpoMSB7Y29sb3I6IyMxRTFFMUU7IGZvbnQtc2l6ZTogMzBweCA7Zm9udC1mYW1pbHk6IEFyaWFsIEJsYWNrfQ0KaDJ7Y29sb3I6ICMxRTFFMUU7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjogI0E5RDJEQ30NCmEge2NvbG9yOiAjMDEwMTAxO30NCi5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlLCAubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpmb2N1cywgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIgew0KICAgIHotaW5kZXg6IDI7DQogICAgY29sb3I6IDsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjOUFEMUQwOw0KICAgIGJvcmRlci1jb2xvcjogcGFsZXJlZDsNCn0NCi5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYTpob3ZlciwgLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IA0KDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MjgsIG91dC53aWR0aCA9ICI3NSUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPjxkaXYvPg0KPGhyIGNsYXNzPSJsaW5lYS1ibGFjayI+DQoNCjwhLS0gRWwgcMOhcnJhZm8gZGUgYWJham8gaGFzIGRlIGRlamFybG8gY2FzaSBpZ3VhbCwgc29sbyBIQVMgZGUgU1VTVElUVUlSICJwZXJlenA0NCIgcG9yIHR1IHVzdWFyaW8gZGUgR2l0aHViLS0+DQpUcmFiYWpvIGVsYWJvcmFkbyBwYXJhIGxhIGFzaWduYXR1cmEgIlByb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSIgZGUgbGEgVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIGR1cmFudGUgZWwgY3Vyc28gMjAyMS0yMDIyLiBFbCByZXBvIGRlbCB0cmFiYWpvIGVzdMOhIFthcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL21pcmVpYXlhbmd1ZXovdHJhYmFqb19CaWdEYXRhKXt0YXJnZXQ9Il9ibGFuayJ9LiANCg0KPCEtLSBFbCBww6FycmFmbyBkZSBhYmFqbyBoYXMgZGUgZGVqYXJsbyBleGFjdGFtZW50ZSBpZ3VhbCwgTk8gSEFTIERFIENBTUJJQVIgTkFEQS0tPg0KDQpMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHkgbG9zIHRyYWJham9zIGRlIG1pcyBjb21wYcOxZXJvcyBwdWVkZW4gdmVyc2UgW2FxdcOtXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvMDctdHJhYmFqb3MuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4NCg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCiMgWzEuIEludHJvZHVjY2nDs25dey52ZXJkZWNpdG99DQpFbiBlbCBwcmVzZW50ZSB0cmFiYWpvIHNlIGxsZXZhIGEgY2FibyB1biBhbsOhbGlzaXMgZGUgQXVzdHJpYSwgc2UgbGxldmEgYSBjYWJvIHRhbnRvIHVuIGFuw6FsaXNpcyBlY29uw7NtaWNvIHBhcmEgZGV0ZXJtaW5hciBjb21vIGZ1bmNpb25hIGVsIHBhw61zIGVjb25vbWljYW1lbnRlIHkgdW4gYW5hbGlzaXMgZGUgbGEgY2FsaWRhZCBkZSB2aWRhIGVuIEF1c3RyaWEgYXPDrSBjb21vIHRhbWJpw6luIHVuIHBvY28gbcOhcyBhIG5pdmVsIHR1csOtc3RpY28gcXVlIGVzIGxvIHF1ZSBzZSBwb2Ryw61hIHZpc2l0YXIgdGFudG8gc2kgZGVjaWRlcyBpciBkZSB2aWFqZSBjb21vIHNpIGRlY2lkZXMgaXJ0ZSBhIHZpdmlyLiANCg0KDQojIyAxLjEgQnJldmUgaGlzdG9yaWEgDQpBdXN0cmlhIGVzIHVubyBkZSBsb3MgMTAgcGHDrXNlcyBtw6FzIHJpY29zIGRlbCBtdW5kbyBlbiB0w6lybWlub3MgZGUgUElCIHBlciBjw6FwaXRhIHkgb2N1cGEgZWwgZMOpY2ltbyBwcmltZXIgcHVlc3RvIGRlIGxvcyBwYcOtc2VzIGNvbiBtYXlvciBQSUIgZGUgbGEgVW5pw7NuIEV1cm9wZWEuIFRpZW5lIHVuYSBlY29ub23DrWEgc29jaWFsIGRlIG1lcmNhZG8gYmllbiBkZXNhcnJvbGxhZGEgeSB1biBuaXZlbCBkZSB2aWRhIG11eSBlbGV2YWRvLiANCkVsIHNpc3RlbWEgZWR1Y2F0aXZvIGF1c3RyaWFjbyBwcmVzZW50YSB1biBuaXZlbCBtdXkgYWx0by4gSGFzdGEgaGFjZSBwb2NvcyBhw7FvcywgZWwgYWNjZXNvIGEgbGEgdW5pdmVyc2lkYWQgZXJhIHByw6FjdGljYW1lbnRlIGdyYXR1aXRvIChyZWZpcmnDqW5kb3NlIGFsIGVzdGFkbyBlY29uw7NtaWNvKS4gSG95IHNlIGRlYmUgcGFnYXIgdW5hIGN1b3RhLCBxdWUgZXMgYmFqYSBzaSBzZSBjb21wYXJhIGNvbiBvdHJvcyBwYcOtc2VzLg0KTGEgY2FsaWRhZCBkZSB2aWRhIGVuIEF1c3RyaWEgZXMgZXhjZXBjaW9uYWwgeSBjdWVudGEgY29uIHNlcnZpY2lvcyBzb2NpYWxlcyBkZSBwcmltZXJhIGNhbGlkYWQsIHRhbnRvIGVuIHByZXZpc2nDs24gc2FuaXRhcmlhIGNvbW8gZW4gY29tcGF0aWJpbGlkYWQgZW50cmUgZWwgdHJhYmFqbyB5IGxhIGZhbWlsaWEuDQoNCkVsIHNpc3RlbWEgZGUgc2VndXJpZGFkIHNvY2lhbCBlbiBBdXN0cmlhIGVzIGFtcGxpbywgb2JsaWdhdG9yaW8geSBmaW5hbmNpYWRvIGEgdHJhdsOpcyBkZSBpbXB1ZXN0b3MuIExhIHNlZ3VyaWRhZCBzb2NpYWwgaW5jbHV5ZSBwcmVzdGFjaW9uZXMgcGFyYSB0b2RvcyBsb3MgZW1wbGVhZG9zIHkgc3VzIHBhcmllbnRlcyBlbiBjYXNvIGRlIGFzaXN0ZW5jaWEgbcOpZGljYSwgZGVzZW1wbGVvLCBiYWphIHBvciBtYXRlcm5pZGFkIHkganViaWxhY2nDs24sIGFzw60gY29tbyBhc2lzdGVuY2lhIHNvY2lhbCBww7pibGljYSBwYXJhIGNpdWRhZGFub3MgbmVjZXNpdGFkb3MuDQoNCg0KIVtNYXJjYV0oLi9pbWFnZW5lcy9hdXN0cmlhLnBuZykNCg0KIyAyLkRhdG9zDQpMb3MgZGF0b3MgdXRpbGl6YWRvcyBlbiBlbCBwcmVzZW50ZSB0cmFiYWpvIGhhbiBzaWRvIGV4dHJhw61kb3MgZGUgdmFyaWFzIGZ1ZW50ZXMgb2ZpY2lhbGVzIGNvbW8gZWwgSU5FLCBlbCBFdXJvc3RhdCB5IGxhIHDDoWdpbmEgZGVsIEJhbmNvIE11bmRpYWwuIA0KVW5hIHZleiBleHRyYcOtZG8gbG9zIGRhdG9zIGhhIHNpZG8gbmVjZXNhcmlvIG1vZGlmaWNhcmxvcyB5IGFkYXB0YXJsb3MgYW50ZXMgZGUgcG9kZXIgaGFjZXIgdXNvIGRlIGVsbG9zLg0KDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikgDQpsaWJyYXJ5KHBsb3RseSkgDQpsaWJyYXJ5KGdyaWQpIA0KbGlicmFyeShSQ29sb3JCcmV3ZXIpIA0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZHBseXIpIA0KbGlicmFyeSh0aWR5cikgDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoaHJicnRoZW1lcykNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkodmlyaWRpc0xpdGUpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkobGVhZmxldCkNCg0KZGF0b3MgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvYXVzeWV1LmNzdiIpDQpjb25zdW1hdXMgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvY29uc3Vtby5jc3YiKQ0KZXhpbXAgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvZXhpbXAuY3N2IikNCmJhbGFuemEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvYmFsYW5wYWdhc3V0cmlhLmNzdiIpDQpiYWxhbnphY29tcGxldGEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvYmFsYW56YS5jc3YiKQ0KZW1wbGVvdGVtcG9yYWw8LSByaW86OmltcG9ydCgiLi9kYXRvcy9lbXBsZW90ZW1wb3JhbC5jc3YiKQ0KZXhjbHVzaW9uPC0gcmlvOjppbXBvcnQoIi4vZGF0b3Mvcmllc2dvZXhjbHVzaW9uLmNzdiIpDQpkZXNlbXBsZW9vIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2Rlc2VtcGxlby5jc3YiKQ0KDQpgYGANCg0KIyAzLkFuw6FsaXNpcyBlY29uw7NtaWNvDQojIyAzLjEgVElQT1MgREUgSU5URVLDiVMNCg0KYGBge3J9DQphdXN0cmlhdGlwbyA8LSBkYXRvcyAlPiUNCiAgc2VsZWN0KGHDsW8sdGlwb2ludGVyZXMpDQoNCmdyYWZpY29hdXMgPC0gZ2dwbG90KGF1c3RyaWF0aXBvLGFlcyhhw7FvLHRpcG9pbnRlcmVzKSkgKw0KICBnZW9tX2xpbmUoY29sb3I9ICJuYXZ5Ymx1ZSIsIHNpemUgPSAyKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkpICsNCiAgbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxvcyB0aXBvcyBkZSBpbnRlcsOpcyIsDQogICAgICAgc3VidGl0bGUgPSAiQXVzdHJpYSAyMDAwLTIwMjEiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0b3MgZXh0cmHDrWRvcyBkZSBFdXJvc3RhdCIsDQogICAgICAgeSA9ICJtaWwuIG1pbGwuICQiLA0KICAgICAgIHggPSAiQcOxbyIpDQpncmFmaWNvYXVzDQoNCmVldXV0aXBvIDwtIGRhdG9zICU+JQ0KICBzZWxlY3QoYcOxbyx0aXBvaW50ZXJlc2VlKQ0KDQpncmFmaWNvZWV1dSA8LSBnZ3Bsb3QoZWV1dXRpcG8sYWVzKGHDsW8sdGlwb2ludGVyZXNlZSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yPSAibmF2eWJsdWUiLCBzaXplID0gMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDYwLCBoanVzdCA9IDEpKSArDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsb3MgdGlwb3MgZGUgaW50ZXLDqXMiLA0KICAgICAgIHN1YnRpdGxlID0gIkVFVVUgMjAxMS0yMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdG9zIGV4dHJhw61kb3MgZGUgRXVyb3N0YXQiLA0KICAgICAgIHkgPSAibWlsLiBtaWxsLiAkIiwNCiAgICAgICB4ID0gIkHDsW8iKQ0KZ3JhZmljb2VldXUNCmBgYA0KU2UgcHVlZGUgb2JzZXJ2YXIgY29tbyBsYSB0cmF5ZWN0b3JpYSBkZSBhbWJvcyBwYcOtc2VzIGVzIHBhdWxhdGluYW1lbnRlIG9wdWVzdGEuIEEgcGFydGlyIGRlbCBhw7FvIDIwMTEgYW1ib3MgcGHDrXNlcyBleHBlcmltZW50YXJvbiB1biBkZXNjZW5zbyBkZWwgdGlwbyBkZSBpbnRlcsOpcyBwZXJvIGRpY2hvIGRlc2NlbnNvIGVzIG3DoXMgc2lnbmlmaWNhdGl2byBlbiBsYSB6b25hIGV1cm8uIEVzdG8gc2UgZGViacOzIGEgcXVlIGVuIGVzYSBzaXR1YWNpw7NuIGxhIGNyaXNpcyBkZSAyMDA4IGFmZWN0w7MgdGFudG8gYSBFRVVVIGNvbW8gYSBFdXJvcGEsICBzZSBidXNjYWJhIGVzdGltdWxhciBlbCBjcmVjaW1pZW50byBhIHRyYXbDqXMgZGUgbGEgZGVtYW5kYSB5IGxhIGludmVyc2nDs24gIHkgYSBzdSB2ZXogbGxldmFyIGEgbGEgaW5mbGFjacOzbiBhIHN1IG9iamV0aXZvLCBjZXJjYW5vIGFsIDIlIGFudWFsLg0KU2luIGVtYmFyZ28gYSBwYXJ0aXIgZGVsIGHDsW8gMjAxNSBsYSB0cmF5ZWN0b3JpYSBkZSBFRVVVIGZ1ZSBlbXBlemFyIGEgc3ViaXIgbG9zIHRpcG9zIGRlIGludGVyw6lzIG1pZW50cmFzIHF1ZSBFdXJvcGEgc2lndWnDsyBlbiB1bmEgc2l0dWFjacOzbiBiYWppc3RhIGRlIHRpcG9zLiANCkV1cm9wYSBzZSBkaXZpZGUgZW50cmUgcXVpZW5lcyBydWVnYW4gcG9yIGxhIHByb2xvbmdhY2nDs24gZGUgbG9zIHRpcG9zIGJham9zIGRlIGludGVyw6lzIHkgcXVpZW5lcyBwb25lbiB2ZWxhcyBhbCBCQ0UgcGFyYSBxdWUgZGVqZSByZXNwaXJhciBhIGxvcyBiYW5jb3MgeSBhIGxvcyBhaG9ycmFkb3Jlcy4gQkNFIGVzdMOhIGF0cmFwYWRvIGVuIHN1IHBvbMOtdGljYSBkZSB0aXBvcywgcGVybyBwb3NpYmxlbWVudGUgYnVzY2FuZG8gb3BjaW9uZXMgcGFyYSBoYWNlciB1bmEgdHJhbnNpY2nDs24gb3JkZW5hZGEgZGUgdGlwb3MgbmVnYXRpdm9zIGEgdGlwb3MgY2VybywgbG8gcXVlIHB1ZWRlIHNlciBwYXJlY2lkbyBzaSwgZWZlY3RpdmFtZW50ZSwgc2UgY29uc2lndWllcmEgaGFjZXIgZGUgZm9ybWEgb3JkZW5hZGEgeSBzaW4gZ2VuZXJhciBleHBlY3RhdGl2YXMgZGUgaW5mbGFjacOzbiwgcGVybyBubyBzZSB0cmF0YSBkZSB1bmEgdGFyZWEgZsOhY2lsLiBNaWVudHJhcyBxdWUgYnVzY2FuIGVzYSB0cmFuc2ljacOzbiBzZSBwcmV2w6kgcXVlIGxhIHBhbmRlbWlhIHZhIGEgcHJvbG9uZ2FyIGVsIHBlcmlvZG8gZGUgYmFqb3MgdGlwb3MgZGUgaW50ZXLDqXMuICANCg0KTGEgUmVzZXJ2YSBGZWRlcmFsIGRlIEVzdGFkb3MgVW5pZG9zIChGZWQpIGFwcm9iw7MgZW4gZGljaWVtYnJlIGRlIDIwMTUgLCBzaWV0ZSBhw7FvcyBkZXNwdcOpcyBkZSBsYSBjYcOtZGEgZGUgTGVobWFuIEJyb3RoZXJzLCB1bmEgc3ViaWRhIGRlIHRpcG9zIGRlIGludGVyw6lzIGxldmUgcGVybyBjYXJnYWRhIGRlIHNpbWJvbGlzbW8uIEZ1ZSAgbGEgcHJpbWVyYSBkZXNkZSBqdW5pbyBkZSAyMDA2IHkgc2lnbmlmaWNhIGVsIHB1bnRvIGZpbmFsIGEgdW5hIGVyYSBkZSBlc3TDrW11bG9zIG1vbmV0YXJpb3Mgc2luIHByZWNlZGVudGUuDQoNCg0KDQojIyAzLjIgVElQT1MgREUgQ0FNQklPDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KYXVzdHJpYWNhbWJpbyA8LSBkYXRvcyAlPiUNCiAgc2VsZWN0KGHDsW8sdGlwb2NhbWJpbykNCg0KZ2dwbG90KGF1c3RyaWFjYW1iaW8pICsNCiAgZ2VvbV9saW5lKGFlcyhhw7FvLCB0aXBvY2FtYmlvKSxjb2xvcj0gImJsdWUiKSArDQogIGdlb21fc21vb3RoKGFlcyhhw7FvLCB0aXBvY2FtYmlvKSxjb2xvcj0gImJsdWUiKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSkgKw0KICBsYWJzKHRpdGxlID0gIlRpcG8gZGUgY2FtYmlvIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJBbGVtYW5pYSAyMDAwLTIwMTkiLA0KICAgICAgIHkgPSAiIiwNCiAgICAgICB4ID0gIkHDsW8iKSsNCiAgdGhlbWUoDQogICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9JyMyNzI2MzUnICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJyMyNzI2MzUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9JyMyNzI2MzUnICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJyMyNzI2MzUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLA0KICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gJ3NvbGlkJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJyNDRUNFQ0UnKSwgDQogIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuMjUsIGxpbmV0eXBlID0gJ3NvbGlkJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gJyNDRUNFQ0UnKSwNCiAgYXhpcy50ZXh0LnggPWVsZW1lbnRfdGV4dChjb2xvdXI9JyNDRUNFQ0UnKSwNCiAgYXhpcy50ZXh0LnkgPWVsZW1lbnRfdGV4dChjb2xvdXI9JyNDRUNFQ0UnKSwNCiAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAnI0NFQ0VDRScpLA0KICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoY29sb3VyID0gIiNDRUNFQ0UiKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICIjQ0VDRUNFIikNCiAgDQogICkNCg0KYGBgDQoNClNlIHB1ZWRlIG9ic2VydmFyIGxhIGV2b2x1Y2nDs24gZGVsIHRpcG8gZGUgY2FtYmlvIGV1cm8vZMOzbGFyLCBkdXJhbnRlIHRvZG8gZXNlIHBlcmlvZG8gbGEgYmFqYWRhIG3DoXMgZHLDoXN0aWNhIHF1ZSB0dXZvIGZ1ZSBlbiBlbCBwZXJpb2RvIDIwMTQtMjAxNSwgMjAxNCBmdWUgZWwgYcOxbyBkZSBsYSBtb25lZGEgZXN0YWRvdW5pZGVuc2U7IHN1IGFjZWxlcsOzbiBoYWJsYSBkZSBsYSByb2J1c3RleiBkZSBsYSByZWN1cGVyYWNpw7NuIGVjb27Ds21pY2EgZXN0YWRvdW5pZGVuc2UgZnJlbnRlIGEgdW5hIEV1cm9wYSB5IHVuIEphcMOzbiByZW5xdWVhbnRlcyB5IGVuIGdlbmVyYWwsIGRlIHVuIGNsaW1hIGRlIGluY2VydGlkdW1icmUgcXVlIGFuaW1hIGEgbG9zIGludmVyc29yZXMgYSByZXNndWFyZGFyc2UgZW4gbGEgbW9uZWRhIGRlIHJlZmVyZW5jaWEuIEVsIGFycmFucXVlIGRlIDIwMTUgZW4gbG9zIG1lcmNhZG9zIHZpZW5lIGRldGVybWluYWRvIHBvciB1biBkw7NsYXIgY2Fyby4gVGVuaWVuZG8gZXN0byBlbiBjdWVudGEgcG9kZW1vcyBvYnNlcnZhciBjb21vIDIwMTQgZnVlIGVsIGHDsW8gZGVsIGNhbWJpbyB5IHNlIHB1ZWRlIHJlbGFjaW9uYXIgY29uIGxhIHRhYmxhIGRlIGxvcyB0aXBvcyBkZSBpbnRlcsOpcyB5YSBxdWUgbWllbnRyYXMgZWwgcml0bW8gZGUgZXhwYW5zacOzbiBzZSBhY2VsZXLDsyBjb24gZnVlcnphIGVuIGVsIDJU4oCZMTQgZW4gRUUuVVUgeSBsYSBlY29ub23DrWEgY29udGludcOzIGNyZWNpZW5kbyBjb24gZnVlcnphIGVuIGVsIHRyYW1vIGZpbmFsIGRlIDIwMTQgeSBlbiAyMDE1LCBsYSByZWN1cGVyYWNpw7NuIGRlIGxhIEV1cm96b25hIHNlIGZyZW7DsyBkZSBmb3JtYSBzaWduaWZpY2F0aXZhLg0KRWwgQkNFIGVtcGV6w7MgYSBhcGxpY2FyIHVuYSBzZXJpZSBkZSBtZWRpZGFzIGRlIHBvbMOtdGljYSBtb25ldGFyaWEgc2luIHByZWNlZGVudGVzIGVuIGxhIFVFTS4gQWRlbcOhcyBkZSBoYWJlciBzaXR1YWRvIGxvcyB0aXBvcyBkZSBpbnRlcsOpcyBlbiBtw61uaW1vcyBoaXN0w7NyaWNvcywgZWwgQkNFIGVzdMOhIHByb3BvcmNpb25hbmRvIGZpbmFuY2lhY2nDs24gbXV5IGJhcmF0YSBhIGxhcyBlbnRpZGFkZXMgcXVlIG9mcmV6Y2FuIGNyw6lkaXRvIGEgdHJhdsOpcyBkZSBsb3MgVExUUk9zIG1pZW50cmFzIHF1ZSBsYSBGRUQgcG9yIGVsIGNvbnRyYXJpbyxkaXNlw7HDsyBsYSBlc3RyYXRlZ2lhIGRlIG5vcm1hbGl6YWNpw7NuIGRlIHN1IHBvbMOtdGljYSBtb25ldGFyaWEuDQoNCiMjIDMuMyBQSUINCmBgYHtyfQ0KcGliYXVzIDwtIGRhdG9zICU+JQ0KICBzZWxlY3QoYcOxbyxwaWIscGliZWUpDQoNCmdyYWZwaWIgPC0gZ2dwbG90KCBkYXRhPSBwaWJhdXMsIGFlcyh4PWHDsW8sIHk9cGliKSkgDQogIA0KIGdyYWZwaWIgKyAgZ2VvbV9saW5lKCkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZWwgUElCIDIwMDAtMjAyMCIpICsNCiAgIHRoZW1lX3NvbGFyaXplZCgpICsNCiAgICB5bGFiKCJQaWIiKSArDQogICAgdHJhbnNpdGlvbl9yZXZlYWwoYcOxbykrDQogICAgICBsYWJzKHN1YnRpdGxlID0gIkVuIG1pbGxvbmVzIikNCg0KYGBgDQoNCkNvbW8gcmVmbGVqYSBlbCBncsOhZmljbywgQXVzdHJpYSBoYSBleHBlcmltZW50YWRvIHVuIGF1bWVudG8gc29zdGVuaWRvIGRlbCBQSUIgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MsIGVuIGNhbWJpbywgYSBwYXJ0aXIgZGUgZmluYWxlcyBkZSAyMDE5IHNlIHB1ZWRlIGFwcmVjaWFyIHVuYSBiYWphZGEgb2Nhc2lvbmFkYSBwb3IgZWwgQ09WSUQxOSAuIEN1YW5kbyBlbCBQSUIgZGUgdW4gcGHDrXMgYXVtZW50YSBlcyB1bmEgYnVlbmEgc2XDsWFsIHBhcmEgbGEgZWNvbm9tw61hIHkgYWZlY3RhIGEgdG9kYXMgbGFzIHBlcnNvbmFzIGRlbCB0ZXJyaXRvcmlvLiBEaWNobyBhdW1lbnRvIHNpZ25pZmljYSBxdWUgZXN0w6FuIGF1bWVudGFuZG8gZGUgZm9ybWEgZ2VuZXJhbCBlbCBjb25zdW1vLCBlbCBnYXN0byB5IGxhIGludmVyc2nDs24gZW4gQXVzdHJpYS4gRXN0byBzdWVsZSBkZXNlbmNhZGVuYXIgdW4gZWZlY3RvIHBvc2l0aXZvIGVuIGxhIGVjb25vbcOtYSwgeWEgcXVlIGVzdG9zIGF1bWVudG9zIGhhY2VuIGNyZWNlciBsb3MgaW5ncmVzb3MgZGUgbGFzIGVtcHJlc2FzLCBsYXMgZmFtaWxpYXMgeSBsYXMgYWRtaW5pc3RyYWNpb25lcywgbGFzIGN1YWxlcyB0ZW5kcsOhbiBtw6FzIGNhcGl0YWwgcGFyYSBpbnZlcnRpciB5IGNyZWFyIGVtcGxlby4gTG8gcXVlIGRlIG51ZXZvIGhhY2UgY3JlY2VyIGVsIGNvbnN1bW8geSBlbCBnYXN0byAoYWwgaGFiZXIgbcOhcyBwZXJzb25hcyBjb24gY2FwYWNpZGFkIGRlIGNvbnN1bWlyKS4gRXMgcG9yIGVsbG8gcXVlIGN1YW5kbyBzdWJlIGVsIFBJQiBzdWVsZW4gY3JlY2VyIGVsIGVtcGxlbyB5IGF1bWVudGFyIGxvcyBzYWxhcmlvcyBkZSBsb3MgdHJhYmFqYWRvcmVzLg0KDQoNCg0KIyMgMy40IEJBTEFOWkEgREUgUEFHT1MNCmBgYHtyfQ0KYmFsYW56YXBhZ29zIDwtIGJhbGFuemFjb21wbGV0YSAlPiUNCiAgc2VsZWN0KEdFTyxUSU1FLFZhbHVlKSU+JQ0KICBmaWx0ZXIoVElNRSAlaW4lIGMoMjAxOSwyMDIwKSkNCg0KRFQ6OmRhdGF0YWJsZShiYWxhbnphcGFnb3MpDQoNCiAgDQogIA0KDQoNCmBgYA0KDQojIyAzLjUgSU5GTEFDScOTTg0KDQpgYGB7cn0NCmluZmxhY2lvbiA8LSBkYXRvcyAlPiUNCiBzZWxlY3QoYcOxbyxpbmZsYWNpb24pDQoNCmdyYWZpY29pbiA8LSBpbmZsYWNpb24gJT4lDQogIGdncGxvdCggYWVzKGHDsW8sIGluZmxhY2lvbiwgc2l6ZSA9IDAuNzUsIGNvbG9yPSAib3JhbmdlIikpICsgDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkrIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgbGFicyh4ID0gTlVMTCkgKyBsYWJzKHRpdGxlPSAiQXVzdHJpYSIpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ3doZWF0MScsIGNvbG91ciA9ICdyZWQnKSkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiI0M5REFGMSIpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNDOURBRjEiLA0KICAgICAgICBjb2xvdXIgPSAiI0M5REFGMSIpKQ0KZ2dwbG90bHkoZ3JhZmljb2luKQ0KDQoNCg0KDQpgYGANCg0KYGBge3J9DQppbmZsYWNpb25lZXV1IDwtIGRhdG9zICU+JQ0KIHNlbGVjdChhw7FvLGluZmxhY2lvbmVlKQ0KDQoNCmdyYWZpY29pbmVlIDwtIGluZmxhY2lvbmVldXUgJT4lDQogIGdncGxvdCggYWVzKGHDsW8sIGluZmxhY2lvbmVlLCBzaXplID0gMC43NSwgY29sb3I9ICJvcmFuZ2UiKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICB0aGVtZV9idygpKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9IE5VTEwpICsgbGFicyh0aXRsZT0gIkVFVVUiKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICd3aGVhdDEnLCBjb2xvdXIgPSAncmVkJykpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNDOURBRjEiKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjQzlEQUYxIiwNCiAgICAgICAgY29sb3VyID0gIiNDOURBRjEiKSkNCg0KZ2dwbG90bHkoZ3JhZmljb2luZWUpDQpgYGANCg0KDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIgbGEgaW5mbGFjacOzbiBkZSAgMjAwOSBhIDIwMTEgdGFudG8gZW4gQXVzdHJpYSBjb21vIGVuIEVFVVUgaGFuIGlkbyBlbiBhdW1lbnRvLCBlc3RvIHF1aWVyZSBkZWNpciBxdWUgbG9zIGJpZW5lcyB5IHNlcnZpY2lvcyBlbiBlbCBwYcOtcyBzZSBoYW4gdnVlbHRvIGNhZGEgdmV6IG3DoXMgY2Fyb3MgYSBsbyBsYXJnbyBkZSBsb3MgYcOxb3MuIEEgcGFydGlyIGRlIDIwMTEgbGEgZXZvbHVjacOzbiBkZSBsYSBpbmZsYWNpw7NuIGVuIEF1c3RyaWEgaGEgc2lkbyBtw6FzIHBhdWxhdGluYSBxdWUgZW4gRUVVVSwgY3V5YSBldm9sdWNpw7NuIHRpZW5lIG3DoXMgcGljb3MuIEF1c3RyaWEgYSBwYXJ0aXIgZGUgMjAxMSBoYSBjb25zZWd1aWRvIG1hbnRlbmVyIGxhIGluZmxhY2nDs24gKG3DoXMgbyBtZW5vcykgYWxyZWRlZG9yIGRlbCBvYmpldGl2byBkZWwgQkNFICgyJSkuIA0KDQoNCiMgNC4gwr9TZSB2aXZlIGJpZW4gZW4gQXVzdHJpYT8NCiMjIDQuMSBFTVBMRU8gVEVNUE9SQUwNCmBgYHtyfQ0KDQplbXBsZW9wYWlzZXMgPC0gZW1wbGVvdGVtcG9yYWwgJT4lICBmaWx0ZXIoR0VPICVpbiUgYygiQXVzdHJpYSIsIlNwYWluIiwgIkl0YWx5IiwgIkdlcm1hbnkiLCAiVW5pdGVkIEtpbmdkb20iLCAiR3JlY2VlIiwiRnJhbmNlIiwiRXN0b25pYSIsICJNYWx0YSIpKSAlPiUNCiAgIHNlbGVjdChUSU1FLEdFTyxWYWx1ZSkNCg0KZ2dwbG90KHN1YnNldChlbXBsZW9wYWlzZXMpLCBhZXMocmVvcmRlcihHRU8sVmFsdWUpLFZhbHVlLGZpbGw9VmFsdWUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpK2dndGl0bGUoIkVtcGxlbyB0ZW1wb3JhbCIpICsgeGxhYigiUGFpc2VzIikgKyB5bGFiKCJQb3JjZW50YWplIGRlIGVtcGxlbyB0ZW1wb3JhbCIpICArIGNvb3JkX2ZsaXAoKSArIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRDlFMEVCIiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAoIiNEOUUwRUIiKSkgKyB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpKSwNCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKQ0KDQogDQpgYGANCg0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciBBdXN0cmlhIGVzIGVsIHBhw61zIGNvbiBtYXlvciBlbXBsZW8gdGVtcG9yYWwgbG8gY3VhbCBwdWVkZSB0ZW5lciBkb3MgaW50ZXJwcmV0YWNpb25lcywgcG9yIHVuYSBwYXJ0ZSBxdWUgZXMgdW4gcGHDrXMgYmFzdGFudGUgZ2VuZXJhZG9yIGRlIGVtcGxlbyBsbyBjdWFsIHNlcsOtYSB1biBpbmRpY2Fkb3IgcmVsYXRpdmFtZW50ZSBidWVubywgbyBwb3IgZWwgY29udHJhcmlvIHB1ZWRlIHN1cG9uZXIgcXVlIEF1c3RyaWEgdGllbmUgbWFzIGVtcGxlbyB0ZW1wb3JhbCBxdWUgZmlqbyBsbyBjdWFsIHBvbmUgYmFzdGFudGUgZW4gcmllc2dvIGEgbG9zIHRyYWJhamFkb3JlcyB5IGdlbmVyYSBlbXBsZW9zIHByZWNhcmlvcy4gQW50ZSBlc3RhIGRpc3l1bnRpdmEgaGUgZGVjaWRpZG8gc2FjYXIgb3RyYSBncsOhZmljYSBxdWUgaGFjZSByZWZlcmVuY2lhIGEgbGEgZXhjbHVzacOzbiBzb2NpYWwuDQoNCiMjIDQuMiBSSUVTR08gREUgRVhDTFVTScOTTiBTT0NJQUwNCmBgYHtyfQ0KIHJleGNsdXNpb24gPC0gZXhjbHVzaW9uICU+JQ0KICBzZWxlY3QoR0VPLFZhbHVlLFRJTUUpJT4lIGZpbHRlcihHRU8gJWluJSBjKCJBdXN0cmlhIiwiU3BhaW4iLCAiSXRhbHkiLCAiR2VybWFueSIsICJVbml0ZWQgS2luZ2RvbSIsICJHcmVjZWUiLCJGcmFuY2UiLCJFc3RvbmlhIiwgIk1hbHRhIikpIA0KDQpyaWVzZ28gPC0gZ2dwbG90KHJleGNsdXNpb24sIGFlcyh4PVRJTUUsIHk9VmFsdWUsIGdyb3VwPUdFTywgY29sb3I9R0VPKSkgKw0KICBnZW9tX3BvaW50KGFscGhhPTAuNikgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQ9MCwgc2xvcGU9MSwgbGluZXR5cGU9ImRhc2hlZCIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFKSArDQogIGxhYnModGl0bGUgPSAiUmllc2dvIGV4Y2x1c2nDs24gc29jaWFsIiwgc3VidGl0bGUgPSAiRXVyb3BhIikgICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChyZXZlcnNlPVRSVUUpKSAgKyB0aGVtZShheGlzLnRpdGxlLnk9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCkpDQogICANCiBnZ3Bsb3RseShyaWVzZ28pDQoNCmBgYA0KDQpFbiBlc3RlIGdyw6FmaWNvIEF1c3RyaWEgZXMgZWwgcGHDrXMgY29uIG1lbm9yIHJpZXNnbyBkZSBleGNsdXNpw7NuIHNvY2lhbCwgbG8gcXVlIGltcGxpY2EgcXVlIHRpZW5lIGxvcyBzdWZpY2llbnRlcyByZWN1cnNvcyBwYXJhIG9mcmVjZXIgYSBzdXMgY2l1ZGFkYW5vcyBzaW4gcXVlIGVzdG9zIHBhZGV6Y2FuIG5lY2VzaWRhZGVzLCBsbyBjdWFsIGltcGxpY2EgcXVlIGFkZW3DoXMgZGUgZ2VuZXJhciBlbXBsZW8gY29tbyBoZW1vcyB2aXN0byBhcnJpYmEsIGRlIGVzdGUgZ3LDoWZpY28gc2UgZXh0cmFlIGVsIGhlY2hvIGRlIHF1ZSBhIHBlc2FyIGRlIHF1ZSBnZW5lcmEgbXVjaG8gZW1wbGVvIHRlbXBvcmFsIGVsIGN1YWwgZ2VuZXJhIG3DoXMgcmllc2dvIGRlIGRlc2VtcGxlbywgbGFzIGNvbXBlbnNhY2lvbmVzIHkgbGEgY2FsaWRhZCBkZSB2aWRhIHF1ZSBvZnJlY2UgYSBzdXMgY2l1ZGFkYW5vcyBlcyBtdXkgYWx0YSBwb3IgbG8gcXVlIHNlIHBvZHLDrWEgY29uc2lkZXJhciBsYSBjYW50aWRhZCBkZSBlbXBsZW8gdGVtcG9yYWwgY29tbyBhbGdvIHBvc2l0aXZvLg0KIyMgNC4zIERFU0VNUExFTw0KDQpgYGB7cn0NCmRlc2VtcGxlb2V1IDwtIGRlc2VtcGxlb28gJT4lDQogIHNlbGVjdChUSU1FLEdFTyxWYWx1ZSklPiUNCiAgc2xpY2VfbWF4KFZhbHVlLCBuID0gOSkNCiAgZGVzZW1wbGVvZXUNCg0KZGZncmFmaWNvMSA8LSBnZ3Bsb3QoZGVzZW1wbGVvZXUsIGFlcyhHRU8sIGNvbG9yPVZhbHVlKSkgKyANCiAgZ2VvbV9iYXIoZmlsbD1OQSkgKyANCiAgY29vcmRfZmxpcCgpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ2xpZ2h0Ymx1ZTEnKSkgKyB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzdGRkZENCIpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM3RkZGRDQiKSwNCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiM3RkZGRDQiKSkNCg0KZ2dwbG90bHkoZGZncmFmaWNvMSkNCg0KDQpgYGANCkF1c3RyaWEganVudG8gY29uIEFsZW1hbmlhIGVzIGVsIHBhw61zIGNvbiBtZW5vcyBkZXNlbXBsZW8sIHNlIHRyYXRhIGRlIHVuIHBhw61zIHBlcXVlw7FvIGVsIGN1YWwgaGEgc2FiaWRvIGFwcm92ZWNoYXIgc3VzIHZlbnRhamFzIHkgYSBoYSBzYWJpZG8gZGVzdGFjYXIgZW4gYXNwZWN0b3MgbXV5IGltcG9ydGFudGVzIGNvbW8gbG8gZXMgbGEgZWR1Y2FjacOzbi4gUGFydGllbmRvIGRlIGxhIHByZW1pc2EgZGUgcXVlIGxvcyBqb3ZlbmVzIHF1ZSB0ZXJtaW5hbiBzdXMgZXN0dWRpb3Mgc2FsZW4gbXV5IHByZXBhcmFkb3MgcGFyYSBpbnRyb2R1Y2lyc2UgZW4gZWwgbWVyY2FkbyBsYWJvcmFsLCB0YWwgeSBjb21vIGxvIGRlbXVlc3RyYW4gbG9zIGluZm9ybWVzIFBJU0EsIGVuIGVsICBjdWFsIHN1ZWxlbiBkZXN0YWNhciBiYXN0YW50ZS4gDQoNCg0KIyA1IFNlY3RvciB0dXLDrXN0aWNvDQoNCiMjIDUuMSA8Rk9OVCBDT0xPUj0iYmxhY2siPiDCv1FVRSBTRSBQVUVERSBWSVNJVEFSIEVOIEFVU1RSSUE8L0ZPTlQ+LiB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPkxhIEFiYWTDrWEgZGUgTWVsazwvRk9OVD4NCiFbTWFyY2FdKC4vaW1hZ2VuZXMvYWJhZGlhLnBuZykNCkp1c3RvIGN1YW5kbyBwaWVuc2FzIHF1ZSBubyBoYXkgbmFkYSBtw6FzIHF1ZSB2ZXIgZW4gQXVzdHJpYSBxdWUgcG9kcsOtYSBzb3JwcmVuZGVydGUsIHF1ZSB5YSBsbyBoYWLDrWFzIHZpc3RvIHRvZG8sIGVzIGN1YW5kbyBkZXNjdWJyZXMgcXVlIGZ1ZXJhIGRlIGxhcyBncmFuZGVzIGNpdWRhZGVzIGRlbCBwYcOtcyB0ZSBlc3BlcmEgdG9kbyB1biBtdW5kbyBkZSBwb3NpYmlsaWRhZGVzOiBkZXNkZSBwYWxhY2lvcywgYSBhYmFkw61hcywgYm9zcXVlcywgcGVxdWXDsW9zIHB1ZWJsZWNpdG9zLCBtb250YcOxYXMgbyBsYWdvcy4gQSBjb250aW51YWNpw7NuLCBxdWVyZW1vcyBjZW50cmFybm9zIGVuIGVzdG9zLCB5IG5vIHBvZMOtYW1vcyBlbXBlemFyIGRlIG90cmEgZm9ybWEgcXVlIGNvbiBsYSBhYmFkw61hIGRlIE1lbGssIHNpdHVhZGEgYSB1bm9zIDg1IGtpbMOzbWV0cm9zIGRlIFZpZW5hIHkgY29uc2lkZXJhZGEgdW5hIGF1dMOpbnRpY2Egb2JyYSBtYWVzdHJhIGRlbCBiYXJyb2NvLiBZIG5vIGVzIHBhcmEgbWVub3MsIHNlIHRyYXRhIGRlIHVuYSBmYWJ1bG9zYSBhYmFkw61hIGJlbmVkaWN0aW5hIGZ1bmRhZGEgZW4gZWwgYcOxbyAxMDg5IHNvYnJlIHVuYSBwZXF1ZcOxYSBjb2xpbmEgZGVzZGUgcXVlIGxhIHF1ZSBzZSBkaXZpc2EgZWwgRGFudWJpbyB5IGVsIHZhbGxlIGRlIFdhY2hhdS4gUHJlY2lzYW1lbnRlIGVzdGUgw7psdGltbywgZGVjbGFyYWRvIFBhdHJpbW9uaW8gZGUgbGEgSHVtYW5pZGFkLCBlcyB0b2RhIHVuYSB2aXNpdGEgaW1wcmVzY2luZGlibGUgcXVlIGhhY2VyIGVuIEF1c3RyaWEuIE1vbnRhw7FhcywgbmF0dXJhbGV6YSwgYmVsbG9zIHBhaXNhamVzLCBhY3RpdmlkYWRlcyBhbCBhaXJlIGxpYnJlIMK/aGF5IGFsZ28gbcOhcyBxdWUgcGVkaXI/DQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj5NYXV0aGF1c2VuPC9GT05UPg0KIVtNYXJjYV0oLi9pbWFnZW5lcy9tYXV0LnBuZykNCkVsIGNhbXBvIGRlIGNvbmNlbnRyYWNpw7NuIGRlIE1hdXRoYXVzZW4gZnVlIHVuIGdydXBvIGRlIGNhbXBvcyBkZSBjb25jZW50cmFjacOzbiBuYXppcyBzaXR1YWRvcyBlbiB0b3JubyBhIGxhIHBlcXVlw7FhIGVtcHJlc2EgeSBjYW50ZXJhLCBkZSBsYSBwb2JsYWNpw7NuIGRlIE1hdXRoYXVzZW4gZW4gQXVzdHJpYSwgYSB1bm9zIDIwIGttIGRlIExpbnouIFNpIGJpZW4gbm8gcG9kZW1vcyBkZXN0YWNhciBlc3RlIGx1Z2FyIHBvciBiZWxsZXphLCBubyBwb2RlbW9zIGRlamFyIGRlIHBlbnNhciBlbiDDqWwgY29tbyB1biBsdWdhciBpbXByZXNjaW5kaWJsZSBwYXJhIGNvbm9jZXIgcGFydGUgZGUgbGEgaGlzdG9yaWEgZGVsIG11bmRvLiBFbiBlbCBjYW1wbyBkZSBjb25jZW50cmFjacOzbiBkZSBNYXV0aGF1c2VuIG1pbGVzIGRlIHByZXNvcyBmdWVyb24gbXVlcnRvcywgbXVjaG9zIGRlIGVsbG9zIGFiYXRpZG9zIGEgdGlyb3MsIG1lZGlhbnRlIGlueWVjY2lvbmVzIGxldGFsZXMgbyBhc2VzaW5hZG9zIGNvbiBnYXMgbGV0YWwsIGF1bnF1ZSBsYSBtYXlvcsOtYSBkZSBlbGxvcyBmYWxsZWNpZXJvbiBwb3IgbGEgZXhwbG90YWNpw7NuIHF1ZSBzdWZyaWVyb24gZW4gZWwgdHJhYmFqbywgcXVlIGVqZWN1dGFiYW4gc2luIG5pbmfDum4gdGlwbyBkZSBlc2Nyw7pwdWxvcy4gU2UgY3VlbnRhIHF1ZSBlbiBNYXV0aGF1c2VuIHBlcmRpZXJvbiBsYSB2aWRhIHVub3MgMTAwMDAwIHByZXNvcy4NCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj5TYWx6YnVyZ288L0ZPTlQ+DQohW01hcmNhXSguL2ltYWdlbmVzL25zLnBuZykNClViaWNhZGEganVzdG8gZW4gbGEgZnJvbnRlcmEgY29uIEFsZW1hbmlhLCBTYWx6YnVyZ28gZnVlIGVsIGx1Z2FyIGRlIG5hY2ltaWVudG8gZGUgTW96YXJ0LiBFbCBmYW1vc28gY29tcG9zaXRvciBlcyBlbCBwZXJzb25hamUgbcOhcyBkZXN0YWNhZG8gZGUgbGEgaGlzdG9yaWEgZGVsIHBhw61zLiBEZSBoZWNobywgdW5hIGRlIGxhcyBtZWpvcmVzIGNvc2FzIHF1ZSB2ZXIgZW4gU2FsemJ1cmdvIGVzIGxhIGNhc2EgZG9uZGUgbmFjacOzIHkgY3JlY2nDsyBlc3RlIGdlbmlvIGRlIGxhIG3DunNpY2EuDQoNClBlcm8gU2FsemJ1cmdvIGVzIG11Y2hvIG3DoXMgcXVlIE1vemFydC4gU29sbyBmYWx0YSBhYnJpciBsb3Mgb2pvcyB5IG9ic2VydmFyIGVsIHBhaXNhamUgYWxwaW5vIHF1ZSBsYSByb2RlYS4gVmlzaXRhciBTYWx6YnVyZ28gZW4gdW4gZMOtYSBlcyBmw6FjaWwuIE5vIHRlIHBpZXJkYXMgbGEgZmFtb3NhIGZvcnRhbGV6YSBkZSBIb2hlbnNhbHpidXJnIG8gbGFzIGNhbGxlcyBkZSBzdSBjZW50cm8gaGlzdMOzcmljby4gUG9yIGFsZ8O6biBtb3Rpdm8gZXMgUGF0cmltb25pbyBkZSBsYSBIdW1hbmlkYWQgcG9yIGxhIFVORVNDTy4NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPldhdHRlbnM8L0ZPTlQ+DQohW01hcmNhXSguL2ltYWdlbmVzL25zcy5wbmcpDQrCv1F1acOpbiBubyBjb25vY2UgbGEgZmFtb3NhIG1hcmNhIFN3YXJvdnNraT8gRW4gV2F0dGVucyBwb2RlbW9zIGVuY29udHJhciBMb3MgTXVuZG9zIGRlIENyaXN0YWwsIHVuYSBkZSBsYXMgYXRyYWNjaW9uZXMgdHVyw61zdGljYXMgbcOhcyB2aXNpdGFkYXMgZGUgQXVzdHJpYSBkb25kZSBwb2RlbW9zIGVuY29udHJhciAxNCBzYWxhcyBlbiBsYXMgcXVlIHNlIGd1YXJkYW4gYWxndW5hcyBkZSBsYXMgb2JyYXMgbcOhcyBtYXJhdmlsbG9zYXMgeSBicmlsbGFudGVzIGRlIFN3YXJvdnNraS4NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPkNhcnJldGVyYSBkZWwgR3Jvc3NnbG9ja25lcjwvRk9OVD4NCiFbTWFyY2FdKC4vaW1hZ2VuZXMvYi5wbmcpDQpTaSBoYXkgdW4gbHVnYXIgaW1wZXJkaWJsZSBlbiBBdXN0cmlhIGVzZSBlcyBsYSBDYXJyZXRlcmEgZGVsIEdyb3NzZ2xvY2tuZXIuIFRlIGFjb25zZWphbW9zIGlyIGNvbiB0aWVtcG8sIHlhIHF1ZSDDum5pY2FtZW50ZSByZWNvcnJlcmxhIHRlIGxsZXZhcsOhIHVuYXMgY3VhbnRhcyBob3Jhcywgc2luIGNvbnRhciBsYXMgcGFyYWRhcyBxdWUgcXVlcnLDoXMgaGFjZXIgcGFyYSBkaXNmcnV0YXIgZGUgdW5vIGRlIGxvcyBwYWlzYWplcyBtw6FzIGltcHJlc2lvbmFudGVzIGRlIEF1c3RyaWEuDQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj5HcmF6PC9GT05UPg0KIVtNYXJjYV0oLi9pbWFnZW5lcy9jLnBuZykNCkdyYXogZXMgbGEgY2FwaXRhbCBkZWwgZXN0YWRvIGRlIEVzdGlyaWEsIGVuIGVsIHN1ciBkZSBBdXN0cmlhLiBFbiBlbCBjb3JhesOzbiBkZSBsYSBjaXVkYWQgc2UgZW5jdWVudHJhIEhhdXB0cGxhdHosIGxhIHBsYXphIGNlbnRyYWwgZGVsIGNhc2NvIGFudGlndW8gbWVkaWV2YWwuQSBvcmlsbGFzIGRlbCByw61vIE11ciBub3MgZW5jb250cmFtb3MgY29uIEdyYXosIGxhIGNhcGl0YWwgZGUgRXN0aXJpYSB5IHVuYSBkZSBsYXMgY2l1ZGFkZXMgbWVub3MgY29ub2NpZGFzIGRlIEF1c3RyaWEuIFPDs2xvIHBvciBkaXNmcnV0YXIgbGFzIHZpc3RhcyBkZSBsYSBjaXVkYWQgZGVzZGUgc3UgaW5jcmXDrWJsZSBUb3JyZSBkZWwgUmVsb2osIHlhIG1lcmVjZSBsYSBwZW5hIGhhY2VyIHVuYSBwYXJhZGEgZW4gbGEgY2l1ZGFkLg0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+VmFsbGUgZGUgU3R1YmFpPC9GT05UPg0KIVtNYXJjYV0oLi9pbWFnZW5lcy9hLnBuZykNCkVzdGFyIGVuIGVsIFRpcm9sIHkgbm8gdmVuaXIgYWwgVmFsbGUgZGUgU3R1YmFpIGVzIGNvbW8gZXN0YXIgZW4gUm9tYSB5IG5vIGNvbm9jZXIgZW4gQ29saXNlby4gUGFpc2FqZXMgY29uIGNpZW50b3MgZGUgdG9uYWxpZGFkZXMgZGUgdmVyZGUsIHNhbHBpY2Fkb3MgZGUgY2FzaXRhcyB0cmFkaWNpb25hbGVzIGFkb3JuYWRhcyBjb24gZmxvcmVzIHkgdW4gaG9yaXpvbnRlIG5ldmFkbyBub3MgZXNwZXJhbiBjb21vIHRlbMOzbiBkZSBmb25kbyBlbiBlc3RhIHpvbmEgZGUgQXVzdHJpYS4NCg0KIyA2LiBDb25jbHVzacOzbg0KTGEgaW50ZW5jacOzbiBkZSBoYWNlciBlc3RlIHRyYWJham8gaGEgc2lkbyBxdWUgc2UgY29ub3pjYSB1biBwb2NvIG3DoXMgZWwgcGHDrXMgeWEgcXVlIGFsIHNlciB1biBwYcOtcyBwZXF1ZcOxbyBubyBzdWVsZSBzZXIgdW5vIGRlIGxvcyBkZXN0aW5vcyBuaSB0dXJpc3RpY29zIG5pIGRlIG5lZ29jaW9zIG3DoXMgY29ub2NpZG9zLiBFcyBwb3IgZXNvIHF1ZSBoZSBxdWVyaWRvIHBsYXNtYXIgY29tbyBBdXN0cmlhIGEgcGVzYXIgZGUgc2VyIHVuIHBhw61zIHBlcXVlw7FvIGN1ZW50YSBjb24gdW5hIHRhc2EgZGUgaW5mbGFjacOzbiByZWxhdGl2YW1lbnRlIHBlcXVlw7FhIGVuIGNvbXBhcmFjacOzbiBjb24gcGHDrXNlcyBkZSBsYSBVRS4gUG9yIG90cmEgcGFydGUsIGEgbGEgaG9yYSBkZSBkZWNpZGlyIGlyIGEgdml2aXIgYSBBdXN0cmlhIGhheSBxdWUgY29ub2NlciBkZSBhbnRlbWFubyBsYXMgY29uZGljaW9uZXMgbGFib3JhbGVzIHkgc2kgZW4gZXNlIHBhw61zIGhheSBvIG5vIHBvc2liaWxpZGFkIGRlIGVtcGxlbyB5IGVuIGVzdGUgY2Fzbywgc2UgaGEgZGVtb3N0cmFkbyBxdWUgc2kgc2UgdGllbmUgbGEgaWRlYSBkZSBpciBhIHRyYWJhamFyIGZ1ZXJhLCBBdXN0cmlhIHBvZHJpYSBzZXIgdW4gYnVlbiBjYW5kaWRhdG8uIA0KRW4gY29uY2x1c2nDs24sIGEgbml2ZWwgdHVyaXN0aWNvIGN1ZW50YSBjb24gdW5hIGdyYW4gY2FudGlkYWQgZGUgbW9udW1lbnRvcyB5IHNvYnJldG9kbyBuYXR1cmFsZXphIHBhcmEgcG9kZXIgdmlzaXRhciB5IGRpc2ZydXRhciBkZSBsYXMgdmlzdGFzIHkgcG9yIG90cmEgcGFydGUgYSBuaXZlbCBlY29ub21pY28gZGVzdGFjYSBiYXN0YW50ZS4gDQoNCiMgNy5CaWJsaW9ncmFmw61hDQotIFtlbmxhY2UgYSBsYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhXShodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMS0yMi13ZWIvaW5kZXguaHRtbCkNCi0gW2VubGFjZSBhIGxhIHDDoWdpbmEgd2ViIGRlIEV1cm9zdGF0XShodHRwczovL2VjLmV1cm9wYS5ldS9ldXJvc3RhdCkNCi0gW2VubGFjZSBhIGxhIHDDoWdpbmEgd2ViIGRlbCBJTkVdKGh0dHBzOi8vd3d3LmluZS5lcy8pDQotIFtlbmxhY2UgYSBsYSBww6FnaW5hIHdlYiBkZWwgQmFuY28gTXVuZGlhbF0oaHR0cHM6Ly9kYXRvcy5iYW5jb211bmRpYWwub3JnLykNCi0gW2VubGFjZSBhIGxhIHDDoWdpbmEgd2ViIGRlIG5vdGljaWFzIGVjb27Ds21pY2FzIGRlIEF1c3RyaWFdKGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5lcy9lY29ub21pYS9ub3RpY2lhcy8xMDIxNTI4OS8xMS8xOS9RdWllbi1lcy1lbC1jdWxwYWJsZS1kZWwtY29sYXBzby1kZS1sb3MtdGlwb3MtZGUtaW50ZXJlcy1lbi1sYS1FdXJvem9uYS5odG1sKQ0KLSBbZW5sYWNlIGEgbGEgcMOhZ2luYSB3ZWIgZGUgbGEgaGlzdG9yaWEgZGUgQXVzdHJpYV0oaHR0cHM6Ly9lcy53aWtpcGVkaWEub3JnL3dpa2kvQXVzdHJpYSkNCmBgYA0KDQo8YnI+PGJyPg0KDQo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4NCg0KDQoNCg0KDQoNCg0K