Luisa Fernanda Carrión Ramírez

20/05/2020

1. Introducción

El Departamento de Casanare se encuentra ubicado en la Región de los Llanos Orientales, al oriente del país. Tiene una superficie equivalente a 4640 kilómetros cuadrados (km2) que son empleadas principalmente para la explotación petrolera y la producción petrolera y ganadera. El Departamento de Casanare consta de 19 municipios y gran cantidad de caseríos y corregimientos. Casanare es bañado por grandes ríos, quebradas, caños, lagunas y humedales que le proporciona a esta región geográfica biodiversidad de flora y fauna además de servir como vía de comunicación y transporte en las temporadas de lluvia. El presente cuaderno ilustra la cartografía temática del Departamento de Casanare en Colombia utilizando algunas estadísticas publicadas en el Geoportal del Departamento Administrativo Nacional de Estadística (DANE).

2. Cartografía temática

Para dar un poco de contexto sobre el tema a tratar, se definirán algunos conceptos claves a partir de la información contenida en el libro “Sistemas de Información Geográfica” escrito por Víctor Olaya. La cartografía temática apareció en el siglo XVII debido a la necesidad de representar una variable específica o un tema en concreto relacionado generalmente con la parte física, social, política y cultural. Sin embargo, se excluyen los tópicos relacionados con la topografía puesto que le competen a la cartografía fundamental. Para elaborar un mapa temático se debe hacer uso de algunos elementos de la cartografía fundamental como el relieve para evitar que el lector se confunda y la información no sea entendida de la mejor manera. Es por ello que un mapa temático consta de dos partes: a. La capa específica: contiene toda a información de la variable escogida para ser graficada en este mapa. b. El mapa base: Es un mapa que permite vislumbrar la localización geográfica escogida. Tiene elementos propios de la cartografía fundamental, pero estas deben ser limitadas y menos específicas para que no opaquen la información que se quiere transmitir en la capa específica.
Los diferentes tipos de mapas temáticos serán descritos brevemente a continuación:

2.1 Mapas de coropletas

Esta clase de mapas son empleados principalmente para presentar la información geográfica en un Sistema de Información Geográfica (SIG). Este mapa posee áreas definidas en donde cada una tiene un valor de la variable. Dicho valor es el que afecta toda el área y se representa visualmente en el mapa a través de colores que dependerán de la escala de valor asignada. Usualmente se emplean los límites administrativos como áreas para dar a entender de mejor manera la información. Cada área definida es independiente de la otra y el valor que se le asigna simplemente representa el valor de esa área en la variable. Este tipo de mapa presenta dos inconvenientes principalmente: a. Sensación de cambio brusco en los límites entre áreas: Como cada área representa un único valor, el mapa parece tener cambios abruptos y no refleja adecuadamente la continuidad de la variable en caso de que exista. b. Homogeneidad dentro de cada área: Debido a que cada área tiene un único valor, no se pueden apreciar la variación dentro de esta región y termina perdiéndose una parte de la información. En la siguiente imagen, se encuentra un ejemplo de un mapa de coropletas que en este caso ilustra los accidentes de tránsito intra-urbanos en las Minas Gerais en el año 2003.

2.2 Mapas de símbolos proporcionales y graduados

Este mapa usa los símbolos (en especial el circulo) para representar por medio de su tamaño el valor de la variable. Para realizar un buen mapa, es necesario escoger una escala de tamaño adecuada puesto que es esencial para dar a entender la información. Además, es importante evitar que los círculos o figuras se solapen. En ocasiones, las variables que se desean ubicar no pueden ser contenidas en un mapa por lo cual se recomienda graficar varios mapas que puedan mostrar la información por separado pero que en conjunto expresan todo lo necesario. El problema principal de este mapa es la percepción del tamaño puesto que algunos símbolos que se ubican muy cerca entre sí pueden afectar la forma en la que se interpretan los datos. Es por ello que las figuras y las escalas deben ser escogidas con detenimiento. En la siguiente imagen, se puede apreciar un mapa de símbolos proporcionales que ilustra la población existente en España por provincias.

Mapa de símbolos proporcionales y graduados. Tomado de: https://sites.google.com/site/geografiaeconomicaana4/home/bloque-i

Mapa de símbolos proporcionales y graduados. Tomado de: https://sites.google.com/site/geografiaeconomicaana4/home/bloque-i

2.3 Mapa isarítmico o de contorno

Este mapa es usado generalmente para representar campos escalares y tiene la particularidad de que puede combinarse con otros mapas o con otro tipo de información. En este caso, se emplean líneas para representar el valor de cada variable, es por ello que en un punto no puede existir una superposición de líneas puesto que indicaría que las variables son iguales. Este tipo de mapas son empleados para escalas de temperaturas y las elevaciones del terreno. El número de líneas que se pueden representar es infinito por lo cual, es necesario seleccionar el conjunto de líneas a graficar teniendo en cuenta los límites. El principal problema de estos mapas es la complejidad que conlleva estimar el trazado de las líneas empleando los valores puntuales. En el siguiente mapa se puede ver las deficiencias hídricas existentes en la ciudad de Sao Pablo, Brasil.

Mapa isarítmico o de contorno. Tomado de: https://journals.openedition.org/confins/6348?&id=6348&lang=fr

Mapa isarítmico o de contorno. Tomado de: https://journals.openedition.org/confins/6348?&id=6348&lang=fr

2.4 Mapa de puntos

Este tipo de mapas se usan generalmente para representar variables relacionadas con la cantidad (población, producción, ingresos). Para ilustrar las variables, se usan puntos que tienen el mismo tamaño. Cada punto ilustra un solo dato y a suma de todos representa la cantidad total. Para elaborar correctamente este mapa, se debe tener en cuenta el valor de cada punto, el tamaño y la posición de este. Es importante que cada punto sea visible pero no debe ser exagerado para evitar que se superponga con otros y dificulte la comprensión de la información. El siguiente mapa de puntos ilustra claramente los puntos de recarga inteligente de los coches eléctricos en España.

3. Datos

En esta primera sección, se realizarán algunos mapas temáticos a partir de las estadísticas relacionadas con las Necesidades Básica Insatisfechas (NBI) realizadas por el DANE en el año 2018. El NBI usa indicadores centrados en la vivienda y servicios públicos para determinar si las necesidades básicas de la población están cubiertas o por el contrario tienen alguna deficiencia. El archivo fue descargado en formato .xlsx y modificado por medio del programa Microsoft Excel para garantizar la lectura de estos datos en R. Para ello, fue necesario eliminar las filas que contenían información de municipios externos al Departamento de Casanare y asignarle a cada columna una sola palabra como nombre. El archivo resultante se guardó con el nombre de “NBI_Casanare.xlsx”

4. Preparación

Para empezar, es necesario limpiar la memoria:

rm(list=ls())

Luego, se instalan las librerías que serán empleadas teniendo en cuenta que algunas ya se han instalado con anterioridad. Por esta última razón, se emplea el siguiente código:

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)

Se procede a cargar las librerías instaladas:

library(tidyverse)
library(readxl)
library(rgeos)
library(raster) 
library(sf)
library(cartography)
library(SpatialPosition)

##5. Leer los datos de NBI Para leer el archivo de Necesidades Básicas Insatisfechas del Departamento de Casanare, se escribe:

nbi <- read_excel("NBI_Casanare.xlsx")

Debido a que se nombró como nbi al archivo, se escribe el siguiente código para visualizar los datos:

head(nbi)

Usando el siguiente código, se puede saber cuál es el municipio de este departamento con un mayor porcentaje de necesidades básicas insatisfechas:

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

La tabla anterior señala que Támara es el municipio más vulnerado con respecto al NBI debido a que el 37% de su población tiene alguna carencia. Al investigar en internet, se encontró que desde el 2005 este municipio ha tenido el porcentaje de NBI más alto del Departamento. Sin embargo, se ha visto una disminución significativa puesto que anteriormente el porcentaje era equivalente a 72,42% donde los mayormente afectados eran los habitantes de las zonas rurales del municipio. El Concejo Municipal de Támara explica en el Acuerdo 400.02-007 que los niveles tan altos de pobreza son producto de la violencia que vivió hace algunos años. También se menciona que gran cantidad de predios pertenecientes a este municipio no están escriturados y esto dificulta el acceso a los subsidios nacionales o departamentales creados para el mejoramiento o construcción de vivienda nueva (Concejo Municipal de Támara, 2016).

También se puede buscar el municipio con menor porcentaje de NBI a través del código:

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

La tabla anterior muestra que el municipio de Monterrey es el menor afectación tiene por las Necesidades Básicas Insatisfechas. Al buscar información al respecto, se encontró que Monterrey es un importante productor de café, cacao, caña de azúcar, plátano, yuca, algodón, sorgo y maíz además se desarrollar ganadería en su territorio. En el plan territorial de salud contemplado para el periodo 2020-2023 se menciona la problemática de los hidrocarburos pero a su vez se esclarece que esta actividad genera empleos para la población (Equipo de Gobierno de Casanare, 2020).

Usando el siguiente código, se pueden ver los municipios ordenados de manera descendente por su NBI:

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

La tabla nos muestra en los tres primeros lugares al municipio de Támara, Nunchía y Hato Corozal.

6. Unir los datos de NBI a los municipios

Para la realización del join, se emplea la biblioteca sf que permitirá añadir los municipios del Departamento de Casanare:

