1. Introducción

En este cuaderno se presentan los resultados de la obtención de estadísticas plurianuales de un grupo de cultivos del departamento de Boyacá. Los datos fueron extraídos de las Evaluaciones Agropecuarias Municipales (EVA), una base de información agrícola que abarca el período 2019-2023 y que es proporcionada por el Ministerio de Agricultura y Desarrollo Rural. A partir de esta fuente, se llevó a cabo el procesamiento y análisis de la información con el fin de generar los resultados que se muestran a continuación.

2. Configuración

Se dio comienzo cargando las librerías ya instaladas necesarias para el análisis: tidyverse, dplyr, ggplot2 y readr.

library(tidyverse)
library(dplyr)
library(readr)
library(ggplot2)

3. Leer datos obtenidos de EVA

Una vez descargado el archivo de EVA, se verifica la dirección del archivo:

list.files("D:/GB2/P3/Proyecto Qgis", pattern=c('csv'))
[1] "Base agrícola 2019 - 2023.csv"
[2] "Base Agricola Boyaca.csv"     

A continuación se realiza la lectura del archivo Base agrícola 2019 - 2023:

(eva = read_csv2("D:/GB2/P3/Proyecto Qgis/Base agrícola 2019 - 2023.csv", locale = locale(encoding = "Latin1"), col_names = TRUE,
                show_col_types = FALSE))
ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control.

Se revisa la información de la tabla para confirmar que contenga las estadísticas agrícolas de los años requeridos. Ahora se averigua si el software reconoce los nombres de la tabla:

names(eva)
 [1] "CodigoDaneDepartamento"     "Departamento"              
 [3] "CodigoDaneMunicipio"        "Municipio"                 
 [5] "DesagregacionCultivo"       "Cultivo"                   
 [7] "GrupoCultivo"               "Subgrupo"                  
 [9] "Year"                       "Periodo"                   
[11] "AreaSembrada"               "AreaCosechada"             
[13] "Produccion"                 "Rendimiento"               
[15] "EstadoFisicodelCultivo"     "CiclodelCultivo"           
[17] "NombreCientificodelCultivo"

4. Eliminar columnas no deseadas

Se seleccionan los atributos necesarios parav limpiar la base de datos:

eva %>% dplyr::select('CodigoDaneMunicipio':'EstadoFisicodelCultivo') -> eva.tmp
eva.tmp

Ser revisa que la selección de columnas se haya realizaso correctamente. Luego, se renombran las columnas que contengan carácteres con ruido:

eva.tmp %>%  dplyr::rename('cod_Mun' = 'CodigoDaneMunicipio', 'Grupo' = 'GrupoCultivo',   
                         'Sistema' = 'DesagregacionCultivo',
                         'Estado' = 'EstadoFisicodelCultivo') -> new_eva

Se revisa:

new_eva

5. Análisis de datos

La librería dplyr facilita la realización de dividir los datos en grupos mediante la función group_by(). Una vez agrupados, se puede usar summarize() para generar un resumen de una fila por grupo, aplicando funciones de agregación o resumen.

5.1 Cultivos más importantes entre 2019 y 2023

PAi se desea saber la producción total por grupo de cultivos, se escribe:

new_eva %>%
  ##filter(Produccion > 0) %>%
  group_by(Grupo) %>%
  summarize(total_produccion = sum(Produccion)) %>% 
  arrange(desc(total_produccion)) 

Para guardar la producción total en un objeto:

new_eva %>%
  group_by(Grupo) %>%
  summarize(total_produccion = sum(Produccion)) -> PT 

Para filtrar los cultivos más importantes:

PT %>% 
  filter(total_produccion > 1000000) -> main.groups

Para conocer la producción total de los mprincipales grupos de cultivos:

(value = sum(main.groups$total_produccion))
[1] 17892768

Para agregar un nuevo atributo con porcentaje de la producción total:

main.groups$percent = main.groups$total_produccion/value

Para crear un gráfico circular de la producción total de main.groups:

library(ggplot2)
# Barplot
bp<- ggplot(main.groups, aes(x="", y=percent, fill=Grupo))+
geom_bar(width = 1, stat = "identity")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie

5.2 Municipios líderes

Para conocer los municipios que lideraron la producción de cada cultivo entre 2019 y 2023:

new_eva %>%
  group_by(Grupo, Municipio) %>%
  summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
  slice(which.max(total_prod))  %>%
  arrange(desc(total_prod))
`summarise()` has grouped output by 'Grupo'. You can override using the `.groups` argument.

Se guarda la información:

