1. Introducción

El departamento del Amazonas es uno de los 32 departamentos de Colombia y está ubicado en la zona sur del país, cuenta con 10 municipios y su capital es Leticia. Este departamento cuenta con una de las zonas más ampliamente biodiversas del mundo gracias a que posee parte de la selva amazónica (la más grande del mundo) y adicionalmente tambien tiene una gran diversidad de culturas indígenas. Su ubicación es vecina a los países de Brasil y Perú. El Amazonas tiene una superficie de casi 110.000 km2, está ampliamente cubierto de selva y posee varios ríos que son tributarios del río amazonas. La economía se basa en la extracción de diferentes cultivos como maíz, plátano, arroz, caña de azúcar, ñame, aguacate, yuca, cacao, piña, etc.

Este notebook se basa en mostrar representaciones gráficas de los diferentes mapas temáticos basados en las clases de la asignatura de Geomática básica, usando como referencia el departamento del Amazonas y su producción agrícola, por medio del programa Rstudio.

2. Cartografía temática

La cartógrafia temática es un tipo de mapa, clasificado segun su tipo de información ya que se basa en la representación de una variable espacial de carácter físico, social, político, etc. De igual forma, muestra atributos o estadísticas que permiten un mejor rendimiento de lo que pasa en diversas regiones. La cartografía temática cuenta con diversas técnicas de mapeo temática, en ese informe se mostrarán 4 de ellas:

2.1 Mapas de coropletas

Estos mapas son usados principalmente para representar información geográfica en un SIG. En estos mapas se pueden observar áreas definidas las cuales tienen un valor de una variable cada una. Además, cada área definida corresponde a una unidad espacial y el valor que posee resume la variable dentro de dicha área. Para los mapas de coropletas es muy importante tener en cuenta la correcta división de valores de las variables, usualmente, el uso de distintos colores es el método más usado.\(^1\)

2.2 Mapas de símbolos proporcionales

Este tipo de mapas representa variables cuantitativas a través de símbolos en donde los tamaños están en relación con el valor que se quiere representar para la variable otorgada. Los símbolos que tienden a usarse para este tipo de mapas son círculos, cuadrados y triángulos.\(^2\)

2.3 Mapas de isolíneas

Las isolíneas son ‘líneas’ con un valor constante asociado a todos sus puntos. Un mapa de isolíneas representa valores continuos que son propios de la variable.\(^3\) En este caso, el dato está en todos los puntos del espacio y de forma continua, pero sólo se mide en los puntos de control. Las líneas se trazan con intervalos constantes y pueden tener colores secuenciales.

2.4 Mapas de puntos

Estos mapas se emplean principalemnte para representar variables que representen cantidad. Esas cantidades son trazadas mediante la repetición de puntos en número proporcional a su tamaño. Cada punto representa un valor y el conjunto de todos esos puntos suma la totalidad a representar.

3. Datos

Los datos de este informe hacen referencia a las Necesidades Básicas insatisfechas (NBI), las cuales fueron tomadas del Geoportal DANE. Para un correcto uso de los datos, al descargarlos, se edito desde el programa de excel y se eliminaron los datos que en este documento no son relevantes conocerlos; se adecuaron los datos al departamento del Amazonas.

4. Paquetes y librerías necesarias

Primero borramos la memoria:

rm(list = ls())

Instalamos los paquetes necesarios y que no se han instalado con anterioridad:

list.of.packages <- c("tidyverse", "rgeos", "sf", "raster", "cartography", "SpatialPosition")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Cargamos las librerias:

library(tidyverse)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0     v purrr   0.3.4
v tibble  3.0.0     v dplyr   0.8.5
v tidyr   1.0.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x tidyr::extract() masks raster::extract()
x dplyr::filter()  masks stats::filter()
x dplyr::lag()     masks stats::lag()
x dplyr::select()  masks raster::select()
library(readxl)
library(rgeos)
rgeos version: 0.5-2, (SVN revision 621)
 GEOS runtime version: 3.6.1-CAPI-1.10.1 
 Linking to sp version: 1.4-1 
 Polygon checking: TRUE 
library(raster)
library(sf)
Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(cartography)
library(SpatialPosition)

5. Leer los datos de las NBI

En este paso ejecutamos el código siguiente para leer el documento de excel mencionado previamente, y otorgarle un nombre,en este caso se le dio el nombre de nbi.

nbi <- read_excel("C:/Users/paula/Desktop/Geomatica/Cartografia_tematica/CNPV-2018-NBI.xlsx")

Ver las primeras 6 filas del documento para verificar que los datos sean correctos:

head(nbi)

Para lo siguiente, se ejecuta el código para filtrar los datos con mayores niveles de NBI y ponerlos en una nueva tabla. Al observar esos datos se puede concluir que el municipio de La Victoria tiene un NBI de casi 91, lo que significa que el nivel de pobreza es bastante alto.

nbi %>% 
  slice(which.max(NBI)) -> max_nbi
max_nbi

Aquí se tiene la misma metodología con la diferencia de que se filtraron los datos con los menores niveles de NBI. Como se observa, en Leticia los niveles de NBI son de aproximadamente 30 no es un nivel muy bajo, lo que concierne a que eb general el departamento del Amazonas tiene un nivel alto de pobreza.

nbi %>% 
  slice(which.min(NBI)) -> min_nbi

min_nbi

Al correr el siguiente código se observan los datos de la tabla nbi pero con los datos de NBI en forma descendente.

nbi %>% 
  arrange(desc(NBI)) -> desc_nbi

desc_nbi

6. Unión de datos de NBI a municipios

En el siguiente paso, se cargaran los datos de los municipios del Amazonas que fueron optenidos en la realización de un Notebook anterior.