munic <- st_read("./MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `/cloud/project/MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 19 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
CRS:            4326

Luego, se observará la información contenida en el atributo MPIO_CCDGO a través del código head():

head(munic$MPIO_CNMBR)
[1] YOPAL     AGUAZUL   CHAMEZA   LA SALINA MANÍ      MONTERREY
19 Levels: AGUAZUL CHAMEZA HATO COROZAL LA SALINA MANÍ ... YOPAL

Para concretar la unión entre los datos de NBI y el archivo con la información municipal se usa la función 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

Para la creación de este join se emplean las variables del código, el NBI y los nombres de los municipios que posteriormente se guarda en el objeto “check_nbi_munic”.

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: -72.98964 ymin: 4.374299 xmax: -71.66972 ymax: 6.346111
CRS:            4326
  MUNICIPIO MPIO_CCDGO       NBI                       geometry
1     YOPAL      85001 11.495488 POLYGON ((-72.39513 5.56853...
2   AGUAZUL      85010 13.936782 POLYGON ((-72.56545 5.36972...
3   CHAMEZA      85015 17.373531 POLYGON ((-72.81017 5.36659...
4 LA SALINA      85136 23.594549 POLYGON ((-72.33885 6.34470...
5      MANÍ      85139 15.619893 POLYGON ((-72.34155 5.06495...
6 MONTERREY      85162  7.971357 POLYGON ((-72.89989 5.03465...

La función cartography únicamente usa coordenadas planas, es por ello que estas coordenadas deben se trasformadas con la función st_transform() según la región geográfica. En este cuaderno, se quiere trabajar Colombia, por lo cual, se usará el sistema de referencias de coordenadas EPSG3116.

nbi_munic_new <- st_transform(nbi_munic, crs = 3116)

7. Ejemplos de mapas temáticos

Para graficar los mapas temáticos con gran calidad visual se utilizarán la librería cartography. Esta función es especifico es intuitiva y por esta misma razón, es una herramienta muy empleada para la realización de trabajos con el software R. Cartography emplea la función sf para la producción de los gráficos base, es por ello que ambos paquetes deben estar instalados y listos para usar. ### 7.1 Símbolos proporcionales usando el mapa base de OpenStreetMap

En este mapa, es necesario usar dos funciones clave: getTiles() y titlesLayer() que en conjunto permitirán ver y descargar los mosaicos que se pueden encontrar en OpenStreetMap. Por otra parte, la función propSymbolsLayer() muestra los símbolos con un tamaño proporcional al área que este asignada para cada variable cuantitativa. Este símbolo puede ser cualquier figura geométrica, pero en este caso se emplearán los círculos, porque permiten una mejor visualización de los datos.

mun.osm <- getTiles(x = nbi_munic_new, type = "OpenStreetMap", zoom = 8,cachedir = TRUE,crop = FALSE)

Ahora, se prosigue a establecer las márgenes y describir ciertos atributos que tendrá la función propSymbolsLayer() y que ayudarán al lector a entender la información que se quiere transmitir. La función layoutLayer() permite agregar información relacionada con el título, su autor y básicamente la etiqueta de nuestro mapa.

mun.osm <- getTiles(x = nbi_munic_new, type = "OpenStreetMap", zoom = 8,cachedir = TRUE,crop = FALSE)
opar <- par(mar = c(0,0,1.2,0))
tilesLayer(x = mun.osm)
plot(st_geometry(nbi_munic_new), col = NA, border = "black", add=TRUE)

propSymbolsLayer(x = nbi_munic_new, var = "NBI", inches = 0.15, col = "darksalmon",legend.pos = "topright", legend.title.txt = "Total NBI")

layoutLayer(title = " Distribución del NBI en el Departamento de Casanare", 
            sources = "Sources: DANE, 2018\n© OpenStreetMap", 
            author = " Luisa Fernanda Carrión Ramírez ", 
            frame = TRUE, north = FALSE, tabtitle = TRUE)

north(pos = "topleft")

Según en mapa anterior, los índices de NBI son mayores en municipios como La Salina, Sácama, Hato Corozal y Támara ya que el circulo que se encuentra dibujado en su territorio es de mayor proporción al comparase con otros municipios. Pese a que los círculos son de gran escala, no se puede determinar con total seguridad que municipio presenta mayor porcentaje de NBI.

7.2 Mapa de coropletas:

El mapa de coropletas se puede graficar con la función choroLayer() que es específica para este fin. Los argumentos como nclass, metod o breaks pueden ser modificados para hacer el mapa más original debido a que influyen en la clasificación de la variable. La función getbreaks() permite que las variables puedan ser clasificadas por fuera de la función choroLayer().

opar <- par(mar = c(0,0,1.2,0))
par(bg="grey90")
plot(st_geometry(nbi_munic_new), col = NA, border = NA, bg = "#aadaff")
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "green.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 
layoutLayer(title = "NBI en en Departamento de Casanare", 
            sources = "Fuente: DANE, 2018",
            author = "Luisa Fernanda Carrión Ramírez ", 
            frame = TRUE, north = TRUE, tabtitle = TRUE, col="black") 
north(pos = "topleft")

Este nuevo mapa nos permite apreciar que las zonas ubicadas hacia el sur del departamento tienen menor porcentaje de NBI a comparación de los municipios orientados hacia el norte. Por el momento, no es posible decir que municipio tiene una mayor problemática con las Necesidades Básicas Insatisfechas aunque, se puede decir que los más afectados son Támara y Hato Corozal.

7.3 Mapa de símbolos proporcionales y mapa de tipología:

Para este mapa en específico es necesario usar la función propSymbolsTypoLater() puesto que crea los mapas de símbolos a partir de dos variables. La primera variable permite que esta función asigne unos valores proporcionales (también les asigna un color) para reflejar los datos de la segunda variable. Se usó la función mutate incluida en el paquete dplyr para crear los atributos.

 nbi_munic_2 <- dplyr::mutate(nbi_munic_new, poverty = ifelse(MISERIA > 20, "Extrema",                                           ifelse(HACINAMIENTO > 5, "Alta", "Intermedia")))

Cabe destacar que el atributo que se creó, se llama pobreza y su valor está influido por el comando ifelse. Si se usa la dunción head() se pueden ver algunos datos:

head(nbi_munic_2)
Simple feature collection with 6 features and 21 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: 1120678 ymin: 975763.8 xmax: 1267251 ymax: 1193835
CRS:            EPSG:3116
  DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR
1         85      85001      YOPAL
2         85      85010    AGUAZUL
3         85      85015    CHAMEZA
4         85      85136  LA SALINA
5         85      85139       MANÍ
6         85      85162  MONTERREY
                                 MPIO_CRSLC MPIO_NAREA MPIO_NANO
1     Ordenanza 0038 del 8 de Julio de 1942  2482.9043      2017
2                                      1950  1442.5073      2017
3 Ordenanza 0021 del 3 de Diciembre de 1959   313.5325      2017
4                                      1780   199.8943      2017
5                                      1953  3754.5485      2017
6                                      1960   779.1725      2017
  DPTO_CNMBR Shape_Leng Shape_Area COD_DEPTO    DEPTO CO_MUN MUNICIPIO
1   CASANARE  3.1592326 0.20233677        85 CASANARE    001     YOPAL
2   CASANARE  2.2242959 0.11756477        85 CASANARE    010   AGUAZUL
3   CASANARE  1.0678483 0.02556381        85 CASANARE    015   CHAMEZA
4   CASANARE  0.8413073 0.01631711        85 CASANARE    136 LA SALINA
5   CASANARE  4.1536144 0.30568793        85 CASANARE    139      MANÍ
6   CASANARE  1.5420451 0.06349198        85 CASANARE    162 MONTERREY
        NBI   MISERIA VIVIENDA SERVICIOS HACINAMIENTO INASISTENCIA
1 11.495488 2.1537047 5.654527 0.5819599     3.818019    1.1716879
2 13.936782 2.1970785 5.977610 0.4430077     4.738386    2.1551724
3 17.373531 3.4747062 9.708738 2.0950434     4.547777    0.4598876
4 23.594549 4.1737649 6.047700 2.9812606     9.454855    1.6183986
5 15.619893 3.1130827 4.591797 0.3268737     8.117363    2.4204218
6  7.971357 0.9862866 3.533068 0.3310140     1.641559    0.4391002
  ECONOMIA                       geometry    poverty
1 2.755085 POLYGON ((1186430 1107789, ... Intermedia
2 3.352490 POLYGON ((1167607 1085745, ... Intermedia
3 4.956566 POLYGON ((1140477 1085338, ... Intermedia
4 8.773424 POLYGON ((1192398 1193680, ...       Alta
5 3.961398 POLYGON ((1192526 1052093, ...       Alta
6 3.222320 POLYGON ((1130599 1048603, ... Intermedia

Utilizando las funciones sf y cartography se procede a graficar el mapa por medio del siguiente código:

opar <- par(mar = c(0,0,1.2,0))
plot(st_geometry(nbi_munic_2), col="lightblue2", border="black", bg =NA, 
     lwd = 0.5)

propSymbolsTypoLayer(
  x = nbi_munic_2, 
  var = "NBI", 
  inches = 0.45,
  symbols = "square",
  border = "black",
  lwd = .5,
  legend.var.pos = "topright", 
  legend.var.title.txt = "NBI",
  var2 = "poverty",
  legend.var2.values.order, mod, collapse("Extrema", "Alta", "Intermedia"),
  col = carto.pal(pal1 = "multi.pal", n1 = 3),
  legend.var2.pos ="right", 
  legend.var2.title.txt = "Pobreza"
) 

layoutLayer("Distribución de NBI en Casanare", 
  sources ="Fuente:DANE, 2018 \n OpenStreetMap",
  author="Luisa Fernanda Carrión Ramírez", 
            scale = 1, tabtitle = TRUE, frame = TRUE)
north(pos = "topleft")

El anterior mapa nos muestra que el NBI del Departamento de Casanare se encuentra entre los valores altos e intermedios, sin embargo, ningún municipio está en un nivel de pobreza extrema. A pesar de esto último, son preocupantes lo valores recolectados por el DANE y por ende, deben diseñarse estrategias para erradicar estas estadísticas.

7.4 Mapa de etiquetas

Emplea principalmente las librerías choroLater() y labelLayer() que fueron descritas anteriormente

library(sf)
library(cartography)
# set margins
opar <- par(mar = c(0,0,1.2,0))
# set figure background color
par(bg="grey25")
# plot municipalities
plot(st_geometry(nbi_munic_2), col = "#e4e9de", border = "darkseagreen4", 
     bg = "grey75", lwd = 0.5)
# plot NBI
choroLayer(
  x = nbi_munic_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "purple.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 

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

layoutLayer(
  title = "Municipios de Casanare", 
  sources = "Source: DANE, 2018",  
  author = "Luisa Fernanda Carrión Ramírez", 
  frame = TRUE,
  north = TRUE, 
  tabtitle = TRUE, 
  theme = "taupe.pal"
) 

7.5 Mapa de isopletas:

Para estos tipos de mapa se emplea la función smoothLayer() incluida en el paquete SpatialPosition. La función emplea una capa de puntos con parámetros ya definidos para mostrar el mapa deseado.

munic <- st_read("./MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `/cloud/project/MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 19 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
CRS:            4326

En este caso, se usará el archivo estadísticas agrícolas municipales elaboradas por el DANE y que previamente fueron descargadas a través del Geoportal. Fue necesario modificar el archivo original en el programa Microsoft Excel con el fin de dejar únicamente las filas con información del departamento en cuestión. Además, únicamente se emplearon los datos obtenidos en el 2018. Este archivo se guardó con la extensión .xlsx Los datos contenidos en el archivo se almacenan en el objeto cultivos2018

cultivos2018 <- read_excel("./EVA_Casanare2.xlsx")

Para observar los datos que componen el objeto se escribe:

head(cultivos2018)
head(munic$MPIO_CNMBR)
[1] YOPAL     AGUAZUL   CHAMEZA   LA SALINA MANÍ      MONTERREY
19 Levels: AGUAZUL CHAMEZA HATO COROZAL LA SALINA MANÍ ... YOPAL

Se deben filtrar los datos del cultivo que se quiere trabajar, en este caso será la palma de acite.

cultivos2018 %>%
  filter(CULTIVO == "PALMA DE ACEITE") -> palma2018

Para revisar la información contenida en palma2018 se usa la función head():

head(palma2018)

Mediante el siguiente código se cambiará la naturaleza del dato COD_MUN, es decir, la función dejará de ser numérica para convertirse en un carácter Esta transformación es necesaria para ejecutar el join.

palma2018$TEMP <- as.character(palma2018$COD_MUN)
palma2018$MPIO_CCDGO <- as.factor(paste(palma2018$TEMP))

Usando la función left_join() se hace la unión deseada.

palma_munic = left_join(munic, palma2018, by="MPIO_CCDGO")

Usando la función head() se puede visualizar los datos de este nuevo join.

head(palma_munic)
Simple feature collection with 6 features and 24 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -72.98964 ymin: 4.374299 xmax: -71.66972 ymax: 6.346111
CRS:            4326
  DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR
1         85      85001      YOPAL
2         85      85010    AGUAZUL
3         85      85015    CHAMEZA
4         85      85136  LA SALINA
5         85      85139       MANÍ
6         85      85162  MONTERREY
                                 MPIO_CRSLC MPIO_NAREA MPIO_NANO
1     Ordenanza 0038 del 8 de Julio de 1942  2482.9043      2017
2                                      1950  1442.5073      2017
3 Ordenanza 0021 del 3 de Diciembre de 1959   313.5325      2017
4                                      1780   199.8943      2017
5                                      1953  3754.5485      2017
6                                      1960   779.1725      2017
  DPTO_CNMBR Shape_Leng Shape_Area COD_DEP DEPARTAMENTO COD_MUN MUNICIPIO
1   CASANARE  3.1592326 0.20233677      85     CASANARE   85001     YOPAL
2   CASANARE  2.2242959 0.11756477      85     CASANARE   85010   AGUAZUL
3   CASANARE  1.0678483 0.02556381      NA         <NA>      NA      <NA>
4   CASANARE  0.8413073 0.01631711      NA         <NA>      NA      <NA>
5   CASANARE  4.1536144 0.30568793      85     CASANARE   85139      MANI
6   CASANARE  1.5420451 0.06349198      85     CASANARE   85162 MONTERREY
        GRUPO        SUBGRUPO         CULTIVO PERIODO Area_siembra
1 OLEAGINOSAS PALMA DE ACEITE PALMA DE ACEITE    2018          805
2 OLEAGINOSAS PALMA DE ACEITE PALMA DE ACEITE    2018         2385
3        <NA>            <NA>            <NA>      NA           NA
4        <NA>            <NA>            <NA>      NA           NA
5 OLEAGINOSAS PALMA DE ACEITE PALMA DE ACEITE    2018        26136
6 OLEAGINOSAS PALMA DE ACEITE PALMA DE ACEITE    2018         1667
  Area_cosecha Produccion Rendimiento       ESTADO      CICLO  TEMP
1          600        192        3.20 ACEITE CRUDO PERMANENTE 85001
2          679       2105        3.10 ACEITE CRUDO PERMANENTE 85010
3           NA         NA          NA         <NA>       <NA>  <NA>
4           NA         NA          NA         <NA>       <NA>  <NA>
5        25136      84389        3.36 ACEITE CRUDO PERMANENTE 85139
6          767       2943        3.84 ACEITE CRUDO PERMANENTE 85162
                        geometry
1 POLYGON ((-72.39513 5.56853...
2 POLYGON ((-72.56545 5.36972...
3 POLYGON ((-72.81017 5.36659...
4 POLYGON ((-72.33885 6.34470...
5 POLYGON ((-72.34155 5.06495...
6 POLYGON ((-72.89989 5.03465...

Para reproyectar las coordenadas de los municipios se escribe:

rep_palma <- st_transform(palma_munic, crs = 3116)

Este mapa debe ser elaborado con la función lwgen, por ello, es necesario inataara y hacerla funciónar.

library(lwgeom)

Mediante el siguiente código, se obtiene el mapa deseado:


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

plot(st_geometry(rep_palma), col = NA, border = "black", bg = "white")

smoothLayer(
  x = rep_palma, 
  var = 'Produccion',
  typefct = "exponential",
  span = 25000,
  beta = 2,
  nclass = 10,
  col = carto.pal(pal1 = 'blue.pal', n1 = 10),
  border = "white",
  lwd = 0.1, 
  mask = rep_palma, 
  legend.values.rnd = -3,
  legend.title.txt = "Produccion",
  legend.pos = "topright", 
  add=TRUE
)

text(x = 650000, y = 1200000, cex = 0.6, adj = 0, font = 3,  labels = 
       "Distance function:\n- type = exponential\n- beta = 2\n- span = 20 km")

layoutLayer(title = "Distribución de la producción de Palma en Casanare ",
            sources = "Sources: DANE and MADR, 2018",
            author = "Luisa Carrión",
            frame = FALSE, north = FALSE, tabtitle = TRUE, theme = "black.pal")

north(pos = "topleft")

En el anterior grafico podemos ver que la producción de la palma de aceite se concentra mayormente en los municipios coloreados de una tonalidad oscura y que básicamente se ubican en la parte inferior del Departamento. Como se mencionó en el cuaderno anterior, la palma de aceite es uno de los cultivos representativos de los Llanos Orientales puesto que las condiciones climáticas y de humedad favorecen su mantenimiento. Además, Fedepalma hace unos años realizó una inversión exitosa con el fin de ampliar las zonas de cultivo de palma en el departamento. El monocultivo de palma de aceite ha traído una apretura económica para Casanare, sin embargo, ha afectado la diversidad de especies en especial, la riqueza de aves. Varios estudios explican que la expansión de la palma genera cambios drásticos en los hábitats y modifican la vegetación. Estas variaciones afectan el modo de vida de las especies nativas y la posibilidad de supervivencia de una especie se ve reducida (López et. al, 2017).

8. Guardar mapas

Para guardar un mapa se escribe

png("./palma_2018.png", width = 2048, height = 1526)
opar <- par(mar = c(0,0,5,5))
plot(st_geometry(rep_palma), col="darkseagreen3", border="darkseagreen4", bg = "white", lwd = 0.6)
propSymbolsChoroLayer(x = rep_palma, var = "Produccion", var2 = "Rendimiento",
                      col = carto.pal(pal1 = "blue.pal", n1 = 3, pal2 = "orange.pal", n2=3),
                      inches = 1, method = "q6",
                      border = "grey50", lwd = 1,
                      legend.title.cex = 2,
                      legend.values.cex = 2,
                      legend.var.pos = "right", 
                      legend.var2.pos = "left",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Rendimiento\n(Ton/Ha)",
                      legend.var.title.txt = "Producción de Palma en 2018",
                      legend.var.style = "e")

labelLayer(
  x = rep_palma, 
  txt = "MPIO_CNMBR", 
  col= "white", 
  cex = 3.0, 
  font = 4,
  halo = FALSE, 
  bg = "white", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)

layoutLayer(title="Producción y Rendimiento de Palma 2018",
            author = "Luisa Fernanda Carrión Ramírez", 
            sources = "Fuentes: MADR & DANE, 2018", 
            scale = 50, tabtitle = FALSE, frame = TRUE)

north(pos = "topleft")

title(main="Cultivo de Palma en Casanare, 2018", cex.main=3,
      sub= "Fuentes: MADR & DANE, 2018", cex.sub=4)

graticule = TRUE

par(opar)

dev.off()
Producción y Rendimiento

Producción y Rendimiento

10. Referencias

Consejo Municipal de Támara. (2016). Plan de desarrollo “Un nuevo horizonte para todos. 2016-2019”. Támara: https://ceo.uniandes.edu.co/images/Documentos/T%C3%A1mara_Plan_de_Desarrollo_2016-2019.pdf

Equipo de Gobierno de Monterrey. (2020). Plan Territorial de Salud 2020-2023. Monterrey: https://concejomonterrey.micolombiadigital.gov.co/sites/concejomonterrey/content/files/000402/20090_pts-monterrey-2020--2023.pdf

López-Arévalo, H. & Romero N. & Tamaris-Turizo, A. (2017). Efecto de la estructura del cultivo de palma de aceite Elaeis guineensis (Arecaceae) sobre la diversidad de aves en un paisaje de la Orinoquía colombiana. Bogotá: https://www.scielo.sa.cr/scielo.php?script=sci_arttext&pid=S0034-77442017000401569

Olaya, V.. (2017). Sistemas de Información Geográfica. https://volaya.github.io/libro-sig/index.html

LS0tCnRpdGxlOiAiQ2FydG9ncmFmw61hIHRlbcOhdGljYSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKTHVpc2EgRmVybmFuZGEgQ2FycmnDs24gUmFtw61yZXoKCjIwLzA1LzIwMjAKCgojIyAxLiBJbnRyb2R1Y2Npw7NuCgpFbCBEZXBhcnRhbWVudG8gZGUgQ2FzYW5hcmUgc2UgZW5jdWVudHJhIHViaWNhZG8gZW4gbGEgUmVnacOzbiBkZSBsb3MgTGxhbm9zIE9yaWVudGFsZXMsIGFsIG9yaWVudGUgZGVsIHBhw61zLiBUaWVuZSB1bmEgc3VwZXJmaWNpZSBlcXVpdmFsZW50ZSBhIDQ2NDAga2lsw7NtZXRyb3MgY3VhZHJhZG9zIChrbTIpIHF1ZSBzb24gZW1wbGVhZGFzIHByaW5jaXBhbG1lbnRlIHBhcmEgbGEgZXhwbG90YWNpw7NuIHBldHJvbGVyYSB5IGxhIHByb2R1Y2Npw7NuIHBldHJvbGVyYSB5IGdhbmFkZXJhLiBFbCBEZXBhcnRhbWVudG8gZGUgQ2FzYW5hcmUgY29uc3RhIGRlIDE5IG11bmljaXBpb3MgeSBncmFuIGNhbnRpZGFkIGRlIGNhc2Vyw61vcyB5IGNvcnJlZ2ltaWVudG9zLgpDYXNhbmFyZSBlcyBiYcOxYWRvIHBvciBncmFuZGVzIHLDrW9zLCBxdWVicmFkYXMsIGNhw7FvcywgbGFndW5hcyB5IGh1bWVkYWxlcyBxdWUgbGUgcHJvcG9yY2lvbmEgYSBlc3RhIHJlZ2nDs24gZ2VvZ3LDoWZpY2EgYmlvZGl2ZXJzaWRhZCBkZSBmbG9yYSB5IGZhdW5hIGFkZW3DoXMgZGUgc2VydmlyIGNvbW8gdsOtYSBkZSBjb211bmljYWNpw7NuIHkgdHJhbnNwb3J0ZSBlbiBsYXMgdGVtcG9yYWRhcyBkZSBsbHV2aWEuCkVsIHByZXNlbnRlIGN1YWRlcm5vIGlsdXN0cmEgbGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSBkZWwgRGVwYXJ0YW1lbnRvIGRlIENhc2FuYXJlIGVuIENvbG9tYmlhIHV0aWxpemFuZG8gYWxndW5hcyBlc3RhZMOtc3RpY2FzIHB1YmxpY2FkYXMgZW4gZWwgR2VvcG9ydGFsIGRlbCBEZXBhcnRhbWVudG8gQWRtaW5pc3RyYXRpdm8gTmFjaW9uYWwgZGUgRXN0YWTDrXN0aWNhIChEQU5FKS4KCiMjIDIuIENhcnRvZ3JhZsOtYSB0ZW3DoXRpY2EKClBhcmEgZGFyIHVuIHBvY28gZGUgY29udGV4dG8gc29icmUgZWwgdGVtYSBhIHRyYXRhciwgc2UgZGVmaW5pcsOhbiBhbGd1bm9zIGNvbmNlcHRvcyBjbGF2ZXMgYSBwYXJ0aXIgZGUgbGEgaW5mb3JtYWNpw7NuIGNvbnRlbmlkYSBlbiBlbCBsaWJybyDigJxTaXN0ZW1hcyBkZSBJbmZvcm1hY2nDs24gR2VvZ3LDoWZpY2HigJ0gZXNjcml0byBwb3IgVsOtY3RvciBPbGF5YS4KTGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSBhcGFyZWNpw7MgZW4gZWwgc2lnbG8gWFZJSSBkZWJpZG8gYSBsYSBuZWNlc2lkYWQgZGUgcmVwcmVzZW50YXIgdW5hIHZhcmlhYmxlIGVzcGVjw61maWNhIG8gdW4gdGVtYSBlbiBjb25jcmV0byByZWxhY2lvbmFkbyBnZW5lcmFsbWVudGUgY29uIGxhIHBhcnRlIGbDrXNpY2EsIHNvY2lhbCwgcG9sw610aWNhIHkgY3VsdHVyYWwuIFNpbiBlbWJhcmdvLCBzZSBleGNsdXllbiBsb3MgdMOzcGljb3MgcmVsYWNpb25hZG9zIGNvbiBsYSB0b3BvZ3JhZsOtYSBwdWVzdG8gcXVlIGxlIGNvbXBldGVuIGEgbGEgY2FydG9ncmFmw61hIGZ1bmRhbWVudGFsLiAKUGFyYSBlbGFib3JhciB1biBtYXBhIHRlbcOhdGljbyBzZSBkZWJlIGhhY2VyIHVzbyBkZSBhbGd1bm9zIGVsZW1lbnRvcyBkZSBsYSBjYXJ0b2dyYWbDrWEgZnVuZGFtZW50YWwgY29tbyBlbCByZWxpZXZlIHBhcmEgZXZpdGFyIHF1ZSBlbCBsZWN0b3Igc2UgY29uZnVuZGEgeSBsYSBpbmZvcm1hY2nDs24gbm8gc2VhIGVudGVuZGlkYSBkZSBsYSBtZWpvciBtYW5lcmEuIEVzIHBvciBlbGxvIHF1ZSB1biBtYXBhIHRlbcOhdGljbyBjb25zdGEgZGUgZG9zIHBhcnRlczoKYS4JTGEgY2FwYSBlc3BlY8OtZmljYTogY29udGllbmUgdG9kYSBhIGluZm9ybWFjacOzbiBkZSBsYSB2YXJpYWJsZSBlc2NvZ2lkYSBwYXJhIHNlciBncmFmaWNhZGEgZW4gZXN0ZSBtYXBhLgpiLgkgRWwgbWFwYSBiYXNlOiBFcyB1biBtYXBhIHF1ZSBwZXJtaXRlIHZpc2x1bWJyYXIgbGEgbG9jYWxpemFjacOzbiBnZW9ncsOhZmljYSBlc2NvZ2lkYS4gVGllbmUgZWxlbWVudG9zIHByb3Bpb3MgZGUgbGEgY2FydG9ncmFmw61hIGZ1bmRhbWVudGFsLCBwZXJvIGVzdGFzIGRlYmVuIHNlciBsaW1pdGFkYXMgeSAgbWVub3MgZXNwZWPDrWZpY2FzIHBhcmEgcXVlIG5vIG9wYXF1ZW4gbGEgaW5mb3JtYWNpw7NuIHF1ZSBzZSBxdWllcmUgdHJhbnNtaXRpciBlbiBsYSBjYXBhIGVzcGVjw61maWNhLiAgCkxvcyBkaWZlcmVudGVzIHRpcG9zIGRlIG1hcGFzIHRlbcOhdGljb3Mgc2Vyw6FuIGRlc2NyaXRvcyBicmV2ZW1lbnRlIGEgY29udGludWFjacOzbjoKCiMjIyAyLjEgTWFwYXMgZGUgY29yb3BsZXRhcwpFc3RhIGNsYXNlIGRlIG1hcGFzIHNvbiBlbXBsZWFkb3MgcHJpbmNpcGFsbWVudGUgcGFyYSBwcmVzZW50YXIgbGEgaW5mb3JtYWNpw7NuIGdlb2dyw6FmaWNhIGVuIHVuIFNpc3RlbWEgZGUgSW5mb3JtYWNpw7NuIEdlb2dyw6FmaWNhIChTSUcpLgpFc3RlIG1hcGEgcG9zZWUgw6FyZWFzIGRlZmluaWRhcyBlbiBkb25kZSBjYWRhIHVuYSB0aWVuZSB1biB2YWxvciBkZSBsYSB2YXJpYWJsZS4gRGljaG8gdmFsb3IgZXMgZWwgcXVlIGFmZWN0YSB0b2RhIGVsIMOhcmVhIHkgc2UgcmVwcmVzZW50YSB2aXN1YWxtZW50ZSBlbiBlbCBtYXBhIGEgdHJhdsOpcyBkZSBjb2xvcmVzIHF1ZSBkZXBlbmRlcsOhbiBkZSBsYSBlc2NhbGEgZGUgdmFsb3IgYXNpZ25hZGEuICBVc3VhbG1lbnRlIHNlIGVtcGxlYW4gbG9zIGzDrW1pdGVzIGFkbWluaXN0cmF0aXZvcyBjb21vIMOhcmVhcyBwYXJhIGRhciBhIGVudGVuZGVyIGRlIG1lam9yIG1hbmVyYSBsYSBpbmZvcm1hY2nDs24uIApDYWRhIMOhcmVhIGRlZmluaWRhIGVzIGluZGVwZW5kaWVudGUgZGUgbGEgb3RyYSB5IGVsIHZhbG9yIHF1ZSBzZSBsZSBhc2lnbmEgc2ltcGxlbWVudGUgcmVwcmVzZW50YSBlbCB2YWxvciBkZSBlc2Egw6FyZWEgZW4gbGEgdmFyaWFibGUuIApFc3RlIHRpcG8gZGUgbWFwYSBwcmVzZW50YSBkb3MgaW5jb252ZW5pZW50ZXMgcHJpbmNpcGFsbWVudGU6CmEuCVNlbnNhY2nDs24gZGUgY2FtYmlvIGJydXNjbyBlbiBsb3MgbMOtbWl0ZXMgZW50cmUgw6FyZWFzOiBDb21vIGNhZGEgw6FyZWEgcmVwcmVzZW50YSB1biDDum5pY28gdmFsb3IsIGVsIG1hcGEgcGFyZWNlIHRlbmVyIGNhbWJpb3MgYWJydXB0b3MgeSBubyByZWZsZWphIGFkZWN1YWRhbWVudGUgbGEgY29udGludWlkYWQgZGUgbGEgdmFyaWFibGUgZW4gY2FzbyBkZSBxdWUgZXhpc3RhLgpiLglIb21vZ2VuZWlkYWQgZGVudHJvIGRlIGNhZGEgw6FyZWE6IERlYmlkbyBhIHF1ZSBjYWRhIMOhcmVhIHRpZW5lIHVuIMO6bmljbyB2YWxvciwgbm8gc2UgcHVlZGVuIGFwcmVjaWFyIGxhIHZhcmlhY2nDs24gZGVudHJvIGRlIGVzdGEgcmVnacOzbiB5IHRlcm1pbmEgcGVyZGnDqW5kb3NlIHVuYSBwYXJ0ZSBkZSBsYSBpbmZvcm1hY2nDs24uCkVuIGxhIHNpZ3VpZW50ZSBpbWFnZW4sIHNlIGVuY3VlbnRyYSB1biBlamVtcGxvIGRlIHVuIG1hcGEgZGUgY29yb3BsZXRhcyBxdWUgZW4gZXN0ZSBjYXNvIGlsdXN0cmEgbG9zIGFjY2lkZW50ZXMgZGUgdHLDoW5zaXRvIGludHJhLXVyYmFub3MgZW4gbGFzIE1pbmFzIEdlcmFpcyBlbiBlbCBhw7FvIDIwMDMuCgoKIVtNYXBhIGRlIGNvcm9wbGV0YXMuIFRvbWFkbyBkZTogaHR0cHM6Ly93d3cuZmxpY2tyLmNvbS9waG90b3MvNTQ0NjQ3NThATjAzLzUwNDQ4MDY4MDVdKC4vY29yb3BsZXRhcy5wbmcpIAoKCiMjIyAyLjIgTWFwYXMgZGUgc8OtbWJvbG9zIHByb3BvcmNpb25hbGVzIHkgZ3JhZHVhZG9zCkVzdGUgbWFwYSB1c2EgbG9zIHPDrW1ib2xvcyAoZW4gZXNwZWNpYWwgZWwgY2lyY3VsbykgcGFyYSByZXByZXNlbnRhciBwb3IgbWVkaW8gZGUgc3UgdGFtYcOxbyBlbCB2YWxvciBkZSBsYSB2YXJpYWJsZS4KUGFyYSByZWFsaXphciB1biBidWVuIG1hcGEsIGVzIG5lY2VzYXJpbyBlc2NvZ2VyIHVuYSBlc2NhbGEgZGUgdGFtYcOxbyBhZGVjdWFkYSBwdWVzdG8gcXVlIGVzIGVzZW5jaWFsIHBhcmEgZGFyIGEgZW50ZW5kZXIgbGEgaW5mb3JtYWNpw7NuLiBBZGVtw6FzLCBlcyBpbXBvcnRhbnRlIGV2aXRhciBxdWUgbG9zIGPDrXJjdWxvcyBvIGZpZ3VyYXMgc2Ugc29sYXBlbi4KRW4gb2Nhc2lvbmVzLCBsYXMgdmFyaWFibGVzIHF1ZSBzZSBkZXNlYW4gdWJpY2FyIG5vIHB1ZWRlbiBzZXIgY29udGVuaWRhcyBlbiB1biBtYXBhIHBvciBsbyBjdWFsIHNlIHJlY29taWVuZGEgZ3JhZmljYXIgdmFyaW9zIG1hcGFzIHF1ZSBwdWVkYW4gbW9zdHJhciBsYSBpbmZvcm1hY2nDs24gcG9yIHNlcGFyYWRvIHBlcm8gcXVlIGVuIGNvbmp1bnRvIGV4cHJlc2FuIHRvZG8gbG8gbmVjZXNhcmlvLgpFbCBwcm9ibGVtYSBwcmluY2lwYWwgZGUgZXN0ZSBtYXBhIGVzIGxhIHBlcmNlcGNpw7NuIGRlbCB0YW1hw7FvIHB1ZXN0byBxdWUgYWxndW5vcyBzw61tYm9sb3MgcXVlIHNlIHViaWNhbiBtdXkgY2VyY2EgZW50cmUgc8OtIHB1ZWRlbiBhZmVjdGFyIGxhIGZvcm1hIGVuIGxhIHF1ZSBzZSBpbnRlcnByZXRhbiBsb3MgZGF0b3MuICBFcyBwb3IgZWxsbyBxdWUgbGFzIGZpZ3VyYXMgeSBsYXMgZXNjYWxhcyBkZWJlbiBzZXIgZXNjb2dpZGFzIGNvbiBkZXRlbmltaWVudG8uIApFbiBsYSBzaWd1aWVudGUgaW1hZ2VuLCBzZSBwdWVkZSBhcHJlY2lhciB1biBtYXBhIGRlIHPDrW1ib2xvcyBwcm9wb3JjaW9uYWxlcyBxdWUgaWx1c3RyYSBsYSBwb2JsYWNpw7NuIGV4aXN0ZW50ZSBlbiBFc3Bhw7FhIHBvciBwcm92aW5jaWFzLgoKIVtNYXBhIGRlIHPDrW1ib2xvcyBwcm9wb3JjaW9uYWxlcyB5IGdyYWR1YWRvcy4gVG9tYWRvIGRlOiAgaHR0cHM6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvZ2VvZ3JhZmlhZWNvbm9taWNhYW5hNC9ob21lL2Jsb3F1ZS1pXSguL21hcGEgc8OtbWJvbG9zIHByb3BvcmNpb25hbGVzLnBuZykgCgoKIyMjIDIuMyBNYXBhIGlzYXLDrXRtaWNvIG8gZGUgY29udG9ybm8KRXN0ZSBtYXBhIGVzIHVzYWRvIGdlbmVyYWxtZW50ZSBwYXJhIHJlcHJlc2VudGFyIGNhbXBvcyBlc2NhbGFyZXMgeSB0aWVuZSBsYSBwYXJ0aWN1bGFyaWRhZCBkZSBxdWUgcHVlZGUgY29tYmluYXJzZSBjb24gb3Ryb3MgbWFwYXMgbyBjb24gb3RybyB0aXBvIGRlIGluZm9ybWFjacOzbi4gRW4gZXN0ZSBjYXNvLCBzZSBlbXBsZWFuIGzDrW5lYXMgcGFyYSByZXByZXNlbnRhciBlbCB2YWxvciBkZSBjYWRhIHZhcmlhYmxlLCBlcyBwb3IgZWxsbyBxdWUgZW4gdW4gcHVudG8gbm8gcHVlZGUgZXhpc3RpciB1bmEgc3VwZXJwb3NpY2nDs24gZGUgbMOtbmVhcyBwdWVzdG8gcXVlIGluZGljYXLDrWEgcXVlIGxhcyB2YXJpYWJsZXMgc29uIGlndWFsZXMuIApFc3RlIHRpcG8gZGUgbWFwYXMgIHNvbiBlbXBsZWFkb3MgcGFyYSBlc2NhbGFzIGRlIHRlbXBlcmF0dXJhcyB5IGxhcyBlbGV2YWNpb25lcyBkZWwgdGVycmVuby4gCkVsIG7Dum1lcm8gZGUgbMOtbmVhcyBxdWUgc2UgcHVlZGVuIHJlcHJlc2VudGFyIGVzIGluZmluaXRvIHBvciBsbyBjdWFsLCBlcyBuZWNlc2FyaW8gc2VsZWNjaW9uYXIgZWwgY29uanVudG8gZGUgbMOtbmVhcyBhIGdyYWZpY2FyIHRlbmllbmRvIGVuIGN1ZW50YSBsb3MgbMOtbWl0ZXMuCkVsIHByaW5jaXBhbCBwcm9ibGVtYSBkZSBlc3RvcyBtYXBhcyBlcyBsYSBjb21wbGVqaWRhZCBxdWUgY29ubGxldmEgIGVzdGltYXIgZWwgdHJhemFkbyBkZSBsYXMgbMOtbmVhcyBlbXBsZWFuZG8gbG9zIHZhbG9yZXMgcHVudHVhbGVzLgpFbiBlbCBzaWd1aWVudGUgbWFwYSBzZSBwdWVkZSB2ZXIgbGFzIGRlZmljaWVuY2lhcyBow61kcmljYXMgZXhpc3RlbnRlcyBlbiBsYSBjaXVkYWQgZGUgU2FvIFBhYmxvLCBCcmFzaWwuCgohW01hcGEgaXNhcsOtdG1pY28gbyBkZSBjb250b3Juby4gVG9tYWRvIGRlOiBodHRwczovL2pvdXJuYWxzLm9wZW5lZGl0aW9uLm9yZy9jb25maW5zLzYzNDg/JmlkPTYzNDgmbGFuZz1mcl0oLi9pc2FyaXRtaWNvLnBuZykgCgoKIyMjIDIuNCBNYXBhIGRlIHB1bnRvcwpFc3RlIHRpcG8gZGUgbWFwYXMgc2UgdXNhbiBnZW5lcmFsbWVudGUgcGFyYSByZXByZXNlbnRhciB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGNvbiBsYSBjYW50aWRhZCAocG9ibGFjacOzbiwgcHJvZHVjY2nDs24sIGluZ3Jlc29zKS4KUGFyYSBpbHVzdHJhciBsYXMgdmFyaWFibGVzLCBzZSB1c2FuIHB1bnRvcyBxdWUgdGllbmVuIGVsIG1pc21vIHRhbWHDsW8uIENhZGEgcHVudG8gaWx1c3RyYSB1biBzb2xvIGRhdG8geSBhIHN1bWEgZGUgdG9kb3MgcmVwcmVzZW50YSBsYSBjYW50aWRhZCB0b3RhbC4gClBhcmEgZWxhYm9yYXIgY29ycmVjdGFtZW50ZSBlc3RlIG1hcGEsIHNlIGRlYmUgdGVuZXIgZW4gY3VlbnRhIGVsIHZhbG9yIGRlIGNhZGEgcHVudG8sIGVsIHRhbWHDsW8geSBsYSBwb3NpY2nDs24gZGUgZXN0ZS4KRXMgaW1wb3J0YW50ZSBxdWUgY2FkYSBwdW50byBzZWEgdmlzaWJsZSBwZXJvIG5vIGRlYmUgc2VyIGV4YWdlcmFkbyBwYXJhIGV2aXRhciBxdWUgc2Ugc3VwZXJwb25nYSBjb24gb3Ryb3MgeSBkaWZpY3VsdGUgbGEgY29tcHJlbnNpw7NuIGRlIGxhIGluZm9ybWFjacOzbi4KRWwgc2lndWllbnRlIG1hcGEgZGUgcHVudG9zIGlsdXN0cmEgY2xhcmFtZW50ZSBsb3MgcHVudG9zIGRlIHJlY2FyZ2EgaW50ZWxpZ2VudGUgZGUgbG9zIGNvY2hlcyBlbMOpY3RyaWNvcyBlbiBFc3Bhw7FhLgoKIVtNYXBhIGRlIHB1bnRvcy4gVG9tYWRvIGRlOiBodHRwczovL3d3dy5lY290aWNpYXMuY29tL21vdG9yLzE5ODIzMS9yZWUtbWFwYS01MDAtcHVudG9zLXJlY2FyZ2EtY29jaGUtZWxlY3RyaWNvXSguL3B1bnRvcy5wbmcpIAoKIyMgMy4JRGF0b3MKCkVuIGVzdGEgcHJpbWVyYSBzZWNjacOzbiwgc2UgIHJlYWxpemFyw6FuIGFsZ3Vub3MgbWFwYXMgdGVtw6F0aWNvcyBhIHBhcnRpciBkZSBsYXMgZXN0YWTDrXN0aWNhcyByZWxhY2lvbmFkYXMgY29uIGxhcyBOZWNlc2lkYWRlcyBCw6FzaWNhIEluc2F0aXNmZWNoYXMgKE5CSSkgcmVhbGl6YWRhcyBwb3IgZWwgREFORSBlbiBlbCBhw7FvIDIwMTguCkVsIE5CSSB1c2EgaW5kaWNhZG9yZXMgY2VudHJhZG9zIGVuIGxhIHZpdmllbmRhIHkgc2VydmljaW9zIHDDumJsaWNvcyBwYXJhIGRldGVybWluYXIgc2kgbGFzIG5lY2VzaWRhZGVzIGLDoXNpY2FzIGRlIGxhIHBvYmxhY2nDs24gZXN0w6FuIGN1YmllcnRhcyBvIHBvciBlbCBjb250cmFyaW8gdGllbmVuIGFsZ3VuYSBkZWZpY2llbmNpYS4gCkVsIGFyY2hpdm8gZnVlIGRlc2NhcmdhZG8gZW4gZm9ybWF0byAueGxzeCAgeSBtb2RpZmljYWRvIHBvciBtZWRpbyBkZWwgcHJvZ3JhbWEgTWljcm9zb2Z0IEV4Y2VsIHBhcmEgZ2FyYW50aXphciBsYSBsZWN0dXJhIGRlIGVzdG9zIGRhdG9zIGVuIFIuIFBhcmEgZWxsbywgZnVlIG5lY2VzYXJpbyBlbGltaW5hciBsYXMgZmlsYXMgcXVlIGNvbnRlbsOtYW4gaW5mb3JtYWNpw7NuIGRlIG11bmljaXBpb3MgZXh0ZXJub3MgYWwgRGVwYXJ0YW1lbnRvIGRlIENhc2FuYXJlIHkgYXNpZ25hcmxlIGEgY2FkYSBjb2x1bW5hIHVuYSBzb2xhIHBhbGFicmEgY29tbyBub21icmUuIApFbCBhcmNoaXZvIHJlc3VsdGFudGUgc2UgZ3VhcmTDsyBjb24gZWwgbm9tYnJlIGRlIOKAnE5CSV9DYXNhbmFyZS54bHN44oCdCgojIyA0LglQcmVwYXJhY2nDs24KUGFyYSBlbXBlemFyLCBlcyBuZWNlc2FyaW8gbGltcGlhciBsYSBtZW1vcmlhOgpgYGB7cn0Kcm0obGlzdD1scygpKQpgYGAKCkx1ZWdvLCBzZSBpbnN0YWxhbiBsYXMgbGlicmVyw61hcyBxdWUgc2Vyw6FuIGVtcGxlYWRhcyB0ZW5pZW5kbyBlbiBjdWVudGEgcXVlIGFsZ3VuYXMgeWEgc2UgaGFuIGluc3RhbGFkbyBjb24gYW50ZXJpb3JpZGFkLiBQb3IgZXN0YSDDumx0aW1hIHJhesOzbiwgc2UgZW1wbGVhIGVsIHNpZ3VpZW50ZSBjw7NkaWdvOgpgYGB7cn0KbGlzdC5vZi5wYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAicmdlb3MiLCAic2YiLCAicmFzdGVyIiwgImNhcnRvZ3JhcGh5IiwgIlNwYXRpYWxQb3NpdGlvbiIpCm5ldy5wYWNrYWdlcyA8LSBsaXN0Lm9mLnBhY2thZ2VzWyEobGlzdC5vZi5wYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKV0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQpgYGAKClNlIHByb2NlZGUgYSBjYXJnYXIgbGFzIGxpYnJlcsOtYXMgaW5zdGFsYWRhczoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkocmFzdGVyKSAKbGlicmFyeShzZikKYGBgCgpgYGB7cn0KbGlicmFyeShjYXJ0b2dyYXBoeSkKbGlicmFyeShTcGF0aWFsUG9zaXRpb24pCmBgYAoKIyM1LglMZWVyIGxvcyBkYXRvcyBkZSBOQkkKUGFyYSBsZWVyIGVsIGFyY2hpdm8gZGUgTmVjZXNpZGFkZXMgQsOhc2ljYXMgSW5zYXRpc2ZlY2hhcyBkZWwgRGVwYXJ0YW1lbnRvIGRlIENhc2FuYXJlLCBzZSBlc2NyaWJlOgoKYGBge3J9Cm5iaSA8LSByZWFkX2V4Y2VsKCJOQklfQ2FzYW5hcmUueGxzeCIpCmBgYApEZWJpZG8gYSBxdWUgc2Ugbm9tYnLDsyBjb21vIG5iaSBhbCBhcmNoaXZvLCBzZSBlc2NyaWJlIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIHBhcmEgdmlzdWFsaXphciBsb3MgZGF0b3M6CgpgYGB7cn0KaGVhZChuYmkpCmBgYApVc2FuZG8gZWwgc2lndWllbnRlIGPDs2RpZ28sIHNlIHB1ZWRlIHNhYmVyIGN1w6FsIGVzIGVsIG11bmljaXBpbyBkZSBlc3RlIGRlcGFydGFtZW50byBjb24gdW4gbWF5b3IgcG9yY2VudGFqZSBkZSBuZWNlc2lkYWRlcyBiw6FzaWNhcyBpbnNhdGlzZmVjaGFzOgpgYGB7cn0KbmJpICU+JSAKICAgIHNsaWNlKHdoaWNoLm1heChOQkkpKSAtPiBtYXhfbmJpCm1heF9uYmkKYGBgCkxhIHRhYmxhIGFudGVyaW9yIHNlw7FhbGEgcXVlIFTDoW1hcmEgZXMgZWwgbXVuaWNpcGlvIG3DoXMgdnVsbmVyYWRvIGNvbiByZXNwZWN0byBhbCBOQkkgZGViaWRvIGEgcXVlIGVsIDM3JSBkZSBzdSBwb2JsYWNpw7NuICB0aWVuZSBhbGd1bmEgY2FyZW5jaWEuIEFsIGludmVzdGlnYXIgZW4gaW50ZXJuZXQsIHNlIGVuY29udHLDsyBxdWUgZGVzZGUgZWwgMjAwNSBlc3RlIG11bmljaXBpbyBoYSB0ZW5pZG8gZWwgcG9yY2VudGFqZSBkZSBOQkkgbcOhcyBhbHRvIGRlbCBEZXBhcnRhbWVudG8uIFNpbiBlbWJhcmdvLCBzZSBoYSB2aXN0byB1bmEgZGlzbWludWNpw7NuIHNpZ25pZmljYXRpdmEgcHVlc3RvIHF1ZSBhbnRlcmlvcm1lbnRlIGVsIHBvcmNlbnRhamUgZXJhIGVxdWl2YWxlbnRlIGEgNzIsNDIlIGRvbmRlIGxvcyBtYXlvcm1lbnRlIGFmZWN0YWRvcyBlcmFuIGxvcyBoYWJpdGFudGVzIGRlIGxhcyB6b25hcyBydXJhbGVzIGRlbCBtdW5pY2lwaW8uCkVsIENvbmNlam8gTXVuaWNpcGFsIGRlIFTDoW1hcmEgZXhwbGljYSBlbiBlbCBBY3VlcmRvIDQwMC4wMi0wMDcgcXVlIGxvcyBuaXZlbGVzIHRhbiBhbHRvcyBkZSBwb2JyZXphIHNvbiBwcm9kdWN0byBkZSBsYSB2aW9sZW5jaWEgcXVlIHZpdmnDsyBoYWNlIGFsZ3Vub3MgYcOxb3MuIFRhbWJpw6luIHNlIG1lbmNpb25hIHF1ZSBncmFuIGNhbnRpZGFkIGRlIHByZWRpb3MgcGVydGVuZWNpZW50ZXMgYSBlc3RlIG11bmljaXBpbyBubyBlc3TDoW4gZXNjcml0dXJhZG9zIHkgZXN0byBkaWZpY3VsdGEgZWwgYWNjZXNvIGEgbG9zIHN1YnNpZGlvcyBuYWNpb25hbGVzIG8gZGVwYXJ0YW1lbnRhbGVzIGNyZWFkb3MgcGFyYSBlbCBtZWpvcmFtaWVudG8gbyBjb25zdHJ1Y2Npw7NuIGRlIHZpdmllbmRhIG51ZXZhIChDb25jZWpvIE11bmljaXBhbCBkZSBUw6FtYXJhLCAyMDE2KS4KClRhbWJpw6luIHNlIHB1ZWRlIGJ1c2NhciBlbCBtdW5pY2lwaW8gY29uIG1lbm9yIHBvcmNlbnRhamUgZGUgTkJJIGEgdHJhdsOpcyBkZWwgY8OzZGlnbzoKYGBge3J9Cm5iaSAlPiUgCiAgICBzbGljZSh3aGljaC5taW4oTkJJKSkgLT4gbWluX25iaQptaW5fbmJpCmBgYApMYSB0YWJsYSBhbnRlcmlvciBtdWVzdHJhIHF1ZSBlbCBtdW5pY2lwaW8gZGUgTW9udGVycmV5IGVzIGVsIG1lbm9yIGFmZWN0YWNpw7NuIHRpZW5lIHBvciBsYXMgTmVjZXNpZGFkZXMgQsOhc2ljYXMgSW5zYXRpc2ZlY2hhcy4gQWwgYnVzY2FyIGluZm9ybWFjacOzbiBhbCByZXNwZWN0bywgc2UgZW5jb250csOzIHF1ZSBNb250ZXJyZXkgZXMgdW4gaW1wb3J0YW50ZSBwcm9kdWN0b3IgZGUgY2Fmw6ksIGNhY2FvLCBjYcOxYSBkZSBhesO6Y2FyLCBwbMOhdGFubywgeXVjYSwgYWxnb2TDs24sIHNvcmdvIHkgbWHDrXogYWRlbcOhcyBzZSBkZXNhcnJvbGxhciBnYW5hZGVyw61hIGVuIHN1IHRlcnJpdG9yaW8uIEVuIGVsIHBsYW4gdGVycml0b3JpYWwgZGUgc2FsdWQgY29udGVtcGxhZG8gcGFyYSBlbCBwZXJpb2RvIDIwMjAtMjAyMyBzZSBtZW5jaW9uYSBsYSBwcm9ibGVtw6F0aWNhIGRlIGxvcyBoaWRyb2NhcmJ1cm9zIHBlcm8gYSBzdSB2ZXogc2UgZXNjbGFyZWNlIHF1ZSBlc3RhIGFjdGl2aWRhZCBnZW5lcmEgZW1wbGVvcyBwYXJhIGxhIHBvYmxhY2nDs24gKEVxdWlwbyBkZSBHb2JpZXJubyBkZSBDYXNhbmFyZSwgMjAyMCkuCgpVc2FuZG8gZWwgc2lndWllbnRlIGPDs2RpZ28sIHNlIHB1ZWRlbiB2ZXIgbG9zIG11bmljaXBpb3Mgb3JkZW5hZG9zIGRlIG1hbmVyYSBkZXNjZW5kZW50ZSBwb3Igc3UgTkJJOgpgYGB7cn0KbmJpICU+JSAKICBhcnJhbmdlKGRlc2MoTkJJKSkgIC0+IGRlc2NfbmJpCmRlc2NfbmJpCmBgYApMYSB0YWJsYSBub3MgbXVlc3RyYSBlbiBsb3MgdHJlcyBwcmltZXJvcyBsdWdhcmVzIGFsIG11bmljaXBpbyBkZSBUw6FtYXJhLCAgTnVuY2jDrWEgeSBIYXRvIENvcm96YWwuIAoKIyMgNi4gVW5pciBsb3MgZGF0b3MgZGUgTkJJIGEgbG9zIG11bmljaXBpb3MKUGFyYSBsYSByZWFsaXphY2nDs24gZGVsIGpvaW4sIHNlIGVtcGxlYSBsYSBiaWJsaW90ZWNhIHNmIHF1ZSBwZXJtaXRpcsOhIGHDsWFkaXIgbG9zIG11bmljaXBpb3MgZGVsIERlcGFydGFtZW50byBkZSBDYXNhbmFyZToKYGBge3J9Cm11bmljIDwtIHN0X3JlYWQoIi4vTUdOX01QSU9fUE9MSVRJQ08uc2hwIikKYGBgCkx1ZWdvLCBzZSBvYnNlcnZhcsOhIGxhIGluZm9ybWFjacOzbiBjb250ZW5pZGEgZW4gZWwgYXRyaWJ1dG8gTVBJT19DQ0RHTyBhIHRyYXbDqXMgZGVsIGPDs2RpZ28gaGVhZCgpOgpgYGB7cn0KaGVhZChtdW5pYyRNUElPX0NOTUJSKQpgYGAKUGFyYSBjb25jcmV0YXIgbGEgdW5pw7NuIGVudHJlIGxvcyBkYXRvcyBkZSBOQkkgeSBlbCBhcmNoaXZvIGNvbiBsYSBpbmZvcm1hY2nDs24gbXVuaWNpcGFsIHNlIHVzYSBsYSBmdW5jacOzbiBsZWZ0X2pvaW46CmBgYHtyfQpuYmlfbXVuaWMgPSBsZWZ0X2pvaW4obXVuaWMsIG5iaSwgYnk9YygiTVBJT19DQ0RHTyI9IkNPRElHTyIpKQpgYGAKUGFyYSBsYSBjcmVhY2nDs24gZGUgZXN0ZSBqb2luIHNlIGVtcGxlYW4gbGFzIHZhcmlhYmxlcyBkZWwgY8OzZGlnbywgZWwgTkJJIHkgbG9zIG5vbWJyZXMgZGUgbG9zIG11bmljaXBpb3MgcXVlIHBvc3Rlcmlvcm1lbnRlIHNlIGd1YXJkYSBlbiBlbCBvYmpldG8g4oCcY2hlY2tfbmJpX211bmlj4oCdLgpgYGB7cn0KbmJpX211bmljICU+JQogIGRwbHlyOjpzZWxlY3QoTVVOSUNJUElPLCBNUElPX0NDREdPLCBOQkkpICAtPiAgY2hlY2tfbmJpX211bmljCmhlYWQoY2hlY2tfbmJpX211bmljKQpgYGAKTGEgZnVuY2nDs24gY2FydG9ncmFwaHkgw7puaWNhbWVudGUgdXNhIGNvb3JkZW5hZGFzIHBsYW5hcywgZXMgcG9yIGVsbG8gcXVlIGVzdGFzIGNvb3JkZW5hZGFzIGRlYmVuIHNlIHRyYXNmb3JtYWRhcyBjb24gbGEgZnVuY2nDs24gc3RfdHJhbnNmb3JtKCkgc2Vnw7puIGxhIHJlZ2nDs24gZ2VvZ3LDoWZpY2EuIEVuIGVzdGUgY3VhZGVybm8sIHNlIHF1aWVyZSB0cmFiYWphciBDb2xvbWJpYSwgcG9yIGxvIGN1YWwsIHNlIHVzYXLDoSBlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWFzIGRlIGNvb3JkZW5hZGFzIEVQU0czMTE2LgpgYGB7cn0KbmJpX211bmljX25ldyA8LSBzdF90cmFuc2Zvcm0obmJpX211bmljLCBjcnMgPSAzMTE2KQpgYGAKIyMgNy4gRWplbXBsb3MgZGUgbWFwYXMgdGVtw6F0aWNvcwoKUGFyYSBncmFmaWNhciBsb3MgbWFwYXMgdGVtw6F0aWNvcyBjb24gZ3JhbiBjYWxpZGFkIHZpc3VhbCBzZSB1dGlsaXphcsOhbiBsYSBsaWJyZXLDrWEgY2FydG9ncmFwaHkuIEVzdGEgZnVuY2nDs24gZXMgZXNwZWNpZmljbyBlcyBpbnR1aXRpdmEgeSBwb3IgZXN0YSBtaXNtYSByYXrDs24sIGVzIHVuYSBoZXJyYW1pZW50YSBtdXkgZW1wbGVhZGEgcGFyYSBsYSByZWFsaXphY2nDs24gZGUgdHJhYmFqb3MgY29uIGVsIHNvZnR3YXJlIFIuCkNhcnRvZ3JhcGh5IGVtcGxlYSBsYSBmdW5jacOzbiBzZiBwYXJhIGxhIHByb2R1Y2Npw7NuIGRlIGxvcyBncsOhZmljb3MgYmFzZSwgZXMgcG9yIGVsbG8gcXVlIGFtYm9zIHBhcXVldGVzIGRlYmVuIGVzdGFyIGluc3RhbGFkb3MgeSBsaXN0b3MgcGFyYSB1c2FyLgojIyMgNy4xIFPDrW1ib2xvcyBwcm9wb3JjaW9uYWxlcyB1c2FuZG8gZWwgbWFwYSBiYXNlIGRlIE9wZW5TdHJlZXRNYXAKCkVuIGVzdGUgbWFwYSwgZXMgbmVjZXNhcmlvIHVzYXIgZG9zIGZ1bmNpb25lcyBjbGF2ZTogZ2V0VGlsZXMoKSB5IHRpdGxlc0xheWVyKCkgcXVlIGVuIGNvbmp1bnRvIHBlcm1pdGlyw6FuIHZlciB5IGRlc2NhcmdhciBsb3MgbW9zYWljb3MgcXVlIHNlIHB1ZWRlbiBlbmNvbnRyYXIgZW4gT3BlblN0cmVldE1hcC4gClBvciBvdHJhIHBhcnRlLCBsYSBmdW5jacOzbiBwcm9wU3ltYm9sc0xheWVyKCkgbXVlc3RyYSBsb3Mgc8OtbWJvbG9zIGNvbiB1biB0YW1hw7FvIHByb3BvcmNpb25hbCBhbCDDoXJlYSBxdWUgZXN0ZSBhc2lnbmFkYSBwYXJhIGNhZGEgdmFyaWFibGUgY3VhbnRpdGF0aXZhLiBFc3RlIHPDrW1ib2xvIHB1ZWRlIHNlciBjdWFscXVpZXIgZmlndXJhIGdlb23DqXRyaWNhLCBwZXJvIGVuIGVzdGUgY2FzbyBzZSBlbXBsZWFyw6FuIGxvcyBjw61yY3Vsb3MsIHBvcnF1ZSBwZXJtaXRlbiB1bmEgbWVqb3IgdmlzdWFsaXphY2nDs24gZGUgbG9zIGRhdG9zLgoKYGBge3J9Cm11bi5vc20gPC0gZ2V0VGlsZXMoeCA9IG5iaV9tdW5pY19uZXcsIHR5cGUgPSAiT3BlblN0cmVldE1hcCIsIHpvb20gPSA4LGNhY2hlZGlyID0gVFJVRSxjcm9wID0gRkFMU0UpCmBgYAoKQWhvcmEsIHNlIHByb3NpZ3VlIGEgZXN0YWJsZWNlciBsYXMgbcOhcmdlbmVzIHkgZGVzY3JpYmlyIGNpZXJ0b3MgYXRyaWJ1dG9zIHF1ZSB0ZW5kcsOhIGxhIGZ1bmNpw7NuIHByb3BTeW1ib2xzTGF5ZXIoKSB5IHF1ZSBheXVkYXLDoW4gYWwgbGVjdG9yIGEgZW50ZW5kZXIgbGEgaW5mb3JtYWNpw7NuIHF1ZSBzZSBxdWllcmUgdHJhbnNtaXRpci4gCkxhIGZ1bmNpw7NuIGxheW91dExheWVyKCkgcGVybWl0ZSBhZ3JlZ2FyIGluZm9ybWFjacOzbiByZWxhY2lvbmFkYSBjb24gZWwgdMOtdHVsbywgc3UgYXV0b3IgeSBiw6FzaWNhbWVudGUgbGEgZXRpcXVldGEgZGUgbnVlc3RybyBtYXBhLgpgYGB7cn0KbXVuLm9zbSA8LSBnZXRUaWxlcyh4ID0gbmJpX211bmljX25ldywgdHlwZSA9ICJPcGVuU3RyZWV0TWFwIiwgem9vbSA9IDgsY2FjaGVkaXIgPSBUUlVFLGNyb3AgPSBGQUxTRSkKb3BhciA8LSBwYXIobWFyID0gYygwLDAsMS4yLDApKQp0aWxlc0xheWVyKHggPSBtdW4ub3NtKQpwbG90KHN0X2dlb21ldHJ5KG5iaV9tdW5pY19uZXcpLCBjb2wgPSBOQSwgYm9yZGVyID0gImJsYWNrIiwgYWRkPVRSVUUpCgpwcm9wU3ltYm9sc0xheWVyKHggPSBuYmlfbXVuaWNfbmV3LCB2YXIgPSAiTkJJIiwgaW5jaGVzID0gMC4xNSwgY29sID0gImRhcmtzYWxtb24iLGxlZ2VuZC5wb3MgPSAidG9wcmlnaHQiLCBsZWdlbmQudGl0bGUudHh0ID0gIlRvdGFsIE5CSSIpCgpsYXlvdXRMYXllcih0aXRsZSA9ICIgRGlzdHJpYnVjacOzbiBkZWwgTkJJIGVuIGVsIERlcGFydGFtZW50byBkZSBDYXNhbmFyZSIsIAogICAgICAgICAgICBzb3VyY2VzID0gIlNvdXJjZXM6IERBTkUsIDIwMThcbsKpIE9wZW5TdHJlZXRNYXAiLCAKICAgICAgICAgICAgYXV0aG9yID0gIiBMdWlzYSBGZXJuYW5kYSBDYXJyacOzbiBSYW3DrXJleiAiLCAKICAgICAgICAgICAgZnJhbWUgPSBUUlVFLCBub3J0aCA9IEZBTFNFLCB0YWJ0aXRsZSA9IFRSVUUpCgpub3J0aChwb3MgPSAidG9wbGVmdCIpCmBgYApTZWfDum4gZW4gbWFwYSBhbnRlcmlvciwgbG9zIMOtbmRpY2VzIGRlIE5CSSBzb24gbWF5b3JlcyBlbiBtdW5pY2lwaW9zIGNvbW8gTGEgU2FsaW5hLCBTw6FjYW1hLCBIYXRvIENvcm96YWwgeSBUw6FtYXJhIHlhIHF1ZSBlbCBjaXJjdWxvIHF1ZSBzZSBlbmN1ZW50cmEgZGlidWphZG8gZW4gc3UgdGVycml0b3JpbyBlcyBkZSBtYXlvciBwcm9wb3JjacOzbiBhbCBjb21wYXJhc2UgY29uIG90cm9zIG11bmljaXBpb3MuIFBlc2UgYSBxdWUgbG9zIGPDrXJjdWxvcyBzb24gZGUgZ3JhbiBlc2NhbGEsIG5vIHNlIHB1ZWRlIGRldGVybWluYXIgY29uIHRvdGFsIHNlZ3VyaWRhZCBxdWUgbXVuaWNpcGlvIHByZXNlbnRhIG1heW9yIHBvcmNlbnRhamUgZGUgTkJJLiAKCiMjIyA3LjIgTWFwYSBkZSBjb3JvcGxldGFzOgpFbCBtYXBhIGRlIGNvcm9wbGV0YXMgc2UgcHVlZGUgZ3JhZmljYXIgY29uIGxhIGZ1bmNpw7NuIGNob3JvTGF5ZXIoKSBxdWUgZXMgZXNwZWPDrWZpY2EgcGFyYSBlc3RlIGZpbi4gTG9zIGFyZ3VtZW50b3MgY29tbyBuY2xhc3MsIG1ldG9kIG8gYnJlYWtzIHB1ZWRlbiBzZXIgbW9kaWZpY2Fkb3MgIHBhcmEgaGFjZXIgZWwgbWFwYSBtw6FzIG9yaWdpbmFsIGRlYmlkbyBhIHF1ZSBpbmZsdXllbiBlbiBsYSBjbGFzaWZpY2FjacOzbiBkZSBsYSB2YXJpYWJsZS4gTGEgZnVuY2nDs24gZ2V0YnJlYWtzKCkgcGVybWl0ZSBxdWUgIGxhcyB2YXJpYWJsZXMgcHVlZGFuIHNlciBjbGFzaWZpY2FkYXMgcG9yIGZ1ZXJhIGRlIGxhIGZ1bmNpw7NuIGNob3JvTGF5ZXIoKS4KCgpgYGB7cn0Kb3BhciA8LSBwYXIobWFyID0gYygwLDAsMS4yLDApKQpwYXIoYmc9ImdyZXk5MCIpCnBsb3Qoc3RfZ2VvbWV0cnkobmJpX211bmljX25ldyksIGNvbCA9IE5BLCBib3JkZXIgPSBOQSwgYmcgPSAiI2FhZGFmZiIpCmNob3JvTGF5ZXIoCiAgeCA9IG5iaV9tdW5pY19uZXcsIAogIHZhciA9ICJOQkkiLAogIG1ldGhvZCA9ICJnZW9tIiwKICBuY2xhc3M9NSwKICBjb2wgPSBjYXJ0by5wYWwocGFsMSA9ICJncmVlbi5wYWwiLCBuMSA9IDUpLAogIGJvcmRlciA9ICJ3aGl0ZSIsIAogIGx3ZCA9IDAuNSwKICBsZWdlbmQucG9zID0gInRvcHJpZ2h0IiwgCiAgbGVnZW5kLnRpdGxlLnR4dCA9ICJOQkkiLAogIGFkZCA9IFRSVUUKKSAKbGF5b3V0TGF5ZXIodGl0bGUgPSAiTkJJIGVuIGVuIERlcGFydGFtZW50byBkZSBDYXNhbmFyZSIsIAogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZTogREFORSwgMjAxOCIsCiAgICAgICAgICAgIGF1dGhvciA9ICJMdWlzYSBGZXJuYW5kYSBDYXJyacOzbiBSYW3DrXJleiAiLCAKICAgICAgICAgICAgZnJhbWUgPSBUUlVFLCBub3J0aCA9IFRSVUUsIHRhYnRpdGxlID0gVFJVRSwgY29sPSJibGFjayIpIApub3J0aChwb3MgPSAidG9wbGVmdCIpCmBgYApFc3RlIG51ZXZvIG1hcGEgbm9zIHBlcm1pdGUgYXByZWNpYXIgcXVlIGxhcyB6b25hcyB1YmljYWRhcyBoYWNpYSBlbCBzdXIgZGVsIGRlcGFydGFtZW50byB0aWVuZW4gbWVub3IgcG9yY2VudGFqZSBkZSBOQkkgYSBjb21wYXJhY2nDs24gZGUgbG9zIG11bmljaXBpb3Mgb3JpZW50YWRvcyBoYWNpYSBlbCBub3J0ZS4gUG9yIGVsIG1vbWVudG8sIG5vIGVzIHBvc2libGUgZGVjaXIgcXVlIG11bmljaXBpbyB0aWVuZSB1bmEgbWF5b3IgcHJvYmxlbcOhdGljYSBjb24gbGFzIE5lY2VzaWRhZGVzIELDoXNpY2FzIEluc2F0aXNmZWNoYXMgYXVucXVlLCBzZSBwdWVkZSBkZWNpciBxdWUgbG9zIG3DoXMgYWZlY3RhZG9zIHNvbiBUw6FtYXJhIHkgSGF0byBDb3JvemFsLiAKCiMjIyA3LjMJTWFwYSBkZSBzw61tYm9sb3MgcHJvcG9yY2lvbmFsZXMgeSBtYXBhIGRlIHRpcG9sb2fDrWE6IApQYXJhIGVzdGUgbWFwYSBlbiBlc3BlY8OtZmljbyBlcyBuZWNlc2FyaW8gdXNhciBsYSBmdW5jacOzbiBwcm9wU3ltYm9sc1R5cG9MYXRlcigpIHB1ZXN0byBxdWUgY3JlYSBsb3MgbWFwYXMgZGUgc8OtbWJvbG9zIGEgcGFydGlyIGRlIGRvcyB2YXJpYWJsZXMuIExhIHByaW1lcmEgdmFyaWFibGUgcGVybWl0ZSBxdWUgZXN0YSBmdW5jacOzbiBhc2lnbmUgdW5vcyB2YWxvcmVzIHByb3BvcmNpb25hbGVzICh0YW1iacOpbiBsZXMgYXNpZ25hIHVuIGNvbG9yKSBwYXJhIHJlZmxlamFyIGxvcyBkYXRvcyBkZSBsYSBzZWd1bmRhIHZhcmlhYmxlLgpTZSB1c8OzIGxhIGZ1bmNpw7NuIG11dGF0ZSBpbmNsdWlkYSBlbiBlbCBwYXF1ZXRlIGRwbHlyIHBhcmEgY3JlYXIgbG9zIGF0cmlidXRvcy4KCmBgYHtyfQogbmJpX211bmljXzIgPC0gZHBseXI6Om11dGF0ZShuYmlfbXVuaWNfbmV3LCBwb3ZlcnR5ID0gaWZlbHNlKE1JU0VSSUEgPiAyMCwgIkV4dHJlbWEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoSEFDSU5BTUlFTlRPID4gNSwgIkFsdGEiLCAiSW50ZXJtZWRpYSIpKSkKYGBgCgpDYWJlIGRlc3RhY2FyIHF1ZSBlbCBhdHJpYnV0byBxdWUgc2UgY3Jlw7MsIHNlIGxsYW1hIHBvYnJlemEgeSBzdSB2YWxvciBlc3TDoSBpbmZsdWlkbyBwb3IgZWwgY29tYW5kbyBpZmVsc2UuClNpIHNlIHVzYSBsYSBkdW5jacOzbiBoZWFkKCkgc2UgcHVlZGVuIHZlciBhbGd1bm9zIGRhdG9zOgpgYGB7cn0KaGVhZChuYmlfbXVuaWNfMikKYGBgCgpVdGlsaXphbmRvIGxhcyBmdW5jaW9uZXMgc2YgeSBjYXJ0b2dyYXBoeSBzZSBwcm9jZWRlIGEgZ3JhZmljYXIgZWwgbWFwYSBwb3IgbWVkaW8gZGVsIHNpZ3VpZW50ZSBjw7NkaWdvOgpgYGB7cn0Kb3BhciA8LSBwYXIobWFyID0gYygwLDAsMS4yLDApKQpwbG90KHN0X2dlb21ldHJ5KG5iaV9tdW5pY18yKSwgY29sPSJsaWdodGJsdWUyIiwgYm9yZGVyPSJibGFjayIsIGJnID1OQSwgCiAgICAgbHdkID0gMC41KQoKcHJvcFN5bWJvbHNUeXBvTGF5ZXIoCiAgeCA9IG5iaV9tdW5pY18yLCAKICB2YXIgPSAiTkJJIiwgCiAgaW5jaGVzID0gMC40NSwKICBzeW1ib2xzID0gInNxdWFyZSIsCiAgYm9yZGVyID0gImJsYWNrIiwKICBsd2QgPSAuNSwKICBsZWdlbmQudmFyLnBvcyA9ICJ0b3ByaWdodCIsIAogIGxlZ2VuZC52YXIudGl0bGUudHh0ID0gIk5CSSIsCiAgdmFyMiA9ICJwb3ZlcnR5IiwKICBsZWdlbmQudmFyMi52YWx1ZXMub3JkZXIsIG1vZCwgY29sbGFwc2UoIkV4dHJlbWEiLCAiQWx0YSIsICJJbnRlcm1lZGlhIiksCiAgY29sID0gY2FydG8ucGFsKHBhbDEgPSAibXVsdGkucGFsIiwgbjEgPSAzKSwKICBsZWdlbmQudmFyMi5wb3MgPSJyaWdodCIsIAogIGxlZ2VuZC52YXIyLnRpdGxlLnR4dCA9ICJQb2JyZXphIgopIAoKbGF5b3V0TGF5ZXIoIkRpc3RyaWJ1Y2nDs24gZGUgTkJJIGVuIENhc2FuYXJlIiwgCiAgc291cmNlcyA9IkZ1ZW50ZTpEQU5FLCAyMDE4IFxuIE9wZW5TdHJlZXRNYXAiLAogIGF1dGhvcj0iTHVpc2EgRmVybmFuZGEgQ2FycmnDs24gUmFtw61yZXoiLCAKICAgICAgICAgICAgc2NhbGUgPSAxLCB0YWJ0aXRsZSA9IFRSVUUsIGZyYW1lID0gVFJVRSkKbm9ydGgocG9zID0gInRvcGxlZnQiKQpgYGAKRWwgYW50ZXJpb3IgbWFwYSBub3MgbXVlc3RyYSBxdWUgZWwgTkJJIGRlbCBEZXBhcnRhbWVudG8gZGUgQ2FzYW5hcmUgc2UgZW5jdWVudHJhIGVudHJlIGxvcyB2YWxvcmVzIGFsdG9zIGUgaW50ZXJtZWRpb3MsIHNpbiBlbWJhcmdvLCBuaW5nw7puIG11bmljaXBpbyBlc3TDoSBlbiB1biBuaXZlbCBkZSBwb2JyZXphIGV4dHJlbWEuIEEgcGVzYXIgZGUgZXN0byDDumx0aW1vLCBzb24gcHJlb2N1cGFudGVzIGxvIHZhbG9yZXMgcmVjb2xlY3RhZG9zIHBvciBlbCBEQU5FIHkgcG9yIGVuZGUsIGRlYmVuIGRpc2XDsWFyc2UgZXN0cmF0ZWdpYXMgcGFyYSBlcnJhZGljYXIgZXN0YXMgZXN0YWTDrXN0aWNhcy4gCgojIyMgNy40IE1hcGEgZGUgZXRpcXVldGFzCgpFbXBsZWEgcHJpbmNpcGFsbWVudGUgbGFzIGxpYnJlcsOtYXMgY2hvcm9MYXRlcigpIHkgbGFiZWxMYXllcigpIHF1ZSBmdWVyb24gZGVzY3JpdGFzIGFudGVyaW9ybWVudGUKCmBgYHtyfQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KGNhcnRvZ3JhcGh5KQojIHNldCBtYXJnaW5zCm9wYXIgPC0gcGFyKG1hciA9IGMoMCwwLDEuMiwwKSkKIyBzZXQgZmlndXJlIGJhY2tncm91bmQgY29sb3IKcGFyKGJnPSJncmV5MjUiKQojIHBsb3QgbXVuaWNpcGFsaXRpZXMKcGxvdChzdF9nZW9tZXRyeShuYmlfbXVuaWNfMiksIGNvbCA9ICIjZTRlOWRlIiwgYm9yZGVyID0gImRhcmtzZWFncmVlbjQiLCAKICAgICBiZyA9ICJncmV5NzUiLCBsd2QgPSAwLjUpCiMgcGxvdCBOQkkKY2hvcm9MYXllcigKICB4ID0gbmJpX211bmljX25ldywgCiAgdmFyID0gIk5CSSIsCiAgbWV0aG9kID0gImdlb20iLAogIG5jbGFzcz01LAogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gInB1cnBsZS5wYWwiLCBuMSA9IDUpLAogIGJvcmRlciA9ICJ3aGl0ZSIsIAogIGx3ZCA9IDAuNSwKICBsZWdlbmQucG9zID0gInRvcHJpZ2h0IiwgCiAgbGVnZW5kLnRpdGxlLnR4dCA9ICJOQkkiLAogIGFkZCA9IFRSVUUKKSAKCmxhYmVsTGF5ZXIoCiAgeCA9IG5iaV9tdW5pY18yLCAKICB0eHQgPSAiTVVOSUNJUElPIiwgCiAgY29sPSAid2hpdGUiLCAKICBjZXggPSAwLjQsIAogIGZvbnQgPSA0LAogIGhhbG8gPSBUUlVFLCAKICBiZyA9ICJibGFjayIsIAogIHIgPSAwLjEsIAogIG92ZXJsYXAgPSBGQUxTRSwgCiAgc2hvdy5saW5lcyA9IEZBTFNFCikKCmxheW91dExheWVyKAogIHRpdGxlID0gIk11bmljaXBpb3MgZGUgQ2FzYW5hcmUiLCAKICBzb3VyY2VzID0gIlNvdXJjZTogREFORSwgMjAxOCIsICAKICBhdXRob3IgPSAiTHVpc2EgRmVybmFuZGEgQ2FycmnDs24gUmFtw61yZXoiLCAKICBmcmFtZSA9IFRSVUUsCiAgbm9ydGggPSBUUlVFLCAKICB0YWJ0aXRsZSA9IFRSVUUsIAogIHRoZW1lID0gInRhdXBlLnBhbCIKKSAKCmBgYAoKIyMjIDcuNSBNYXBhIGRlIGlzb3BsZXRhczoKClBhcmEgZXN0b3MgdGlwb3MgZGUgbWFwYSBzZSBlbXBsZWEgbGEgZnVuY2nDs24gc21vb3RoTGF5ZXIoKSBpbmNsdWlkYSBlbiBlbCBwYXF1ZXRlIFNwYXRpYWxQb3NpdGlvbi4gTGEgZnVuY2nDs24gZW1wbGVhIHVuYSBjYXBhIGRlIHB1bnRvcyBjb24gcGFyw6FtZXRyb3MgeWEgZGVmaW5pZG9zIHBhcmEgbW9zdHJhciBlbCBtYXBhIGRlc2VhZG8uIApgYGB7cn0KbXVuaWMgPC0gc3RfcmVhZCgiLi9NR05fTVBJT19QT0xJVElDTy5zaHAiKQpgYGAKCkVuIGVzdGUgY2Fzbywgc2UgdXNhcsOhIGVsIGFyY2hpdm8gZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIG11bmljaXBhbGVzIGVsYWJvcmFkYXMgcG9yIGVsIERBTkUgeSBxdWUgcHJldmlhbWVudGUgZnVlcm9uIGRlc2NhcmdhZGFzIGEgdHJhdsOpcyBkZWwgR2VvcG9ydGFsLgpGdWUgbmVjZXNhcmlvIG1vZGlmaWNhciBlbCBhcmNoaXZvIG9yaWdpbmFsIGVuIGVsIHByb2dyYW1hIE1pY3Jvc29mdCBFeGNlbCBjb24gZWwgZmluIGRlIGRlamFyIMO6bmljYW1lbnRlIGxhcyBmaWxhcyBjb24gaW5mb3JtYWNpw7NuIGRlbCBkZXBhcnRhbWVudG8gZW4gY3Vlc3Rpw7NuLiBBZGVtw6FzLCDDum5pY2FtZW50ZSBzZSBlbXBsZWFyb24gbG9zIGRhdG9zIG9idGVuaWRvcyBlbiBlbCAyMDE4LiBFc3RlIGFyY2hpdm8gc2UgZ3VhcmTDsyBjb24gbGEgZXh0ZW5zacOzbiAueGxzeApMb3MgZGF0b3MgY29udGVuaWRvcyBlbiBlbCBhcmNoaXZvIHNlIGFsbWFjZW5hbiBlbiBlbCBvYmpldG8gY3VsdGl2b3MyMDE4CgpgYGB7cn0KY3VsdGl2b3MyMDE4IDwtIHJlYWRfZXhjZWwoIi4vRVZBX0Nhc2FuYXJlMi54bHN4IikKYGBgClBhcmEgb2JzZXJ2YXIgbG9zIGRhdG9zIHF1ZSBjb21wb25lbiBlbCBvYmpldG8gc2UgZXNjcmliZToKCmBgYHtyfQpoZWFkKGN1bHRpdm9zMjAxOCkKYGBgCgpgYGB7cn0KaGVhZChtdW5pYyRNUElPX0NOTUJSKQpgYGAKU2UgZGViZW4gZmlsdHJhciBsb3MgZGF0b3MgZGVsIGN1bHRpdm8gcXVlIHNlIHF1aWVyZSB0cmFiYWphciwgZW4gZXN0ZSBjYXNvIHNlcsOhIGxhIHBhbG1hIGRlIGFjaXRlLgpgYGB7cn0KY3VsdGl2b3MyMDE4ICU+JQogIGZpbHRlcihDVUxUSVZPID09ICJQQUxNQSBERSBBQ0VJVEUiKSAtPiBwYWxtYTIwMTgKYGBgCgpQYXJhIHJldmlzYXIgbGEgaW5mb3JtYWNpw7NuIGNvbnRlbmlkYSBlbiBwYWxtYTIwMTggc2UgdXNhIGxhIGZ1bmNpw7NuIGhlYWQoKToKCmBgYHtyfQpoZWFkKHBhbG1hMjAxOCkKYGBgCk1lZGlhbnRlIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIHNlIGNhbWJpYXLDoSBsYSBuYXR1cmFsZXphIGRlbCBkYXRvIENPRF9NVU4sIGVzIGRlY2lyLCBsYSBmdW5jacOzbiBkZWphcsOhIGRlIHNlciBudW3DqXJpY2EgcGFyYSBjb252ZXJ0aXJzZSBlbiB1biBjYXLDoWN0ZXIgRXN0YSB0cmFuc2Zvcm1hY2nDs24gZXMgbmVjZXNhcmlhIHBhcmEgZWplY3V0YXIgZWwgam9pbi4KCmBgYHtyfQpwYWxtYTIwMTgkVEVNUCA8LSBhcy5jaGFyYWN0ZXIocGFsbWEyMDE4JENPRF9NVU4pCnBhbG1hMjAxOCRNUElPX0NDREdPIDwtIGFzLmZhY3RvcihwYXN0ZShwYWxtYTIwMTgkVEVNUCkpCmBgYAoKVXNhbmRvIGxhIGZ1bmNpw7NuIGxlZnRfam9pbigpIHNlIGhhY2UgbGEgdW5pw7NuIGRlc2VhZGEuCmBgYHtyfQpwYWxtYV9tdW5pYyA9IGxlZnRfam9pbihtdW5pYywgcGFsbWEyMDE4LCBieT0iTVBJT19DQ0RHTyIpCmBgYApVc2FuZG8gbGEgZnVuY2nDs24gaGVhZCgpIHNlIHB1ZWRlIHZpc3VhbGl6YXIgbG9zIGRhdG9zIGRlIGVzdGUgbnVldm8gam9pbi4KYGBge3J9CmhlYWQocGFsbWFfbXVuaWMpCmBgYApQYXJhIHJlcHJveWVjdGFyIGxhcyBjb29yZGVuYWRhcyBkZSBsb3MgbXVuaWNpcGlvcyBzZSBlc2NyaWJlOgoKYGBge3J9CnJlcF9wYWxtYSA8LSBzdF90cmFuc2Zvcm0ocGFsbWFfbXVuaWMsIGNycyA9IDMxMTYpCmBgYApFc3RlIG1hcGEgZGViZSBzZXIgZWxhYm9yYWRvIGNvbiBsYSBmdW5jacOzbiBsd2dlbiwgcG9yIGVsbG8sIGVzIG5lY2VzYXJpbyBpbmF0YWFyYSB5IGhhY2VybGEgZnVuY2nDs25hci4gCgpgYGB7cn0KbGlicmFyeShsd2dlb20pCmBgYAoKTWVkaWFudGUgZWwgc2lndWllbnRlIGPDs2RpZ28sIHNlIG9idGllbmUgZWwgbWFwYSBkZXNlYWRvOgoKYGBge3J9CgpvcGFyIDwtIHBhcihtYXIgPSBjKDAsMCwxLjIsMCkpCgpwbG90KHN0X2dlb21ldHJ5KHJlcF9wYWxtYSksIGNvbCA9IE5BLCBib3JkZXIgPSAiYmxhY2siLCBiZyA9ICJ3aGl0ZSIpCgpzbW9vdGhMYXllcigKICB4ID0gcmVwX3BhbG1hLCAKICB2YXIgPSAnUHJvZHVjY2lvbicsCiAgdHlwZWZjdCA9ICJleHBvbmVudGlhbCIsCiAgc3BhbiA9IDI1MDAwLAogIGJldGEgPSAyLAogIG5jbGFzcyA9IDEwLAogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gJ2JsdWUucGFsJywgbjEgPSAxMCksCiAgYm9yZGVyID0gIndoaXRlIiwKICBsd2QgPSAwLjEsIAogIG1hc2sgPSByZXBfcGFsbWEsIAogIGxlZ2VuZC52YWx1ZXMucm5kID0gLTMsCiAgbGVnZW5kLnRpdGxlLnR4dCA9ICJQcm9kdWNjaW9uIiwKICBsZWdlbmQucG9zID0gInRvcHJpZ2h0IiwgCiAgYWRkPVRSVUUKKQoKdGV4dCh4ID0gNjUwMDAwLCB5ID0gMTIwMDAwMCwgY2V4ID0gMC42LCBhZGogPSAwLCBmb250ID0gMywgIGxhYmVscyA9IAogICAgICAgIkRpc3RhbmNlIGZ1bmN0aW9uOlxuLSB0eXBlID0gZXhwb25lbnRpYWxcbi0gYmV0YSA9IDJcbi0gc3BhbiA9IDIwIGttIikKCmxheW91dExheWVyKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGEgcHJvZHVjY2nDs24gZGUgUGFsbWEgZW4gQ2FzYW5hcmUgIiwKICAgICAgICAgICAgc291cmNlcyA9ICJTb3VyY2VzOiBEQU5FIGFuZCBNQURSLCAyMDE4IiwKICAgICAgICAgICAgYXV0aG9yID0gIkx1aXNhIENhcnJpw7NuIiwKICAgICAgICAgICAgZnJhbWUgPSBGQUxTRSwgbm9ydGggPSBGQUxTRSwgdGFidGl0bGUgPSBUUlVFLCB0aGVtZSA9ICJibGFjay5wYWwiKQoKbm9ydGgocG9zID0gInRvcGxlZnQiKQpgYGAKCkVuIGVsIGFudGVyaW9yIGdyYWZpY28gcG9kZW1vcyB2ZXIgcXVlIGxhIHByb2R1Y2Npw7NuIGRlIGxhIHBhbG1hIGRlIGFjZWl0ZSBzZSBjb25jZW50cmEgbWF5b3JtZW50ZSBlbiBsb3MgbXVuaWNpcGlvcyBjb2xvcmVhZG9zIGRlIHVuYSB0b25hbGlkYWQgb3NjdXJhIHkgcXVlIGLDoXNpY2FtZW50ZSBzZSB1YmljYW4gZW4gbGEgcGFydGUgaW5mZXJpb3IgZGVsIERlcGFydGFtZW50by4KQ29tbyBzZSBtZW5jaW9uw7MgZW4gZWwgY3VhZGVybm8gYW50ZXJpb3IsIGxhIHBhbG1hIGRlIGFjZWl0ZSBlcyB1bm8gZGUgbG9zIGN1bHRpdm9zIHJlcHJlc2VudGF0aXZvcyBkZSBsb3MgTGxhbm9zIE9yaWVudGFsZXMgcHVlc3RvIHF1ZSBsYXMgY29uZGljaW9uZXMgY2xpbcOhdGljYXMgeSBkZSBodW1lZGFkIGZhdm9yZWNlbiBzdSBtYW50ZW5pbWllbnRvLiBBZGVtw6FzLCBGZWRlcGFsbWEgaGFjZSB1bm9zIGHDsW9zIHJlYWxpesOzIHVuYSBpbnZlcnNpw7NuIGV4aXRvc2EgY29uIGVsIGZpbiBkZSBhbXBsaWFyIGxhcyB6b25hcyBkZSBjdWx0aXZvIGRlIHBhbG1hIGVuIGVsIGRlcGFydGFtZW50by4gCkVsIG1vbm9jdWx0aXZvIGRlIHBhbG1hIGRlIGFjZWl0ZSBoYSB0cmHDrWRvIHVuYSBhcHJldHVyYSBlY29uw7NtaWNhIHBhcmEgQ2FzYW5hcmUsIHNpbiBlbWJhcmdvLCBoYSBhZmVjdGFkbyBsYSBkaXZlcnNpZGFkIGRlIGVzcGVjaWVzIGVuIGVzcGVjaWFsLCBsYSByaXF1ZXphIGRlIGF2ZXMuIFZhcmlvcyBlc3R1ZGlvcyBleHBsaWNhbiBxdWUgbGEgZXhwYW5zacOzbiBkZSBsYSBwYWxtYSBnZW5lcmEgY2FtYmlvcyBkcsOhc3RpY29zIGVuIGxvcyBow6FiaXRhdHMgeSBtb2RpZmljYW4gbGEgdmVnZXRhY2nDs24uIEVzdGFzIHZhcmlhY2lvbmVzIGFmZWN0YW4gZWwgbW9kbyBkZSB2aWRhIGRlIGxhcyBlc3BlY2llcyBuYXRpdmFzIHkgbGEgcG9zaWJpbGlkYWQgZGUgc3VwZXJ2aXZlbmNpYSBkZSB1bmEgZXNwZWNpZSBzZSB2ZSByZWR1Y2lkYSAoTMOzcGV6IGV0LiBhbCwgMjAxNykuCgojIyA4LiBHdWFyZGFyIG1hcGFzClBhcmEgZ3VhcmRhciB1biBtYXBhIHNlIGVzY3JpYmUKYGBge3J9CnBuZygiLi9wYWxtYV8yMDE4LnBuZyIsIHdpZHRoID0gMjA0OCwgaGVpZ2h0ID0gMTUyNikKb3BhciA8LSBwYXIobWFyID0gYygwLDAsNSw1KSkKcGxvdChzdF9nZW9tZXRyeShyZXBfcGFsbWEpLCBjb2w9ImRhcmtzZWFncmVlbjMiLCBib3JkZXI9ImRhcmtzZWFncmVlbjQiLCBiZyA9ICJ3aGl0ZSIsIGx3ZCA9IDAuNikKcHJvcFN5bWJvbHNDaG9yb0xheWVyKHggPSByZXBfcGFsbWEsIHZhciA9ICJQcm9kdWNjaW9uIiwgdmFyMiA9ICJSZW5kaW1pZW50byIsCiAgICAgICAgICAgICAgICAgICAgICBjb2wgPSBjYXJ0by5wYWwocGFsMSA9ICJibHVlLnBhbCIsIG4xID0gMywgcGFsMiA9ICJvcmFuZ2UucGFsIiwgbjI9MyksCiAgICAgICAgICAgICAgICAgICAgICBpbmNoZXMgPSAxLCBtZXRob2QgPSAicTYiLAogICAgICAgICAgICAgICAgICAgICAgYm9yZGVyID0gImdyZXk1MCIsIGx3ZCA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUuY2V4ID0gMiwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YWx1ZXMuY2V4ID0gMiwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YXIucG9zID0gInJpZ2h0IiwgCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyMi5wb3MgPSAibGVmdCIsCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyMi52YWx1ZXMucm5kID0gMiwKICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YXIyLnRpdGxlLnR4dCA9ICJSZW5kaW1pZW50b1xuKFRvbi9IYSkiLAogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnZhci50aXRsZS50eHQgPSAiUHJvZHVjY2nDs24gZGUgUGFsbWEgZW4gMjAxOCIsCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyLnN0eWxlID0gImUiKQoKbGFiZWxMYXllcigKICB4ID0gcmVwX3BhbG1hLCAKICB0eHQgPSAiTVBJT19DTk1CUiIsIAogIGNvbD0gIndoaXRlIiwgCiAgY2V4ID0gMy4wLCAKICBmb250ID0gNCwKICBoYWxvID0gRkFMU0UsIAogIGJnID0gIndoaXRlIiwgCiAgciA9IDAuMSwgCiAgb3ZlcmxhcCA9IEZBTFNFLCAKICBzaG93LmxpbmVzID0gRkFMU0UKKQoKbGF5b3V0TGF5ZXIodGl0bGU9IlByb2R1Y2Npw7NuIHkgUmVuZGltaWVudG8gZGUgUGFsbWEgMjAxOCIsCiAgICAgICAgICAgIGF1dGhvciA9ICJMdWlzYSBGZXJuYW5kYSBDYXJyacOzbiBSYW3DrXJleiIsIAogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZXM6IE1BRFIgJiBEQU5FLCAyMDE4IiwgCiAgICAgICAgICAgIHNjYWxlID0gNTAsIHRhYnRpdGxlID0gRkFMU0UsIGZyYW1lID0gVFJVRSkKCm5vcnRoKHBvcyA9ICJ0b3BsZWZ0IikKCnRpdGxlKG1haW49IkN1bHRpdm8gZGUgUGFsbWEgZW4gQ2FzYW5hcmUsIDIwMTgiLCBjZXgubWFpbj0zLAogICAgICBzdWI9ICJGdWVudGVzOiBNQURSICYgREFORSwgMjAxOCIsIGNleC5zdWI9NCkKCmdyYXRpY3VsZSA9IFRSVUUKCnBhcihvcGFyKQoKZGV2Lm9mZigpCmBgYAoKIVtQcm9kdWNjacOzbiB5IFJlbmRpbWllbnRvXSguL3BhbG1hXzIwMTgucG5nKSAKCiMjIyAxMC4gUmVmZXJlbmNpYXMKCiBDb25zZWpvIE11bmljaXBhbCBkZSBUw6FtYXJhLiAoMjAxNikuIFBsYW4gZGUgZGVzYXJyb2xsbyAiVW4gbnVldm8gaG9yaXpvbnRlIHBhcmEgdG9kb3MuIDIwMTYtMjAxOSIuIFTDoW1hcmE6IGh0dHBzOi8vY2VvLnVuaWFuZGVzLmVkdS5jby9pbWFnZXMvRG9jdW1lbnRvcy9UJUMzJUExbWFyYV9QbGFuX2RlX0Rlc2Fycm9sbG9fMjAxNi0yMDE5LnBkZgoKIEVxdWlwbyBkZSBHb2JpZXJubyBkZSBNb250ZXJyZXkuICgyMDIwKS4gUGxhbiBUZXJyaXRvcmlhbCBkZSBTYWx1ZCAyMDIwLTIwMjMuIE1vbnRlcnJleTogaHR0cHM6Ly9jb25jZWpvbW9udGVycmV5Lm1pY29sb21iaWFkaWdpdGFsLmdvdi5jby9zaXRlcy9jb25jZWpvbW9udGVycmV5L2NvbnRlbnQvZmlsZXMvMDAwNDAyLzIwMDkwX3B0cy1tb250ZXJyZXktMjAyMC0tMjAyMy5wZGYKCiBMw7NwZXotQXLDqXZhbG8sIEguICYgUm9tZXJvIE4uICYgVGFtYXJpcy1UdXJpem8sIEEuICgyMDE3KS4gRWZlY3RvIGRlIGxhIGVzdHJ1Y3R1cmEgZGVsIGN1bHRpdm8gZGUgcGFsbWEgZGUgYWNlaXRlIEVsYWVpcyBndWluZWVuc2lzIChBcmVjYWNlYWUpIHNvYnJlIGxhIGRpdmVyc2lkYWQgZGUgYXZlcyBlbiB1biBwYWlzYWplIGRlIGxhIE9yaW5vcXXDrWEgY29sb21iaWFuYS4gQm9nb3TDoTogaHR0cHM6Ly93d3cuc2NpZWxvLnNhLmNyL3NjaWVsby5waHA/c2NyaXB0PXNjaV9hcnR0ZXh0JnBpZD1TMDAzNC03NzQ0MjAxNzAwMDQwMTU2OQogCiBPbGF5YSwgVi4uICgyMDE3KS4gU2lzdGVtYXMgZGUgSW5mb3JtYWNpw7NuIEdlb2dyw6FmaWNhLiBodHRwczovL3ZvbGF5YS5naXRodWIuaW8vbGlicm8tc2lnL2luZGV4Lmh0bWwKCgo=