Introducción

Un elemento central en la dinámica política de cualquier país consiste en la generación de un discurso que logré cohesionar al público alrededor de ciertos sentidos. Los nuevos medios sociales, como Facebook y Twitter, ya son parte de esa batalla por la legitimidad de las palabras. Pero además, en esta época de Trump, Brexit, populismos y “fake news”, la lucha simbólica parece decantarse ya no a los datos de la realidad sino a la apelación a emociones (Suiter 2016).

En abril de 2016 el presidente de Bolivia ha abierto una cuenta oficial de Twitter, con el nombre de @evoespueblo. Desde entonces se han realizado varios estudios descriptivos sobre su cuenta (Jordan 2017, Lopez 2017 y Trigo 2018). Nosotros aquí queremos ir un pequeño paso más allá realizando un estudio relacional sobre la construcción emocional de su discurso político, por lo que nos preguntamos ¿qué carga sentimental poseen sus tweets y cuáles logran mayor interacción?

El desplazamiento temático que hacemos consiste en ir de la supuesta racionalidad del discurso político hacia su emotividad, que parece ser el factor que activa más los flujos en las redes sociodigitales. La emotividad es una dimensión de análisis más válida en la política gubernamental del país, si además tomamos en cuenta que siempre ha sido un aspecto central en la construcción discursiva de los presidentes populistas (Cossarini y García 2015).

El presente estudio pretende ser tanto un acercamiento preliminar al análisis del discurso político en las redes, como también un aporte inicial a la metodología de análisis de los datos textuales en la Web. Una característica central de este tipo de datos es su abundancia y su falta de estructuración, por lo que intentaremos automatizar tanto la recolección como el análisis de la información, en un esfuerzo por utilizar “métodos digitales” (Rogers 2013) en las ciencias sociales.

Para ello utilizaremos principalmente el entorno de R, que es una herramienta de software libre bastante flexible1. R incorpora una gran cantidad de paquetes complementarios creados por su comunidad de usuarios y desarrolladores. Para nuestro caso concreto, R nos permite utilizar un lenguaje de programación, conectarnos a APIs de redes sociales, transformar los datos, analizarlos estadísticamente, visualizarlos y publicar los resultados, todo de forma integral y reproducible.

Recolección de datos

El primer paso al que nos enfrentamos es el de la recolección de una gran cantidad de datos textuales en la Web. La idea aquí es poder automatizar la recolección en bloque. Para ello existen al menos dos vías: el scraping2 y la petición de datos vía API3, ambas con sus respectivas limitaciones. Combinaremos ambas vías en orden de conseguir la mayor cantidad de tweets posibles.

En primer lugar, utilizaremos la API de Twitter que es más abierta que la de Facebook4. Nos conectamos mediante la interfaz que nos brinda el paquete rtweet5. Se requiere previamente habilitar una app en el sitio de Twitter Developers para conseguir la clave y token necesarios. Usamos el siguiente código:

library(rtweet)
twitter_tokens <- create_token(app = "", consumer_key = "", consumer_secret = "")

Una vez autenticados pasamos a recolectar los tweets. El número de tweets máximo permitido por la API para el timeline de un usuario es de 3200 tweets por petición:

evovar <- get_timeline("evoespueblo", n = 3200)

Ahora, seleccionaremos las variables de interés y guardaremos los datos en un archivo:

evovar <- evovar[c("created_at", "text", "favorite_count", "retweet_count")]
write_as_csv(evovar, "evovar.csv")

La otra forma de recolección se realizó mediante un script de Python6. El script aprovecha la librería Selenium para la simulación del navegador y tweepy para la conexión con Twitter. De esta forma logramos conseguir los tweets antiguos adicionales, que no se podrían haber conseguido mediante la API.

Mediante estos dos procedimientos, contamos con todos los tweets emitidos por la cuenta, desde la fecha de su creación el 15 de abril de 2016 hasta el 31 de diciembre de 2017. Es decir que contamos con el censo de los tweets y no con una muestra. Son 3986 tweets en 20 meses, que mostramos a continuación:

library(readr)
evovar <- read_csv("evovar.csv")
evovar

Preparación de los datos

Una pieza central para un análisis de texto (text mining) es el tokenizado. Éste consiste en poder transformar la estructura de datos de los tweets, de caracteres a palabras, para posteriormente reestructurar la tabla de tal modo que haya una sola palabra en cada fila. Utilizaremos los siguientes paquetes string y stringr para la manipulación de caracteres, dplyr para la manipulación de la tabla de datos, magrittr para el uso de pipes y tidytext para el tokenizado y el análisis de texto en general.

library(stringi)
library(stringr)
library(dplyr)
library(magrittr)
library(tidytext)
# Quitamos los acentos a los tweets (dado que tidytext tiene conflictos con ellos)
evovar$text <- stri_trans_general(evovar$text, "Latin-ASCII")
# Ahora limpiamos la variable text de algunos elementos innecesarios y  tokenizamos
replace_reg <- "https://t.co/[A-Za-z\\d]+|http://[A-Za-z\\d]+|&amp;|&lt;|&gt;|RT|https"
unnest_reg <- "([^A-Za-z_\\d#@']|'(?![A-Za-z_\\d#@]))"
evovar_t <- evovar %>% 
  filter(!str_detect(text, "^RT")) %>%
  mutate(text = str_replace_all(text, replace_reg, "")) %>%
  unnest_tokens(word, text, token = "regex", pattern = unnest_reg) 
rm(replace_reg, unnest_reg) 

El resultado es una tabla de datos más grande, de 95656 observaciones, donde se remplaza la variable text, tweet entero, por la de word, palabras que contiene el tweet, manteniendo la variable X para identificar el respectivo tweet:

str(evovar_t)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   95656 obs. of  5 variables:
 $ X             : int  1 1 1 1 1 1 1 1 1 1 ...
 $ created_at    : POSIXct, format: "2017-12-31 21:31:06" "2017-12-31 21:31:06" ...
 $ favorite_count: int  4162 4162 4162 4162 4162 4162 4162 4162 4162 4162 ...
 $ retweet_count : int  2161 2161 2161 2161 2161 2161 2161 2161 2161 2161 ...
 $ word          : chr  "hermanas" "y" "hermanos" "despedimos" ...

El siguiente problema es que las palabras con mayor frecuencia son, como era de esperarse, artículos, preposiciones, conjunciones, y otros similares:

library(ggplot2)
freq1 <- evovar_t %>%
        count(word, sort = TRUE)
head(freq1, n = 30) %>%
        ggplot(aes(reorder(word, n), n)) +
        geom_bar(stat="identity") +
        coord_flip() + 
        xlab("Palabras más usadas") +
        ylab("Número") +
        theme_minimal()

Esas palabras no agregan ninguna información relevante para entender la polaridad de los sentiments, son “palabras vacías” que debemos filtrar. Para ello necesitamos una lista de ese tipo de palabras en español que extraeremos del paquete stopwords:

library(stopwords)
#crear una lista de palabras vacias en español
stopwords_ES <- tibble(stopwords("spanish")) 
colnames(stopwords_ES) <- "word"
#Agregamos algunas palabras vacias adicionales (lugares y monedas, etc.)
custom_stop <- tibble(word = c("santa", "cruz", "cochabamba", "bs", "us", "mm", "pronto", "seria", "corte", "primero", "seguro", "seguros"))
stopwords_ES <- bind_rows(custom_stop, stopwords_ES)
rm(custom_stop)
#filtrado con la lista de palabras vacias
evovar_tf <- evovar_t %>% 
 filter(!word %in% stopwords_ES$word,
         str_detect(word, "[a-z]"))
str(evovar_tf)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   51382 obs. of  5 variables:
 $ X             : int  1 1 1 1 1 1 1 1 1 1 ...
 $ created_at    : POSIXct, format: "2017-12-31 21:31:06" "2017-12-31 21:31:06" ...
 $ favorite_count: int  4162 4162 4162 4162 4162 4162 4162 4162 4162 4162 ...
 $ retweet_count : int  2161 2161 2161 2161 2161 2161 2161 2161 2161 2161 ...
 $ word          : chr  "hermanas" "hermanos" "despedimos" "exito" ...

Ahora sí podemos observar las palabras más utilizadas por @evoespueblo:

freq2 <- evovar_tf %>%
        count(word, sort = TRUE)
head(freq2, n = 30) %>%
        ggplot(aes(reorder(word, n), n)) +
        geom_bar(stat="identity") +
        coord_flip() +
        xlab("Palabras más usadas") +
        ylab("Número")+
        theme_minimal()

Análisis de datos

El análisis de sentimiento nos permite aproximarnos a la intención emocional de los tweets que lanza el presidente Evo Morales. Este tipo de análisis puede basarse en el análisis de palabras o relaciones de palabras (n-gramas) y se pueden evaluar diferentes escalas de sentimiento (binarias, ponderadas, etc.). Aquí elegimos el enfoque de “bolsa de palabras”, el nivel del unigrama y la escala binaria, como una primera aproximación expedita. Ahora bien, existen diversos métodos para evaluar los sentiments en los textos, desde la anotación manual hasta el uso de machine learning, pero aquí utilizaremos el método basado en diccionario (Silge y Robinson 2017). Este método conste en utilizar un diccionario en formato clave:valor para evaluar cada palabra. Se considera al tweet como una combinación de palabras individuales que tienen una carga emocional y la proporción de esas palabras nos da el sentimiento general del tweet, como posteriormente reflejaremos en un indice de sentimiento.

Los diccionarios para análisis de sentimiento en español son escasos y poco desarrollados. Después de una larga búsqueda pudimos encontrar el diccionario iSol que está formado por 8135 palabras, 2.509 positivas y 5.626 negativas, dejando a un lado las palabras emocionalmente neutras. Este diccionario a su vez está basado en otro diccionario en inglés bastante testeado como es el de Bing Liu, siendo una traducción especializada y mejorada.

#cargamos y adecuamos el diccionario al formato requerido
negativas <- read_csv("isol/negativas_mejorada.csv", col_names = "word") %>%
  mutate(sentiment = "negativo") 
positivas <- read_csv("isol/positivas_mejorada.csv", col_names = "word") %>%
  mutate(sentiment = "positivo")
bingES <- bind_rows(negativas, positivas) 
rm(negativas, positivas)
# Quitamos los acentos
bingES$word <- stri_trans_general(bingES$word, "Latin-ASCII") 
bingES

Una primera prueba del diccionario que realizaremos será comprobar qué porcentaje de las palabras únicas utilizadas por @evoespueblo clasifica este diccionario:

evo_w <- unique(evovar_tf$word) %>% tibble() # palabras únicas usadas por evoespueblo: 10451
colnames(evo_w) <- "word"
dic_w <- bingES$word # palabras en el diccionario: 8135
evo_wc <- evo_w %>% filter(word %in% dic_w)  # palabras clasificadas: 1171
evo_uc <- evo_w %>% filter(!word %in% dic_w) # palabras no clasificadas: 9280
# Porcentaje de palabras clasificadaas
por_w <- (length(evo_wc$word) / length(evo_w$word)) * 100
por_w
[1] 11.20467

El diccionario clasificó el 11% de las palabras. Lo ideal es que el diccionario se aproxime al 20% de las palabras siguiendo la ley de Zipf7, por lo que efectuaremos unas modificaciones.

Al revisar el diccionario encontramos tres problemas. Primero, si bien contiene muchas palabras con clara carga sentimental, en ocasiones no contiene todas sus flexiones. Segundo, dado que es un diccionario general, no captura algunas particularidades del discurso político del presidente, particularmente su discurso nacionalista. Tercero, existen palabras polarizadas que sirven para indicar el sentimiento frente a un producto o servicio, pero no tienen efectividad en temas políticos. Para el primer problema añadiremos flexiones basadas ya en las palabras existentes en el diccionario, para el segundo añadiremos las palabras politizadas más utilizadas, evaluando su polaridad en un intento de un diccionario político inicial, y para el tercero retiraremos las palabras no apropiadas:

#Añadiendo flexiones y otras palabras polarizadas
flex_dic <- read_csv("evo_uc.csv", col_names = c("word", "sentiment"))
flex_dic <- flex_dic %>% filter(str_detect(sentiment, "positivo|negativo"))
bingESmod <- bind_rows(bingES, flex_dic)
#Añadiendo palabras politizadas
tribble(
  ~word, ~sentiment,
  "pueblo", "positivo",
  "eeuu", "negativo",
  "estadounidense", "negativo",
  "estadounidenses", "negativo",
  "mar", "positivo",
  "chile", "negativo",
  "imperio", "negativo",
  "imperios", "negativo",
  "imperial", "negativo",
  "imperiales", "negativo",
  "imperialismo", "negativo",
  "capitalismo", "negativo",
  "capitalista", "negativo",
  "procapitalista", "negativo",
  "capitalización", "negativo",
  "neoliberal", "negativo",
  "neoliberales", "negativo",
  "neoliberalismo", "negativo",
  "neocolonial", "negativo",
  "neocoloniales", "negativo",
  "neocolonialismo", "negativo",
  "recolonizacion", "negativo",
  "oligarquia", "negativo",
  "oligarquias", "negativo",
  "oligarca", "negativo",
  "oligarcas", "negativo",
  "oligarquica", "negativo",
  "oligarquicos", "negativo",
  "derecha", "negativo",
  "derechistas", "negativo",
  "goni", "negativo",
  "sanchez", "negativo",
  "banzer", "negativo",
  "tuto", "negativo",
  "doria", "negativo",
  "almagro", "negativo",
  "oea", "negativo",
  "fmi", "negativo",
  "trump", "negativo",
  "patria", "positivo",
  "soberania", "positivo",
  "soberanias", "positivo",
  "soberano", "positivo",
  "soberanos", "positivo",
  "transnacional", "negativo",
  "opositor", "negativo",
  "opositora", "negativo",
  "opositores", "negativo"
) -> pol_dic
bingESmod <- bind_rows(bingESmod, pol_dic)
#Quitando otras palabras no pertinentes
supr_dic <- c("mejor", "mejores", "peor", "peores", "economico", "economicos", "nueva", "nuevas", "nuevo", "nuevos", "grande", "grandes", "importante", "importantes", "decision", "interes", "intereses", "mayor", "primera", "maduro", "garantizar", "humano", "humanos", "nuevas", "recursos", "lider", "lideres", "pronto", "seria", "corte", "primero", "seguro", "seguros", "principal", "principales", "sentido")
bingESmod <- bingESmod  %>% filter(!word %in% supr_dic)

Volvemos a evaluar el alcance del diccionario y llegamos casi al 17%:

dic_w <- bingESmod$word # palabras en el diccionario
evo_wc <- evo_w %>% filter(word %in% dic_w)  # palabras clasificadas
# Porcentaje de palabras clasificadaas
por_w <- (length(evo_wc$word) / length(evo_w$word)) * 100
por_w
[1] 16.85006

Ahora sí, estamos listos para para realizar la clasificación de sentimientos. Gracias al tokenizado, que nos dejo una estructura de una palabra por observación y al diccionario en formato clave: valor, esta clasificación solo nos ocupará la función inner_join que fusiona dos tablas de datos por valores comunes:

evosentiment <- evovar_tf %>%
  inner_join(bingESmod)
evosentiment

Aquí un primer acercamiento al clima emocional de los tweets del presidente consiste en ver los porcentajes globales de palabras positivas y negativas:

evosentiment %>%
        ggplot(aes(sentiment)) +
        geom_bar(aes(y = (..count..)/sum(..count..)*100)) +
        xlab("sentimiento") + 
        ylab("porcentaje") +
        theme_minimal()

Aproximadamente un 57% de las palabras que ha utilizado Evo son negativas, mientras el 43% son negativas.

Las palabras que más peso aportan a la positividad y negatividad son las siguientes:

count_sent <- evosentiment %>%
  count(word, sentiment, sort = TRUE) %>%
  ungroup()
