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. ¿Por qué los esports?

Los esports son un sector en constante expansión y crecimiento. Pero, primero que todo: ¿Qué entendemos por esports?

Los esports o deportes electrónicos son una parte que complementa el campo de los videojuegos Este concepto se utiliza para nombrar las competiciones organizadas a nivel profesional o semiprofesional donde diferentes personas de todo el mundo compiten por ser los mejores. Estas competiciones multijugador se dan en diferentes videojuegos con esto quiero decir que no todos los videojuegos tienen una parte competitiva (esports), ni que en todos los juegos se compite de la misma forma, es decir hay juegos en los que se compite individualmente y en otros por equipos, en algunos se hace de forma virtual y en otros se hace en eventos presenciales.

2. Historia de los esports


¿Cuál fue el primer torneo de videojuegos?

Creo que para hacer un buen análisis es importante saber de donde venimos y cuales fueron los origenes de la competición, es así que el primer torneo de videojuegos de la historia lo organizó una Universidad, en concreto la Universidad de Stanford en 1972 y fue un torneo de “Spacewar”. El premio, un año de subscripción a la revista Rolling Stones.



La indústria de los videojuegos ha ido creciendo y evolucionando desde sus inicios ofreciendo una cantidad de juegos y estilos muy diversas a lo largo del tiempo hasta alcanzar en el 2019 una cifra de negocio cercana a los 152.100 millones de dólares. A esa indústria se ha añadido la parte competitiva como parte esencial de algunos videojuegos. Es de esto de lo que trata este trabajo entender la importancia que tiene tanto el sector de los videojuegos como su parte competitiva y intentar dar unas pinceladas de cual puede ser el futuro de esta indústria.

3.Los datos

Datos

Los Datos que he utilizado para hacer el trabajo son fundamentalmente los datos que he extraido de aquí esta web es una web que ofrece muchisimos datos diferentes sobre los videojuegos y también sobre los diferentes Torneos o Eventos que hay alrededor del mundo.

La verdad no ha sido fácil encontrar datos sobre los videojuegos, al principio tuve que descartar la idea de hacer este trabajo por la falta de datos manejables para hacer el mismo, pero un dia por casualidad me enviaron el enlace a esta página web y con los datos que hay aquí si que he podido realizar el trabajo. No obstante si los datos hubiesen sido más amplios este analisis podría ser mucho más completo y más real, ya que me gustaria tener información de por ejemplo la cantidad de jugadores o los ingresos por la venta de los videojuegos o que juegos son free to play y cuales no o como ha evolucionado el precio de venta de los videojuegos.

Tidy

Cuando me descargue los datos de la página web habia cerca de 16000 juegos pero la mayoria de ellos no tenian apartado competitivo por lo tanto la columna de TotalMoney que cuenta cuanto dinero ha repartido estaba vacia y por tanto no eran útiles para el estudio, además que habia muchos juegos de diferentes plataformas que no me interesaban para este análisis, una vez filtrados los datos estos son los paquetes que he utilizado para hacer la totalidad del trabajo.

library(tidyverse)
library(readxl)
library(gt)
library(robservable)
library(RColorBrewer)
library(gganimate)
library(gifski)
library(Cairo)
library(reactable)
library(ggplot2)
library(plotly)
library(sf)
library(patchwork)

#Importo los datos para la realización del trabajo:
datos_earnings <- read_excel("data/datos_earnings.xlsx")

4.Tablas de curiosidades

El juego que más dinero ha repartido

Me parecia curioso saber cual era el juego que más dinero habia repartido en total. El dota 2 es el juego que ha repartido más dinero…. pero que es el dota 2?… El dota 2 es videojuego perteneciente al género de Arena de batalla en línea también conocido como MOBA, lanzado el 9 de julio del año 2013.

Quien quiera saber más dejo el enlace a la wikipedia donde explica más profundamente el sentido del juego. Dota 2


mas_premios <- datos_earnings %>% slice_max(TotalMoney, n=1)

imagen_dota2<- "https://estnn.com/wp-content/uploads/2019/09/dota-2-header-800x450.jpg"
df_graf <- mas_premios %>% add_column(imagen_dota2)
df_graf <- df_graf %>% select(GameName, TotalMoney, TournamentNo, imagen_dota2)


library(gt)
Tabla_dota <- df_graf %>% gt()

Tabla_dota <- Tabla_dota %>%
                   tab_header(title = md("**El juego con más premios repartidos**"))

Tabla_dota <- Tabla_dota %>% tab_options(heading.background.color = "green") %>% tab_options(heading.title.font.size = 15, heading.subtitle.font.size = 13,  column_labels.font.weight =  "bold")


Tabla_dota <- Tabla_dota  %>%
  gt::text_transform(locations = cells_body(columns = vars(imagen_dota2)), fn = function(x) {gt::web_image(x, height = 50)}) %>%  cols_align(align = "center")

Tabla_dota
El juego con más premios repartidos
GameName TotalMoney TournamentNo imagen_dota2
Dota 2 227419905 1434

El país que más dinero ha ganado

Me resultaba interesante saber que país era el que en más juegos diferentes habia sido el país con más ingresos y bueno con una diferencia abismal sobre el segundo es Estados Unidos.

#Pais con mas earnings totales

aa <- datos_earnings %>%  group_by(Top_Country) %>% summarise(N = n())

bb <- aa  %>% slice_max(N, n= 1)

imagen_EEUU<- "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Flag_of_the_United_States.svg/300px-Flag_of_the_United_States.svg.png"

df_graf2 <- bb %>% add_column(imagen_EEUU)
Tabla_pais <- df_graf2 %>% gt()

Tabla_pais <- Tabla_pais %>%
                   tab_header(title = md("**El país con mayor diversidad de earnings**"))

Tabla_pais <- Tabla_pais %>%  tab_options(heading.background.color = "green") %>% tab_options(heading.title.font.size = 15, heading.subtitle.font.size = 13,  column_labels.font.weight =  "bold")


Tabla_pais <- Tabla_pais  %>%
  gt::text_transform(locations = cells_body(columns = vars(imagen_EEUU)), fn = function(x) {gt::web_image(x, height = 50)}) %>%  cols_align(align = "center")

Tabla_pais
El país con mayor diversidad de earnings
Top_Country N imagen_EEUU
United States 238

5. Porcentaje de premios repartidos

datos_earnings$GameName<- recode(datos_earnings$GameName, "Counter-Strike: Global Offensive" = "CSGO","PLAYERUNKNOWN'S BATTLEGROUNDS" = "PUBG")

grafico_ <-datos_earnings %>%
  mutate(GameName = fct_lump_n(f = GameName,n = 10,w = TotalMoney,other_level = "Otros")) %>%
  group_by(GameName)  %>%
  summarise(Premios = sum(TotalMoney)) %>%
  mutate(Proportion = Premios/sum(Premios),
  GameName = fct_reorder(.f = GameName, .x = Proportion,.fun = max, .desc = TRUE),
 GameName = fct_relevel(.f = GameName, "Otros", after = Inf))

 grafico_total<- grafico_ %>%  ggplot(aes(x = "",y = Proportion,fill = GameName)) +
  geom_col(width = 1,color = "black",alpha = 1) +
  theme(legend.position = "right", legend.title = element_text(face = "bold"),
        axis.text = element_text(face = "bold")) +
  labs(title = "Cantidad de dinero repartida", y = element_blank(), x = element_blank(),
       fill = "Nombre del juego") +
  geom_text(aes(label = ifelse(Proportion >0.08,paste0(round(Proportion,3)*100,"%"),"")),position = position_stack(vjust = 0.5))

La información que nos muestra el gráfico anterior hace referencia a cuanto dinero se ha repartido en los diferentes torneos y cuales son los videojuegos que más dinero reparten. Como vemos el juego que más dinero ha repartido con más de una cuarta parte del total repartido es el Dota 2 seguido del Counter-Strike y del Fortnite. El caso más curioso de los tres es el caso del Fortnite ya que es un juego muy reciente lanzado en 2017 y que en tan solo 3 años se situa como el tercer juego que más dinero ha repartido. Esta cantidad de dinero tan elevada que repartió el Fortnite se concentró en gran medida en un evento World Cup donde el ganador (Bugha) se llevó un premio de 3.000.000 de dólares y cada participante tenia un premio mínimo de 50.000 dólares.

6. Evolución de la temática de los juegos presentados cada año

Gráfico

En este gráfico dinámico quería analizar de que temática eran los videojuegos que se lanzaban y si las temáticas han sufrido cambios a lo largo del tiempo. Aunque se ve muy rápido se puede hacer una idea de la evolución. Además también se observa que cada vez se lanzan un número mayor de videojuegos.

Código

grafico_3 <- datos_earnings %>% select(GameName, Releaseyear, Genre) %>%
 group_by(Releaseyear) %>%
  arrange(Releaseyear, GameName) %>%
  mutate(ranking = row_number())%>% filter(ranking <= 11)


cosas <- datos_earnings %>% group_by(Genre, Releaseyear) %>% summarise(N = n())
cosas2 <- cosas %>%  rename(id=Genre) %>% rename(date=Releaseyear) %>%  rename(value=N) %>% filter(date!= "11") %>%  arrange(date)


juegos2 <- datos_earnings %>% select(Genre, Releaseyear, GameName)

juegos2 <- juegos2 %>% group_by(Releaseyear, Genre) %>% summarise(N = n())

juegos2a <- juegos2 %>%
  group_by(Releaseyear) %>%
  arrange(Releaseyear, desc(N)) %>%
  mutate(ranking = row_number())%>% filter(ranking <= 10)

library(RColorBrewer)
nb.cols <- 11
mycolors <- colorRampPalette(brewer.pal(11, "Paired"))(nb.cols)

library(gganimate)
grafico_final <-   ggplot(juegos2a)+
  geom_col(aes(ranking,N,fill=Genre))+
  scale_fill_manual(values=mycolors)+
  geom_text(aes(ranking,N,label=as.factor(N)),hjust=-0.2,size=5)+
  geom_text(aes(ranking, y=0 , label = Genre), hjust=1.1,size=5) +
  geom_text(aes(x=10, y=max(N) , label = as.factor(Releaseyear)), vjust = 0, hjust=0.5, alpha = 0.1,  col = "black", size = 20)+
  labs(title = "Evolución de la temática de los juegos",
       x=NULL,
       y=NULL)+
  coord_flip(clip = "off")+
  scale_x_reverse()+
  theme_classic()+
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.y = element_blank(),
        axis.text.x = element_blank(),
        plot.title = element_text(hjust = 0, size=20,face="bold"),
        plot.subtitle = element_text(hjust = 0, size=12, face="italic"),
        plot.margin = margin(1, 4, 1, 3, "cm"))+
  transition_states(Releaseyear,transition_length = 1,state_length = 0,wrap = FALSE)

library(gifski)
library(Cairo)


 animate (grafico_final,
        nframes = 1000,
        fps = 30,
        end_pause = 150,
        width = 1000,
        height = 600,
        type = "cairo")

7. Variación de la temática de los videojuegos

datos_earnings$Genre<- recode(datos_earnings$Genre, "First-Person Shooter" = "FPS","Multiplayer Online Battle Arena" = "MOBA")

codigo_grafico_complementario <- datos_earnings %>%  mutate(ReleaseGroup = ifelse(Releaseyear <= 2010,"Antes del 2010", ifelse(Releaseyear <= 2015,"2011 - 2015","2016-Actualidad")))

  grafico_complementario <- codigo_grafico_complementario %>%  ggplot(aes(x = factor(Genre,levels = c("Strategy","Fighting Game","Racing","Sports","FPS","MOBA","Battle Royale")), fill = factor(ReleaseGroup,levels = c("Antes del 2010","2011 - 2015","2016-Actualidad")))) +
  geom_bar(position = "fill",color = "black",alpha = 0.75) +
  labs(fill = "Período de lanzamiento", x = element_blank(), y = element_blank()) +
  scale_fill_brewer(palette = "Paired") +
  labs(title = "Como ha cambiado el genero de los juegos lanzados",caption ="*No he seleccionado todas las variables porque hay algunas que son poco relevantes")

