La minería de texto (TM) es el proceso de extraer información útil, patrones o conocimiento de textos no estructurados.

Consta de tres etapas: 1. Obtener datos: El reconocimiento óptico de caracteres (OCR) es un tecnologia que permite convertir imágenes de texto en texto editable.También es conocido como extracción de texto de imágenes.
2. Explorar datos: Representación gráfica o visal de los datos para su interpretación. Los métodos más comunes son el Análisis de Sentimientos, la Nube de Palabras y el Topic Modeling.
3. Análisis predictivo: Son las técnicas y modelo estadísticos para predecir resultados futuros. Los modelos más usados son el Random Forest, redes neuronales y regresiones.

#install.packages("tidyverse") #manejo, extraer, resumir tablas
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
#install.packages("tesseract") #OCR - saca el texto de imagenes
library(tesseract)

#install.packages("magick") #PNG
library(magick)
## Linking to ImageMagick 6.9.10.23
## Enabled features: fontconfig, freetype, fftw, lcms, pango, webp, x11
## Disabled features: cairo, ghostscript, heic, raw, rsvg
## Using 16 threads
#install.packages("officer") #Exportar en formatos que son de Office(word)
library(officer)

#install.packages("pdftools") #Leer PDFs
library(pdftools)
## Using poppler version 0.86.1
#install.packages("purrr") #Para la función de "map" para aplicar una función a cada elemento de un vector
library(purrr)

#install.packages("tm") #text mining
library(tm)
## Loading required package: NLP
## 
## Attaching package: 'NLP'
## 
## The following object is masked from 'package:ggplot2':
## 
##     annotate
#install.packages("RColorBrewer") #colores
library(RColorBrewer)

#install.packages("wordcloud") #nube de palabras
library(wordcloud)

#install.packages("topicmodels") 
library(topicmodels)

#install.packages("ggplot2")
library(ggplot2)

1. Obtener Datos mediante OCR

imagen1 <- image_read("/cloud/project/imagen1.PNG")
texto1 <- ocr(imagen1)
texto1
## [1] "Linear regression with one variable x is also known as univariate linear regression\nor simple linear regression. Simple linear regression is used to predict a single\noutput from a single input. This is an example of supervised learning, which means\nthat the data is labeled, i.e., the output values are known in the training data. Let us\nfit a line through the data using simple linear regression as shown in Fig. 4.1.\n"
doc1 <- read_docx() #crear un documento blanco de word
doc1 <- doc1 %>% body_add_par(texto1, style = "Normal") #agrega el texto en el word

#print(doc1, target="texto1.docx") #guardar el doc en la computadora

Imagen a texto en español

imagen2 <- image_read("/cloud/project/imagen2.PNG")
#tesseract_download("spa")


texto2 <- ocr(imagen2)
texto2
## [1] "Un importante, y quiza controversial, asunto politico es el que se refiere al efecto del salario minimo sobre\nlas tasas de desempleo en diversos grupos de trabajadores. Aunque este problema puede ser estudiado con\ndiversos tipos de datos (corte transversal, series de tiempo o datos de panel), suelen usarse las series de\ntiempo para observar los efectos agregados. En la tabla 1.3 se presenta un ejemplo de una base de datos\nde series de tiempo sobre tasas de desempleo y salarios minimos.\n"
doc2 <- read_docx() #crear un documento blanco de word
doc2 <- doc2 %>% body_add_par(texto2, style = "Normal") #agrega el texto en el word

print(doc2, target="texto2.docx")

De PDF a texto en Word

#pdf1 <- pdf_convert("/cloud/project/pdf1.pdf", dpi=600) %>% map(ocr)

Actividad 1. Novela IT

pdf2 <- pdf_convert("/cloud/project/eso3.pdf", dpi=600) %>% map(ocr)
## Converting page 1 to eso3_1.png... done!
## Converting page 2 to eso3_2.png... done!
## Converting page 3 to eso3_3.png... done!
it1 <- image_read("/cloud/project/eso3_1.png")
it2 <- image_read("/cloud/project/eso3_2.png")
combined <- unlist(pdf2) %>% paste(collapse = "/n")
doc_it <- read_docx() #crear un documento blanco de word
doc_it <- doc_it %>% body_add_par(combined, style = "Normal") #agrega el texto en el word

print(doc_it, target="texto_it.docx")

2. Exploración de Datos

Análisis de Frecuencia

text <- readLines("http://www.sthda.com/sthda/RDoc/example-files/martin-luther-king-i-have-a-dream-speech.txt")
corpus <- Corpus(VectorSource(text)) #Pone cada oración en un rectangulo de vector
#inspect(corpus) 
corpus <- tm_map(corpus, content_transformer(tolower)) #pone todo en minusculas
## Warning in tm_map.SimpleCorpus(corpus, content_transformer(tolower)):
## transformation drops documents
corpus <- tm_map(corpus, removePunctuation) #elimina signos de puntuación
## Warning in tm_map.SimpleCorpus(corpus, removePunctuation): transformation drops
## documents
coprus <- tm_map(corpus, removeNumbers) #elimina números
## Warning in tm_map.SimpleCorpus(corpus, removeNumbers): transformation drops
## documents
corpus <- tm_map(corpus, removeWords, stopwords("en")) #elimina los stopwords (a, an, the, etc)
## Warning in tm_map.SimpleCorpus(corpus, removeWords, stopwords("en")):
## transformation drops documents
#corpus <- tm_map(corpus, removeWords, c("palabra")) #elimina una palabra en especifica

inspect(corpus)
## <<SimpleCorpus>>
## Metadata:  corpus specific: 1, document level (indexed): 0
## Content:  documents: 46
## 
##  [1]                                                                                                                                                                                                                                                                                                       
##  [2]   even though  face  difficulties  today  tomorrow  still   dream    dream deeply rooted   american dream                                                                                                                                                                                             
##  [3]                                                                                                                                                                                                                                                                                                       
##  [4]    dream  one day  nation will rise   live   true meaning   creed                                                                                                                                                                                                                                     
##  [5]                                                                                                                                                                                                                                                                                                       
##  [6]  hold  truths   selfevident   men  created equal                                                                                                                                                                                                                                                      
##  [7]                                                                                                                                                                                                                                                                                                       
##  [8]    dream  one day   red hills  georgia  sons  former slaves   sons  former slave owners will  able  sit  together   table  brotherhood                                                                                                                                                                
##  [9]                                                                                                                                                                                                                                                                                                       
## [10]    dream  one day even  state  mississippi  state sweltering   heat  injustice sweltering   heat  oppression will  transformed   oasis  freedom  justice                                                                                                                                              
## [11]                                                                                                                                                                                                                                                                                                       
## [12]    dream   four little children will one day live   nation   will   judged   color   skin    content   character                                                                                                                                                                                      
## [13]                                                                                                                                                                                                                                                                                                       
## [14]    dream today                                                                                                                                                                                                                                                                                        
## [15]                                                                                                                                                                                                                                                                                                       
## [16]    dream  one day   alabama   vicious racists   governor   lips dripping   words  interposition  nullification one day right   alabama little black boys  black girls will  able  join hands  little white boys  white girls  sisters  brothers                                                       
## [17]                                                                                                                                                                                                                                                                                                       
## [18]    dream today                                                                                                                                                                                                                                                                                        
## [19]                                                                                                                                                                                                                                                                                                       
## [20]    dream  one day every valley shall  exalted  every hill  mountain shall  made low  rough places will  made plain   crooked places will  made straight   glory   lord shall  revealed   flesh shall see  together                                                                                    
## [21]                                                                                                                                                                                                                                                                                                       
## [22]    hope     faith   go back   south                                                                                                                                                                                                                                                                   
## [23]                                                                                                                                                                                                                                                                                                       
## [24]   faith  will  able  hew    mountain  despair  stone  hope   faith  will  able  transform  jangling discords   nation   beautiful symphony  brotherhood   faith  will  able  work together  pray together  struggle together  go  jail together  stand   freedom together knowing   will  free one day
## [25]                                                                                                                                                                                                                                                                                                       
## [26]   will   day  will   day    god s children will  able  sing  new meaning                                                                                                                                                                                                                              
## [27]                                                                                                                                                                                                                                                                                                       
## [28]  country  tis  thee sweet land  liberty  thee  sing                                                                                                                                                                                                                                                   
## [29] land   fathers died land   pilgrim s pride                                                                                                                                                                                                                                                            
## [30]  every mountainside let freedom ring                                                                                                                                                                                                                                                                  
## [31]   america     great nation  must become true                                                                                                                                                                                                                                                          
## [32]   let freedom ring   prodigious hilltops  new hampshire                                                                                                                                                                                                                                               
## [33] let freedom ring   mighty mountains  new york                                                                                                                                                                                                                                                         
## [34] let freedom ring   heightening alleghenies  pennsylvania                                                                                                                                                                                                                                              
## [35] let freedom ring   snowcapped rockies  colorado                                                                                                                                                                                                                                                       
## [36] let freedom ring   curvaceous slopes  california                                                                                                                                                                                                                                                      
## [37]                                                                                                                                                                                                                                                                                                       
## [38]                                                                                                                                                                                                                                                                                                       
## [39] let freedom ring  stone mountain  georgia                                                                                                                                                                                                                                                             
## [40] let freedom ring  lookout mountain  tennessee                                                                                                                                                                                                                                                         
## [41] let freedom ring  every hill  molehill  mississippi                                                                                                                                                                                                                                                   
## [42]  every mountainside let freedom ring                                                                                                                                                                                                                                                                  
## [43]    happens   allow freedom ring   let  ring  every village  every hamlet  every state  every city  will  able  speed   day    god s children black men  white men jews  gentiles protestants  catholics will  able  join hands  sing   words   old negro spiritual                                    
## [44] free  last free  last                                                                                                                                                                                                                                                                                 
## [45]                                                                                                                                                                                                                                                                                                       
## [46] thank god almighty   free  last
tdm <- TermDocumentMatrix(corpus)
m <- as.matrix(tdm) #cuenta las veces que aparece cada palabra

frecuencia <- sort(rowSums(m), decreasing = TRUE) #cuenta la frecuencia de cada palabra en el texto completo

frecuencia_df <- data.frame(word=names(frecuencia),
                            freq = frecuencia) #convierte la frecuencia en un dataframe
ggplot(head(frecuencia_df, 10), aes(x=reorder(word, -freq), y=freq)) +
  geom_bar(stat="identity", fill = "lightblue") + 
  geom_text(aes(label = freq), vjust =-0.5) +
  labs(title="TOP 10 palabras más frecuentes",
       subtitle="Discurso 'I have a Dream' de M.L. King", x = "Palabra", y="Frecuencia") +
  ylim(0,20)

Nube de Palabras

#el procesamiento de datos antes de la nube de palabras es igual que el analisis de frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df$word, freq=frecuencia_df$freq, min.freq=2,
          random.order = FALSE, colors = brewer.pal(8, "Oranges"))

Ejercicio 2. Novela IT

cuerpo <- Corpus(VectorSource(combined)) #Pone cada oración en un rectangulo de vector
#inspect(corpus) 
cuerpo <- tm_map(cuerpo, content_transformer(tolower)) #pone todo en minusculas
## Warning in tm_map.SimpleCorpus(cuerpo, content_transformer(tolower)):
## transformation drops documents
cuerpo <- tm_map(cuerpo, removePunctuation) #elimina signos de puntuación
## Warning in tm_map.SimpleCorpus(cuerpo, removePunctuation): transformation drops
## documents
cuerpo <- tm_map(cuerpo, removeNumbers) #elimina números
## Warning in tm_map.SimpleCorpus(cuerpo, removeNumbers): transformation drops
## documents
cuerpo <- tm_map(cuerpo, removeWords, stopwords("spanish")) #elimina los stopwords (a, an, the, etc)
## Warning in tm_map.SimpleCorpus(cuerpo, removeWords, stopwords("spanish")):
## transformation drops documents
cuerpo <- tm_map(cuerpo, removeWords, c("—"))
## Warning in tm_map.SimpleCorpus(cuerpo, removeWords, c("—")): transformation
## drops documents
inspect(cuerpo)
## <<SimpleCorpus>>
## Metadata:  corpus specific: 1, document level (indexed): 0
## Content:  documents: 1
## 
## [1]  alli  persiguiendo  barco  papel   lado izquierdo  witcham street corria\ndeprisa   agua  ganaba   barquito  sacando ventaja oyo  rugido profundo \nvio  cincuenta metros mas adelante colina abajo  agua   cuneta  precipitaba\ndentro   boca  tormenta  aun continuaba abierta   largo semicirculo oscuro\nabierto   bordillo   acera  mientras george miraba  rama desgarrada   corteza\noscura  reluciente  hundio  aquellas fauces alli pendio   momento  luego  deslizo\nhacia  interior hacia alli  encaminaba  bote\n\n—jmierda —chillo horrorizado\n\nforzo  paso    momento parecio  iba  alcanzar  barquito     pies\nresbalo  george cayo despatarrado despellejandose  rodilla   grito  dolor  \nnueva perspectiva   altura  pavimento vio   barco giraba  redondo dos veces\nmomentaneamente atrapado   remolino   desaparecer\n\n—mierda  mas mierda —volvio  chillar estrellando  puno   pavimento\n\n tambien dolio   echo  sollozar ique manera tan estupida  perder  barco\n\n levanto  caminar hacia  boca  tormenta  alli  dejo caer  rodillas  mirar hacia\n interior  agua hacia  ruido hueco  humedo  caer   oscuridad  sonido  daba\nescalofrios hacia pensar \n\n—jeh\n\n exclamacion   arrancada    cordel retrocedio\n\nalli adentro habia  ojos amarillos  tipo  ojos   siempre imaginaba  verlos\nnunca   oscuridad  sotano   animal —penso incoherente—     animal  \nmejor  gato  quedo atrapado\n\n  modos   echar  correr habria corrido   dos segundos  \ntablero mental   hecho cargo  espanto   produjeron  dos ojos amarillos \nbrillantes sintio  aspera superficie  pavimento bajo  dedos   fina lamina  agua fria\n corria alrededor  vio  si mismo levantandose  retrocediendo   entonces \n voz  voz perfectamente razonable  bastante simpatica  hablo  dentro  \nboca  tormenta\n\n—hola george —dijo\n\ngeorge parpadeo  volvio  mirar apenas podia dar credito    vela    sacado\n  cuento    pelicula   sabe   animales hablan  bailan si \n diez anos mas  habria creido     viendo   tenia dieciseis anos sino\nseis\n\n  boca  tormenta habia  payaso  luz distaba  ser buena  basto  \ngeorge denbrough  seguro    vela   payaso    circo    tele\nparecia  mezcla  bozo  clarabell   hablaba haciendo sonar  bocina  howdy\ndoody  sabados   manana bufalo bob   unico  entendia  clarabell  \nsiempre hacia reir  george  cara  payaso metido   boca  tormenta  blanca tenia\ncomicos mechones  pelo rojo  cada lado   calva   gran sonrisa  payaso pintada\nnalrededor   boca si george  vivido anos despues habria pensado  ronald\nmcdonald    bozo   clarabell\n\n payaso tenia   mano  manojo  globos    colores  tentadora fruta\nmadura\n\n    barquito  papel  george\n\n— quieres  barquito georgie — payaso sonrela\n\ngeorge tambien sonrio  podia evitarlo aqguella sonrisa   tipo   devuelve \nquerer\n\n— supuesto\n\n payaso  echo  retr\n\n—« supuesto» iasi  gusta iasi  gusta ¢  globo ¢  parece ¢quieres  globo\n—bueno si  supuesto —alargo  mano   inmediato  retiro   voluntad— \ndebo coger    ofrezca  desconocido  dice  papa\n\n—  papa  mucha razon —replico  payaso   boca  tormenta sonriendo george \noregunto  podia haber creido   ojos  amarillos si    color azul brillante\nbailarin   ojos   mama   bill— muchisima razon   creo    voy \npresentarme george   senor bob gray tambien conocido  pennywise  payaso\nbailarin pennywise  presento  george denbrough george  presento  pennywise  ahora\n  conocemos     desconocido   tampoco ¢correcto\n\ngeorge solto  risita\n\n—correcto —volvio  estirar  mano   retirarla— ¢  metiste alli adentro\n\n— tormenta  trajo volaaaando —dijo pennywise  payaso bailarin—  llevo   circo\néno sientes olor  circo george\n\ngeorge  inclino hacia adelante ide pronto olia  cacahuetes icacahuetes tostados iy vinagre\nblanco    pone   patatas fritas   agujero   tapa  olia  algodon \nazucar  bunuelos  tambien leve  poderosamente  estiercol  animales salvajes olia \naroma regocijante  aserrin   embargo\n\n embargo bajo   olia  inundacion  hojas deshechas   oscuras sombras  bocas\n tormenta   olor humedo  putrido  olor  sotano\n\n   olores  mas fuertes\n\n—claro   huelo —dijo\n\n— quieres  barquito george —pregunto pennywise—   pregunto  vez  \npareces desearlo \nny  mostro  alto sonriendo llevaba  traje  seda abolsado  grandes botones color\nnaranja  corbata brillante  color azul electrico   derramaba   pechera  \nmanos llevaba grandes guantes blancos  mickey  donald\n\n—si claro —dijo george mirando dentro   boca  tormenta\n\n—  globo   rojos verdes amarillos azules\n\n—flotan\n\n—  si flotan — sonrisa  payaso  acentuo— oh si claro  si iflotan tambien \nalgodon  azucar\n\ngeorge estiro  mano\n\n payaso  sujeto  brazo\n\n entonces george vio   cara  payaso cambiaba\n\n  vio entonces  tan terrible   peor  habia imaginado   cosa  sotano\nparecia  dulce sueno   vio destruyo  cordura   zarpazo\n\n—flotan —croo  cosa   alcantarilla   voz  rela   coagulos\n\nsujetaba  brazo  george   puno grueso  agusanado tiro   hacia  horrible\noscuridad    agua corria  rugia  aullaba llevando hacia  mar  desechos  \ntormenta george estiro  cuello  apartarse   negrura definitiva  empezo  gritar hacia\n lluvia  gritar   loco hacia  gris cielo otonal   curvaba  derry aquel dia \notono    gritos  agudos  penetrantes    largo  toda  calle  gente \nasomo   ventanas   lanzo   porches\n\n—flotan —gruno  cosa— flotan georgie   estes aqui abajo conmigo  tambien\nflotaras\n\n hombro  george  clavo   cemento  bordillo dave gardener   dia \nhabia ido  trabajar  shoeboat debido   inundacion vio solo   nino  impermeable\namarillo  nino  gritaba   retorcia   arroyo mientras  agua lodosa  corria  \ncara haciendo   alaridos sonaran burbujeantes\n\n—aqul abajo  flota —susurro  voz podrida riendo   pronto sono  desgarro  \n destello  agonia  george denbrough   supo mas\n\ndave gardener   primero  llegar aunque llego solo cuarenta  cinco segundos despues\n primer grito george denbrough  habia muerto gardener  agarro   impermeable tiro\n   sacarlo   calle   girar   manos  cuerpo  george tambien  empezo \ngritar  lado izquierdo  impermeable  nino    rojo intenso  sangre flulia hacia\n alcantarilla   agujero  habia   brazo izquierdo  trozo  hueso\nhorriblemente brillante asomaba   tela rota\n\n ojos  nino miraban fijamente  cielo gris  mientras dave retrocedia  tropezones hacia\n    corrian   calle empezaron  llenarse  lluvia\n
tdm2 <- TermDocumentMatrix(cuerpo)
m2 <- as.matrix(tdm2) #cuenta las veces que aparece cada palabra

frecuencia2 <- sort(rowSums(m2), decreasing = TRUE) #cuenta la frecuencia de cada palabra en el texto completo

frecuencia_df2 <- data.frame(word=names(frecuencia2),
                            freq = frecuencia2) #convierte la frecuencia en un dataframe
ggplot(head(frecuencia_df2, 10), aes(x=reorder(word, -freq), y=freq)) +
  geom_bar(stat="identity", fill = "lightblue") + 
  geom_text(aes(label = freq), vjust =-0.5) +
  labs(title="TOP 10 palabras más frecuentes",
       subtitle="Sección del libro IT por Stephen King", x = "Palabra", y="Frecuencia") +
  ylim(0,35)

Nube de Palabras

#el procesamiento de datos antes de la nube de palabras es igual que el analisis de frecuencias, desde importar el texto hasta frecuencia_df
set.seed(123)
wordcloud(words=frecuencia_df2$word, freq=frecuencia_df2$freq, min.freq=2,
          random.order = FALSE, colors = brewer.pal(8, "Oranges"))

Conclusión

En conclusión, el text mining es una herramienta útil para analizar grandes cantidades de texto, permitiendo a las organizaciones extraer información relevante y tomar decisiones fundamentadas en datos no estructurados. Su capacidad para identificar patrones, tendencias y sentimientos ocultos lo convierte en una herramienta esencial en una amplia gama de campos, desde la comprensión del cliente hasta la detección de fraudes o en este caso el análisis de novelas.