count_sent
#Graficamos
count_sent %>%
 group_by(sentiment) %>%
  top_n(30) %>%
  ungroup() %>%
  mutate(word = reorder(word, n)) %>%
  ggplot(aes(word, n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(y = "Contribución al sentimiento",
       x = NULL) +
  coord_flip() +
  theme_minimal()

Ahora crearemos un indice de sentimiento (isent) para ponderar la carga de positividad o negatividad en cada tweet. Para ello: \(isent(t) = s / nw\) donde el indice de sentimiento para un tweet sera la proporción entre el numero de palabras con carga emocional \(s\) dividido entre el total de palabras \(nw\), excluyendo las palabras vacías. Crearemos un índice para cada polaridad:

#Contamos el total de palabras negativas y positivas por tweets
library(tidyr)
tweets_sen <- evosentiment %>%
  group_by(X) %>%
  count(sentiment)
evovar_sent <- inner_join(evovar, tweets_sen)
evovar_sent <- spread(evovar_sent, sentiment, n)
evovar_sent[is.na(evovar_sent)] <- 0
#Limpiamos de las palabras vacias y las URL de la variable texto y la añadimos a nuestra tabla de datos
library(tm)
evo_corpus <- (Corpus(VectorSource(evovar_sent$text)))
corpus <- tm_map(evo_corpus, removeWords, stopwords("spanish"))
removeURL <- function(x) gsub("http[[:alnum:][:punct:]]*", "", x) 
corpus <- tm_map(corpus, content_transformer(removeURL))
text_c <- data.frame(text=sapply(corpus, identity), 
    stringsAsFactors=F)
evovar_sent <- bind_cols(evovar_sent, text_c)
#Contamos las palabras de cada tweet y calculamos los indices
evovar_sent <- mutate(evovar_sent, nw = str_count(evovar_sent$text1, "\\S+"))
evovar_sent <- mutate(evovar_sent, isent_neg =  (negativo / nw)*100)
evovar_sent <- mutate(evovar_sent, isent_pos =  (positivo / nw)*100)

Ahora crearemos una variable nueva llamada interact que es simplemente la suma de de los favs y retweets. Ello se justifica porque existe una fuerte correlación entre esos dos tipos de interacción.

#Correlación entre los favs y los retweets
cor(evovar_sent$favorite_count, evovar_sent$retweet_count)
[1] 0.926368
#Creamos una nueva variable que es la interacción
evovar_sent$interact <- evovar_sent$favorite_count + evovar_sent$retweet_count

Por ultimo graficaremos y calcularemos la relación entre el indice de sentimiento y la interacción:

evovar_sent %>% 
  ggplot() +
  aes(x = isent_pos, y = interact) +
  geom_point() +
  theme_minimal()

cor(evovar_sent$isent_pos, evovar_sent$interact) #correlación
[1] 0.02214804
regpos <- lm(interact ~ isent_pos, evovar_sent) #regresion lineal
summary(regpos)

Call:
lm(formula = interact ~ isent_pos, data = evovar_sent)

Residuals:
    Min      1Q  Median      3Q     Max 
-1073.9  -756.7  -534.0    -3.8 20652.1 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 1124.027     41.664   26.98   <2e-16 ***
isent_pos      4.042      3.109    1.30    0.194    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1677 on 3445 degrees of freedom
Multiple R-squared:  0.0004905, Adjusted R-squared:  0.0002004 
F-statistic: 1.691 on 1 and 3445 DF,  p-value: 0.1936
evovar_sent %>% 
  ggplot() +
  aes(x = isent_neg, y = interact) +
  geom_point() +
  theme_minimal()

cor(evovar_sent$isent_neg, evovar_sent$interact)#correlación
[1] 0.1507529
regneg <- lm(interact ~ isent_neg, evovar_sent) #regresion lineal
summary(regneg)

Call:
lm(formula = interact ~ isent_neg, data = evovar_sent)

Residuals:
    Min      1Q  Median      3Q     Max 
-1741.6  -697.9  -465.9   -13.9 20300.4 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   911.41      39.89  22.851   <2e-16 ***
isent_neg      20.76       2.32   8.951   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1658 on 3445 degrees of freedom
Multiple R-squared:  0.02273,   Adjusted R-squared:  0.02244 
F-statistic: 80.11 on 1 and 3445 DF,  p-value: < 2.2e-16

Conclusión

La polaridad general de los tweets de la cuenta de Evo Morales apunta a un mayor uso de palabras negativas (57%) que positivas (43%). Aunque no es una diferencia abismal, pues en la construcción discursiva política debe haber también no solo un ellos negativizado, sino también un nosotros positivizado. En esta construcción se pudieron observar algunos pares semánticos antagónicos, entre las palabras más usadas, como EEUU/pueblo, lucha/paz, imperio/patria.

En la relación entre la polaridad de los tweets y la interacción, podemos encontrar una diferencia entre la recepción de los tweets positivos y los negativos. Los tweets negativos tienen una mayor interacción que los positivos, en la prueba de correlación los tweets negativos obtienen un 0,15 mientras los positivos tan sólo 0,02. Pasando a la prueba de regresión, los tweets por cada punto porcentual negativo reciben en promedio 21 interacciones más, con un p-valor significativo; mientras que los puntos porcentuales positivos no tiene el mismo efecto, consiguiendo 4 interacciones más pero con un p-valor no significativo.

Lo anterior puede ilustrarse con el análisis de los diez tweets con mayor interacción:

pop_t <- evovar_sent %>%
        select(text, interact, isent_neg, isent_pos) %>%
        arrange(desc(interact))
head(pop_t, n = 10) %>% knitr::kable()
text interact isent_neg isent_pos
Hace 44 anos, la dictadura de Pinochet torturo y asesino a Victor Jara, cantante del pueblo, su voz no fue acallada #VictorJaraVive https://t.co/4aikxNvRni 21805 28.571429 7.142857
Lamentamos muerte Santiago Maldonado, nuestras condolencias a familia y pueblo argentino. Que cobarde y condenable asesinato se esclarezca. https://t.co/t44Goljs7r 21081 30.769231 7.692308
No comparto sancion contra Argentina. Algo conozco de futbol, la infraccion fue a #Messi. Mi solidaridad con el mejor futbolista del mundo. 18504 14.285714 7.142857
A casi una semana de las elecciones en Honduras, ¿por que EEUU y OEA mantienen silencio complice sobre elecciones en Honduras y la muerte de ciudadanos? La democracia peligra en un pais hermano, @Almagro_OEA2015 y compania no solo no se pronuncian, sino parecen mirar a otro lado. 18138 17.857143 0.000000
Como hoy, 2007, la hermana Cristina Fernandez asumio la presidencia de Argentina. Fue la primera mujer presidenta elegida democraticamente en su pais. Implemento un programa que favorecio a los marginados. Ahora esta siendo objeto de una caceria judicial y mediatica.Nuestro apoyo https://t.co/U99cRjfK7z 17556 0.000000 3.846154
Lamentable la decision del juez Federal Bonadio de pedir el desafuero de Cristina Kirchner. Una vez mas se ponen en evidencia las estrategias imperiales en contra de la Patria Grande. Nuestra solidaridad con nuestra hermana Cristina. https://t.co/AyttN1PWrP 16468 9.090909 9.090909
Hace 41 anos, en Argentina sucedio la #NocheDeLosLapices, recordamos a estudiantes torturados y asesinados por dictadura impuesta por EEUU. https://t.co/8R3mt8u4YH 15944 30.769231 0.000000
En Dia de la Descolonizacion denunciamos la invasion europea del imperio espanol de 1492, que trajo muerte, saqueo y explotacion en AbyaYala https://t.co/IJjrNBCaf8 14664 42.857143 0.000000
Un golpe judicial al hermano Lula, candidato potencial que garantizaba la victoria del pueblo brasileno. Toda nuestra solidaridad. https://t.co/LBpq9Kist9 14577 7.692308 23.076923
Hace 47 anos Allende se convierte en 1er presidente socialista por urnas en el mundo occidental. Ejemplar chileno comprometido con su pueblo https://t.co/IDF98m8mjT 14442 0.000000 13.333333

Aquí se puede apreciar que 7 de los 10 tweets tienen una fuerte carga emocional negativa, lo cual queda representando en sus indices de negatividad. Sólo tres de los diez tweets más populares de Evo Morales son positivos.

No obstante, el coeficiente de determinación (R2) muestra que la variación en las interacciones solo es explicada por su negatividad al 2%. Esta situación puede ser explicada por las siguientes alternativas: (a) existen otras variables en juego, como los tópicos de los tweets que influyen en la interacción, por ejemplo que sean tweets sobre temas nacionales o internacionales, históricos o políticos, etc.; (b), que las audiencia internacional sea más activa que la nacional o viceversa; (c) que el diccionario que usamos aún sea muy general y no capté las polaridades semánticas del discurso particular del presidente; (d) que el unigrama no sea una unidad de análisis suficiente en este caso.

A pesar de esas limitaciones, este primer acercamiento nos permite mostrar (1) la potencial importancia de la variable emoción en los discursos políticos en red; (2) un método de recolección y análisis para grandes cantidades de datos textuales en redes sociales.

Referencias

Cossarini, Paolo y García, Roberto (2015). “El papel de las emociones en la teoría democrática. Desafíos para un uso público de la razón en tiempos de populismo”. Revista de estudios políticos, (168), 291-315.

Jordan, Wilfredo (2017). “7 gráficos para entender la cuenta de Evo Morales en Twitter”. En: La Prensa (25/04/2017)

Lopez, Tonny (2017). “Las 101 cuentas de Twitter con más seguidores en Bolivia”. En: Rimaypampa (24/12/2017)

Rogers, Richard (2013). Digital Methods. MIT Press.

Trigo, María (2018). “Evo: El tuitero que pasó del odio al amor a las redes”. En: El Deber (09/01/2018)

Silge, Julia y Robinson, David (2017). Text Mining with R: A Tidy Approach. O’Reilly Media

Suiter, Jane (2016). “Post-truth Politics”. En: Political Insight, vol 7, 3. Sage.

Herramientas digitales

  • R
  • rtweet
  • ggplot2

Sobre el autor

Alex Ojeda Copa es sociólogo digital y analista de redes sociales. Pueden encontrarlo en Twitter, LinkedIn y Academia.edu.

Notas


  1. Agradecemos a Rafael López por la guía estadística y en R.

  2. En español literalmente “raspado”. Es una técnica que permite la extracción de la información en la Web simulando la navegación humana.

  3. Del inglés Application Programming Interface. Es un programa intermedio que permite interactuar con otro sistema, mediante un lenguaje definido para el caso. Las grandes plataformas de redes sociales ponen a disposición sus APIs para los desarrolladores, aunque con limitaciones, y su uso nos permite recolectar grandes cantidades de datos.

  4. La documentación de la API de Twitter puede verse aquí https://developer.twitter.com/en/docs.

  5. En el mundo de R, los paquetes más populares para acceder a la API de Twitter son rtweet y twitteR. Estuvimos usando bastante este ultimo, pero encontramos muchas fallas, por lo que desaconsejamos su uso. El desarrollador informa que el paquete está obsoleto.

  6. Se encuentra en https://github.com/bpb27/twitter_scraping/blob/master/scrape.py.

  7. Es una ley de potencias. En términos sencillos esta ley empírica establece que existe una minoría de palabras (~20%) que se utilizan con mayor frecuencia (~80%), y otra mayoría de palabras (~80%) con menor frecuencia (~20%). Tiene similaridad a la distribución de Pareto.

LS0tCnRpdGxlOiAiQW7DoWxpc2lzIGRlIHNlbnRpbWllbnRvIGUgaW50ZXJhY2Npw7NuIGVuIGxvcyBUd2VldHMgZGUgQGV2b2VzcHVlYmxvIgphdXRob3I6ICJBbGV4IE9qZWRhIENvcGEiCmRhdGU6ICIwMi8wMi8yMDE4IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICAgIHRvYzogdHJ1ZQogICAgICB0b2NfZmxvYXQ6IHRydWUKICAgICAgdGhlbWU6IHlldGkKICAgICAgZmlnX3dpZHRoOiAyMAotLS0KCiMjIEludHJvZHVjY2nDs24gCgpVbiBlbGVtZW50byBjZW50cmFsIGVuIGxhIGRpbsOhbWljYSBwb2zDrXRpY2EgZGUgY3VhbHF1aWVyIHBhw61zIGNvbnNpc3RlIGVuIGxhIGdlbmVyYWNpw7NuIGRlIHVuIGRpc2N1cnNvIHF1ZSBsb2dyw6kgY29oZXNpb25hciBhbCBww7pibGljbyBhbHJlZGVkb3IgZGUgY2llcnRvcyBzZW50aWRvcy4gTG9zIG51ZXZvcyBtZWRpb3Mgc29jaWFsZXMsIGNvbW8gRmFjZWJvb2sgeSBUd2l0dGVyLCB5YSBzb24gcGFydGUgZGUgZXNhIGJhdGFsbGEgcG9yIGxhIGxlZ2l0aW1pZGFkIGRlIGxhcyBwYWxhYnJhcy4gUGVybyBhZGVtw6FzLCBlbiBlc3RhIMOpcG9jYSBkZSBUcnVtcCwgQnJleGl0LCBwb3B1bGlzbW9zIHkgImZha2UgbmV3cyIsIGxhIGx1Y2hhIHNpbWLDs2xpY2EgcGFyZWNlIGRlY2FudGFyc2UgeWEgbm8gYSBsb3MgZGF0b3MgZGUgbGEgcmVhbGlkYWQgc2lubyBhIGxhIGFwZWxhY2nDs24gYSBlbW9jaW9uZXMgKFN1aXRlciAyMDE2KS4KCkVuIGFicmlsIGRlIDIwMTYgZWwgcHJlc2lkZW50ZSBkZSBCb2xpdmlhIGhhIGFiaWVydG8gdW5hIGN1ZW50YSBvZmljaWFsIGRlIFR3aXR0ZXIsIGNvbiBlbCBub21icmUgZGUgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9ldm9lc3B1ZWJsbyI+QGV2b2VzcHVlYmxvPC9hPi4gRGVzZGUgZW50b25jZXMgc2UgaGFuIHJlYWxpemFkbyB2YXJpb3MgZXN0dWRpb3MgZGVzY3JpcHRpdm9zIHNvYnJlIHN1IGN1ZW50YSAoSm9yZGFuIDIwMTcsIExvcGV6IDIwMTcgeSBUcmlnbyAyMDE4KS4gTm9zb3Ryb3MgYXF1w60gcXVlcmVtb3MgaXIgdW4gcGVxdWXDsW8gcGFzbyBtw6FzIGFsbMOhIHJlYWxpemFuZG8gdW4gZXN0dWRpbyByZWxhY2lvbmFsIHNvYnJlIGxhIGNvbnN0cnVjY2nDs24gZW1vY2lvbmFsIGRlIHN1IGRpc2N1cnNvIHBvbMOtdGljbywgcG9yIGxvIHF1ZSBub3MgcHJlZ3VudGFtb3Mgwr9xdcOpIGNhcmdhIHNlbnRpbWVudGFsIHBvc2VlbiBzdXMgdHdlZXRzIHkgY3XDoWxlcyBsb2dyYW4gbWF5b3IgaW50ZXJhY2Npw7NuPyAKCkVsIGRlc3BsYXphbWllbnRvIHRlbcOhdGljbyBxdWUgaGFjZW1vcyBjb25zaXN0ZSBlbiBpciBkZSBsYSBzdXB1ZXN0YSByYWNpb25hbGlkYWQgZGVsIGRpc2N1cnNvIHBvbMOtdGljbyBoYWNpYSBzdSBlbW90aXZpZGFkLCBxdWUgcGFyZWNlIHNlciBlbCBmYWN0b3IgcXVlIGFjdGl2YSBtw6FzIGxvcyBmbHVqb3MgZW4gbGFzIHJlZGVzIHNvY2lvZGlnaXRhbGVzLiBMYSBlbW90aXZpZGFkIGVzIHVuYSBkaW1lbnNpw7NuIGRlIGFuw6FsaXNpcyBtw6FzIHbDoWxpZGEgZW4gbGEgcG9sw610aWNhIGd1YmVybmFtZW50YWwgZGVsIHBhw61zLCBzaSBhZGVtw6FzIHRvbWFtb3MgZW4gY3VlbnRhIHF1ZSBzaWVtcHJlIGhhIHNpZG8gdW4gYXNwZWN0byBjZW50cmFsIGVuIGxhIGNvbnN0cnVjY2nDs24gZGlzY3Vyc2l2YSBkZSBsb3MgcHJlc2lkZW50ZXMgcG9wdWxpc3RhcyAoQ29zc2FyaW5pIHkgR2FyY8OtYSAyMDE1KS4KCkVsIHByZXNlbnRlIGVzdHVkaW8gcHJldGVuZGUgc2VyIHRhbnRvIHVuIGFjZXJjYW1pZW50byBwcmVsaW1pbmFyIGFsIGFuw6FsaXNpcyBkZWwgZGlzY3Vyc28gcG9sw610aWNvIGVuIGxhcyByZWRlcywgY29tbyB0YW1iacOpbiB1biBhcG9ydGUgaW5pY2lhbCBhIGxhIG1ldG9kb2xvZ8OtYSBkZSBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIHRleHR1YWxlcyBlbiBsYSBXZWIuIFVuYSBjYXJhY3RlcsOtc3RpY2EgY2VudHJhbCBkZSBlc3RlIHRpcG8gZGUgZGF0b3MgZXMgc3UgYWJ1bmRhbmNpYSB5IHN1IGZhbHRhIGRlIGVzdHJ1Y3R1cmFjacOzbiwgcG9yIGxvIHF1ZSBpbnRlbnRhcmVtb3MgYXV0b21hdGl6YXIgdGFudG8gbGEgcmVjb2xlY2Npw7NuIGNvbW8gZWwgYW7DoWxpc2lzIGRlIGxhIGluZm9ybWFjacOzbiwgZW4gdW4gZXNmdWVyem8gcG9yIHV0aWxpemFyICJtw6l0b2RvcyBkaWdpdGFsZXMiIChSb2dlcnMgMjAxMykgZW4gbGFzIGNpZW5jaWFzIHNvY2lhbGVzLiAKClBhcmEgZWxsbyB1dGlsaXphcmVtb3MgcHJpbmNpcGFsbWVudGUgZWwgZW50b3JubyBkZSBSLCBxdWUgZXMgdW5hIGhlcnJhbWllbnRhIGRlIHNvZnR3YXJlIGxpYnJlIGJhc3RhbnRlIGZsZXhpYmxlW14xXS4gUiBpbmNvcnBvcmEgdW5hIGdyYW4gY2FudGlkYWQgZGUgcGFxdWV0ZXMgY29tcGxlbWVudGFyaW9zIGNyZWFkb3MgcG9yIHN1IGNvbXVuaWRhZCBkZSB1c3VhcmlvcyB5IGRlc2Fycm9sbGFkb3Jlcy4gUGFyYSBudWVzdHJvIGNhc28gY29uY3JldG8sIFIgbm9zIHBlcm1pdGUgdXRpbGl6YXIgdW4gbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiwgY29uZWN0YXJub3MgYSBBUElzIGRlIHJlZGVzIHNvY2lhbGVzLCB0cmFuc2Zvcm1hciBsb3MgZGF0b3MsIGFuYWxpemFybG9zIGVzdGFkw61zdGljYW1lbnRlLCB2aXN1YWxpemFybG9zIHkgcHVibGljYXIgbG9zIHJlc3VsdGFkb3MsIHRvZG8gZGUgZm9ybWEgaW50ZWdyYWwgeSByZXByb2R1Y2libGUuCgojIyBSZWNvbGVjY2nDs24gZGUgZGF0b3MKCkVsIHByaW1lciBwYXNvIGFsIHF1ZSBub3MgZW5mcmVudGFtb3MgZXMgZWwgZGUgbGEgcmVjb2xlY2Npw7NuIGRlIHVuYSBncmFuIGNhbnRpZGFkIGRlIGRhdG9zIHRleHR1YWxlcyBlbiBsYSBXZWIuIExhIGlkZWEgYXF1w60gZXMgcG9kZXIgYXV0b21hdGl6YXIgbGEgcmVjb2xlY2Npw7NuIGVuIGJsb3F1ZS4gUGFyYSBlbGxvIGV4aXN0ZW4gYWwgbWVub3MgZG9zIHbDrWFzOiBlbCBzY3JhcGluZ1teMl0geSBsYSBwZXRpY2nDs24gZGUgZGF0b3MgdsOtYSBBUElbXjNdLCBhbWJhcyBjb24gc3VzIHJlc3BlY3RpdmFzIGxpbWl0YWNpb25lcy4gQ29tYmluYXJlbW9zIGFtYmFzIHbDrWFzIGVuIG9yZGVuIGRlIGNvbnNlZ3VpciBsYSBtYXlvciBjYW50aWRhZCBkZSB0d2VldHMgcG9zaWJsZXMuIAoKRW4gcHJpbWVyIGx1Z2FyLCB1dGlsaXphcmVtb3MgbGEgQVBJIGRlIFR3aXR0ZXIgcXVlIGVzIG3DoXMgYWJpZXJ0YSBxdWUgbGEgZGUgRmFjZWJvb2tbXjRdLiBOb3MgY29uZWN0YW1vcyBtZWRpYW50ZSBsYSBpbnRlcmZheiBxdWUgbm9zIGJyaW5kYSBlbCBwYXF1ZXRlIGBydHdlZXRgW141XS4gU2UgcmVxdWllcmUgcHJldmlhbWVudGUgaGFiaWxpdGFyIHVuYSBhcHAgZW4gZWwgc2l0aW8gZGUgW1R3aXR0ZXIgRGV2ZWxvcGVyc10oaHR0cHM6Ly9hcHBzLnR3aXR0ZXIuY29tLykgcGFyYSBjb25zZWd1aXIgbGEgY2xhdmUgeSB0b2tlbiBuZWNlc2FyaW9zLiBVc2Ftb3MgZWwgc2lndWllbnRlIGPDs2RpZ286CgpgYGB7ciBldmFsID0gRn0KbGlicmFyeShydHdlZXQpCnR3aXR0ZXJfdG9rZW5zIDwtIGNyZWF0ZV90b2tlbihhcHAgPSAiIiwgY29uc3VtZXJfa2V5ID0gIiIsIGNvbnN1bWVyX3NlY3JldCA9ICIiKQpgYGAKClVuYSB2ZXogYXV0ZW50aWNhZG9zIHBhc2Ftb3MgYSByZWNvbGVjdGFyIGxvcyB0d2VldHMuIEVsIG7Dum1lcm8gZGUgdHdlZXRzIG3DoXhpbW8gcGVybWl0aWRvIHBvciBsYSBBUEkgcGFyYSBlbCAqdGltZWxpbmUqIGRlIHVuIHVzdWFyaW8gZXMgZGUgMzIwMCB0d2VldHMgcG9yIHBldGljacOzbjogCgpgYGB7ciBldmFsID0gRn0KZXZvdmFyIDwtIGdldF90aW1lbGluZSgiZXZvZXNwdWVibG8iLCBuID0gMzIwMCkKYGBgCgpBaG9yYSwgc2VsZWNjaW9uYXJlbW9zIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMgeSBndWFyZGFyZW1vcyBsb3MgZGF0b3MgZW4gdW4gYXJjaGl2bzoKCmBgYHtyIGV2YWwgPSBGfQpldm92YXIgPC0gZXZvdmFyW2MoImNyZWF0ZWRfYXQiLCAidGV4dCIsICJmYXZvcml0ZV9jb3VudCIsICJyZXR3ZWV0X2NvdW50IildCndyaXRlX2FzX2Nzdihldm92YXIsICJldm92YXIuY3N2IikKYGBgCgpMYSBvdHJhIGZvcm1hIGRlIHJlY29sZWNjacOzbiBzZSByZWFsaXrDsyBtZWRpYW50ZSB1biBzY3JpcHQgZGUgUHl0aG9uW142XS4gRWwgc2NyaXB0IGFwcm92ZWNoYSBsYSBsaWJyZXLDrWEgW1NlbGVuaXVtXShodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3NlbGVuaXVtKSBwYXJhIGxhIHNpbXVsYWNpw7NuIGRlbCBuYXZlZ2Fkb3IgeSBbdHdlZXB5XShodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3R3ZWVweS8zLjUuMCkgcGFyYSBsYSBjb25leGnDs24gY29uIFR3aXR0ZXIuIERlIGVzdGEgZm9ybWEgbG9ncmFtb3MgY29uc2VndWlyIGxvcyB0d2VldHMgYW50aWd1b3MgYWRpY2lvbmFsZXMsIHF1ZSBubyBzZSBwb2Ryw61hbiBoYWJlciBjb25zZWd1aWRvIG1lZGlhbnRlIGxhIEFQSS4gCgpNZWRpYW50ZSBlc3RvcyBkb3MgcHJvY2VkaW1pZW50b3MsIGNvbnRhbW9zIGNvbiB0b2RvcyBsb3MgdHdlZXRzIGVtaXRpZG9zIHBvciBsYSBjdWVudGEsIGRlc2RlIGxhIGZlY2hhIGRlIHN1IGNyZWFjacOzbiBlbCAxNSBkZSBhYnJpbCBkZSAyMDE2IGhhc3RhIGVsIDMxIGRlIGRpY2llbWJyZSBkZSAyMDE3LiBFcyBkZWNpciBxdWUgY29udGFtb3MgY29uIGVsIGNlbnNvIGRlIGxvcyB0d2VldHMgeSBubyBjb24gdW5hIG11ZXN0cmEuIFNvbiAzOTg2IHR3ZWV0cyBlbiAyMCBtZXNlcywgcXVlIG1vc3RyYW1vcyBhIGNvbnRpbnVhY2nDs246CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQpldm92YXIgPC0gcmVhZF9jc3YoImV2b3Zhci5jc3YiKQpldm92YXIKYGBgCgojIyBQcmVwYXJhY2nDs24gZGUgbG9zIGRhdG9zCgpVbmEgcGllemEgY2VudHJhbCBwYXJhIHVuIGFuw6FsaXNpcyBkZSB0ZXh0byAoKnRleHQgbWluaW5nKikgZXMgZWwgdG9rZW5pemFkby4gw4lzdGUgY29uc2lzdGUgZW4gcG9kZXIgdHJhbnNmb3JtYXIgbGEgZXN0cnVjdHVyYSBkZSBkYXRvcyBkZSBsb3MgdHdlZXRzLCBkZSBjYXJhY3RlcmVzIGEgcGFsYWJyYXMsIHBhcmEgcG9zdGVyaW9ybWVudGUgcmVlc3RydWN0dXJhciBsYSB0YWJsYSBkZSB0YWwgbW9kbyBxdWUgaGF5YSB1bmEgc29sYSBwYWxhYnJhIGVuIGNhZGEgZmlsYS4gVXRpbGl6YXJlbW9zIGxvcyBzaWd1aWVudGVzIHBhcXVldGVzIGBzdHJpbmdgIHkgYHN0cmluZ3JgIHBhcmEgbGEgbWFuaXB1bGFjacOzbiBkZSBjYXJhY3RlcmVzLCBgZHBseXJgIHBhcmEgbGEgbWFuaXB1bGFjacOzbiBkZSBsYSB0YWJsYSBkZSBkYXRvcywgYG1hZ3JpdHRyYCBwYXJhIGVsIHVzbyBkZSAqcGlwZXMqIHkgYHRpZHl0ZXh0YCBwYXJhIGVsIHRva2VuaXphZG8geSBlbCBhbsOhbGlzaXMgZGUgdGV4dG8gZW4gZ2VuZXJhbC4gCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHN0cmluZ2kpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh0aWR5dGV4dCkKCiMgUXVpdGFtb3MgbG9zIGFjZW50b3MgYSBsb3MgdHdlZXRzIChkYWRvIHF1ZSB0aWR5dGV4dCB0aWVuZSBjb25mbGljdG9zIGNvbiBlbGxvcykKZXZvdmFyJHRleHQgPC0gc3RyaV90cmFuc19nZW5lcmFsKGV2b3ZhciR0ZXh0LCAiTGF0aW4tQVNDSUkiKQoKIyBBaG9yYSBsaW1waWFtb3MgbGEgdmFyaWFibGUgdGV4dCBkZSBhbGd1bm9zIGVsZW1lbnRvcyBpbm5lY2VzYXJpb3MgeSAgdG9rZW5pemFtb3MKcmVwbGFjZV9yZWcgPC0gImh0dHBzOi8vdC5jby9bQS1aYS16XFxkXSt8aHR0cDovL1tBLVphLXpcXGRdK3wmYW1wO3wmbHQ7fCZndDt8UlR8aHR0cHMiCnVubmVzdF9yZWcgPC0gIihbXkEtWmEtel9cXGQjQCddfCcoPyFbQS1aYS16X1xcZCNAXSkpIgpldm92YXJfdCA8LSBldm92YXIgJT4lIAogIGZpbHRlcighc3RyX2RldGVjdCh0ZXh0LCAiXlJUIikpICU+JQogIG11dGF0ZSh0ZXh0ID0gc3RyX3JlcGxhY2VfYWxsKHRleHQsIHJlcGxhY2VfcmVnLCAiIikpICU+JQogIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCwgdG9rZW4gPSAicmVnZXgiLCBwYXR0ZXJuID0gdW5uZXN0X3JlZykgCnJtKHJlcGxhY2VfcmVnLCB1bm5lc3RfcmVnKSAKYGBgCgpFbCByZXN1bHRhZG8gZXMgdW5hIHRhYmxhIGRlIGRhdG9zIG3DoXMgZ3JhbmRlLCBkZSA5NTY1NiBvYnNlcnZhY2lvbmVzLCBkb25kZSBzZSByZW1wbGF6YSBsYSB2YXJpYWJsZSAqdGV4dCosIHR3ZWV0IGVudGVybywgcG9yIGxhIGRlICp3b3JkKiwgcGFsYWJyYXMgcXVlIGNvbnRpZW5lIGVsIHR3ZWV0LCBtYW50ZW5pZW5kbyBsYSB2YXJpYWJsZSAqWCogcGFyYSBpZGVudGlmaWNhciBlbCByZXNwZWN0aXZvIHR3ZWV0OgoKYGBge3J9CnN0cihldm92YXJfdCkKYGBgCgpFbCBzaWd1aWVudGUgcHJvYmxlbWEgZXMgcXVlIGxhcyBwYWxhYnJhcyBjb24gbWF5b3IgZnJlY3VlbmNpYSBzb24sIGNvbW8gZXJhIGRlIGVzcGVyYXJzZSwgYXJ0w61jdWxvcywgcHJlcG9zaWNpb25lcywgY29uanVuY2lvbmVzLCB5IG90cm9zIHNpbWlsYXJlczogCgpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpmcmVxMSA8LSBldm92YXJfdCAlPiUKICAgICAgICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkKaGVhZChmcmVxMSwgbiA9IDMwKSAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHJlb3JkZXIod29yZCwgbiksIG4pKSArCiAgICAgICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgICAgICAgY29vcmRfZmxpcCgpICsgCiAgICAgICAgeGxhYigiUGFsYWJyYXMgbcOhcyB1c2FkYXMiKSArCiAgICAgICAgeWxhYigiTsO6bWVybyIpICsKICAgICAgICB0aGVtZV9taW5pbWFsKCkKYGBgCgpFc2FzIHBhbGFicmFzIG5vIGFncmVnYW4gbmluZ3VuYSBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgZW50ZW5kZXIgbGEgcG9sYXJpZGFkIGRlIGxvcyAqc2VudGltZW50cyosIHNvbiAicGFsYWJyYXMgdmFjw61hcyIgcXVlIGRlYmVtb3MgZmlsdHJhci4gUGFyYSBlbGxvIG5lY2VzaXRhbW9zIHVuYSBsaXN0YSBkZSBlc2UgdGlwbyBkZSBwYWxhYnJhcyBlbiBlc3Bhw7FvbCBxdWUgZXh0cmFlcmVtb3MgZGVsIHBhcXVldGUgYHN0b3B3b3Jkc2A6CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHN0b3B3b3JkcykKCiNjcmVhciB1bmEgbGlzdGEgZGUgcGFsYWJyYXMgdmFjaWFzIGVuIGVzcGHDsW9sCnN0b3B3b3Jkc19FUyA8LSB0aWJibGUoc3RvcHdvcmRzKCJzcGFuaXNoIikpIApjb2xuYW1lcyhzdG9wd29yZHNfRVMpIDwtICJ3b3JkIgoKI0FncmVnYW1vcyBhbGd1bmFzIHBhbGFicmFzIHZhY2lhcyBhZGljaW9uYWxlcyAobHVnYXJlcyB5IG1vbmVkYXMsIGV0Yy4pCmN1c3RvbV9zdG9wIDwtIHRpYmJsZSh3b3JkID0gYygic2FudGEiLCAiY3J1eiIsICJjb2NoYWJhbWJhIiwgImJzIiwgInVzIiwgIm1tIiwgInByb250byIsICJzZXJpYSIsICJjb3J0ZSIsICJwcmltZXJvIiwgInNlZ3VybyIsICJzZWd1cm9zIikpCnN0b3B3b3Jkc19FUyA8LSBiaW5kX3Jvd3MoY3VzdG9tX3N0b3AsIHN0b3B3b3Jkc19FUykKcm0oY3VzdG9tX3N0b3ApCgojZmlsdHJhZG8gY29uIGxhIGxpc3RhIGRlIHBhbGFicmFzIHZhY2lhcwpldm92YXJfdGYgPC0gZXZvdmFyX3QgJT4lIAogZmlsdGVyKCF3b3JkICVpbiUgc3RvcHdvcmRzX0VTJHdvcmQsCiAgICAgICAgIHN0cl9kZXRlY3Qod29yZCwgIlthLXpdIikpCnN0cihldm92YXJfdGYpCmBgYAoKQWhvcmEgc8OtIHBvZGVtb3Mgb2JzZXJ2YXIgbGFzIHBhbGFicmFzIG3DoXMgdXRpbGl6YWRhcyBwb3IgQGV2b2VzcHVlYmxvOgpgYGB7cn0KZnJlcTIgPC0gZXZvdmFyX3RmICU+JQogICAgICAgIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQpoZWFkKGZyZXEyLCBuID0gMzApICU+JQogICAgICAgIGdncGxvdChhZXMocmVvcmRlcih3b3JkLCBuKSwgbikpICsKICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICAgICAgICBjb29yZF9mbGlwKCkgKwogICAgICAgIHhsYWIoIlBhbGFicmFzIG3DoXMgdXNhZGFzIikgKwogICAgICAgIHlsYWIoIk7Dum1lcm8iKSsKICAgICAgICB0aGVtZV9taW5pbWFsKCkKYGBgCgojIyBBbsOhbGlzaXMgZGUgZGF0b3MKCkVsIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50byBub3MgcGVybWl0ZSBhcHJveGltYXJub3MgYSBsYSBpbnRlbmNpw7NuIGVtb2Npb25hbCBkZSBsb3MgdHdlZXRzIHF1ZSBsYW56YSBlbCBwcmVzaWRlbnRlIEV2byBNb3JhbGVzLiBFc3RlIHRpcG8gZGUgYW7DoWxpc2lzIHB1ZWRlIGJhc2Fyc2UgZW4gZWwgYW7DoWxpc2lzIGRlIHBhbGFicmFzIG8gcmVsYWNpb25lcyBkZSBwYWxhYnJhcyAobi1ncmFtYXMpIHkgc2UgcHVlZGVuIGV2YWx1YXIgZGlmZXJlbnRlcyBlc2NhbGFzIGRlIHNlbnRpbWllbnRvIChiaW5hcmlhcywgcG9uZGVyYWRhcywgZXRjLikuIEFxdcOtIGVsZWdpbW9zIGVsIGVuZm9xdWUgZGUgImJvbHNhIGRlIHBhbGFicmFzIiwgZWwgbml2ZWwgZGVsIHVuaWdyYW1hIHkgbGEgZXNjYWxhIGJpbmFyaWEsIGNvbW8gdW5hIHByaW1lcmEgYXByb3hpbWFjacOzbiBleHBlZGl0YS4gQWhvcmEgYmllbiwgZXhpc3RlbiBkaXZlcnNvcyBtw6l0b2RvcyBwYXJhIGV2YWx1YXIgbG9zICpzZW50aW1lbnRzKiBlbiBsb3MgdGV4dG9zLCBkZXNkZSBsYSBhbm90YWNpw7NuIG1hbnVhbCBoYXN0YSBlbCB1c28gZGUgKm1hY2hpbmUgbGVhcm5pbmcqLCBwZXJvIGFxdcOtIHV0aWxpemFyZW1vcyBlbCBtw6l0b2RvIGJhc2FkbyBlbiBkaWNjaW9uYXJpbyAoU2lsZ2UgeSBSb2JpbnNvbiAyMDE3KS4gRXN0ZSBtw6l0b2RvIGNvbnN0ZSBlbiB1dGlsaXphciB1biBkaWNjaW9uYXJpbyBlbiBmb3JtYXRvICpjbGF2ZTp2YWxvciogcGFyYSBldmFsdWFyIGNhZGEgcGFsYWJyYS4gU2UgY29uc2lkZXJhIGFsIHR3ZWV0IGNvbW8gdW5hIGNvbWJpbmFjacOzbiBkZSBwYWxhYnJhcyBpbmRpdmlkdWFsZXMgcXVlIHRpZW5lbiB1bmEgY2FyZ2EgZW1vY2lvbmFsIHkgbGEgcHJvcG9yY2nDs24gZGUgZXNhcyBwYWxhYnJhcyBub3MgZGEgZWwgc2VudGltaWVudG8gZ2VuZXJhbCBkZWwgdHdlZXQsIGNvbW8gcG9zdGVyaW9ybWVudGUgcmVmbGVqYXJlbW9zIGVuIHVuIGluZGljZSBkZSBzZW50aW1pZW50by4gIAoKTG9zIGRpY2Npb25hcmlvcyBwYXJhIGFuw6FsaXNpcyBkZSBzZW50aW1pZW50byBlbiBlc3Bhw7FvbCBzb24gZXNjYXNvcyB5IHBvY28gZGVzYXJyb2xsYWRvcy4gRGVzcHXDqXMgZGUgdW5hIGxhcmdhIGLDunNxdWVkYSBwdWRpbW9zIGVuY29udHJhciBlbCBkaWNjaW9uYXJpbyBbaVNvbF0oaHR0cDovL3RpbW0udWphZW4uZXMvcmVjdXJzb3MvaXNvbC8pIHF1ZSBlc3TDoSBmb3JtYWRvIHBvciA4MTM1IHBhbGFicmFzLCAyLjUwOSBwb3NpdGl2YXMgeSA1LjYyNiBuZWdhdGl2YXMsIGRlamFuZG8gYSB1biBsYWRvIGxhcyBwYWxhYnJhcyBlbW9jaW9uYWxtZW50ZSBuZXV0cmFzLiBFc3RlIGRpY2Npb25hcmlvIGEgc3UgdmV6IGVzdMOhIGJhc2FkbyBlbiBvdHJvIGRpY2Npb25hcmlvIGVuIGluZ2zDqXMgYmFzdGFudGUgdGVzdGVhZG8gY29tbyBlcyBlbCBkZSBbQmluZyBMaXVdKGh0dHBzOi8vd3d3LmNzLnVpYy5lZHUvfmxpdWIvRkJTL3NlbnRpbWVudC1hbmFseXNpcy5odG1sKSwgc2llbmRvIHVuYSB0cmFkdWNjacOzbiBlc3BlY2lhbGl6YWRhIHkgbWVqb3JhZGEuICAKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CiNjYXJnYW1vcyB5IGFkZWN1YW1vcyBlbCBkaWNjaW9uYXJpbyBhbCBmb3JtYXRvIHJlcXVlcmlkbwpuZWdhdGl2YXMgPC0gcmVhZF9jc3YoImlzb2wvbmVnYXRpdmFzX21lam9yYWRhLmNzdiIsIGNvbF9uYW1lcyA9ICJ3b3JkIikgJT4lCiAgbXV0YXRlKHNlbnRpbWVudCA9ICJuZWdhdGl2byIpIApwb3NpdGl2YXMgPC0gcmVhZF9jc3YoImlzb2wvcG9zaXRpdmFzX21lam9yYWRhLmNzdiIsIGNvbF9uYW1lcyA9ICJ3b3JkIikgJT4lCiAgbXV0YXRlKHNlbnRpbWVudCA9ICJwb3NpdGl2byIpCmJpbmdFUyA8LSBiaW5kX3Jvd3MobmVnYXRpdmFzLCBwb3NpdGl2YXMpIApybShuZWdhdGl2YXMsIHBvc2l0aXZhcykKCiMgUXVpdGFtb3MgbG9zIGFjZW50b3MKYmluZ0VTJHdvcmQgPC0gc3RyaV90cmFuc19nZW5lcmFsKGJpbmdFUyR3b3JkLCAiTGF0aW4tQVNDSUkiKSAKYmluZ0VTCmBgYAoKVW5hIHByaW1lcmEgcHJ1ZWJhIGRlbCBkaWNjaW9uYXJpbyBxdWUgcmVhbGl6YXJlbW9zIHNlcsOhIGNvbXByb2JhciBxdcOpIHBvcmNlbnRhamUgZGUgbGFzIHBhbGFicmFzIMO6bmljYXMgdXRpbGl6YWRhcyBwb3IgQGV2b2VzcHVlYmxvIGNsYXNpZmljYSBlc3RlIGRpY2Npb25hcmlvOgoKYGBge3J9CmV2b193IDwtIHVuaXF1ZShldm92YXJfdGYkd29yZCkgJT4lIHRpYmJsZSgpICMgcGFsYWJyYXMgw7puaWNhcyB1c2FkYXMgcG9yIGV2b2VzcHVlYmxvOiAxMDQ1MQpjb2xuYW1lcyhldm9fdykgPC0gIndvcmQiCmRpY193IDwtIGJpbmdFUyR3b3JkICMgcGFsYWJyYXMgZW4gZWwgZGljY2lvbmFyaW86IDgxMzUKZXZvX3djIDwtIGV2b193ICU+JSBmaWx0ZXIod29yZCAlaW4lIGRpY193KSAgIyBwYWxhYnJhcyBjbGFzaWZpY2FkYXM6IDExNzEKZXZvX3VjIDwtIGV2b193ICU+JSBmaWx0ZXIoIXdvcmQgJWluJSBkaWNfdykgIyBwYWxhYnJhcyBubyBjbGFzaWZpY2FkYXM6IDkyODAKCiMgUG9yY2VudGFqZSBkZSBwYWxhYnJhcyBjbGFzaWZpY2FkYWFzCnBvcl93IDwtIChsZW5ndGgoZXZvX3djJHdvcmQpIC8gbGVuZ3RoKGV2b193JHdvcmQpKSAqIDEwMApwb3JfdwpgYGAKCkVsIGRpY2Npb25hcmlvIGNsYXNpZmljw7MgZWwgMTElIGRlIGxhcyBwYWxhYnJhcy4gTG8gaWRlYWwgZXMgcXVlIGVsIGRpY2Npb25hcmlvIHNlIGFwcm94aW1lIGFsIDIwJSBkZSBsYXMgcGFsYWJyYXMgc2lndWllbmRvIGxhIGxleSBkZSBaaXBmW143XSwgcG9yIGxvIHF1ZSBlZmVjdHVhcmVtb3MgdW5hcyBtb2RpZmljYWNpb25lcy4gIAoKQWwgcmV2aXNhciBlbCBkaWNjaW9uYXJpbyBlbmNvbnRyYW1vcyB0cmVzIHByb2JsZW1hcy4gUHJpbWVybywgc2kgYmllbiBjb250aWVuZSBtdWNoYXMgcGFsYWJyYXMgY29uIGNsYXJhIGNhcmdhIHNlbnRpbWVudGFsLCBlbiBvY2FzaW9uZXMgbm8gY29udGllbmUgdG9kYXMgc3VzIGZsZXhpb25lcy4gU2VndW5kbywgZGFkbyBxdWUgZXMgdW4gZGljY2lvbmFyaW8gZ2VuZXJhbCwgbm8gY2FwdHVyYSBhbGd1bmFzIHBhcnRpY3VsYXJpZGFkZXMgZGVsIGRpc2N1cnNvIHBvbMOtdGljbyBkZWwgcHJlc2lkZW50ZSwgcGFydGljdWxhcm1lbnRlIHN1IGRpc2N1cnNvIG5hY2lvbmFsaXN0YS4gVGVyY2VybywgZXhpc3RlbiBwYWxhYnJhcyBwb2xhcml6YWRhcyBxdWUgc2lydmVuIHBhcmEgaW5kaWNhciBlbCBzZW50aW1pZW50byBmcmVudGUgYSB1biBwcm9kdWN0byBvIHNlcnZpY2lvLCBwZXJvIG5vIHRpZW5lbiBlZmVjdGl2aWRhZCBlbiB0ZW1hcyBwb2zDrXRpY29zLiBQYXJhIGVsIHByaW1lciBwcm9ibGVtYSBhw7FhZGlyZW1vcyBmbGV4aW9uZXMgYmFzYWRhcyB5YSBlbiBsYXMgcGFsYWJyYXMgZXhpc3RlbnRlcyBlbiBlbCBkaWNjaW9uYXJpbywgcGFyYSBlbCBzZWd1bmRvIGHDsWFkaXJlbW9zIGxhcyBwYWxhYnJhcyBwb2xpdGl6YWRhcyBtw6FzIHV0aWxpemFkYXMsIGV2YWx1YW5kbyBzdSBwb2xhcmlkYWQgZW4gdW4gaW50ZW50byBkZSB1biBkaWNjaW9uYXJpbyBwb2zDrXRpY28gaW5pY2lhbCwgeSBwYXJhIGVsIHRlcmNlcm8gcmV0aXJhcmVtb3MgbGFzIHBhbGFicmFzIG5vIGFwcm9waWFkYXM6CgpgYGB7ciBtZXNzYWdlPUZBTFNFfQojQcOxYWRpZW5kbyBmbGV4aW9uZXMgeSBvdHJhcyBwYWxhYnJhcyBwb2xhcml6YWRhcwpmbGV4X2RpYyA8LSByZWFkX2NzdigiZXZvX3VjLmNzdiIsIGNvbF9uYW1lcyA9IGMoIndvcmQiLCAic2VudGltZW50IikpCmZsZXhfZGljIDwtIGZsZXhfZGljICU+JSBmaWx0ZXIoc3RyX2RldGVjdChzZW50aW1lbnQsICJwb3NpdGl2b3xuZWdhdGl2byIpKQpiaW5nRVNtb2QgPC0gYmluZF9yb3dzKGJpbmdFUywgZmxleF9kaWMpCgojQcOxYWRpZW5kbyBwYWxhYnJhcyBwb2xpdGl6YWRhcwp0cmliYmxlKAogIH53b3JkLCB+c2VudGltZW50LAogICJwdWVibG8iLCAicG9zaXRpdm8iLAogICJlZXV1IiwgIm5lZ2F0aXZvIiwKICAiZXN0YWRvdW5pZGVuc2UiLCAibmVnYXRpdm8iLAogICJlc3RhZG91bmlkZW5zZXMiLCAibmVnYXRpdm8iLAogICJtYXIiLCAicG9zaXRpdm8iLAogICJjaGlsZSIsICJuZWdhdGl2byIsCiAgImltcGVyaW8iLCAibmVnYXRpdm8iLAogICJpbXBlcmlvcyIsICJuZWdhdGl2byIsCiAgImltcGVyaWFsIiwgIm5lZ2F0aXZvIiwKICAiaW1wZXJpYWxlcyIsICJuZWdhdGl2byIsCiAgImltcGVyaWFsaXNtbyIsICJuZWdhdGl2byIsCiAgImNhcGl0YWxpc21vIiwgIm5lZ2F0aXZvIiwKICAiY2FwaXRhbGlzdGEiLCAibmVnYXRpdm8iLAogICJwcm9jYXBpdGFsaXN0YSIsICJuZWdhdGl2byIsCiAgImNhcGl0YWxpemFjacOzbiIsICJuZWdhdGl2byIsCiAgIm5lb2xpYmVyYWwiLCAibmVnYXRpdm8iLAogICJuZW9saWJlcmFsZXMiLCAibmVnYXRpdm8iLAogICJuZW9saWJlcmFsaXNtbyIsICJuZWdhdGl2byIsCiAgIm5lb2NvbG9uaWFsIiwgIm5lZ2F0aXZvIiwKICAibmVvY29sb25pYWxlcyIsICJuZWdhdGl2byIsCiAgIm5lb2NvbG9uaWFsaXNtbyIsICJuZWdhdGl2byIsCiAgInJlY29sb25pemFjaW9uIiwgIm5lZ2F0aXZvIiwKICAib2xpZ2FycXVpYSIsICJuZWdhdGl2byIsCiAgIm9saWdhcnF1aWFzIiwgIm5lZ2F0aXZvIiwKICAib2xpZ2FyY2EiLCAibmVnYXRpdm8iLAogICJvbGlnYXJjYXMiLCAibmVnYXRpdm8iLAogICJvbGlnYXJxdWljYSIsICJuZWdhdGl2byIsCiAgIm9saWdhcnF1aWNvcyIsICJuZWdhdGl2byIsCiAgImRlcmVjaGEiLCAibmVnYXRpdm8iLAogICJkZXJlY2hpc3RhcyIsICJuZWdhdGl2byIsCiAgImdvbmkiLCAibmVnYXRpdm8iLAogICJzYW5jaGV6IiwgIm5lZ2F0aXZvIiwKICAiYmFuemVyIiwgIm5lZ2F0aXZvIiwKICAidHV0byIsICJuZWdhdGl2byIsCiAgImRvcmlhIiwgIm5lZ2F0aXZvIiwKICAiYWxtYWdybyIsICJuZWdhdGl2byIsCiAgIm9lYSIsICJuZWdhdGl2byIsCiAgImZtaSIsICJuZWdhdGl2byIsCiAgInRydW1wIiwgIm5lZ2F0aXZvIiwKICAicGF0cmlhIiwgInBvc2l0aXZvIiwKICAic29iZXJhbmlhIiwgInBvc2l0aXZvIiwKICAic29iZXJhbmlhcyIsICJwb3NpdGl2byIsCiAgInNvYmVyYW5vIiwgInBvc2l0aXZvIiwKICAic29iZXJhbm9zIiwgInBvc2l0aXZvIiwKICAidHJhbnNuYWNpb25hbCIsICJuZWdhdGl2byIsCiAgIm9wb3NpdG9yIiwgIm5lZ2F0aXZvIiwKICAib3Bvc2l0b3JhIiwgIm5lZ2F0aXZvIiwKICAib3Bvc2l0b3JlcyIsICJuZWdhdGl2byIKKSAtPiBwb2xfZGljCmJpbmdFU21vZCA8LSBiaW5kX3Jvd3MoYmluZ0VTbW9kLCBwb2xfZGljKQoKI1F1aXRhbmRvIG90cmFzIHBhbGFicmFzIG5vIHBlcnRpbmVudGVzCnN1cHJfZGljIDwtIGMoIm1lam9yIiwgIm1lam9yZXMiLCAicGVvciIsICJwZW9yZXMiLCAiZWNvbm9taWNvIiwgImVjb25vbWljb3MiLCAibnVldmEiLCAibnVldmFzIiwgIm51ZXZvIiwgIm51ZXZvcyIsICJncmFuZGUiLCAiZ3JhbmRlcyIsICJpbXBvcnRhbnRlIiwgImltcG9ydGFudGVzIiwgImRlY2lzaW9uIiwgImludGVyZXMiLCAiaW50ZXJlc2VzIiwgIm1heW9yIiwgInByaW1lcmEiLCAibWFkdXJvIiwgImdhcmFudGl6YXIiLCAiaHVtYW5vIiwgImh1bWFub3MiLCAibnVldmFzIiwgInJlY3Vyc29zIiwgImxpZGVyIiwgImxpZGVyZXMiLCAicHJvbnRvIiwgInNlcmlhIiwgImNvcnRlIiwgInByaW1lcm8iLCAic2VndXJvIiwgInNlZ3Vyb3MiLCAicHJpbmNpcGFsIiwgInByaW5jaXBhbGVzIiwgInNlbnRpZG8iKQpiaW5nRVNtb2QgPC0gYmluZ0VTbW9kICAlPiUgZmlsdGVyKCF3b3JkICVpbiUgc3Vwcl9kaWMpCmBgYAoKVm9sdmVtb3MgYSBldmFsdWFyIGVsIGFsY2FuY2UgZGVsIGRpY2Npb25hcmlvIHkgbGxlZ2Ftb3MgY2FzaSBhbCAxNyU6CgpgYGB7cn0KZGljX3cgPC0gYmluZ0VTbW9kJHdvcmQgIyBwYWxhYnJhcyBlbiBlbCBkaWNjaW9uYXJpbwpldm9fd2MgPC0gZXZvX3cgJT4lIGZpbHRlcih3b3JkICVpbiUgZGljX3cpICAjIHBhbGFicmFzIGNsYXNpZmljYWRhcwoKIyBQb3JjZW50YWplIGRlIHBhbGFicmFzIGNsYXNpZmljYWRhYXMKcG9yX3cgPC0gKGxlbmd0aChldm9fd2Mkd29yZCkgLyBsZW5ndGgoZXZvX3ckd29yZCkpICogMTAwCnBvcl93CmBgYAoKQWhvcmEgc8OtLCBlc3RhbW9zIGxpc3RvcyBwYXJhIHBhcmEgcmVhbGl6YXIgbGEgY2xhc2lmaWNhY2nDs24gZGUgc2VudGltaWVudG9zLiBHcmFjaWFzIGFsIHRva2VuaXphZG8sIHF1ZSBub3MgZGVqbyB1bmEgZXN0cnVjdHVyYSBkZSB1bmEgcGFsYWJyYSBwb3Igb2JzZXJ2YWNpw7NuIHkgYWwgZGljY2lvbmFyaW8gZW4gZm9ybWF0byBjbGF2ZTogdmFsb3IsIGVzdGEgY2xhc2lmaWNhY2nDs24gc29sbyBub3Mgb2N1cGFyw6EgbGEgZnVuY2nDs24gYGlubmVyX2pvaW5gIHF1ZSBmdXNpb25hIGRvcyB0YWJsYXMgZGUgZGF0b3MgcG9yIHZhbG9yZXMgY29tdW5lczoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmV2b3NlbnRpbWVudCA8LSBldm92YXJfdGYgJT4lCiAgaW5uZXJfam9pbihiaW5nRVNtb2QpCmV2b3NlbnRpbWVudApgYGAKCkFxdcOtIHVuIHByaW1lciBhY2VyY2FtaWVudG8gYWwgY2xpbWEgZW1vY2lvbmFsIGRlIGxvcyB0d2VldHMgZGVsIHByZXNpZGVudGUgY29uc2lzdGUgZW4gdmVyIGxvcyBwb3JjZW50YWplcyBnbG9iYWxlcyBkZSBwYWxhYnJhcyBwb3NpdGl2YXMgeSBuZWdhdGl2YXM6CgpgYGB7cn0KZXZvc2VudGltZW50ICU+JQogICAgICAgIGdncGxvdChhZXMoc2VudGltZW50KSkgKwogICAgICAgIGdlb21fYmFyKGFlcyh5ID0gKC4uY291bnQuLikvc3VtKC4uY291bnQuLikqMTAwKSkgKwogICAgICAgIHhsYWIoInNlbnRpbWllbnRvIikgKyAKICAgICAgICB5bGFiKCJwb3JjZW50YWplIikgKwogICAgICAgIHRoZW1lX21pbmltYWwoKQpgYGAKCkFwcm94aW1hZGFtZW50ZSB1biA1NyUgZGUgbGFzIHBhbGFicmFzIHF1ZSBoYSB1dGlsaXphZG8gRXZvIHNvbiBuZWdhdGl2YXMsIG1pZW50cmFzIGVsIDQzJSBzb24gbmVnYXRpdmFzLiAKCkxhcyBwYWxhYnJhcyBxdWUgbcOhcyBwZXNvIGFwb3J0YW4gYSBsYSBwb3NpdGl2aWRhZCB5IG5lZ2F0aXZpZGFkIHNvbiBsYXMgc2lndWllbnRlczoKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmNvdW50X3NlbnQgPC0gZXZvc2VudGltZW50ICU+JQogIGNvdW50KHdvcmQsIHNlbnRpbWVudCwgc29ydCA9IFRSVUUpICU+JQogIHVuZ3JvdXAoKQpjb3VudF9zZW50CgojR3JhZmljYW1vcwpjb3VudF9zZW50ICU+JQogZ3JvdXBfYnkoc2VudGltZW50KSAlPiUKICB0b3BfbigzMCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh3b3JkID0gcmVvcmRlcih3b3JkLCBuKSkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gc2VudGltZW50KSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBmYWNldF93cmFwKH5zZW50aW1lbnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgbGFicyh5ID0gIkNvbnRyaWJ1Y2nDs24gYWwgc2VudGltaWVudG8iLAogICAgICAgeCA9IE5VTEwpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCkFob3JhIGNyZWFyZW1vcyB1biBpbmRpY2UgZGUgc2VudGltaWVudG8gKCppc2VudCopIHBhcmEgcG9uZGVyYXIgbGEgY2FyZ2EgZGUgcG9zaXRpdmlkYWQgbyBuZWdhdGl2aWRhZCBlbiBjYWRhIHR3ZWV0LiBQYXJhIGVsbG86ICAkaXNlbnQodCkgPSBzIC8gbnckICBkb25kZSBlbCBpbmRpY2UgZGUgc2VudGltaWVudG8gcGFyYSB1biB0d2VldCBzZXJhIGxhIHByb3BvcmNpw7NuIGVudHJlIGVsIG51bWVybyBkZSBwYWxhYnJhcyBjb24gY2FyZ2EgZW1vY2lvbmFsICRzJCBkaXZpZGlkbyBlbnRyZSBlbCB0b3RhbCBkZSBwYWxhYnJhcyAkbnckLCBleGNsdXllbmRvIGxhcyBwYWxhYnJhcyB2YWPDrWFzLiBDcmVhcmVtb3MgdW4gw61uZGljZSBwYXJhIGNhZGEgcG9sYXJpZGFkOgoKYGBge3IgbWVzc2FnZT1GQUxTRX0KI0NvbnRhbW9zIGVsIHRvdGFsIGRlIHBhbGFicmFzIG5lZ2F0aXZhcyB5IHBvc2l0aXZhcyBwb3IgdHdlZXRzCmxpYnJhcnkodGlkeXIpCnR3ZWV0c19zZW4gPC0gZXZvc2VudGltZW50ICU+JQogIGdyb3VwX2J5KFgpICU+JQogIGNvdW50KHNlbnRpbWVudCkKZXZvdmFyX3NlbnQgPC0gaW5uZXJfam9pbihldm92YXIsIHR3ZWV0c19zZW4pCmV2b3Zhcl9zZW50IDwtIHNwcmVhZChldm92YXJfc2VudCwgc2VudGltZW50LCBuKQpldm92YXJfc2VudFtpcy5uYShldm92YXJfc2VudCldIDwtIDAKCiNMaW1waWFtb3MgZGUgbGFzIHBhbGFicmFzIHZhY2lhcyB5IGxhcyBVUkwgZGUgbGEgdmFyaWFibGUgdGV4dG8geSBsYSBhw7FhZGltb3MgYSBudWVzdHJhIHRhYmxhIGRlIGRhdG9zCmxpYnJhcnkodG0pCmV2b19jb3JwdXMgPC0gKENvcnB1cyhWZWN0b3JTb3VyY2UoZXZvdmFyX3NlbnQkdGV4dCkpKQpjb3JwdXMgPC0gdG1fbWFwKGV2b19jb3JwdXMsIHJlbW92ZVdvcmRzLCBzdG9wd29yZHMoInNwYW5pc2giKSkKcmVtb3ZlVVJMIDwtIGZ1bmN0aW9uKHgpIGdzdWIoImh0dHBbWzphbG51bTpdWzpwdW5jdDpdXSoiLCAiIiwgeCkgCgpjb3JwdXMgPC0gdG1fbWFwKGNvcnB1cywgY29udGVudF90cmFuc2Zvcm1lcihyZW1vdmVVUkwpKQp0ZXh0X2MgPC0gZGF0YS5mcmFtZSh0ZXh0PXNhcHBseShjb3JwdXMsIGlkZW50aXR5KSwgCiAgICBzdHJpbmdzQXNGYWN0b3JzPUYpCmV2b3Zhcl9zZW50IDwtIGJpbmRfY29scyhldm92YXJfc2VudCwgdGV4dF9jKQoKI0NvbnRhbW9zIGxhcyBwYWxhYnJhcyBkZSBjYWRhIHR3ZWV0IHkgY2FsY3VsYW1vcyBsb3MgaW5kaWNlcwpldm92YXJfc2VudCA8LSBtdXRhdGUoZXZvdmFyX3NlbnQsIG53ID0gc3RyX2NvdW50KGV2b3Zhcl9zZW50JHRleHQxLCAiXFxTKyIpKQpldm92YXJfc2VudCA8LSBtdXRhdGUoZXZvdmFyX3NlbnQsIGlzZW50X25lZyA9ICAobmVnYXRpdm8gLyBudykqMTAwKQpldm92YXJfc2VudCA8LSBtdXRhdGUoZXZvdmFyX3NlbnQsIGlzZW50X3BvcyA9ICAocG9zaXRpdm8gLyBudykqMTAwKQpgYGAgCgpBaG9yYSBjcmVhcmVtb3MgdW5hIHZhcmlhYmxlIG51ZXZhIGxsYW1hZGEgKmludGVyYWN0KiBxdWUgZXMgc2ltcGxlbWVudGUgbGEgc3VtYSBkZSBkZSBsb3MgZmF2cyB5IHJldHdlZXRzLiBFbGxvIHNlIGp1c3RpZmljYSBwb3JxdWUgZXhpc3RlIHVuYSBmdWVydGUgY29ycmVsYWNpw7NuIGVudHJlIGVzb3MgZG9zIHRpcG9zIGRlIGludGVyYWNjacOzbi4gCgpgYGB7cn0KI0NvcnJlbGFjacOzbiBlbnRyZSBsb3MgZmF2cyB5IGxvcyByZXR3ZWV0cwpjb3IoZXZvdmFyX3NlbnQkZmF2b3JpdGVfY291bnQsIGV2b3Zhcl9zZW50JHJldHdlZXRfY291bnQpCiNDcmVhbW9zIHVuYSBudWV2YSB2YXJpYWJsZSBxdWUgZXMgbGEgaW50ZXJhY2Npw7NuCmV2b3Zhcl9zZW50JGludGVyYWN0IDwtIGV2b3Zhcl9zZW50JGZhdm9yaXRlX2NvdW50ICsgZXZvdmFyX3NlbnQkcmV0d2VldF9jb3VudApgYGAKUG9yIHVsdGltbyBncmFmaWNhcmVtb3MgeSBjYWxjdWxhcmVtb3MgbGEgcmVsYWNpw7NuIGVudHJlIGVsIGluZGljZSBkZSBzZW50aW1pZW50byB5IGxhIGludGVyYWNjacOzbjoKCmBgYHtyfQpldm92YXJfc2VudCAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gaXNlbnRfcG9zLCB5ID0gaW50ZXJhY3QpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX21pbmltYWwoKQpjb3IoZXZvdmFyX3NlbnQkaXNlbnRfcG9zLCBldm92YXJfc2VudCRpbnRlcmFjdCkgI2NvcnJlbGFjacOzbgpyZWdwb3MgPC0gbG0oaW50ZXJhY3QgfiBpc2VudF9wb3MsIGV2b3Zhcl9zZW50KSAjcmVncmVzaW9uIGxpbmVhbApzdW1tYXJ5KHJlZ3BvcykKYGBgCgoKCmBgYHtyfQpldm92YXJfc2VudCAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gaXNlbnRfbmVnLCB5ID0gaW50ZXJhY3QpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX21pbmltYWwoKQpjb3IoZXZvdmFyX3NlbnQkaXNlbnRfbmVnLCBldm92YXJfc2VudCRpbnRlcmFjdCkjY29ycmVsYWNpw7NuCnJlZ25lZyA8LSBsbShpbnRlcmFjdCB+IGlzZW50X25lZywgZXZvdmFyX3NlbnQpICNyZWdyZXNpb24gbGluZWFsCnN1bW1hcnkocmVnbmVnKQoKCmBgYAoKIyMgQ29uY2x1c2nDs24KCkxhIHBvbGFyaWRhZCBnZW5lcmFsIGRlIGxvcyB0d2VldHMgZGUgbGEgY3VlbnRhIGRlIEV2byBNb3JhbGVzIGFwdW50YSBhIHVuIG1heW9yIHVzbyBkZSBwYWxhYnJhcyBuZWdhdGl2YXMgKDU3JSkgcXVlIHBvc2l0aXZhcyAoNDMlKS4gQXVucXVlIG5vIGVzIHVuYSBkaWZlcmVuY2lhIGFiaXNtYWwsIHB1ZXMgZW4gbGEgY29uc3RydWNjacOzbiBkaXNjdXJzaXZhIHBvbMOtdGljYSBkZWJlIGhhYmVyIHRhbWJpw6luIG5vIHNvbG8gdW4gKmVsbG9zIG5lZ2F0aXZpemFkbyosIHNpbm8gdGFtYmnDqW4gdW4gKm5vc290cm9zIHBvc2l0aXZpemFkbyouIEVuIGVzdGEgY29uc3RydWNjacOzbiBzZSBwdWRpZXJvbiBvYnNlcnZhciBhbGd1bm9zIHBhcmVzIHNlbcOhbnRpY29zIGFudGFnw7NuaWNvcywgZW50cmUgbGFzIHBhbGFicmFzIG3DoXMgdXNhZGFzLCBjb21vIEVFVVUvcHVlYmxvLCBsdWNoYS9wYXosIGltcGVyaW8vcGF0cmlhLiAKCkVuIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBwb2xhcmlkYWQgZGUgbG9zIHR3ZWV0cyB5IGxhIGludGVyYWNjacOzbiwgcG9kZW1vcyBlbmNvbnRyYXIgdW5hIGRpZmVyZW5jaWEgZW50cmUgbGEgcmVjZXBjacOzbiBkZSBsb3MgdHdlZXRzIHBvc2l0aXZvcyB5IGxvcyBuZWdhdGl2b3MuIExvcyB0d2VldHMgbmVnYXRpdm9zIHRpZW5lbiB1bmEgbWF5b3IgaW50ZXJhY2Npw7NuIHF1ZSBsb3MgcG9zaXRpdm9zLCBlbiBsYSBwcnVlYmEgZGUgY29ycmVsYWNpw7NuIGxvcyB0d2VldHMgbmVnYXRpdm9zIG9idGllbmVuIHVuIDAsMTUgbWllbnRyYXMgbG9zIHBvc2l0aXZvcyB0YW4gc8OzbG8gMCwwMi4gUGFzYW5kbyBhIGxhIHBydWViYSBkZSByZWdyZXNpw7NuLCBsb3MgdHdlZXRzIHBvciBjYWRhIHB1bnRvIHBvcmNlbnR1YWwgbmVnYXRpdm8gcmVjaWJlbiBlbiBwcm9tZWRpbyAyMSBpbnRlcmFjY2lvbmVzIG3DoXMsIGNvbiB1biBwLXZhbG9yIHNpZ25pZmljYXRpdm87IG1pZW50cmFzIHF1ZSBsb3MgcHVudG9zIHBvcmNlbnR1YWxlcyBwb3NpdGl2b3Mgbm8gdGllbmUgZWwgbWlzbW8gZWZlY3RvLCBjb25zaWd1aWVuZG8gNCBpbnRlcmFjY2lvbmVzIG3DoXMgcGVybyBjb24gdW4gcC12YWxvciBubyBzaWduaWZpY2F0aXZvLiAKCkxvIGFudGVyaW9yIHB1ZWRlIGlsdXN0cmFyc2UgY29uIGVsIGFuw6FsaXNpcyBkZSBsb3MgZGlleiB0d2VldHMgY29uIG1heW9yIGludGVyYWNjacOzbjoKCmBgYHtyfQpwb3BfdCA8LSBldm92YXJfc2VudCAlPiUKICAgICAgICBzZWxlY3QodGV4dCwgaW50ZXJhY3QsIGlzZW50X25lZywgaXNlbnRfcG9zKSAlPiUKICAgICAgICBhcnJhbmdlKGRlc2MoaW50ZXJhY3QpKQpoZWFkKHBvcF90LCBuID0gMTApICU+JSBrbml0cjo6a2FibGUoKQpgYGAKQXF1w60gc2UgcHVlZGUgYXByZWNpYXIgcXVlIDcgZGUgbG9zIDEwIHR3ZWV0cyB0aWVuZW4gdW5hIGZ1ZXJ0ZSBjYXJnYSBlbW9jaW9uYWwgbmVnYXRpdmEsIGxvIGN1YWwgcXVlZGEgcmVwcmVzZW50YW5kbyBlbiBzdXMgaW5kaWNlcyBkZSBuZWdhdGl2aWRhZC4gU8OzbG8gdHJlcyBkZSBsb3MgZGlleiB0d2VldHMgbcOhcyBwb3B1bGFyZXMgZGUgRXZvIE1vcmFsZXMgc29uIHBvc2l0aXZvcy4gCgpObyBvYnN0YW50ZSwgZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gKFJeMl4pIG11ZXN0cmEgcXVlIGxhIHZhcmlhY2nDs24gZW4gbGFzIGludGVyYWNjaW9uZXMgc29sbyBlcyBleHBsaWNhZGEgcG9yIHN1IG5lZ2F0aXZpZGFkIGFsIDIlLiBFc3RhIHNpdHVhY2nDs24gcHVlZGUgc2VyIGV4cGxpY2FkYSBwb3IgbGFzIHNpZ3VpZW50ZXMgYWx0ZXJuYXRpdmFzOiAoYSkgZXhpc3RlbiBvdHJhcyB2YXJpYWJsZXMgZW4ganVlZ28sIGNvbW8gbG9zIHTDs3BpY29zIGRlIGxvcyB0d2VldHMgcXVlIGluZmx1eWVuIGVuIGxhIGludGVyYWNjacOzbiwgcG9yIGVqZW1wbG8gcXVlIHNlYW4gdHdlZXRzIHNvYnJlIHRlbWFzIG5hY2lvbmFsZXMgbyBpbnRlcm5hY2lvbmFsZXMsIGhpc3TDs3JpY29zIG8gcG9sw610aWNvcywgZXRjLjsgKGIpLCBxdWUgbGFzIGF1ZGllbmNpYSBpbnRlcm5hY2lvbmFsIHNlYSBtw6FzIGFjdGl2YSBxdWUgbGEgbmFjaW9uYWwgbyB2aWNldmVyc2E7IChjKSBxdWUgZWwgZGljY2lvbmFyaW8gcXVlIHVzYW1vcyBhw7puIHNlYSBtdXkgZ2VuZXJhbCB5IG5vIGNhcHTDqSBsYXMgcG9sYXJpZGFkZXMgc2Vtw6FudGljYXMgZGVsIGRpc2N1cnNvIHBhcnRpY3VsYXIgZGVsIHByZXNpZGVudGU7IChkKSBxdWUgZWwgdW5pZ3JhbWEgbm8gc2VhIHVuYSB1bmlkYWQgZGUgYW7DoWxpc2lzIHN1ZmljaWVudGUgZW4gZXN0ZSBjYXNvLiAKCkEgcGVzYXIgZGUgZXNhcyBsaW1pdGFjaW9uZXMsIGVzdGUgcHJpbWVyIGFjZXJjYW1pZW50byBub3MgcGVybWl0ZSBtb3N0cmFyICgxKSBsYSBwb3RlbmNpYWwgaW1wb3J0YW5jaWEgZGUgbGEgdmFyaWFibGUgZW1vY2nDs24gZW4gbG9zIGRpc2N1cnNvcyBwb2zDrXRpY29zIGVuIHJlZDsgKDIpIHVuIG3DqXRvZG8gZGUgcmVjb2xlY2Npw7NuIHkgYW7DoWxpc2lzIHBhcmEgZ3JhbmRlcyBjYW50aWRhZGVzIGRlIGRhdG9zIHRleHR1YWxlcyBlbiByZWRlcyBzb2NpYWxlcy4gCgojIyBSZWZlcmVuY2lhcwoKQ29zc2FyaW5pLCBQYW9sbyB5IEdhcmPDrWEsIFJvYmVydG8gKDIwMTUpLiAiRWwgcGFwZWwgZGUgbGFzIGVtb2Npb25lcyBlbiBsYSB0ZW9yw61hIGRlbW9jcsOhdGljYS4gRGVzYWbDrW9zIHBhcmEgdW4gdXNvIHDDumJsaWNvIGRlIGxhIHJhesOzbiBlbiB0aWVtcG9zIGRlIHBvcHVsaXNtbyIuICpSZXZpc3RhIGRlIGVzdHVkaW9zIHBvbMOtdGljb3MqLCAoMTY4KSwgMjkxLTMxNS4KCkpvcmRhbiwgV2lsZnJlZG8gKDIwMTcpLiAiNyBncsOhZmljb3MgcGFyYSBlbnRlbmRlciBsYSBjdWVudGEgZGUgRXZvIE1vcmFsZXMgZW4gVHdpdHRlciIuIEVuOiBbTGEgUHJlbnNhXShodHRwOi8vd3d3LnJpbWF5cGFtcGEuY29tLzIwMTcvMTIvbGFzLTEwMS1jdWVudGFzLWRlLXR3aXR0ZXItY29uLW1hcy5odG1sKSAoMjUvMDQvMjAxNykKCkxvcGV6LCBUb25ueSAoMjAxNykuICJMYXMgMTAxIGN1ZW50YXMgZGUgVHdpdHRlciBjb24gbcOhcyBzZWd1aWRvcmVzIGVuIEJvbGl2aWEiLiBFbjogW1JpbWF5cGFtcGFdKGh0dHA6Ly93d3cucmltYXlwYW1wYS5jb20vMjAxNy8xMi9sYXMtMTAxLWN1ZW50YXMtZGUtdHdpdHRlci1jb24tbWFzLmh0bWwpICgyNC8xMi8yMDE3KQoKUm9nZXJzLCBSaWNoYXJkICgyMDEzKS4gKkRpZ2l0YWwgTWV0aG9kcyouIE1JVCBQcmVzcy4KClRyaWdvLCBNYXLDrWEgKDIwMTgpLiAiRXZvOiBFbCB0dWl0ZXJvIHF1ZSBwYXPDsyBkZWwgb2RpbyBhbCBhbW9yIGEgbGFzIHJlZGVzIi4gRW46IFtFbCBEZWJlcl0oaHR0cDovL3d3dy5lbGRlYmVyLmNvbS5iby9zZXBhcmF0YS9Fdm8tRWwtdHVpdGVyby1xdWUtcGFzby1kZWwtb2Rpby1hbC1hbW9yLWEtbGFzLXJlZGVzLTIwMTgwMTA4LTAwMjEuaHRtbCkgKDA5LzAxLzIwMTgpCgpTaWxnZSwgSnVsaWEgeSBSb2JpbnNvbiwgRGF2aWQgKDIwMTcpLiAqVGV4dCBNaW5pbmcgd2l0aCBSOiBBIFRpZHkgQXBwcm9hY2gqLiBPJ1JlaWxseSBNZWRpYQoKU3VpdGVyLCBKYW5lICgyMDE2KS4gIlBvc3QtdHJ1dGggUG9saXRpY3MiLiBFbjogKlBvbGl0aWNhbCBJbnNpZ2h0Kiwgdm9sIDcsIDMuIFNhZ2UuICAKCiMjIEhlcnJhbWllbnRhcyBkaWdpdGFsZXMgCgoqIFIKKiBydHdlZXQKKiBnZ3Bsb3QyCgojIyBTb2JyZSBlbCBhdXRvcgoKQWxleCBPamVkYSBDb3BhIGVzIHNvY2nDs2xvZ28gZGlnaXRhbCB5IGFuYWxpc3RhIGRlIHJlZGVzIHNvY2lhbGVzLiBQdWVkZW4gZW5jb250cmFybG8gZW4gW1R3aXR0ZXJdKGh0dHBzOi8vdHdpdHRlci5jb20vYWxleHJvY3opLCBbTGlua2VkSW5dKGh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hbGV4cm9jLykgeSBbQWNhZGVtaWEuZWR1XShodHRwczovL3Vtc3MuYWNhZGVtaWEuZWR1L2FsZXhyb2MpLgoKIyMgTm90YXMKClteMV06IEFncmFkZWNlbW9zIGEgW1JhZmFlbCBMw7NwZXpdKGh0dHBzOi8vZ2l0aHViLmNvbS9yYWZhbG9wZXp2KSBwb3IgbGEgZ3XDrWEgZXN0YWTDrXN0aWNhIHkgZW4gUi4gClteMl06IEVuIGVzcGHDsW9sIGxpdGVyYWxtZW50ZSAicmFzcGFkbyIuIEVzIHVuYSB0w6ljbmljYSBxdWUgcGVybWl0ZSBsYSBleHRyYWNjacOzbiBkZSBsYSBpbmZvcm1hY2nDs24gZW4gbGEgV2ViIHNpbXVsYW5kbyBsYSBuYXZlZ2FjacOzbiBodW1hbmEuIApbXjNdOiBEZWwgaW5nbMOpcyAqQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcgSW50ZXJmYWNlKi4gRXMgdW4gcHJvZ3JhbWEgaW50ZXJtZWRpbyBxdWUgcGVybWl0ZSBpbnRlcmFjdHVhciBjb24gb3RybyBzaXN0ZW1hLCBtZWRpYW50ZSB1biBsZW5ndWFqZSBkZWZpbmlkbyBwYXJhIGVsIGNhc28uIExhcyBncmFuZGVzIHBsYXRhZm9ybWFzIGRlIHJlZGVzIHNvY2lhbGVzIHBvbmVuIGEgZGlzcG9zaWNpw7NuIHN1cyBBUElzIHBhcmEgbG9zIGRlc2Fycm9sbGFkb3JlcywgYXVucXVlIGNvbiBsaW1pdGFjaW9uZXMsIHkgc3UgdXNvIG5vcyBwZXJtaXRlIHJlY29sZWN0YXIgZ3JhbmRlcyBjYW50aWRhZGVzIGRlIGRhdG9zLiAKW140XTogTGEgZG9jdW1lbnRhY2nDs24gZGUgbGEgQVBJIGRlIFR3aXR0ZXIgcHVlZGUgdmVyc2UgYXF1w60gaHR0cHM6Ly9kZXZlbG9wZXIudHdpdHRlci5jb20vZW4vZG9jcy4gClteNV06IEVuIGVsIG11bmRvIGRlIFIsIGxvcyBwYXF1ZXRlcyBtw6FzIHBvcHVsYXJlcyBwYXJhIGFjY2VkZXIgYSBsYSBBUEkgZGUgVHdpdHRlciBzb24gYHJ0d2VldGAgeSBgdHdpdHRlUmAuIEVzdHV2aW1vcyB1c2FuZG8gYmFzdGFudGUgZXN0ZSB1bHRpbW8sIHBlcm8gZW5jb250cmFtb3MgbXVjaGFzIGZhbGxhcywgcG9yIGxvIHF1ZSBkZXNhY29uc2VqYW1vcyBzdSB1c28uIEVsIGRlc2Fycm9sbGFkb3IgW2luZm9ybWFdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZW9mZmplbnRyeS90d2l0dGVSKSBxdWUgZWwgcGFxdWV0ZSBlc3TDoSBvYnNvbGV0by4gClteNl06IFNlIGVuY3VlbnRyYSBlbiBodHRwczovL2dpdGh1Yi5jb20vYnBiMjcvdHdpdHRlcl9zY3JhcGluZy9ibG9iL21hc3Rlci9zY3JhcGUucHkuClteN106IEVzIHVuYSBsZXkgZGUgcG90ZW5jaWFzLiBFbiB0w6lybWlub3Mgc2VuY2lsbG9zIGVzdGEgbGV5IGVtcMOtcmljYSBlc3RhYmxlY2UgcXVlIGV4aXN0ZSB1bmEgbWlub3LDrWEgZGUgcGFsYWJyYXMgKH4yMCUpIHF1ZSBzZSB1dGlsaXphbiBjb24gbWF5b3IgZnJlY3VlbmNpYSAofjgwJSksIHkgb3RyYSBtYXlvcsOtYSBkZSBwYWxhYnJhcyAofjgwJSkgY29uIG1lbm9yIGZyZWN1ZW5jaWEgKH4yMCUpLiBUaWVuZSBzaW1pbGFyaWRhZCBhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgUGFyZXRvLiA=