Cálculo de Pobreza por Línea
En esta clase abordaremos conceptos teóricos y definiciones metodológicas de la medición “indirecta” de la pobreza, a través del metodo usualmente conococido como “Porbreza por Línea”, acorde a la Metodología n° 22 de INDEC.
Luego, procederemos a realizar una estimación de la incidencia de la pobreza e indigencia por personas.
Conceptos a abordar:
- Medición indirecta de la satisfacción de necesidades básicas
- Umbral de necesidades energéticas y proteicas
- Unidades de Adulto Equivalente
- Composición de la canasta básica alimentaria (Diferenciación regional)
- Población de Referencia
- Coeficiente de Engel
- Canasta Básica Total
- Pobreza como fenómeno del hogar
- Ingreso total familiar
Reiniciar R
Cargamos las librerías necesarias para realizar este ejercicio
library(tidyverse, warn = FALSE)
[30m── [1mAttaching packages[22m ──────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──[39m
[30m[32m✔[30m [34mggplot2[30m 3.0.0 [32m✔[30m [34mpurrr [30m 0.2.5
[32m✔[30m [34mtibble [30m 1.4.2 [32m✔[30m [34mdplyr [30m 0.7.6
[32m✔[30m [34mtidyr [30m 0.8.1 [32m✔[30m [34mstringr[30m 1.3.1
[32m✔[30m [34mreadr [30m 1.1.1 [32m✔[30m [34mforcats[30m 0.3.0[39m
[30m── [1mConflicts[22m ─────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
library(openxlsx, warn = FALSE)
Aprovechando la facilidad que presenta el R para trabajar con multiples bases de datos, realizaremos la estimación de la incidencia para 2 trimestres consecutivos. Previo a levantar las bases, definimos un vector que contiene las variables relevantes para el ejercicio. Luego a la hora de levantar aplicamos un select al *dataframe** para conservar solo estas variables. Finalmente, para realizar la estimación conjunta de los dos trimestres, unimos ambas bases de datos
var.ind <- c('CODUSU','NRO_HOGAR' ,'COMPONENTE','ANO4','TRIMESTRE','REGION',
'AGLOMERADO', 'PONDERA', 'CH04', 'CH06', 'ITF', 'PONDIH','P21')
individual.316 <- read.table("../Fuentes/usu_individual_t316.txt", sep=";", dec=",", header = TRUE, fill = TRUE) %>%
select(var.ind)
individual.416 <- read.table("../Fuentes/usu_individual_t416.txt", sep=";", dec=",", header = TRUE, fill = TRUE) %>%
select(var.ind)
Bases <- bind_rows(individual.316,individual.416)
A su vez levantaremos las siguientes fuentes secundarias:
- Unidades de Adulto equivalente según sexo y edad
- Canasta Básica Alimentaria Regionales de cada una de las regiones
- Canasta Básica Total Regionales de cada una de las regiones
- Diccionario de códigos de regiones y aglomerados de EPH
La información de estos cuadros fue extraída del comunicado de pobreza.
Adequi <- read.xlsx("../Fuentes/ADEQUI.xlsx")
CBA <- read.xlsx("../Fuentes/CANASTAS.xlsx",sheet = "CBA")
CBT <- read.xlsx("../Fuentes/CANASTAS.xlsx",sheet = "CBT")
dic.regiones <- read.xlsx("../Fuentes/Regiones.xlsx")
CBT
CBA
Adequi
dic.regiones
Canastas Trimestrales por Region
Dado que en las bases de microdatos de EPH no se publica el mes correspondiente a cada uno de los registros individuales, las estimación de pobreza que pueden realizar los usuarios necesariamente debe ser a partir de canastas trimestrales.
Para ello, a partir de los datos mensuales de la Canasta Básica Alimentaria y Total publicados por INDEC, calculamos un valor trimestral de ambas canastas, para un Adulto Equivalente perteneciente a cada una de las regiones. A vez, necesitaremos una tabla que pueda unirse con la base de datos de la EPH para asignar a cada registro, su canasta correspondiente (acorde al trimestre y a la región).
CBA <- CBA %>%
mutate(Canasta = 'CBA')
CBT <- CBT %>%
mutate(Canasta = 'CBT')
Canastas_Reg <- bind_rows(CBA,CBT) %>%
gather(.,Region, Valor, c(3:(ncol(.)-1) )) %>%
mutate(Trimestre = case_when(Mes %in% c(1:3) ~1,
Mes %in% c(4:6) ~2,
Mes %in% c(7:9) ~3,
Mes %in% c(10:12) ~4),
Periodo = paste(Año, Trimestre, sep='.'))
Canastas_Reg
Habiendo agregado el identificador del período, promediamos las canastas de un mismo trimestre y luego le agregamos el código de la region correspondiente que nos permitirá unir este Dataframe con la base de microdatos de la EPH
Canastas_Reg_2 <- Canastas_Reg %>%
group_by(Canasta, Region, Periodo) %>%
summarise(Valor = mean(Valor)) %>%
spread(., Canasta,Valor) %>%
left_join(., dic.regiones, by = "Region") %>%
ungroup()
Canastas_Reg_2
Unidades de Adulto Equivalente por hogar en la base Individual
- Incorporamos a cada registro de nuestra base la Unidad de Adulto Equivalente (UAE) correspondiente, matcheando las columnas de Edad (CH06) y Sexo (CH04) mediante la función left_join.
Pobreza_Individual <- Bases %>%
mutate(Periodo = paste(ANO4, TRIMESTRE, sep='.')) %>%
left_join(., Adequi, by = c("CH04", "CH06")) %>%
left_join(., Canastas_Reg_2, by = c("REGION", "Periodo"))
Pobreza_Individual
- Utilizamos la función group_by para calcular el total de UAE por hogar. Notesé que al usar la función mutate creamos una nueva columna, permitiendo conservar la dimensión individual de la base.
Pobreza_Individual_paso2 <- Pobreza_Individual %>%
group_by(CODUSU, NRO_HOGAR, Periodo) %>%
mutate(Adequi_hogar = sum(adequi)) %>%
ungroup()
Pobreza_Individual_paso2
- En base a las UAE del hogar al que pertenece cada individuo calculamos el valor de las canastas que delimitan las lineas de pobreza e indigencia correspondientes.
- Realizamos la comparación lógica entre el Ingreso Total Familiar y las Canastas calculadas para asignar a cada individuo su “situación” mediante la función case_when.
Pobreza_Individual_paso3 <- Pobreza_Individual_paso2 %>%
mutate(CBA = CBA*Adequi_hogar,
CBT = CBT*Adequi_hogar,
Situacion = case_when(ITF<CBA ~ 'Indigente',
ITF>=CBA & ITF<CBT ~ 'Pobre',
ITF>=CBT ~ 'No.Pobre'))
Pobreza_Individual_paso3
Cálculo de Tasas de Pobreza e Indigencia
Habiendo identificado a cada persona como pobre, indigente o no pobre el paso final para calcular la incidencia de la pobreza e indigencia requiere realizar un conteo de estos casos (Para lo cual se requiere sumar los ponderadores (PONDIH) de los registros que cumplen con una u otroa condición)
Pobreza_resumen <- Pobreza_Individual_paso3 %>%
group_by(Periodo) %>%
summarise(Tasa_pobreza = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE),
Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE))
Pobreza_resumen
En caso de querer calcular la pobreza para otros subgrupos poblacionales, simplemente se requiere replicar el cálculo con la tabla agrupada según la variable de interés
Pobreza_resumen_region <- Pobreza_Individual_paso3 %>%
group_by(Periodo,Region) %>%
summarise(Tasa_pobreza = sum(PONDIH[Situacion %in% c('Pobre', 'Indigente')],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE),
Tasa_indigencia = sum(PONDIH[Situacion == 'Indigente'],na.rm = TRUE)/
sum(PONDIH,na.rm = TRUE))
Pobreza_resumen_region
LS0tCnRpdGxlOiAiVXRpbGl6YWNpw7NuIGRlbCBsZW5ndWFqZSBSIHBhcmEgYXBsaWNhY2nDs24gZW4gbGEgRW5jdWVzdGEgUGVybWFuZW50ZSBkZSBIb2dhcmVzIgpzdWJ0aXRsZTogIkNsYXNlIDMuIFBvYnJlemEgZSBJbmRpZ2VuY2lhLiIKZGF0ZTogIjA2LzEwLzIwMTgiCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlIAotLS0KKkxhcyBub3RhcyBkZWwgcHJlc2VudGUgY3Vyc28gZnVlcm9uIGVsYWJvcmFkYXMgb3JpZ2luYWxtZW50ZSBwb3IgRGllZ28gS296bG93c2tpIHkgR3VpZG8gV2Vrc2xlci4gRW4gbGFzIHN1Y2VzaXZhcyBtb2RpZmljYWNpb25lcyBjb2xhYm9yYXJvbjogTmF0c3VtaSBTaG9raWRhIHkgTWF0w61hcyBMaW9uaSouCgojIEPDoWxjdWxvIGRlIFBvYnJlemEgcG9yIEzDrW5lYQoKRW4gZXN0YSBjbGFzZSBhYm9yZGFyZW1vcyBjb25jZXB0b3MgdGXDs3JpY29zIHkgZGVmaW5pY2lvbmVzIG1ldG9kb2zDs2dpY2FzIGRlIGxhIG1lZGljacOzbiAiaW5kaXJlY3RhIiBkZSBsYSBwb2JyZXphLCBhIHRyYXbDqXMgZGVsIG1ldG9kbyB1c3VhbG1lbnRlIGNvbm9jb2NpZG8gY29tbyAiUG9yYnJlemEgcG9yIEzDrW5lYSIsIGFjb3JkZSBhIGxhIFtNZXRvZG9sb2fDrWEgbsKwIDIyIGRlIElOREVDXShodHRwczovL3d3dy5pbmRlYy5nb2IuYXIvZnRwL2N1YWRyb3Mvc29jaWVkYWQvRVBIX21ldG9kb2xvZ2lhXzIyX3BvYnJlemEucGRmXSkuICAKTHVlZ28sIHByb2NlZGVyZW1vcyBhIHJlYWxpemFyIHVuYSBlc3RpbWFjacOzbiBkZSBsYSBpbmNpZGVuY2lhIGRlIGxhIHBvYnJlemEgZSBpbmRpZ2VuY2lhIHBvciBwZXJzb25hcy4KCkNvbmNlcHRvcyBhIGFib3JkYXI6ICAKICAKICAtIE1lZGljacOzbiBpbmRpcmVjdGEgZGUgbGEgc2F0aXNmYWNjacOzbiBkZSBuZWNlc2lkYWRlcyBiw6FzaWNhcwogIC0gVW1icmFsIGRlIG5lY2VzaWRhZGVzIGVuZXJnw6l0aWNhcyB5IHByb3RlaWNhcwogIC0gVW5pZGFkZXMgZGUgQWR1bHRvIEVxdWl2YWxlbnRlCiAgLSBDb21wb3NpY2nDs24gZGUgbGEgY2FuYXN0YSBiw6FzaWNhIGFsaW1lbnRhcmlhIChEaWZlcmVuY2lhY2nDs24gcmVnaW9uYWwpCiAgLSBQb2JsYWNpw7NuIGRlIFJlZmVyZW5jaWEKICAtIENvZWZpY2llbnRlIGRlIEVuZ2VsCiAgLSBDYW5hc3RhIELDoXNpY2EgVG90YWwKICAtIFBvYnJlemEgY29tbyBmZW7Ds21lbm8gZGVsIGhvZ2FyCiAgLSBJbmdyZXNvIHRvdGFsIGZhbWlsaWFyCiAgCgo+IFJlaW5pY2lhciBSCgoKQ2FyZ2Ftb3MgbGFzIGxpYnJlcsOtYXMgbmVjZXNhcmlhcyBwYXJhIHJlYWxpemFyIGVzdGUgZWplcmNpY2lvCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSwgd2FybiA9IEZBTFNFKQpsaWJyYXJ5KG9wZW54bHN4LCB3YXJuID0gRkFMU0UpCmBgYAoKQXByb3ZlY2hhbmRvIGxhIGZhY2lsaWRhZCBxdWUgcHJlc2VudGEgZWwgUiBwYXJhIHRyYWJhamFyIGNvbiBtdWx0aXBsZXMgYmFzZXMgZGUgZGF0b3MsIHJlYWxpemFyZW1vcyBsYSBlc3RpbWFjacOzbiBkZSBsYSBpbmNpZGVuY2lhIHBhcmEgMiB0cmltZXN0cmVzIGNvbnNlY3V0aXZvcy4gUHJldmlvIGEgbGV2YW50YXIgbGFzIGJhc2VzLCBkZWZpbmltb3MgdW4gdmVjdG9yIHF1ZSBjb250aWVuZSBsYXMgdmFyaWFibGVzIHJlbGV2YW50ZXMgcGFyYSBlbCBlamVyY2ljaW8uIEx1ZWdvIGEgbGEgaG9yYSBkZSBsZXZhbnRhciBhcGxpY2Ftb3MgdW4gKipzZWxlY3QqKiBhbCAqZGF0YWZyYW1lKiogcGFyYSBjb25zZXJ2YXIgc29sbyBlc3RhcyB2YXJpYWJsZXMuIEZpbmFsbWVudGUsIHBhcmEgcmVhbGl6YXIgbGEgZXN0aW1hY2nDs24gY29uanVudGEgZGUgbG9zIGRvcyB0cmltZXN0cmVzLCB1bmltb3MgYW1iYXMgYmFzZXMgZGUgZGF0b3MKCmBgYHtyLHdhcm5pbmc9RkFMU0V9CnZhci5pbmQgPC0gYygnQ09EVVNVJywnTlJPX0hPR0FSJyAsJ0NPTVBPTkVOVEUnLCdBTk80JywnVFJJTUVTVFJFJywnUkVHSU9OJywKICAgICAgICAgICAgICdBR0xPTUVSQURPJywgJ1BPTkRFUkEnLCAnQ0gwNCcsICdDSDA2JywgJ0lURicsICdQT05ESUgnLCdQMjEnKQoKaW5kaXZpZHVhbC4zMTYgPC0gcmVhZC50YWJsZSgiLi4vRnVlbnRlcy91c3VfaW5kaXZpZHVhbF90MzE2LnR4dCIsIHNlcD0iOyIsIGRlYz0iLCIsIGhlYWRlciA9IFRSVUUsIGZpbGwgPSBUUlVFKSAlPiUgCiAgc2VsZWN0KHZhci5pbmQpCmluZGl2aWR1YWwuNDE2IDwtIHJlYWQudGFibGUoIi4uL0Z1ZW50ZXMvdXN1X2luZGl2aWR1YWxfdDQxNi50eHQiLCBzZXA9IjsiLCBkZWM9IiwiLCBoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkgJT4lIAogIHNlbGVjdCh2YXIuaW5kKQoKQmFzZXMgPC0gYmluZF9yb3dzKGluZGl2aWR1YWwuMzE2LGluZGl2aWR1YWwuNDE2KQoKYGBgCgoKQSBzdSB2ZXogbGV2YW50YXJlbW9zIGxhcyBzaWd1aWVudGVzIGZ1ZW50ZXMgc2VjdW5kYXJpYXM6ICAgICAgICAgCgogLSAgVW5pZGFkZXMgZGUgQWR1bHRvIGVxdWl2YWxlbnRlIHNlZ8O6biBzZXhvIHkgZWRhZCAKIC0gIENhbmFzdGEgQsOhc2ljYSBBbGltZW50YXJpYSBSZWdpb25hbGVzIGRlIGNhZGEgdW5hIGRlIGxhcyByZWdpb25lcyAKIC0gIENhbmFzdGEgQsOhc2ljYSBUb3RhbCBSZWdpb25hbGVzIGRlIGNhZGEgdW5hIGRlIGxhcyByZWdpb25lcyAKIC0gIERpY2Npb25hcmlvIGRlIGPDs2RpZ29zIGRlIHJlZ2lvbmVzIHkgYWdsb21lcmFkb3MgZGUgRVBIICAgICAgICAgCiAKTGEgaW5mb3JtYWNpw7NuIGRlIGVzdG9zIGN1YWRyb3MgZnVlIGV4dHJhw61kYSBkZWwgW2NvbXVuaWNhZG8gZGUgcG9icmV6YV0oaHR0cDovL3d3dy5pbmRlYy5nb2IuYXIvdXBsb2Fkcy9pbmZvcm1lc2RlcHJlbnNhL2VwaF9wb2JyZXphXzAyXzE2LnBkZikuCgpgYGB7cn0KQWRlcXVpIDwtIHJlYWQueGxzeCgiLi4vRnVlbnRlcy9BREVRVUkueGxzeCIpCkNCQSAgICA8LSByZWFkLnhsc3goIi4uL0Z1ZW50ZXMvQ0FOQVNUQVMueGxzeCIsc2hlZXQgPSAiQ0JBIikKQ0JUICAgIDwtIHJlYWQueGxzeCgiLi4vRnVlbnRlcy9DQU5BU1RBUy54bHN4IixzaGVldCA9ICJDQlQiKQpkaWMucmVnaW9uZXMgPC0gcmVhZC54bHN4KCIuLi9GdWVudGVzL1JlZ2lvbmVzLnhsc3giKQoKQ0JUCkNCQQpBZGVxdWkKZGljLnJlZ2lvbmVzCmBgYAoKIyMgQ2FuYXN0YXMgVHJpbWVzdHJhbGVzIHBvciBSZWdpb24KRGFkbyBxdWUgZW4gbGFzIGJhc2VzIGRlIG1pY3JvZGF0b3MgZGUgRVBIIG5vIHNlIHB1YmxpY2EgZWwgbWVzIGNvcnJlc3BvbmRpZW50ZSBhIGNhZGEgdW5vIGRlIGxvcyByZWdpc3Ryb3MgaW5kaXZpZHVhbGVzLCBsYXMgZXN0aW1hY2nDs24gZGUgcG9icmV6YSBxdWUgcHVlZGVuIHJlYWxpemFyIGxvcyB1c3VhcmlvcyBuZWNlc2FyaWFtZW50ZSBkZWJlIHNlciBhIHBhcnRpciBkZSAqKmNhbmFzdGFzIHRyaW1lc3RyYWxlcyoqLgoKUGFyYSBlbGxvLCBhIHBhcnRpciBkZSBsb3MgZGF0b3MgbWVuc3VhbGVzIGRlIGxhIENhbmFzdGEgQsOhc2ljYSBBbGltZW50YXJpYSB5IFRvdGFsIHB1YmxpY2Fkb3MgcG9yIElOREVDLCBjYWxjdWxhbW9zIHVuIHZhbG9yIHRyaW1lc3RyYWwgZGUgYW1iYXMgY2FuYXN0YXMsIHBhcmEgdW4gQWR1bHRvIEVxdWl2YWxlbnRlIHBlcnRlbmVjaWVudGUgYSBjYWRhIHVuYSBkZSBsYXMgcmVnaW9uZXMuIEEgdmV6LCBuZWNlc2l0YXJlbW9zIHVuYSB0YWJsYSBxdWUgcHVlZGEgX3VuaXJzZV8gY29uIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgRVBIIHBhcmEgYXNpZ25hciBhIGNhZGEgcmVnaXN0cm8sIHN1IGNhbmFzdGEgY29ycmVzcG9uZGllbnRlIChhY29yZGUgYWwgdHJpbWVzdHJlIHkgYSBsYSByZWdpw7NuKS4gCgpgYGB7cn0KQ0JBIDwtIENCQSAlPiUgCiAgbXV0YXRlKENhbmFzdGEgPSAnQ0JBJykKCkNCVCA8LSBDQlQgJT4lIAogIG11dGF0ZShDYW5hc3RhID0gJ0NCVCcpCgpDYW5hc3Rhc19SZWcgPC0gYmluZF9yb3dzKENCQSxDQlQpICAgICAgICAgICAgICAgICAgICAgICAlPiUgCiAgZ2F0aGVyKC4sUmVnaW9uLCBWYWxvciwgYygzOihuY29sKC4pLTEpICkpICAgICAgICAgICAgICU+JQogIG11dGF0ZShUcmltZXN0cmUgPSBjYXNlX3doZW4oTWVzICVpbiUgYygxOjMpICAgfjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXMgJWluJSBjKDQ6NikgICB+MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcyAlaW4lIGMoNzo5KSAgIH4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzICVpbiUgYygxMDoxMikgfjQpLAogICAgICAgICBQZXJpb2RvID0gcGFzdGUoQcOxbywgVHJpbWVzdHJlLCBzZXA9Jy4nKSkgICAgICAKQ2FuYXN0YXNfUmVnCmBgYApIYWJpZW5kbyBhZ3JlZ2FkbyBlbCBpZGVudGlmaWNhZG9yIGRlbCBwZXLDrW9kbywgcHJvbWVkaWFtb3MgbGFzIGNhbmFzdGFzIGRlIHVuIG1pc21vIHRyaW1lc3RyZSB5IGx1ZWdvIGxlIGFncmVnYW1vcyBlbCBjw7NkaWdvIGRlIGxhIHJlZ2lvbiBjb3JyZXNwb25kaWVudGUgcXVlIG5vcyBwZXJtaXRpcsOhIHVuaXIgZXN0ZSAqKkRhdGFmcmFtZSoqIGNvbiBsYSBiYXNlIGRlIG1pY3JvZGF0b3MgZGUgbGEgRVBICmBgYHtyfQpDYW5hc3Rhc19SZWdfMiA8LSBDYW5hc3Rhc19SZWcgJT4lIAogIGdyb3VwX2J5KENhbmFzdGEsIFJlZ2lvbiwgUGVyaW9kbykgICAgICAgICAgICAgICAgICAgICAlPiUgCiAgc3VtbWFyaXNlKFZhbG9yID0gbWVhbihWYWxvcikpICAgICAgICAgICAgICAgICAgICAgICAgICU+JSAKICBzcHJlYWQoLiwgQ2FuYXN0YSxWYWxvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJT4lIAogIGxlZnRfam9pbiguLCBkaWMucmVnaW9uZXMsIGJ5ID0gIlJlZ2lvbiIpICAgICAgICAgICAgICAlPiUgCiAgdW5ncm91cCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApDYW5hc3Rhc19SZWdfMgpgYGAKCgojI1VuaWRhZGVzIGRlIEFkdWx0byBFcXVpdmFsZW50ZSBwb3IgaG9nYXIgZW4gbGEgYmFzZSBJbmRpdmlkdWFsCgoxLiBJbmNvcnBvcmFtb3MgYSBjYWRhIHJlZ2lzdHJvIGRlIG51ZXN0cmEgYmFzZSBsYSBVbmlkYWQgZGUgQWR1bHRvIEVxdWl2YWxlbnRlIChVQUUpIGNvcnJlc3BvbmRpZW50ZSwgbWF0Y2hlYW5kbyBsYXMgY29sdW1uYXMgZGUgRWRhZCAoQ0gwNikgeSBTZXhvIChDSDA0KSBtZWRpYW50ZSBsYSBmdW5jacOzbiBfX2xlZnRfam9pbl9fLiAgICAgICAgICAgIAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9ClBvYnJlemFfSW5kaXZpZHVhbCA8LSBCYXNlcyAlPiUgCiAgbXV0YXRlKFBlcmlvZG8gPSBwYXN0ZShBTk80LCBUUklNRVNUUkUsIHNlcD0nLicpKSAlPiUgCiAgbGVmdF9qb2luKC4sIEFkZXF1aSwgYnkgPSBjKCJDSDA0IiwgIkNIMDYiKSkgJT4lIAogIGxlZnRfam9pbiguLCBDYW5hc3Rhc19SZWdfMiwgYnkgPSBjKCJSRUdJT04iLCAiUGVyaW9kbyIpKSAgICAKCgpQb2JyZXphX0luZGl2aWR1YWwKYGBgCgoyLiBVdGlsaXphbW9zIGxhIGZ1bmNpw7NuIF9fZ3JvdXBfYnlfXyBwYXJhIGNhbGN1bGFyIGVsIHRvdGFsIGRlIFVBRSBwb3IgaG9nYXIuIE5vdGVzw6kgcXVlIGFsIHVzYXIgbGEgZnVuY2nDs24gX19tdXRhdGVfXyBjcmVhbW9zIHVuYSBudWV2YSBjb2x1bW5hLCBwZXJtaXRpZW5kbyBjb25zZXJ2YXIgbGEgZGltZW5zacOzbiBpbmRpdmlkdWFsIGRlIGxhIGJhc2UuICAgICAgICAgICAgICAKYGBge3IsIHdhcm5pbmc9RkFMU0V9ClBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMiA8LSBQb2JyZXphX0luZGl2aWR1YWwgJT4lICAKICBncm91cF9ieShDT0RVU1UsIE5ST19IT0dBUiwgUGVyaW9kbykgICAgICAgICAgICAgICAgICAgICAgICAgICU+JSAKICBtdXRhdGUoQWRlcXVpX2hvZ2FyID0gc3VtKGFkZXF1aSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICU+JQogIHVuZ3JvdXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApQb2JyZXphX0luZGl2aWR1YWxfcGFzbzIKYGBgCgozLiBFbiBiYXNlIGEgbGFzIFVBRSBkZWwgaG9nYXIgYWwgcXVlIHBlcnRlbmVjZSBjYWRhIGluZGl2aWR1byBjYWxjdWxhbW9zIGVsIHZhbG9yIGRlIGxhcyBjYW5hc3RhcyBxdWUgZGVsaW1pdGFuIGxhcyBsaW5lYXMgZGUgcG9icmV6YSBlIGluZGlnZW5jaWEgY29ycmVzcG9uZGllbnRlcy4gCjQuIFJlYWxpemFtb3MgbGEgY29tcGFyYWNpw7NuIGzDs2dpY2EgZW50cmUgZWwgSW5ncmVzbyBUb3RhbCBGYW1pbGlhciB5IGxhcyBDYW5hc3RhcyBjYWxjdWxhZGFzIHBhcmEgYXNpZ25hciBhIGNhZGEgaW5kaXZpZHVvIHN1ICJzaXR1YWNpw7NuIiBtZWRpYW50ZSBsYSBmdW5jacOzbiBfX2Nhc2Vfd2hlbl9fLiAgCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQpQb2JyZXphX0luZGl2aWR1YWxfcGFzbzMgPC0gIFBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMiAlPiUgCiBtdXRhdGUoQ0JBID0gQ0JBKkFkZXF1aV9ob2dhciwKICAgICAgICBDQlQgPSBDQlQqQWRlcXVpX2hvZ2FyLAogICAgICAgIFNpdHVhY2lvbiA9IGNhc2Vfd2hlbihJVEY8Q0JBICAgICAgICAgICAgfiAnSW5kaWdlbnRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElURj49Q0JBICYgSVRGPENCVCB+ICdQb2JyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVEY+PUNCVCAgICAgICAgICAgfiAnTm8uUG9icmUnKSkgIAoKUG9icmV6YV9JbmRpdmlkdWFsX3Bhc28zCmBgYAojI0PDoWxjdWxvIGRlIFRhc2FzIGRlIFBvYnJlemEgZSBJbmRpZ2VuY2lhCkhhYmllbmRvIGlkZW50aWZpY2FkbyBhIGNhZGEgcGVyc29uYSBjb21vICoqcG9icmUsIGluZGlnZW50ZSBvIG5vIHBvYnJlKiogZWwgcGFzbyBmaW5hbCBwYXJhIGNhbGN1bGFyIGxhIGluY2lkZW5jaWEgZGUgbGEgcG9icmV6YSBlIGluZGlnZW5jaWEgcmVxdWllcmUgcmVhbGl6YXIgdW4gY29udGVvIGRlIGVzdG9zIGNhc29zIChQYXJhIGxvIGN1YWwgc2UgcmVxdWllcmUgc3VtYXIgbG9zIHBvbmRlcmFkb3JlcyAoKipQT05ESUgqKikgZGUgbG9zIHJlZ2lzdHJvcyBxdWUgY3VtcGxlbiBjb24gdW5hIHUgb3Ryb2EgY29uZGljacOzbikKCmBgYHtyfQpQb2JyZXphX3Jlc3VtZW4gPC0gUG9icmV6YV9JbmRpdmlkdWFsX3Bhc28zICU+JSAKICBncm91cF9ieShQZXJpb2RvKSAlPiUgCiAgc3VtbWFyaXNlKFRhc2FfcG9icmV6YSAgICA9IHN1bShQT05ESUhbU2l0dWFjaW9uICVpbiUgYygnUG9icmUnLCAnSW5kaWdlbnRlJyldLG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgCiAgICAgICAgICAgIFRhc2FfaW5kaWdlbmNpYSA9IHN1bShQT05ESUhbU2l0dWFjaW9uID09ICdJbmRpZ2VudGUnXSxuYS5ybSA9IFRSVUUpLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0oUE9ORElILG5hLnJtID0gVFJVRSkpIApQb2JyZXphX3Jlc3VtZW4KYGBgCgpFbiBjYXNvIGRlIHF1ZXJlciBjYWxjdWxhciBsYSBwb2JyZXphIHBhcmEgb3Ryb3Mgc3ViZ3J1cG9zIHBvYmxhY2lvbmFsZXMsIHNpbXBsZW1lbnRlIHNlIHJlcXVpZXJlIHJlcGxpY2FyIGVsIGPDoWxjdWxvIGNvbiBsYSB0YWJsYSBhZ3J1cGFkYSBzZWfDum4gbGEgdmFyaWFibGUgZGUgaW50ZXLDqXMKCmBgYHtyfQpQb2JyZXphX3Jlc3VtZW5fcmVnaW9uIDwtIFBvYnJlemFfSW5kaXZpZHVhbF9wYXNvMyAlPiUgCiAgZ3JvdXBfYnkoUGVyaW9kbyxSZWdpb24pICU+JSAKICBzdW1tYXJpc2UoVGFzYV9wb2JyZXphICAgID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gJWluJSBjKCdQb2JyZScsICdJbmRpZ2VudGUnKV0sbmEucm0gPSBUUlVFKS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKFBPTkRJSCxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAKICAgICAgICAgICAgVGFzYV9pbmRpZ2VuY2lhID0gc3VtKFBPTkRJSFtTaXR1YWNpb24gPT0gJ0luZGlnZW50ZSddLG5hLnJtID0gVFJVRSkvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShQT05ESUgsbmEucm0gPSBUUlVFKSkgClBvYnJlemFfcmVzdW1lbl9yZWdpb24KYGBgCgojRWplcmNpY2lvcyBQYXJhIHByw6FjdGljYXIKIC0gQ2FsY3VsYXIgZWwgJSBkZSBwb2JyZXphIGUgaW5kaWdlbmNpYSBwYXJhIG11amVyZXMgeSBob21icmVzICgzIHkgNHRvIHRyaW1lc3RyZSAyMDE3KQogLSBDYWxjdWxhciBlbCAlIGRlICoqaG9nYXJlcyoqIGJham8gbGEgbGluZWEgZGUgcG9icmV6YSBlIGluZGlnZW5jaWEsIGEgbml2ZWwgbmFjaW9uYWwgeSBhYmllcnRvIHBvciByZWdpb25lcyAoMyB5IDR0byB0cmltZXN0cmUgMjAxNykKCgojRWplcmNpY2lvcyBkZSB0YXJlYQogLSBDYWxjdWxhciBlbCAlIGRlIHBvYnJlemEgZSBpbmRpZ2VuY2lhIHBhcmEgbXVqZXJlcyB5IGhvbWJyZXMgZW4gY2FkYSB1bmEgZGUgbGFzIHJlZ2lvbmVzKDMgeSA0dG8gdHJpbWVzdHJlIDIwMTcpCgoK