LS0tCnRpdGxlOiAiVGV4dCBNaW5pbmciCmF1dGhvcjogIkxpc3NldCBIZXJuw6FuZGV6IEEwMTI4NDYxMSIKZGF0ZTogIjIwMjQtMDItMjYiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiBjb3NtbwotLS0KIVtdKC9jbG91ZC9wcm9qZWN0L3RleHRtaW5pbmcuZ2lmKQoKTGEgKiptaW5lcsOtYSBkZSB0ZXh0byoqIChUTSkgZXMgZWwgcHJvY2VzbyBkZSBleHRyYWVyIGluZm9ybWFjacOzbiDDunRpbCwgcGF0cm9uZXMgbyBjb25vY2ltaWVudG8gZGUgdGV4dG9zIG5vIGVzdHJ1Y3R1cmFkb3MuIAoKQ29uc3RhIGRlIHRyZXMgZXRhcGFzOgoxLiBPYnRlbmVyIGRhdG9zOiBFbCByZWNvbm9jaW1pZW50byDDs3B0aWNvIGRlIGNhcmFjdGVyZXMgKE9DUikgZXMgdW4gdGVjbm9sb2dpYSBxdWUgcGVybWl0ZSBjb252ZXJ0aXIgaW3DoWdlbmVzIGRlIHRleHRvIGVuIHRleHRvIGVkaXRhYmxlLlRhbWJpw6luIGVzIGNvbm9jaWRvIGNvbW8gKipleHRyYWNjacOzbiBkZSB0ZXh0byBkZSBpbcOhZ2VuZXMqKi4gIAoyLiBFeHBsb3JhciBkYXRvczogUmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIG8gdmlzYWwgZGUgbG9zIGRhdG9zIHBhcmEgc3UgaW50ZXJwcmV0YWNpw7NuLiBMb3MgbcOpdG9kb3MgbcOhcyBjb211bmVzIHNvbiBlbCBBbsOhbGlzaXMgZGUgU2VudGltaWVudG9zLCBsYSBOdWJlIGRlIFBhbGFicmFzIHkgZWwgVG9waWMgTW9kZWxpbmcuICAKMy4gQW7DoWxpc2lzIHByZWRpY3Rpdm86IFNvbiBsYXMgdMOpY25pY2FzIHkgbW9kZWxvIGVzdGFkw61zdGljb3MgcGFyYSBwcmVkZWNpciByZXN1bHRhZG9zIGZ1dHVyb3MuIExvcyBtb2RlbG9zIG3DoXMgdXNhZG9zIHNvbiBlbCBSYW5kb20gRm9yZXN0LCByZWRlcyBuZXVyb25hbGVzIHkgcmVncmVzaW9uZXMuICAKCgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpICNtYW5lam8sIGV4dHJhZXIsIHJlc3VtaXIgdGFibGFzCmxpYnJhcnkodGlkeXZlcnNlKQoKI2luc3RhbGwucGFja2FnZXMoInRlc3NlcmFjdCIpICNPQ1IgLSBzYWNhIGVsIHRleHRvIGRlIGltYWdlbmVzCmxpYnJhcnkodGVzc2VyYWN0KQoKI2luc3RhbGwucGFja2FnZXMoIm1hZ2ljayIpICNQTkcKbGlicmFyeShtYWdpY2spCgojaW5zdGFsbC5wYWNrYWdlcygib2ZmaWNlciIpICNFeHBvcnRhciBlbiBmb3JtYXRvcyBxdWUgc29uIGRlIE9mZmljZSh3b3JkKQpsaWJyYXJ5KG9mZmljZXIpCgojaW5zdGFsbC5wYWNrYWdlcygicGRmdG9vbHMiKSAjTGVlciBQREZzCmxpYnJhcnkocGRmdG9vbHMpCgojaW5zdGFsbC5wYWNrYWdlcygicHVycnIiKSAjUGFyYSBsYSBmdW5jacOzbiBkZSAibWFwIiBwYXJhIGFwbGljYXIgdW5hIGZ1bmNpw7NuIGEgY2FkYSBlbGVtZW50byBkZSB1biB2ZWN0b3IKbGlicmFyeShwdXJycikKCiNpbnN0YWxsLnBhY2thZ2VzKCJ0bSIpICN0ZXh0IG1pbmluZwpsaWJyYXJ5KHRtKQoKI2luc3RhbGwucGFja2FnZXMoIlJDb2xvckJyZXdlciIpICNjb2xvcmVzCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKI2luc3RhbGwucGFja2FnZXMoIndvcmRjbG91ZCIpICNudWJlIGRlIHBhbGFicmFzCmxpYnJhcnkod29yZGNsb3VkKQoKI2luc3RhbGwucGFja2FnZXMoInRvcGljbW9kZWxzIikgCmxpYnJhcnkodG9waWNtb2RlbHMpCgojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgoKIyAxLiBPYnRlbmVyIERhdG9zIG1lZGlhbnRlIE9DUgpgYGB7cn0KaW1hZ2VuMSA8LSBpbWFnZV9yZWFkKCIvY2xvdWQvcHJvamVjdC9pbWFnZW4xLlBORyIpCnRleHRvMSA8LSBvY3IoaW1hZ2VuMSkKdGV4dG8xCmRvYzEgPC0gcmVhZF9kb2N4KCkgI2NyZWFyIHVuIGRvY3VtZW50byBibGFuY28gZGUgd29yZApkb2MxIDwtIGRvYzEgJT4lIGJvZHlfYWRkX3Bhcih0ZXh0bzEsIHN0eWxlID0gIk5vcm1hbCIpICNhZ3JlZ2EgZWwgdGV4dG8gZW4gZWwgd29yZAoKI3ByaW50KGRvYzEsIHRhcmdldD0idGV4dG8xLmRvY3giKSAjZ3VhcmRhciBlbCBkb2MgZW4gbGEgY29tcHV0YWRvcmEKYGBgCgojIyBJbWFnZW4gYSB0ZXh0byBlbiBlc3Bhw7FvbAoKW10oaHR0cHM6Ly90ZXNzZXJhY3Qtb2NyLmdpdGh1Yi5pby90ZXNzZG9jL0RhdGEtRmlsZXMtaW4tZGlmZmVyZW50LXZlcnNpb25zLmh0bWwpCmBgYHtyfQppbWFnZW4yIDwtIGltYWdlX3JlYWQoIi9jbG91ZC9wcm9qZWN0L2ltYWdlbjIuUE5HIikKI3Rlc3NlcmFjdF9kb3dubG9hZCgic3BhIikKCgp0ZXh0bzIgPC0gb2NyKGltYWdlbjIpCnRleHRvMgoKZG9jMiA8LSByZWFkX2RvY3goKSAjY3JlYXIgdW4gZG9jdW1lbnRvIGJsYW5jbyBkZSB3b3JkCmRvYzIgPC0gZG9jMiAlPiUgYm9keV9hZGRfcGFyKHRleHRvMiwgc3R5bGUgPSAiTm9ybWFsIikgI2FncmVnYSBlbCB0ZXh0byBlbiBlbCB3b3JkCgpwcmludChkb2MyLCB0YXJnZXQ9InRleHRvMi5kb2N4IikKYGBgCgojIyBEZSBQREYgYSB0ZXh0byBlbiBXb3JkCgpgYGB7cn0KI3BkZjEgPC0gcGRmX2NvbnZlcnQoIi9jbG91ZC9wcm9qZWN0L3BkZjEucGRmIiwgZHBpPTYwMCkgJT4lIG1hcChvY3IpCmBgYAoKIyBBY3RpdmlkYWQgMS4gTm92ZWxhIElUCmBgYHtyfQpwZGYyIDwtIHBkZl9jb252ZXJ0KCIvY2xvdWQvcHJvamVjdC9lc28zLnBkZiIsIGRwaT02MDApICU+JSBtYXAob2NyKQoKYGBgCmBgYHtyfQppdDEgPC0gaW1hZ2VfcmVhZCgiL2Nsb3VkL3Byb2plY3QvZXNvM18xLnBuZyIpCml0MiA8LSBpbWFnZV9yZWFkKCIvY2xvdWQvcHJvamVjdC9lc28zXzIucG5nIikKCmBgYAoKYGBge3J9CmNvbWJpbmVkIDwtIHVubGlzdChwZGYyKSAlPiUgcGFzdGUoY29sbGFwc2UgPSAiL24iKQpgYGAKCmBgYHtyfQpkb2NfaXQgPC0gcmVhZF9kb2N4KCkgI2NyZWFyIHVuIGRvY3VtZW50byBibGFuY28gZGUgd29yZApkb2NfaXQgPC0gZG9jX2l0ICU+JSBib2R5X2FkZF9wYXIoY29tYmluZWQsIHN0eWxlID0gIk5vcm1hbCIpICNhZ3JlZ2EgZWwgdGV4dG8gZW4gZWwgd29yZAoKcHJpbnQoZG9jX2l0LCB0YXJnZXQ9InRleHRvX2l0LmRvY3giKQpgYGAKCiMgMi4gRXhwbG9yYWNpw7NuIGRlIERhdG9zCgojIyBBbsOhbGlzaXMgZGUgRnJlY3VlbmNpYQpgYGB7cn0KdGV4dCA8LSByZWFkTGluZXMoImh0dHA6Ly93d3cuc3RoZGEuY29tL3N0aGRhL1JEb2MvZXhhbXBsZS1maWxlcy9tYXJ0aW4tbHV0aGVyLWtpbmctaS1oYXZlLWEtZHJlYW0tc3BlZWNoLnR4dCIpCmBgYAoKYGBge3J9CmNvcnB1cyA8LSBDb3JwdXMoVmVjdG9yU291cmNlKHRleHQpKSAjUG9uZSBjYWRhIG9yYWNpw7NuIGVuIHVuIHJlY3Rhbmd1bG8gZGUgdmVjdG9yCiNpbnNwZWN0KGNvcnB1cykgCmBgYAoKYGBge3J9CmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKSAjcG9uZSB0b2RvIGVuIG1pbnVzY3VsYXMKCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVQdW5jdHVhdGlvbikgI2VsaW1pbmEgc2lnbm9zIGRlIHB1bnR1YWNpw7NuCgpjb3BydXMgPC0gdG1fbWFwKGNvcnB1cywgcmVtb3ZlTnVtYmVycykgI2VsaW1pbmEgbsO6bWVyb3MKCmNvcnB1cyA8LSB0bV9tYXAoY29ycHVzLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJlbiIpKSAjZWxpbWluYSBsb3Mgc3RvcHdvcmRzIChhLCBhbiwgdGhlLCBldGMpCgojY29ycHVzIDwtIHRtX21hcChjb3JwdXMsIHJlbW92ZVdvcmRzLCBjKCJwYWxhYnJhIikpICNlbGltaW5hIHVuYSBwYWxhYnJhIGVuIGVzcGVjaWZpY2EKCmluc3BlY3QoY29ycHVzKQpgYGAKCmBgYHtyfQp0ZG0gPC0gVGVybURvY3VtZW50TWF0cml4KGNvcnB1cykKbSA8LSBhcy5tYXRyaXgodGRtKSAjY3VlbnRhIGxhcyB2ZWNlcyBxdWUgYXBhcmVjZSBjYWRhIHBhbGFicmEKCmZyZWN1ZW5jaWEgPC0gc29ydChyb3dTdW1zKG0pLCBkZWNyZWFzaW5nID0gVFJVRSkgI2N1ZW50YSBsYSBmcmVjdWVuY2lhIGRlIGNhZGEgcGFsYWJyYSBlbiBlbCB0ZXh0byBjb21wbGV0bwoKZnJlY3VlbmNpYV9kZiA8LSBkYXRhLmZyYW1lKHdvcmQ9bmFtZXMoZnJlY3VlbmNpYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxID0gZnJlY3VlbmNpYSkgI2NvbnZpZXJ0ZSBsYSBmcmVjdWVuY2lhIGVuIHVuIGRhdGFmcmFtZQpgYGAKCgpgYGB7cn0KZ2dwbG90KGhlYWQoZnJlY3VlbmNpYV9kZiwgMTApLCBhZXMoeD1yZW9yZGVyKHdvcmQsIC1mcmVxKSwgeT1mcmVxKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbCA9ICJsaWdodGJsdWUiKSArIAogIGdlb21fdGV4dChhZXMobGFiZWwgPSBmcmVxKSwgdmp1c3QgPS0wLjUpICsKICBsYWJzKHRpdGxlPSJUT1AgMTAgcGFsYWJyYXMgbcOhcyBmcmVjdWVudGVzIiwKICAgICAgIHN1YnRpdGxlPSJEaXNjdXJzbyAnSSBoYXZlIGEgRHJlYW0nIGRlIE0uTC4gS2luZyIsIHggPSAiUGFsYWJyYSIsIHk9IkZyZWN1ZW5jaWEiKSArCiAgeWxpbSgwLDIwKQogIApgYGAKCgojIyBOdWJlIGRlIFBhbGFicmFzCmBgYHtyfQojZWwgcHJvY2VzYW1pZW50byBkZSBkYXRvcyBhbnRlcyBkZSBsYSBudWJlIGRlIHBhbGFicmFzIGVzIGlndWFsIHF1ZSBlbCBhbmFsaXNpcyBkZSBmcmVjdWVuY2lhcywgZGVzZGUgaW1wb3J0YXIgZWwgdGV4dG8gaGFzdGEgZnJlY3VlbmNpYV9kZgpzZXQuc2VlZCgxMjMpCndvcmRjbG91ZCh3b3Jkcz1mcmVjdWVuY2lhX2RmJHdvcmQsIGZyZXE9ZnJlY3VlbmNpYV9kZiRmcmVxLCBtaW4uZnJlcT0yLAogICAgICAgICAgcmFuZG9tLm9yZGVyID0gRkFMU0UsIGNvbG9ycyA9IGJyZXdlci5wYWwoOCwgIk9yYW5nZXMiKSkKCgpgYGAKCgojIyBFamVyY2ljaW8gMi4gTm92ZWxhIElUCmBgYHtyfQoKY3VlcnBvIDwtIENvcnB1cyhWZWN0b3JTb3VyY2UoY29tYmluZWQpKSAjUG9uZSBjYWRhIG9yYWNpw7NuIGVuIHVuIHJlY3Rhbmd1bG8gZGUgdmVjdG9yCiNpbnNwZWN0KGNvcnB1cykgCmBgYAoKYGBge3J9CmN1ZXJwbyA8LSB0bV9tYXAoY3VlcnBvLCBjb250ZW50X3RyYW5zZm9ybWVyKHRvbG93ZXIpKSAjcG9uZSB0b2RvIGVuIG1pbnVzY3VsYXMKCmN1ZXJwbyA8LSB0bV9tYXAoY3VlcnBvLCByZW1vdmVQdW5jdHVhdGlvbikgI2VsaW1pbmEgc2lnbm9zIGRlIHB1bnR1YWNpw7NuCgpjdWVycG8gPC0gdG1fbWFwKGN1ZXJwbywgcmVtb3ZlTnVtYmVycykgI2VsaW1pbmEgbsO6bWVyb3MKCmN1ZXJwbyA8LSB0bV9tYXAoY3VlcnBvLCByZW1vdmVXb3Jkcywgc3RvcHdvcmRzKCJzcGFuaXNoIikpICNlbGltaW5hIGxvcyBzdG9wd29yZHMgKGEsIGFuLCB0aGUsIGV0YykKCmN1ZXJwbyA8LSB0bV9tYXAoY3VlcnBvLCByZW1vdmVXb3JkcywgYygi4oCUIikpCgppbnNwZWN0KGN1ZXJwbykKYGBgCgpgYGB7cn0KdGRtMiA8LSBUZXJtRG9jdW1lbnRNYXRyaXgoY3VlcnBvKQptMiA8LSBhcy5tYXRyaXgodGRtMikgI2N1ZW50YSBsYXMgdmVjZXMgcXVlIGFwYXJlY2UgY2FkYSBwYWxhYnJhCgpmcmVjdWVuY2lhMiA8LSBzb3J0KHJvd1N1bXMobTIpLCBkZWNyZWFzaW5nID0gVFJVRSkgI2N1ZW50YSBsYSBmcmVjdWVuY2lhIGRlIGNhZGEgcGFsYWJyYSBlbiBlbCB0ZXh0byBjb21wbGV0bwoKZnJlY3VlbmNpYV9kZjIgPC0gZGF0YS5mcmFtZSh3b3JkPW5hbWVzKGZyZWN1ZW5jaWEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXEgPSBmcmVjdWVuY2lhMikgI2NvbnZpZXJ0ZSBsYSBmcmVjdWVuY2lhIGVuIHVuIGRhdGFmcmFtZQpgYGAKCgpgYGB7cn0KZ2dwbG90KGhlYWQoZnJlY3VlbmNpYV9kZjIsIDEwKSwgYWVzKHg9cmVvcmRlcih3b3JkLCAtZnJlcSksIHk9ZnJlcSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGZpbGwgPSAibGlnaHRibHVlIikgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHZqdXN0ID0tMC41KSArCiAgbGFicyh0aXRsZT0iVE9QIDEwIHBhbGFicmFzIG3DoXMgZnJlY3VlbnRlcyIsCiAgICAgICBzdWJ0aXRsZT0iU2VjY2nDs24gZGVsIGxpYnJvIElUIHBvciBTdGVwaGVuIEtpbmciLCB4ID0gIlBhbGFicmEiLCB5PSJGcmVjdWVuY2lhIikgKwogIHlsaW0oMCwzNSkKICAKYGBgCgoKIyMgTnViZSBkZSBQYWxhYnJhcwpgYGB7cn0KI2VsIHByb2Nlc2FtaWVudG8gZGUgZGF0b3MgYW50ZXMgZGUgbGEgbnViZSBkZSBwYWxhYnJhcyBlcyBpZ3VhbCBxdWUgZWwgYW5hbGlzaXMgZGUgZnJlY3VlbmNpYXMsIGRlc2RlIGltcG9ydGFyIGVsIHRleHRvIGhhc3RhIGZyZWN1ZW5jaWFfZGYKc2V0LnNlZWQoMTIzKQp3b3JkY2xvdWQod29yZHM9ZnJlY3VlbmNpYV9kZjIkd29yZCwgZnJlcT1mcmVjdWVuY2lhX2RmMiRmcmVxLCBtaW4uZnJlcT0yLAogICAgICAgICAgcmFuZG9tLm9yZGVyID0gRkFMU0UsIGNvbG9ycyA9IGJyZXdlci5wYWwoOCwgIk9yYW5nZXMiKSkKCmBgYAoKCiAgCiMgQ29uY2x1c2nDs24KRW4gY29uY2x1c2nDs24sIGVsIHRleHQgbWluaW5nIGVzIHVuYSBoZXJyYW1pZW50YSDDunRpbCBwYXJhIGFuYWxpemFyIGdyYW5kZXMgY2FudGlkYWRlcyBkZSB0ZXh0bywgcGVybWl0aWVuZG8gYSBsYXMgb3JnYW5pemFjaW9uZXMgZXh0cmFlciBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHkgdG9tYXIgZGVjaXNpb25lcyBmdW5kYW1lbnRhZGFzIGVuIGRhdG9zIG5vIGVzdHJ1Y3R1cmFkb3MuIFN1IGNhcGFjaWRhZCBwYXJhIGlkZW50aWZpY2FyIHBhdHJvbmVzLCB0ZW5kZW5jaWFzIHkgc2VudGltaWVudG9zIG9jdWx0b3MgbG8gY29udmllcnRlIGVuIHVuYSBoZXJyYW1pZW50YSBlc2VuY2lhbCBlbiB1bmEgYW1wbGlhIGdhbWEgZGUgY2FtcG9zLCBkZXNkZSBsYSBjb21wcmVuc2nDs24gZGVsIGNsaWVudGUgaGFzdGEgbGEgZGV0ZWNjacOzbiBkZSBmcmF1ZGVzIG8gZW4gZXN0ZSBjYXNvIGVsIGFuw6FsaXNpcyBkZSBub3ZlbGFzLgo=