grafico_complementario

Este gráfico intenta complementar la información que se muestra en el gráfico dinámico anterior, lo que pretendo mostrar es si han habido cambios en las preferencias de los consumidores sobre las temáticas de los videojuegos agrupando en tres etapas: antes del 2010 entre el 2010 y el 2015 y del 2016 a la actualidad. Como observamos en el gráfico los Battle Royale son un género muy reciente ya que solo se dan a partir del 2016, también podemos ver que ha aumentado recientemente la presentación de juegos de estratégia que entre el 2010 y el 2015 prácticamente no se presentaron juegos. En los otros géneros la distribución a través de los años es más o menos la misma esto puede venir dado por diversos factores como por ejemplo que muchos juegos de deportes sacan una edición cada año por lo tanto la publicación es constante.

8. Tabla Juegos

A partir de la siguiente tabla puedes consultar un juego y ver el género al que peretenece, así como el número de torneos que se han realizado y el dinero total.

datos_buscar <- datos_earnings %>% filter(TotalMoney>500000)
datos_buscar <- datos_buscar %>%  select(GameName,Genre,TournamentNo,TotalMoney) %>% arrange(Genre,TotalMoney)
names(datos_buscar)= c("Nombre del Juego", "Género", "Número de Torneos", "Dinero Total")


reactable(datos_buscar, defaultPageSize =  10,  paginationType = "jump", showPageSizeOptions =  TRUE , pageSizeOptions =  c ( 10 , 50 , 100 ),defaultColDef = colDef(
    align = "center",
    minWidth = 70,
    headerStyle = list(background = "lightgreen"),
    filterable = TRUE),  highlight = TRUE, outlined = TRUE,
    columns = list(`Número de Torneos`
   = colDef(style = function(value) {
    if (value > 100) {
      color <- "#008000"}
      else {
      color <- "#4814f5"
    }
    list(color = color, fontWeight = "bold")
  })))

9. Hablemos de Sagas míticas

No podemos hablar de videojuegos y no pensar en cualquiera de estas dos sagas míticas y es que. Quién no ha oido hablar del FIFA o del Call of Duty?…

Bien, en los siguientes gráficos he querido mostrar cual ha sido el interés que han tenido estas sagas en el apartado competitivo ya que es en este donde se reparten los premios.

Para lograrlo he hecho los siguientes gráficos de puntos donde los juegos se ordenan en el eje X según su fecha de lanzamiento. He utilizado los datos de estas dos míticas sagas de videojuegos por dos motivos, son dos de las más importantes y por otro lado tienen una similitud muy importante ya que ambas sagas desde el año 2009 presentan un juego anualmente lo que nos puede dar información de como ha evolucionado la importancia del apartado competitivo en los juegos, tratandose además de juegos de índole diferente ya que uno trata sobre fútbol y el otro es un Shooter en primera persona.

Call_of_Duty <- datos_earnings %>% filter(GameName %in% c("Call of Duty: Advanced Warfare", "Call of Duty: Black Ops", "Call of Duty: Black Ops 2", "Call of Duty: Black Ops 4", "Call of Duty: Black Ops III","Call of Duty: Ghosts", "Call of Duty: Infinite Warfare", "Call of Duty: Modern Warfare", "Call of Duty: Modern Warfare 2", "Call of Duty: Modern Warfare 3", "Call of Duty: World War II"
))
Call_of_Duty$GameName<- recode(Call_of_Duty$GameName, "Call of Duty: Advanced Warfare" = "Advanced Warfare","Call of Duty: Black Ops"="Black Ops", "Call of Duty: Black Ops 2"="Black Ops 2", "Call of Duty: Black Ops 4"="Black Ops 4", "Call of Duty: Black Ops III"="Black Ops III","Call of Duty: Ghosts"="Ghosts", "Call of Duty: Infinite Warfare"= "Infinite Warfare", "Call of Duty: Modern Warfare"="Modern Warfare", "Call of Duty: Modern Warfare 2"="Modern Warfare 2", "Call of Duty: Modern Warfare 3"="Modern Warfare 3", "Call of Duty: World War II"="World War II")

fifa <- datos_earnings %>% filter(GameName %in% c( "FIFA 10", "FIFA 11", "FIFA 12", "FIFA 13", "FIFA 14", "FIFA 15", "FIFA 16", "FIFA 17", "FIFA 18", "FIFA 19", "FIFA 20"))

Call <- Call_of_Duty %>% select(Releaseyear, GameName,TotalMoney) %>% arrange(Releaseyear)


a <- ggplot(data =Call_of_Duty , aes(Releaseyear ,TotalMoney, group=GameName,color =GameName )) + geom_line() + geom_point(size=5) + theme_bw()  + labs(y= "", y = "", caption = "") + theme(plot.title = element_text(hjust = 3)) + scale_x_continuous(breaks = seq(1, 11, 1))  + ggrepel::geom_label_repel(aes(label=GameName),
    fill = "white",
    color = "black", size= 4.5,
    box.padding = unit(1.1, "lines")) +scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + theme(legend.position = "none")

b <-  ggplot(data =fifa , aes(Releaseyear ,TotalMoney, group=GameName,color =GameName )) + geom_line() + geom_point(size=5) + theme_bw()  + labs(y= "", y = "", caption = "") + theme(plot.title = element_text(hjust = 3)) + scale_x_continuous(breaks = seq(1, 11, 1))  + ggrepel::geom_label_repel(aes(label=GameName),
    fill = "white",
    color = "black", size= 4.5,
    box.padding = unit(1.1, "lines")) +scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + theme(legend.position = "none")

A la vista de lo que nos ofrecen los gráficos el apartado competitivo cada vez tiene un peso más importante en estas dos sagas ya que el aumento es claro en las dos. Por parte del Call of Duty el aumento es progresivo y sostenido durante los años y en caso del FIFA el aumento es mucho mas pronunciado y brusco. Los datos en los dos juegos bajan bruscamente en el 2020 pero esto es provocado por la pandemia y la suspensión de todos o casi todos los torneos presenciales que se iban a celebrar a nivel mundial.

10. Mapas sobre la situación mundial

En los siguientes mapas se muestran los países donde los jugadores nacionalizados allí son los que más dinero han ganado jugando a un juego por ejemplo en España son 3 juegos donde es un jugador o un equipo Español el que más dinero ha ganado.

También he querido hacerlo para Asia porque en algunos juegos como por ejemplo League of Legends mantienen desde unos años hacia aquí una ejemonia aplastante, y en otros juegos también están considerados como los mejores.

Pasando el cursor sobre el mapa puedes conocer en cuantos juegos este país es el que más ingresos tiene

aaa <- datos_earnings %>% group_by(Top_Country) %>% count() %>% filter(Top_Country != "United States")

#MAPITA EUROPA


aa <- aaa %>% filter(Top_Country != "Azerbaijan")  %>% filter(Top_Country != "Brazil") %>% filter(Top_Country != "Canada") %>% filter(Top_Country != "China") %>% filter(Top_Country != "Japan")  %>% filter(Top_Country != "Korea, Republic of")  %>% filter(Top_Country != "Japan")  %>% filter(Top_Country != "Malaysia") %>% filter(Top_Country != "Japan")  %>% filter(Top_Country != "None") %>% filter(Top_Country != "Taiwan, Republic of China") %>% filter(Top_Country != "Thailand") %>% filter(Top_Country != "Russian Federation")  %>% filter(Top_Country != "Mexico") %>% filter(Top_Country != "Saudi Arabia")

world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
world_points<- st_centroid(world)
world_points <- cbind(world, st_coordinates(st_centroid(world$geometry)))
df_inner <- inner_join(world, aa, by= c("sovereignt" = "Top_Country"))

europa <-ggplot() + geom_sf(data = world, color = "black") +
    geom_sf(data = df_inner, aes(geometry = geometry, fill = n))  + coord_sf(xlim = c(-13.00, 36.00), ylim = c(35, 67.44), expand = FALSE) +
  theme(panel.background = element_rect(fill = "azure"))  + scale_fill_viridis_c(direction = -1, option = "plasma") + theme_bw() + labs(title = "VICTORIAS PAÍSES EUROPEOS")

MAPA EUROPA


aaa$Top_Country <- recode(aaa$Top_Country, "Russian Federation"="Russia")
Asia <- aaa %>% filter(Top_Country %in% c("China", "Korea, Republic of","Malaysia","Russia","Singapore","Viet Nam", "Japan", "Azerbaijan", "Taiwan, Republic of China"))

world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
world_points<- st_centroid(world)
world_points <- cbind(world, st_coordinates(st_centroid(world$geometry)))
df_inner <- inner_join(world, Asia, by= c("sovereignt" = "Top_Country"))

asia <-ggplot() + geom_sf(data = world, color = "black") +
    geom_sf(data = df_inner, aes(geometry = geometry, fill = n))  + coord_sf(xlim = c(31.00, 180.00), ylim = c(-10, 80), expand = FALSE) +
  theme(panel.background = element_rect(fill = "azure"))  + scale_fill_viridis_c(direction = -1, option = "plasma") + theme_bw() + labs(title = "VICTORIAS PAÍSES ASIATICOS")

MAPA ASIA


11. Conclusiones y valoración personal

A raiz de lo expuesto en el trabajo y en los gráficos, lo primero de todo decir que R es una herramienta muy potente para hacer análisis de mercados y para entender cual puede ser la tendencia de ciertos valores en el futuro. Por lo que respecta a los Esports como se observa en los gráficos es un sector que sufre una expansión enorme tanto el sector competitivo como el de los videojuegos, que ha ido reinventandose ofreciendo una gama de productos diferentes ya sea el cambio hacia los juegos free to play o la variante competitiva de los videojuegos y la posibilidad de ver estas competiciones tanto presencialmente como a través de las diferentes plataformas de streaming que utilizan como YouTube, Twitch… Además a esto se une la nueva moda de los streamers que son personas que juegan a determinados juegos online y lo retrasmiten en las plataformas mencionadas anteriormente, esto lo aprovechan las desarrolladoras de videojuegos para hacer publicidad de sus juegos.

Me hubiese gustado encontrar mejores y más amplios datos para hacer este estudio más preciso y más amplio pero bueno, creo que con los datos que tenía he hecho un buen trabajo.

12. Material utilizado

Me he basado en un trabajo. que encontré buscando información sobre los esports y he completado la información y he adaptado sus gráficos a las necesidades de este trabajo.

También me he fijado en los trabajos en grupo de mis compañeros y he sacado muchas ideas valiosas que me han servido para adaptar mi trabajo aquí


Otras webs de consulta:

LS0tDQp0aXRsZTogIDxjZW50ZXI+PEZPTlQgQ09MT1I9IkZGNEQwMCI+QU7DgUxJU0lTIERFIExPUyBFU1BPUlRTPC9GT05UPjwvY2VudGVyPg0Kc3VidGl0bGU6ICJBbmRyZXUgRXNwYXJ6YSBpIE1hcnTDrW5leiINCmF1dGhvcjogIlVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCmRhdGU6ICIgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHNlbGZfY29udGFpbmVkOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogMyANCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgZGZfcHJpbnQ6IGthYmxlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KICANCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KbGlicmFyeShrbGlwcHkpIA0KbGlicmFyeShrbml0cikNCmBgYA0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSA3LzksIG91dC53aWR0aCA9ICI2MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCiMtIHBhcmEgbWVqb3JhciBsb3MgZ3LDoWZpY29zLCBidWVubyBlbiByZWFsaWRhZCBwYXJhIHF1ZSBzZSB2ZWFuIGlndWFsIGVuIGRpc3RpbnRvcyBTTw0KIy0gaHR0cHM6Ly93d3cuanVtcGluZ3JpdmVycy5jb20vYmxvZy9yLWtuaXRyLW1hcmtkb3duLXBuZy1wZGYtZ3JhcGhpY3MvDQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQ0KYGBgDQoNCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjLSBwYXJhIHF1aXRhciBsYSBub3RhY2nDs24gY2llbnTDrWZpY2ENCm9wdGlvbnMoInlhbWwuZXZhbC5leHByIiA9IFRSVUUpICMtIGh0dHBzOi8vZ2l0aHViLmNvbS92aWtpbmcvci15YW1sL2lzc3Vlcy80NyAgKGxvIHB1c2UgeCBlbCBwYiBjb24gZWwgd2FybmluZykgRW4gcmVhbGlkYWQgY3JlbyBxdWUgbWVqb3Igc2Vyw61hIHBvbmVybG8gZW4gUlByb2ZpbGUNCmBgYA0KDQoNCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCJ0b3AiLCAicmlnaHQiKSkgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KYGBgDQoNCmBgYCB7Y3NzLCBlY2hvPUZBTFNFfQ0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAxMTAsIDAsIDAuMikgLyogNTUlIG9wYXF1ZSB3aGl0ZSAqLzsNCiAgcGFkZGluZzogMC4xMGVtOw0KfQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPjxkaXYvPg0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9BbmRyZXVlc3BhcnphL3RyYWJham9fQmlnRGF0YSl7dGFyZ2V0PSJfYmxhbmsifS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjAtMjEtd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQojIyAxLiDCv1BvciBxdcOpIGxvcyBlc3BvcnRzPw0KDQpMb3MgZXNwb3J0cyBzb24gdW4gc2VjdG9yIGVuIGNvbnN0YW50ZSBleHBhbnNpw7NuIHkgY3JlY2ltaWVudG8uIFBlcm8sIHByaW1lcm8gcXVlIHRvZG86IA0KPEZPTlQgQ09MT1I9IkZGNEQwMCI+KirCv1F1w6kgZW50ZW5kZW1vcyBwb3IgZXNwb3J0cz8qKjwvRk9OVD4NCg0KDQoqKkxvcyBlc3BvcnRzIG8gZGVwb3J0ZXMgZWxlY3Ryw7NuaWNvcyBzb24gdW5hIHBhcnRlIHF1ZSBjb21wbGVtZW50YSBlbCBjYW1wbyBkZSBsb3MgdmlkZW9qdWVnb3MqKiBFc3RlIGNvbmNlcHRvIHNlIHV0aWxpemEgcGFyYSBub21icmFyIGxhcyBjb21wZXRpY2lvbmVzIG9yZ2FuaXphZGFzIGEgbml2ZWwgcHJvZmVzaW9uYWwgbyBzZW1pcHJvZmVzaW9uYWwgZG9uZGUgZGlmZXJlbnRlcyBwZXJzb25hcyBkZSB0b2RvIGVsIG11bmRvIGNvbXBpdGVuIHBvciBzZXIgbG9zIG1lam9yZXMuIEVzdGFzIGNvbXBldGljaW9uZXMgbXVsdGlqdWdhZG9yIHNlIGRhbiBlbiBkaWZlcmVudGVzICB2aWRlb2p1ZWdvcyBjb24gZXN0byBxdWllcm8gZGVjaXIgcXVlIG5vIHRvZG9zIGxvcyB2aWRlb2p1ZWdvcyB0aWVuZW4gdW5hIHBhcnRlIGNvbXBldGl0aXZhIChlc3BvcnRzKSwgbmkgcXVlIGVuIHRvZG9zIGxvcyBqdWVnb3Mgc2UgY29tcGl0ZSBkZSBsYSBtaXNtYSBmb3JtYSwgZXMgZGVjaXIgaGF5IGp1ZWdvcyBlbiBsb3MgcXVlIHNlIGNvbXBpdGUgaW5kaXZpZHVhbG1lbnRlIHkgZW4gb3Ryb3MgcG9yIGVxdWlwb3MsIGVuIGFsZ3Vub3Mgc2UgaGFjZSBkZSBmb3JtYSB2aXJ0dWFsIHkgZW4gb3Ryb3Mgc2UgaGFjZSBlbiBldmVudG9zIHByZXNlbmNpYWxlcy4NCg0KIyMgMi4gSGlzdG9yaWEgZGUgbG9zIGVzcG9ydHMNCjxicj4NCg0KIyMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKsK/Q3XDoWwgZnVlIGVsIHByaW1lciB0b3JuZW8gZGUgdmlkZW9qdWVnb3M/Kio8L0ZPTlQ+DQoNCkNyZW8gcXVlIHBhcmEgaGFjZXIgdW4gYnVlbiBhbsOhbGlzaXMgZXMgaW1wb3J0YW50ZSBzYWJlciBkZSBkb25kZSB2ZW5pbW9zIHkgY3VhbGVzIGZ1ZXJvbiBsb3Mgb3JpZ2VuZXMgZGUgbGEgY29tcGV0aWNpw7NuLCBlcyBhc8OtIHF1ZSBlbCBwcmltZXIgdG9ybmVvIGRlIHZpZGVvanVlZ29zIGRlIGxhIGhpc3RvcmlhIGxvIG9yZ2FuaXrDsyB1bmEgVW5pdmVyc2lkYWQsIGVuIGNvbmNyZXRvIGxhICoqVW5pdmVyc2lkYWQgZGUgU3RhbmZvcmQgZW4gMTk3MioqIHkgZnVlIHVuIHRvcm5lbyBkZSAiU3BhY2V3YXIiLiBFbCBwcmVtaW8sIHVuIGHDsW8gZGUgc3Vic2NyaXBjacOzbiBhIGxhIHJldmlzdGEgUm9sbGluZyBTdG9uZXMuICANCg0KPGJyPg0KDQo8Y2VudGVyPjxpbWcgc3JjPSJJbWFnZW5lcy9DYW1wZW9uYXRvX3NwYWNlX2ludmFkZXJzLmpwZyIgd2lkdGg9IjUwMHB4IiAvPjwvY2VudGVyPg0KDQo8YnI+DQpMYSBpbmTDunN0cmlhIGRlIGxvcyB2aWRlb2p1ZWdvcyBoYSBpZG8gY3JlY2llbmRvIHkgZXZvbHVjaW9uYW5kbyBkZXNkZSBzdXMgaW5pY2lvcyBvZnJlY2llbmRvIHVuYSBjYW50aWRhZCBkZSBqdWVnb3MgeSBlc3RpbG9zIG11eSBkaXZlcnNhcyBhIGxvIGxhcmdvIGRlbCB0aWVtcG8gaGFzdGEgYWxjYW56YXIgZW4gZWwgMjAxOSB1bmEgY2lmcmEgZGUgbmVnb2NpbyBjZXJjYW5hIGEgbG9zICoqMTUyLjEwMCBtaWxsb25lcyBkZSBkw7NsYXJlcyoqLiBBIGVzYSBpbmTDunN0cmlhIHNlIGhhIGHDsWFkaWRvIGxhIHBhcnRlIGNvbXBldGl0aXZhIGNvbW8gcGFydGUgZXNlbmNpYWwgZGUgYWxndW5vcyB2aWRlb2p1ZWdvcy4gRXMgZGUgZXN0byBkZSBsbyBxdWUgdHJhdGEgZXN0ZSB0cmFiYWpvIGVudGVuZGVyIGxhIGltcG9ydGFuY2lhIHF1ZSB0aWVuZSB0YW50byBlbCBzZWN0b3IgZGUgbG9zIHZpZGVvanVlZ29zIGNvbW8gc3UgcGFydGUgY29tcGV0aXRpdmEgeSBpbnRlbnRhciBkYXIgdW5hcyBwaW5jZWxhZGFzIGRlIGN1YWwgcHVlZGUgc2VyIGVsIGZ1dHVybyBkZSBlc3RhIGluZMO6c3RyaWEuDQoNCg0KDQojIyAzLkxvcyBkYXRvcyB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqRGF0b3MqKjwvRk9OVD4NCg0KTG9zIERhdG9zIHF1ZSBoZSB1dGlsaXphZG8gcGFyYSBoYWNlciBlbCB0cmFiYWpvIHNvbiBmdW5kYW1lbnRhbG1lbnRlIGxvcyBkYXRvcyBxdWUgaGUgZXh0cmFpZG8gZGUgW2FxdcOtXShodHRwczovL3d3dy5lc3BvcnRzZWFybmluZ3MuY29tL2dhbWVzL2Jyb3dzZS1ieS1nZW5yZSl7dGFyZ2V0PSJfYmxhbmsifSBlc3RhIHdlYiBlcyB1bmEgd2ViIHF1ZSBvZnJlY2UgbXVjaGlzaW1vcyBkYXRvcyBkaWZlcmVudGVzIHNvYnJlIGxvcyB2aWRlb2p1ZWdvcyB5IHRhbWJpw6luIHNvYnJlIGxvcyBkaWZlcmVudGVzIFRvcm5lb3MgbyBFdmVudG9zIHF1ZSBoYXkgYWxyZWRlZG9yIGRlbCBtdW5kby4NCg0KTGEgdmVyZGFkIG5vIGhhIHNpZG8gZsOhY2lsIGVuY29udHJhciBkYXRvcyBzb2JyZSBsb3MgdmlkZW9qdWVnb3MsIGFsIHByaW5jaXBpbyB0dXZlIHF1ZSBkZXNjYXJ0YXIgbGEgaWRlYSBkZSBoYWNlciBlc3RlIHRyYWJham8gcG9yIGxhIGZhbHRhIGRlIGRhdG9zIG1hbmVqYWJsZXMgcGFyYSBoYWNlciBlbCBtaXNtbywgcGVybyB1biBkaWEgcG9yIGNhc3VhbGlkYWQgbWUgZW52aWFyb24gZWwgZW5sYWNlIGEgZXN0YSBww6FnaW5hIHdlYiB5IGNvbiBsb3MgZGF0b3MgcXVlIGhheSBhcXXDrSBzaSBxdWUgaGUgcG9kaWRvIHJlYWxpemFyIGVsIHRyYWJham8uIE5vIG9ic3RhbnRlIHNpIGxvcyBkYXRvcyBodWJpZXNlbiBzaWRvIG3DoXMgYW1wbGlvcyBlc3RlIGFuYWxpc2lzIHBvZHLDrWEgc2VyIG11Y2hvIG3DoXMgY29tcGxldG8geSBtw6FzIHJlYWwsIHlhIHF1ZSBtZSBndXN0YXJpYSB0ZW5lciBpbmZvcm1hY2nDs24gZGUgcG9yIGVqZW1wbG8gbGEgY2FudGlkYWQgZGUganVnYWRvcmVzIG8gbG9zIGluZ3Jlc29zIHBvciBsYSB2ZW50YSBkZSBsb3MgdmlkZW9qdWVnb3MgbyBxdWUganVlZ29zIHNvbiBmcmVlIHRvIHBsYXkgeSBjdWFsZXMgbm8gbyBjb21vIGhhIGV2b2x1Y2lvbmFkbyBlbCBwcmVjaW8gZGUgdmVudGEgZGUgbG9zIHZpZGVvanVlZ29zLg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKlRpZHkqKjwvRk9OVD4NCg0KQ3VhbmRvIG1lIGRlc2Nhcmd1ZSBsb3MgZGF0b3MgZGUgbGEgcMOhZ2luYSB3ZWIgaGFiaWEgY2VyY2EgZGUgMTYwMDAganVlZ29zIHBlcm8gbGEgbWF5b3JpYSBkZSBlbGxvcyBubyB0ZW5pYW4gYXBhcnRhZG8gY29tcGV0aXRpdm8gcG9yIGxvIHRhbnRvIGxhIGNvbHVtbmEgZGUgVG90YWxNb25leSBxdWUgY3VlbnRhIGN1YW50byBkaW5lcm8gaGEgcmVwYXJ0aWRvIGVzdGFiYSB2YWNpYSB5IHBvciB0YW50byBubyBlcmFuIMO6dGlsZXMgcGFyYSBlbCBlc3R1ZGlvLCBhZGVtw6FzIHF1ZSBoYWJpYSBtdWNob3MganVlZ29zIGRlIGRpZmVyZW50ZXMgcGxhdGFmb3JtYXMgcXVlIG5vIG1lIGludGVyZXNhYmFuIHBhcmEgZXN0ZSBhbsOhbGlzaXMsIHVuYSB2ZXogZmlsdHJhZG9zIGxvcyBkYXRvcyBlc3RvcyBzb24gbG9zIHBhcXVldGVzIHF1ZSBoZSB1dGlsaXphZG8gcGFyYSBoYWNlciBsYSB0b3RhbGlkYWQgZGVsIHRyYWJham8uIA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShyb2JzZXJ2YWJsZSkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShnZ2FuaW1hdGUpDQpsaWJyYXJ5KGdpZnNraSkNCmxpYnJhcnkoQ2Fpcm8pDQpsaWJyYXJ5KHJlYWN0YWJsZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShzZikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KDQojSW1wb3J0byBsb3MgZGF0b3MgcGFyYSBsYSByZWFsaXphY2nDs24gZGVsIHRyYWJham86DQpkYXRvc19lYXJuaW5ncyA8LSByZWFkX2V4Y2VsKCJkYXRhL2RhdG9zX2Vhcm5pbmdzLnhsc3giKQ0KDQpgYGANCg0KIyMgNC5UYWJsYXMgZGUgY3VyaW9zaWRhZGVzIHsudGFic2V0fQ0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipFbCBqdWVnbyBxdWUgbcOhcyBkaW5lcm8gaGEgcmVwYXJ0aWRvKio8L0ZPTlQ+DQoNCg0KTWUgcGFyZWNpYSBjdXJpb3NvIHNhYmVyIGN1YWwgZXJhIGVsIGp1ZWdvIHF1ZSBtw6FzIGRpbmVybyBoYWJpYSByZXBhcnRpZG8gZW4gdG90YWwuIEVsIGRvdGEgMiBlcyBlbCBqdWVnbyBxdWUgaGEgcmVwYXJ0aWRvIG3DoXMgZGluZXJvLi4uLiBwZXJvIHF1ZSBlcyBlbCBkb3RhIDI/Li4uIEVsIGRvdGEgMiBlcyAgdmlkZW9qdWVnbyBwZXJ0ZW5lY2llbnRlIGFsIGfDqW5lcm8gZGUgQXJlbmEgZGUgYmF0YWxsYSBlbiBsw61uZWEgdGFtYmnDqW4gY29ub2NpZG8gY29tbyBNT0JBLCBsYW56YWRvIGVsIDkgZGUganVsaW8gZGVsIGHDsW8gMjAxMy4NCg0KKipRdWllbiBxdWllcmEgc2FiZXIgbcOhcyoqICBkZWpvIGVsIGVubGFjZSBhIGxhIHdpa2lwZWRpYSBkb25kZSBleHBsaWNhIG3DoXMgcHJvZnVuZGFtZW50ZSBlbCBzZW50aWRvIGRlbCBqdWVnby4NCltEb3RhIDJdKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL0RvdGFfMil7dGFyZ2V0PSJfYmxhbmsifQ0KYGBge3J9DQoNCm1hc19wcmVtaW9zIDwtIGRhdG9zX2Vhcm5pbmdzICU+JSBzbGljZV9tYXgoVG90YWxNb25leSwgbj0xKQ0KDQppbWFnZW5fZG90YTI8LSAiaHR0cHM6Ly9lc3Rubi5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTkvMDkvZG90YS0yLWhlYWRlci04MDB4NDUwLmpwZyINCmRmX2dyYWYgPC0gbWFzX3ByZW1pb3MgJT4lIGFkZF9jb2x1bW4oaW1hZ2VuX2RvdGEyKQ0KZGZfZ3JhZiA8LSBkZl9ncmFmICU+JSBzZWxlY3QoR2FtZU5hbWUsIFRvdGFsTW9uZXksIFRvdXJuYW1lbnRObywgaW1hZ2VuX2RvdGEyKQ0KDQoNCmxpYnJhcnkoZ3QpDQpUYWJsYV9kb3RhIDwtIGRmX2dyYWYgJT4lIGd0KCkNCg0KVGFibGFfZG90YSA8LSBUYWJsYV9kb3RhICU+JQ0KICAgICAgICAgICAgICAgICAgIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipFbCBqdWVnbyBjb24gbcOhcyBwcmVtaW9zIHJlcGFydGlkb3MqKiIpKQ0KDQpUYWJsYV9kb3RhIDwtIFRhYmxhX2RvdGEgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICJncmVlbiIpICU+JSB0YWJfb3B0aW9ucyhoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZSA9IDE1LCBoZWFkaW5nLnN1YnRpdGxlLmZvbnQuc2l6ZSA9IDEzLCAgY29sdW1uX2xhYmVscy5mb250LndlaWdodCA9ICAiYm9sZCIpDQoNCg0KVGFibGFfZG90YSA8LSBUYWJsYV9kb3RhICAlPiUNCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IHZhcnMoaW1hZ2VuX2RvdGEyKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lICBjb2xzX2FsaWduKGFsaWduID0gImNlbnRlciIpDQoNClRhYmxhX2RvdGENCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipFbCBwYcOtcyBxdWUgbcOhcyBkaW5lcm8gaGEgZ2FuYWRvKio8L0ZPTlQ+DQoNCk1lIHJlc3VsdGFiYSBpbnRlcmVzYW50ZSBzYWJlciBxdWUgcGHDrXMgZXJhIGVsIHF1ZSBlbiBtw6FzIGp1ZWdvcyBkaWZlcmVudGVzIGhhYmlhIHNpZG8gZWwgcGHDrXMgY29uIG3DoXMgaW5ncmVzb3MgeSBidWVubyBjb24gdW5hIGRpZmVyZW5jaWEgYWJpc21hbCBzb2JyZSBlbCBzZWd1bmRvIGVzIEVzdGFkb3MgVW5pZG9zLg0KDQpgYGB7cn0NCiNQYWlzIGNvbiBtYXMgZWFybmluZ3MgdG90YWxlcw0KDQphYSA8LSBkYXRvc19lYXJuaW5ncyAlPiUgIGdyb3VwX2J5KFRvcF9Db3VudHJ5KSAlPiUgc3VtbWFyaXNlKE4gPSBuKCkpDQoNCmJiIDwtIGFhICAlPiUgc2xpY2VfbWF4KE4sIG49IDEpDQoNCmltYWdlbl9FRVVVPC0gImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvYS9hNC9GbGFnX29mX3RoZV9Vbml0ZWRfU3RhdGVzLnN2Zy8zMDBweC1GbGFnX29mX3RoZV9Vbml0ZWRfU3RhdGVzLnN2Zy5wbmciDQoNCmRmX2dyYWYyIDwtIGJiICU+JSBhZGRfY29sdW1uKGltYWdlbl9FRVVVKQ0KVGFibGFfcGFpcyA8LSBkZl9ncmFmMiAlPiUgZ3QoKQ0KDQpUYWJsYV9wYWlzIDwtIFRhYmxhX3BhaXMgJT4lDQogICAgICAgICAgICAgICAgICAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkVsIHBhw61zIGNvbiBtYXlvciBkaXZlcnNpZGFkIGRlIGVhcm5pbmdzKioiKSkNCg0KVGFibGFfcGFpcyA8LSBUYWJsYV9wYWlzICU+JSAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gImdyZWVuIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTUsIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTMsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikNCg0KDQpUYWJsYV9wYWlzIDwtIFRhYmxhX3BhaXMgICU+JQ0KICBndDo6dGV4dF90cmFuc2Zvcm0obG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gdmFycyhpbWFnZW5fRUVVVSkpLCBmbiA9IGZ1bmN0aW9uKHgpIHtndDo6d2ViX2ltYWdlKHgsIGhlaWdodCA9IDUwKX0pICU+JSAgY29sc19hbGlnbihhbGlnbiA9ICJjZW50ZXIiKQ0KDQpUYWJsYV9wYWlzDQoNCmBgYA0KDQojIyA1LiBQb3JjZW50YWplIGRlIHByZW1pb3MgcmVwYXJ0aWRvcw0KYGBge3J9DQpkYXRvc19lYXJuaW5ncyRHYW1lTmFtZTwtIHJlY29kZShkYXRvc19lYXJuaW5ncyRHYW1lTmFtZSwgIkNvdW50ZXItU3RyaWtlOiBHbG9iYWwgT2ZmZW5zaXZlIiA9ICJDU0dPIiwiUExBWUVSVU5LTk9XTidTIEJBVFRMRUdST1VORFMiID0gIlBVQkciKQ0KDQpncmFmaWNvXyA8LWRhdG9zX2Vhcm5pbmdzICU+JQ0KICBtdXRhdGUoR2FtZU5hbWUgPSBmY3RfbHVtcF9uKGYgPSBHYW1lTmFtZSxuID0gMTAsdyA9IFRvdGFsTW9uZXksb3RoZXJfbGV2ZWwgPSAiT3Ryb3MiKSkgJT4lDQogIGdyb3VwX2J5KEdhbWVOYW1lKSAgJT4lDQogIHN1bW1hcmlzZShQcmVtaW9zID0gc3VtKFRvdGFsTW9uZXkpKSAlPiUNCiAgbXV0YXRlKFByb3BvcnRpb24gPSBQcmVtaW9zL3N1bShQcmVtaW9zKSwNCiAgR2FtZU5hbWUgPSBmY3RfcmVvcmRlciguZiA9IEdhbWVOYW1lLCAueCA9IFByb3BvcnRpb24sLmZ1biA9IG1heCwgLmRlc2MgPSBUUlVFKSwNCiBHYW1lTmFtZSA9IGZjdF9yZWxldmVsKC5mID0gR2FtZU5hbWUsICJPdHJvcyIsIGFmdGVyID0gSW5mKSkNCg0KIGdyYWZpY29fdG90YWw8LSBncmFmaWNvXyAlPiUgIGdncGxvdChhZXMoeCA9ICIiLHkgPSBQcm9wb3J0aW9uLGZpbGwgPSBHYW1lTmFtZSkpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLGNvbG9yID0gImJsYWNrIixhbHBoYSA9IDEpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpICsNCiAgbGFicyh0aXRsZSA9ICJDYW50aWRhZCBkZSBkaW5lcm8gcmVwYXJ0aWRhIiwgeSA9IGVsZW1lbnRfYmxhbmsoKSwgeCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICBmaWxsID0gIk5vbWJyZSBkZWwganVlZ28iKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpZmVsc2UoUHJvcG9ydGlvbiA+MC4wOCxwYXN0ZTAocm91bmQoUHJvcG9ydGlvbiwzKSoxMDAsIiUiKSwiIikpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCmdyYWZpY29fdG90YWwNCmBgYA0KDQpMYSBpbmZvcm1hY2nDs24gcXVlIG5vcyBtdWVzdHJhIGVsIGdyw6FmaWNvIGFudGVyaW9yIGhhY2UgcmVmZXJlbmNpYSBhIGN1YW50byBkaW5lcm8gc2UgaGEgcmVwYXJ0aWRvIGVuIGxvcyBkaWZlcmVudGVzIHRvcm5lb3MgeSBjdWFsZXMgc29uIGxvcyB2aWRlb2p1ZWdvcyBxdWUgbcOhcyBkaW5lcm8gcmVwYXJ0ZW4uIENvbW8gdmVtb3MgZWwganVlZ28gcXVlIG3DoXMgZGluZXJvIGhhIHJlcGFydGlkbyBjb24gbcOhcyBkZSB1bmEgY3VhcnRhIHBhcnRlIGRlbCB0b3RhbCByZXBhcnRpZG8gZXMgZWwgRG90YSAyIHNlZ3VpZG8gZGVsIENvdW50ZXItU3RyaWtlIHkgZGVsIEZvcnRuaXRlLiBFbCBjYXNvIG3DoXMgY3VyaW9zbyBkZSBsb3MgdHJlcyBlcyBlbCBjYXNvIGRlbCBGb3J0bml0ZSB5YSBxdWUgZXMgdW4ganVlZ28gbXV5IHJlY2llbnRlIGxhbnphZG8gZW4gMjAxNyB5IHF1ZSBlbiB0YW4gc29sbyAzIGHDsW9zIHNlIHNpdHVhIGNvbW8gZWwgdGVyY2VyIGp1ZWdvIHF1ZSBtw6FzIGRpbmVybyBoYSByZXBhcnRpZG8uIEVzdGEgY2FudGlkYWQgZGUgZGluZXJvIHRhbiBlbGV2YWRhIHF1ZSByZXBhcnRpw7MgZWwgRm9ydG5pdGUgc2UgY29uY2VudHLDsyBlbiBncmFuIG1lZGlkYSBlbiB1biBldmVudG8gKipXb3JsZCBDdXAqKiBkb25kZSBlbCBnYW5hZG9yIChCdWdoYSkgc2UgbGxldsOzIHVuIHByZW1pbyBkZSAzLjAwMC4wMDAgZGUgZMOzbGFyZXMgeSBjYWRhIHBhcnRpY2lwYW50ZSB0ZW5pYSB1biBwcmVtaW8gbcOtbmltbyBkZSA1MC4wMDAgZMOzbGFyZXMuDQoNCg0KIyMgNi4gRXZvbHVjacOzbiBkZSBsYSB0ZW3DoXRpY2EgZGUgbG9zIGp1ZWdvcyBwcmVzZW50YWRvcyBjYWRhIGHDsW8gey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKkdyw6FmaWNvKio8L0ZPTlQ+DQoNCkVuIGVzdGUgZ3LDoWZpY28gZGluw6FtaWNvIHF1ZXLDrWEgYW5hbGl6YXIgZGUgcXVlIHRlbcOhdGljYSBlcmFuIGxvcyB2aWRlb2p1ZWdvcyBxdWUgc2UgbGFuemFiYW4geSBzaSBsYXMgdGVtw6F0aWNhcyBoYW4gc3VmcmlkbyBjYW1iaW9zIGEgbG8gbGFyZ28gZGVsIHRpZW1wby4gQXVucXVlIHNlIHZlIG11eSByw6FwaWRvIHNlIHB1ZWRlIGhhY2VyIHVuYSBpZGVhIGRlIGxhIGV2b2x1Y2nDs24uIEFkZW3DoXMgdGFtYmnDqW4gc2Ugb2JzZXJ2YSBxdWUgY2FkYSB2ZXogc2UgbGFuemFuIHVuIG7Dum1lcm8gbWF5b3IgZGUgdmlkZW9qdWVnb3MuDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9IjEwMCUifQ0KZ3JhZmljb18zIDwtIGRhdG9zX2Vhcm5pbmdzICU+JSBzZWxlY3QoR2FtZU5hbWUsIFJlbGVhc2V5ZWFyLCBHZW5yZSkgJT4lDQogZ3JvdXBfYnkoUmVsZWFzZXllYXIpICU+JQ0KICBhcnJhbmdlKFJlbGVhc2V5ZWFyLCBHYW1lTmFtZSkgJT4lDQogIG11dGF0ZShyYW5raW5nID0gcm93X251bWJlcigpKSU+JSBmaWx0ZXIocmFua2luZyA8PSAxMSkNCg0KDQpjb3NhcyA8LSBkYXRvc19lYXJuaW5ncyAlPiUgZ3JvdXBfYnkoR2VucmUsIFJlbGVhc2V5ZWFyKSAlPiUgc3VtbWFyaXNlKE4gPSBuKCkpDQpjb3NhczIgPC0gY29zYXMgJT4lICByZW5hbWUoaWQ9R2VucmUpICU+JSByZW5hbWUoZGF0ZT1SZWxlYXNleWVhcikgJT4lICByZW5hbWUodmFsdWU9TikgJT4lIGZpbHRlcihkYXRlIT0gIjExIikgJT4lICBhcnJhbmdlKGRhdGUpDQoNCg0KanVlZ29zMiA8LSBkYXRvc19lYXJuaW5ncyAlPiUgc2VsZWN0KEdlbnJlLCBSZWxlYXNleWVhciwgR2FtZU5hbWUpDQoNCmp1ZWdvczIgPC0ganVlZ29zMiAlPiUgZ3JvdXBfYnkoUmVsZWFzZXllYXIsIEdlbnJlKSAlPiUgc3VtbWFyaXNlKE4gPSBuKCkpDQoNCmp1ZWdvczJhIDwtIGp1ZWdvczIgJT4lDQogIGdyb3VwX2J5KFJlbGVhc2V5ZWFyKSAlPiUNCiAgYXJyYW5nZShSZWxlYXNleWVhciwgZGVzYyhOKSkgJT4lDQogIG11dGF0ZShyYW5raW5nID0gcm93X251bWJlcigpKSU+JSBmaWx0ZXIocmFua2luZyA8PSAxMCkNCg0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpuYi5jb2xzIDwtIDExDQpteWNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoMTEsICJQYWlyZWQiKSkobmIuY29scykNCg0KbGlicmFyeShnZ2FuaW1hdGUpDQpncmFmaWNvX2ZpbmFsIDwtICAgZ2dwbG90KGp1ZWdvczJhKSsNCiAgZ2VvbV9jb2woYWVzKHJhbmtpbmcsTixmaWxsPUdlbnJlKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1teWNvbG9ycykrDQogIGdlb21fdGV4dChhZXMocmFua2luZyxOLGxhYmVsPWFzLmZhY3RvcihOKSksaGp1c3Q9LTAuMixzaXplPTUpKw0KICBnZW9tX3RleHQoYWVzKHJhbmtpbmcsIHk9MCAsIGxhYmVsID0gR2VucmUpLCBoanVzdD0xLjEsc2l6ZT01KSArDQogIGdlb21fdGV4dChhZXMoeD0xMCwgeT1tYXgoTikgLCBsYWJlbCA9IGFzLmZhY3RvcihSZWxlYXNleWVhcikpLCB2anVzdCA9IDAsIGhqdXN0PTAuNSwgYWxwaGEgPSAwLjEsICBjb2wgPSAiYmxhY2siLCBzaXplID0gMjApKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgbGEgdGVtw6F0aWNhIGRlIGxvcyBqdWVnb3MiLA0KICAgICAgIHg9TlVMTCwNCiAgICAgICB5PU5VTEwpKw0KICBjb29yZF9mbGlwKGNsaXAgPSAib2ZmIikrDQogIHNjYWxlX3hfcmV2ZXJzZSgpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemU9MjAsZmFjZT0iYm9sZCIpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZT0xMiwgZmFjZT0iaXRhbGljIiksDQogICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEsIDQsIDEsIDMsICJjbSIpKSsNCiAgdHJhbnNpdGlvbl9zdGF0ZXMoUmVsZWFzZXllYXIsdHJhbnNpdGlvbl9sZW5ndGggPSAxLHN0YXRlX2xlbmd0aCA9IDAsd3JhcCA9IEZBTFNFKQ0KDQpsaWJyYXJ5KGdpZnNraSkNCmxpYnJhcnkoQ2Fpcm8pDQoNCg0KIGFuaW1hdGUgKGdyYWZpY29fZmluYWwsDQogICAgICAgIG5mcmFtZXMgPSAxMDAwLA0KICAgICAgICBmcHMgPSAzMCwNCiAgICAgICAgZW5kX3BhdXNlID0gMTUwLA0KICAgICAgICB3aWR0aCA9IDEwMDAsDQogICAgICAgIGhlaWdodCA9IDYwMCwNCiAgICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqQ8OzZGlnbyoqPC9GT05UPg0KDQpgYGB7ciBlY2hvPVRSVUUsIGV2YWw9RkFMU0V9DQpncmFmaWNvXzMgPC0gZGF0b3NfZWFybmluZ3MgJT4lIHNlbGVjdChHYW1lTmFtZSwgUmVsZWFzZXllYXIsIEdlbnJlKSAlPiUNCiBncm91cF9ieShSZWxlYXNleWVhcikgJT4lDQogIGFycmFuZ2UoUmVsZWFzZXllYXIsIEdhbWVOYW1lKSAlPiUNCiAgbXV0YXRlKHJhbmtpbmcgPSByb3dfbnVtYmVyKCkpJT4lIGZpbHRlcihyYW5raW5nIDw9IDExKQ0KDQoNCmNvc2FzIDwtIGRhdG9zX2Vhcm5pbmdzICU+JSBncm91cF9ieShHZW5yZSwgUmVsZWFzZXllYXIpICU+JSBzdW1tYXJpc2UoTiA9IG4oKSkNCmNvc2FzMiA8LSBjb3NhcyAlPiUgIHJlbmFtZShpZD1HZW5yZSkgJT4lIHJlbmFtZShkYXRlPVJlbGVhc2V5ZWFyKSAlPiUgIHJlbmFtZSh2YWx1ZT1OKSAlPiUgZmlsdGVyKGRhdGUhPSAiMTEiKSAlPiUgIGFycmFuZ2UoZGF0ZSkNCg0KDQpqdWVnb3MyIDwtIGRhdG9zX2Vhcm5pbmdzICU+JSBzZWxlY3QoR2VucmUsIFJlbGVhc2V5ZWFyLCBHYW1lTmFtZSkNCg0KanVlZ29zMiA8LSBqdWVnb3MyICU+JSBncm91cF9ieShSZWxlYXNleWVhciwgR2VucmUpICU+JSBzdW1tYXJpc2UoTiA9IG4oKSkNCg0KanVlZ29zMmEgPC0ganVlZ29zMiAlPiUNCiAgZ3JvdXBfYnkoUmVsZWFzZXllYXIpICU+JQ0KICBhcnJhbmdlKFJlbGVhc2V5ZWFyLCBkZXNjKE4pKSAlPiUNCiAgbXV0YXRlKHJhbmtpbmcgPSByb3dfbnVtYmVyKCkpJT4lIGZpbHRlcihyYW5raW5nIDw9IDEwKQ0KDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCm5iLmNvbHMgPC0gMTENCm15Y29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCgxMSwgIlBhaXJlZCIpKShuYi5jb2xzKQ0KDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmdyYWZpY29fZmluYWwgPC0gICBnZ3Bsb3QoanVlZ29zMmEpKw0KICBnZW9tX2NvbChhZXMocmFua2luZyxOLGZpbGw9R2VucmUpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW15Y29sb3JzKSsNCiAgZ2VvbV90ZXh0KGFlcyhyYW5raW5nLE4sbGFiZWw9YXMuZmFjdG9yKE4pKSxoanVzdD0tMC4yLHNpemU9NSkrDQogIGdlb21fdGV4dChhZXMocmFua2luZywgeT0wICwgbGFiZWwgPSBHZW5yZSksIGhqdXN0PTEuMSxzaXplPTUpICsNCiAgZ2VvbV90ZXh0KGFlcyh4PTEwLCB5PW1heChOKSAsIGxhYmVsID0gYXMuZmFjdG9yKFJlbGVhc2V5ZWFyKSksIHZqdXN0ID0gMCwgaGp1c3Q9MC41LCBhbHBoYSA9IDAuMSwgIGNvbCA9ICJibGFjayIsIHNpemUgPSAyMCkrDQogIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsYSB0ZW3DoXRpY2EgZGUgbG9zIGp1ZWdvcyIsDQogICAgICAgeD1OVUxMLA0KICAgICAgIHk9TlVMTCkrDQogIGNvb3JkX2ZsaXAoY2xpcCA9ICJvZmYiKSsNCiAgc2NhbGVfeF9yZXZlcnNlKCkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZT0yMCxmYWNlPSJib2xkIiksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplPTEyLCBmYWNlPSJpdGFsaWMiKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMSwgNCwgMSwgMywgImNtIikpKw0KICB0cmFuc2l0aW9uX3N0YXRlcyhSZWxlYXNleWVhcix0cmFuc2l0aW9uX2xlbmd0aCA9IDEsc3RhdGVfbGVuZ3RoID0gMCx3cmFwID0gRkFMU0UpDQoNCmxpYnJhcnkoZ2lmc2tpKQ0KbGlicmFyeShDYWlybykNCg0KDQogYW5pbWF0ZSAoZ3JhZmljb19maW5hbCwNCiAgICAgICAgbmZyYW1lcyA9IDEwMDAsDQogICAgICAgIGZwcyA9IDMwLA0KICAgICAgICBlbmRfcGF1c2UgPSAxNTAsDQogICAgICAgIHdpZHRoID0gMTAwMCwNCiAgICAgICAgaGVpZ2h0ID0gNjAwLA0KICAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQoNCg0KIyMgNy4gVmFyaWFjacOzbiBkZSBsYSB0ZW3DoXRpY2EgZGUgbG9zIHZpZGVvanVlZ29zDQoNCmBgYHtyfQ0KZGF0b3NfZWFybmluZ3MkR2VucmU8LSByZWNvZGUoZGF0b3NfZWFybmluZ3MkR2VucmUsICJGaXJzdC1QZXJzb24gU2hvb3RlciIgPSAiRlBTIiwiTXVsdGlwbGF5ZXIgT25saW5lIEJhdHRsZSBBcmVuYSIgPSAiTU9CQSIpDQoNCmNvZGlnb19ncmFmaWNvX2NvbXBsZW1lbnRhcmlvIDwtIGRhdG9zX2Vhcm5pbmdzICU+JSAgbXV0YXRlKFJlbGVhc2VHcm91cCA9IGlmZWxzZShSZWxlYXNleWVhciA8PSAyMDEwLCJBbnRlcyBkZWwgMjAxMCIsIGlmZWxzZShSZWxlYXNleWVhciA8PSAyMDE1LCIyMDExIC0gMjAxNSIsIjIwMTYtQWN0dWFsaWRhZCIpKSkNCg0KICBncmFmaWNvX2NvbXBsZW1lbnRhcmlvIDwtIGNvZGlnb19ncmFmaWNvX2NvbXBsZW1lbnRhcmlvICU+JSAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKEdlbnJlLGxldmVscyA9IGMoIlN0cmF0ZWd5IiwiRmlnaHRpbmcgR2FtZSIsIlJhY2luZyIsIlNwb3J0cyIsIkZQUyIsIk1PQkEiLCJCYXR0bGUgUm95YWxlIikpLCBmaWxsID0gZmFjdG9yKFJlbGVhc2VHcm91cCxsZXZlbHMgPSBjKCJBbnRlcyBkZWwgMjAxMCIsIjIwMTEgLSAyMDE1IiwiMjAxNi1BY3R1YWxpZGFkIikpKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIixjb2xvciA9ICJibGFjayIsYWxwaGEgPSAwLjc1KSArDQogIGxhYnMoZmlsbCA9ICJQZXLDrW9kbyBkZSBsYW56YW1pZW50byIsIHggPSBlbGVtZW50X2JsYW5rKCksIHkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArDQogIGxhYnModGl0bGUgPSAiQ29tbyBoYSBjYW1iaWFkbyBlbCBnZW5lcm8gZGUgbG9zIGp1ZWdvcyBsYW56YWRvcyIsY2FwdGlvbiA9IipObyBoZSBzZWxlY2Npb25hZG8gdG9kYXMgbGFzIHZhcmlhYmxlcyBwb3JxdWUgaGF5IGFsZ3VuYXMgcXVlIHNvbiBwb2NvIHJlbGV2YW50ZXMiKQ0KDQpncmFmaWNvX2NvbXBsZW1lbnRhcmlvDQpgYGANCg0KDQoNCkVzdGUgZ3LDoWZpY28gaW50ZW50YSBjb21wbGVtZW50YXIgbGEgaW5mb3JtYWNpw7NuIHF1ZSBzZSBtdWVzdHJhIGVuIGVsIGdyw6FmaWNvIGRpbsOhbWljbyBhbnRlcmlvciwgbG8gcXVlIHByZXRlbmRvIG1vc3RyYXIgZXMgc2kgaGFuIGhhYmlkbyBjYW1iaW9zIGVuIGxhcyBwcmVmZXJlbmNpYXMgZGUgbG9zIGNvbnN1bWlkb3JlcyBzb2JyZSBsYXMgdGVtw6F0aWNhcyBkZSBsb3MgdmlkZW9qdWVnb3MgYWdydXBhbmRvIGVuIHRyZXMgZXRhcGFzOiBhbnRlcyBkZWwgMjAxMCBlbnRyZSBlbCAyMDEwIHkgZWwgMjAxNSB5IGRlbCAyMDE2IGEgbGEgYWN0dWFsaWRhZC4gQ29tbyBvYnNlcnZhbW9zIGVuIGVsIGdyw6FmaWNvIGxvcyBCYXR0bGUgUm95YWxlIHNvbiB1biBnw6luZXJvIG11eSByZWNpZW50ZSB5YSBxdWUgc29sbyBzZSBkYW4gYSBwYXJ0aXIgZGVsIDIwMTYsIHRhbWJpw6luIHBvZGVtb3MgdmVyIHF1ZSBoYSBhdW1lbnRhZG8gcmVjaWVudGVtZW50ZSBsYSBwcmVzZW50YWNpw7NuIGRlIGp1ZWdvcyBkZSBlc3RyYXTDqWdpYSBxdWUgZW50cmUgZWwgMjAxMCB5IGVsIDIwMTUgcHLDoWN0aWNhbWVudGUgbm8gc2UgcHJlc2VudGFyb24ganVlZ29zLiBFbiBsb3Mgb3Ryb3MgZ8OpbmVyb3MgbGEgZGlzdHJpYnVjacOzbiBhIHRyYXbDqXMgZGUgbG9zIGHDsW9zIGVzIG3DoXMgbyBtZW5vcyBsYSBtaXNtYSBlc3RvIHB1ZWRlIHZlbmlyIGRhZG8gcG9yIGRpdmVyc29zIGZhY3RvcmVzIGNvbW8gcG9yIGVqZW1wbG8gcXVlIG11Y2hvcyBqdWVnb3MgZGUgZGVwb3J0ZXMgc2FjYW4gdW5hIGVkaWNpw7NuIGNhZGEgYcOxbyBwb3IgbG8gdGFudG8gbGEgcHVibGljYWNpw7NuIGVzIGNvbnN0YW50ZS4NCg0KDQoNCiMjIDguIFRhYmxhIEp1ZWdvcw0KDQpBIHBhcnRpciBkZSBsYSBzaWd1aWVudGUgdGFibGEgcHVlZGVzIGNvbnN1bHRhciB1biBqdWVnbyB5IHZlciBlbCBnw6luZXJvIGFsIHF1ZSBwZXJldGVuZWNlLCBhc8OtIGNvbW8gZWwgbsO6bWVybyBkZSB0b3JuZW9zIHF1ZSBzZSBoYW4gcmVhbGl6YWRvIHkgZWwgZGluZXJvIHRvdGFsLiANCg0KYGBge3J9DQpkYXRvc19idXNjYXIgPC0gZGF0b3NfZWFybmluZ3MgJT4lIGZpbHRlcihUb3RhbE1vbmV5PjUwMDAwMCkNCmRhdG9zX2J1c2NhciA8LSBkYXRvc19idXNjYXIgJT4lICBzZWxlY3QoR2FtZU5hbWUsR2VucmUsVG91cm5hbWVudE5vLFRvdGFsTW9uZXkpICU+JSBhcnJhbmdlKEdlbnJlLFRvdGFsTW9uZXkpDQpuYW1lcyhkYXRvc19idXNjYXIpPSBjKCJOb21icmUgZGVsIEp1ZWdvIiwgIkfDqW5lcm8iLCAiTsO6bWVybyBkZSBUb3JuZW9zIiwgIkRpbmVybyBUb3RhbCIpDQoNCg0KcmVhY3RhYmxlKGRhdG9zX2J1c2NhciwgZGVmYXVsdFBhZ2VTaXplID0gIDEwLCAgcGFnaW5hdGlvblR5cGUgPSAianVtcCIsIHNob3dQYWdlU2l6ZU9wdGlvbnMgPSAgVFJVRSAsIHBhZ2VTaXplT3B0aW9ucyA9ICBjICggMTAgLCA1MCAsIDEwMCApLGRlZmF1bHRDb2xEZWYgPSBjb2xEZWYoDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICBtaW5XaWR0aCA9IDcwLA0KICAgIGhlYWRlclN0eWxlID0gbGlzdChiYWNrZ3JvdW5kID0gImxpZ2h0Z3JlZW4iKSwNCiAgICBmaWx0ZXJhYmxlID0gVFJVRSksICBoaWdobGlnaHQgPSBUUlVFLCBvdXRsaW5lZCA9IFRSVUUsDQogICAgY29sdW1ucyA9IGxpc3QoYE7Dum1lcm8gZGUgVG9ybmVvc2ANCiAgID0gY29sRGVmKHN0eWxlID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgICBpZiAodmFsdWUgPiAxMDApIHsNCiAgICAgIGNvbG9yIDwtICIjMDA4MDAwIn0NCiAgICAgIGVsc2Ugew0KICAgICAgY29sb3IgPC0gIiM0ODE0ZjUiDQogICAgfQ0KICAgIGxpc3QoY29sb3IgPSBjb2xvciwgZm9udFdlaWdodCA9ICJib2xkIikNCiAgfSkpKQ0KDQoNCmBgYA0KDQoNCiMjIDkuIEhhYmxlbW9zIGRlIFNhZ2FzIG3DrXRpY2FzDQogDQoNCk5vIHBvZGVtb3MgaGFibGFyIGRlIHZpZGVvanVlZ29zIHkgbm8gcGVuc2FyIGVuIGN1YWxxdWllcmEgZGUgZXN0YXMgZG9zIHNhZ2FzIG3DrXRpY2FzIHkgZXMgcXVlLiBRdWnDqW4gbm8gaGEgb2lkbyBoYWJsYXIgZGVsICoqRklGQSBvIGRlbCBDYWxsIG9mIER1dHk/Li4uKiogDQoNCkJpZW4sIGVuIGxvcyBzaWd1aWVudGVzIGdyw6FmaWNvcyBoZSBxdWVyaWRvIG1vc3RyYXIgY3VhbCBoYSBzaWRvIGVsIGludGVyw6lzIHF1ZSBoYW4gdGVuaWRvIGVzdGFzIHNhZ2FzIGVuIGVsIGFwYXJ0YWRvIGNvbXBldGl0aXZvIHlhIHF1ZSBlcyBlbiBlc3RlIGRvbmRlIHNlIHJlcGFydGVuIGxvcyBwcmVtaW9zLiANCg0KUGFyYSBsb2dyYXJsbyAgaGUgaGVjaG8gbG9zIHNpZ3VpZW50ZXMgZ3LDoWZpY29zIGRlIHB1bnRvcyBkb25kZSBsb3MganVlZ29zIHNlIG9yZGVuYW4gZW4gZWwgZWplIFggc2Vnw7puIHN1IGZlY2hhIGRlIGxhbnphbWllbnRvLiBIZSB1dGlsaXphZG8gbG9zIGRhdG9zIGRlIGVzdGFzIGRvcyBtw610aWNhcyBzYWdhcyBkZSB2aWRlb2p1ZWdvcyBwb3IgZG9zIG1vdGl2b3MsIHNvbiBkb3MgZGUgbGFzIG3DoXMgaW1wb3J0YW50ZXMgeSBwb3Igb3RybyBsYWRvIHRpZW5lbiB1bmEgc2ltaWxpdHVkIG11eSBpbXBvcnRhbnRlIHlhIHF1ZSBhbWJhcyBzYWdhcyBkZXNkZSBlbCBhw7FvIDIwMDkgcHJlc2VudGFuIHVuIGp1ZWdvIGFudWFsbWVudGUgbG8gcXVlIG5vcyBwdWVkZSBkYXIgaW5mb3JtYWNpw7NuIGRlIGNvbW8gaGEgZXZvbHVjaW9uYWRvIGxhIGltcG9ydGFuY2lhIGRlbCBhcGFydGFkbyBjb21wZXRpdGl2byBlbiBsb3MganVlZ29zLCB0cmF0YW5kb3NlIGFkZW3DoXMgZGUganVlZ29zIGRlIMOtbmRvbGUgZGlmZXJlbnRlIHlhIHF1ZSB1bm8gdHJhdGEgc29icmUgZsO6dGJvbCB5IGVsIG90cm8gZXMgdW4gU2hvb3RlciBlbiBwcmltZXJhIHBlcnNvbmEuIA0KIA0KIA0KYGBge3J9DQpDYWxsX29mX0R1dHkgPC0gZGF0b3NfZWFybmluZ3MgJT4lIGZpbHRlcihHYW1lTmFtZSAlaW4lIGMoIkNhbGwgb2YgRHV0eTogQWR2YW5jZWQgV2FyZmFyZSIsICJDYWxsIG9mIER1dHk6IEJsYWNrIE9wcyIsICJDYWxsIG9mIER1dHk6IEJsYWNrIE9wcyAyIiwgIkNhbGwgb2YgRHV0eTogQmxhY2sgT3BzIDQiLCAiQ2FsbCBvZiBEdXR5OiBCbGFjayBPcHMgSUlJIiwiQ2FsbCBvZiBEdXR5OiBHaG9zdHMiLCAiQ2FsbCBvZiBEdXR5OiBJbmZpbml0ZSBXYXJmYXJlIiwgIkNhbGwgb2YgRHV0eTogTW9kZXJuIFdhcmZhcmUiLCAiQ2FsbCBvZiBEdXR5OiBNb2Rlcm4gV2FyZmFyZSAyIiwgIkNhbGwgb2YgRHV0eTogTW9kZXJuIFdhcmZhcmUgMyIsICJDYWxsIG9mIER1dHk6IFdvcmxkIFdhciBJSSINCikpDQpDYWxsX29mX0R1dHkkR2FtZU5hbWU8LSByZWNvZGUoQ2FsbF9vZl9EdXR5JEdhbWVOYW1lLCAiQ2FsbCBvZiBEdXR5OiBBZHZhbmNlZCBXYXJmYXJlIiA9ICJBZHZhbmNlZCBXYXJmYXJlIiwiQ2FsbCBvZiBEdXR5OiBCbGFjayBPcHMiPSJCbGFjayBPcHMiLCAiQ2FsbCBvZiBEdXR5OiBCbGFjayBPcHMgMiI9IkJsYWNrIE9wcyAyIiwgIkNhbGwgb2YgRHV0eTogQmxhY2sgT3BzIDQiPSJCbGFjayBPcHMgNCIsICJDYWxsIG9mIER1dHk6IEJsYWNrIE9wcyBJSUkiPSJCbGFjayBPcHMgSUlJIiwiQ2FsbCBvZiBEdXR5OiBHaG9zdHMiPSJHaG9zdHMiLCAiQ2FsbCBvZiBEdXR5OiBJbmZpbml0ZSBXYXJmYXJlIj0gIkluZmluaXRlIFdhcmZhcmUiLCAiQ2FsbCBvZiBEdXR5OiBNb2Rlcm4gV2FyZmFyZSI9Ik1vZGVybiBXYXJmYXJlIiwgIkNhbGwgb2YgRHV0eTogTW9kZXJuIFdhcmZhcmUgMiI9Ik1vZGVybiBXYXJmYXJlIDIiLCAiQ2FsbCBvZiBEdXR5OiBNb2Rlcm4gV2FyZmFyZSAzIj0iTW9kZXJuIFdhcmZhcmUgMyIsICJDYWxsIG9mIER1dHk6IFdvcmxkIFdhciBJSSI9IldvcmxkIFdhciBJSSIpDQoNCmZpZmEgPC0gZGF0b3NfZWFybmluZ3MgJT4lIGZpbHRlcihHYW1lTmFtZSAlaW4lIGMoICJGSUZBIDEwIiwgIkZJRkEgMTEiLCAiRklGQSAxMiIsICJGSUZBIDEzIiwgIkZJRkEgMTQiLCAiRklGQSAxNSIsICJGSUZBIDE2IiwgIkZJRkEgMTciLCAiRklGQSAxOCIsICJGSUZBIDE5IiwgIkZJRkEgMjAiKSkNCg0KQ2FsbCA8LSBDYWxsX29mX0R1dHkgJT4lIHNlbGVjdChSZWxlYXNleWVhciwgR2FtZU5hbWUsVG90YWxNb25leSkgJT4lIGFycmFuZ2UoUmVsZWFzZXllYXIpDQoNCg0KYSA8LSBnZ3Bsb3QoZGF0YSA9Q2FsbF9vZl9EdXR5ICwgYWVzKFJlbGVhc2V5ZWFyICxUb3RhbE1vbmV5LCBncm91cD1HYW1lTmFtZSxjb2xvciA9R2FtZU5hbWUgKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoc2l6ZT01KSArIHRoZW1lX2J3KCkgICsgbGFicyh5PSAiIiwgeSA9ICIiLCBjYXB0aW9uID0gIiIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDMpKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMSwgMTEsIDEpKSAgKyBnZ3JlcGVsOjpnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1HYW1lTmFtZSksDQogICAgZmlsbCA9ICJ3aGl0ZSIsDQogICAgY29sb3IgPSAiYmxhY2siLCBzaXplPSA0LjUsDQogICAgYm94LnBhZGRpbmcgPSB1bml0KDEuMSwgImxpbmVzIikpICtzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKG4pe2Zvcm1hdChuLCBzY2llbnRpZmljID0gRkFMU0UpfSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmIgPC0gIGdncGxvdChkYXRhID1maWZhICwgYWVzKFJlbGVhc2V5ZWFyICxUb3RhbE1vbmV5LCBncm91cD1HYW1lTmFtZSxjb2xvciA9R2FtZU5hbWUgKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoc2l6ZT01KSArIHRoZW1lX2J3KCkgICsgbGFicyh5PSAiIiwgeSA9ICIiLCBjYXB0aW9uID0gIiIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDMpKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMSwgMTEsIDEpKSAgKyBnZ3JlcGVsOjpnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1HYW1lTmFtZSksDQogICAgZmlsbCA9ICJ3aGl0ZSIsDQogICAgY29sb3IgPSAiYmxhY2siLCBzaXplPSA0LjUsDQogICAgYm94LnBhZGRpbmcgPSB1bml0KDEuMSwgImxpbmVzIikpICtzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKG4pe2Zvcm1hdChuLCBzY2llbnRpZmljID0gRkFMU0UpfSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9Ijg1JSJ9DQpQIDwtIChhIC8gYikNClAgKyBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiRXZvbHVjacOzbiBkZWwgZGluZXJvIHJlcGFydGlkbyBlbiBlbCBDQUxMIE9GIERVVFRZIHkgZWwgRklGQSIpDQpgYGANCg0KQSBsYSB2aXN0YSBkZSBsbyBxdWUgbm9zIG9mcmVjZW4gbG9zIGdyw6FmaWNvcyBlbCBhcGFydGFkbyBjb21wZXRpdGl2byBjYWRhIHZleiB0aWVuZSB1biBwZXNvIG3DoXMgaW1wb3J0YW50ZSBlbiBlc3RhcyBkb3Mgc2FnYXMgeWEgcXVlIGVsIGF1bWVudG8gZXMgY2xhcm8gZW4gbGFzIGRvcy4gUG9yIHBhcnRlIGRlbCAqKkNhbGwgb2YgRHV0eSoqIGVsIGF1bWVudG8gZXMgcHJvZ3Jlc2l2byB5IHNvc3RlbmlkbyBkdXJhbnRlIGxvcyBhw7FvcyB5IGVuIGNhc28gZGVsICoqRklGQSoqIGVsIGF1bWVudG8gZXMgbXVjaG8gbWFzIHByb251bmNpYWRvIHkgYnJ1c2NvLiBMb3MgZGF0b3MgZW4gbG9zIGRvcyBqdWVnb3MgYmFqYW4gYnJ1c2NhbWVudGUgZW4gZWwgMjAyMCBwZXJvIGVzdG8gZXMgcHJvdm9jYWRvIHBvciBsYSBwYW5kZW1pYSB5IGxhIHN1c3BlbnNpw7NuIGRlIHRvZG9zIG8gY2FzaSB0b2RvcyBsb3MgdG9ybmVvcyBwcmVzZW5jaWFsZXMgcXVlIHNlIGliYW4gYSBjZWxlYnJhciBhIG5pdmVsIG11bmRpYWwuIA0KDQoNCiMjIDEwLiBNYXBhcyBzb2JyZSBsYSBzaXR1YWNpw7NuIG11bmRpYWwNCg0KDQpFbiBsb3Mgc2lndWllbnRlcyBtYXBhcyBzZSBtdWVzdHJhbiBsb3MgcGHDrXNlcyBkb25kZSBsb3MganVnYWRvcmVzIG5hY2lvbmFsaXphZG9zIGFsbMOtIHNvbiBsb3MgcXVlIG3DoXMgZGluZXJvIGhhbiBnYW5hZG8ganVnYW5kbyBhIHVuIGp1ZWdvIHBvciBlamVtcGxvIGVuIEVzcGHDsWEgc29uIDMganVlZ29zIGRvbmRlIGVzIHVuIGp1Z2Fkb3IgbyB1biBlcXVpcG8gRXNwYcOxb2wgZWwgcXVlIG3DoXMgZGluZXJvIGhhIGdhbmFkby4NCg0KVGFtYmnDqW4gaGUgcXVlcmlkbyBoYWNlcmxvIHBhcmEgQXNpYSBwb3JxdWUgZW4gYWxndW5vcyBqdWVnb3MgY29tbyBwb3IgZWplbXBsbyAqKkxlYWd1ZSBvZiBMZWdlbmRzKiogbWFudGllbmVuIGRlc2RlIHVub3MgYcOxb3MgaGFjaWEgYXF1w60gdW5hIGVqZW1vbmlhIGFwbGFzdGFudGUsIHkgZW4gb3Ryb3MganVlZ29zIHRhbWJpw6luIGVzdMOhbiBjb25zaWRlcmFkb3MgY29tbyBsb3MgbWVqb3Jlcy4NCg0KKipQYXNhbmRvIGVsIGN1cnNvciBzb2JyZSBlbCBtYXBhIHB1ZWRlcyBjb25vY2VyIGVuIGN1YW50b3MganVlZ29zIGVzdGUgcGHDrXMgZXMgZWwgcXVlIG3DoXMgaW5ncmVzb3MgdGllbmUqKg0KDQoNCg0KYGBge3J9DQphYWEgPC0gZGF0b3NfZWFybmluZ3MgJT4lIGdyb3VwX2J5KFRvcF9Db3VudHJ5KSAlPiUgY291bnQoKSAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJVbml0ZWQgU3RhdGVzIikNCg0KI01BUElUQSBFVVJPUEENCg0KDQphYSA8LSBhYWEgJT4lIGZpbHRlcihUb3BfQ291bnRyeSAhPSAiQXplcmJhaWphbiIpICAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJCcmF6aWwiKSAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJDYW5hZGEiKSAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJDaGluYSIpICU+JSBmaWx0ZXIoVG9wX0NvdW50cnkgIT0gIkphcGFuIikgICU+JSBmaWx0ZXIoVG9wX0NvdW50cnkgIT0gIktvcmVhLCBSZXB1YmxpYyBvZiIpICAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJKYXBhbiIpICAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJNYWxheXNpYSIpICU+JSBmaWx0ZXIoVG9wX0NvdW50cnkgIT0gIkphcGFuIikgICU+JSBmaWx0ZXIoVG9wX0NvdW50cnkgIT0gIk5vbmUiKSAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJUYWl3YW4sIFJlcHVibGljIG9mIENoaW5hIikgJT4lIGZpbHRlcihUb3BfQ291bnRyeSAhPSAiVGhhaWxhbmQiKSAlPiUgZmlsdGVyKFRvcF9Db3VudHJ5ICE9ICJSdXNzaWFuIEZlZGVyYXRpb24iKSAgJT4lIGZpbHRlcihUb3BfQ291bnRyeSAhPSAiTWV4aWNvIikgJT4lIGZpbHRlcihUb3BfQ291bnRyeSAhPSAiU2F1ZGkgQXJhYmlhIikNCg0Kd29ybGQgPC0gcm5hdHVyYWxlYXJ0aDo6bmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCndvcmxkX3BvaW50czwtIHN0X2NlbnRyb2lkKHdvcmxkKQ0Kd29ybGRfcG9pbnRzIDwtIGNiaW5kKHdvcmxkLCBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZCh3b3JsZCRnZW9tZXRyeSkpKQ0KZGZfaW5uZXIgPC0gaW5uZXJfam9pbih3b3JsZCwgYWEsIGJ5PSBjKCJzb3ZlcmVpZ250IiA9ICJUb3BfQ291bnRyeSIpKQ0KDQpldXJvcGEgPC1nZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHdvcmxkLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX3NmKGRhdGEgPSBkZl9pbm5lciwgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBuKSkgICsgY29vcmRfc2YoeGxpbSA9IGMoLTEzLjAwLCAzNi4wMCksIHlsaW0gPSBjKDM1LCA2Ny40NCksIGV4cGFuZCA9IEZBTFNFKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhenVyZSIpKSAgKyBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gInBsYXNtYSIpICsgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiVklDVE9SSUFTIFBBw41TRVMgRVVST1BFT1MiKQ0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJibHVlIj4qKk1BUEEgRVVST1BBKio8L0ZPTlQ+DQoNCjxicj4NCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI5MCUifQ0KZ2dwbG90bHkoZXVyb3BhKQ0KYGBgDQoNCmBgYHtyfQ0KYWFhJFRvcF9Db3VudHJ5IDwtIHJlY29kZShhYWEkVG9wX0NvdW50cnksICJSdXNzaWFuIEZlZGVyYXRpb24iPSJSdXNzaWEiKQ0KQXNpYSA8LSBhYWEgJT4lIGZpbHRlcihUb3BfQ291bnRyeSAlaW4lIGMoIkNoaW5hIiwgIktvcmVhLCBSZXB1YmxpYyBvZiIsIk1hbGF5c2lhIiwiUnVzc2lhIiwiU2luZ2Fwb3JlIiwiVmlldCBOYW0iLCAiSmFwYW4iLCAiQXplcmJhaWphbiIsICJUYWl3YW4sIFJlcHVibGljIG9mIENoaW5hIikpDQoNCndvcmxkIDwtIHJuYXR1cmFsZWFydGg6Om5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpDQp3b3JsZF9wb2ludHM8LSBzdF9jZW50cm9pZCh3b3JsZCkNCndvcmxkX3BvaW50cyA8LSBjYmluZCh3b3JsZCwgc3RfY29vcmRpbmF0ZXMoc3RfY2VudHJvaWQod29ybGQkZ2VvbWV0cnkpKSkNCmRmX2lubmVyIDwtIGlubmVyX2pvaW4od29ybGQsIEFzaWEsIGJ5PSBjKCJzb3ZlcmVpZ250IiA9ICJUb3BfQ291bnRyeSIpKQ0KDQphc2lhIDwtZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSB3b3JsZCwgY29sb3IgPSAiYmxhY2siKSArDQogICAgZ2VvbV9zZihkYXRhID0gZGZfaW5uZXIsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBmaWxsID0gbikpICArIGNvb3JkX3NmKHhsaW0gPSBjKDMxLjAwLCAxODAuMDApLCB5bGltID0gYygtMTAsIDgwKSwgZXhwYW5kID0gRkFMU0UpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImF6dXJlIikpICArIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCBvcHRpb24gPSAicGxhc21hIikgKyB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJWSUNUT1JJQVMgUEHDjVNFUyBBU0lBVElDT1MiKQ0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iYmx1ZSI+KipNQVBBIEFTSUEqKjwvRk9OVD4NCg0KPGJyPg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG91dC53aWR0aD0iOTAlIn0NCmdncGxvdGx5KGFzaWEpDQpgYGANCg0KIyMgMTEuIENvbmNsdXNpb25lcyB5IHZhbG9yYWNpw7NuIHBlcnNvbmFsDQoNCkEgcmFpeiBkZSBsbyBleHB1ZXN0byBlbiBlbCB0cmFiYWpvIHkgZW4gbG9zIGdyw6FmaWNvcywgbG8gcHJpbWVybyBkZSB0b2RvIGRlY2lyIHF1ZSBSIGVzIHVuYSBoZXJyYW1pZW50YSBtdXkgcG90ZW50ZSBwYXJhIGhhY2VyIGFuw6FsaXNpcyBkZSBtZXJjYWRvcyB5IHBhcmEgZW50ZW5kZXIgY3VhbCBwdWVkZSBzZXIgbGEgdGVuZGVuY2lhIGRlIGNpZXJ0b3MgdmFsb3JlcyBlbiBlbCBmdXR1cm8uIFBvciBsbyBxdWUgcmVzcGVjdGEgYSBsb3MgRXNwb3J0cyBjb21vIHNlIG9ic2VydmEgZW4gbG9zIGdyw6FmaWNvcyBlcyB1biBzZWN0b3IgcXVlIHN1ZnJlIHVuYSBleHBhbnNpw7NuIGVub3JtZSB0YW50byBlbCBzZWN0b3IgY29tcGV0aXRpdm8gY29tbyBlbCBkZSBsb3MgdmlkZW9qdWVnb3MsIHF1ZSBoYSBpZG8gcmVpbnZlbnRhbmRvc2Ugb2ZyZWNpZW5kbyB1bmEgZ2FtYSBkZSBwcm9kdWN0b3MgZGlmZXJlbnRlcyB5YSBzZWEgZWwgY2FtYmlvIGhhY2lhIGxvcyBqdWVnb3MgKipmcmVlIHRvIHBsYXkqKiBvIGxhIHZhcmlhbnRlIGNvbXBldGl0aXZhIGRlIGxvcyB2aWRlb2p1ZWdvcyB5IGxhIHBvc2liaWxpZGFkIGRlIHZlciBlc3RhcyBjb21wZXRpY2lvbmVzIHRhbnRvIHByZXNlbmNpYWxtZW50ZSBjb21vIGEgdHJhdsOpcyBkZSBsYXMgZGlmZXJlbnRlcyBwbGF0YWZvcm1hcyBkZSBzdHJlYW1pbmcgcXVlIHV0aWxpemFuIGNvbW8gWW91VHViZSwgVHdpdGNoLi4uIEFkZW3DoXMgYSBlc3RvIHNlIHVuZSBsYSBudWV2YSBtb2RhIGRlIGxvcyAqKnN0cmVhbWVycyoqIHF1ZSBzb24gcGVyc29uYXMgcXVlIGp1ZWdhbiBhIGRldGVybWluYWRvcyBqdWVnb3Mgb25saW5lIHkgbG8gcmV0cmFzbWl0ZW4gZW4gbGFzIHBsYXRhZm9ybWFzIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUsIGVzdG8gbG8gYXByb3ZlY2hhbiBsYXMgZGVzYXJyb2xsYWRvcmFzIGRlIHZpZGVvanVlZ29zIHBhcmEgaGFjZXIgcHVibGljaWRhZCBkZSBzdXMganVlZ29zLg0KDQpNZSBodWJpZXNlIGd1c3RhZG8gZW5jb250cmFyIG1lam9yZXMgeSBtw6FzIGFtcGxpb3MgZGF0b3MgcGFyYSBoYWNlciBlc3RlIGVzdHVkaW8gbcOhcyBwcmVjaXNvIHkgbcOhcyBhbXBsaW8gcGVybyBidWVubywgY3JlbyBxdWUgY29uIGxvcyBkYXRvcyBxdWUgdGVuw61hIGhlIGhlY2hvIHVuIGJ1ZW4gdHJhYmFqby4gDQoNCg0KPGNlbnRlcj4NCiFbXShJbWFnZW5lcy9HSUYuZ2lmKXt3aWR0aD0iNTUlIn08L2NlbnRlcj4NCg0KDQojIyAxMi4gTWF0ZXJpYWwgdXRpbGl6YWRvDQoNCg0KKipNZSBoZSBiYXNhZG8gZW4gdW4gW3RyYWJham9dKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcmFua2lyc2gvZXNwb3J0cy1lYXJuaW5ncy1hbmFseXNpcyl7dGFyZ2V0PSJfYmxhbmsifS4gcXVlIGVuY29udHLDqSBidXNjYW5kbyBpbmZvcm1hY2nDs24gc29icmUgbG9zIGVzcG9ydHMgeSBoZSBjb21wbGV0YWRvIGxhIGluZm9ybWFjacOzbiB5IGhlIGFkYXB0YWRvIHN1cyBncsOhZmljb3MgYSBsYXMgbmVjZXNpZGFkZXMgZGUgZXN0ZSB0cmFiYWpvLioqDQoNCg0KKipUYW1iacOpbiBtZSBoZSBmaWphZG8gZW4gbG9zIHRyYWJham9zIGVuIGdydXBvIGRlIG1pcyBjb21wYcOxZXJvcyB5IGhlIHNhY2FkbyBtdWNoYXMgaWRlYXMgdmFsaW9zYXMgcXVlIG1lIGhhbiBzZXJ2aWRvIHBhcmEgYWRhcHRhciBtaSB0cmFiYWpvIFthcXXDrV0oaHR0cHM6Ly9naXRodWIuY29tL25vc2FuNS90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0qKiANCg0KDQo8YnI+DQo8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKk90cmFzIHdlYnMgZGUgY29uc3VsdGE6Kio8L0ZPTlQ+DQoNCg0KLSBbV2lraXBlZGlhXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Eb3RhXzIpe3RhcmdldD0iX2JsYW5rIn0uIA0KDQoNCi0gW0FFVkkub3JnXShodHRwOi8vd3d3LmFldmkub3JnLmVzL2xhLWluZHVzdHJpYS1kZWwtdmlkZW9qdWVnby9lbi1lbC1tdW5kby8jOn46dGV4dD1FbCUyMG1lcmNhZG8lMjBpbnRlcm5hY2lvbmFsJTIwZGVsJTIwdmlkZW9qdWVnbyxzZWclQzMlQkFuJTIwbGFzJTIwZXN0aW1hY2lvbmVzJTIwZGUlMjBOZXd6b28uKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCi0gW05FV1pPT10oaHR0cHM6Ly9uZXd6b28uY29tL2luc2lnaHRzL3RyZW5kLXJlcG9ydHMvbmV3em9vLWdsb2JhbC1lc3BvcnRzLW1hcmtldC1yZXBvcnQtMjAyMC1saWdodC12ZXJzaW9uLyl7dGFyZ2V0PSJfYmxhbmsifS4NCg0KDQotIFtrYWdnbGVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcnVzaGlrZXNoaGlyYXkvZXNwb3J0LWVhcm5pbmdzKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCi0gW2RhdGFyYWRlXShodHRwczovL2RhdGFyYWRlLmFpL2RhdGEtY2F0ZWdvcmllcy9lc3BvcnRzLWRhdGEpe3RhcmdldD0iX2JsYW5rIn0uDQoNCg0KLSBbZXVyb2dhbWVyXShodHRwczovL3d3dy5ldXJvZ2FtZXIuZXMvYXJ0aWNsZXMvZS1zcG9ydHMtbmFjaW1pZW50by1ldm9sdWNpb24taW50cm9kdWNjaW9uLWFydGljdWxvKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQoNCg0KDQoNCg==