new_eva %>%
  group_by(Grupo, Municipio) %>%
  summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
  slice(which.max(total_prod))  -> leaders
`summarise()` has grouped output by 'Grupo'. You can override using the `.groups` argument.
leaders

Se filtra para saber cuáles son los municipios más importantes en el ámbito agrícola:

leaders %>% 
  filter(total_prod > 50000) -> main.leaders

Se crea un diagrama de barras para los municipios más importantes:

p<-ggplot(data=main.leaders, aes(x=Municipio, y=total_prod)) +
  geom_bar(stat="identity")
p

5.3 Un cultivo importante entre 2019 y 2023

new_eva %>% 
  filter(Municipio=="Chitaraque" & Cultivo=="Café") %>% 
  group_by(Year, Cultivo) %>%
  select(Municipio, Cultivo, Produccion, Year) ->  chitaraque_cafe

Se revisa la información:

chitaraque_cafe

Se crea un gráfico de la producción de café en Chitaraque para todo el período de tiempo:

g <- ggplot(aes(x=Year, y=Produccion/1000), data = chitaraque_cafe) + geom_bar(stat='identity') + labs(y='Produccion de Café [Ton x 1000]')
g + ggtitle("Evolucion de la Produccion del Cultivo de Café en Chitaraque desde 2019 a 2023") + labs(caption= "Based on EVA data (EVA, 2023)")

6. Bibliography

Lizarazo, I., 2022. Understanding dynamic productivity of crops. Available at https://rpubs.com/ials2un/production_dyn_v1.

7. Detalles del entorno computacional

sessionInfo()
R version 4.4.3 (2025-02-28 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)

Matrix products: default


locale:
[1] LC_COLLATE=Spanish_Colombia.utf8  LC_CTYPE=Spanish_Colombia.utf8   
[3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C                     
[5] LC_TIME=Spanish_Colombia.utf8    

time zone: America/Bogota
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] lubridate_1.9.4 forcats_1.0.0   stringr_1.5.1   dplyr_1.1.4     purrr_1.0.4    
 [6] readr_2.1.5     tidyr_1.3.1     tibble_3.2.1    ggplot2_3.5.2   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] bit_4.6.0         jsonlite_2.0.0    gtable_0.3.6      crayon_1.5.3     
 [5] compiler_4.4.3    tidyselect_1.2.1  parallel_4.4.3    scales_1.3.0     
 [9] yaml_2.3.10       fastmap_1.2.0     R6_2.6.1          labeling_0.4.3   
