PARTE 1

1. Principios básicos del mineo de texto

1.1. ¿Qué es el mineo de texto?

Definición del mineo de texto



Según Kwartler (2017):

“El mineo de texto (text mining) es el proceso de destilar accionables útiles desde texto.” (traducido del inglés)

Ventajas del mineo de texto

Realizado sobre R (o cualquier lenguaje de programación similar), este mineo de texto tiene varias ventajas, incluyendo (y no limitado) a las siguientes:

  • Se crea confianza en los involucrados en cada proyecto (stakeholders) ya que generalmente no se requiere muestreo para extraer información.
  • Se puedan aplicar varias metodologías de manera rápida.
  • Los procedimientos realizados son de naturaleza auditable y reproducible.
  • El mineo de texto obtiene datos novedosos del texto.

Recomendaciones sobre el uso del mineo del texto

Algunos ejemplos y recomendaciones específicas sobre el uso del mineo de texto incluyen:

  • Textos de encuesta, grupos focales: Se pueden explorar los tópicos de las respuestas a través de varios métodos con el fin de obtener la perspectiva de quienes han respondido.
  • Texto muy corto: Realizar análisis de texto sobre textos muy cortos puede sesgar las conclusiones obtenidas.
  • Documentos legales y de recursos humanos: A pesar de que el análisis de texto es útil, existen restricciones éticas y legales que deben ser respetadas.
  • Datos de redes sociales: En redes sociales se pueden obtener y procesar datos (siempre y cuando esté permitido) para sacar conclusiones útiles de contextos o noticias relevantes.
  • Comentarios y reviews de productos: Análisis de texto sobre comentarios de productos pueden ayudarnos a obtener la perspectiva que distintos segmentos de clientes tienen sobre él.
  • Modelamiento predictivo: A veces los datos de texto pueden permitirnos construir variables estructuradas que puedan ser usadas como datos de entrada en modelos predictivos.

Flujo de trabajo sobre datos de texto

Los datos de texto son de naturaleza no estructurada. Estos deben ser primero pre-procesados de una manera estructurada, se deben definir sus características y luego ser extraídas en forma de un documento organizado conocido como corpus. Al final se analizan las características extraídas.

A continuación se muestra este flujo de trabajo:


Flujo de trabajo en mineo de texto, Kwartler (2017).


A breves rasgos, podemos seguir estos pasos:

  1. Definir el problema y los objetivos específicos: Tal como en otras tareas de analítica avanzada, no es prudente comenzar buscando respuestas. Es preciso entonces definir primero el problema a resolver.
  2. Identificar los datos de texto que deben ser recolectados: Acorde al problema definido, los datos podrían venir de una fuente u otra. De dentro de la empresa o de datos gubernamentales por ejemplo. Estos datos pueden ser recolectados a través de web scraping, APIs (redes sociales), reconocimiento óptico de caracteres (OCR) o análisis de documentos.
  3. Organizar el texto: Cuando los datos han sido recolectados, debemos organizarlos en un corpus, es decir, en datos estructurados. Posteriormente decidiremos si utilizamos técnicas para análisis de bolsa de palabras o análisis sintáctico.
  4. Extraer características: Con el texto ya organizado realizamos pre-procesamiento sobre el texto, acorde a la metodología que pensemos seguir después, con el fin de obtener características de los datos de texto.
  5. Análisis: En este punto utilizaremos la técnica analítica que hayamos pensado en un inicio sobre los datos pre-procesados.
  6. Elaborar las conclusiones y/o recomendaciones: El resultado final del análisis deberá ser convertido en un accionable o en una conclusión, acorde a los objetivos definidos inicialmente.

1.2. Tipos de mineo de texto

Bolsa de palabras (bag of words)

El mineo de texto basado en bolsa de palabras es más fácil de entender y analizar, incluso para el uso de técnicas de aprendizaje automático.

Este trata cada palabra (o grupo de palabras, i.e. n-gramas) como una característica única de un documento. En este tipo de análisis el orden de las palabras y sus características gramáticas y sintácticas no son utilizadas.

Uno de sus principales beneficios yace en que sus técnicas no son computacionalmente costosas, y por ende el análisis puede ser realizado de manera rápida. Debido a que sus resultados son devueltos en forma de datos estructurados, estos pueden ser utilizados en modelos de aprendizaje automático. Una de las formas más usuales de devolver estos resultados son las DTM (document-term matrix o matriz documento-término).

En estas matrices, cada fila representa un documento o corpus, cada columna una palabra o n-grama, y cada una de las entradas de la matriz se puede llenar con distintas medidas. Por ahora lo haremos con la frecuencia de cada palabra. Su traspuesta es la matriz término-documento.

Ejemplo de DTM:

library(tm)
Loading required package: NLP
library(topicmodels)
data("AssociatedPress", package = "topicmodels")
as.matrix(AssociatedPress[175,1:5])
      Terms
Docs   aaron abandon abandoned abandoning abbott
  [1,]     1       0         0          0      0

De la misma manera, los datos pueden ser analizados en formato tidy. Este formato, acorde a Wickham (2014), es una manera fácil y efectiva de manejar datos. Los datos tidy presentan las siguientes características:

  • Cada variable es una columna.
  • Cada observación es una fila.
  • Cada tipo de unidad de observación es una tabla.

Así, se define texto en formato tidy como una tabla que tiene un token por fila. Un token es una unidad de texto, que puede ser una palabra o un n-grama. La ventaja de trabajar con texto en formato tidy yace en el hecho de que podemos utilizar herramientas del universo tidy para analizarlos, incluyendo las librerías ggplot2, dplyr, tidyr, broom, etc.

Ejemplo de texto tidy:

library(dplyr)

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(tidytext)
ap_td = tidy(AssociatedPress)
head(ap_td %>% filter(document==175))

Análisis sintáctico (syntactical parsing)

El análisis sintáctico difiere de una bolsa de palabras tanto en complejidad como en enfoque. Este se basa en la sintaxis de las palabras y utiliza el etiquetado POS (part of speech) para identificar las palabras en un contexto adecuado. Cada una de las etiquetas es analizada para obtener conclusiones y resultados.

En base a estas descripciones preliminares, el enfoque de este curso tomará el camino del análisis de bolsa de palabras.

2. Definición de objetivos

Para objetivos prácticos de este curso analizaremos dos conjuntos de datos desde el inicio, y realizaremos cada uno de los pasos sugeridos en la primera seccción de este capítulo.

Así, definiremos primero los objetivos del análisis.

2.1. Análisis de noticias: El contexto actual de las elecciones 2021 en Ecuador



En este caso, obtendremos conclusiones acerca del algunos candidatos a las elecciones presidenciales de Ecuador en febrero de 2021. Para ello, obtendremos los datos de las noticias donde Juan Fernando Velasco, Gustavo Larrea, César Montúfar o Pedro José Freile sean mencionados, de tres diarios del país.

2.2. El horror cósmico: A través de las puertas del procesamiento del lenguaje natural



En este caso, obtendremos conclusiones acerca del estilo de escritura de uno de los mejores escritores de terror del siglo XX: Howard Phillips Lovecraft. Para ello, obtendremos los datos de la mayor parte de sus escritos en solitario de dos documentos electrónicos titulados ‘Narrativa Completa’ volúmenes 1 y 2.

3. Obtención de datos de texto

3.1. Obtención de datos de Google News

Obtendremos los datos de noticias a través de web scrapping. Esto lo realizaremos de la siguiente manera:

  1. Cargamos las librerías necesarias para el ejercicio:
library(dplyr) # Manipulación de datos tidy
library(rvest) # Web scrapping
library(stringr) # Manipulación de cadenas de texto
library(purrr) # Iteración eficiente 
  1. Creamos dos funciones. Una para la obtención de los titulares atados a una búsqueda en google news y otra para obtener las características de cada noticia (titular, diario, fecha de publicación, hipervínculo). Para ello primero explicaremos un ejemplo.

En la siguiente imagen podemos ver que cuando realizamos una búsqueda en google news, la url de búsqueda (marcada en rojo) está conformada por tres partes (https://news.google.com/ , search?q= y el término de búsqueda con “%20” en lugar de espacios) más una parte de parámetros adicionales (marcada en azul).



Para comenzar el scrapping debemos entonces:

  • Definimos un objeto que contenga como cadena de texto la página principal de google news:
news_pag = "https://news.google.com/"
news_pag
[1] "https://news.google.com/"
  • Creamos un parámetro adicional que se va a encargar de la búsqueda:
parametro_busqueda = "search?q="
parametro_busqueda
[1] "search?q="
  • Parametrizamos un objeto que contenga el texto que vamos a buscar, sustityendo los espacios por %20. En nuestro ejemplo usaremos la cadena “Juan Fernando Velasco”:
busqueda = "Juan Fernando Velasco"
busqueda_no_espacios = gsub(" ","%20", busqueda)
busqueda_no_espacios
[1] "Juan%20Fernando%20Velasco"
  • Definimos un parámetro adicional de búsqueda en español:
parametro_final = "&hl=es-419&gl=US&ceid=US:es-419"
parametro_final
[1] "&hl=es-419&gl=US&ceid=US:es-419"
  • Con estos cuatro objetos definidos formamos la url de búsqueda:
html_dir = paste0(news_pag,parametro_busqueda,busqueda_no_espacios,parametro_final)
html_dir
[1] "https://news.google.com/search?q=Juan%20Fernando%20Velasco&hl=es-419&gl=US&ceid=US:es-419"

Si navegamos a esta dirección web en internet obtendremos el resultado antes mostrado, del cual deberemos extraer las características que necesitemos de cada noticia, es decir, textos como el titular, la fecha, el sitio web donde la noticia fue publicada, y el más importante, el link de la noticia. Para llevar a cabo esta tarea realizaremos el siguiente procedimiento.

  • Leemos la url creada antes:
google_news = read_html(html_dir)
class(google_news)
[1] "xml_document" "xml_node"    

Como se puede notar, este es un objeto de tipo xml_document o xml_node del cual hay que extraer un código CSS o Xpath que identifique a cada noticia y nos permita extraer sus características. Para llevar a cabo esta actividad usaremos SelectorGadget, el cual es una extensión de Google Chrome.

La extensión de selector gadget puede ser instalada desde el siguiente link: https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb?hl=es.

Para usarla:

  1. Primero abriremos la página web deseada y daremos clic en el ícono de SelectorGadget. Con esta acción se activará la barra de SelectorGadget en la parte inferior de la pantalla:


  1. Luego daremos clic en el objeto que queremos extraer y la barra de SelectorGadget se poblará con su selector CSS. Copiaremos este selector CSS al portapapeles.


Una vez que hayamos obtenido esta información, continuaremos con el scrapping:

  • Usaremos el código CSS obtenido con la función html_nodes y la función html_children con la finalidad de obtener los objetos de las noticias (google news muestra 100 noticias máximo sobre las cuales realizar la extracción).
noticias = google_news %>% 
  html_nodes(css = ".xP6mwf") %>% 
  html_children()
noticias
{xml_nodeset (101)}
 [1] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXmh0dHBzOi8v ...
 [2] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMifWh0dHBzOi8v ...
 [3] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXGh0dHBzOi8v ...
 [4] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiUmh0dHBzOi8v ...
 [5] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf"><div class="xrnccd"><article class=" MQsxIb x ...
 [6] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXmh0dHBzOi8v ...
 [7] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMie2h0dHBzOi8v ...
 [8] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiSmh0dHBzOi8v ...
 [9] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiWWh0dHBzOi8v ...
[10] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiYGh0dHBzOi8v ...
[11] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXWh0dHBzOi8v ...
[12] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiaWh0dHBzOi8v ...
[13] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXGh0dHBzOi8v ...
[14] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXWh0dHBzOi8v ...
[15] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiS2h0dHBzOi8v ...
[16] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMieGh0dHBzOi8v ...
[17] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiVGh0dHBzOi8v ...
[18] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMidWh0dHBzOi8v ...
[19] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf"><div class="xrnccd"><article class=" MQsxIb x ...
[20] <div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">\n<a href="./articles/CBMiXmh0dHA6Ly9t ...
...

El objeto obtenido de tipo xml_nodeset cuenta con 100 objetos que corresponden a cada noticia. Usaremos la primera para ejemplificar la extracción de los datos.

noticia = noticias[[2]]
noticia
{html_node}
<div jslog="93789" class="NiLAwe y6IFtc R7GTQ keNKEd j7vNaf nID9nc">
[1] <a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2V ...
[2] <div class="xrnccd"><article class=" MQsxIb xTewfe R7GTQ keNKEd j7vNaf Cc0Z5d EjqUne" jscontroller="mhFxVb" ...
  • Primero obtendremos información acerca de los nodos del objeto para saber qué partes debemos referenciar en nuestro código. Para esto usaremos la función html_nodes con el argumento “*” indicándole así que extraiga todos los nodos, y exploraremos si cada uno de estos nodos tiene texto (text), fechas (datetime) o hipervínculos (href) a través de la función html_attr y html_text:

Texto:

noticia %>% html_nodes("*") %>% html_text()
 [1] ""                                                                                                                                                                                                                                                                                                                                          
 [2] ""                                                                                                                                                                                                                                                                                                                                          
 [3] ""                                                                                                                                                                                                                                                                                                                                          
 [4] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobiernoJuan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, ...ampvideo_youtubeEl UniversoHace 8 díasbookmark_bordersharemore_vert"
 [5] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobiernoJuan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, ...ampvideo_youtubeEl UniversoHace 8 díasbookmark_bordersharemore_vert"
 [6] ""                                                                                                                                                                                                                                                                                                                                          
 [7] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobierno"                                                                                                                                                                                                                                 
 [8] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobierno"                                                                                                                                                                                                                                 
 [9] "Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, ..."                                                                                                                                                                            
[10] "Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, ..."                                                                                                                                                                            
[11] "ampvideo_youtubeEl UniversoHace 8 díasbookmark_bordersharemore_vert"                                                                                                                                                                                                                                                                       
[12] "ampvideo_youtubeEl UniversoHace 8 días"                                                                                                                                                                                                                                                                                                    
[13] "amp"                                                                                                                                                                                                                                                                                                                                       
[14] "video_youtube"                                                                                                                                                                                                                                                                                                                             
[15] "El Universo"                                                                                                                                                                                                                                                                                                                               
[16] "Hace 8 días"                                                                                                                                                                                                                                                                                                                               
[17] "bookmark_bordersharemore_vert"                                                                                                                                                                                                                                                                                                             
[18] "bookmark_border"                                                                                                                                                                                                                                                                                                                           
[19] "bookmark_border"                                                                                                                                                                                                                                                                                                                           
[20] ""                                                                                                                                                                                                                                                                                                                                          
[21] "bookmark_border"                                                                                                                                                                                                                                                                                                                           
[22] "share"                                                                                                                                                                                                                                                                                                                                     
[23] "share"                                                                                                                                                                                                                                                                                                                                     
[24] ""                                                                                                                                                                                                                                                                                                                                          
[25] "share"                                                                                                                                                                                                                                                                                                                                     
[26] "more_vert"                                                                                                                                                                                                                                                                                                                                 
[27] "more_vert"                                                                                                                                                                                                                                                                                                                                 
[28] ""                                                                                                                                                                                                                                                                                                                                          
[29] "more_vert"                                                                                                                                                                                                                                                                                                                                 

Como podemos notar, podemos obtener el título de la noticia con el séptimo u octavo nodo del objeto, además del diario con el nodo 15. Para saber su clase y pasarla a la función html_node indexaremos tales nodos y copiaremos su clase (texto al inicio de cada nodo, antes del espacio):

nodos = noticia %>% html_nodes("*")
nodos[c(7,8,15)]
{xml_nodeset (3)}
[1] <h3 class="ipQwMb ekueJc RD0gLb"><a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLz ...
[2] <a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2V ...
[3] <a class="wEwyrc AVN2gc uQIVzc Sksgp">El Universo</a>

Debido a que el nodo “a href” se refiere a un hipervínculo, tomaremos el título de la noticia del nodo “h3” y el diario del nodo “a” con clase “wEwyrc AVN2gc uQIVzc Sksgp” a través de la función html_node:

titular = noticia %>% html_node("h3") %>% html_text()
titular
[1] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobierno"
diario = noticia %>% html_node("a.wEwyrc.AVN2gc.uQIVzc.Sksgp") %>% html_text()
diario
[1] "El Universo"

Fechas:

noticia %>% html_nodes("*") %>% html_attr("datetime")
 [1] NA                     NA                     NA                     NA                    
 [5] NA                     NA                     NA                     NA                    
 [9] NA                     NA                     NA                     NA                    
[13] NA                     NA                     NA                     "2020-11-16T08:00:00Z"
[17] NA                     NA                     NA                     NA                    
[21] NA                     NA                     NA                     NA                    
[25] NA                     NA                     NA                     NA                    
[29] NA                    

En este caso en cambio, el nodo de la fecha es el nodo 16:

nodos[16]
{xml_nodeset (1)}
[1] <time class="WW6dff uQIVzc Sksgp" datetime="2020-11-16T08:00:00Z">Hace 8 días</time>

Este nodo tiene como tipo de nodo a la etiqueta “time”:

fecha = noticia %>% html_node("time") %>% html_attr("datetime")
fecha
[1] "2020-11-16T08:00:00Z"

Hipervínculo:

noticia %>% html_nodes("*") %>% html_attr("href")
 [1] "./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"
 [2] NA                                                                                                                                                                                                                                                                                                                                                                                                          
 [3] NA                                                                                                                                                                                                                                                                                                                                                                                                          
 [4] NA                                                                                                                                                                                                                                                                                                                                                                                                          
 [5] NA                                                                                                                                                                                                                                                                                                                                                                                                          
 [6] "./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"
 [7] NA                                                                                                                                                                                                                                                                                                                                                                                                          
 [8] "./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"
 [9] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[10] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[11] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[12] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[13] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[14] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[15] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[16] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[17] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[18] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[19] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[20] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[21] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[22] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[23] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[24] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[25] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[26] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[27] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[28] NA                                                                                                                                                                                                                                                                                                                                                                                                          
[29] NA                                                                                                                                                                                                                                                                                                                                                                                                          

Para este caso nos son útiles los nodos 1, 6 y 8:

nodos[c(1,6,8)]
{xml_nodeset (3)}
[1] <a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2V ...
[2] <a class="VDXfz" jsname="hXwDdf" jslog="95014; 5:W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwiaH ...
[3] <a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2V ...

Debido a que dos nodos con la misma clase tienen el hipervínculo, nos será más fácil localizarlo solo con la función html_node y no html_nodes (su diferencia radica en que el plural busca nodos hasta el final del objeto, mientras que el singular solo busca en el mismo nivel del nodo):

noticia %>% html_node("a") %>% html_attr("href")
[1] "./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"

Con este camino, nos sirve entonces el primer nodo:

nodos[1]
{xml_nodeset (1)}
[1] <a href="./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2V ...

Con lo que podemos extraer el hipervínculo:

link_enmascarado = noticia %>% html_node("a") %>% html_attr("href")
link_enmascarado
[1] "./articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"

Si nos fijamos bien, este no es el hipervínculo de la noticia, sino una dirección a la que nos redirige Google antes de mandarnos al link original. Para encontrar el link verdadero, debemos scrapear la noticia (uniéndola al link de Google News):

link_enmascarado = paste0(news_pag,substring(link_enmascarado,3))  
link_enmascarado
[1] "https://news.google.com/articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl=es-419&gl=US&ceid=US%3Aes-419"

Si navegamos a esta dirección e interrumpimos la carga de la página antes de que nos redirija a la noticia podemos obtener el selector CSS necesario:



Leamos el html de esta página y revisemos sus objetos con el selector CSS obtenido (aquellos que contengan un hipervínculo):

link_leido = read_html(link_enmascarado)
link_leido %>% html_nodes("a") %>% html_attr("href")
 [1] "./?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
 [2] "https://www.google.com/intl/es-419/about/products?tab=nh"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
 [3] "https://myaccount.google.com/?utm_source=OGB&tab=nk&utm_medium=app"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
 [4] "https://www.google.com/webhp?tab=nw"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
 [5] "https://maps.google.com/maps?hl=es-419&tab=nl"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
 [6] "https://www.youtube.com/?gl=US&tab=n1"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
 [7] "https://play.google.com/?hl=es-419&tab=n8"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 [8] "https://news.google.com/?tab=nn"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 [9] "https://mail.google.com/mail/?tab=nm"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
[10] "https://meet.google.com/?hs=197"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
[11] "https://contacts.google.com/?hl=es-419&tab=nC"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
[12] "https://drive.google.com/?tab=no"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
[13] "https://www.google.com/calendar?tab=nc"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
[14] "https://translate.google.com/?hl=es-419&tab=nT"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
[15] "https://photos.google.com/?tab=nq&pageId=none"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
[16] "https://duo.google.com/?usp=duo_ald"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
[17] "https://www.google.com/chrome/?brand=CHZO&utm_source=google.com&utm_medium=desktop-app-launcher&utm_campaign=desktop-app-launcher&utm_content=chrome-logo&utm_keyword=CHZO"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[18] "https://www.google.com/shopping?hl=es-419&source=og&tab=nf"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[19] "https://docs.google.com/document/?usp=docs_alc"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
[20] "https://docs.google.com/spreadsheets/?usp=sheets_alc"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
[21] "https://docs.google.com/presentation/?usp=slides_alc"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
[22] "https://books.google.com/bkshp?hl=es-419&tab=np"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
[23] "https://www.blogger.com/?tab=nj"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
[24] "https://hangouts.google.com/"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[25] "https://keep.google.com/"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
[26] "https://jamboard.google.com/?usp=jam_ald"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
[27] "https://earth.google.com/web/"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
[28] "https://www.google.com/save"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
[29] "https://artsandculture.google.com/?hl=es-419&utm_source=ogs.google.com&utm_medium=referral"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[30] "https://ads.google.com/home/?subid=ww-ww-et-g-aw-a-vasquette_ads_cons_1!o2"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[31] "https://podcasts.google.com/"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[32] "https://stadia.google.com/"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[33] "https://www.google.com/intl/es-419/about/products?tab=nh"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
[34] "https://accounts.google.com/ServiceLogin?passive=1209600&continue=https://news.google.com/articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl%3Des-419%26gl%3DUS%26ceid%3DUS:es-419&followup=https://news.google.com/articles/CBMifWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFu0gGBAWh0dHBzOi8vd3d3LmVsdW5pdmVyc28uY29tL25vdGljaWFzLzIwMjAvMTEvMTQvbm90YS84MDQ3OTAwL2VsZWNjaW9uZXMtcHJlc2lkZW5jaWFsZXMtZWN1YWRvci0yMDIxLWp1YW4tZmVybmFuZG8tdmVsYXNjby1wbGFuP2FtcA?hl%3Des-419%26gl%3DUS%26ceid%3DUS:es-419&hl=es-419&ec=GAZAqgM"
[35] "./?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
[36] "./topstories?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
[37] "./topics/CAAqKAgKIiJDQkFTRXdvSkwyMHZNREZqY0hsNUVnWmxjeTAwTVRrb0FBUAE?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
[38] "./topics/CAAqKAgKIiJDQkFTRXdvSkwyMHZNRGxqTjNjd0VnWmxjeTAwTVRrb0FBUAE?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
[39] "./topics/CAAqLAgKIiZDQkFTRmdvSUwyMHZNRGx1YlY4U0JtVnpMVFF4T1JvQ1ZWTW9BQVAB?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[40] "./topics/CAAqHAgKIhZDQklTQ2pvSWJHOWpZV3hmZGpJb0FBUAE?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
[41] "./topics/CAAqLAgKIiZDQkFTRmdvSUwyMHZNRGx6TVdZU0JtVnpMVFF4T1JvQ1ZWTW9BQVAB?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[42] "./topics/CAAqLQgKIidDQkFTRndvSkwyMHZNR1ptZHpWbUVnWmxjeTAwTVRrYUFsVlRLQUFQAQ?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[43] "./topics/CAAqLAgKIiZDQkFTRmdvSUwyMHZNREpxYW5RU0JtVnpMVFF4T1JvQ1ZWTW9BQVAB?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[44] "./topics/CAAqLAgKIiZDQkFTRmdvSUwyMHZNRFp1ZEdvU0JtVnpMVFF4T1JvQ1ZWTW9BQVAB?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
[45] "./topics/CAAqJggKIiBDQkFTRWdvSUwyMHZNR3QwTlRFU0JtVnpMVFF4T1NnQVAB?hl=es-419&gl=US&ceid=US%3Aes-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
[46] "https://play.google.com/store/apps/details?id=com.google.android.apps.magazines&referrer=news.google.com?utm_source=web&utm_medium=menu&utm_campaign=side_menu_promotion"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
[47] "https://itunes.apple.com/US/app/apple-store/id459182288?pt=9008&ct=Web%20Side%20Promotion&mt=8&l=es-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
[48] "https://support.google.com/googlenews?p=web&hl=es-419&authuser=0"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
[49] "https://www.google.com/producer/app/privacy?hl=es-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
[50] "https://www.google.com/producer/app/tos?hl=es-419"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
[51] "https://www.google.com/about"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
[52] "https://www.eluniverso.com/noticias/2020/11/14/nota/8047900/elecciones-presidenciales-ecuador-2021-juan-fernando-velasco-plan"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
[53] "https://www.eluniverso.com/noticias/2020/11/14/nota/8047900/elecciones-presidenciales-ecuador-2021-juan-fernando-velasco-plan"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

Podemos observar que dentro del nodo “a” existen varios links, de los cuales nos sirven los dos últimos. Estos nodos se ven como:

nodos = link_leido %>% html_nodes("a") 
nodos[length(nodos)]
{xml_nodeset (1)}
[1] <a href="https://www.eluniverso.com/noticias/2020/11/14/nota/8047900/elecciones-presidenciales-ecuador-2021 ...

Si vemos de cerca ambos nodos es notable que cualquiera de los dos tiene el hipervínculo que necesitamos. Entonces tomaremos el último:

link = link_leido %>% html_nodes("a") %>% tail(1) %>% html_attr("href")
link
[1] "https://www.eluniverso.com/noticias/2020/11/14/nota/8047900/elecciones-presidenciales-ecuador-2021-juan-fernando-velasco-plan"

Ahora que hemos obtenido el link de la noticia, necesitamos obtener su información. Para ello:

  • Navegamos al link de la noticia:
noticia_leida = read_html(link)
  • De esta haremos buscaremos el selector CSS que contenga el texto de la noticia:


  • Y lo pasamos a la función html_nodes para luego extraer el texto:
noticia_leida %>% html_nodes(".field-name-body") %>% html_text() %>% cat()




Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, Social y Seguridad.
A continuación un resumen de las propuestas que presentaron al Consejo Nacional Electoral (CNE) al momento de inscribir sus candidaturas. El documento tiene 45 páginas.
1. Eje económico
Establecer un programa de formación continua profesional en alianza con el sector privado para desarrollar actividades productivas. Esto se haría aprovechando la transferencia tecnológica que se desarrolla al nivel de todos los procesos económicos y creando franjas de empleo formativo para que las personas que necesitan un primer empleo o entrar en un nuevo campo laboral logren aprender destrezas con una remuneración acorde a las competencias de este proceso.
Fomentar y diversificar las exportaciones mediante la identificación de nuevos mercados internacionales para productos ecuatorianos, gestionando alianzas con el mercado internacional y entregando créditos productivos a los exportadores con fácil acceso y con bajas tasa de interés.
Definir la política arancelaria y de subsidios garantizando la liberación de barreras a los bienes de capital e insumos necesarios para la producción nacional y protegiendo a la economía interna específicamente a los sectores económicos en desarrollo.
var dfpSlot = { "label": "Ampliada", "seccion": ["ALL"], "subseccion": ["ALL"], "type": ["nota", "columnista"] }; var resolution = showSlot('0', sizeWindow); var resultSlot = showZone(dfpSlot); if (resolution && resultSlot) { cX.callQueue.push(['invoke', function () { googletag.cmd.push(function () { googletag.display('Ampliada'); }); }]); document.getElementById('Ampliada').classList.add('publicity-content'); } Disminuir los costos de transacción a través de la digitalización de la moneda para posibilitar que la población pueda manejar su dinero desde sus celulares y así, además, evitar los riesgos de contagio del COVID-19.
Establecer un programa para fortalecer los servicios de transporte público en coordinación con los Gobiernos Autónomos Descentralizados, a través de una moneda digital para los cobros que realizan las diferentes instituciones y empresas públicas y municipales.
Garantizar la eficiente gestión en la recaudación tributaria con principios de progresividad, eficiencia y simplicidad administrativa, evitando la evasión y elusión de impuestos.
Controlar el uso eficiente y eficaz de los recursos asignados a las instituciones públicas.
Impulsar los emprendimientos y la digitalización de pequeñas y medianas empresas para la producción de bienes y servicios de mayor calidad con menores costos. Para esto se trabajará en políticas de disminución de brecha digital y optimización de costos de infraestructura, impulso al desarrollo de software local y propuestas de incentivos económicos a pymes.
Reducir los tiempos en trámites para la adjudicación de contratos, garantizando objetividad, transparencia y méritos, apoyándose en herramientas tecnológicas.
  var dfpSlot = { 'label': 'Box1', 'seccion': ['ALL'], 'subseccion': ['ALL'], 'type': ['nota', 'columnista'] }; var resultSlot = showZone(dfpSlot); var resolution = showSlot('0', sizeWindow); if (resolution && resultSlot) { cX.callQueue.push(['invoke', function () { googletag.cmd.push(function () { googletag.display('Box1'); }); }]); document.getElementById('Box1').classList.add('publicity-content'); } Implementar una plataforma única de acceso libre a toda la información estadística disponible en el país.
Garantizar que los trabajadores tengan los beneficios y derechos establecidos en la ley, eliminando las barreras de acceso al mercado laboral
Implementar un programa económico con enfoque de género: responsabilidad fiscal, incorporando el enfoque de género de manera transversal en los campos de ciencia y tecnología, agricultura, pesca, turismo, emprendimiento y medioambiente a través del fortalecimiento de carreras técnicas para las mujeres y niñas.
Ejecutar un plan de inversiones a nivel nacional que incentiven el empleo y la producción, priorizando los sectores o territorios con mayores niveles de desempleo y baja productividad.
Incentivar la inversión extranjera directa otorgando beneficios tributarios como el cero impuesto a la salida de divisas y promocionar nuevas oportunidades de negocios en sectores de mayor rentabilidad o que se acoplen a las necesidades de los inversionistas.
2. Eje Social
Fortalecer la Investigación a nivel nacional y a través de redes regionales e internacionales, así como la generación del conocimiento colectivo para enfrentar momentos de crisis, como el que se generó por la pandemia del COVID-19.
Propender a un incremento progresivo del presupuesto para investigación en Universidades Públicas, a través de la evaluación permanente de la gestión de este recurso.
Implementar un sistema de monitoreo de las condiciones de bienestar de los profesionales de la salud y los estudiantes de este campo. Empezando con un proyecto piloto con los posgradistas
Ampliar la cobertura del bono de desarrollo humano, a través de una revisión, ajuste y afinamiento del registro social a las condiciones actuales y el impacto del COVID-19 a nivel nacional.
Diseñar un sistema que permita contar con un ciclo de atención social focalizada para que los beneficiarios/usuarios del Bono de Desarrollo Humano y sus familias tengan acceso a salud, educación y formación para el trabajo.
Incorporar el enfoque de género en las agendas políticas, económicas y sociales de Ecuador.
Garantizar el acceso a tecnología a niños y jóvenes del sistema de educación para que sea posible la continuidad educativa en este escenario de pandemia.
Garantizar la conectividad para estudiantes a través de un Plan Integral del Ministerio de Telecomunicaciones y así aprovechar la capacidad instalada de wifi en edificios públicos para las familias que viven en sectores cercanos a estos.
3. Eje Seguridad
Fortalecer la seguridad ciudadana como bien público y capital social.
Generar políticas públicas de seguridad ciudadana enfocadas en organizar, incentivar y liderar procesos de participación comunitaria y de corresponsabilidad en la seguridad.
Fortalecer las leyes y políticas de violencia de género.
Incentivar un modelo que gire alrededor de políticas públicas de “seguridad para la paz”, lo cual implica el reforzamiento de la policía comunitaria y los Mecanismos Alternativos de Solución de Conflictos.
Implementar el seguimiento y la evaluación de las medidas y sentencias dictadas por parte de los operadores de justicia.
Contar con jueces nacionales para temas específicos de corrupción y dotar de seguridad y las garantías para que ejerzan la fuerza de sentenciar.
Las problemáticas de ciberseguridad serán un enfoque central de las políticas públicas de seguridad ciudadana. El punto débil de este tema son los recursos humanos por lo cual se fortalecerá la formación en este campo; además de la tecnología y control inteligente de datos territoriales.
Se fortalecerán los mecanismos de cooperación interinstitucional para el mejor tratamiento de las problemáticas del crimen organizado junto con el mejoramiento de las capacidades de inteligencia policial y el aumento de datos disponibles. (I)

Podemos ver que dentro de la noticia se han colado algunos textos indeseables que en realidad son código HTML de la página web. Para excluirlos analizaremos el objeto con la función html_children:

noticia_leida %>% html_nodes(".field-name-body") %>% html_children() 
{xml_nodeset (40)}
 [1] <div class="location-event">\n\n</div>
 [2] <p></p>\n
 [3] <p><strong>Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 2 ...
 [4] <p>A continuación un resumen de las propuestas que presentaron al Consejo Nacional Electoral (CNE) al mome ...
 [5] <h2>1. Eje económico</h2>
 [6] <div id="boletineseudfp"></div>\n
 [7] <p><strong>Establecer un programa de formación</strong> continua profesional en alianza con el sector priv ...
 [8] <p><strong>Fomentar y diversificar</strong> las exportaciones mediante la identificación de nuevos mercado ...
 [9] <p><strong>Definir la política arancelaria</strong> y de subsidios garantizando la liberación de barreras  ...
[10] <div id="Ampliada" class="dfp-slot atm-banner-mappingampliada"><script>var dfpSlot = { "label": "Ampliada" ...
[11] <p><strong>Disminuir los costos de transacción</strong> a través de la digitalización de la moneda para po ...
[12] <p><strong>Establecer un programa para fortalecer</strong> los servicios de transporte público en coordina ...
[13] <p><strong>Garantizar la eficiente gestión en la recaudación</strong> tributaria con principios de progres ...
[14] <p><strong>Controlar el uso eficiente y eficaz</strong> de los recursos asignados a las instituciones públ ...
[15] <p><strong>Impulsar los emprendimientos</strong> y la digitalización de pequeñas y medianas empresas para  ...
[16] <p><strong>Reducir los tiempos en trámites</strong> para la adjudicación de contratos, garantizando objeti ...
[17] <div id="Box1" class="dfp-slot atm-banner-mappingbox1 desktopmiddledfpslot"> <script> var dfpSlot = { 'lab ...
[18] <p><strong>Implementar una plataforma única</strong> de acceso libre a toda la información estadística dis ...
[19] <p><strong>Garantizar que los trabajadores</strong> tengan los beneficios y derechos establecidos en la le ...
[20] <p><strong>Implementar un programa</strong> económico con enfoque de género: responsabilidad fiscal, incor ...
...
  • Aquí se nota que los nodos “p” son los que contienen texto (que serán unidos con la función paste0):
texto = noticia_leida %>% html_nodes(".field-name-body") %>% html_nodes("p") %>% html_text()
texto = paste0(texto, collapse = " ")
texto
[1] " Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, Social y Seguridad. A continuación un resumen de las propuestas que presentaron al Consejo Nacional Electoral (CNE) al momento de inscribir sus candidaturas. El documento tiene 45 páginas. Establecer un programa de formación continua profesional en alianza con el sector privado para desarrollar actividades productivas. Esto se haría aprovechando la transferencia tecnológica que se desarrolla al nivel de todos los procesos económicos y creando franjas de empleo formativo para que las personas que necesitan un primer empleo o entrar en un nuevo campo laboral logren aprender destrezas con una remuneración acorde a las competencias de este proceso. Fomentar y diversificar las exportaciones mediante la identificación de nuevos mercados internacionales para productos ecuatorianos, gestionando alianzas con el mercado internacional y entregando créditos productivos a los exportadores con fácil acceso y con bajas tasa de interés. Definir la política arancelaria y de subsidios garantizando la liberación de barreras a los bienes de capital e insumos necesarios para la producción nacional y protegiendo a la economía interna específicamente a los sectores económicos en desarrollo. Disminuir los costos de transacción a través de la digitalización de la moneda para posibilitar que la población pueda manejar su dinero desde sus celulares y así, además, evitar los riesgos de contagio del COVID-19. Establecer un programa para fortalecer los servicios de transporte público en coordinación con los Gobiernos Autónomos Descentralizados, a través de una moneda digital para los cobros que realizan las diferentes instituciones y empresas públicas y municipales. Garantizar la eficiente gestión en la recaudación tributaria con principios de progresividad, eficiencia y simplicidad administrativa, evitando la evasión y elusión de impuestos. Controlar el uso eficiente y eficaz de los recursos asignados a las instituciones públicas. Impulsar los emprendimientos y la digitalización de pequeñas y medianas empresas para la producción de bienes y servicios de mayor calidad con menores costos. Para esto se trabajará en políticas de disminución de brecha digital y optimización de costos de infraestructura, impulso al desarrollo de software local y propuestas de incentivos económicos a pymes. Reducir los tiempos en trámites para la adjudicación de contratos, garantizando objetividad, transparencia y méritos, apoyándose en herramientas tecnológicas. Implementar una plataforma única de acceso libre a toda la información estadística disponible en el país. Garantizar que los trabajadores tengan los beneficios y derechos establecidos en la ley, eliminando las barreras de acceso al mercado laboral Implementar un programa económico con enfoque de género: responsabilidad fiscal, incorporando el enfoque de género de manera transversal en los campos de ciencia y tecnología, agricultura, pesca, turismo, emprendimiento y medioambiente a través del fortalecimiento de carreras técnicas para las mujeres y niñas. Ejecutar un plan de inversiones a nivel nacional que incentiven el empleo y la producción, priorizando los sectores o territorios con mayores niveles de desempleo y baja productividad. Incentivar la inversión extranjera directa otorgando beneficios tributarios como el cero impuesto a la salida de divisas y promocionar nuevas oportunidades de negocios en sectores de mayor rentabilidad o que se acoplen a las necesidades de los inversionistas. Fortalecer la Investigación a nivel nacional y a través de redes regionales e internacionales, así como la generación del conocimiento colectivo para enfrentar momentos de crisis, como el que se generó por la pandemia del COVID-19. Propender a un incremento progresivo del presupuesto para investigación en Universidades Públicas, a través de la evaluación permanente de la gestión de este recurso. Implementar un sistema de monitoreo de las condiciones de bienestar de los profesionales de la salud y los estudiantes de este campo. Empezando con un proyecto piloto con los posgradistas Ampliar la cobertura del bono de desarrollo humano, a través de una revisión, ajuste y afinamiento del registro social a las condiciones actuales y el impacto del COVID-19 a nivel nacional. Diseñar un sistema que permita contar con un ciclo de atención social focalizada para que los beneficiarios/usuarios del Bono de Desarrollo Humano y sus familias tengan acceso a salud, educación y formación para el trabajo. Incorporar el enfoque de género en las agendas políticas, económicas y sociales de Ecuador. Garantizar el acceso a tecnología a niños y jóvenes del sistema de educación para que sea posible la continuidad educativa en este escenario de pandemia. Garantizar la conectividad para estudiantes a través de un Plan Integral del Ministerio de Telecomunicaciones y así aprovechar la capacidad instalada de wifi en edificios públicos para las familias que viven en sectores cercanos a estos. Fortalecer la seguridad ciudadana como bien público y capital social. Generar políticas públicas de seguridad ciudadana enfocadas en organizar, incentivar y liderar procesos de participación comunitaria y de corresponsabilidad en la seguridad. Fortalecer las leyes y políticas de violencia de género. Incentivar un modelo que gire alrededor de políticas públicas de “seguridad para la paz”, lo cual implica el reforzamiento de la policía comunitaria y los Mecanismos Alternativos de Solución de Conflictos. Implementar el seguimiento y la evaluación de las medidas y sentencias dictadas por parte de los operadores de justicia. Contar con jueces nacionales para temas específicos de corrupción y dotar de seguridad y las garantías para que ejerzan la fuerza de sentenciar. Las problemáticas de ciberseguridad serán un enfoque central de las políticas públicas de seguridad ciudadana. El punto débil de este tema son los recursos humanos por lo cual se fortalecerá la formación en este campo; además de la tecnología y control inteligente de datos territoriales. Se fortalecerán los mecanismos de cooperación interinstitucional para el mejor tratamiento de las problemáticas del crimen organizado junto con el mejoramiento de las capacidades de inteligencia policial y el aumento de datos disponibles. (I)"

Con esto habremos finalizado el proceso de web-scrapping para esta noticia. Cabe notar que cada diario tendrá su propia estructura, que tendrá que ser analizada con SelectorGadget.

Una vez explicado el ejemplo, unamos todas sus partes para crear 3 funciones, de las cuales explicaremos un par de detalles adicionales.

Función de búsqueda de noticias:

obtieneNoticiasBusqueda = function(busqueda){
  news_pag = "https://news.google.com/"
  parametro_busqueda = "search?q="
  busqueda_no_espacios = gsub(" ","%20", busqueda)
  parametro_final = "&hl=es-419&gl=US&ceid=US:es-419"
  html_dir = paste0(news_pag,parametro_busqueda,busqueda_no_espacios,parametro_final)
  google_news = read_html(html_dir)
  noticias = google_news %>% 
    html_nodes(css = ".xP6mwf") %>% 
    html_children()
  noticiasDF = map(noticias,obtieneNoticiasData)
  noticiasDF = bind_rows(noticiasDF)
  noticiasDF = noticiasDF[!is.na(noticiasDF$Titular),]
  return(noticiasDF)
}

Esta función recibe como argumento una búsqueda de texto y extrae todas las noticias que devuelva google news para esa búsqueda (con un máximo de 100).

Con la función map, lo que se hace es usar la siguiente función (obtieneNoticiasData), para extraer las características de cada uno de los objetos de noticia encontrados.

Al final se devuelve un data.frame con la información relevante de todas las noticias encontradas.

Función de caracterización de noticias:

obtieneNoticiasData = function(noticia){
  news_pag = "https://news.google.com/"
  titular = noticia %>% html_node("h3") %>% html_text()
  fecha = noticia %>% html_node("time") %>% html_attr("datetime")
  diario = noticia %>% html_node("a.wEwyrc.AVN2gc.uQIVzc.Sksgp") %>% html_text()
  link_enmascarado = noticia %>% html_node("h3 a") %>% html_attr("href")
  link_enmascarado = paste0(news_pag,substring(link_enmascarado,3))  
  link_leido = read_html(link_enmascarado)
  link = link_leido %>% 
    html_nodes(css='a') %>% 
    tail(1) %>% 
    html_attr("href")
  noticiaDF = data.frame(Titular=titular, Fecha=fecha, Diario=diario, Link=link, stringsAsFactors = F)
  return(noticiaDF)
}

Esta función sirve como un auxiliar para la función anterior y extrae las características del objeto de noticia que recibe como input.

Función de extracción de noticias:

obtenerNoticiaNacional = function(link_noticia, diario, diccionario_css){
  
  noticia_leida = read_html(link_noticia)
  css = diccionario_css$CSS[diccionario_css$Diario==diario]
  
  text_nodes = noticia_leida %>% 
    html_nodes(css = css) %>% 
    html_nodes("p")
  
  text = text_nodes %>% 
    html_text()
    
  text = paste0(text, collapse = " ")
    
  return(text)
  
}

Esta función hace web-scrapping, para el link y diario suministrados, la noticia completa.

  1. Obtenemos las noticias para 3 búsquedas:
noticiasVelascoDF = obtieneNoticiasBusqueda(busqueda = "Juan Fernando Velasco")
Warning in for (i in seq_along(specs)) { :
  closing unused connection 3 (https://news.google.com/articles/CBMic2h0dHBzOi8vd3cyLmVsbWVyY3VyaW8uY29tLmVjLzIwMjAvMDkvMjUvZWwtYmlub21pby1kZS1saWJlcnRhZC1lcy1wdWVibG8tYWN1ZGlvLWFsLWNuZS1hLXJlZ2lzdHJhci1zdS1jYW5kaWRhdHVyYS_SAQA?hl=es-419&gl=US&ceid=US%3Aes-419)
noticiasLarreaDF = obtieneNoticiasBusqueda("Gustavo Larrea")
noticiasFreileDF = obtieneNoticiasBusqueda("Pedro José Freile")
noticiasVelascoDF %>% select(Fecha, Diario, Titular, Link)
noticiasLarreaDF %>% select(Fecha, Diario, Titular, Link)
noticiasMontufarDF %>% select(Fecha, Diario, Titular, Link)
noticiasFreileDF %>% select(Fecha, Diario, Titular, Link)
  1. Obtenemos los textos de cada noticia usando la función obtenerNoticiaNacional creada en el literal 2:

Por motivos didácticos, usaremos la información de 3 diarios nacionales: El comercio, El Universo y Primicias, de los cuales, se muestra el CSS de acceso a continuación:

El Comercio (Ecuador)



El Universo



Primicias



Para estos diarios construimos un diccionario CSS que usara la función obtenerNoticiaNacional a través del iterador map2_chr:

# Diarios
Diarios = c("El Comercio (Ecuador)", "El Universo", "Primicias")
Estructura = data.frame(Diario=Diarios)
Estructura$CSS = NA
Estructura$CSS[Estructura$Diario=='El Comercio (Ecuador)'] = '.paragraphs'
Estructura$CSS[Estructura$Diario=='El Universo'] = '.field-name-body'
Estructura$CSS[Estructura$Diario=='Primicias'] = '#entry-content-inarticle'

Ahora obtenemos las noticias

noticiasVelascoDF = noticiasVelascoDF %>% filter(Diario %in% Diarios)
news = map2_chr(noticiasVelascoDF$Link, noticiasVelascoDF$Diario, obtenerNoticiaNacional, diccionario_css=Estructura)
noticiasVelascoDF$Noticia = news
print(noticiasVelascoDF$Link[1])
[1] "https://www.eluniverso.com/noticias/2020/11/14/nota/8047900/elecciones-presidenciales-ecuador-2021-juan-fernando-velasco-plan"
print(noticiasVelascoDF$Titular[1])
[1] "Una moneda digital para evitar contagios del COVID-19 ofrece Juan Fernando Velasco en su plan de gobierno"
print(news[1])
[1] " Juan Fernando Velasco, aspirante presidencial del movimiento Construye (antes Ruptura), Lista 25, desarrollan su plan de Gobierno en tres ejes: Económico, Social y Seguridad. A continuación un resumen de las propuestas que presentaron al Consejo Nacional Electoral (CNE) al momento de inscribir sus candidaturas. El documento tiene 45 páginas. Establecer un programa de formación continua profesional en alianza con el sector privado para desarrollar actividades productivas. Esto se haría aprovechando la transferencia tecnológica que se desarrolla al nivel de todos los procesos económicos y creando franjas de empleo formativo para que las personas que necesitan un primer empleo o entrar en un nuevo campo laboral logren aprender destrezas con una remuneración acorde a las competencias de este proceso. Fomentar y diversificar las exportaciones mediante la identificación de nuevos mercados internacionales para productos ecuatorianos, gestionando alianzas con el mercado internacional y entregando créditos productivos a los exportadores con fácil acceso y con bajas tasa de interés. Definir la política arancelaria y de subsidios garantizando la liberación de barreras a los bienes de capital e insumos necesarios para la producción nacional y protegiendo a la economía interna específicamente a los sectores económicos en desarrollo. Disminuir los costos de transacción a través de la digitalización de la moneda para posibilitar que la población pueda manejar su dinero desde sus celulares y así, además, evitar los riesgos de contagio del COVID-19. Establecer un programa para fortalecer los servicios de transporte público en coordinación con los Gobiernos Autónomos Descentralizados, a través de una moneda digital para los cobros que realizan las diferentes instituciones y empresas públicas y municipales. Garantizar la eficiente gestión en la recaudación tributaria con principios de progresividad, eficiencia y simplicidad administrativa, evitando la evasión y elusión de impuestos. Controlar el uso eficiente y eficaz de los recursos asignados a las instituciones públicas. Impulsar los emprendimientos y la digitalización de pequeñas y medianas empresas para la producción de bienes y servicios de mayor calidad con menores costos. Para esto se trabajará en políticas de disminución de brecha digital y optimización de costos de infraestructura, impulso al desarrollo de software local y propuestas de incentivos económicos a pymes. Reducir los tiempos en trámites para la adjudicación de contratos, garantizando objetividad, transparencia y méritos, apoyándose en herramientas tecnológicas. Implementar una plataforma única de acceso libre a toda la información estadística disponible en el país. Garantizar que los trabajadores tengan los beneficios y derechos establecidos en la ley, eliminando las barreras de acceso al mercado laboral Implementar un programa económico con enfoque de género: responsabilidad fiscal, incorporando el enfoque de género de manera transversal en los campos de ciencia y tecnología, agricultura, pesca, turismo, emprendimiento y medioambiente a través del fortalecimiento de carreras técnicas para las mujeres y niñas. Ejecutar un plan de inversiones a nivel nacional que incentiven el empleo y la producción, priorizando los sectores o territorios con mayores niveles de desempleo y baja productividad. Incentivar la inversión extranjera directa otorgando beneficios tributarios como el cero impuesto a la salida de divisas y promocionar nuevas oportunidades de negocios en sectores de mayor rentabilidad o que se acoplen a las necesidades de los inversionistas. Fortalecer la Investigación a nivel nacional y a través de redes regionales e internacionales, así como la generación del conocimiento colectivo para enfrentar momentos de crisis, como el que se generó por la pandemia del COVID-19. Propender a un incremento progresivo del presupuesto para investigación en Universidades Públicas, a través de la evaluación permanente de la gestión de este recurso. Implementar un sistema de monitoreo de las condiciones de bienestar de los profesionales de la salud y los estudiantes de este campo. Empezando con un proyecto piloto con los posgradistas Ampliar la cobertura del bono de desarrollo humano, a través de una revisión, ajuste y afinamiento del registro social a las condiciones actuales y el impacto del COVID-19 a nivel nacional. Diseñar un sistema que permita contar con un ciclo de atención social focalizada para que los beneficiarios/usuarios del Bono de Desarrollo Humano y sus familias tengan acceso a salud, educación y formación para el trabajo. Incorporar el enfoque de género en las agendas políticas, económicas y sociales de Ecuador. Garantizar el acceso a tecnología a niños y jóvenes del sistema de educación para que sea posible la continuidad educativa en este escenario de pandemia. Garantizar la conectividad para estudiantes a través de un Plan Integral del Ministerio de Telecomunicaciones y así aprovechar la capacidad instalada de wifi en edificios públicos para las familias que viven en sectores cercanos a estos. Fortalecer la seguridad ciudadana como bien público y capital social. Generar políticas públicas de seguridad ciudadana enfocadas en organizar, incentivar y liderar procesos de participación comunitaria y de corresponsabilidad en la seguridad. Fortalecer las leyes y políticas de violencia de género. Incentivar un modelo que gire alrededor de políticas públicas de “seguridad para la paz”, lo cual implica el reforzamiento de la policía comunitaria y los Mecanismos Alternativos de Solución de Conflictos. Implementar el seguimiento y la evaluación de las medidas y sentencias dictadas por parte de los operadores de justicia. Contar con jueces nacionales para temas específicos de corrupción y dotar de seguridad y las garantías para que ejerzan la fuerza de sentenciar. Las problemáticas de ciberseguridad serán un enfoque central de las políticas públicas de seguridad ciudadana. El punto débil de este tema son los recursos humanos por lo cual se fortalecerá la formación en este campo; además de la tecnología y control inteligente de datos territoriales. Se fortalecerán los mecanismos de cooperación interinstitucional para el mejor tratamiento de las problemáticas del crimen organizado junto con el mejoramiento de las capacidades de inteligencia policial y el aumento de datos disponibles. (I)"
noticiasLarreaDF = noticiasLarreaDF %>% filter(Diario %in% Diarios)
news = map2_chr(noticiasLarreaDF$Link, noticiasLarreaDF$Diario, obtenerNoticiaNacional, diccionario_css=Estructura)
noticiasLarreaDF$Noticia = news
print(noticiasLarreaDF$Link[1])
[1] "https://www.elcomercio.com/actualidad/gustavo-larrea-entrevista-candidato-elecciones.html"
print(noticiasLarreaDF$Titular[1])
[1] "Gustavo Larrea: 'Debemos lograr que este sea un país agroindustrial sólido'"
print(news[1])
[1] "Entrevista a Gustavo Larrea, candidato Presidencial de Democracia Sí ¿Cómo recibirá al Ecuador el 24 de mayo 2021?Con problemas no resueltos aún de la pandemia. Diría que ya estará la vacuna, hay que tener mucho cuidado y estar preparados para enfrentar un plan Cero Covid, con trazabilidad, uso de tecnología de punta y en función de cercos epidemiológicos eficientes. Debemos conseguir vacunas, no solo los 2 millones que se han anunciado, sino hacer un esfuerzo por garantizar la salud de todos los ciudadanos.¿Y en otros ámbitos?​El país mantendrá el déficit fiscal, tendremos serios problemas económicos, decenas de miles de micro y pequeñas empresas cerradas, incluso las grandes; habrá que recuperar el empleo; hay problemas en la educación, no todos  los niños y jóvenes tienen acceso a los sistemas de educación telemática. Seguirá vigente la Ley de contratación pública, que es una ley que permite la corrupción, por lo que es urgente cambiarla. ¿Qué hará en los primeros 100 días de gobierno?Dos decisiones fundamentales. El plan Cero Covid para impulsar un plan de empleo, ese será el eje vital de la recuperación económica. El otro elemento central es la reforma educativa, impulsaremos y abriremos las escuelas en las zonas rurales, los colegios serán colegios especializados, técnicos, vinculados a la visión productiva, cultural y ambiental de cada uno de los cantones del país. Esas serán medidas, diría yo, de carácter urgente. ¿Cómo lo hará?Impulsaremos un fondo nacional para estos objetivos, que requiere cooperación internacional, requiere que la banca pública ponga recursos, necesita acuerdos con la banca privada y  la banca multilateral para traer líneas de crédito, no deuda para el Estado, sino líneas de crédito para la micro, pequeña, mediana y gran producción del país. Lo que va paralelamente es la necesidad de un gran acuerdo nacional: unidad en la diversidad, lo que implica acuerdos parlamentarios. Si eso no fuese viable convocaremos a una consulta popular.¿Qué tendría esta consulta popular?Eliminar la Ley de Contratación Pública y sustituirla con otra más abierta, transparente, donde los ciudadanos tengan acceso a la información, que los medios de comunicación puedan saber qué concursos se convocaron, quiénes participaron, quién ganó y que eso no sea secreto de Estado. Otro será el cambio institucional y otro la reforma económica, que son aspectos centrales, y el otro será la reforma del Sistema de Salud Pública. Necesitamos un sistema de salud preventiva. ¿Cómo sería su primer año de gobierno?Deberíamos haber logrado recuperar el empleo perdido, haber logrado la intervención de un fondo de crédito a bajas tasas de interés, 5% a 10 años plazo, con créditos de hasta USD 20 000.  El plan de empleo debería estar funcionando, las líneas de crédito ya entregadas en una buena parte. El cambio educativo en marcha, el cambio de la salud pública también, la reforma económica, la reforma institucional y la reforma en la lucha contra la corrupción encarriladas. También debemos haber avanzado ya en un paso histórico muy importante, que es  fortalecer la producción agroindustrial.  Nosotros tenemos dos ventajas fundamentales, somos un país productor de alimentos, pero no exportamos valor agregado. Exportamos materia prima que se convierte después, por ejemplo cacao en chocolate, café en café soluble de alta calidad. Es decir, todo ese proceso de producción hay que iniciarlo. No digo que lo vamos a lograr en un año, pero sí podemos marcar pasos para este proceso de agroindustria que va a requerir también financiamiento y alianzas.  Actualmente  exportamos USD 13 000 millones en productos agropecuarios. Si tuvieran valor agregado deberíamos estar exportando USD 70 000 u 80 000 millones al año. Y eso es lo que debemos lograr, que este sea un país agroindustrial sólido. ¿Qué pasará con las minas y con el petróleo? No serán los ejes de nuestra política económica. Nuestro eje será la producción agrícola, agroindustrial, pesquera y acuacultura, porque además generan empleo en todos los cantones del país. Revisaremos los contratos petroleros cuestionados por muchos sectores. Entonces, aquellos que no cumplan la Ley, simplemente quedan fuera. Los  que sí la cumplan seguirán, en el campo petrolero y minero, pero no serán el eje de nuestra política económica.Hoja de vida Gustavo Larrea (Quito, 1956). Fue diputado entre 1994 y 1996 por el desaparecido partido Apre. Un año después, fue subsecretario del Ministerio de Gobierno. Una década más tarde, formó parte de la fundación del movimiento Alianza País, y fue Ministro de Gobierno y de Seguridad Externa de Rafael Correa."
print(news[2])
[1] "¿El 24 de mayo del 2021 qué país recibiría?Creemos que el Ecuador podría tener una tasa de crecimiento en números negativos todavía para mayo del próximo año. Podríamos anticipar que la pandemia se va a agudizar. Eso nos lleva a estar de nuevo en un estado de excepción para poder estar funcionales y, tal vez, le lleve al Estado a la necesidad de buscar recursos adicionales para atender los mecanismos de contingencia. La situación va a ser una situación más complicada que la que vemos hoy. ¿Cómo utilizará sus primeros 100 días?Poniendo a funcionar mi plan económico que está basado en la contratación y recontratación petrolera para generar liquidez. Vamos a generar un régimen excepcional de contratación por horas para todos los sectores, para ponernos de pie de nuevo. Estos 100 días servirán para hacer los acuerdos para construir reformas legales. Si no se logra eso, habrá que implementar las reformas legales por las vías que permita la Constitución, no contar con la participación directa dentro del Legislativo.Y, ¿cómo hará eso?Hemos empezado a identificar técnicos valiosos, dentro de todas las fuerzas políticas. Estamos metiéndole tiempo a la inteligencia del talento humano alrededor de los partidos políticos, gente que está en segunda línea, pero preparada. En la pandemia, la educación se ve limitada por la conectividad. ¿Qué hará?El tema de salud es esencial, si no tenemos una condición mínima de salud y salubridad pública es inviable que podamos trabajar, educarnos o hacer nada. En cuestión de conectividad, el Ecuador tiene 300 000 kilómetros cuadrados, una superficie que se puede, desde el punto de vista técnico, cubrir. Y los recursos para hacerlo curiosamente existen dentro de los contratos de la telefonía celular que aún están vigentes. Esos contratos generan unos fondos. La solución es automática: dar cobertura de salud y educación a todo el territorio nacional es una decisión administrativa y hacer que eso se contrate es cuestión de 30 días, con un modelo que se puede hacer bajo la supervisión de un organismo multilateral, mediante un régimen de emergencia. Es algo que debe ser atendido ahora, si no, no vamos a poder darle educación continua a nadie. ¿Cómo visualiza su Gobierno a un año?Para el 24 de mayo del 2022 deberíamos tener 500 000 barriles de petróleo liberados de compromisos anticipados, para empezar la negociación de nuestros pasivos externos. El problema va a ser que muchas fuerzas querrán un pedazo de esos recursos, ese es el momento difícil: estar boyante y no poder ser tan generosos. Es momento de asegurar que las pensiones de los jubilados se paguen, de reorganizar los bonos de desarrollo humano. Es el momento en que, teniendo los recursos, debemos gastar menos y achicar el Estado.Usted habla de ampliar la seguridad social...Hemos estado trabajando en una manera de descifrar cómo hacer crecer el número de aportantes bajo los principios de orden y solidaridad para asegurar liquidez para los servicios y las jubilaciones. ¿De dónde se sacarían 1,2 millones de afiliados en un día con garantía de que el siguiente mes van a pagar todos? De los bonistas. La idea de los bonos de desarrollo humano originalmente fue concebir una contraprestación de responsabilidad de las personas que se habían vuelto más vulnerables para que pudieran atender a los dependientes vulnerables de ellos, es decir, para evitar que se regenere la vulnerabilidad. Así, los bonistas van a dar una parte de lo que reciben para acceder a servicios de salud de una manera solidaria. ¿Qué hará en la recta final de su administración?Para el segundo año debemos tener pactos sociales en marcha. Deberíamos estar aportando a los nuevos planes de ordenamiento territorial. Vamos a estar trabajando con todas las fuerzas políticas para construir buenos gobiernos autónomos descentralizados.  Además, creo que se pude hacer mucho sobre la lucha contra la corrupción. Es indispensable dar recursos a la Fiscalía y a los jueces, hay que asegurarles recursos, y se deben contratar cazadores de recompensas para recuperar lo perdido por corrupción.Hoja de vida Pedro José Freile (Quito, 1972) es abogado especializado en contratos petroleros, con experiencia en Colombia, Ecuador y Chile. Se graduó en la Universidad SEK. Fue miembro del voluntariado de Solca. Formó parte del movimiento Quinto Poder.Su pensamiento Dice que su gobierno debe contar con figuras de varios partidos políticos."
  1. Guardamos los dataframes obtenidos:
saveRDS(noticiasVelascoDF, "Caso1_Noticias/noticiasVelascoDF.RDS")
saveRDS(noticiasLarreaDF, "Caso1_Noticias/noticiasLarreaDF.RDS")
saveRDS(noticiasFreileDF, "Caso1_Noticias/noticiasFreileDF.RDS")

3.2. Obtención de datos de documentos PDF

Obtendremos los datos de los documentos electrónicos a través de la lectura y manipulación de archivos PDF. Esto lo realizaremos de la siguiente manera:

  1. Cargamos las librerías necesarias para el ejercicio:
library(pdftools) # Manipulación de pdfs
Using poppler version 0.73.0
library(readxl) # Lectura de archivos excel
  1. Cargamos los archivos pdf que queremos procesar:
narrativa_vol1 = pdf_text("Caso2_Literatura/Narrativa completa vol. 1 - H. P. Lovecraft.pdf")
narrativa_vol2 = pdf_text("Caso2_Literatura/Narrativa completa vol. 2 - H. P. Lovecraft.pdf")
narrativa_vol1[2]
[1] "Howard Phillips Lovecraft (1890-1937) fue un ave nocturna y un cazador de sueños.\r\nNació en Providence (Nueva Inglaterra), donde vivió la mayor parte de su corta vida,\r\nque dedicó a contemplar las estrellas, leer con avidez cuanto caía en sus manos y,\r\nsobre todo, escribir (poesía, ensayo, relatos y una ingente correspondencia). Al\r\nrefugiarse en su hermético mundo onírico, Lovecraft se embarcó en un viaje sin retorno\r\nhacia una nueva dimensión: el miedo cósmico, el «terror de los espacios infinitos», que\r\nestremecía a Pascal. Como Poe, Lovecraft abandona definitivamente las invenciones\r\nmágicas o legendarias de los góticos: el castillo encantado, los fantasmas, vampiros y\r\nbrujas, y las sustituye por una nueva mitología fantástica en la que ya no hay Dios ni\r\nDiablo, ni seres sobrenaturales, tan sólo híbridos semihumanos y seres extraterrestres\r\no extradimensionales. Y el miedo se convirtió en horror cósmico. A través del sueño y el\r\nvuelo de la fantasía H.P.L. compensó su escasa movilidad física y viajó más lejos que\r\nnadie.\r\nEste primer volumen de su narrativa completa abarca la producción literaria de H.P.\r\nLovecraft entre 1905 y 1926. Influido desde sus comienzos por Edgar Allan Poe, en\r\nrelatos como “La tumba”, “El extraño” o “Aire frío”, entre 1917 y 1921 escribió casi una\r\nveintena de relatos oníricos inspirados en otro de sus grandes maestros: Lord Dunsany.\r\nCuentos de este periodo son “Dagon”, “Polaris”, “La ciudad sin nombre” o “La búsqueda\r\nen sueños de la ignota Kadath”. Así mismo, en esta primera etapa de su carrera vio la\r\nluz “La llamada de Cthulhu” (1926), pieza básica y fundacional de los Mitos de Cthulhu,\r\nsubgénero lovecraftiano que cuenta con ilustres precursores, como Arthur Machen o\r\nAlgernon Blackwood, así como numerosos continuadores, especialmente los escritores\r\nque integran el llamado «Círculo de Lovecraft».\r\nEd. Valdemar\r\n"
  1. Creamos funciones auxiliares que nos ayuden a separar líneas, remover espacios innecesarios, pie de páginas, número de página, título y líneas especiales:
# Remover caracteres especiales
removeSpecialChars <- function(x) gsub("[^a-zA-Z0-9 ]", " ", x)

# Separar lineas y remover espacios innecesarios
SeparaLineas = function(x){map(unlist(str_split(x, pattern = "\r\n")),str_squish)}

# Remover pie de página, encabezado y títulos
RemuevePagina = function(l){if(nchar(l)==nchar(gsub("\\D","",l))){""}else{l}}
RemuevePie = function(l){if(l=="FIN"){""}else{l}}
RemueveTitulo = function(l,title){if(l==title){""}else{l}}

# Remover líneas particulares
RemueveLineasEspeciales = function(l,text){if(l==text){""}else{l}}
  1. Paso seguido, creamos una función que procese la historia completa:
# Función completa: procesamiento de historia
ProcesaHistoria = function(data, titulo,pagina_inicio,pagina_fin,lineas_especiales){
  historia = data[pagina_inicio:pagina_fin]
  historia = SeparaLineas(historia)
  historia = map(historia,RemuevePagina)
  historia = map(historia,RemuevePie)
  historia = map(historia,RemueveTitulo, title = titulo)
  if(!is.na(lineas_especiales[1])){
    for (i in lineas_especiales)
    historia = map(historia,RemueveLineasEspeciales,text=i)
    }
  historia = unlist(historia)
  historia = str_squish(paste(historia, collapse = " "))
  return(historia)
}
  1. Procesamos las historias de cada volumen, con la ayuda de un archivo excel que presenta el índice de las historias:
Index_Vol1 = read_excel("Caso2_Literatura/IndiceLovecraft.xlsx", sheet = "VOL1")
head(Index_Vol1)
# Procesamiento de historias del volumen 1
historias_Vol1 = Index_Vol1
historias_Vol1$Historia = unlist(pmap(list(titulo = as.list(Index_Vol1$Titulo)
                                           ,pagina_inicio = as.list(Index_Vol1$PaginaInicial)
                                           ,pagina_fin = as.list(Index_Vol1$PaginaFinal)
                                           ,lineas_especiales = str_split(Index_Vol1$LineasEspeciales,";"))
                                      ,ProcesaHistoria, data = narrativa_vol1))
print(historias_Vol1$Titulo[5])
[1] "La Bestia De La Cueva"
print(historias_Vol1$Historia[5])
[1] "La horrible conclusión que había ido gradualmente imponiéndose en mi mente confundida y reacia resultaba ahora de una espantosa certeza. Estaba perdido, completa y descorazonadoramente perdido en las vastas y laberínticas profundidades de la cueva Mammoth. Hacia donde me volviese, por más que forzase la vista no lograba distinguir nada que pudiera servirme de pista para encontrar el camino de salida. Mi intelecto ya no albergaba dudas sobre que nunca más llegaría a contemplar la bendita luz del día, ni a deambular por las amables colinas y valles del hermoso mundo exterior. La esperanza se había esfumado. Pero, condicionado como estaba por una vida de estudios filosóficos, obtuve no poca satisfacción de mi desapasionada postura; ya que aunque había leído suficiente acerca del salvaje frenesí que acomete a las víctimas de sucesos similares, yo no experimenté nada parecido, sino que mantuve la calma apenas descubrí que me había perdido. Tampoco el pensamiento de haber errado más allá del alcance de una búsqueda normal me hizo ni por un momento perder la calma. Si había de morir, reflexionaba, entonces esta caverna terrible pero majestuosa me resultaría un sepulcro tan grato como el que pudiera brindarme un camposanto; una idea que me provocaba tranquilidad antes que desesperación. La muerte por inanición sería mi destino; de eso estaba convencido. Yo sabía que algunos habían enloquecido en similares circunstancias, pero sentía que tal no sería mi fin. Mi desgracia no era fruto sino de mi propia voluntad, ya que, a escondidas del guía, me había despegado voluntariamente del grupo visitante y, deambulando cerca de una hora a través de las prohibidas galerías de la cueva, me había encontrado luego incapaz de desandar los intrincados vericuetos recorridos tras abandonar a mis compañeros. Mi antorcha comenzaba ya a flaquear y pronto me hallaría sumido en la negrura total y casi palpable de las entrañas de la tierra. Mientras permanecía al resplandor de la menguante y temblorosa luz, especulé ocioso sobre las circunstancias exactas en que se produciría mi cercano fin. Recordé las historias sobre la colonia de tuberculosos que, habiéndose instalado en esta gigantesca gruta buscando la salud en su temperatura uniforme y suave, su aire puro y su pacífica tranquilidad, habían, sin embargo, muerto en circunstancias extrañas y terribles. Yo había mirado los tristes restos de sus chozas destartaladas al pasar con el grupo, preguntándome qué antinatural efecto podría lograr una larga estancia en esta caverna inmensa y silenciosa sobre alguien como yo, saludable y vigoroso. Ahora, me dije tétricamente, había llegado la ocasión de comprobar tal respecto, a no ser que la falta de comida acelerase mi tránsito. Según se esfumaban en la oscuridad los últimos e intermitentes resplandores de mi antorcha, resolví no dejar piedra sobre piedra, ni desdeñar cualquier posible medio de escapar; así que prorrumpí en una sucesión de gritos tremendos, a pleno pulmón, con la vana esperanza de llamar la atención del guía. Sin embargo, mientras vociferaba, tuve la sensación de que mis gritos resultaban un despropósito, y que mi voz, aumentando y reverberando por las innumerables paredes del negro laberinto circundante, no llegaba a otros oídos que los míos. Sin embargo, a una, mi atención se volvió sobresaltada hacia un sonido de suaves pasos que imaginé escuchar acercándoseme sobre el suelo rocoso de la cueva. ¿Era inminente mí salvación? ¿No habían sido entonces todos mis horribles temores otra cosa que naderías, y el guía, habiéndose percatado de mi inexplicable ausencia, había seguido mi rastro, buscándome a través de este laberinto calcáreo. Mientras aquellas preguntas felices brotaban en mi interior, estuve a punto de reanudar mis gritos para acelerar mi descubrimiento; pero en un instante mi alegría se trocó en horror al volver a escuchar, ya que mis siempre agudos oídos, ahora afinados aún más por el completo silencio de la cueva, dieron a mi entumecido entendimiento la inesperada y espantosa certeza de que aquellas pisadas no sonaban como las de un ser humano. En la quietud ultraterrena de esa subterránea región, la aparición del guía con su calzado hubiera resultado como una serie de golpes claros e incisivos. Aquellos sonidos eran blandos y sigilosos, como los que podrían producir las zarpas almohadilladas de un felino. Además, a veces, escuchando cuidadosamente, me parecía distinguir el paso no de dos, sino de cuatro pies. Ahora ya estaba convencido de que mis gritos habían despertado y atraído a alguna bestia salvaje, quizás un puma extraviado por accidente en el interior de la cueva. Quizás, reflexioné, el Todopoderoso me había designado una muerte más rápida y misericordiosa que el hambre. Aunque el instinto de conservación, nunca apagado por completo, se conmovió en mi ser y, a pesar de que evitar el peligro que se acercaba podía depararme un final más largo e inclemente, me dispuse, sin embargo, a vender la vida lo más cara posible. Por extraño que pueda parecer, mi mente no concebía otra intención en el visitante que la de una clara hostilidad. En consecuencia, permanecí inmóvil, esperando que la bestia desconocida, a falta de un sonido que la guiase, perdiese mi dirección y pasase de largo. Pero esa esperanza iba a revelarse infundada, ya que aquellas extrañas pisadas avanzaban implacables; sin duda, el animal me olfateaba y, en una atmósfera tan absolutamente limpia de cualquier influencia contaminante como resulta la de una cueva, podía sin duda seguirme hasta gran distancia. Por consiguiente, viendo que debía armarme para defenderme de un extraño e invisible ataque en la oscuridad, tanteé en busca de los mayores de entre los fragmentos de roca dispersos por doquier en el suelo de la caverna circundante y, empuñando uno en cada mano, listos para ser usados, esperé resignado los inevitables sucesos. Mientras, el odioso paso de garras se acercaba. La conducta de esa criatura era realmente extraña. Casi todo el tiempo, los movimientos parecían propios de un cuadrúpedo, moviéndose con una curiosa descoordinación entre miembros delanteros y traseros; y, sin embargo, durante algunos pocos y cortos intervalos, me pareció que caminaba sobre dos patas tan sólo. Me pregunté qué clase de animal tenía delante; debía tratarse, suponía, de alguna infortunada bestia que había pagado la curiosidad de indagar a las puertas de la temible gruta con una reclusión de por vida en esas interminables profundidades. Sin duda, se alimentaba de peces ciegos, murciélagos y ratas de la cueva, así como de los peces comunes que nadan en los manantiales del río Verde, el cual comunica por vías ocultas con las aguas de la caverna. Llené mi terrible espera haciendo grotescas conjeturas sobre los efectos que una vida cavernaria pudieran haber causado sobre la estructura física de la bestia, recordando las espantosas apariencias que la tradición local achacaba a los tuberculosos muertos tras una larga residencia en la cueva. Entonces, con un sobresalto, recordé que, aun en el caso de lograr matar a mi antagonista, nunca llegaría a contemplar su apariencia, dado que mi antorcha se había extinguido hacía tiempo y no tenía encima ni una cerilla. La tensión mental se volvía ahora espantosa. Mi imaginación desbocada conjuraba formas odiosas y temibles en la siniestra oscuridad circundante, que parecían ya casi presionarme. Las espantosas pisadas se acercaban, cerca, más cerca. Creo que debí lanzar un grito, aunque de haber sido en verdad tan timorato como para hacerlo, mi voz apenas debió responderme. Estaba petrificado, clavado al sitio. Dudaba de que mi brazo derecho me respondiera lo bastante como para disparar sobre el ser llegado el momento crucial. El inexorable, pat, pat, de pisada está al alcance de la mano, ya muy cerca. Podía oír el trabajoso resuello del animal, y, aterrorizado como estaba, aún llegué a comprender que venía de muy lejos y estaba por tanto fatigado. Repentinamente se rompió el maleficio. Mi brazo derecho, guiado por mi siempre fiable oído, lanzó con todas sus fuerzas el pedazo de caliza, de bordes agudos, que sostenía, impulsándolo hacia el lugar de la oscuridad de donde provenían resuello y pisadas; y, por increíble que parezca, estuvo a punto de alcanzar su objetivo, ya que escuché brincar al ser, yendo a cierta distancia y pareciendo detenerse allí. Reajustando el tiro, lancé el segundo proyectil, esta vez con mejores resultados, ya que lleno de alegría oí cómo la criatura caía de una forma que sonaba a desplome, quedando sin lugar a dudas tendida e inmóvil. Casi desbordado por el tremendo alivio consiguiente, me recosté tambaleándome contra la pared. El resuello proseguía, pesado, boqueando inhalaciones y exhalaciones; así que comprendí que no había hecho otra cosa que herir a la criatura. Y cualquier deseo de examinar al ser se esfumó. Por fin, algo semejante al miedo ultraterreno y supersticioso se alojó en mi cerebro y no me aproximé al cuerpo, ni seguí cogiendo hiedras para rematarlo. En vez de eso, eché a correr tan rápido como pude y, tanto como me lo permitía mi frenético estado, por donde había llegado. Bruscamente escuché un sonido o, mejor, una sucesión regular de sonidos. AI instante siguiente se habían convertido en un golpeteo claro y metálico. Ahora no había duda. Era el guía. Y entonces grité, chillé, vociferé, incluso aullé de alegría contemplando en los techos abovedados la luminosidad débil y resplandeciente que yo sabía era el reflejo del brillo de una antorcha aproximándose. Corrí al encuentro del resplandor y, antes de comprender del todo lo que hacía, estaba a los pies del guía, abrazándole las botas, balbuceando a pesar de mi reserva ostentosa de una forma que resultaba de lo más insensata y estúpida, barbotando mi terrible historia y, a la vez, aturullando a mi oyente con mis demostraciones de gratitud. El guía había notado mi ausencia cuando el grupo volvió a la entrada de la cueva y, llevado por su intuitivo sentido de la orientación, había procedido a realizar una exploración exhaustiva de los pasadizos frente a los que me viera por última vez, localizando mi paradero tras una búsqueda de unas cuatro horas. Cuando me lo hubo contado, yo, envalentonado por la luz de su antorcha y por su compañía, comencé a pensar en la extraña bestia a la que había herido unos metros más atrás, en la oscuridad, y sugerí que fuéramos a ver, con ayuda del hacha, qué clase de criatura había yo abatido. Así que me volví sobre mis pasos, esta vez con un valor que nacía del estar acompañado, hasta el escenario de mi terrible experiencia. Pronto descubrimos un cuerpo blanco en el suelo, más blanco aún que la propia caliza resplandeciente. Avanzando con precaución, prorrumpimos en simultáneas exclamaciones de asombro, ya que de todos los monstruos antinaturales que pudiéramos haber contemplado en nuestra vida, éste resultaba con mucho el más extraño. Parecía ser un mono antropoide de grandes dimensiones, escapado quizás de algún circo ambulante. Su pelaje era blanco como la nieve, debido sin duda a la acción decolorante de una larga existencia en los recintos negros como la tinta de la cueva, pero asimismo aquel pelo era sorprendentemente ralo, faltando por doquier, excepto en la cabeza, donde era tan largo y abundante que caía sobre sus hombros en profusión considerable. El rostro permanecía oculto, ya que la criatura estaba boca abajo. El ángulo de los miembros era también muy singular, explicando empero la alteración de uso que yo antes notara y por la cual la bestia empleaba unas veces cuatro zarpas para desplazarse y otras sólo dos. Las manos o pies no eran prensiles, algo que atribuí a su larga estancia en la cueva que, como antes dije, parecía probada por aquella blancura completa y casi ultraterrena tan característica de toda su anatomía. No parecía dotada de cola. La respiración se había vuelto ahora sumamente débil, y el guía había empuñado su pistola con la evidente intención de rematar a la criatura, cuando un inesperado sonido lanzado por esta última le hizo abatir el arma sin usarla. Aquel sonido era de naturaleza difícil de explicar. No era como los tonos normales que emiten las especies de simios conocidas, y me pregunté si aquella cualidad antinatural no sería el fruto de una larga estancia en silencio total, roto al fin por la sensación provocada por la llegada de luz, algo que la bestia no había visto desde su llegada a la cueva. El sonido, que de lejos puede definirse como una especie de profundo charloteo, proseguía débilmente. De repente, un fugaz espasmo de energía pareció estremecer el cuerpo de la bestia. Las zarpas se movieron convulsivamente y los miembros se contrajeron. Con un espasmo, el cuerpo blanco rodó hasta que el rostro giró en nuestra dirección. Por un instante me vi tan abrumado por lo que mostraban aquellos ojos, que no vi nada más. Eran negros, esos ojos; profundos, tremendamente negros, contrastando espantosamente con la nívea blancura de cabello y carnes. Como en otros moradores de cavernas, estaba profundamente hundidos en las órbitas y carecían completamente de iris. Mirando más detenidamente, vi que se encontraban en un rostro que era menos prognato que el de cualquier mono normal e infinitamente más peludo. La nariz era bastante distinta. Mientras observábamos la extraña visión que teníamos ante los ojos, los gruesos labios se abrieron y brotaron algunos sonidos, tras lo cual el ser se relajó y murió. El guía se aferró a la manga de la chaqueta, temblando con tanta violencia que la luz se estremeció espasmódicamente, proyectando sombras extrañas y móviles sobre los muros de alrededor. Yo no hice gesto, sino que permanecí envaradamente quieto, los ojos espantados fijos sobre el suelo de delante. Y entonces se disipó el miedo, suplantado por asombro, espanto, comprensión y reverencia, ya que los sonidos lanzados por la figura herida que yacía sobre el suelo calcáreo nos habían susurrado la terrible verdad. La criatura que yo había matado, la extraña bestia de la inexplorada caverna, era o había sido en tiempos, ¡¡¡un HOMBRE!!!"
Index_Vol2 = read_excel("Caso2_Literatura/IndiceLovecraft.xlsx", sheet = "VOL2")
head(Index_Vol2)
# Procesamiento de historias del volumen 1
historias_Vol2 = Index_Vol2
historias_Vol2$Historia = unlist(pmap(list(titulo = as.list(Index_Vol2$Titulo)
                                           ,pagina_inicio = as.list(Index_Vol2$PaginaInicial)
                                           ,pagina_fin = as.list(Index_Vol2$PaginaFinal)
                                           ,lineas_especiales = str_split(Index_Vol2$LineasEspeciales,";"))
                                      ,ProcesaHistoria, data = narrativa_vol2))
print(historias_Vol2$Titulo[5])
[1] "Ibid"
print(historias_Vol2$Historia[5])
[1] "La errónea idea de que Ibid es el autor de las Vidas es algo tan extendido, incluso entre gentes que pretenden disfrutar de cierto grado de cultura, que hace preciso corregirla. Hay que hacer saber a todo el mundo que es Cf. el responsable de ese trabajo. La obra maestra de Ibid, por otra parte, es el famoso Op. Cit., donde todas las claves culturales grecorromanas se encuentran plasmadas con enorme perfección... y una agudeza suprema, habida cuenta la fecha, sorprendentemente tardía, en la que Ibid la escribió. Existe la falsa idea —habitualmente reproducida en libros modernos, previos a la monumental obra de Von Schweinkopf, Gestichte der Ostrogothen in Italien— de que Ibid era un visigodo romanizado, perteneciente a la horda de Ataúlfo que se asentó en Plasencia sobre el 410 d. de C. Nunca se insistirá lo suficiente en lo contrario, ya Von Schweinkopf, y después de él Littlewit[5] y Vêtenoir[6], han demostrado con pruebas irrefutables que esta figura, llamativamente solitaria, era un romano de pura cepa —o al menos de tan pura cepa como esa era degenerada y bastarda podía producir—, y de él podría decirse lo que afirmaba Gibbon de Boecio: “Que era el último de aquellos a los que Catón o Tulio podrían haber reconocido como compatriotas”. Era, como Boecio y casi todos los hombres eminentes de esa era, de la gran familia Anicia, y trazaba su genealogía con gran exactitud y orgullo, hasta todos los héroes de la república. Su nombre completo —largo y pomposo, según la costumbre de una era que había perdido la trinómica simplicidad de la nomenclatura clásica— era, según Von Schweinkopf[7], Cayo Anicio Magno Furio Camilo Emiliano Cornelio Valerio Pompeyo Julio Ibid, aunque Littlewit[8] rechaza Emiliano y añade Claudio Decio Juniano, mientras que Bêtenoir[9] discrepa radicalmente, dando el nombre completo de Magno Furio Camilo Aurelio Antonino Flavio Anicio Petronio Valentiniano Egido Ibid. El eminente crítico y biógrafo nació en el año 486, poco después de que los romanos perdieran la Galia a manos de Clovis. Roma y Ravena rivalizan en lo tocante al honor de su nacimiento, aunque está probado que estudió retórica y filosofía en las escuelas de Atenas... ya que la gravedad del cierre de las mismas, decretado por Teodosio un siglo antes, ha sido exagerado con gran ligereza. En 512, bajo el benigno reinado del ostrogodo Teodorico, lo encontramos como profesor de retórica en Roma, y en el 516 detentó el consulado Pompilio Numancio Bombastes Marcelino Deodanato. A la muerte de Teodorico, en 526, Ibidus se retiró de la vida pública para componer su celebrado trabajo (cuyo puro estilo ciceroniano es tan destacable, en cuanto a atavismo clasicista, como los versos de Claudio Claudiano, que escribió su obra un siglo antes que Ibidus); pero más tarde recibió nuevos honores, siendo nombrado retórico cortesano por Teodato, sobrino de Teodorico. Con la usurpación de Litigio, Ibidus cayó en desgracia y estuvo preso durante algún tiempo; pero la llegada del ejército bizantino de Belisario le devolvió pronto la libertad y los honores. Durante todo el sitio de Roma sirvió con bravura en el campo de los defensores, y luego siguió a las águilas de Belisario por Alba, Porto y Centumcellae. Tras el sitio franco de Milán, Ibidus fue designado para acompañar al erudito obispo Dacio a Grecia, y con él vivió en Corinto, en el año 539. Hacia 541 se trasladó a Constantinopla, donde recibió todos los honores imperiales posibles, tanto por parte de Justiniano como de Justino II. Los emperadores Tiberio y Mauricio también lo honraron en la vejez y contribuyeron en gran medida a su inmortalidad, sobre todo Mauricio, aficionado a trazar su genealogía hasta la vieja Roma, pese a haber nacido en Arabiscus, Capadocia. Fue Mauricio quien, teniendo el poeta 101 años, ordenó que su trabajo fuese libro de texto en las escuelas del Imperio, algo que pasó factura fatal a las emociones del anciano retórico, ya que éste murió pacíficamente en su casa, cerca de la iglesia de Santa Sofía, en el sexto día antes de las calendas de septiembre, en el 587 d. de C., a los 102 años de edad. Sus restos, a pesar del turbulento estado de Italia, fueron enviados a Ravena para su inhumación, pero acabó siendo enterrado en el suburbio de Classe, de donde fue exhumado y escarnecido por el duque lombardo de Espoleto, que envió su cráneo al rey Autharis para que lo usase como copa ceremonial. El cráneo de Ibid fue pasando orgullosamente de rey a rey e la dinastía lombarda. Tras la captur de Pavía por Carlomagno, en 774, el cráneo fue arrebatado al poco sólido Desiderio y llevado entre el botín del conquistador franco. Fue de esa copa, de hecho, de donde el Papa León administró la real unción que convirtió al caudillo bárbaro en emperador romano. Carlomagno se llevó el cráneo de Ibid a su capital de Aix y no tardó en enviárselo a su maestro sajón Alcuino y, tras la muerte de este, fue remitido a su gente, en Inglaterra. Guillermo el Conquistador, cuando se topó con él en un nicho de la abadía, en donde lo había depositado la pía familia de Alcuino (creyendo que era el cráneo de un santo[10] que había derrotado milagrosamente a los lombardos con sus plegarias), rindió reverencia a su ósea antigüedad, e incluso los toscos soldados de Cromwell, al destruir la abadía de Ballylough en Irlanda, en 1650 (adonde había sido transportada secretamente por un católico devoto en 1539, cuando el rey Enrique VIII ordenó la disolución de los monasterios ingleses), no osaron dañar una reliquia tan venerable. Pasó a manos del soldado Read’em-and-Weep Hopkins, que no tardó mucho en vendérselo a Rest-in-Jehovah Stubbs a cambio de una pieza de tabaco de Virginia. Stubbs, al enviar a su hijo Zerubabbel a buscar foruna a Nueva Inglaterra en 1661 (ya que consideraba nociva la atmósfera de la Restauración para un joven pío), le dio el cráneo de San Ibid —o mejor dicho, del Hermano Ibid, puesto que sentía horror ante todo cuanto sonase a papista— a modo de talismán. Tras desembarcar en Salem, Zerubabbel lo colocó en la repisa adjunta a la chimenea, ya que se construyó una casa modesta junto al pozo de la ciudad; y habiéndose convertido en jugador empedernido, perdió la calavera a manos de un tal Epenetus Dexter, un forastero de Providence. El cráneo se hallaba en la casa de Dexter, en la parte norte de la ciudad, cerca de la actual intersección entre las calles North Main y Olney, durante la razzia de Canochet del 30 de marzo de 1676, en tiempos de la guerra del rey Felipe; y el astuto sakem, reconociéndolo al punto como algo singularmente venerable y digno, lo envió como símbolo de alianza a una facción de los pequots de Connecticut, con los que estaba en negociaciones. El 4 de abril fue capturado por los colonos y ejecutado sin dilación; sin embrago, la austera cabeza de Ibid prosiguió sus vagabundeos. Los pequots, debilitados por una guerra anterior, no pudieron enviar a los ahora amenazados narragansetts ayuda, y en 1680 un comerciante de pieles holandés de Albano, Petrus van Schaack, compró el distinguido cráneo por la modesta suma de dos guilders, ya que había reconocido su valor gracias a la inscripción, medio borrado, tallada en minúsculas lombardas (hay que destacar aquí que la paleografía era una de las disciplinas más extendidas entre los tratantes de pieles de Nueva Holanda en el siglo XVII). Hay que decir que a Van Schaack le robó la reliquia, en 1683, un comerciante francés, Jean Grenier, cuyo celo católico le permitió reconocer las formas de alguien al que, gracias a las enseñanzas de su madre, había aprendido a reverenciar con el nombre de San Ibide. Grenier, encendido de virtuosa rabia al descubrir que ese símbolo sagrado estaba en manos de un protestante, hundió una noche la cabeza de Van Schaack con un hacha y huyó al Norte con su botín; pero pronto fue, no obstante, robado y muerto por el vagabundo mestizo Michel Savard, que se apoderó del cráneo —a pesar de que su analfabetismo lo preservó de reconocerlo— para añadirlo a una colección de piezas semejantes, aunque mucho más recientes. A su muerte en 1701, su hijo mestizo Pierre la envió junto con otros objetos a los emisarios de los sacs y foxes, y fue descubierta en el tipi del jefe, una generación más tarde, por Charles de Langlade, fundador del puesto comercial de Green Bay, Wisconsin. De Langlade trató a ese objeto sagrado con la adecuada veneración y lo engalanó con multitud de cuentas de cristal; pero después de eso acabó en otras manos, habiendo sido vendido, en los asentamientos en la cabecera del lago Winnebago, atribus situadas en el lago Mendota y, por último, a principios del siglo XIX, a un tal Solomon Juneau, un francés, en el nuevo puesto comercial de Milwaukee, en el río Menominee y en las orillas del lago Michigan. Vendido más tarde a Jacques Caboche, otro colono, éste la perdió en 1850 en una partida de ajedrez o póquer con un inmigrante llamado Hans Zimmerman, que lo usó como jarra de cerveza, hasta que un día, bajo el influjo de los contenidos, cayó rodando desde el porche al camino herboso situado junto a su casa, y allí cayó en la madriguera de un perro de la pradera, donde su dueño, al despertar, no pudo ni encontrarla ni recobrarla. Así que, durante generaciones, el santificado cráneo de Cayo Anicio Magno Furio Camilo Emiliano Cornelio Valerio Pompeyo Julio Ibidus, cónsul de Roma, favorito de emperadores y santo de la iglesia romana, yació oculto bajo el suelo de una ciudad en crecimiento. Al principio fue adorado, mediante ritos oscuros, por los perros de la pradera, que vieron en él una deidad enviada desde el mundo superior, pero luego cayó en el más profundo olvido, al tiempo que los simples y desangelados habitantes de las madrigueras sucumbían ante las embestidas de los conquistadores arios. Se abrieron alcantarillas, pero no llegaron hasta él. Se levantaron casas — 2.303 o más—, y al cabo, una noche espantosa, tuvo lugar un suceso titánico. La mística naturaleza, convulsa por un éxtasis espiritual, como la espuma de esas primitivas bebidas de la región, abatió lo elevado, elevó lo abatido y... ¡alejop! Cuando llegó el alba rosada, los burgueses de Milwaukee se levantaron para encontrar ¡una primitiva pradera convertida en tierras altas! Inmensa, hasta más allá de la vista, había resultado la zona tocada por el gran alzamiento. Los arcanos subterráneos, ocultos durante años, habían salido por fin a la luz. Y allí, intacto en mitad del quebrado camino, ¡descansaba blanqueada y tranquilamente con santificada y consular pompa el redondeado cráneo de Ibid!"
  1. Creamos un dataframe y guardamos el objeto:
NecronomiconDF = rbind.data.frame(historias_Vol1, historias_Vol2)
saveRDS(NecronomiconDF, file = "Caso2_Literatura/NecronomiconDF.RDS")

4. Bibliografía

Kwartler, T. (2017), Text mining in practice with R.

Lovecraft, H. P. (2007a), «Narrativa completa», Valdemar Gótica, vol. 1.

--- (2007b), «Narrativa completa», Valdemar Gótica, vol. 2.

Silge, J. & Robinson, D. (2017), Text Mining with R, a tidy approach.

Wickham, H. (2014), «Tidy data», Journal of Statistical Software, vol. 59, No. 10.

LS0tDQp0aXRsZTogQW7DoWxpc2lzIGRlIGNvbXBvcnRhbWllbnRvIGVuIHJlZGVzIHNvY2lhbGVzIHVzYW5kbyBQcm9jZXNhbWllbnRvIGRlbCBMZW5ndWFqZQ0KICBOYXR1cmFsDQphdXRob3I6ICJIdWdvIFBvcnJhcyINCnN1YnRpdGxlOiAnQ2Fww610dWxvIDM6IE9idGVuY2nDs24geSBwcm9jZXNhbWllbnRvIGRlIGRhdG9zIGRlIHRleHRvJw0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjc3M6IEVzdGlsb3MuY3NzDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KYmlibGlvZ3JhcGh5OiBCaWJsaW9ncmFmaWEuYmliDQpjc2w6IGNlcGFsLnhtbA0Kbm9jaXRlOiB8DQogIEBLd2FydGxlcjIwMTcsIEBTaWxnZTIwMTcsIEBMb3ZlY3JhZnQyMDA3LCBATG92ZWNyYWZ0MjAwN2ENCi0tLQ0KDQojICoqKlBBUlRFIDEqKioNCg0KIyAqKjEuIFByaW5jaXBpb3MgYsOhc2ljb3MgZGVsIG1pbmVvIGRlIHRleHRvKioNCg0KIyMgKioxLjEuIMK/UXXDqSBlcyBlbCBtaW5lbyBkZSB0ZXh0bz8qKg0KDQojIyMgKipEZWZpbmljacOzbiBkZWwgbWluZW8gZGUgdGV4dG8qKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDJfVGV4dE1pbmluZy5qcGciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpTZWfDum4gQEt3YXJ0bGVyMjAxNzoNCg0KIkVsIG1pbmVvIGRlIHRleHRvICh0ZXh0IG1pbmluZykgZXMgZWwgcHJvY2VzbyBkZSBkZXN0aWxhciBhY2Npb25hYmxlcyDDunRpbGVzIGRlc2RlIHRleHRvLiIgKHRyYWR1Y2lkbyBkZWwgaW5nbMOpcykNCg0KIyMjICoqVmVudGFqYXMgZGVsIG1pbmVvIGRlIHRleHRvKioNCg0KUmVhbGl6YWRvIHNvYnJlIFIgKG8gY3VhbHF1aWVyIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gc2ltaWxhciksIGVzdGUgbWluZW8gZGUgdGV4dG8gdGllbmUgdmFyaWFzIHZlbnRhamFzLCBpbmNsdXllbmRvICh5IG5vIGxpbWl0YWRvKSBhIGxhcyBzaWd1aWVudGVzOg0KDQorIFNlIGNyZWEgY29uZmlhbnphIGVuIGxvcyBpbnZvbHVjcmFkb3MgZW4gY2FkYSBwcm95ZWN0byAoc3Rha2Vob2xkZXJzKSB5YSBxdWUgZ2VuZXJhbG1lbnRlIG5vIHNlIHJlcXVpZXJlIG11ZXN0cmVvIHBhcmEgZXh0cmFlciBpbmZvcm1hY2nDs24uDQorIFNlIHB1ZWRhbiBhcGxpY2FyIHZhcmlhcyBtZXRvZG9sb2fDrWFzIGRlIG1hbmVyYSByw6FwaWRhLg0KKyBMb3MgcHJvY2VkaW1pZW50b3MgcmVhbGl6YWRvcyBzb24gZGUgbmF0dXJhbGV6YSBhdWRpdGFibGUgeSByZXByb2R1Y2libGUuDQorIEVsIG1pbmVvIGRlIHRleHRvIG9idGllbmUgZGF0b3Mgbm92ZWRvc29zIGRlbCB0ZXh0by4NCg0KIyMjICoqUmVjb21lbmRhY2lvbmVzIHNvYnJlIGVsIHVzbyBkZWwgbWluZW8gZGVsIHRleHRvKioNCg0KQWxndW5vcyBlamVtcGxvcyB5IHJlY29tZW5kYWNpb25lcyBlc3BlY8OtZmljYXMgc29icmUgZWwgdXNvIGRlbCBtaW5lbyBkZSB0ZXh0byBpbmNsdXllbjoNCg0KKyAqKlRleHRvcyBkZSBlbmN1ZXN0YSwgZ3J1cG9zIGZvY2FsZXMqKjogU2UgcHVlZGVuIGV4cGxvcmFyIGxvcyB0w7NwaWNvcyBkZSBsYXMgcmVzcHVlc3RhcyBhIHRyYXbDqXMgZGUgdmFyaW9zIG3DqXRvZG9zIGNvbiBlbCBmaW4gZGUgb2J0ZW5lciBsYSBwZXJzcGVjdGl2YSBkZSBxdWllbmVzIGhhbiByZXNwb25kaWRvLg0KKyAqKlRleHRvIG11eSBjb3J0byoqOiBSZWFsaXphciBhbsOhbGlzaXMgZGUgdGV4dG8gc29icmUgdGV4dG9zIG11eSBjb3J0b3MgcHVlZGUgc2VzZ2FyIGxhcyBjb25jbHVzaW9uZXMgb2J0ZW5pZGFzLg0KKyAqKkRvY3VtZW50b3MgbGVnYWxlcyB5IGRlIHJlY3Vyc29zIGh1bWFub3MqKjogQSBwZXNhciBkZSBxdWUgZWwgYW7DoWxpc2lzIGRlIHRleHRvIGVzIMO6dGlsLCBleGlzdGVuIHJlc3RyaWNjaW9uZXMgw6l0aWNhcyB5IGxlZ2FsZXMgcXVlIGRlYmVuIHNlciByZXNwZXRhZGFzLg0KKyAqKkRhdG9zIGRlIHJlZGVzIHNvY2lhbGVzKio6IEVuIHJlZGVzIHNvY2lhbGVzIHNlIHB1ZWRlbiBvYnRlbmVyIHkgcHJvY2VzYXIgZGF0b3MgKHNpZW1wcmUgeSBjdWFuZG8gZXN0w6kgcGVybWl0aWRvKSBwYXJhIHNhY2FyIGNvbmNsdXNpb25lcyDDunRpbGVzIGRlIGNvbnRleHRvcyBvIG5vdGljaWFzIHJlbGV2YW50ZXMuDQorICoqQ29tZW50YXJpb3MgeSByZXZpZXdzIGRlIHByb2R1Y3RvcyoqOiBBbsOhbGlzaXMgZGUgdGV4dG8gc29icmUgY29tZW50YXJpb3MgZGUgcHJvZHVjdG9zIHB1ZWRlbiBheXVkYXJub3MgYSBvYnRlbmVyIGxhIHBlcnNwZWN0aXZhIHF1ZSBkaXN0aW50b3Mgc2VnbWVudG9zIGRlIGNsaWVudGVzIHRpZW5lbiBzb2JyZSDDqWwuDQorICoqTW9kZWxhbWllbnRvIHByZWRpY3Rpdm8qKjogQSB2ZWNlcyBsb3MgZGF0b3MgZGUgdGV4dG8gcHVlZGVuIHBlcm1pdGlybm9zIGNvbnN0cnVpciB2YXJpYWJsZXMgZXN0cnVjdHVyYWRhcyBxdWUgcHVlZGFuIHNlciB1c2FkYXMgY29tbyBkYXRvcyBkZSBlbnRyYWRhIGVuIG1vZGVsb3MgcHJlZGljdGl2b3MuDQoNCiMjIyAqKkZsdWpvIGRlIHRyYWJham8gc29icmUgZGF0b3MgZGUgdGV4dG8qKg0KDQpMb3MgZGF0b3MgZGUgdGV4dG8gc29uIGRlIG5hdHVyYWxlemEgbm8gZXN0cnVjdHVyYWRhLiBFc3RvcyBkZWJlbiBzZXIgcHJpbWVybyBwcmUtcHJvY2VzYWRvcyBkZSB1bmEgbWFuZXJhIGVzdHJ1Y3R1cmFkYSwgc2UgZGViZW4gZGVmaW5pciBzdXMgY2FyYWN0ZXLDrXN0aWNhcyB5IGx1ZWdvIHNlciBleHRyYcOtZGFzIGVuIGZvcm1hIGRlIHVuIGRvY3VtZW50byBvcmdhbml6YWRvIGNvbm9jaWRvIGNvbW8gY29ycHVzLiBBbCBmaW5hbCBzZSBhbmFsaXphbiBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBleHRyYcOtZGFzLg0KDQpBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBlc3RlIGZsdWpvIGRlIHRyYWJham86DQoNCjxicj48L2JyPg0KPGNlbnRlcj48aW1nIHNyYz0iZmlncy8wMl9Xb3JrZmxvdy5wbmciIHdpZHRoPSI2MCUiIGJvcmRlcj0iMTAiLz48cCBjbGFzcz0iY2FwdGlvbiI+Rmx1am8gZGUgdHJhYmFqbyBlbiBtaW5lbyBkZSB0ZXh0bywgS3dhcnRsZXIgKDIwMTcpLjwvcD48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpBIGJyZXZlcyByYXNnb3MsIHBvZGVtb3Mgc2VndWlyIGVzdG9zIHBhc29zOg0KDQoxLiAqKkRlZmluaXIgZWwgcHJvYmxlbWEgeSBsb3Mgb2JqZXRpdm9zIGVzcGVjw61maWNvcyoqOiBUYWwgY29tbyBlbiBvdHJhcyB0YXJlYXMgZGUgYW5hbMOtdGljYSBhdmFuemFkYSwgbm8gZXMgcHJ1ZGVudGUgY29tZW56YXIgYnVzY2FuZG8gcmVzcHVlc3Rhcy4gRXMgcHJlY2lzbyBlbnRvbmNlcyBkZWZpbmlyIHByaW1lcm8gZWwgcHJvYmxlbWEgYSByZXNvbHZlci4NCjIuICoqSWRlbnRpZmljYXIgbG9zIGRhdG9zIGRlIHRleHRvIHF1ZSBkZWJlbiBzZXIgcmVjb2xlY3RhZG9zKio6IEFjb3JkZSBhbCBwcm9ibGVtYSBkZWZpbmlkbywgbG9zIGRhdG9zIHBvZHLDrWFuIHZlbmlyIGRlIHVuYSBmdWVudGUgdSBvdHJhLiBEZSBkZW50cm8gZGUgbGEgZW1wcmVzYSBvIGRlIGRhdG9zIGd1YmVybmFtZW50YWxlcyBwb3IgZWplbXBsby4gRXN0b3MgZGF0b3MgcHVlZGVuIHNlciByZWNvbGVjdGFkb3MgYSB0cmF2w6lzIGRlIHdlYiBzY3JhcGluZywgQVBJcyAocmVkZXMgc29jaWFsZXMpLCByZWNvbm9jaW1pZW50byDDs3B0aWNvIGRlIGNhcmFjdGVyZXMgKE9DUikgbyBhbsOhbGlzaXMgZGUgZG9jdW1lbnRvcy4NCjMuICoqT3JnYW5pemFyIGVsIHRleHRvKio6IEN1YW5kbyBsb3MgZGF0b3MgaGFuIHNpZG8gcmVjb2xlY3RhZG9zLCBkZWJlbW9zIG9yZ2FuaXphcmxvcyBlbiB1biBjb3JwdXMsIGVzIGRlY2lyLCBlbiBkYXRvcyBlc3RydWN0dXJhZG9zLiBQb3N0ZXJpb3JtZW50ZSBkZWNpZGlyZW1vcyBzaSB1dGlsaXphbW9zIHTDqWNuaWNhcyBwYXJhIGFuw6FsaXNpcyBkZSAqYm9sc2EgZGUgcGFsYWJyYXMqIG8gKmFuw6FsaXNpcyBzaW50w6FjdGljbyouDQo0LiAqKkV4dHJhZXIgY2FyYWN0ZXLDrXN0aWNhcyoqOiBDb24gZWwgdGV4dG8geWEgb3JnYW5pemFkbyByZWFsaXphbW9zIHByZS1wcm9jZXNhbWllbnRvIHNvYnJlIGVsIHRleHRvLCBhY29yZGUgYSBsYSBtZXRvZG9sb2fDrWEgcXVlIHBlbnNlbW9zIHNlZ3VpciBkZXNwdcOpcywgY29uIGVsIGZpbiBkZSBvYnRlbmVyIGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIGRhdG9zIGRlIHRleHRvLg0KNS4gKipBbsOhbGlzaXMqKjogRW4gZXN0ZSBwdW50byB1dGlsaXphcmVtb3MgbGEgdMOpY25pY2EgYW5hbMOtdGljYSBxdWUgaGF5YW1vcyBwZW5zYWRvIGVuIHVuIGluaWNpbyBzb2JyZSBsb3MgZGF0b3MgcHJlLXByb2Nlc2Fkb3MuDQo2LiAqKkVsYWJvcmFyIGxhcyBjb25jbHVzaW9uZXMgeS9vIHJlY29tZW5kYWNpb25lcyoqOiBFbCByZXN1bHRhZG8gZmluYWwgZGVsIGFuw6FsaXNpcyBkZWJlcsOhIHNlciBjb252ZXJ0aWRvIGVuIHVuIGFjY2lvbmFibGUgbyBlbiB1bmEgY29uY2x1c2nDs24sIGFjb3JkZSBhIGxvcyBvYmpldGl2b3MgZGVmaW5pZG9zIGluaWNpYWxtZW50ZS4NCg0KIyMgKioxLjIuIFRpcG9zIGRlIG1pbmVvIGRlIHRleHRvKioNCg0KIyMjICoqQm9sc2EgZGUgcGFsYWJyYXMgKGJhZyBvZiB3b3JkcykqKg0KDQpFbCBtaW5lbyBkZSB0ZXh0byBiYXNhZG8gZW4gYm9sc2EgZGUgcGFsYWJyYXMgZXMgbcOhcyBmw6FjaWwgZGUgZW50ZW5kZXIgeSBhbmFsaXphciwgaW5jbHVzbyBwYXJhIGVsIHVzbyBkZSB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28uDQoNCkVzdGUgdHJhdGEgY2FkYSBwYWxhYnJhIChvIGdydXBvIGRlIHBhbGFicmFzLCBpLmUuIG4tZ3JhbWFzKSBjb21vIHVuYSBjYXJhY3RlcsOtc3RpY2Egw7puaWNhIGRlIHVuIGRvY3VtZW50by4gRW4gZXN0ZSB0aXBvIGRlIGFuw6FsaXNpcyBlbCBvcmRlbiBkZSBsYXMgcGFsYWJyYXMgeSBzdXMgY2FyYWN0ZXLDrXN0aWNhcyBncmFtw6F0aWNhcyB5IHNpbnTDoWN0aWNhcyBubyBzb24gdXRpbGl6YWRhcy4NCg0KVW5vIGRlIHN1cyBwcmluY2lwYWxlcyBiZW5lZmljaW9zIHlhY2UgZW4gcXVlIHN1cyB0w6ljbmljYXMgbm8gc29uIGNvbXB1dGFjaW9uYWxtZW50ZSBjb3N0b3NhcywgeSBwb3IgZW5kZSBlbCBhbsOhbGlzaXMgcHVlZGUgc2VyIHJlYWxpemFkbyBkZSBtYW5lcmEgcsOhcGlkYS4gRGViaWRvIGEgcXVlIHN1cyByZXN1bHRhZG9zIHNvbiBkZXZ1ZWx0b3MgZW4gZm9ybWEgZGUgZGF0b3MgZXN0cnVjdHVyYWRvcywgZXN0b3MgcHVlZGVuIHNlciB1dGlsaXphZG9zIGVuIG1vZGVsb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28uIFVuYSBkZSBsYXMgZm9ybWFzIG3DoXMgdXN1YWxlcyBkZSBkZXZvbHZlciBlc3RvcyByZXN1bHRhZG9zIHNvbiBsYXMgKioqRFRNIChkb2N1bWVudC10ZXJtIG1hdHJpeCBvIG1hdHJpeiBkb2N1bWVudG8tdMOpcm1pbm8pKioqLg0KDQpFbiBlc3RhcyBtYXRyaWNlcywgY2FkYSBmaWxhIHJlcHJlc2VudGEgdW4gZG9jdW1lbnRvIG8gY29ycHVzLCBjYWRhIGNvbHVtbmEgdW5hIHBhbGFicmEgbyBuLWdyYW1hLCB5IGNhZGEgdW5hIGRlIGxhcyBlbnRyYWRhcyBkZSBsYSBtYXRyaXogc2UgcHVlZGUgbGxlbmFyIGNvbiBkaXN0aW50YXMgbWVkaWRhcy4gUG9yIGFob3JhIGxvIGhhcmVtb3MgY29uIGxhIGZyZWN1ZW5jaWEgZGUgY2FkYSBwYWxhYnJhLiBTdSB0cmFzcHVlc3RhIGVzIGxhIG1hdHJpeiB0w6lybWluby1kb2N1bWVudG8uDQoNCkVqZW1wbG8gZGUgRFRNOg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0bSkNCmxpYnJhcnkodG9waWNtb2RlbHMpDQpkYXRhKCJBc3NvY2lhdGVkUHJlc3MiLCBwYWNrYWdlID0gInRvcGljbW9kZWxzIikNCmFzLm1hdHJpeChBc3NvY2lhdGVkUHJlc3NbMTc1LDE6NV0pDQpgYGANCg0KRGUgbGEgbWlzbWEgbWFuZXJhLCBsb3MgZGF0b3MgcHVlZGVuIHNlciBhbmFsaXphZG9zIGVuIGZvcm1hdG8gKioqdGlkeSoqKi4gRXN0ZSBmb3JtYXRvLCBhY29yZGUgYSBAV2lja2hhbTIwMTQsIGVzIHVuYSBtYW5lcmEgZsOhY2lsIHkgZWZlY3RpdmEgZGUgbWFuZWphciBkYXRvcy4gTG9zIGRhdG9zIHRpZHkgcHJlc2VudGFuIGxhcyBzaWd1aWVudGVzIGNhcmFjdGVyw61zdGljYXM6DQoNCisgQ2FkYSB2YXJpYWJsZSBlcyB1bmEgY29sdW1uYS4NCisgQ2FkYSBvYnNlcnZhY2nDs24gZXMgdW5hIGZpbGEuDQorIENhZGEgdGlwbyBkZSB1bmlkYWQgZGUgb2JzZXJ2YWNpw7NuIGVzIHVuYSB0YWJsYS4NCg0KQXPDrSwgc2UgZGVmaW5lIHRleHRvIGVuIGZvcm1hdG8gdGlkeSBjb21vIHVuYSB0YWJsYSBxdWUgdGllbmUgdW4gKioqdG9rZW4qKiogcG9yIGZpbGEuIFVuIHRva2VuIGVzIHVuYSB1bmlkYWQgZGUgdGV4dG8sIHF1ZSBwdWVkZSBzZXIgdW5hIHBhbGFicmEgbyB1biBuLWdyYW1hLiBMYSB2ZW50YWphIGRlIHRyYWJhamFyIGNvbiB0ZXh0byBlbiBmb3JtYXRvIHRpZHkgeWFjZSBlbiBlbCBoZWNobyBkZSBxdWUgcG9kZW1vcyB1dGlsaXphciBoZXJyYW1pZW50YXMgZGVsIHVuaXZlcnNvIHRpZHkgcGFyYSBhbmFsaXphcmxvcywgaW5jbHV5ZW5kbyBsYXMgbGlicmVyw61hcyAqZ2dwbG90MiosICpkcGx5ciosICp0aWR5ciosICpicm9vbSosIGV0Yy4NCg0KRWplbXBsbyBkZSB0ZXh0byB0aWR5Og0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXRleHQpDQphcF90ZCA9IHRpZHkoQXNzb2NpYXRlZFByZXNzKQ0KaGVhZChhcF90ZCAlPiUgZmlsdGVyKGRvY3VtZW50PT0xNzUpKQ0KYGBgDQoNCg0KIyMjICoqQW7DoWxpc2lzIHNpbnTDoWN0aWNvIChzeW50YWN0aWNhbCBwYXJzaW5nKSoqDQoNCkVsIGFuw6FsaXNpcyBzaW50w6FjdGljbyBkaWZpZXJlIGRlIHVuYSBib2xzYSBkZSBwYWxhYnJhcyB0YW50byBlbiBjb21wbGVqaWRhZCBjb21vIGVuIGVuZm9xdWUuIEVzdGUgc2UgYmFzYSBlbiBsYSBzaW50YXhpcyBkZSBsYXMgcGFsYWJyYXMgeSB1dGlsaXphIGVsIGV0aXF1ZXRhZG8gUE9TIChwYXJ0IG9mIHNwZWVjaCkgcGFyYSBpZGVudGlmaWNhciBsYXMgcGFsYWJyYXMgZW4gdW4gY29udGV4dG8gYWRlY3VhZG8uIENhZGEgdW5hIGRlIGxhcyBldGlxdWV0YXMgZXMgYW5hbGl6YWRhIHBhcmEgb2J0ZW5lciBjb25jbHVzaW9uZXMgeSByZXN1bHRhZG9zLg0KDQpFbiBiYXNlIGEgZXN0YXMgZGVzY3JpcGNpb25lcyBwcmVsaW1pbmFyZXMsIGVsIGVuZm9xdWUgZGUgZXN0ZSBjdXJzbyB0b21hcsOhIGVsIGNhbWlubyBkZWwgYW7DoWxpc2lzIGRlIGJvbHNhIGRlIHBhbGFicmFzLg0KDQojICoqMi4gRGVmaW5pY2nDs24gZGUgb2JqZXRpdm9zKioNCg0KUGFyYSBvYmpldGl2b3MgcHLDoWN0aWNvcyBkZSBlc3RlIGN1cnNvIGFuYWxpemFyZW1vcyBkb3MgY29uanVudG9zIGRlIGRhdG9zIGRlc2RlIGVsIGluaWNpbywgeSByZWFsaXphcmVtb3MgY2FkYSB1bm8gZGUgbG9zIHBhc29zIHN1Z2VyaWRvcyBlbiBsYSBwcmltZXJhIHNlY2NjacOzbiBkZSBlc3RlIGNhcMOtdHVsby4NCg0KQXPDrSwgZGVmaW5pcmVtb3MgcHJpbWVybyBsb3Mgb2JqZXRpdm9zIGRlbCBhbsOhbGlzaXMuDQoNCiMjICoqMi4xLiBBbsOhbGlzaXMgZGUgbm90aWNpYXM6IEVsIGNvbnRleHRvIGFjdHVhbCBkZSBsYXMgZWxlY2Npb25lcyAyMDIxIGVuIEVjdWFkb3IqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDJfQ2Fzb05vdGljaWFzMi5qcGciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KDQpFbiBlc3RlIGNhc28sIG9idGVuZHJlbW9zIGNvbmNsdXNpb25lcyBhY2VyY2EgZGVsIGFsZ3Vub3MgY2FuZGlkYXRvcyBhIGxhcyBlbGVjY2lvbmVzIHByZXNpZGVuY2lhbGVzIGRlIEVjdWFkb3IgZW4gZmVicmVybyBkZSAyMDIxLiBQYXJhIGVsbG8sIG9idGVuZHJlbW9zIGxvcyBkYXRvcyBkZSBsYXMgbm90aWNpYXMgZG9uZGUgSnVhbiBGZXJuYW5kbyBWZWxhc2NvLCBHdXN0YXZvIExhcnJlYSwgQ8Opc2FyIE1vbnTDumZhciBvIFBlZHJvIEpvc8OpIEZyZWlsZSBzZWFuIG1lbmNpb25hZG9zLCBkZSB0cmVzIGRpYXJpb3MgZGVsIHBhw61zLg0KDQojIyAqKjIuMi4gRWwgaG9ycm9yIGPDs3NtaWNvOiBBIHRyYXbDqXMgZGUgbGFzIHB1ZXJ0YXMgZGVsIHByb2Nlc2FtaWVudG8gZGVsIGxlbmd1YWplIG5hdHVyYWwqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iODAlIiBzcmM9ImZpZ3MvMDJfQ2Fzb0xpdGVyYXR1cmEuanBnIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KRW4gZXN0ZSBjYXNvLCBvYnRlbmRyZW1vcyBjb25jbHVzaW9uZXMgYWNlcmNhIGRlbCBlc3RpbG8gZGUgZXNjcml0dXJhIGRlIHVubyBkZSBsb3MgbWVqb3JlcyBlc2NyaXRvcmVzIGRlIHRlcnJvciBkZWwgc2lnbG8gWFg6IEhvd2FyZCBQaGlsbGlwcyBMb3ZlY3JhZnQuIFBhcmEgZWxsbywgb2J0ZW5kcmVtb3MgbG9zIGRhdG9zIGRlIGxhIG1heW9yIHBhcnRlIGRlIHN1cyBlc2NyaXRvcyBlbiBzb2xpdGFyaW8gZGUgZG9zIGRvY3VtZW50b3MgZWxlY3Ryw7NuaWNvcyB0aXR1bGFkb3MgJ05hcnJhdGl2YSBDb21wbGV0YScgdm9sw7ptZW5lcyAxIHkgMi4NCg0KIyAqKjMuIE9idGVuY2nDs24gZGUgZGF0b3MgZGUgdGV4dG8qKg0KDQojIyAqKjMuMS4gT2J0ZW5jacOzbiBkZSBkYXRvcyBkZSBHb29nbGUgTmV3cyoqDQoNCk9idGVuZHJlbW9zIGxvcyBkYXRvcyBkZSBub3RpY2lhcyBhIHRyYXbDqXMgZGUgd2ViIHNjcmFwcGluZy4gRXN0byBsbyByZWFsaXphcmVtb3MgZGUgbGEgc2lndWllbnRlIG1hbmVyYToNCg0KMS4gQ2FyZ2Ftb3MgbGFzIGxpYnJlcsOtYXMgbmVjZXNhcmlhcyBwYXJhIGVsIGVqZXJjaWNpbzoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpICMgTWFuaXB1bGFjacOzbiBkZSBkYXRvcyB0aWR5DQpsaWJyYXJ5KHJ2ZXN0KSAjIFdlYiBzY3JhcHBpbmcNCmxpYnJhcnkoc3RyaW5ncikgIyBNYW5pcHVsYWNpw7NuIGRlIGNhZGVuYXMgZGUgdGV4dG8NCmxpYnJhcnkocHVycnIpICMgSXRlcmFjacOzbiBlZmljaWVudGUgDQpgYGANCjIuIENyZWFtb3MgZG9zIGZ1bmNpb25lcy4gVW5hIHBhcmEgbGEgb2J0ZW5jacOzbiBkZSBsb3MgdGl0dWxhcmVzIGF0YWRvcyBhIHVuYSBiw7pzcXVlZGEgZW4gZ29vZ2xlIG5ld3MgeSBvdHJhIHBhcmEgb2J0ZW5lciBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBjYWRhIG5vdGljaWEgKHRpdHVsYXIsIGRpYXJpbywgZmVjaGEgZGUgcHVibGljYWNpw7NuLCBoaXBlcnbDrW5jdWxvKS4gUGFyYSBlbGxvIHByaW1lcm8gZXhwbGljYXJlbW9zIHVuIGVqZW1wbG8uIA0KDQpFbiBsYSBzaWd1aWVudGUgaW1hZ2VuIHBvZGVtb3MgdmVyIHF1ZSBjdWFuZG8gcmVhbGl6YW1vcyB1bmEgYsO6c3F1ZWRhIGVuIGdvb2dsZSBuZXdzLCBsYSB1cmwgZGUgYsO6c3F1ZWRhIChtYXJjYWRhIGVuIHJvam8pIGVzdMOhIGNvbmZvcm1hZGEgcG9yIHRyZXMgcGFydGVzICgqKmh0dHBzOi8vbmV3cy5nb29nbGUuY29tLyoqICwgKipzZWFyY2g/cT0qKiB5IGVsIHTDqXJtaW5vIGRlICoqYsO6c3F1ZWRhKiogY29uICoqIiUyMCIqKiBlbiBsdWdhciBkZSBlc3BhY2lvcykgbcOhcyB1bmEgcGFydGUgZGUgcGFyw6FtZXRyb3MgYWRpY2lvbmFsZXMgKG1hcmNhZGEgZW4gYXp1bCkuDQoNCjxicj48L2JyPg0KPGNlbnRlcj48YT48aW1nIHdpZHRoPSI5NSUiIHNyYz0iZmlncy8wMl9TY3JhcHBpbmcxLnBuZyI+PC9hPjwvY2VudGVyPg0KPGJyPjwvYnI+DQoNClBhcmEgY29tZW56YXIgZWwgc2NyYXBwaW5nIGRlYmVtb3MgZW50b25jZXM6DQoNCiAgKyBEZWZpbmltb3MgdW4gb2JqZXRvIHF1ZSBjb250ZW5nYSBjb21vIGNhZGVuYSBkZSB0ZXh0byBsYSBww6FnaW5hIHByaW5jaXBhbCBkZSBnb29nbGUgbmV3czoNCiAgDQpgYGB7cn0NCm5ld3NfcGFnID0gImh0dHBzOi8vbmV3cy5nb29nbGUuY29tLyINCm5ld3NfcGFnDQpgYGANCg0KICArIENyZWFtb3MgdW4gcGFyw6FtZXRybyBhZGljaW9uYWwgcXVlIHNlIHZhIGEgZW5jYXJnYXIgZGUgbGEgYsO6c3F1ZWRhOg0KICANCmBgYHtyfQ0KcGFyYW1ldHJvX2J1c3F1ZWRhID0gInNlYXJjaD9xPSINCnBhcmFtZXRyb19idXNxdWVkYQ0KYGBgDQoNCiAgKyBQYXJhbWV0cml6YW1vcyB1biBvYmpldG8gcXVlIGNvbnRlbmdhIGVsIHRleHRvIHF1ZSB2YW1vcyBhIGJ1c2Nhciwgc3VzdGl0eWVuZG8gbG9zIGVzcGFjaW9zIHBvciAqKiUyMCoqLiBFbiBudWVzdHJvIGVqZW1wbG8gdXNhcmVtb3MgbGEgY2FkZW5hICJKdWFuIEZlcm5hbmRvIFZlbGFzY28iOg0KICANCmBgYHtyfQ0KYnVzcXVlZGEgPSAiSnVhbiBGZXJuYW5kbyBWZWxhc2NvIg0KYnVzcXVlZGFfbm9fZXNwYWNpb3MgPSBnc3ViKCIgIiwiJTIwIiwgYnVzcXVlZGEpDQpidXNxdWVkYV9ub19lc3BhY2lvcw0KYGBgDQogICsgRGVmaW5pbW9zIHVuIHBhcsOhbWV0cm8gYWRpY2lvbmFsIGRlIGLDunNxdWVkYSBlbiBlc3Bhw7FvbDoNCiANCmBgYHtyfQ0KcGFyYW1ldHJvX2ZpbmFsID0gIiZobD1lcy00MTkmZ2w9VVMmY2VpZD1VUzplcy00MTkiDQpwYXJhbWV0cm9fZmluYWwNCmBgYA0KDQogICsgQ29uIGVzdG9zIGN1YXRybyBvYmpldG9zIGRlZmluaWRvcyBmb3JtYW1vcyBsYSB1cmwgZGUgYsO6c3F1ZWRhOg0KIA0KYGBge3J9DQpodG1sX2RpciA9IHBhc3RlMChuZXdzX3BhZyxwYXJhbWV0cm9fYnVzcXVlZGEsYnVzcXVlZGFfbm9fZXNwYWNpb3MscGFyYW1ldHJvX2ZpbmFsKQ0KaHRtbF9kaXINCmBgYA0KU2kgbmF2ZWdhbW9zIGEgZXN0YSBkaXJlY2Npw7NuIHdlYiBlbiBpbnRlcm5ldCBvYnRlbmRyZW1vcyBlbCByZXN1bHRhZG8gYW50ZXMgbW9zdHJhZG8sIGRlbCBjdWFsIGRlYmVyZW1vcyBleHRyYWVyIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHF1ZSBuZWNlc2l0ZW1vcyBkZSBjYWRhIG5vdGljaWEsIGVzIGRlY2lyLCB0ZXh0b3MgY29tbyBlbCB0aXR1bGFyLCBsYSBmZWNoYSwgZWwgc2l0aW8gd2ViIGRvbmRlIGxhIG5vdGljaWEgZnVlIHB1YmxpY2FkYSwgeSBlbCBtw6FzIGltcG9ydGFudGUsIGVsIGxpbmsgZGUgbGEgbm90aWNpYS4gUGFyYSBsbGV2YXIgYSBjYWJvIGVzdGEgdGFyZWEgcmVhbGl6YXJlbW9zIGVsIHNpZ3VpZW50ZSBwcm9jZWRpbWllbnRvLg0KDQogICsgTGVlbW9zIGxhIHVybCBjcmVhZGEgYW50ZXM6DQoNCmBgYHtyfQ0KZ29vZ2xlX25ld3MgPSByZWFkX2h0bWwoaHRtbF9kaXIpDQpjbGFzcyhnb29nbGVfbmV3cykNCmBgYA0KDQpDb21vIHNlIHB1ZWRlIG5vdGFyLCBlc3RlIGVzIHVuIG9iamV0byBkZSB0aXBvICp4bWxfZG9jdW1lbnQqIG8gKnhtbF9ub2RlKiBkZWwgY3VhbCBoYXkgcXVlIGV4dHJhZXIgdW4gY8OzZGlnbyBbQ1NTXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9Ib2phX2RlX2VzdGlsb3NfZW5fY2FzY2FkYSkgbyBbWHBhdGhdKGh0dHBzOi8vZXMud2lraXBlZGlhLm9yZy93aWtpL1hQYXRoKSBxdWUgaWRlbnRpZmlxdWUgYSBjYWRhIG5vdGljaWEgeSBub3MgcGVybWl0YSBleHRyYWVyIHN1cyBjYXJhY3RlcsOtc3RpY2FzLiBQYXJhIGxsZXZhciBhIGNhYm8gZXN0YSBhY3RpdmlkYWQgdXNhcmVtb3MgKipTZWxlY3RvckdhZGdldCoqLCBlbCBjdWFsIGVzIHVuYSBleHRlbnNpw7NuIGRlIEdvb2dsZSBDaHJvbWUuDQoNCkxhIGV4dGVuc2nDs24gZGUgc2VsZWN0b3IgZ2FkZ2V0IHB1ZWRlIHNlciBpbnN0YWxhZGEgZGVzZGUgZWwgc2lndWllbnRlIGxpbms6IGh0dHBzOi8vY2hyb21lLmdvb2dsZS5jb20vd2Vic3RvcmUvZGV0YWlsL3NlbGVjdG9yZ2FkZ2V0L21oamhua2NmYmRobmppY2tra2Riam9lbWRtYmZnaW5iP2hsPWVzLg0KDQpQYXJhIHVzYXJsYToNCg0KYS4gUHJpbWVybyBhYnJpcmVtb3MgbGEgcMOhZ2luYSB3ZWIgZGVzZWFkYSB5IGRhcmVtb3MgY2xpYyBlbiBlbCDDrWNvbm8gZGUgU2VsZWN0b3JHYWRnZXQuIENvbiBlc3RhIGFjY2nDs24gc2UgYWN0aXZhcsOhIGxhIGJhcnJhIGRlIFNlbGVjdG9yR2FkZ2V0IGVuIGxhIHBhcnRlIGluZmVyaW9yIGRlIGxhIHBhbnRhbGxhOg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDJfU2VsZWN0b3JHYWRnZXQucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KYi4gTHVlZ28gZGFyZW1vcyBjbGljIGVuIGVsIG9iamV0byBxdWUgcXVlcmVtb3MgZXh0cmFlciB5IGxhIGJhcnJhIGRlIFNlbGVjdG9yR2FkZ2V0IHNlIHBvYmxhcsOhIGNvbiBzdSBzZWxlY3RvciBDU1MuIENvcGlhcmVtb3MgZXN0ZSBzZWxlY3RvciBDU1MgYWwgcG9ydGFwYXBlbGVzLg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDJfU2VsZWN0b3JDU1MucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KVW5hIHZleiBxdWUgaGF5YW1vcyBvYnRlbmlkbyBlc3RhIGluZm9ybWFjacOzbiwgY29udGludWFyZW1vcyBjb24gZWwgc2NyYXBwaW5nOg0KDQogICsgVXNhcmVtb3MgZWwgY8OzZGlnbyBDU1Mgb2J0ZW5pZG8gY29uIGxhIGZ1bmNpw7NuICpodG1sX25vZGVzKiB5IGxhIGZ1bmNpw7NuICpodG1sX2NoaWxkcmVuKiBjb24gbGEgZmluYWxpZGFkIGRlIG9idGVuZXIgbG9zIG9iamV0b3MgZGUgbGFzIG5vdGljaWFzIChnb29nbGUgbmV3cyBtdWVzdHJhIDEwMCBub3RpY2lhcyBtw6F4aW1vIHNvYnJlIGxhcyBjdWFsZXMgcmVhbGl6YXIgbGEgZXh0cmFjY2nDs24pLg0KDQpgYGB7cn0NCm5vdGljaWFzID0gZ29vZ2xlX25ld3MgJT4lIA0KICBodG1sX25vZGVzKGNzcyA9ICIueFA2bXdmIikgJT4lIA0KICBodG1sX2NoaWxkcmVuKCkNCm5vdGljaWFzDQpgYGANCkVsIG9iamV0byBvYnRlbmlkbyBkZSB0aXBvICp4bWxfbm9kZXNldCogY3VlbnRhIGNvbiAxMDAgb2JqZXRvcyBxdWUgY29ycmVzcG9uZGVuIGEgY2FkYSBub3RpY2lhLiBVc2FyZW1vcyBsYSBwcmltZXJhIHBhcmEgZWplbXBsaWZpY2FyIGxhIGV4dHJhY2Npw7NuIGRlIGxvcyBkYXRvcy4NCg0KYGBge3J9DQpub3RpY2lhID0gbm90aWNpYXNbWzJdXQ0Kbm90aWNpYQ0KYGBgDQoNCg0KICArIFByaW1lcm8gb2J0ZW5kcmVtb3MgaW5mb3JtYWNpw7NuIGFjZXJjYSBkZSBsb3Mgbm9kb3MgZGVsIG9iamV0byBwYXJhIHNhYmVyIHF1w6kgcGFydGVzIGRlYmVtb3MgcmVmZXJlbmNpYXIgZW4gbnVlc3RybyBjw7NkaWdvLiBQYXJhIGVzdG8gdXNhcmVtb3MgbGEgZnVuY2nDs24gKmh0bWxfbm9kZXMqIGNvbiBlbCBhcmd1bWVudG8gIlwqIiBpbmRpY8OhbmRvbGUgYXPDrSBxdWUgZXh0cmFpZ2EgdG9kb3MgbG9zIG5vZG9zLCB5IGV4cGxvcmFyZW1vcyBzaSBjYWRhIHVubyBkZSBlc3RvcyBub2RvcyB0aWVuZSB0ZXh0byAoKnRleHQqKSwgZmVjaGFzICgqZGF0ZXRpbWUqKSBvIGhpcGVydsOtbmN1bG9zICgqaHJlZiopIGEgdHJhdsOpcyBkZSBsYSBmdW5jacOzbiAqaHRtbF9hdHRyKiB5ICpodG1sX3RleHQqOg0KICANCioqVGV4dG86KioNCg0KYGBge3J9DQpub3RpY2lhICU+JSBodG1sX25vZGVzKCIqIikgJT4lIGh0bWxfdGV4dCgpDQpgYGANCg0KQ29tbyBwb2RlbW9zIG5vdGFyLCBwb2RlbW9zIG9idGVuZXIgZWwgdMOtdHVsbyBkZSBsYSBub3RpY2lhIGNvbiBlbCBzw6lwdGltbyB1IG9jdGF2byBub2RvIGRlbCBvYmpldG8sIGFkZW3DoXMgZGVsIGRpYXJpbyBjb24gZWwgbm9kbyAxNS4gUGFyYSBzYWJlciBzdSBjbGFzZSB5IHBhc2FybGEgYSBsYSBmdW5jacOzbiAqaHRtbF9ub2RlKiBpbmRleGFyZW1vcyB0YWxlcyBub2RvcyB5IGNvcGlhcmVtb3Mgc3UgY2xhc2UgKHRleHRvIGFsIGluaWNpbyBkZSBjYWRhIG5vZG8sIGFudGVzIGRlbCBlc3BhY2lvKToNCg0KYGBge3J9DQpub2RvcyA9IG5vdGljaWEgJT4lIGh0bWxfbm9kZXMoIioiKQ0Kbm9kb3NbYyg3LDgsMTUpXQ0KYGBgDQoNCkRlYmlkbyBhIHF1ZSBlbCBub2RvICJhIGhyZWYiIHNlIHJlZmllcmUgYSB1biBoaXBlcnbDrW5jdWxvLCB0b21hcmVtb3MgZWwgdMOtdHVsbyBkZSBsYSBub3RpY2lhIGRlbCBub2RvICJoMyIgeSBlbCBkaWFyaW8gZGVsIG5vZG8gImEiIGNvbiBjbGFzZSAid0V3eXJjIEFWTjJnYyB1UUlWemMgU2tzZ3AiIGEgdHJhdsOpcyBkZSBsYSBmdW5jacOzbiAqaHRtbF9ub2RlKjoNCg0KYGBge3J9DQp0aXR1bGFyID0gbm90aWNpYSAlPiUgaHRtbF9ub2RlKCJoMyIpICU+JSBodG1sX3RleHQoKQ0KdGl0dWxhcg0KZGlhcmlvID0gbm90aWNpYSAlPiUgaHRtbF9ub2RlKCJhLndFd3lyYy5BVk4yZ2MudVFJVnpjLlNrc2dwIikgJT4lIGh0bWxfdGV4dCgpDQpkaWFyaW8NCmBgYA0KDQoqKkZlY2hhczoqKg0KDQpgYGB7cn0NCm5vdGljaWEgJT4lIGh0bWxfbm9kZXMoIioiKSAlPiUgaHRtbF9hdHRyKCJkYXRldGltZSIpDQpgYGANCg0KRW4gZXN0ZSBjYXNvIGVuIGNhbWJpbywgZWwgbm9kbyBkZSBsYSBmZWNoYSBlcyBlbCBub2RvIDE2Og0KDQpgYGB7cn0NCm5vZG9zWzE2XQ0KYGBgDQpFc3RlIG5vZG8gdGllbmUgY29tbyB0aXBvIGRlIG5vZG8gYSBsYSBldGlxdWV0YSAidGltZSI6DQoNCmBgYHtyfQ0KZmVjaGEgPSBub3RpY2lhICU+JSBodG1sX25vZGUoInRpbWUiKSAlPiUgaHRtbF9hdHRyKCJkYXRldGltZSIpDQpmZWNoYQ0KYGBgDQoNCioqSGlwZXJ2w61uY3VsbzoqKg0KDQpgYGB7cn0NCm5vdGljaWEgJT4lIGh0bWxfbm9kZXMoIioiKSAlPiUgaHRtbF9hdHRyKCJocmVmIikNCmBgYA0KDQpQYXJhIGVzdGUgY2FzbyBub3Mgc29uIMO6dGlsZXMgbG9zIG5vZG9zIDEsIDYgeSA4Og0KDQpgYGB7cn0NCm5vZG9zW2MoMSw2LDgpXQ0KYGBgDQoNCkRlYmlkbyBhIHF1ZSBkb3Mgbm9kb3MgY29uIGxhIG1pc21hIGNsYXNlIHRpZW5lbiBlbCBoaXBlcnbDrW5jdWxvLCBub3Mgc2Vyw6EgbcOhcyBmw6FjaWwgbG9jYWxpemFybG8gc29sbyBjb24gbGEgZnVuY2nDs24gKmh0bWxfbm9kZSogeSBubyAqaHRtbF9ub2RlcyogKHN1IGRpZmVyZW5jaWEgcmFkaWNhIGVuIHF1ZSBlbCBwbHVyYWwgYnVzY2Egbm9kb3MgaGFzdGEgZWwgZmluYWwgZGVsIG9iamV0bywgbWllbnRyYXMgcXVlIGVsIHNpbmd1bGFyIHNvbG8gYnVzY2EgZW4gZWwgbWlzbW8gbml2ZWwgZGVsIG5vZG8pOg0KDQpgYGB7cn0NCm5vdGljaWEgJT4lIGh0bWxfbm9kZSgiYSIpICU+JSBodG1sX2F0dHIoImhyZWYiKQ0KYGBgDQoNCkNvbiBlc3RlIGNhbWlubywgbm9zIHNpcnZlIGVudG9uY2VzIGVsIHByaW1lciBub2RvOg0KDQpgYGB7cn0NCm5vZG9zWzFdDQpgYGANCg0KQ29uIGxvIHF1ZSBwb2RlbW9zIGV4dHJhZXIgZWwgaGlwZXJ2w61uY3VsbzoNCg0KYGBge3J9DQpsaW5rX2VubWFzY2FyYWRvID0gbm90aWNpYSAlPiUgaHRtbF9ub2RlKCJhIikgJT4lIGh0bWxfYXR0cigiaHJlZiIpDQpsaW5rX2VubWFzY2FyYWRvDQpgYGANCg0KU2kgbm9zIGZpamFtb3MgYmllbiwgZXN0ZSBubyBlcyBlbCBoaXBlcnbDrW5jdWxvIGRlIGxhIG5vdGljaWEsIHNpbm8gdW5hIGRpcmVjY2nDs24gYSBsYSBxdWUgbm9zIHJlZGlyaWdlIEdvb2dsZSBhbnRlcyBkZSBtYW5kYXJub3MgYWwgbGluayBvcmlnaW5hbC4gUGFyYSBlbmNvbnRyYXIgZWwgbGluayB2ZXJkYWRlcm8sIGRlYmVtb3Mgc2NyYXBlYXIgbGEgbm90aWNpYSAodW5pw6luZG9sYSBhbCBsaW5rIGRlIEdvb2dsZSBOZXdzKToNCg0KYGBge3J9DQpsaW5rX2VubWFzY2FyYWRvID0gcGFzdGUwKG5ld3NfcGFnLHN1YnN0cmluZyhsaW5rX2VubWFzY2FyYWRvLDMpKSAgDQpsaW5rX2VubWFzY2FyYWRvDQpgYGANCg0KU2kgbmF2ZWdhbW9zIGEgZXN0YSBkaXJlY2Npw7NuIGUgaW50ZXJydW1waW1vcyBsYSBjYXJnYSBkZSBsYSBww6FnaW5hIGFudGVzIGRlIHF1ZSBub3MgcmVkaXJpamEgYSBsYSBub3RpY2lhIHBvZGVtb3Mgb2J0ZW5lciBlbCBzZWxlY3RvciBDU1MgbmVjZXNhcmlvOg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDJfU2VsZWN0b3JDU1NIaWRkZW4ucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KTGVhbW9zIGVsIGh0bWwgZGUgZXN0YSBww6FnaW5hIHkgcmV2aXNlbW9zIHN1cyBvYmpldG9zIGNvbiBlbCBzZWxlY3RvciBDU1Mgb2J0ZW5pZG8gKGFxdWVsbG9zIHF1ZSBjb250ZW5nYW4gdW4gaGlwZXJ2w61uY3Vsbyk6DQoNCmBgYHtyfQ0KbGlua19sZWlkbyA9IHJlYWRfaHRtbChsaW5rX2VubWFzY2FyYWRvKQ0KbGlua19sZWlkbyAlPiUgaHRtbF9ub2RlcygiYSIpICU+JSBodG1sX2F0dHIoImhyZWYiKQ0KYGBgDQoNClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGRlbnRybyBkZWwgbm9kbyAiYSIgZXhpc3RlbiB2YXJpb3MgbGlua3MsIGRlIGxvcyBjdWFsZXMgbm9zIHNpcnZlbiBsb3MgZG9zIMO6bHRpbW9zLiBFc3RvcyBub2RvcyBzZSB2ZW4gY29tbzoNCg0KYGBge3J9DQpub2RvcyA9IGxpbmtfbGVpZG8gJT4lIGh0bWxfbm9kZXMoImEiKSANCm5vZG9zW2xlbmd0aChub2RvcyldDQpgYGANCg0KU2kgdmVtb3MgZGUgY2VyY2EgYW1ib3Mgbm9kb3MgZXMgbm90YWJsZSBxdWUgY3VhbHF1aWVyYSBkZSBsb3MgZG9zIHRpZW5lIGVsIGhpcGVydsOtbmN1bG8gcXVlIG5lY2VzaXRhbW9zLiBFbnRvbmNlcyB0b21hcmVtb3MgZWwgw7psdGltbzoNCg0KYGBge3J9DQpsaW5rID0gbGlua19sZWlkbyAlPiUgaHRtbF9ub2RlcygiYSIpICU+JSB0YWlsKDEpICU+JSBodG1sX2F0dHIoImhyZWYiKQ0KbGluaw0KYGBgDQoNCkFob3JhIHF1ZSBoZW1vcyBvYnRlbmlkbyBlbCBsaW5rIGRlIGxhIG5vdGljaWEsIG5lY2VzaXRhbW9zIG9idGVuZXIgc3UgaW5mb3JtYWNpw7NuLiBQYXJhIGVsbG86DQoNCiAgKyBOYXZlZ2Ftb3MgYWwgbGluayBkZSBsYSBub3RpY2lhOg0KICANCmBgYHtyfQ0Kbm90aWNpYV9sZWlkYSA9IHJlYWRfaHRtbChsaW5rKQ0KYGBgDQoNCiAgKyBEZSBlc3RhIGhhcmVtb3MgYnVzY2FyZW1vcyBlbCBzZWxlY3RvciBDU1MgcXVlIGNvbnRlbmdhIGVsIHRleHRvIGRlIGxhIG5vdGljaWE6DQogIA0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9Ijk1JSIgc3JjPSJmaWdzLzAyX1NlbGVjdG9yQ1NTTm90aWNpYS5wbmciPjwvYT48L2NlbnRlcj4NCjxicj48L2JyPg0KICANCiAgKyBZIGxvIHBhc2Ftb3MgYSBsYSBmdW5jacOzbiAqaHRtbF9ub2RlcyogcGFyYSBsdWVnbyBleHRyYWVyIGVsIHRleHRvOg0KICANCmBgYHtyfQ0Kbm90aWNpYV9sZWlkYSAlPiUgaHRtbF9ub2RlcygiLmZpZWxkLW5hbWUtYm9keSIpICU+JSBodG1sX3RleHQoKSAlPiUgY2F0KCkNCmBgYA0KDQpQb2RlbW9zIHZlciBxdWUgZGVudHJvIGRlIGxhIG5vdGljaWEgc2UgaGFuIGNvbGFkbyBhbGd1bm9zIHRleHRvcyBpbmRlc2VhYmxlcyBxdWUgZW4gcmVhbGlkYWQgc29uIGPDs2RpZ28gSFRNTCBkZSBsYSBww6FnaW5hIHdlYi4gUGFyYSBleGNsdWlybG9zIGFuYWxpemFyZW1vcyBlbCBvYmpldG8gY29uIGxhIGZ1bmNpw7NuICpodG1sX2NoaWxkcmVuKjoNCg0KYGBge3J9DQpub3RpY2lhX2xlaWRhICU+JSBodG1sX25vZGVzKCIuZmllbGQtbmFtZS1ib2R5IikgJT4lIGh0bWxfY2hpbGRyZW4oKSANCmBgYA0KDQogICsgQXF1w60gc2Ugbm90YSBxdWUgbG9zIG5vZG9zICJwIiBzb24gbG9zIHF1ZSBjb250aWVuZW4gdGV4dG8gKHF1ZSBzZXLDoW4gdW5pZG9zIGNvbiBsYSBmdW5jacOzbiAqcGFzdGUwKik6DQoNCmBgYHtyfQ0KdGV4dG8gPSBub3RpY2lhX2xlaWRhICU+JSBodG1sX25vZGVzKCIuZmllbGQtbmFtZS1ib2R5IikgJT4lIGh0bWxfbm9kZXMoInAiKSAlPiUgaHRtbF90ZXh0KCkNCnRleHRvID0gcGFzdGUwKHRleHRvLCBjb2xsYXBzZSA9ICIgIikNCnRleHRvDQpgYGANCg0KQ29uIGVzdG8gaGFicmVtb3MgZmluYWxpemFkbyBlbCBwcm9jZXNvIGRlIHdlYi1zY3JhcHBpbmcgcGFyYSBlc3RhIG5vdGljaWEuIENhYmUgbm90YXIgcXVlIGNhZGEgZGlhcmlvIHRlbmRyw6Egc3UgcHJvcGlhIGVzdHJ1Y3R1cmEsIHF1ZSB0ZW5kcsOhIHF1ZSBzZXIgYW5hbGl6YWRhIGNvbiBTZWxlY3RvckdhZGdldC4NCg0KVW5hIHZleiBleHBsaWNhZG8gZWwgZWplbXBsbywgdW5hbW9zIHRvZGFzIHN1cyBwYXJ0ZXMgcGFyYSBjcmVhciAzIGZ1bmNpb25lcywgZGUgbGFzIGN1YWxlcyBleHBsaWNhcmVtb3MgdW4gcGFyIGRlIGRldGFsbGVzIGFkaWNpb25hbGVzLg0KDQoqKkZ1bmNpw7NuIGRlIGLDunNxdWVkYSBkZSBub3RpY2lhczoqKg0KDQpgYGB7cn0NCm9idGllbmVOb3RpY2lhc0J1c3F1ZWRhID0gZnVuY3Rpb24oYnVzcXVlZGEpew0KICBuZXdzX3BhZyA9ICJodHRwczovL25ld3MuZ29vZ2xlLmNvbS8iDQogIHBhcmFtZXRyb19idXNxdWVkYSA9ICJzZWFyY2g/cT0iDQogIGJ1c3F1ZWRhX25vX2VzcGFjaW9zID0gZ3N1YigiICIsIiUyMCIsIGJ1c3F1ZWRhKQ0KICBwYXJhbWV0cm9fZmluYWwgPSAiJmhsPWVzLTQxOSZnbD1VUyZjZWlkPVVTOmVzLTQxOSINCiAgaHRtbF9kaXIgPSBwYXN0ZTAobmV3c19wYWcscGFyYW1ldHJvX2J1c3F1ZWRhLGJ1c3F1ZWRhX25vX2VzcGFjaW9zLHBhcmFtZXRyb19maW5hbCkNCiAgZ29vZ2xlX25ld3MgPSByZWFkX2h0bWwoaHRtbF9kaXIpDQogIG5vdGljaWFzID0gZ29vZ2xlX25ld3MgJT4lIA0KICAgIGh0bWxfbm9kZXMoY3NzID0gIi54UDZtd2YiKSAlPiUgDQogICAgaHRtbF9jaGlsZHJlbigpDQogIG5vdGljaWFzREYgPSBtYXAobm90aWNpYXMsb2J0aWVuZU5vdGljaWFzRGF0YSkNCiAgbm90aWNpYXNERiA9IGJpbmRfcm93cyhub3RpY2lhc0RGKQ0KICBub3RpY2lhc0RGID0gbm90aWNpYXNERlshaXMubmEobm90aWNpYXNERiRUaXR1bGFyKSxdDQogIHJldHVybihub3RpY2lhc0RGKQ0KfQ0KYGBgDQoNCkVzdGEgZnVuY2nDs24gcmVjaWJlIGNvbW8gYXJndW1lbnRvIHVuYSBiw7pzcXVlZGEgZGUgdGV4dG8geSBleHRyYWUgdG9kYXMgbGFzIG5vdGljaWFzIHF1ZSBkZXZ1ZWx2YSBnb29nbGUgbmV3cyBwYXJhIGVzYSBiw7pzcXVlZGEgKGNvbiB1biBtw6F4aW1vIGRlIDEwMCkuIA0KDQpDb24gbGEgZnVuY2nDs24gbWFwLCBsbyBxdWUgc2UgaGFjZSBlcyB1c2FyIGxhIHNpZ3VpZW50ZSBmdW5jacOzbiAoKm9idGllbmVOb3RpY2lhc0RhdGEqKSwgcGFyYSBleHRyYWVyIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGNhZGEgdW5vIGRlIGxvcyBvYmpldG9zIGRlIG5vdGljaWEgZW5jb250cmFkb3MuDQoNCkFsIGZpbmFsIHNlIGRldnVlbHZlIHVuIGRhdGEuZnJhbWUgY29uIGxhIGluZm9ybWFjacOzbiByZWxldmFudGUgZGUgdG9kYXMgbGFzIG5vdGljaWFzIGVuY29udHJhZGFzLg0KDQoqKkZ1bmNpw7NuIGRlIGNhcmFjdGVyaXphY2nDs24gZGUgbm90aWNpYXM6KioNCg0KYGBge3J9DQpvYnRpZW5lTm90aWNpYXNEYXRhID0gZnVuY3Rpb24obm90aWNpYSl7DQogIG5ld3NfcGFnID0gImh0dHBzOi8vbmV3cy5nb29nbGUuY29tLyINCiAgdGl0dWxhciA9IG5vdGljaWEgJT4lIGh0bWxfbm9kZSgiaDMiKSAlPiUgaHRtbF90ZXh0KCkNCiAgZmVjaGEgPSBub3RpY2lhICU+JSBodG1sX25vZGUoInRpbWUiKSAlPiUgaHRtbF9hdHRyKCJkYXRldGltZSIpDQogIGRpYXJpbyA9IG5vdGljaWEgJT4lIGh0bWxfbm9kZSgiYS53RXd5cmMuQVZOMmdjLnVRSVZ6Yy5Ta3NncCIpICU+JSBodG1sX3RleHQoKQ0KICBsaW5rX2VubWFzY2FyYWRvID0gbm90aWNpYSAlPiUgaHRtbF9ub2RlKCJoMyBhIikgJT4lIGh0bWxfYXR0cigiaHJlZiIpDQogIGxpbmtfZW5tYXNjYXJhZG8gPSBwYXN0ZTAobmV3c19wYWcsc3Vic3RyaW5nKGxpbmtfZW5tYXNjYXJhZG8sMykpICANCiAgbGlua19sZWlkbyA9IHJlYWRfaHRtbChsaW5rX2VubWFzY2FyYWRvKQ0KICBsaW5rID0gbGlua19sZWlkbyAlPiUgDQogICAgaHRtbF9ub2Rlcyhjc3M9J2EnKSAlPiUgDQogICAgdGFpbCgxKSAlPiUgDQogICAgaHRtbF9hdHRyKCJocmVmIikNCiAgbm90aWNpYURGID0gZGF0YS5mcmFtZShUaXR1bGFyPXRpdHVsYXIsIEZlY2hhPWZlY2hhLCBEaWFyaW89ZGlhcmlvLCBMaW5rPWxpbmssIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQ0KICByZXR1cm4obm90aWNpYURGKQ0KfQ0KYGBgDQoNCkVzdGEgZnVuY2nDs24gc2lydmUgY29tbyB1biBhdXhpbGlhciBwYXJhIGxhIGZ1bmNpw7NuIGFudGVyaW9yIHkgZXh0cmFlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBvYmpldG8gZGUgbm90aWNpYSBxdWUgcmVjaWJlIGNvbW8gaW5wdXQuDQoNCioqRnVuY2nDs24gZGUgZXh0cmFjY2nDs24gZGUgbm90aWNpYXM6KioNCg0KYGBge3J9DQpvYnRlbmVyTm90aWNpYU5hY2lvbmFsID0gZnVuY3Rpb24obGlua19ub3RpY2lhLCBkaWFyaW8sIGRpY2Npb25hcmlvX2Nzcyl7DQogIA0KICBub3RpY2lhX2xlaWRhID0gcmVhZF9odG1sKGxpbmtfbm90aWNpYSkNCiAgY3NzID0gZGljY2lvbmFyaW9fY3NzJENTU1tkaWNjaW9uYXJpb19jc3MkRGlhcmlvPT1kaWFyaW9dDQogIA0KICB0ZXh0X25vZGVzID0gbm90aWNpYV9sZWlkYSAlPiUgDQogICAgaHRtbF9ub2Rlcyhjc3MgPSBjc3MpICU+JSANCiAgICBodG1sX25vZGVzKCJwIikNCiAgDQogIHRleHQgPSB0ZXh0X25vZGVzICU+JSANCiAgICBodG1sX3RleHQoKQ0KICAgIA0KICB0ZXh0ID0gcGFzdGUwKHRleHQsIGNvbGxhcHNlID0gIiAiKQ0KICAgIA0KICByZXR1cm4odGV4dCkNCiAgDQp9DQpgYGANCg0KRXN0YSBmdW5jacOzbiBoYWNlIHdlYi1zY3JhcHBpbmcsIHBhcmEgZWwgbGluayB5IGRpYXJpbyBzdW1pbmlzdHJhZG9zLCBsYSBub3RpY2lhIGNvbXBsZXRhLg0KDQozLiBPYnRlbmVtb3MgbGFzIG5vdGljaWFzIHBhcmEgMyBiw7pzcXVlZGFzOg0KDQpgYGB7cn0NCm5vdGljaWFzVmVsYXNjb0RGID0gb2J0aWVuZU5vdGljaWFzQnVzcXVlZGEoYnVzcXVlZGEgPSAiSnVhbiBGZXJuYW5kbyBWZWxhc2NvIikNCm5vdGljaWFzTGFycmVhREYgPSBvYnRpZW5lTm90aWNpYXNCdXNxdWVkYSgiR3VzdGF2byBMYXJyZWEiKQ0Kbm90aWNpYXNGcmVpbGVERiA9IG9idGllbmVOb3RpY2lhc0J1c3F1ZWRhKCJQZWRybyBKb3PDqSBGcmVpbGUiKQ0KYGBgDQoNCmBgYHtyfQ0Kbm90aWNpYXNWZWxhc2NvREYgJT4lIHNlbGVjdChGZWNoYSwgRGlhcmlvLCBUaXR1bGFyLCBMaW5rKQ0Kbm90aWNpYXNMYXJyZWFERiAlPiUgc2VsZWN0KEZlY2hhLCBEaWFyaW8sIFRpdHVsYXIsIExpbmspDQpub3RpY2lhc0ZyZWlsZURGICU+JSBzZWxlY3QoRmVjaGEsIERpYXJpbywgVGl0dWxhciwgTGluaykNCmBgYA0KDQo1LiBPYnRlbmVtb3MgbG9zIHRleHRvcyBkZSBjYWRhIG5vdGljaWEgdXNhbmRvIGxhIGZ1bmNpw7NuICpvYnRlbmVyTm90aWNpYU5hY2lvbmFsKiBjcmVhZGEgZW4gZWwgbGl0ZXJhbCAyOg0KDQpQb3IgbW90aXZvcyBkaWTDoWN0aWNvcywgdXNhcmVtb3MgbGEgaW5mb3JtYWNpw7NuIGRlIDMgZGlhcmlvcyBuYWNpb25hbGVzOiBFbCBjb21lcmNpbywgRWwgVW5pdmVyc28geSBQcmltaWNpYXMsIGRlIGxvcyBjdWFsZXMsIHNlIG11ZXN0cmEgZWwgQ1NTIGRlIGFjY2VzbyBhIGNvbnRpbnVhY2nDs246DQoNCioqRWwgQ29tZXJjaW8gKEVjdWFkb3IpKioNCg0KPGJyPjwvYnI+DQo8Y2VudGVyPjxhPjxpbWcgd2lkdGg9Ijk1JSIgc3JjPSJmaWdzLzAyX1NlbGVjdG9yQ1NTQ29tZXJjaW8ucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKipFbCBVbml2ZXJzbyoqDQoNCjxicj48L2JyPg0KPGNlbnRlcj48YT48aW1nIHdpZHRoPSI5NSUiIHNyYz0iZmlncy8wMl9TZWxlY3RvckNTU05vdGljaWEucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KKipQcmltaWNpYXMqKg0KDQo8YnI+PC9icj4NCjxjZW50ZXI+PGE+PGltZyB3aWR0aD0iOTUlIiBzcmM9ImZpZ3MvMDJfU2VsZWN0b3JDU1NQcmltaWNpYXMucG5nIj48L2E+PC9jZW50ZXI+DQo8YnI+PC9icj4NCg0KUGFyYSBlc3RvcyBkaWFyaW9zIGNvbnN0cnVpbW9zIHVuIGRpY2Npb25hcmlvIENTUyBxdWUgdXNhcmEgbGEgZnVuY2nDs24gKm9idGVuZXJOb3RpY2lhTmFjaW9uYWwqIGEgdHJhdsOpcyBkZWwgaXRlcmFkb3IgKm1hcDJfY2hyKjoNCg0KYGBge3J9DQojIERpYXJpb3MNCkRpYXJpb3MgPSBjKCJFbCBDb21lcmNpbyAoRWN1YWRvcikiLCAiRWwgVW5pdmVyc28iLCAiUHJpbWljaWFzIikNCkVzdHJ1Y3R1cmEgPSBkYXRhLmZyYW1lKERpYXJpbz1EaWFyaW9zKQ0KRXN0cnVjdHVyYSRDU1MgPSBOQQ0KRXN0cnVjdHVyYSRDU1NbRXN0cnVjdHVyYSREaWFyaW89PSdFbCBDb21lcmNpbyAoRWN1YWRvciknXSA9ICcucGFyYWdyYXBocycNCkVzdHJ1Y3R1cmEkQ1NTW0VzdHJ1Y3R1cmEkRGlhcmlvPT0nRWwgVW5pdmVyc28nXSA9ICcuZmllbGQtbmFtZS1ib2R5Jw0KRXN0cnVjdHVyYSRDU1NbRXN0cnVjdHVyYSREaWFyaW89PSdQcmltaWNpYXMnXSA9ICcjZW50cnktY29udGVudC1pbmFydGljbGUnDQpgYGANCg0KQWhvcmEgb2J0ZW5lbW9zIGxhcyBub3RpY2lhcw0KDQpgYGB7cn0NCm5vdGljaWFzVmVsYXNjb0RGID0gbm90aWNpYXNWZWxhc2NvREYgJT4lIGZpbHRlcihEaWFyaW8gJWluJSBEaWFyaW9zKQ0KbmV3cyA9IG1hcDJfY2hyKG5vdGljaWFzVmVsYXNjb0RGJExpbmssIG5vdGljaWFzVmVsYXNjb0RGJERpYXJpbywgb2J0ZW5lck5vdGljaWFOYWNpb25hbCwgZGljY2lvbmFyaW9fY3NzPUVzdHJ1Y3R1cmEpDQpub3RpY2lhc1ZlbGFzY29ERiROb3RpY2lhID0gbmV3cw0KcHJpbnQobm90aWNpYXNWZWxhc2NvREYkTGlua1sxXSkNCnByaW50KG5vdGljaWFzVmVsYXNjb0RGJFRpdHVsYXJbMV0pDQpwcmludChuZXdzWzFdKQ0KYGBgDQoNCmBgYHtyfQ0Kbm90aWNpYXNMYXJyZWFERiA9IG5vdGljaWFzTGFycmVhREYgJT4lIGZpbHRlcihEaWFyaW8gJWluJSBEaWFyaW9zKQ0KbmV3cyA9IG1hcDJfY2hyKG5vdGljaWFzTGFycmVhREYkTGluaywgbm90aWNpYXNMYXJyZWFERiREaWFyaW8sIG9idGVuZXJOb3RpY2lhTmFjaW9uYWwsIGRpY2Npb25hcmlvX2Nzcz1Fc3RydWN0dXJhKQ0Kbm90aWNpYXNMYXJyZWFERiROb3RpY2lhID0gbmV3cw0KcHJpbnQobm90aWNpYXNMYXJyZWFERiRMaW5rWzFdKQ0KcHJpbnQobm90aWNpYXNMYXJyZWFERiRUaXR1bGFyWzFdKQ0KcHJpbnQobmV3c1sxXSkNCmBgYA0KDQpgYGB7cn0NCm5vdGljaWFzRnJlaWxlREYgPSBub3RpY2lhc0ZyZWlsZURGICU+JSBmaWx0ZXIoRGlhcmlvICVpbiUgRGlhcmlvcykNCm5ld3MgPSBtYXAyX2Nocihub3RpY2lhc0ZyZWlsZURGJExpbmssIG5vdGljaWFzRnJlaWxlREYkRGlhcmlvLCBvYnRlbmVyTm90aWNpYU5hY2lvbmFsLCBkaWNjaW9uYXJpb19jc3M9RXN0cnVjdHVyYSkNCm5vdGljaWFzRnJlaWxlREYkTm90aWNpYSA9IG5ld3MNCnByaW50KG5vdGljaWFzRnJlaWxlREYkTGlua1syXSkNCnByaW50KG5vdGljaWFzRnJlaWxlREYkVGl0dWxhclsyXSkNCnByaW50KG5ld3NbMl0pDQpgYGANCg0KNy4gR3VhcmRhbW9zIGxvcyBkYXRhZnJhbWVzIG9idGVuaWRvczoNCg0KYGBge3J9DQpzYXZlUkRTKG5vdGljaWFzVmVsYXNjb0RGLCAiQ2FzbzFfTm90aWNpYXMvbm90aWNpYXNWZWxhc2NvREYuUkRTIikNCnNhdmVSRFMobm90aWNpYXNMYXJyZWFERiwgIkNhc28xX05vdGljaWFzL25vdGljaWFzTGFycmVhREYuUkRTIikNCnNhdmVSRFMobm90aWNpYXNGcmVpbGVERiwgIkNhc28xX05vdGljaWFzL25vdGljaWFzRnJlaWxlREYuUkRTIikNCmBgYA0KDQojIyAqKjMuMi4gT2J0ZW5jacOzbiBkZSBkYXRvcyBkZSBkb2N1bWVudG9zIFBERioqDQoNCk9idGVuZHJlbW9zIGxvcyBkYXRvcyBkZSBsb3MgZG9jdW1lbnRvcyBlbGVjdHLDs25pY29zIGEgdHJhdsOpcyBkZSBsYSBsZWN0dXJhIHkgbWFuaXB1bGFjacOzbiBkZSBhcmNoaXZvcyBQREYuIEVzdG8gbG8gcmVhbGl6YXJlbW9zIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNCjEuIENhcmdhbW9zIGxhcyBsaWJyZXLDrWFzIG5lY2VzYXJpYXMgcGFyYSBlbCBlamVyY2ljaW86DQoNCmBgYHtyfQ0KbGlicmFyeShwZGZ0b29scykgIyBNYW5pcHVsYWNpw7NuIGRlIHBkZnMNCmxpYnJhcnkocmVhZHhsKSAjIExlY3R1cmEgZGUgYXJjaGl2b3MgZXhjZWwNCmBgYA0KMi4gQ2FyZ2Ftb3MgbG9zIGFyY2hpdm9zIHBkZiBxdWUgcXVlcmVtb3MgcHJvY2VzYXI6DQoNCmBgYHtyfQ0KbmFycmF0aXZhX3ZvbDEgPSBwZGZfdGV4dCgiQ2FzbzJfTGl0ZXJhdHVyYS9OYXJyYXRpdmEgY29tcGxldGEgdm9sLiAxIC0gSC4gUC4gTG92ZWNyYWZ0LnBkZiIpDQpuYXJyYXRpdmFfdm9sMiA9IHBkZl90ZXh0KCJDYXNvMl9MaXRlcmF0dXJhL05hcnJhdGl2YSBjb21wbGV0YSB2b2wuIDIgLSBILiBQLiBMb3ZlY3JhZnQucGRmIikNCm5hcnJhdGl2YV92b2wxWzJdDQpgYGANCjMuIENyZWFtb3MgZnVuY2lvbmVzIGF1eGlsaWFyZXMgcXVlIG5vcyBheXVkZW4gYSBzZXBhcmFyIGzDrW5lYXMsIHJlbW92ZXIgZXNwYWNpb3MgaW5uZWNlc2FyaW9zLCBwaWUgZGUgcMOhZ2luYXMsIG7Dum1lcm8gZGUgcMOhZ2luYSwgdMOtdHVsbyB5IGzDrW5lYXMgZXNwZWNpYWxlczoNCg0KYGBge3J9DQojIFJlbW92ZXIgY2FyYWN0ZXJlcyBlc3BlY2lhbGVzDQpyZW1vdmVTcGVjaWFsQ2hhcnMgPC0gZnVuY3Rpb24oeCkgZ3N1YigiW15hLXpBLVowLTkgXSIsICIgIiwgeCkNCg0KIyBTZXBhcmFyIGxpbmVhcyB5IHJlbW92ZXIgZXNwYWNpb3MgaW5uZWNlc2FyaW9zDQpTZXBhcmFMaW5lYXMgPSBmdW5jdGlvbih4KXttYXAodW5saXN0KHN0cl9zcGxpdCh4LCBwYXR0ZXJuID0gIlxyXG4iKSksc3RyX3NxdWlzaCl9DQoNCiMgUmVtb3ZlciBwaWUgZGUgcMOhZ2luYSwgZW5jYWJlemFkbyB5IHTDrXR1bG9zDQpSZW11ZXZlUGFnaW5hID0gZnVuY3Rpb24obCl7aWYobmNoYXIobCk9PW5jaGFyKGdzdWIoIlxcRCIsIiIsbCkpKXsiIn1lbHNle2x9fQ0KUmVtdWV2ZVBpZSA9IGZ1bmN0aW9uKGwpe2lmKGw9PSJGSU4iKXsiIn1lbHNle2x9fQ0KUmVtdWV2ZVRpdHVsbyA9IGZ1bmN0aW9uKGwsdGl0bGUpe2lmKGw9PXRpdGxlKXsiIn1lbHNle2x9fQ0KDQojIFJlbW92ZXIgbMOtbmVhcyBwYXJ0aWN1bGFyZXMNClJlbXVldmVMaW5lYXNFc3BlY2lhbGVzID0gZnVuY3Rpb24obCx0ZXh0KXtpZihsPT10ZXh0KXsiIn1lbHNle2x9fQ0KYGBgDQoNCjQuIFBhc28gc2VndWlkbywgY3JlYW1vcyB1bmEgZnVuY2nDs24gcXVlIHByb2Nlc2UgbGEgaGlzdG9yaWEgY29tcGxldGE6DQoNCmBgYHtyfQ0KIyBGdW5jacOzbiBjb21wbGV0YTogcHJvY2VzYW1pZW50byBkZSBoaXN0b3JpYQ0KUHJvY2VzYUhpc3RvcmlhID0gZnVuY3Rpb24oZGF0YSwgdGl0dWxvLHBhZ2luYV9pbmljaW8scGFnaW5hX2ZpbixsaW5lYXNfZXNwZWNpYWxlcyl7DQogIGhpc3RvcmlhID0gZGF0YVtwYWdpbmFfaW5pY2lvOnBhZ2luYV9maW5dDQogIGhpc3RvcmlhID0gU2VwYXJhTGluZWFzKGhpc3RvcmlhKQ0KICBoaXN0b3JpYSA9IG1hcChoaXN0b3JpYSxSZW11ZXZlUGFnaW5hKQ0KICBoaXN0b3JpYSA9IG1hcChoaXN0b3JpYSxSZW11ZXZlUGllKQ0KICBoaXN0b3JpYSA9IG1hcChoaXN0b3JpYSxSZW11ZXZlVGl0dWxvLCB0aXRsZSA9IHRpdHVsbykNCiAgaWYoIWlzLm5hKGxpbmVhc19lc3BlY2lhbGVzWzFdKSl7DQogICAgZm9yIChpIGluIGxpbmVhc19lc3BlY2lhbGVzKQ0KICAgIGhpc3RvcmlhID0gbWFwKGhpc3RvcmlhLFJlbXVldmVMaW5lYXNFc3BlY2lhbGVzLHRleHQ9aSkNCiAgICB9DQogIGhpc3RvcmlhID0gdW5saXN0KGhpc3RvcmlhKQ0KICBoaXN0b3JpYSA9IHN0cl9zcXVpc2gocGFzdGUoaGlzdG9yaWEsIGNvbGxhcHNlID0gIiAiKSkNCiAgcmV0dXJuKGhpc3RvcmlhKQ0KfQ0KYGBgDQoNCjUuIFByb2Nlc2Ftb3MgbGFzIGhpc3RvcmlhcyBkZSBjYWRhIHZvbHVtZW4sIGNvbiBsYSBheXVkYSBkZSB1biBhcmNoaXZvIGV4Y2VsIHF1ZSBwcmVzZW50YSBlbCDDrW5kaWNlIGRlIGxhcyBoaXN0b3JpYXM6DQoNCmBgYHtyfQ0KSW5kZXhfVm9sMSA9IHJlYWRfZXhjZWwoIkNhc28yX0xpdGVyYXR1cmEvSW5kaWNlTG92ZWNyYWZ0Lnhsc3giLCBzaGVldCA9ICJWT0wxIikNCmhlYWQoSW5kZXhfVm9sMSkNCmBgYA0KYGBge3J9DQojIFByb2Nlc2FtaWVudG8gZGUgaGlzdG9yaWFzIGRlbCB2b2x1bWVuIDENCmhpc3Rvcmlhc19Wb2wxID0gSW5kZXhfVm9sMQ0KaGlzdG9yaWFzX1ZvbDEkSGlzdG9yaWEgPSB1bmxpc3QocG1hcChsaXN0KHRpdHVsbyA9IGFzLmxpc3QoSW5kZXhfVm9sMSRUaXR1bG8pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBhZ2luYV9pbmljaW8gPSBhcy5saXN0KEluZGV4X1ZvbDEkUGFnaW5hSW5pY2lhbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscGFnaW5hX2ZpbiA9IGFzLmxpc3QoSW5kZXhfVm9sMSRQYWdpbmFGaW5hbCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsbGluZWFzX2VzcGVjaWFsZXMgPSBzdHJfc3BsaXQoSW5kZXhfVm9sMSRMaW5lYXNFc3BlY2lhbGVzLCI7IikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxQcm9jZXNhSGlzdG9yaWEsIGRhdGEgPSBuYXJyYXRpdmFfdm9sMSkpDQpwcmludChoaXN0b3JpYXNfVm9sMSRUaXR1bG9bNV0pDQpwcmludChoaXN0b3JpYXNfVm9sMSRIaXN0b3JpYVs1XSkNCmBgYA0KYGBge3J9DQpJbmRleF9Wb2wyID0gcmVhZF9leGNlbCgiQ2FzbzJfTGl0ZXJhdHVyYS9JbmRpY2VMb3ZlY3JhZnQueGxzeCIsIHNoZWV0ID0gIlZPTDIiKQ0KaGVhZChJbmRleF9Wb2wyKQ0KYGBgDQoNCmBgYHtyfQ0KIyBQcm9jZXNhbWllbnRvIGRlIGhpc3RvcmlhcyBkZWwgdm9sdW1lbiAxDQpoaXN0b3JpYXNfVm9sMiA9IEluZGV4X1ZvbDINCmhpc3Rvcmlhc19Wb2wyJEhpc3RvcmlhID0gdW5saXN0KHBtYXAobGlzdCh0aXR1bG8gPSBhcy5saXN0KEluZGV4X1ZvbDIkVGl0dWxvKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxwYWdpbmFfaW5pY2lvID0gYXMubGlzdChJbmRleF9Wb2wyJFBhZ2luYUluaWNpYWwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHBhZ2luYV9maW4gPSBhcy5saXN0KEluZGV4X1ZvbDIkUGFnaW5hRmluYWwpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGxpbmVhc19lc3BlY2lhbGVzID0gc3RyX3NwbGl0KEluZGV4X1ZvbDIkTGluZWFzRXNwZWNpYWxlcywiOyIpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsUHJvY2VzYUhpc3RvcmlhLCBkYXRhID0gbmFycmF0aXZhX3ZvbDIpKQ0KcHJpbnQoaGlzdG9yaWFzX1ZvbDIkVGl0dWxvWzVdKQ0KcHJpbnQoaGlzdG9yaWFzX1ZvbDIkSGlzdG9yaWFbNV0pDQpgYGANCjYuIENyZWFtb3MgdW4gZGF0YWZyYW1lIHkgZ3VhcmRhbW9zIGVsIG9iamV0bzoNCg0KYGBge3J9DQpOZWNyb25vbWljb25ERiA9IHJiaW5kLmRhdGEuZnJhbWUoaGlzdG9yaWFzX1ZvbDEsIGhpc3Rvcmlhc19Wb2wyKQ0Kc2F2ZVJEUyhOZWNyb25vbWljb25ERiwgZmlsZSA9ICJDYXNvMl9MaXRlcmF0dXJhL05lY3Jvbm9taWNvbkRGLlJEUyIpDQpgYGANCg0KIyAqKjQuIEJpYmxpb2dyYWbDrWEqKg==