1. Introducción

Este cuaderno ilustra cómo elaborar un mapa temático que muestre la participación municipal en la producción de un grupo importante de cultivos dentro de un departamento. Utilizaremos dos fuentes principales que hemos obtenido previamente: (i) un archivo CSV con la producción agrícola por municipio, tal como se obtuvo en la última clase; y (ii) un archivo GeoPackage que contiene los municipios de nuestro departamento. Además, incorporaremos un conjunto de datos adicional que incluye la red vial.

2. Configuración

Primero, Cargamos las librerias necesarias

# run the following line from the console:
#install.packages("tmap")
#install.packages("sf")
#install.packages(readr)
#install.pacjages (dplyr)
library(readr)
library(dplyr)
library(sf)

3.Lea los archivos relacionados con los municipios y los cultivos

Trabajaré con el departamento del Tolima. Dado que utilizas un equipo distinto y te interesa un departamento diferente, es posible que debas realizar algunos ajustes en las rutas de los archivos, los nombres de los archivos o los nombres de las variables.

Antes de comenzar, asegúrate de haber guardado los siguientes archivos en tu carpeta GB2/Proyecto6/data: un archivo GeoPackage con los municipios de tu departamento y un archivo CSV con las estadísticas EVA 2020 para un conjunto de cultivos.

Comencemos listando los archivos disponibles:

list.files("Datos")
[1] "EVA_Tolima.csv.csv"      "Mun_Tolima.gpkg"         "nroads.zip"             
[4] "Tolima_Frutales.csv.csv"

Ahora, procedemos a leer los archivos y a mostrar el objeto resultante

library(readr)
(frutales=read_csv("Datos/Tolima_Frutales.csv.csv",show_col_types = FALSE))

Ten en cuenta que COD_MUN es de tipo double. A continuación, leamos los municipios que nos interesan:

library(readr)
(municipios = st_read('Datos/Mun_Tolima.gpkg'))
Reading layer `municipios' from data source 
  `C:\Users\angie\OneDrive\Documentos\Geomatica Practica\GB02\PROYECTO8\Datos\Mun_Tolima.gpkg' 
  using driver `GPKG'
Simple feature collection with 46 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -76.1007 ymin: 2.9669 xmax: -74.5033 ymax: 5.2915
Geodetic CRS:  WGS 84
Simple feature collection with 46 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -76.1007 ymin: 2.9669 xmax: -74.5033 ymax: 5.2915
Geodetic CRS:  WGS 84
First 10 features:
   ID_0 ISO   NAME_0 ID_1 NAME_1 ID_2            NAME_2
1    53 COL Colombia   29 Tolima  966         Alpujarra
2    53 COL Colombia   29 Tolima  967          Alvarado
3    53 COL Colombia   29 Tolima  968          Ambalema
4    53 COL Colombia   29 Tolima  969        Anzoátegui
5    53 COL Colombia   29 Tolima  970            Armero
6    53 COL Colombia   29 Tolima  971             Ataco
7    53 COL Colombia   29 Tolima  972         Cajamarca
8    53 COL Colombia   29 Tolima  973 Carmen de Apicalá
9    53 COL Colombia   29 Tolima  974        Casabianca
10   53 COL Colombia   29 Tolima  975         Chaparral
      TYPE_2    ENGTYPE_2 NL_NAME_2 VARNAME_2
1  Municipio Municipality      <NA>      <NA>
2  Municipio Municipality      <NA>      <NA>
3  Municipio Municipality      <NA>      <NA>
4  Municipio Municipality      <NA>      <NA>
5  Municipio Municipality      <NA>      <NA>
6  Municipio Municipality      <NA>      <NA>
7  Municipio Municipality      <NA>      <NA>
8  Municipio Municipality      <NA>      <NA>
9  Municipio Municipality      <NA>      <NA>
10 Municipio Municipality      <NA>      <NA>
                             geom
1  MULTIPOLYGON (((-75.06009 3...
2  MULTIPOLYGON (((-74.899 4.6...
3  MULTIPOLYGON (((-74.8501 4....
4  MULTIPOLYGON (((-75.0961 4....
5  MULTIPOLYGON (((-74.7626 4....
6  MULTIPOLYGON (((-75.5969 3....
7  MULTIPOLYGON (((-75.6177 4....
8  MULTIPOLYGON (((-74.803 4.0...
9  MULTIPOLYGON (((-75.36208 4...
10 MULTIPOLYGON (((-75.2738 3....
stder.crs <- sf::st_crs(municipios)

4. Leer un conjunto de datos de las carreteras de Colombia

A continuación, realizaremos los siguientes pasos: - Descargar un geopackage de las carreteras de Colombia desde HDX - Descomprimir el archivo hotosm_col_roads_osm_gpkg.zip dentro de la carpeta «data» en tu directorio de trabajo - Leer el geopackage descomprimido utilizando la función sf::st_read - Filtrar las carreteras de Colombia para obtener las correspondientes a nuestro departamento.

list.files('Datos/nroads')
[1] "config.yaml"   "metadata.json" "README.txt"    "roads.gpkg"   
library(readr)
(sf.roads = st_read('Datos/nroads/roads.gpkg'))
Reading layer `roads' from data source 
  `C:\Users\angie\OneDrive\Documentos\Geomatica Practica\GB02\PROYECTO8\Datos\nroads\roads.gpkg' 
  using driver `GPKG'