[13] generics_0.1.3    knitr_1.50        munsell_0.5.1     pillar_1.10.1    
[17] tzdb_0.5.0        rlang_1.1.5       stringi_1.8.7     xfun_0.51        
[21] bit64_4.6.0-1     timechange_0.3.0  cli_3.6.4         withr_3.0.2      
[25] magrittr_2.0.3    digest_0.6.37     grid_4.4.3        vroom_1.6.5      
[29] rstudioapi_0.17.1 hms_1.1.3         lifecycle_1.0.4   vctrs_0.6.5      
[33] evaluate_1.0.3    glue_1.8.0        farver_2.1.2      colorspace_2.1-1 
[37] rmarkdown_2.29    tools_4.4.3       pkgconfig_2.0.3   htmltools_0.5.8.1
LS0tDQp0aXRsZTogIlRlcmNlciBjdWFkZXJubyBkZSBSOiBEaW7DoW1pY2EgZGUgbGEgcHJvZHVjY2nDs24gZGUgY3VsdGl2b3MiDQphdXRob3I6ICJZYW5ldGggQWxleGFuZHJhIEFyZW5hcyBHYXJyaWRvIg0KZGF0ZTogDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KIyAxLiBJbnRyb2R1Y2Npw7NuDQojIyMjIEVuIGVzdGUgY3VhZGVybm8gc2UgcHJlc2VudGFuIGxvcyByZXN1bHRhZG9zIGRlIGxhIG9idGVuY2nDs24gZGUgZXN0YWTDrXN0aWNhcyBwbHVyaWFudWFsZXMgZGUgdW4gZ3J1cG8gZGUgY3VsdGl2b3MgZGVsIGRlcGFydGFtZW50byBkZSBCb3lhY8OhLiBMb3MgZGF0b3MgZnVlcm9uIGV4dHJhw61kb3MgZGUgbGFzIEV2YWx1YWNpb25lcyBBZ3JvcGVjdWFyaWFzIE11bmljaXBhbGVzIChFVkEpLCB1bmEgYmFzZSBkZSBpbmZvcm1hY2nDs24gYWdyw61jb2xhIHF1ZSBhYmFyY2EgZWwgcGVyw61vZG8gMjAxOS0yMDIzIHkgcXVlIGVzIHByb3BvcmNpb25hZGEgcG9yIGVsIE1pbmlzdGVyaW8gZGUgQWdyaWN1bHR1cmEgeSBEZXNhcnJvbGxvIFJ1cmFsLiBBIHBhcnRpciBkZSBlc3RhIGZ1ZW50ZSwgc2UgbGxldsOzIGEgY2FibyBlbCBwcm9jZXNhbWllbnRvIHkgYW7DoWxpc2lzIGRlIGxhIGluZm9ybWFjacOzbiBjb24gZWwgZmluIGRlIGdlbmVyYXIgbG9zIHJlc3VsdGFkb3MgcXVlIHNlIG11ZXN0cmFuIGEgY29udGludWFjacOzbi4NCg0KIyAyLiBDb25maWd1cmFjacOzbg0KIyMjIyBTZSBkaW8gY29taWVuem8gY2FyZ2FuZG8gbGFzIGxpYnJlcsOtYXMgeWEgaW5zdGFsYWRhcyBuZWNlc2FyaWFzIHBhcmEgZWwgYW7DoWxpc2lzOiAgKip0aWR5dmVyc2UqKiwgKipkcGx5cioqLCAqKmdncGxvdDIqKiB5ICoqcmVhZHIqKi4NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMgMy4gTGVlciBkYXRvcyBvYnRlbmlkb3MgZGUgRVZBDQojIyMjIFVuYSB2ZXogZGVzY2FyZ2FkbyBlbCBhcmNoaXZvIGRlIEVWQSwgc2UgdmVyaWZpY2EgbGEgZGlyZWNjacOzbiBkZWwgYXJjaGl2bzoNCmBgYHtyfQ0KbGlzdC5maWxlcygiRDovR0IyL1AzL1Byb3llY3RvIFFnaXMiLCBwYXR0ZXJuPWMoJ2NzdicpKQ0KYGBgDQojIyMjIEEgY29udGludWFjacOzbiBzZSByZWFsaXphIGxhIGxlY3R1cmEgZGVsIGFyY2hpdm8gKipCYXNlIGFncsOtY29sYSAyMDE5IC0gMjAyMyoqOg0KYGBge3J9DQooZXZhID0gcmVhZF9jc3YyKCJEOi9HQjIvUDMvUHJveWVjdG8gUWdpcy9CYXNlIGFncmnMgWNvbGEgMjAxOSAtIDIwMjMuY3N2IiwgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIkxhdGluMSIpLCBjb2xfbmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNob3dfY29sX3R5cGVzID0gRkFMU0UpKQ0KYGBgDQojIyMjIFNlIHJldmlzYSBsYSBpbmZvcm1hY2nDs24gZGUgbGEgdGFibGEgcGFyYSBjb25maXJtYXIgcXVlIGNvbnRlbmdhIGxhcyBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMgZGUgbG9zIGHDsW9zIHJlcXVlcmlkb3MuIEFob3JhIHNlIGF2ZXJpZ3VhIHNpIGVsIHNvZnR3YXJlIHJlY29ub2NlIGxvcyBub21icmVzIGRlIGxhIHRhYmxhOg0KDQpgYGB7cn0NCm5hbWVzKGV2YSkNCmBgYA0KIyA0LiBFbGltaW5hciBjb2x1bW5hcyBubyBkZXNlYWRhcw0KIyMjIyBTZSBzZWxlY2Npb25hbiBsb3MgYXRyaWJ1dG9zIG5lY2VzYXJpb3MgcGFyYXYgbGltcGlhciBsYSBiYXNlIGRlIGRhdG9zOg0KDQpgYGB7cn0NCmV2YSAlPiUgZHBseXI6OnNlbGVjdCgnQ29kaWdvRGFuZU11bmljaXBpbyc6J0VzdGFkb0Zpc2ljb2RlbEN1bHRpdm8nKSAtPiBldmEudG1wDQpgYGANCg0KYGBge3J9DQpldmEudG1wDQpgYGANCiMjIyMgU2VyIHJldmlzYSBxdWUgbGEgc2VsZWNjacOzbiBkZSBjb2x1bW5hcyBzZSBoYXlhIHJlYWxpemFzbyBjb3JyZWN0YW1lbnRlLiBMdWVnbywgc2UgcmVub21icmFuIGxhcyBjb2x1bW5hcyBxdWUgY29udGVuZ2FuIGNhcsOhY3RlcmVzIGNvbiBydWlkbzoNCg0KYGBge3J9DQpldmEudG1wICU+JSAgZHBseXI6OnJlbmFtZSgnY29kX011bicgPSAnQ29kaWdvRGFuZU11bmljaXBpbycsICdHcnVwbycgPSAnR3J1cG9DdWx0aXZvJywgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAnU2lzdGVtYScgPSAnRGVzYWdyZWdhY2lvbkN1bHRpdm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdFc3RhZG8nID0gJ0VzdGFkb0Zpc2ljb2RlbEN1bHRpdm8nKSAtPiBuZXdfZXZhDQpgYGANCg0KIyMjIyBTZSByZXZpc2E6DQoNCmBgYHtyfQ0KbmV3X2V2YQ0KYGBgDQojIDUuIEFuw6FsaXNpcyBkZSBkYXRvcw0KIyMjIyBMYSBsaWJyZXLDrWEgZHBseXIgZmFjaWxpdGEgbGEgcmVhbGl6YWNpw7NuIGRlIGRpdmlkaXIgbG9zIGRhdG9zIGVuIGdydXBvcyBtZWRpYW50ZSBsYSBmdW5jacOzbiBncm91cF9ieSgpLiBVbmEgdmV6IGFncnVwYWRvcywgc2UgcHVlZGUgdXNhciBzdW1tYXJpemUoKSBwYXJhIGdlbmVyYXIgdW4gcmVzdW1lbiBkZSB1bmEgZmlsYSBwb3IgZ3J1cG8sIGFwbGljYW5kbyBmdW5jaW9uZXMgZGUgYWdyZWdhY2nDs24gbyByZXN1bWVuLg0KDQojIyMgNS4xIEN1bHRpdm9zIG3DoXMgaW1wb3J0YW50ZXMgZW50cmUgMjAxOSB5IDIwMjMNCiMjIyMgUEFpIHNlIGRlc2VhIHNhYmVyIGxhIHByb2R1Y2Npw7NuIHRvdGFsIHBvciBncnVwbyBkZSBjdWx0aXZvcywgc2UgZXNjcmliZToNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICAjI2ZpbHRlcihQcm9kdWNjaW9uID4gMCkgJT4lDQogIGdyb3VwX2J5KEdydXBvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2R1Y2Npb24gPSBzdW0oUHJvZHVjY2lvbikpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3Byb2R1Y2Npb24pKSANCmBgYA0KIyMjIyBQYXJhIGd1YXJkYXIgbGEgcHJvZHVjY2nDs24gdG90YWwgZW4gdW4gb2JqZXRvOiANCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbykgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9wcm9kdWNjaW9uID0gc3VtKFByb2R1Y2Npb24pKSAtPiBQVCANCmBgYA0KDQojIyMjIFBhcmEgZmlsdHJhciBsb3MgY3VsdGl2b3MgbcOhcyBpbXBvcnRhbnRlczoNCg0KYGBge3J9DQpQVCAlPiUgDQogIGZpbHRlcih0b3RhbF9wcm9kdWNjaW9uID4gMTAwMDAwMCkgLT4gbWFpbi5ncm91cHMNCmBgYA0KDQojIyMjIFBhcmEgY29ub2NlciBsYSBwcm9kdWNjacOzbiB0b3RhbCBkZSBsb3MgbXByaW5jaXBhbGVzIGdydXBvcyBkZSBjdWx0aXZvczoNCg0KYGBge3J9DQoodmFsdWUgPSBzdW0obWFpbi5ncm91cHMkdG90YWxfcHJvZHVjY2lvbikpDQpgYGANCiMjIyMgUGFyYSBhZ3JlZ2FyIHVuIG51ZXZvIGF0cmlidXRvIGNvbiBwb3JjZW50YWplIGRlIGxhIHByb2R1Y2Npw7NuIHRvdGFsOg0KDQpgYGB7cn0NCm1haW4uZ3JvdXBzJHBlcmNlbnQgPSBtYWluLmdyb3VwcyR0b3RhbF9wcm9kdWNjaW9uL3ZhbHVlDQpgYGANCg0KIyMjIyBQYXJhIGNyZWFyIHVuIGdyw6FmaWNvIGNpcmN1bGFyIGRlIGxhIHByb2R1Y2Npw7NuIHRvdGFsIGRlIG1haW4uZ3JvdXBzOg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCiMgQmFycGxvdA0KYnA8LSBnZ3Bsb3QobWFpbi5ncm91cHMsIGFlcyh4PSIiLCB5PXBlcmNlbnQsIGZpbGw9R3J1cG8pKSsNCmdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpDQojIFBpZWNoYXJ0DQpwaWUgPC0gYnAgKyBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApDQpwaWUNCmBgYA0KIyMjIDUuMiBNdW5pY2lwaW9zIGzDrWRlcmVzDQojIyMjIFBhcmEgY29ub2NlciBsb3MgbXVuaWNpcGlvcyBxdWUgbGlkZXJhcm9uIGxhIHByb2R1Y2Npw7NuIGRlIGNhZGEgY3VsdGl2byBlbnRyZSAyMDE5IHkgMjAyMzoNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbywgTXVuaWNpcGlvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZCkpDQpgYGANCiMjIyMgU2UgZ3VhcmRhIGxhIGluZm9ybWFjacOzbjoNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwbywgTXVuaWNpcGlvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgIC0+IGxlYWRlcnMNCmBgYA0KYGBge3J9DQpsZWFkZXJzDQpgYGANCiMjIyMgU2UgZmlsdHJhIHBhcmEgc2FiZXIgY3XDoWxlcyBzb24gbG9zIG11bmljaXBpb3MgbcOhcyBpbXBvcnRhbnRlcyBlbiBlbCDDoW1iaXRvIGFncsOtY29sYToNCg0KYGBge3J9DQpsZWFkZXJzICU+JSANCiAgZmlsdGVyKHRvdGFsX3Byb2QgPiA1MDAwMCkgLT4gbWFpbi5sZWFkZXJzDQpgYGANCg0KIyMjIyBTZSBjcmVhIHVuIGRpYWdyYW1hIGRlIGJhcnJhcyBwYXJhIGxvcyBtdW5pY2lwaW9zIG3DoXMgaW1wb3J0YW50ZXM6DQoNCmBgYHtyfQ0KcDwtZ2dwbG90KGRhdGE9bWFpbi5sZWFkZXJzLCBhZXMoeD1NdW5pY2lwaW8sIHk9dG90YWxfcHJvZCkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KcA0KDQpgYGANCiMjIyA1LjMgVW4gY3VsdGl2byBpbXBvcnRhbnRlIGVudHJlIDIwMTkgeSAyMDIzDQoNCmBgYHtyfQ0KbmV3X2V2YSAlPiUgDQogIGZpbHRlcihNdW5pY2lwaW89PSJDaGl0YXJhcXVlIiAmIEN1bHRpdm89PSJDYWbDqSIpICU+JSANCiAgZ3JvdXBfYnkoWWVhciwgQ3VsdGl2bykgJT4lDQogIHNlbGVjdChNdW5pY2lwaW8sIEN1bHRpdm8sIFByb2R1Y2Npb24sIFllYXIpIC0+ICBjaGl0YXJhcXVlX2NhZmUNCmBgYA0KDQojIyMjIFNlIHJldmlzYSBsYSBpbmZvcm1hY2nDs246DQoNCmBgYHtyfQ0KY2hpdGFyYXF1ZV9jYWZlDQpgYGANCiMjIyMgU2UgY3JlYSB1biBncsOhZmljbyBkZSBsYSBwcm9kdWNjacOzbiBkZSBjYWbDqSBlbiBDaGl0YXJhcXVlIHBhcmEgdG9kbyBlbCBwZXLDrW9kbyBkZSB0aWVtcG86DQoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gY2hpdGFyYXF1ZV9jYWZlKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J1Byb2R1Y2Npb24gZGUgQ2Fmw6kgW1RvbiB4IDEwMDBdJykNCmBgYA0KDQpgYGB7cn0NCmcgKyBnZ3RpdGxlKCJFdm9sdWNpb24gZGUgbGEgUHJvZHVjY2lvbiBkZWwgQ3VsdGl2byBkZSBDYWbDqSBlbiBDaGl0YXJhcXVlIGRlc2RlIDIwMTkgYSAyMDIzIikgKyBsYWJzKGNhcHRpb249ICJCYXNlZCBvbiBFVkEgZGF0YSAoRVZBLCAyMDIzKSIpDQpgYGANCiMgNi4gQmlibGlvZ3JhcGh5DQojIyMjIExpemFyYXpvLCBJLiwgMjAyMi4gVW5kZXJzdGFuZGluZyBkeW5hbWljIHByb2R1Y3Rpdml0eSBvZiBjcm9wcy4gQXZhaWxhYmxlIGF0IGh0dHBzOi8vcnB1YnMuY29tL2lhbHMydW4vcHJvZHVjdGlvbl9keW5fdjEuDQoNCiMgNy4gRGV0YWxsZXMgZGVsIGVudG9ybm8gY29tcHV0YWNpb25hbA0KDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA0KDQo=