munic <- st_read("C:/Users/paula/Desktop/Geomatica/Datos_de _elevacion_en_R/Amazonas_datos_DANE/91_AMAZONAS/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\paula\Desktop\Geomatica\Datos_de _elevacion_en_R\Amazonas_datos_DANE\91_AMAZONAS\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 11 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -74.39634 ymin: -4.229406 xmax: -69.3955 ymax: 0.09725686
CRS:            4326

Se ejecuta el siguiente comando para observar unicamente la columna de los códigos de los municipios MPIO_CCDGO para comprobar que esos datos son equivalentes a los códigos de la tabla nbi.

head(munic$MPIO_CCDGO)
[1] 91001 91263 91405 91407 91430 91460
11 Levels: 91001 91263 91405 91407 ... 91798

Realizamos la unión de esas dos columnas con la funcion de left_join.

nbi_munic = left_join(munic, nbi, by= c("MPIO_CCDGO"="CODIGO"))
Column `MPIO_CCDGO`/`CODIGO` joining factor and character vector, coercing into character vector

Creamos una nueva tabla con las columnas de MUNICIPIO, MPIO_CCDGO y NBI; para comprobar que el join fue exitoso.

nbi_munic %>% 
  dplyr::select(MUNICIPIO,MPIO_CCDGO,NBI) -> check_nbi_munic

head(check_nbi_munic)
Simple feature collection with 6 features and 3 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.84132 ymin: -4.229406 xmax: -69.3955 ymax: 0.09725686
CRS:            4326
              MUNICIPIO MPIO_CCDGO      NBI
1               LETICIA      91001 26.99132
2      EL ENCANTO (ANM)      91263 37.50764
3     LA CHORRERA (ANM)      91405 35.81580
4      LA PEDRERA (ANM)      91407 78.83191
5     LA VICTORIA (ANM)      91430 90.96386
6 MIRITI - PARANÁ (ANM)      91460 85.76471
                        geometry
1 POLYGON ((-69.74085 -3.0026...
2 POLYGON ((-73.24647 -1.5029...
3 POLYGON ((-73.72362 -0.3804...
4 POLYGON ((-70.45577 -0.4957...
5 POLYGON ((-71.18431 0.09705...
6 POLYGON ((-71.48046 -0.0105...
nbi_munic_new <- st_transform(nbi_munic, crs = 3116)

7. Ejemplos de mapas temáticos

Para llevar a cabo estos mapas temáticos fue necesario hacer uso del paquete cartography ya que la calidad de los mapas en esta librería es adecuada y buena. Para poder hacer uso es esta librería se necesitan objetos espaciales que en este caso es sf (Simple Features).

7.1 Símbolos proporcionales usando OpenStreetMap

En los siguientes comandos se hacen uso distintas funciones como getTiles() que descarga los datos y tiles Layer() que están encargadas de mostrar los datos. Para visualizar los simbolos con areas proporcionales de una variable cuantitativa se usa la funcion propSymbolsLayer()

mun.osm <- getTiles(
  x = nbi_munic_new,
  type = "OpenStreetMap",
  zoom = 8,
  cachedir = TRUE,
  crop = TRUE
)
opar <- par(mar = c(2,0,1.2,0))
tilesLayer(x = mun.osm)
plot(st_geometry(nbi_munic_new), col= NA, border = "darkgreen", weigth = 2, add= TRUE)
propSymbolsLayer(
  x = nbi_munic_new,
  var = "NBI",
  inches = 0.25,   # inches hace referencia al tamaño de las figuras
  col = "peru",
  legend.pos = "topright",
  legend.title.txt = "NBI totales"
)
layoutLayer(title = "Distribución de las NBI en el Amazonas",
            sources = "Fuente: DANE, 2018\n© OpenStreetMap",
            author = "Paula Virgüez",
            frame = TRUE, north = FALSE, tabtitle = TRUE)
north(pos = "topleft")

7.2 Coropletas

En este caso usaremos la función choroLayer() la cual está encargada de mostrar los mapas en coropletas tal como se explicó previamente.

opar <- par(mar = c (0,0,1.2,0))
par(bg = "grey90")
plot(st_geometry(nbi_munic_new), col = NA, border = NA, bg = "#85C1E9")
choroLayer(
  x= nbi_munic_new,
  var = "NBI",
  method = "geom",
  nclass = 5,
  col = carto.pal(pal1 = "kaki.pal", n1 = 5), # carto.pal() es usado para definir la paleta de colores que se va a emplear en el mapa
  border = "white",
  lwd = 0.5,
  legend.pos = "topright",
  legend.title.txt = "NBI",
  add = TRUE
)
layoutLayer(title = "Distribución de las NBI en el Amazonas",
            sources = "Fuente: DANE, 2018.",
            author = "Paula Virgüez",
            frame = TRUE, north = FALSE, tabtitle = TRUE, col = "black")
north(pos = "topleft")

7.3 Símbolos proporcionales y mapa de tipología

En este mapa los símbolos tienen un tamaño que es proporcional a una variable cuantitativa que se quiere resaltar y coloreados en funcion del valor de una segunda variable que es cualitativa.

A continuación, se hace uso de la función mutate() del paquete dplyr para crear una nueva columna, en este caso se adiciona una columna nueva con información de la pobreza en el amazonas pero diferenciando los datos con intervalos diferentes.

nbi_munic_2 <- dplyr::mutate(nbi_munic_new, Pobreza = ifelse(MISERIA > 20, "Extremo",
                                                            ifelse(HACINAMIENTO > 5,
                                                                   "Alto", "Intermedio")))

Como podemos observar, en la tabla aparece la nueva columna de “Pobreza

head(nbi_munic_2)
Simple feature collection with 6 features and 21 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 1026292 ymin: 22875.46 xmax: 1521684 ymax: 502535.4
CRS:            EPSG:3116
  DPTO_CCDGO MPIO_CCDGO
1         91      91001
2         91      91263
3         91      91405
4         91      91407
5         91      91430
6         91      91460
                 MPIO_CNMBR
1                   LETICIA
2                EL ENCANTO
3               LA CHORRERA
4                LA PEDRERA
5       LA VICTORIA (Pacoa)
6 MIRITÍ-PARANÁ (Campoamor)
                      MPIO_CRSLC MPIO_NAREA
1  Decreto 352 de Feb 20 de 1964   6183.129
2 Decreto 274 de Mayo 28 de 1953  10897.481
3 Decreto 274 de Mayo 28 de 1953  12726.929
4 Decreto 274 de Mayo 28 de 1953  13670.317
5      ORD 12 DE JULIO 9 DE 1996   1432.795
6 Decreto 274 de Mayo 28 de 1953  16866.120
  MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area
1      2017   AMAZONAS   3.880001  0.5007018
2      2017   AMAZONAS   8.052697  0.8853254
3      2017   AMAZONAS   9.105101  1.0335830
4      2017   AMAZONAS   7.376291  1.1051976
5      2017   AMAZONAS   2.483170  0.1160863
6      2017   AMAZONAS   6.448395  1.3668663
  COD_DEP DEPARTAMENTO COD_MUN
1      91     AMAZONAS     001
2      91     AMAZONAS     263
3      91     AMAZONAS     405
4      91     AMAZONAS     407
5      91     AMAZONAS     430
6      91     AMAZONAS     460
              MUNICIPIO      NBI   MISERIA
1               LETICIA 26.99132  6.270907
2      EL ENCANTO (ANM) 37.50764 11.178986
3     LA CHORRERA (ANM) 35.81580  9.778283
4      LA PEDRERA (ANM) 78.83191 42.364672
5     LA VICTORIA (ANM) 90.96386 66.265060
6 MIRITI - PARANÁ (ANM) 85.76471 63.058824
   VIVIENDA SERVICIOS HACINAMIENTO
1  4.275949  9.620885     14.31376
2  1.588271 21.624924     17.77642
3  4.263786 22.171688     14.66742
4 21.623932 71.709402     38.14815
5 48.795181 83.132530     22.89157
6 21.294118 78.117647     63.17647
  INASISTENCIA DEP_ECONOMICA
1     2.850633      3.994764
2     4.153940      5.192425
3     3.411029      3.865833
4     7.663818     16.039886
5    37.349398     22.891566
6     4.941176      9.647059
                        geometry Pobreza
1 POLYGON ((1482558 158792.9,...    Alto
2 POLYGON ((1092482 325567.3,...    Alto
3 POLYGON ((1039394 449700.2,...    Alto
4 POLYGON ((1403426 436838.2,... Extremo
5 POLYGON ((1322206 502513.1,... Extremo
6 POLYGON ((1289202 490602.7,... Extremo

Plotear el mapa

library(sf)
library(cartography)
opar <- par(mar = c(0,0,1.2,0))
  plot(st_geometry(nbi_munic_2), col = "#E5E8E8", border = "#B2BABB", bg = "#EBF5FB",
     lwd = 0.5)
propSymbolsTypoLayer(
  x = nbi_munic_2,
  var = "NBI", # Variable cuantitativa
  inches = 0.5,
  symbols = "square",
  border = "white",
  lwd = .5,
  legend.var.pos = "topright",
  legend.var.title.txt = "NBI",
  var2 = "Pobreza", # Variable cualitativa
  legend.var2.values.order = c("Extremo", "Alto",
                               "Intermedio"),
  col = carto.pal(pal1 = "pastel.pal", n1 = 3),
  legend.var2.pos = c(820000,100000),
  legend.var2.title.txt = "Pobreza"
)
layoutLayer(title = "Distribución de las NBI en el Amazonas",
            author = "Paula Virgüez",
            sources = "Fuente: DANE, 2018.",
            scale = 100, tabtitle = TRUE, frame = FALSE, postitle = "right",
            col = "white", coltitle = "black")
north(pos = "topleft")

Como se puede observar, principalmente hacia el norte del departamento se encuentran municipios con mayor pobreza y también hacia el sur.

7.4 Mapas de etiquetas

En este caso se combinarán las funciones de choroLayer() y labelLayer. Cambié los colores de los municipios, el fondo de la imagen, la posición del símbolo Norte, la paleta de colores, etc.

opar <- par(mar = c(0,0,1.2,0))
par (bg = "grey25")
plot(st_geometry(nbi_munic_2), col = "#e4e9de", border = "#000000",
     bg = "white", lwd = 0.5)
choroLayer(
  x= nbi_munic_new,
  var = "NBI",
  method = "geom",
  nclass = 5,
  col = carto.pal(pal1 = "blue.pal", n1 = 6),
  border = "grey10",
  lwd = 0.5,
  legend.pos = c(1600000, 100000),
  legend.title.txt = "NBI",
  add = TRUE
)
labelLayer(
  x= nbi_munic_2,
  txt = "MUNICIPIO",
  col = "grey20",
  cex = 0.5,
  font = 4,
  halo = TRUE,
  bg = "white",
  r = 0.1,
  overlap = FALSE,
  show.lines = FALSE
)

layoutLayer(
  title = "Municipios del Amazonas",
  sources = "Fuente: DANE, 2018.",
  author = "Paula Virgüez",
  frame = TRUE,
  north = FALSE,
  tabtitle = TRUE,
  theme = "blue.pal"
)
north(pos = "topleft")

7.5 Mapa de Isopletas

Para este mapa se usarán los datos estadísticos de la producción de yuca del año 2018 en el Amazonas. Estos datos fueron usados en un Notebook anterior, sin embargo, se modificó el archivo eliminando todos los valores no relacionados al año 2018 para no tener inconvenientes posteriormente.

Cargar los datos:

cultivos2018 <- read_excel("C:/Users/paula/Desktop/Geomatica/Cartografia_tematica/EVA_Amazonas_2018.xlsx")
head(cultivos2018)

En este caso, opté por usar este cultivo ya que, basandome en el Notebook anterior, la yuca es el cultivo que tuvo los valores más altos de producción en el año 2018 en el Amazonas, aunque solo hubieron datos en dos municipios del departamento, los valores de producción fueron los más altos de los que se tiene registro, y son ideales para poder tener una mejor representación del mapa de isopletas. Aquí se usó la función filter() justamente para filtrar unicamente los datos del cultivo de yuca:

cultivos2018 %>% 
  filter(CULTIVO == "YUCA") -> yuca2018

Se cambian los tipos de datos de las columnas CODIGO_MUN y TEMP para poder realizar el correspondiente join. Cabe mencionar que en estos pasos no se realizó la adición o edición de datos de las columnas (agregando o quitando 0) ya que los datos de las columnas de ambas tablas coinciden perfectamente sin haber hecho ningun cambio previo.

yuca2018$TEMP <- as.character(yuca2018$CODIGO_MUN)
yuca2018$MPIO_CCDGO <- as.factor(yuca2018$TEMP)

Realizar el join con las tablas munic y yuca2018 con la columna MPIO_CCDGO:

yuca_munic = left_join(munic, yuca2018, by="MPIO_CCDGO")
Column `MPIO_CCDGO` joining factors with different levels, coercing to character vector

Producto del join:

head(yuca_munic)
Simple feature collection with 6 features and 24 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.84132 ymin: -4.229406 xmax: -69.3955 ymax: 0.09725686
CRS:            4326
  DPTO_CCDGO MPIO_CCDGO
1         91      91001
2         91      91263
3         91      91405
4         91      91407
5         91      91430
6         91      91460
                 MPIO_CNMBR
1                   LETICIA
2                EL ENCANTO
3               LA CHORRERA
4                LA PEDRERA
5       LA VICTORIA (Pacoa)
6 MIRITÍ-PARANÁ (Campoamor)
                      MPIO_CRSLC MPIO_NAREA
1  Decreto 352 de Feb 20 de 1964   6183.129
2 Decreto 274 de Mayo 28 de 1953  10897.481
3 Decreto 274 de Mayo 28 de 1953  12726.929
4 Decreto 274 de Mayo 28 de 1953  13670.317
5      ORD 12 DE JULIO 9 DE 1996   1432.795
6 Decreto 274 de Mayo 28 de 1953  16866.120
  MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area
1      2017   AMAZONAS   3.880001  0.5007018
2      2017   AMAZONAS   8.052697  0.8853254
3      2017   AMAZONAS   9.105101  1.0335830
4      2017   AMAZONAS   7.376291  1.1051976
5      2017   AMAZONAS   2.483170  0.1160863
6      2017   AMAZONAS   6.448395  1.3668663
  CODIGO_DEP DEPARTAMENTO CODIGO_MUN MUNICIPIO
1         91     AMAZONAS      91001   LETICIA
2         NA         <NA>         NA      <NA>
3         NA         <NA>         NA      <NA>
4         NA         <NA>         NA      <NA>
5         NA         <NA>         NA      <NA>
6         NA         <NA>         NA      <NA>
                  GRUPO SUBGRUPO CULTIVO YEAR
1 TUBERCULOS Y PLATANOS     YUCA    YUCA 2018
2                  <NA>     <NA>    <NA>   NA
3                  <NA>     <NA>    <NA>   NA
4                  <NA>     <NA>    <NA>   NA
5                  <NA>     <NA>    <NA>   NA
6                  <NA>     <NA>    <NA>   NA
  AREA_SEMBRADA AREA_COSECHADA PRODUCCION
1          1100           1100       7500
2            NA             NA         NA
3            NA             NA         NA
4            NA             NA         NA
5            NA             NA         NA
6            NA             NA         NA
  RENDIMIENTO           ESTADO CICLO  TEMP
1        6.82 TUBERCULO FRESCO ANUAL 91001
2        <NA>             <NA>  <NA>  <NA>
3        <NA>             <NA>  <NA>  <NA>
4        <NA>             <NA>  <NA>  <NA>
5        <NA>             <NA>  <NA>  <NA>
6        <NA>             <NA>  <NA>  <NA>
                        geometry
1 POLYGON ((-69.74085 -3.0026...
2 POLYGON ((-73.24647 -1.5029...
3 POLYGON ((-73.72362 -0.3804...
4 POLYGON ((-70.45577 -0.4957...
5 POLYGON ((-71.18431 0.09705...
6 POLYGON ((-71.48046 -0.0105...

Como se puede observar, la gran mayoría de los datos no tienen valores asignados (NA), pero no es por ningun error, los datos están correctos. Esto ocurrió por que, como se mencinó previamente, en el departamento del amazonas en el año 2018 solo hubo datos de producción de yuca en 2 de sus departamentos.

Reporyectamos los municipios para poder realizar el mapa.

rep_yuca <- st_transform(yuca_munic, crs = 3116)

Ploteamos el mapa de isopletas:

opar <- par(mar = c(0,0,1.2,0))

plot(st_geometry(rep_yuca), col = NA, border = "black", bg = "lavender")
smoothLayer(
  x = rep_yuca,
  var = 'PRODUCCION',
  typefct = "exponential",
  span = 70000,
  beta = 2,
  nclass = 10,
  col = carto.pal(pal1 = 'kaki.pal', n1= 10),
  border = NA,
  lwd = 0.1,
  mask = rep_yuca,
  legend.values.rnd = -3,
  legend.title.txt = "Producción",
  legend.pos = "topright",
  add = TRUE
)
text(x = 900000, y = 250000, cex = 0.6, adj = 0, font = 3, labels = "Función de distancia:\n- Tipo = Exponencial\n- beta = 2\n- span = 70 km")

layoutLayer(title = "Distribución de la producción de yuca en el Amazonas",
            sources = "Fuentes: DANE & MADR, 2018",
            author = "Paula Virgüez",
            frame = FALSE, north = FALSE, tabtitle = TRUE, theme = "kaki.pal")

north(pos = "topleft")

8. Guardar mapas

Aquí se guardará el archivo en una imagen de png con la resolución que se señala en el comando y las características para crear el archivo como colores, tamaños, posiciones, etc. Como se ha venido mencionando, gran parte de los datos son sin valor NA, entonces para este caso lo que a continuación se hizo fue reemplazar las celdas vacías y otorgarles el valor 0 a cada una de ellas, para que al plotear el mapa los demás datos fueran observables.

Para esto, se uso en las columnas PRODUCCIÓN y RENDIMIENTO con la función replace_na() de la librería tidyr:

rep_yuca %>% replace_na(list(PRODUCCION = list(0)))
rep_yuca %>% replace_na(list(RENDIMIENTO = list(0)))
rep_yuca <- rep_yuca %>% mutate(PRODUCCION = replace_na(PRODUCCION, 0))
rep_yuca <- rep_yuca %>% mutate(RENDIMIENTO = replace_na(PRODUCCION, 0))

Plotear el mapa, y guardar el archivo en png:

png("C:/Users/paula/Desktop/Geomatica/Cartografia_tematica/yuca_2018.png", width = 2048, height = 1526)
opar <- par(mar = c(0,0,5,5))
plot(st_geometry(rep_yuca), col = "lightcoral", border = "mistyrose2",
     bg = "mistyrose", lwd = 0.6)

propSymbolsChoroLayer(x = rep_yuca, var = "PRODUCCION", var2 = "RENDIMIENTO",
                      col = carto.pal(pal1 = "harmo.pal", n1 = 6),
                      inches = 0.8, method = "q6",
                      border = NA, lwd = 1,
                      legend.title.cex = 1.5, 
                      legend.values.cex = 1.0,
                      legend.var.pos = "topright",
                      legend.var2.pos = "left",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Rendimiento\n(en Ton/Ha)",
                      legend.var.title.txt = "Producción de yuca en 2018",
                      legend.var.style = "e")

labelLayer(
  x = rep_yuca,
  txt = "MPIO_CNMBR",
  col = "white",
  cex = 1.9,
  font = 4,
  halo = TRUE,
  bg = "black",
  r = 0.1,
  overlap = FALSE,
  show.lines = FALSE
)

layoutLayer(title = "Producción y rendimiento de yuca en el Amazonas, 2018",
            author = "Paula Virgüez",
            sources = "Fuentes: MADR & DANE, 2018",
            scale = 50, tabtitle = FALSE, frame = TRUE)

north(pos = "topleft")

title(main = "Producción y rendimiento de yuca en el Amazonas, 2018", cex.main = 3,
      sub = "Fuente: MADR & DANE, 2018", cex.sub=2)

graticule = TRUE

par(opar)

dev.off()
null device 
          1 

Mostrar la imagen .png realizada

library(ggplot2)
library(knitr)
include_graphics("C:/Users/paula/Desktop/Geomatica/Cartografia_tematica/yuca_2018.png")

NA
sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

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

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

other attached packages:
 [1] knitr_1.28            SpatialPosition_2.0.1
 [3] cartography_2.4.1     sf_0.9-2             
 [5] rgeos_0.5-2           readxl_1.3.1         
 [7] forcats_0.5.0         stringr_1.4.0        
 [9] dplyr_0.8.5           purrr_0.3.4          
[11] readr_1.3.1           tidyr_1.0.2          
[13] tibble_3.0.0          ggplot2_3.3.0        
[15] tidyverse_1.3.0       raster_3.1-5         
[17] sp_1.4-1             

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6       lubridate_1.7.8    lattice_0.20-38   
 [4] png_0.1-7          class_7.3-15       assertthat_0.2.1  
 [7] digest_0.6.25      R6_2.4.1           cellranger_1.1.0  
[10] backports_1.1.6    reprex_0.3.0       evaluate_0.14     
[13] e1071_1.7-3        httr_1.4.1         pillar_1.4.3      
[16] rlang_0.4.5        rstudioapi_0.11    rmarkdown_2.1     
[19] rgdal_1.4-8        munsell_0.5.0      broom_0.5.6       
[22] compiler_3.6.3     modelr_0.1.6       xfun_0.13         
[25] pkgconfig_2.0.3    base64enc_0.1-3    htmltools_0.4.0   
[28] tidyselect_1.0.0   codetools_0.2-16   fansi_0.4.1       
[31] crayon_1.3.4       dbplyr_1.4.3       withr_2.2.0       
[34] grid_3.6.3         lwgeom_0.2-3       nlme_3.1-144      
[37] jsonlite_1.6.1     gtable_0.3.0       lifecycle_0.2.0   
[40] DBI_1.1.0          magrittr_1.5       units_0.6-6       
[43] scales_1.1.0       KernSmooth_2.23-16 cli_2.0.2         
[46] stringi_1.4.6      fs_1.4.1           xml2_1.3.1        
[49] ellipsis_0.3.0     generics_0.0.2     vctrs_0.2.4       
[52] tools_3.6.3        glue_1.4.0         hms_0.5.3         
[55] slippymath_0.3.1   yaml_2.2.1         colorspace_1.4-1  
[58] isoband_0.2.1      classInt_0.4-3     rvest_0.3.5       
[61] haven_2.2.0       
LS0tDQp0aXRsZTogIkNhcnRvZ3JhZsOtYSB0ZW3DoXRpY2EgZW4gZWwgQW1hem9uYXMiDQphdXRob3I6ICJQYXVsYSBKdWxpYW5hIFZpcmd1ZXogR8OzbWV6Ig0KZGF0ZTogIjE3LzA1LzIwMjAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMgMS4gSW50cm9kdWNjacOzbg0KRWwgZGVwYXJ0YW1lbnRvIGRlbCBBbWF6b25hcyBlcyB1bm8gZGUgbG9zIDMyIGRlcGFydGFtZW50b3MgZGUgQ29sb21iaWEgeSBlc3TDoSB1YmljYWRvIGVuIGxhIHpvbmEgc3VyIGRlbCBwYcOtcywgY3VlbnRhIGNvbiAxMCBtdW5pY2lwaW9zIHkgc3UgY2FwaXRhbCBlcyBMZXRpY2lhLiBFc3RlIGRlcGFydGFtZW50byBjdWVudGEgY29uIHVuYSBkZSBsYXMgem9uYXMgbcOhcyBhbXBsaWFtZW50ZSBiaW9kaXZlcnNhcyBkZWwgbXVuZG8gZ3JhY2lhcyBhIHF1ZSBwb3NlZSBwYXJ0ZSBkZSBsYSBzZWx2YSBhbWF6w7NuaWNhIChsYSBtw6FzIGdyYW5kZSBkZWwgbXVuZG8pIHkgYWRpY2lvbmFsbWVudGUgdGFtYmllbiB0aWVuZSB1bmEgZ3JhbiBkaXZlcnNpZGFkIGRlIGN1bHR1cmFzIGluZMOtZ2VuYXMuIFN1IHViaWNhY2nDs24gZXMgdmVjaW5hIGEgbG9zIHBhw61zZXMgZGUgQnJhc2lsIHkgUGVyw7ouIEVsIEFtYXpvbmFzIHRpZW5lIHVuYSBzdXBlcmZpY2llIGRlIGNhc2kgMTEwLjAwMCBrbV4yXiwgZXN0w6EgYW1wbGlhbWVudGUgY3ViaWVydG8gZGUgc2VsdmEgeSBwb3NlZSB2YXJpb3MgcsOtb3MgcXVlIHNvbiB0cmlidXRhcmlvcyBkZWwgcsOtbyBhbWF6b25hcy4gTGEgZWNvbm9tw61hIHNlIGJhc2EgZW4gbGEgZXh0cmFjY2nDs24gZGUgZGlmZXJlbnRlcyBjdWx0aXZvcyBjb21vIG1hw616LCBwbMOhdGFubywgYXJyb3osIGNhw7FhIGRlIGF6w7pjYXIsIMOxYW1lLCBhZ3VhY2F0ZSwgeXVjYSwgY2FjYW8sIHBpw7FhLCBldGMuDQoNCkVzdGUgbm90ZWJvb2sgc2UgYmFzYSBlbiBtb3N0cmFyIHJlcHJlc2VudGFjaW9uZXMgZ3LDoWZpY2FzIGRlIGxvcyBkaWZlcmVudGVzIG1hcGFzIHRlbcOhdGljb3MgYmFzYWRvcyBlbiBsYXMgY2xhc2VzIGRlIGxhIGFzaWduYXR1cmEgZGUgR2VvbcOhdGljYSBiw6FzaWNhLCB1c2FuZG8gY29tbyByZWZlcmVuY2lhIGVsIGRlcGFydGFtZW50byBkZWwgQW1hem9uYXMgeSBzdSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEsIHBvciBtZWRpbyBkZWwgcHJvZ3JhbWEgUnN0dWRpby4NCg0KDQojIyMgMi4gQ2FydG9ncmFmw61hIHRlbcOhdGljYQ0KTGEgY2FydMOzZ3JhZmlhIHRlbcOhdGljYSBlcyB1biB0aXBvIGRlIG1hcGEsIGNsYXNpZmljYWRvIHNlZ3VuIHN1IHRpcG8gZGUgaW5mb3JtYWNpw7NuIHlhIHF1ZSBzZSBiYXNhIGVuIGxhIHJlcHJlc2VudGFjacOzbiBkZSB1bmEgdmFyaWFibGUgZXNwYWNpYWwgZGUgY2Fyw6FjdGVyIGbDrXNpY28sIHNvY2lhbCwgcG9sw610aWNvLCBldGMuIERlIGlndWFsIGZvcm1hLCBtdWVzdHJhIGF0cmlidXRvcyBvIGVzdGFkw61zdGljYXMgcXVlIHBlcm1pdGVuIHVuIG1lam9yIHJlbmRpbWllbnRvIGRlIGxvIHF1ZSBwYXNhIGVuIGRpdmVyc2FzIHJlZ2lvbmVzLg0KTGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSBjdWVudGEgY29uIGRpdmVyc2FzIHTDqWNuaWNhcyBkZSBtYXBlbyB0ZW3DoXRpY2EsIGVuIGVzZSBpbmZvcm1lICBzZSAgbW9zdHJhcsOhbiAgNCAgZGUgIGVsbGFzOg0KDQojIyMjICoyLjEgIE1hcGFzICBkZSAgY29yb3BsZXRhcyogDQpFc3RvcyBtYXBhcyBzb24gdXNhZG9zIHByaW5jaXBhbG1lbnRlIHBhcmEgcmVwcmVzZW50YXIgaW5mb3JtYWNpw7NuIGdlb2dyw6FmaWNhIGVuIHVuIFNJRy4gRW4gZXN0b3MgbWFwYXMgc2UgcHVlZGVuIG9ic2VydmFyIMOhcmVhcyBkZWZpbmlkYXMgbGFzIGN1YWxlcyB0aWVuZW4gdW4gdmFsb3IgZGUgdW5hIHZhcmlhYmxlIGNhZGEgdW5hLiBBZGVtw6FzLCBjYWRhIMOhcmVhIGRlZmluaWRhIGNvcnJlc3BvbmRlIGEgdW5hIHVuaWRhZCBlc3BhY2lhbCB5IGVsIHZhbG9yIHF1ZSBwb3NlZSByZXN1bWUgbGEgdmFyaWFibGUgZGVudHJvIGRlIGRpY2hhIMOhcmVhLiBQYXJhIGxvcyBtYXBhcyBkZSBjb3JvcGxldGFzIGVzIG11eSBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YSBsYSBjb3JyZWN0YSBkaXZpc2nDs24gZGUgdmFsb3JlcyBkZSBsYXMgdmFyaWFibGVzLCB1c3VhbG1lbnRlLCBlbCB1c28gZGUgZGlzdGludG9zIGNvbG9yZXMgZXMgIGVsICBtw6l0b2RvICBtw6FzICB1c2Fkby5bJF4xJF0oaHR0cHM6Ly92b2xheWEuZ2l0aHViLmlvL2xpYnJvLXNpZy9jaGFwdGVycy9NYXBhcy5odG1sKQ0KDQojIyMjICoyLjIgTWFwYXMgZGUgc8OtbWJvbG9zIHByb3BvcmNpb25hbGVzKg0KRXN0ZSB0aXBvIGRlIG1hcGFzIHJlcHJlc2VudGEgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgYSB0cmF2w6lzIGRlIHPDrW1ib2xvcyBlbiBkb25kZSBsb3MgdGFtYcOxb3MgZXN0w6FuIGVuIHJlbGFjacOzbiBjb24gZWwgdmFsb3IgcXVlIHNlIHF1aWVyZSByZXByZXNlbnRhciBwYXJhIGxhIHZhcmlhYmxlIG90b3JnYWRhLiBMb3Mgc8OtbWJvbG9zIHF1ZSB0aWVuZGVuIGEgdXNhcnNlIHBhcmEgZXN0ZSB0aXBvIGRlIG1hcGFzIHNvbiBjw61yY3Vsb3MsICBjdWFkcmFkb3MgIHkgIHRyacOhbmd1bG9zLlskXjIkXShodHRwOi8vd3d3Lmp1bnRhZGVhbmRhbHVjaWEuZXMvaW5zdGl0dXRvZGVlc3RhZGlzdGljYXljYXJ0b2dyYWZpYS9qb3JuYWRhcy8yMDE3L2pvcm5hZGFjYXJ0by9TSUd5Y2FydG9ncmFmaWF0ZW1hdGljYS5wZGYpDQoNCiMjIyMgKjIuMyBNYXBhcyBkZSBpc29sw61uZWFzKg0KTGFzIGlzb2zDrW5lYXMgc29uICdsw61uZWFzJyBjb24gdW4gdmFsb3IgY29uc3RhbnRlIGFzb2NpYWRvIGEgdG9kb3Mgc3VzIHB1bnRvcy4gVW4gbWFwYSBkZSBpc29sw61uZWFzIHJlcHJlc2VudGEgdmFsb3JlcyBjb250aW51b3MgcXVlIHNvbiBwcm9waW9zIGRlIGxhIHZhcmlhYmxlLlskXjMkXShodHRwczovL3d3dy50aG91Z2h0Y28uY29tL3RoZW1hdGljLW1hcHMtb3ZlcnZpZXctMTQzNTY5MikgRW4gZXN0ZSBjYXNvLCBlbCBkYXRvIGVzdMOhIGVuIHRvZG9zIGxvcyBwdW50b3MgZGVsIGVzcGFjaW8geSBkZSBmb3JtYSBjb250aW51YSwgcGVybyBzw7NsbyBzZSBtaWRlIGVuIGxvcyBwdW50b3MgZGUgY29udHJvbC4gTGFzIGzDrW5lYXMgc2UgdHJhemFuIGNvbiBpbnRlcnZhbG9zIGNvbnN0YW50ZXMgeSBwdWVkZW4gdGVuZXIgIGNvbG9yZXMgIHNlY3VlbmNpYWxlcy4NCg0KIyMjIyAqMi40IE1hcGFzIGRlIHB1bnRvcyoNCkVzdG9zIG1hcGFzIHNlIGVtcGxlYW4gcHJpbmNpcGFsZW1udGUgcGFyYSByZXByZXNlbnRhciB2YXJpYWJsZXMgcXVlIHJlcHJlc2VudGVuIGNhbnRpZGFkLiBFc2FzIGNhbnRpZGFkZXMgc29uIHRyYXphZGFzIG1lZGlhbnRlIGxhIHJlcGV0aWNpw7NuIGRlIHB1bnRvcyBlbiBuw7ptZXJvIHByb3BvcmNpb25hbCBhIHN1IHRhbWHDsW8uIENhZGEgcHVudG8gcmVwcmVzZW50YSB1biB2YWxvciB5IGVsIGNvbmp1bnRvIGRlIHRvZG9zIGVzb3MgcHVudG9zIHN1bWEgbGEgdG90YWxpZGFkICBhICByZXByZXNlbnRhci4gDQoNCiMjIyAzLiBEYXRvcw0KTG9zIGRhdG9zIGRlIGVzdGUgaW5mb3JtZSBoYWNlbiByZWZlcmVuY2lhIGEgbGFzIE5lY2VzaWRhZGVzIELDoXNpY2FzIGluc2F0aXNmZWNoYXMgKE5CSSksIGxhcyBjdWFsZXMgZnVlcm9uIHRvbWFkYXMgZGVsIFtHZW9wb3J0YWwgREFORV0oaHR0cHM6Ly93d3cuZGFuZS5nb3YuY28vaW5kZXgucGhwL2VzdGFkaXN0aWNhcy1wb3ItdGVtYS9wb2JyZXphLXktY29uZGljaW9uZXMtZGUtdmlkYS9uZWNlc2lkYWRlcy1iYXNpY2FzLWluc2F0aXNmZWNoYXMtbmJpKS4gUGFyYSB1biBjb3JyZWN0byB1c28gZGUgbG9zIGRhdG9zLCBhbCBkZXNjYXJnYXJsb3MsIHNlIGVkaXRvIGRlc2RlIGVsIHByb2dyYW1hIGRlIGV4Y2VsIHkgc2UgZWxpbWluYXJvbiBsb3MgZGF0b3MgcXVlIGVuIGVzdGUgZG9jdW1lbnRvIG5vIHNvbiByZWxldmFudGVzIGNvbm9jZXJsb3M7IHNlIGFkZWN1YXJvbiBsb3MgZGF0b3MgYWwgZGVwYXJ0YW1lbnRvIGRlbCBBbWF6b25hcy4NCg0KIyMjIDQuIFBhcXVldGVzIHkgbGlicmVyw61hcyBuZWNlc2FyaWFzDQoNClByaW1lcm8gYm9ycmFtb3MgbGEgbWVtb3JpYToNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpgYGANCg0KSW5zdGFsYW1vcyBsb3MgcGFxdWV0ZXMgbmVjZXNhcmlvcyB5IHF1ZSBubyBzZSBoYW4gaW5zdGFsYWRvIGNvbiBhbnRlcmlvcmlkYWQ6DQpgYGB7cn0NCmxpc3Qub2YucGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiwgInJnZW9zIiwgInNmIiwgInJhc3RlciIsICJjYXJ0b2dyYXBoeSIsICJTcGF0aWFsUG9zaXRpb24iKQ0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KYGBgDQoNCkNhcmdhbW9zIGxhcyBsaWJyZXJpYXM6DQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShyZ2VvcykNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHJhc3RlcikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHNmKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoY2FydG9ncmFwaHkpDQpsaWJyYXJ5KFNwYXRpYWxQb3NpdGlvbikNCmBgYA0KDQojIyMgNS4gTGVlciBsb3MgZGF0b3MgZGUgbGFzIE5CSQ0KDQpFbiBlc3RlIHBhc28gZWplY3V0YW1vcyBlbCBjw7NkaWdvIHNpZ3VpZW50ZSBwYXJhIGxlZXIgZWwgZG9jdW1lbnRvIGRlIGV4Y2VsIG1lbmNpb25hZG8gcHJldmlhbWVudGUsIHkgb3RvcmdhcmxlIHVuIG5vbWJyZSxlbiBlc3RlIGNhc28gc2UgbGUgZGlvIGVsIG5vbWJyZSBkZSAqbmJpKi4NCmBgYHtyfQ0KbmJpIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3BhdWxhL0Rlc2t0b3AvR2VvbWF0aWNhL0NhcnRvZ3JhZmlhX3RlbWF0aWNhL0NOUFYtMjAxOC1OQkkueGxzeCIpDQpgYGANCiAgDQpWZXIgbGFzIHByaW1lcmFzIDYgZmlsYXMgZGVsIGRvY3VtZW50byBwYXJhIHZlcmlmaWNhciBxdWUgbG9zIGRhdG9zIHNlYW4gY29ycmVjdG9zOg0KYGBge3J9DQpoZWFkKG5iaSkNCmBgYA0KDQpQYXJhIGxvIHNpZ3VpZW50ZSwgc2UgZWplY3V0YSBlbCBjw7NkaWdvIHBhcmEgZmlsdHJhciBsb3MgZGF0b3MgY29uIG1heW9yZXMgbml2ZWxlcyBkZSBOQkkgeSBwb25lcmxvcyBlbiB1bmEgbnVldmEgdGFibGEuIEFsIG9ic2VydmFyIGVzb3MgZGF0b3Mgc2UgcHVlZGUgY29uY2x1aXIgcXVlIGVsIG11bmljaXBpbyBkZSBMYSBWaWN0b3JpYSB0aWVuZSB1biBOQkkgZGUgY2FzaSA5MSwgbG8gcXVlIHNpZ25pZmljYSBxdWUgZWwgbml2ZWwgZGUgcG9icmV6YSBlcyBiYXN0YW50ZSBhbHRvLg0KYGBge3J9DQpuYmkgJT4lIA0KICBzbGljZSh3aGljaC5tYXgoTkJJKSkgLT4gbWF4X25iaQ0KbWF4X25iaQ0KYGBgDQoNCkFxdcOtIHNlIHRpZW5lIGxhIG1pc21hIG1ldG9kb2xvZ8OtYSBjb24gbGEgZGlmZXJlbmNpYSBkZSBxdWUgc2UgZmlsdHJhcm9uIGxvcyBkYXRvcyBjb24gbG9zICBtZW5vcmVzIG5pdmVsZXMgZGUgTkJJLiBDb21vIHNlIG9ic2VydmEsIGVuIExldGljaWEgbG9zIG5pdmVsZXMgZGUgTkJJIHNvbiBkZSBhcHJveGltYWRhbWVudGUgMzAgbm8gZXMgdW4gbml2ZWwgbXV5IGJham8sIGxvIHF1ZSBjb25jaWVybmUgYSBxdWUgZWIgZ2VuZXJhbCBlbCBkZXBhcnRhbWVudG8gZGVsIEFtYXpvbmFzIHRpZW5lIHVuIG5pdmVsIGFsdG8gZGUgcG9icmV6YS4NCmBgYHtyfQ0KbmJpICU+JSANCiAgc2xpY2Uod2hpY2gubWluKE5CSSkpIC0+IG1pbl9uYmkNCg0KbWluX25iaQ0KYGBgDQogIA0KQWwgY29ycmVyIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIHNlIG9ic2VydmFuIGxvcyBkYXRvcyBkZSBsYSB0YWJsYSAqbmJpKiBwZXJvIGNvbiBsb3MgZGF0b3MgZGUgTkJJIGVuIGZvcm1hIGRlc2NlbmRlbnRlLg0KYGBge3J9DQpuYmkgJT4lIA0KICBhcnJhbmdlKGRlc2MoTkJJKSkgLT4gZGVzY19uYmkNCg0KZGVzY19uYmkNCmBgYA0KDQoNCiMjIyA2LiBVbmnDs24gZGUgZGF0b3MgZGUgTkJJIGEgbXVuaWNpcGlvcyANCiANCkVuIGVsIHNpZ3VpZW50ZSBwYXNvLCBzZSBjYXJnYXJhbiBsb3MgZGF0b3MgZGUgbG9zIG11bmljaXBpb3MgZGVsIEFtYXpvbmFzIHF1ZSBmdWVyb24gb3B0ZW5pZG9zIGVuIGxhIHJlYWxpemFjacOzbiBkZSB1biBOb3RlYm9vayBhbnRlcmlvci4NCmBgYHtyfQ0KbXVuaWMgPC0gc3RfcmVhZCgiQzovVXNlcnMvcGF1bGEvRGVza3RvcC9HZW9tYXRpY2EvRGF0b3NfZGUgX2VsZXZhY2lvbl9lbl9SL0FtYXpvbmFzX2RhdG9zX0RBTkUvOTFfQU1BWk9OQVMvQURNSU5JU1RSQVRJVk8vTUdOX01QSU9fUE9MSVRJQ08uc2hwIikNCmBgYA0KDQpTZSBlamVjdXRhIGVsIHNpZ3VpZW50ZSBjb21hbmRvIHBhcmEgb2JzZXJ2YXIgdW5pY2FtZW50ZSBsYSBjb2x1bW5hIGRlIGxvcyBjw7NkaWdvcyBkZSBsb3MgbXVuaWNpcGlvcyAqTVBJT19DQ0RHTyogcGFyYSBjb21wcm9iYXIgcXVlIGVzb3MgZGF0b3Mgc29uIGVxdWl2YWxlbnRlcyBhIGxvcyBjw7NkaWdvcyBkZSBsYSB0YWJsYSAqbmJpKi4NCmBgYHtyfQ0KaGVhZChtdW5pYyRNUElPX0NDREdPKQ0KYGBgDQogIA0KUmVhbGl6YW1vcyBsYSB1bmnDs24gZGUgZXNhcyBkb3MgY29sdW1uYXMgY29uIGxhIGZ1bmNpb24gZGUgKmxlZnRfam9pbiouDQpgYGB7cn0NCm5iaV9tdW5pYyA9IGxlZnRfam9pbihtdW5pYywgbmJpLCBieT0gYygiTVBJT19DQ0RHTyI9IkNPRElHTyIpKQ0KYGBgDQogIA0KQ3JlYW1vcyB1bmEgbnVldmEgdGFibGEgY29uIGxhcyBjb2x1bW5hcyBkZSBNVU5JQ0lQSU8sIE1QSU9fQ0NER08geSBOQkk7IHBhcmEgY29tcHJvYmFyIHF1ZSBlbCBqb2luIGZ1ZSBleGl0b3NvLg0KYGBge3J9DQpuYmlfbXVuaWMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KE1VTklDSVBJTyxNUElPX0NDREdPLE5CSSkgLT4gY2hlY2tfbmJpX211bmljDQoNCmhlYWQoY2hlY2tfbmJpX211bmljKQ0KYGBgDQpgYGB7cn0NCm5iaV9tdW5pY19uZXcgPC0gc3RfdHJhbnNmb3JtKG5iaV9tdW5pYywgY3JzID0gMzExNikNCmBgYA0KDQojIyMgNy4gRWplbXBsb3MgZGUgbWFwYXMgdGVtw6F0aWNvcw0KUGFyYSBsbGV2YXIgYSBjYWJvIGVzdG9zIG1hcGFzIHRlbcOhdGljb3MgZnVlIG5lY2VzYXJpbyBoYWNlciB1c28gZGVsIHBhcXVldGUgICpjYXJ0b2dyYXBoeSogeWEgcXVlIGxhIGNhbGlkYWQgZGUgbG9zIG1hcGFzIGVuIGVzdGEgbGlicmVyw61hIGVzIGFkZWN1YWRhIHkgYnVlbmEuIFBhcmEgcG9kZXIgaGFjZXIgdXNvIGVzIGVzdGEgbGlicmVyw61hIHNlIG5lY2VzaXRhbiBvYmpldG9zIGVzcGFjaWFsZXMgcXVlIGVuIGVzdGUgY2FzbyBlcyAqc2YqIChTaW1wbGUgRmVhdHVyZXMpLg0KDQojIyMjICo3LjEgU8OtbWJvbG9zIHByb3BvcmNpb25hbGVzIHVzYW5kbyBPcGVuU3RyZWV0TWFwKg0KRW4gbG9zIHNpZ3VpZW50ZXMgY29tYW5kb3Mgc2UgaGFjZW4gdXNvIGRpc3RpbnRhcyBmdW5jaW9uZXMgY29tbyAqZ2V0VGlsZXMoKSogcXVlIGRlc2NhcmdhIGxvcyBkYXRvcyB5ICp0aWxlcyBMYXllcigpKiBxdWUgZXN0w6FuIGVuY2FyZ2FkYXMgZGUgbW9zdHJhciBsb3MgZGF0b3MuIFBhcmEgdmlzdWFsaXphciBsb3Mgc2ltYm9sb3MgY29uIGFyZWFzIHByb3BvcmNpb25hbGVzIGRlIHVuYSB2YXJpYWJsZSBjdWFudGl0YXRpdmEgc2UgdXNhIGxhIGZ1bmNpb24gKnByb3BTeW1ib2xzTGF5ZXIoKSoNCmBgYHtyfQ0KbXVuLm9zbSA8LSBnZXRUaWxlcygNCiAgeCA9IG5iaV9tdW5pY19uZXcsDQogIHR5cGUgPSAiT3BlblN0cmVldE1hcCIsDQogIHpvb20gPSA4LA0KICBjYWNoZWRpciA9IFRSVUUsDQogIGNyb3AgPSBUUlVFDQopDQpgYGANCmBgYHtyfQ0Kb3BhciA8LSBwYXIobWFyID0gYygyLDAsMS4yLDApKQ0KdGlsZXNMYXllcih4ID0gbXVuLm9zbSkNCnBsb3Qoc3RfZ2VvbWV0cnkobmJpX211bmljX25ldyksIGNvbD0gTkEsIGJvcmRlciA9ICJkYXJrZ3JlZW4iLCB3ZWlndGggPSAyLCBhZGQ9IFRSVUUpDQpwcm9wU3ltYm9sc0xheWVyKA0KICB4ID0gbmJpX211bmljX25ldywNCiAgdmFyID0gIk5CSSIsDQogIGluY2hlcyA9IDAuMjUsICAgIyBpbmNoZXMgaGFjZSByZWZlcmVuY2lhIGFsIHRhbWHDsW8gZGUgbGFzIGZpZ3VyYXMNCiAgY29sID0gInBlcnUiLA0KICBsZWdlbmQucG9zID0gInRvcHJpZ2h0IiwNCiAgbGVnZW5kLnRpdGxlLnR4dCA9ICJOQkkgdG90YWxlcyINCikNCmxheW91dExheWVyKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGFzIE5CSSBlbiBlbCBBbWF6b25hcyIsDQogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZTogREFORSwgMjAxOFxuwqkgT3BlblN0cmVldE1hcCIsDQogICAgICAgICAgICBhdXRob3IgPSAiUGF1bGEgVmlyZ8O8ZXoiLA0KICAgICAgICAgICAgZnJhbWUgPSBUUlVFLCBub3J0aCA9IEZBTFNFLCB0YWJ0aXRsZSA9IFRSVUUpDQpub3J0aChwb3MgPSAidG9wbGVmdCIpDQpgYGANCg0KIyMjIyAqNy4yIENvcm9wbGV0YXMqDQpFbiBlc3RlIGNhc28gdXNhcmVtb3MgbGEgZnVuY2nDs24gKmNob3JvTGF5ZXIoKSogbGEgY3VhbCBlc3TDoSBlbmNhcmdhZGEgZGUgbW9zdHJhciBsb3MgbWFwYXMgZW4gY29yb3BsZXRhcyB0YWwgY29tbyBzZSBleHBsaWPDsyBwcmV2aWFtZW50ZS4NCmBgYHtyfQ0Kb3BhciA8LSBwYXIobWFyID0gYyAoMCwwLDEuMiwwKSkNCnBhcihiZyA9ICJncmV5OTAiKQ0KcGxvdChzdF9nZW9tZXRyeShuYmlfbXVuaWNfbmV3KSwgY29sID0gTkEsIGJvcmRlciA9IE5BLCBiZyA9ICIjODVDMUU5IikNCmNob3JvTGF5ZXIoDQogIHg9IG5iaV9tdW5pY19uZXcsDQogIHZhciA9ICJOQkkiLA0KICBtZXRob2QgPSAiZ2VvbSIsDQogIG5jbGFzcyA9IDUsDQogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gImtha2kucGFsIiwgbjEgPSA1KSwgIyBjYXJ0by5wYWwoKSBlcyB1c2FkbyBwYXJhIGRlZmluaXIgbGEgcGFsZXRhIGRlIGNvbG9yZXMgcXVlIHNlIHZhIGEgZW1wbGVhciBlbiBlbCBtYXBhDQogIGJvcmRlciA9ICJ3aGl0ZSIsDQogIGx3ZCA9IDAuNSwNCiAgbGVnZW5kLnBvcyA9ICJ0b3ByaWdodCIsDQogIGxlZ2VuZC50aXRsZS50eHQgPSAiTkJJIiwNCiAgYWRkID0gVFJVRQ0KKQ0KbGF5b3V0TGF5ZXIodGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBsYXMgTkJJIGVuIGVsIEFtYXpvbmFzIiwNCiAgICAgICAgICAgIHNvdXJjZXMgPSAiRnVlbnRlOiBEQU5FLCAyMDE4LiIsDQogICAgICAgICAgICBhdXRob3IgPSAiUGF1bGEgVmlyZ8O8ZXoiLA0KICAgICAgICAgICAgZnJhbWUgPSBUUlVFLCBub3J0aCA9IEZBTFNFLCB0YWJ0aXRsZSA9IFRSVUUsIGNvbCA9ICJibGFjayIpDQpub3J0aChwb3MgPSAidG9wbGVmdCIpDQpgYGANCg0KIyMjIyAqNy4zIFPDrW1ib2xvcyBwcm9wb3JjaW9uYWxlcyB5IG1hcGEgZGUgdGlwb2xvZ8OtYSoNCkVuIGVzdGUgbWFwYSBsb3Mgc8OtbWJvbG9zIHRpZW5lbiB1biB0YW1hw7FvIHF1ZSBlcyBwcm9wb3JjaW9uYWwgYSB1bmEgdmFyaWFibGUgY3VhbnRpdGF0aXZhIHF1ZSBzZSBxdWllcmUgcmVzYWx0YXIgeSBjb2xvcmVhZG9zIGVuIGZ1bmNpb24gZGVsIHZhbG9yIGRlIHVuYSBzZWd1bmRhIHZhcmlhYmxlIHF1ZSBlcyBjdWFsaXRhdGl2YS4NCg0KQSBjb250aW51YWNpw7NuLCBzZSBoYWNlIHVzbyBkZSBsYSBmdW5jacOzbiAqbXV0YXRlKCkqIGRlbCBwYXF1ZXRlICoqZHBseXIqKiBwYXJhIGNyZWFyIHVuYSBudWV2YSBjb2x1bW5hLCBlbiBlc3RlIGNhc28gc2UgYWRpY2lvbmEgdW5hIGNvbHVtbmEgbnVldmEgY29uIGluZm9ybWFjacOzbiBkZSBsYSBwb2JyZXphIGVuIGVsIGFtYXpvbmFzIHBlcm8gZGlmZXJlbmNpYW5kbyBsb3MgZGF0b3MgY29uIGludGVydmFsb3MgZGlmZXJlbnRlcy4NCmBgYHtyfQ0KbmJpX211bmljXzIgPC0gZHBseXI6Om11dGF0ZShuYmlfbXVuaWNfbmV3LCBQb2JyZXphID0gaWZlbHNlKE1JU0VSSUEgPiAyMCwgIkV4dHJlbW8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEhBQ0lOQU1JRU5UTyA+IDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdG8iLCAiSW50ZXJtZWRpbyIpKSkNCmBgYA0KQ29tbyBwb2RlbW9zIG9ic2VydmFyLCBlbiBsYSB0YWJsYSBhcGFyZWNlIGxhIG51ZXZhIGNvbHVtbmEgZGUgIipQb2JyZXphKiINCmBgYHtyfQ0KaGVhZChuYmlfbXVuaWNfMikNCmBgYA0KDQpQbG90ZWFyIGVsIG1hcGENCmBgYHtyfQ0KbGlicmFyeShzZikNCmxpYnJhcnkoY2FydG9ncmFwaHkpDQpvcGFyIDwtIHBhcihtYXIgPSBjKDAsMCwxLjIsMCkpDQogIHBsb3Qoc3RfZ2VvbWV0cnkobmJpX211bmljXzIpLCBjb2wgPSAiI0U1RThFOCIsIGJvcmRlciA9ICIjQjJCQUJCIiwgYmcgPSAiI0VCRjVGQiIsDQogICAgIGx3ZCA9IDAuNSkNCnByb3BTeW1ib2xzVHlwb0xheWVyKA0KICB4ID0gbmJpX211bmljXzIsDQogIHZhciA9ICJOQkkiLCAjIFZhcmlhYmxlIGN1YW50aXRhdGl2YQ0KICBpbmNoZXMgPSAwLjUsDQogIHN5bWJvbHMgPSAic3F1YXJlIiwNCiAgYm9yZGVyID0gIndoaXRlIiwNCiAgbHdkID0gLjUsDQogIGxlZ2VuZC52YXIucG9zID0gInRvcHJpZ2h0IiwNCiAgbGVnZW5kLnZhci50aXRsZS50eHQgPSAiTkJJIiwNCiAgdmFyMiA9ICJQb2JyZXphIiwgIyBWYXJpYWJsZSBjdWFsaXRhdGl2YQ0KICBsZWdlbmQudmFyMi52YWx1ZXMub3JkZXIgPSBjKCJFeHRyZW1vIiwgIkFsdG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm1lZGlvIiksDQogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gInBhc3RlbC5wYWwiLCBuMSA9IDMpLA0KICBsZWdlbmQudmFyMi5wb3MgPSBjKDgyMDAwMCwxMDAwMDApLA0KICBsZWdlbmQudmFyMi50aXRsZS50eHQgPSAiUG9icmV6YSINCikNCmxheW91dExheWVyKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGFzIE5CSSBlbiBlbCBBbWF6b25hcyIsDQogICAgICAgICAgICBhdXRob3IgPSAiUGF1bGEgVmlyZ8O8ZXoiLA0KICAgICAgICAgICAgc291cmNlcyA9ICJGdWVudGU6IERBTkUsIDIwMTguIiwNCiAgICAgICAgICAgIHNjYWxlID0gMTAwLCB0YWJ0aXRsZSA9IFRSVUUsIGZyYW1lID0gRkFMU0UsIHBvc3RpdGxlID0gInJpZ2h0IiwNCiAgICAgICAgICAgIGNvbCA9ICJ3aGl0ZSIsIGNvbHRpdGxlID0gImJsYWNrIikNCm5vcnRoKHBvcyA9ICJ0b3BsZWZ0IikNCmBgYA0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgcHJpbmNpcGFsbWVudGUgaGFjaWEgZWwgbm9ydGUgZGVsIGRlcGFydGFtZW50byBzZSBlbmN1ZW50cmFuIG11bmljaXBpb3MgY29uIG1heW9yIHBvYnJlemEgeSB0YW1iacOpbiBoYWNpYSAgZWwgIHN1ci4NCg0KIyMjIyAqNy40IE1hcGFzIGRlIGV0aXF1ZXRhcyoNCkVuIGVzdGUgY2FzbyBzZSBjb21iaW5hcsOhbiBsYXMgZnVuY2lvbmVzIGRlICpjaG9yb0xheWVyKCkqIHkgKmxhYmVsTGF5ZXIqLiBDYW1iacOpIGxvcyBjb2xvcmVzIGRlIGxvcyBtdW5pY2lwaW9zLCBlbCBmb25kbyBkZSBsYSBpbWFnZW4sIGxhIHBvc2ljacOzbiBkZWwgc8OtbWJvbG8gTm9ydGUsIGxhIHBhbGV0YSBkZSBjb2xvcmVzLCBldGMuDQpgYGB7cn0NCm9wYXIgPC0gcGFyKG1hciA9IGMoMCwwLDEuMiwwKSkNCnBhciAoYmcgPSAiZ3JleTI1IikNCnBsb3Qoc3RfZ2VvbWV0cnkobmJpX211bmljXzIpLCBjb2wgPSAiI2U0ZTlkZSIsIGJvcmRlciA9ICIjMDAwMDAwIiwNCiAgICAgYmcgPSAid2hpdGUiLCBsd2QgPSAwLjUpDQpjaG9yb0xheWVyKA0KICB4PSBuYmlfbXVuaWNfbmV3LA0KICB2YXIgPSAiTkJJIiwNCiAgbWV0aG9kID0gImdlb20iLA0KICBuY2xhc3MgPSA1LA0KICBjb2wgPSBjYXJ0by5wYWwocGFsMSA9ICJibHVlLnBhbCIsIG4xID0gNiksDQogIGJvcmRlciA9ICJncmV5MTAiLA0KICBsd2QgPSAwLjUsDQogIGxlZ2VuZC5wb3MgPSBjKDE2MDAwMDAsIDEwMDAwMCksDQogIGxlZ2VuZC50aXRsZS50eHQgPSAiTkJJIiwNCiAgYWRkID0gVFJVRQ0KKQ0KbGFiZWxMYXllcigNCiAgeD0gbmJpX211bmljXzIsDQogIHR4dCA9ICJNVU5JQ0lQSU8iLA0KICBjb2wgPSAiZ3JleTIwIiwNCiAgY2V4ID0gMC41LA0KICBmb250ID0gNCwNCiAgaGFsbyA9IFRSVUUsDQogIGJnID0gIndoaXRlIiwNCiAgciA9IDAuMSwNCiAgb3ZlcmxhcCA9IEZBTFNFLA0KICBzaG93LmxpbmVzID0gRkFMU0UNCikNCg0KbGF5b3V0TGF5ZXIoDQogIHRpdGxlID0gIk11bmljaXBpb3MgZGVsIEFtYXpvbmFzIiwNCiAgc291cmNlcyA9ICJGdWVudGU6IERBTkUsIDIwMTguIiwNCiAgYXV0aG9yID0gIlBhdWxhIFZpcmfDvGV6IiwNCiAgZnJhbWUgPSBUUlVFLA0KICBub3J0aCA9IEZBTFNFLA0KICB0YWJ0aXRsZSA9IFRSVUUsDQogIHRoZW1lID0gImJsdWUucGFsIg0KKQ0Kbm9ydGgocG9zID0gInRvcGxlZnQiKQ0KYGBgDQogICANCiMjIyMgKjcuNSBNYXBhIGRlIElzb3BsZXRhcyoNClBhcmEgZXN0ZSBtYXBhIHNlIHVzYXLDoW4gbG9zIGRhdG9zIGVzdGFkw61zdGljb3MgZGUgbGEgcHJvZHVjY2nDs24gZGUgeXVjYSBkZWwgYcOxbyAyMDE4IGVuIGVsIEFtYXpvbmFzLiBFc3RvcyBkYXRvcyBmdWVyb24gdXNhZG9zIGVuIHVuIE5vdGVib29rIGFudGVyaW9yLCBzaW4gZW1iYXJnbywgc2UgbW9kaWZpY8OzIGVsIGFyY2hpdm8gZWxpbWluYW5kbyB0b2RvcyBsb3MgdmFsb3JlcyBubyByZWxhY2lvbmFkb3MgYWwgYcOxbyAyMDE4IHBhcmEgbm8gdGVuZXIgaW5jb252ZW5pZW50ZXMgcG9zdGVyaW9ybWVudGUuDQoNCkNhcmdhciBsb3MgZGF0b3M6DQpgYGB7cn0NCmN1bHRpdm9zMjAxOCA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9DYXJ0b2dyYWZpYV90ZW1hdGljYS9FVkFfQW1hem9uYXNfMjAxOC54bHN4IikNCmBgYA0KYGBge3J9DQpoZWFkKGN1bHRpdm9zMjAxOCkNCmBgYA0KDQpFbiBlc3RlIGNhc28sIG9wdMOpIHBvciB1c2FyIGVzdGUgY3VsdGl2byB5YSBxdWUsIGJhc2FuZG9tZSBlbiBlbCBOb3RlYm9vayBhbnRlcmlvciwgbGEgeXVjYSBlcyBlbCBjdWx0aXZvIHF1ZSB0dXZvIGxvcyB2YWxvcmVzIG3DoXMgYWx0b3MgZGUgcHJvZHVjY2nDs24gZW4gZWwgYcOxbyAyMDE4IGVuIGVsIEFtYXpvbmFzLCBhdW5xdWUgc29sbyBodWJpZXJvbiBkYXRvcyBlbiBkb3MgbXVuaWNpcGlvcyBkZWwgZGVwYXJ0YW1lbnRvLCBsb3MgdmFsb3JlcyBkZSBwcm9kdWNjacOzbiBmdWVyb24gbG9zIG3DoXMgYWx0b3MgZGUgbG9zIHF1ZSBzZSB0aWVuZSByZWdpc3RybywgeSBzb24gaWRlYWxlcyBwYXJhIHBvZGVyIHRlbmVyIHVuYSBtZWpvciByZXByZXNlbnRhY2nDs24gZGVsIG1hcGEgZGUgaXNvcGxldGFzLg0KQXF1w60gc2UgdXPDsyBsYSBmdW5jacOzbiAqZmlsdGVyKCkqIGp1c3RhbWVudGUgcGFyYSBmaWx0cmFyIHVuaWNhbWVudGUgbG9zIGRhdG9zIGRlbCBjdWx0aXZvIGRlIHl1Y2E6DQpgYGB7cn0NCmN1bHRpdm9zMjAxOCAlPiUgDQogIGZpbHRlcihDVUxUSVZPID09ICJZVUNBIikgLT4geXVjYTIwMTgNCmBgYA0KDQpTZSBjYW1iaWFuIGxvcyB0aXBvcyBkZSBkYXRvcyBkZSBsYXMgY29sdW1uYXMgKkNPRElHT19NVU4qIHkgKlRFTVAqIHBhcmEgcG9kZXIgcmVhbGl6YXIgZWwgY29ycmVzcG9uZGllbnRlICoqam9pbioqLg0KQ2FiZSBtZW5jaW9uYXIgcXVlIGVuIGVzdG9zIHBhc29zIG5vIHNlIHJlYWxpesOzIGxhIGFkaWNpw7NuIG8gZWRpY2nDs24gZGUgZGF0b3MgZGUgbGFzIGNvbHVtbmFzIChhZ3JlZ2FuZG8gbyBxdWl0YW5kbyAwKSB5YSBxdWUgbG9zIGRhdG9zIGRlIGxhcyBjb2x1bW5hcyBkZSBhbWJhcyB0YWJsYXMgY29pbmNpZGVuIHBlcmZlY3RhbWVudGUgc2luIGhhYmVyIGhlY2hvIG5pbmd1biBjYW1iaW8gcHJldmlvLg0KYGBge3J9DQp5dWNhMjAxOCRURU1QIDwtIGFzLmNoYXJhY3Rlcih5dWNhMjAxOCRDT0RJR09fTVVOKQ0KYGBgDQpgYGB7cn0NCnl1Y2EyMDE4JE1QSU9fQ0NER08gPC0gYXMuZmFjdG9yKHl1Y2EyMDE4JFRFTVApDQpgYGANCiAgIA0KUmVhbGl6YXIgZWwgam9pbiBjb24gbGFzIHRhYmxhcyAqbXVuaWMqIHkgKnl1Y2EyMDE4KiBjb24gbGEgY29sdW1uYSAqKk1QSU9fQ0NER08qKjoNCmBgYHtyfQ0KeXVjYV9tdW5pYyA9IGxlZnRfam9pbihtdW5pYywgeXVjYTIwMTgsIGJ5PSJNUElPX0NDREdPIikNCmBgYA0KUHJvZHVjdG8gZGVsIGpvaW46DQpgYGB7cn0NCmhlYWQoeXVjYV9tdW5pYykNCmBgYA0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgbGEgZ3JhbiBtYXlvcsOtYSBkZSBsb3MgZGF0b3Mgbm8gdGllbmVuIHZhbG9yZXMgYXNpZ25hZG9zICgqTkEqKSwgcGVybyBubyBlcyBwb3IgbmluZ3VuIGVycm9yLCBsb3MgZGF0b3MgZXN0w6FuIGNvcnJlY3Rvcy4gRXN0byBvY3VycmnDsyBwb3IgcXVlLCBjb21vIHNlIG1lbmNpbsOzIHByZXZpYW1lbnRlLCBlbiBlbCBkZXBhcnRhbWVudG8gZGVsIGFtYXpvbmFzIGVuIGVsIGHDsW8gMjAxOCBzb2xvIGh1Ym8gZGF0b3MgZGUgcHJvZHVjY2nDs24gZGUgeXVjYSBlbiAgMiAgZGUgIHN1cyAgZGVwYXJ0YW1lbnRvcy4NCg0KDQpSZXBvcnllY3RhbW9zIGxvcyBtdW5pY2lwaW9zIHBhcmEgcG9kZXIgcmVhbGl6YXIgZWwgbWFwYS4NCmBgYHtyfQ0KcmVwX3l1Y2EgPC0gc3RfdHJhbnNmb3JtKHl1Y2FfbXVuaWMsIGNycyA9IDMxMTYpDQpgYGANCiAgIA0KUGxvdGVhbW9zIGVsIG1hcGEgZGUgaXNvcGxldGFzOg0KYGBge3J9DQpvcGFyIDwtIHBhcihtYXIgPSBjKDAsMCwxLjIsMCkpDQoNCnBsb3Qoc3RfZ2VvbWV0cnkocmVwX3l1Y2EpLCBjb2wgPSBOQSwgYm9yZGVyID0gImJsYWNrIiwgYmcgPSAibGF2ZW5kZXIiKQ0Kc21vb3RoTGF5ZXIoDQogIHggPSByZXBfeXVjYSwNCiAgdmFyID0gJ1BST0RVQ0NJT04nLA0KICB0eXBlZmN0ID0gImV4cG9uZW50aWFsIiwNCiAgc3BhbiA9IDcwMDAwLA0KICBiZXRhID0gMiwNCiAgbmNsYXNzID0gMTAsDQogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gJ2tha2kucGFsJywgbjE9IDEwKSwNCiAgYm9yZGVyID0gTkEsDQogIGx3ZCA9IDAuMSwNCiAgbWFzayA9IHJlcF95dWNhLA0KICBsZWdlbmQudmFsdWVzLnJuZCA9IC0zLA0KICBsZWdlbmQudGl0bGUudHh0ID0gIlByb2R1Y2Npw7NuIiwNCiAgbGVnZW5kLnBvcyA9ICJ0b3ByaWdodCIsDQogIGFkZCA9IFRSVUUNCikNCnRleHQoeCA9IDkwMDAwMCwgeSA9IDI1MDAwMCwgY2V4ID0gMC42LCBhZGogPSAwLCBmb250ID0gMywgbGFiZWxzID0gIkZ1bmNpw7NuIGRlIGRpc3RhbmNpYTpcbi0gVGlwbyA9IEV4cG9uZW5jaWFsXG4tIGJldGEgPSAyXG4tIHNwYW4gPSA3MCBrbSIpDQoNCmxheW91dExheWVyKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGEgcHJvZHVjY2nDs24gZGUgeXVjYSBlbiBlbCBBbWF6b25hcyIsDQogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZXM6IERBTkUgJiBNQURSLCAyMDE4IiwNCiAgICAgICAgICAgIGF1dGhvciA9ICJQYXVsYSBWaXJnw7xleiIsDQogICAgICAgICAgICBmcmFtZSA9IEZBTFNFLCBub3J0aCA9IEZBTFNFLCB0YWJ0aXRsZSA9IFRSVUUsIHRoZW1lID0gImtha2kucGFsIikNCg0Kbm9ydGgocG9zID0gInRvcGxlZnQiKQ0KYGBgDQogIA0KIyMjIDguIEd1YXJkYXIgbWFwYXMNCg0KQXF1w60gc2UgZ3VhcmRhcsOhIGVsIGFyY2hpdm8gZW4gdW5hIGltYWdlbiBkZSBwbmcgY29uIGxhIHJlc29sdWNpw7NuIHF1ZSBzZSBzZcOxYWxhIGVuIGVsIGNvbWFuZG8geSAgbGFzIGNhcmFjdGVyw61zdGljYXMgcGFyYSBjcmVhciBlbCBhcmNoaXZvIGNvbW8gY29sb3JlcywgdGFtYcOxb3MsIHBvc2ljaW9uZXMsIGV0Yy4NCkNvbW8gc2UgaGEgdmVuaWRvIG1lbmNpb25hbmRvLCBncmFuIHBhcnRlIGRlIGxvcyBkYXRvcyBzb24gc2luIHZhbG9yICpOQSosIGVudG9uY2VzIHBhcmEgZXN0ZSBjYXNvIGxvIHF1ZSBhIGNvbnRpbnVhY2nDs24gc2UgaGl6byBmdWUgcmVlbXBsYXphciBsYXMgY2VsZGFzICB2YWPDrWFzIHkgb3RvcmdhcmxlcyBlbCB2YWxvciAwIGEgY2FkYSB1bmEgZGUgZWxsYXMsIHBhcmEgcXVlIGFsIHBsb3RlYXIgZWwgbWFwYSBsb3MgZGVtw6FzICBkYXRvcyAgZnVlcmFuICBvYnNlcnZhYmxlcy4NCg0KUGFyYSBlc3RvLCBzZSB1c28gZW4gbGFzIGNvbHVtbmFzIFBST0RVQ0NJw5NOIHkgUkVORElNSUVOVE8gY29uIGxhIGZ1bmNpw7NuICpyZXBsYWNlX25hKCkqIGRlIGxhIGxpYnJlcsOtYSAqKnRpZHlyKio6DQpgYGB7cn0NCnJlcF95dWNhICU+JSByZXBsYWNlX25hKGxpc3QoUFJPRFVDQ0lPTiA9IGxpc3QoMCkpKQ0KcmVwX3l1Y2EgJT4lIHJlcGxhY2VfbmEobGlzdChSRU5ESU1JRU5UTyA9IGxpc3QoMCkpKQ0KYGBgDQpgYGB7cn0NCnJlcF95dWNhIDwtIHJlcF95dWNhICU+JSBtdXRhdGUoUFJPRFVDQ0lPTiA9IHJlcGxhY2VfbmEoUFJPRFVDQ0lPTiwgMCkpDQpyZXBfeXVjYSA8LSByZXBfeXVjYSAlPiUgbXV0YXRlKFJFTkRJTUlFTlRPID0gcmVwbGFjZV9uYShQUk9EVUNDSU9OLCAwKSkNCmBgYA0KICAgIA0KDQpQbG90ZWFyIGVsIG1hcGEsIHkgZ3VhcmRhciBlbCBhcmNoaXZvIGVuIHBuZzoNCmBgYHtyfQ0KcG5nKCJDOi9Vc2Vycy9wYXVsYS9EZXNrdG9wL0dlb21hdGljYS9DYXJ0b2dyYWZpYV90ZW1hdGljYS95dWNhXzIwMTgucG5nIiwgd2lkdGggPSAyMDQ4LCBoZWlnaHQgPSAxNTI2KQ0Kb3BhciA8LSBwYXIobWFyID0gYygwLDAsNSw1KSkNCnBsb3Qoc3RfZ2VvbWV0cnkocmVwX3l1Y2EpLCBjb2wgPSAibGlnaHRjb3JhbCIsIGJvcmRlciA9ICJtaXN0eXJvc2UyIiwNCiAgICAgYmcgPSAibWlzdHlyb3NlIiwgbHdkID0gMC42KQ0KDQpwcm9wU3ltYm9sc0Nob3JvTGF5ZXIoeCA9IHJlcF95dWNhLCB2YXIgPSAiUFJPRFVDQ0lPTiIsIHZhcjIgPSAiUkVORElNSUVOVE8iLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gImhhcm1vLnBhbCIsIG4xID0gNiksDQogICAgICAgICAgICAgICAgICAgICAgaW5jaGVzID0gMC44LCBtZXRob2QgPSAicTYiLA0KICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciA9IE5BLCBsd2QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC50aXRsZS5jZXggPSAxLjUsIA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YWx1ZXMuY2V4ID0gMS4wLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YXIucG9zID0gInRvcHJpZ2h0IiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyMi5wb3MgPSAibGVmdCIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnZhcjIudmFsdWVzLnJuZCA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnZhcjIudGl0bGUudHh0ID0gIlJlbmRpbWllbnRvXG4oZW4gVG9uL0hhKSIsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnZhci50aXRsZS50eHQgPSAiUHJvZHVjY2nDs24gZGUgeXVjYSBlbiAyMDE4IiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyLnN0eWxlID0gImUiKQ0KDQpsYWJlbExheWVyKA0KICB4ID0gcmVwX3l1Y2EsDQogIHR4dCA9ICJNUElPX0NOTUJSIiwNCiAgY29sID0gIndoaXRlIiwNCiAgY2V4ID0gMS45LA0KICBmb250ID0gNCwNCiAgaGFsbyA9IFRSVUUsDQogIGJnID0gImJsYWNrIiwNCiAgciA9IDAuMSwNCiAgb3ZlcmxhcCA9IEZBTFNFLA0KICBzaG93LmxpbmVzID0gRkFMU0UNCikNCg0KbGF5b3V0TGF5ZXIodGl0bGUgPSAiUHJvZHVjY2nDs24geSByZW5kaW1pZW50byBkZSB5dWNhIGVuIGVsIEFtYXpvbmFzLCAyMDE4IiwNCiAgICAgICAgICAgIGF1dGhvciA9ICJQYXVsYSBWaXJnw7xleiIsDQogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZXM6IE1BRFIgJiBEQU5FLCAyMDE4IiwNCiAgICAgICAgICAgIHNjYWxlID0gNTAsIHRhYnRpdGxlID0gRkFMU0UsIGZyYW1lID0gVFJVRSkNCg0Kbm9ydGgocG9zID0gInRvcGxlZnQiKQ0KDQp0aXRsZShtYWluID0gIlByb2R1Y2Npw7NuIHkgcmVuZGltaWVudG8gZGUgeXVjYSBlbiBlbCBBbWF6b25hcywgMjAxOCIsIGNleC5tYWluID0gMywNCiAgICAgIHN1YiA9ICJGdWVudGU6IE1BRFIgJiBEQU5FLCAyMDE4IiwgY2V4LnN1Yj0yKQ0KDQpncmF0aWN1bGUgPSBUUlVFDQoNCnBhcihvcGFyKQ0KDQpkZXYub2ZmKCkNCmBgYA0KTW9zdHJhciBsYSBpbWFnZW4gLnBuZyByZWFsaXphZGENCmBgYHtyIG91dC53aWR0aD0iMTAwJSJ9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGtuaXRyKQ0KaW5jbHVkZV9ncmFwaGljcygiQzovVXNlcnMvcGF1bGEvRGVza3RvcC9HZW9tYXRpY2EvQ2FydG9ncmFmaWFfdGVtYXRpY2EveXVjYV8yMDE4LnBuZyIpDQoNCmBgYA0KYGBge3J9DQpzZXNzaW9uSW5mbygpDQpgYGANCg0K