Simple feature collection with 1238606 features and 24 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: -81.73539 ymin: -4.258755 xmax: -66.83066 ymax: 13.38636
Geodetic CRS:  WGS 84
Simple feature collection with 1238606 features and 24 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: -81.73539 ymin: -4.258755 xmax: -66.83066 ymax: 13.38636
Geodetic CRS:  WGS 84
First 10 features:
               id       name name_en name_es     highway surface smoothness width lanes oneway bridge
1   way/332900376       <NA>    <NA>    <NA>     service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
2   way/180388997 Carrera 17    <NA>    <NA> residential unpaved       <NA>  <NA>  <NA>   <NA>   <NA>
3   way/822292471       <NA>    <NA>    <NA>     service unpaved       <NA>     3  <NA>   <NA>   <NA>
4   way/835847133  Carrera 7    <NA>    <NA> residential unpaved       <NA>  <NA>  <NA>   <NA>   <NA>
5    way/76531894   Calle 24    <NA>    <NA> residential unpaved       <NA>  <NA>  <NA>    yes   <NA>
6   way/180781725       <NA>    <NA>    <NA>     footway    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
7   way/180380289 Carrera 18    <NA>    <NA> residential    <NA>       <NA>  <NA>  <NA>    yes   <NA>
8   way/574904069 Carrera 12    <NA>    <NA> residential asphalt       <NA>  <NA>  <NA>    yes   <NA>
9  way/1431563600       <NA>    <NA>    <NA>     service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
10  way/233980193       <NA>    <NA>    <NA>       track    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
   layer source adm0_pcode adm0_name adm1_pcode adm1_name adm2_pcode adm2_name adm3_pcode adm3_name
1   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81001    Arauca       <NA>      <NA>
2   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
3   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
4   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
5   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
6   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
7   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
8   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
9   <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81736  Saravena       <NA>      <NA>
10  <NA>   <NA>        COL  Colombia       CO81    Arauca    CO81065 Arauquita       <NA>      <NA>
   adm4_pcode adm4_name name_latin                           geom
1        <NA>      <NA>       <NA> LINESTRING (-71.09269 6.957...
2        <NA>      <NA> Carrera 17 LINESTRING (-71.87846 6.956...
3        <NA>      <NA>       <NA> LINESTRING (-71.83405 6.955...
4        <NA>      <NA>  Carrera 7 LINESTRING (-71.86707 6.955...
5        <NA>      <NA>   Calle 24 LINESTRING (-71.86982 6.957...
6        <NA>      <NA>       <NA> LINESTRING (-71.87532 6.956...
7        <NA>      <NA> Carrera 18 LINESTRING (-71.87999 6.956...
8        <NA>      <NA> Carrera 12 LINESTRING (-71.87189 6.955...
9        <NA>      <NA>       <NA> LINESTRING (-71.87497 6.956...
10       <NA>      <NA>       <NA> LINESTRING (-71.16664 6.963...

PREGUNTAS

Ten en cuenta que st.roads es una colección de entidades (feature collection) compuesta por líneas (linestrings). En tu cuaderno (notebook), responde a estas preguntas: -

#¿Cuáles son los tipos de geometría de las entidades?

El tipo de geometria principal es GEOMETRY Contiene elementos de tipo linea y punto indicados como way y node

#¿Cuántas entidades hay en la colección?

Hay 1.238.606 entidades (Features)

st_read('datos/nroads/roads.gpkg')
Reading layer `roads' from data source 
  `C:\Users\angie\OneDrive\Documentos\Geomatica Practica\GB02\PROYECTO8\Datos\nroads\roads.gpkg' using driver `GPKG'
Simple feature collection with 1238606 features and 24 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: -81.73539 ymin: -4.258755 xmax: -66.83066 ymax: 13.38636
Geodetic CRS:  WGS 84

Ahora, asegurémonos de que tanto las carreteras como los municipios tengan el mismo sistema de referencia de coordenadas (CRS):

nroads <- st_transform(sf.roads, crs= stder.crs)
nroads <- st_transform(sf.roads, crs = stder.crs)
head(nroads)
Simple feature collection with 6 features and 24 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -71.87922 ymin: 6.955888 xmax: -71.08969 ymax: 6.957709
Geodetic CRS:  WGS 84
             id       name name_en name_es     highway surface
1 way/332900376       <NA>    <NA>    <NA>     service    <NA>
2 way/180388997 Carrera 17    <NA>    <NA> residential unpaved
3 way/822292471       <NA>    <NA>    <NA>     service unpaved
4 way/835847133  Carrera 7    <NA>    <NA> residential unpaved
5  way/76531894   Calle 24    <NA>    <NA> residential unpaved
6 way/180781725       <NA>    <NA>    <NA>     footway    <NA>
  smoothness width lanes oneway bridge layer source adm0_pcode
1       <NA>  <NA>  <NA>   <NA>   <NA>  <NA>   <NA>        COL
2       <NA>  <NA>  <NA>   <NA>   <NA>  <NA>   <NA>        COL
3       <NA>     3  <NA>   <NA>   <NA>  <NA>   <NA>        COL
4       <NA>  <NA>  <NA>   <NA>   <NA>  <NA>   <NA>        COL
5       <NA>  <NA>  <NA>    yes   <NA>  <NA>   <NA>        COL
6       <NA>  <NA>  <NA>   <NA>   <NA>  <NA>   <NA>        COL
  adm0_name adm1_pcode adm1_name adm2_pcode adm2_name
1  Colombia       CO81    Arauca    CO81001    Arauca
2  Colombia       CO81    Arauca    CO81736  Saravena
3  Colombia       CO81    Arauca    CO81736  Saravena
4  Colombia       CO81    Arauca    CO81736  Saravena
5  Colombia       CO81    Arauca    CO81736  Saravena
6  Colombia       CO81    Arauca    CO81736  Saravena
  adm3_pcode adm3_name adm4_pcode adm4_name name_latin
1       <NA>      <NA>       <NA>      <NA>       <NA>
2       <NA>      <NA>       <NA>      <NA> Carrera 17
3       <NA>      <NA>       <NA>      <NA>       <NA>
4       <NA>      <NA>       <NA>      <NA>  Carrera 7
5       <NA>      <NA>       <NA>      <NA>   Calle 24
6       <NA>      <NA>       <NA>      <NA>       <NA>
                            geom
1 LINESTRING (-71.09269 6.957...
2 LINESTRING (-71.87846 6.956...
3 LINESTRING (-71.83405 6.955...
4 LINESTRING (-71.86707 6.955...
5 LINESTRING (-71.86982 6.957...
6 LINESTRING (-71.87532 6.956...

Ahora vamos a crear un filtro para seleccionar las carreteras de nuestro departamento

(stder.roads.tmp = dplyr::filter(nroads, adm1_pcode=="CO73"))
Simple feature collection with 40858 features and 24 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: -76.0521 ymin: 2.992607 xmax: -74.47657 ymax: 5.320654
Geodetic CRS:  WGS 84
First 10 features:
               id                 name name_en name_es
1  way/1047823472                 <NA>    <NA>    <NA>
2  way/1013194198                 <NA>    <NA>    <NA>
3   way/587756852                 <NA>    <NA>    <NA>
4  way/1047823471                 <NA>    <NA>    <NA>
5  way/1013194210                 <NA>    <NA>    <NA>
6   way/203142620 Vía Ibagué-Gualanday    <NA>    <NA>
7   way/588179600                 <NA>    <NA>    <NA>
8   way/660053110                 <NA>    <NA>    <NA>
9    way/74060015                 <NA>    <NA>    <NA>
10 way/1013194209                 <NA>    <NA>    <NA>
        highway surface smoothness width lanes oneway bridge
1       service    <NA>       <NA>  <NA>  <NA>    yes   <NA>
2       service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
3       footway    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
4       service    <NA>       <NA>  <NA>  <NA>    yes   <NA>
5       service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
6         trunk asphalt       <NA>  <NA>     2    yes   <NA>
7       footway    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
8       service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
9  unclassified    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
10      service    <NA>       <NA>  <NA>  <NA>   <NA>   <NA>
   layer source adm0_pcode adm0_name adm1_pcode adm1_name
1   <NA>   <NA>        COL  Colombia       CO73    Tolima
2   <NA>   <NA>        COL  Colombia       CO73    Tolima
3   <NA>   <NA>        COL  Colombia       CO73    Tolima
4   <NA>   <NA>        COL  Colombia       CO73    Tolima
5   <NA>   <NA>        COL  Colombia       CO73    Tolima
6   <NA>   <NA>        COL  Colombia       CO73    Tolima
7   <NA>   <NA>        COL  Colombia       CO73    Tolima
8   <NA>   <NA>        COL  Colombia       CO73    Tolima
9   <NA>   <NA>        COL  Colombia       CO73    Tolima
10  <NA>   <NA>        COL  Colombia       CO73    Tolima
   adm2_pcode adm2_name adm3_pcode adm3_name adm4_pcode
1     CO73001    Ibagué       <NA>      <NA>       <NA>
2     CO73001    Ibagué       <NA>      <NA>       <NA>
3     CO73624    Rovira       <NA>      <NA>       <NA>
4     CO73001    Ibagué       <NA>      <NA>       <NA>
5     CO73001    Ibagué       <NA>      <NA>       <NA>
6     CO73001    Ibagué       <NA>      <NA>       <NA>
7     CO73624    Rovira       <NA>      <NA>       <NA>
8     CO73001    Ibagué       <NA>      <NA>       <NA>
9     CO73001    Ibagué       <NA>      <NA>       <NA>
10    CO73001    Ibagué       <NA>      <NA>       <NA>
   adm4_name           name_latin
1       <NA>                 <NA>
2       <NA>                 <NA>
3       <NA>                 <NA>
4       <NA>                 <NA>
5       <NA>                 <NA>
6       <NA> Via Ibague-Gualanday
7       <NA>                 <NA>
8       <NA>                 <NA>
9       <NA>                 <NA>
10      <NA>                 <NA>
                             geom
1  LINESTRING (-75.10139 4.315...
2  LINESTRING (-75.10173 4.314...
3  LINESTRING (-75.28695 4.311...
4  LINESTRING (-75.10173 4.314...
5  LINESTRING (-75.10169 4.314...
6  LINESTRING (-75.0703 4.3218...
7  LINESTRING (-75.28603 4.311...
8  LINESTRING (-75.06461 4.313...
9  LINESTRING (-75.20785 4.311...
10 LINESTRING (-75.10202 4.313...

Ahora las columnas relevantes

stder.roads.tmp %>% select('id', 'name', 'highway',  'adm2_pcode', 'adm2_name') -> stder.roads

¿Que tenemos?

stder.roads
Simple feature collection with 40858 features and 5 fields
Geometry type: GEOMETRY
Dimension:     XY
Bounding box:  xmin: -76.0521 ymin: 2.992607 xmax: -74.47657 ymax: 5.320654
Geodetic CRS:  WGS 84
First 10 features:
               id                 name      highway adm2_pcode
1  way/1047823472                 <NA>      service    CO73001
2  way/1013194198                 <NA>      service    CO73001
3   way/587756852                 <NA>      footway    CO73624
4  way/1047823471                 <NA>      service    CO73001
5  way/1013194210                 <NA>      service    CO73001
6   way/203142620 Vía Ibagué-Gualanday        trunk    CO73001
7   way/588179600                 <NA>      footway    CO73624
8   way/660053110                 <NA>      service    CO73001
9    way/74060015                 <NA> unclassified    CO73001
10 way/1013194209                 <NA>      service    CO73001
   adm2_name                           geom
1     Ibagué LINESTRING (-75.10139 4.315...
2     Ibagué LINESTRING (-75.10173 4.314...
3     Rovira LINESTRING (-75.28695 4.311...
4     Ibagué LINESTRING (-75.10173 4.314...
5     Ibagué LINESTRING (-75.10169 4.314...
6     Ibagué LINESTRING (-75.0703 4.3218...
7     Rovira LINESTRING (-75.28603 4.311...
8     Ibagué LINESTRING (-75.06461 4.313...
9     Ibagué LINESTRING (-75.20785 4.311...
10    Ibagué LINESTRING (-75.10202 4.313...

5. Incorporación de los datos de producción a los municipios

Comencemos añadiendo a frutales un nuevo atributo, COD_MUN, cuyo tipo de dato se convierte de numérico (double) a carácter

Ahora, unamos los datos de producción a nuestros municipios:

6. Crear un mapa tematico de la producción agrícola

A continuación, debemos definir las capas del mapa y los componentes de la leyenda. Utilizaremos la técnica de cuantiles y una paleta de colores naranja-verde.

library(tmap)
tmap_mode("view")
frutales_map2 <- tm_shape(munic_frutales2) +
  tm_polygons(
    fill = "Produccion",
    fill.scale = tm_scale_continuous(), # Cambiamos a escala continua para evitar el error de rango único
    fill.legend = tm_legend(title = "Producción (t)"),
    popup = tm_popup(vars = c("Municipio" = "NAME_2", "Producción (t)" = "Produccion"))
  ) + 
  tm_text(
    text = "NAME_2", 
    size = 0.55, 
    col = "#222222"
  ) +
  tm_credits("Fuente: UPRA (2022)", fontface = "bold") +
  tm_title("Producción de frutales en Tolima", fontface = "bold.italic")

tmap_leaflet(frutales_map2)
LS0tDQp0aXRsZTogIk1hcGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIg0KQXV0aG9yOiAiRGFuaWVsYSBQdWVydG8iDQpEYXRlOiAiMDQuMTEuMjAyNiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgMS4gSW50cm9kdWNjacOzbg0KDQpFc3RlIGN1YWRlcm5vIGlsdXN0cmEgY8OzbW8gZWxhYm9yYXIgdW4gbWFwYSB0ZW3DoXRpY28gcXVlIG11ZXN0cmUgbGEgcGFydGljaXBhY2nDs24gbXVuaWNpcGFsIGVuIGxhIHByb2R1Y2Npw7NuIGRlIHVuIGdydXBvIGltcG9ydGFudGUgZGUgY3VsdGl2b3MgZGVudHJvIGRlIHVuIGRlcGFydGFtZW50by4gVXRpbGl6YXJlbW9zIGRvcyBmdWVudGVzIHByaW5jaXBhbGVzIHF1ZSBoZW1vcyBvYnRlbmlkbyBwcmV2aWFtZW50ZTogKGkpIHVuIGFyY2hpdm8gQ1NWIGNvbiBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgcG9yIG11bmljaXBpbywgdGFsIGNvbW8gc2Ugb2J0dXZvIGVuIGxhIMO6bHRpbWEgY2xhc2U7IHkgKGlpKSB1biBhcmNoaXZvIEdlb1BhY2thZ2UgcXVlIGNvbnRpZW5lIGxvcyBtdW5pY2lwaW9zIGRlIG51ZXN0cm8gZGVwYXJ0YW1lbnRvLiBBZGVtw6FzLCBpbmNvcnBvcmFyZW1vcyB1biBjb25qdW50byBkZSBkYXRvcyBhZGljaW9uYWwgcXVlIGluY2x1eWUgbGEgcmVkIHZpYWwuDQoNCiMgMi4gQ29uZmlndXJhY2nDs24NCg0KUHJpbWVybywgQ2FyZ2Ftb3MgbGFzIGxpYnJlcmlhcyBuZWNlc2FyaWFzDQoNCmBgYHtyfQ0KIyBydW4gdGhlIGZvbGxvd2luZyBsaW5lIGZyb20gdGhlIGNvbnNvbGU6DQojaW5zdGFsbC5wYWNrYWdlcygidG1hcCIpDQojaW5zdGFsbC5wYWNrYWdlcygic2YiKQ0KI2luc3RhbGwucGFja2FnZXMocmVhZHIpDQojaW5zdGFsbC5wYWNqYWdlcyAoZHBseXIpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHNmKQ0KYGBgDQoNCg0KDQojIDMuTGVhIGxvcyBhcmNoaXZvcyByZWxhY2lvbmFkb3MgY29uIGxvcyBtdW5pY2lwaW9zIHkgbG9zIGN1bHRpdm9zDQoNClRyYWJhamFyw6kgY29uIGVsIGRlcGFydGFtZW50byBkZWwgVG9saW1hLiBEYWRvIHF1ZSB1dGlsaXphcyB1biBlcXVpcG8gZGlzdGludG8geSB0ZSBpbnRlcmVzYSB1biBkZXBhcnRhbWVudG8gZGlmZXJlbnRlLCBlcyBwb3NpYmxlIHF1ZSBkZWJhcyByZWFsaXphciBhbGd1bm9zIGFqdXN0ZXMgZW4gbGFzIHJ1dGFzIGRlIGxvcyBhcmNoaXZvcywgbG9zIG5vbWJyZXMgZGUgbG9zIGFyY2hpdm9zIG8gbG9zIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcy4NCg0KQW50ZXMgZGUgY29tZW56YXIsIGFzZWfDunJhdGUgZGUgaGFiZXIgZ3VhcmRhZG8gbG9zIHNpZ3VpZW50ZXMgYXJjaGl2b3MgZW4gdHUgY2FycGV0YSBHQjIvUHJveWVjdG82L2RhdGE6IHVuIGFyY2hpdm8gR2VvUGFja2FnZSBjb24gbG9zIG11bmljaXBpb3MgZGUgdHUgZGVwYXJ0YW1lbnRvIHkgdW4gYXJjaGl2byBDU1YgY29uIGxhcyBlc3RhZMOtc3RpY2FzIEVWQSAyMDIwIHBhcmEgdW4gY29uanVudG8gZGUgY3VsdGl2b3MuDQoNCkNvbWVuY2Vtb3MgbGlzdGFuZG8gbG9zIGFyY2hpdm9zIGRpc3BvbmlibGVzOg0KDQpgYGB7cn0NCmxpc3QuZmlsZXMoIkRhdG9zIikNCg0KYGBgDQoNCkFob3JhLCBwcm9jZWRlbW9zIGEgbGVlciBsb3MgYXJjaGl2b3MgeSBhIG1vc3RyYXIgZWwgb2JqZXRvIHJlc3VsdGFudGUNCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KKGZydXRhbGVzPXJlYWRfY3N2KCJEYXRvcy9Ub2xpbWFfRnJ1dGFsZXMuY3N2LmNzdiIsc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkpDQpgYGANCg0KVGVuIGVuIGN1ZW50YSBxdWUgQ09EX01VTiBlcyBkZSB0aXBvIGRvdWJsZS4gQSBjb250aW51YWNpw7NuLCBsZWFtb3MgbG9zIG11bmljaXBpb3MgcXVlIG5vcyBpbnRlcmVzYW46DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCihtdW5pY2lwaW9zID0gc3RfcmVhZCgnRGF0b3MvTXVuX1RvbGltYS5ncGtnJykpDQpzdGRlci5jcnMgPC0gc2Y6OnN0X2NycyhtdW5pY2lwaW9zKQ0KYGBgDQoNCiMgNC4gTGVlciB1biBjb25qdW50byBkZSBkYXRvcyBkZSBsYXMgY2FycmV0ZXJhcyBkZSBDb2xvbWJpYQ0KDQpBIGNvbnRpbnVhY2nDs24sIHJlYWxpemFyZW1vcyBsb3Mgc2lndWllbnRlcyBwYXNvczogLSBEZXNjYXJnYXIgdW4gZ2VvcGFja2FnZSBkZSBsYXMgY2FycmV0ZXJhcyBkZSBDb2xvbWJpYSBkZXNkZSBIRFggLSBEZXNjb21wcmltaXIgZWwgYXJjaGl2byBob3Rvc21fY29sX3JvYWRzX29zbV9ncGtnLnppcCBkZW50cm8gZGUgbGEgY2FycGV0YSDCq2RhdGHCuyBlbiB0dSBkaXJlY3RvcmlvIGRlIHRyYWJham8gLSBMZWVyIGVsIGdlb3BhY2thZ2UgZGVzY29tcHJpbWlkbyB1dGlsaXphbmRvIGxhIGZ1bmNpw7NuIGBzZjo6c3RfcmVhZGAgLSBGaWx0cmFyIGxhcyBjYXJyZXRlcmFzIGRlIENvbG9tYmlhIHBhcmEgb2J0ZW5lciBsYXMgY29ycmVzcG9uZGllbnRlcyBhIG51ZXN0cm8gZGVwYXJ0YW1lbnRvLg0KDQpgYGB7cn0NCmxpc3QuZmlsZXMoJ0RhdG9zL25yb2FkcycpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCihzZi5yb2FkcyA9IHN0X3JlYWQoJ0RhdG9zL25yb2Fkcy9yb2Fkcy5ncGtnJykpDQpgYGANCiMgUFJFR1VOVEFTDQpUZW4gZW4gY3VlbnRhIHF1ZSBgc3Qucm9hZHNgIGVzIHVuYSBjb2xlY2Npw7NuIGRlIGVudGlkYWRlcyAoZmVhdHVyZSBjb2xsZWN0aW9uKSBjb21wdWVzdGEgcG9yIGzDrW5lYXMgKGxpbmVzdHJpbmdzKS4gRW4gdHUgY3VhZGVybm8gKG5vdGVib29rKSwgcmVzcG9uZGUgYSBlc3RhcyBwcmVndW50YXM6IC0gDQoNCiPCv0N1w6FsZXMgc29uIGxvcyB0aXBvcyBkZSBnZW9tZXRyw61hIGRlIGxhcyBlbnRpZGFkZXM/DQogDQogRWwgdGlwbyBkZSBnZW9tZXRyaWEgcHJpbmNpcGFsIGVzICpHRU9NRVRSWSogQ29udGllbmUgZWxlbWVudG9zIGRlIHRpcG8gbGluZWEgeSBwdW50byBpbmRpY2Fkb3MgY29tbyAqd2F5KiB5ICpub2RlKg0KDQojwr9DdcOhbnRhcyBlbnRpZGFkZXMgaGF5IGVuIGxhIGNvbGVjY2nDs24/DQoNCkhheSAxLjIzOC42MDYgZW50aWRhZGVzIChGZWF0dXJlcykNCg0KDQpgYGB7cn0NCnN0X3JlYWQoJ2RhdG9zL25yb2Fkcy9yb2Fkcy5ncGtnJykNCmBgYA0KQWhvcmEsIGFzZWd1csOpbW9ub3MgZGUgcXVlIHRhbnRvIGxhcyBjYXJyZXRlcmFzIGNvbW8gbG9zIG11bmljaXBpb3MgdGVuZ2FuIGVsIG1pc21vIHNpc3RlbWEgZGUgcmVmZXJlbmNpYSBkZSBjb29yZGVuYWRhcyAoQ1JTKToNCg0KYGBge3J9DQpucm9hZHMgPC0gc3RfdHJhbnNmb3JtKHNmLnJvYWRzLCBjcnMgPSBzdGRlci5jcnMpDQpgYGANCg0KYGBge3J9DQpoZWFkKG5yb2FkcykNCmBgYA0KQWhvcmEgdmFtb3MgYSBjcmVhciB1biBmaWx0cm8gcGFyYSBzZWxlY2Npb25hciBsYXMgY2FycmV0ZXJhcyBkZSBudWVzdHJvIGRlcGFydGFtZW50bw0KDQpgYGB7cn0NCihzdGRlci5yb2Fkcy50bXAgPSBkcGx5cjo6ZmlsdGVyKG5yb2FkcywgYWRtMV9wY29kZT09IkNPNzMiKSkNCmBgYA0KQWhvcmEgbGFzIGNvbHVtbmFzIHJlbGV2YW50ZXMNCg0KYGBge3J9DQpzdGRlci5yb2Fkcy50bXAgJT4lIHNlbGVjdCgnaWQnLCAnbmFtZScsICdoaWdod2F5JywgICdhZG0yX3Bjb2RlJywgJ2FkbTJfbmFtZScpIC0+IHN0ZGVyLnJvYWRzDQpgYGANCg0Kwr9RdWUgIHRlbmVtb3M/DQoNCmBgYHtyfQ0Kc3RkZXIucm9hZHMNCmBgYA0KIyA1LiBJbmNvcnBvcmFjacOzbiBkZSBsb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gYSBsb3MgbXVuaWNpcGlvcw0KDQpDb21lbmNlbW9zIGHDsWFkaWVuZG8gYSBgZnJ1dGFsZXNgIHVuIG51ZXZvIGF0cmlidXRvLCBgQ09EX01VTmAsIGN1eW8gdGlwbyBkZSBkYXRvIHNlIGNvbnZpZXJ0ZSBkZSBudW3DqXJpY28gKGRvdWJsZSkgYSBjYXLDoWN0ZXINCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KDQpmcnV0YWxlcyRtcGlvX2NkcG1wIDwtIGFzLmNoYXJhY3RlcihmcnV0YWxlcyRgQ8OTRC4gTVVOLmApDQpgYGANCg0KQWhvcmEsIHVuYW1vcyBsb3MgZGF0b3MgZGUgcHJvZHVjY2nDs24gYSBudWVzdHJvcyBtdW5pY2lwaW9zOg0KYGBge3J9DQoobXVuaWNfZnJ1dGFsZXMgPSBsZWZ0X2pvaW4obXVuaWNpcGlvcywgZnJ1dGFsZXMsIGJ5ID0gYygiSURfMiIgPSAibXBpb19jZHBtcCIpKSkNCmBgYA0KDQoNCg0KYGBge3J9DQoobXVuaWNfZnJ1dGFsZXMgPSBsZWZ0X2pvaW4obXVuaWNpcGlvcywgZnJ1dGFsZXMsIGJ5ID0gYygiTkFNRV8yIiA9ICJNVU5JQ0lQSU8iKSkpDQpgYGANCg0KDQoNCg0KDQoNCg0KDQojIDYuIENyZWFyIHVuIG1hcGEgdGVtYXRpY28gZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhDQoNCg0KQSBjb250aW51YWNpw7NuLCBkZWJlbW9zIGRlZmluaXIgbGFzIGNhcGFzIGRlbCBtYXBhIHkgbG9zIGNvbXBvbmVudGVzIGRlIGxhIGxleWVuZGEuIFV0aWxpemFyZW1vcyBsYSB0w6ljbmljYSBkZSBjdWFudGlsZXMgeSB1bmEgcGFsZXRhIGRlIGNvbG9yZXMgbmFyYW5qYS12ZXJkZS4NCg0KYGBge3J9DQpsaWJyYXJ5KHRtYXApDQp0bWFwX21vZGUoInZpZXciKQ0KZnJ1dGFsZXNfbWFwMiA8LSB0bV9zaGFwZShtdW5pY19mcnV0YWxlczIpICsNCiAgdG1fcG9seWdvbnMoDQogICAgZmlsbCA9ICJQcm9kdWNjaW9uIiwNCiAgICBmaWxsLnNjYWxlID0gdG1fc2NhbGVfY29udGludW91cygpLCAjIENhbWJpYW1vcyBhIGVzY2FsYSBjb250aW51YSBwYXJhIGV2aXRhciBlbCBlcnJvciBkZSByYW5nbyDDum5pY28NCiAgICBmaWxsLmxlZ2VuZCA9IHRtX2xlZ2VuZCh0aXRsZSA9ICJQcm9kdWNjacOzbiAodCkiKSwNCiAgICBwb3B1cCA9IHRtX3BvcHVwKHZhcnMgPSBjKCJNdW5pY2lwaW8iID0gIk5BTUVfMiIsICJQcm9kdWNjacOzbiAodCkiID0gIlByb2R1Y2Npb24iKSkNCiAgKSArIA0KICB0bV90ZXh0KA0KICAgIHRleHQgPSAiTkFNRV8yIiwgDQogICAgc2l6ZSA9IDAuNTUsIA0KICAgIGNvbCA9ICIjMjIyMjIyIg0KICApICsNCiAgdG1fY3JlZGl0cygiRnVlbnRlOiBVUFJBICgyMDIyKSIsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIHRtX3RpdGxlKCJQcm9kdWNjacOzbiBkZSBmcnV0YWxlcyBlbiBUb2xpbWEiLCBmb250ZmFjZSA9ICJib2xkLml0YWxpYyIpDQoNCnRtYXBfbGVhZmxldChmcnV0YWxlc19tYXAyKQ0KDQpgYGANCg0KDQoNCg0KDQo=