This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

1. Introducción

1.1. Introducción a R

R es un lenguaje de programación y un entorno de software libre utilizado principalmente para análisis estadístico y gráficos. Nació como una implementación del lenguaje S, desarrollado en los laboratorios Bell. A lo largo del tiempo, R ha evolucionado para convertirse en una herramienta indispensable para la ciencia de datos, la bioinformática, la investigación académica y más.

1.2. Introducción a RStudio

RStudio es un entorno de desarrollo integrado (IDE) para R. Proporciona una consola, un editor de scripts que soporta la ejecución directa de código, así como herramientas para la visualización de datos y la gestión del espacio de trabajo. RStudio ha facilitado el uso de R al ofrecer una interfaz más amigable y herramientas útiles para el análisis. ### 1.2.1. Interfaz de RStudio

Interfaz RStudio. En la consola se ejecuta el código R en tiempo real. Los usuarios pueden ingresar comandos directamente y ver los resultados al instante.

Editor de scripts: El editor de código permite escribir y editar scripts en R. Resalta la sintaxis del código. Proporciona sugerencias de código y autocompletado. Tiene botones para ejecutar líneas o bloques de código específicos. Es justo donde estoy escribiendo este script.

Environment: El Entorno o Environment muestra los objetos (vectores, matrices, data frames, etc.) que están en el entorno global. Ofrece la opción de importar conjuntos de datos. El “entorno global” se refiere al espacio de trabajo de nivel superior donde las variables, funciones y otros objetos que creas se almacenan de manera predeterminada durante una sesión interactiva. Es el lugar donde se guardan y se pueden acceder a las variables que defines y a los datos que cargas, a menos que se especifique o utilic un entorno diferente.

Historial: Muestra un registro de los comandos previamente ejecutados en la consola.

Archivos: Proporciona una vista del sistema de archivos, lo que permite navegar, abrir, y gestionar archivos y directorios.

Plots: Muestra gráficos generados por el código R. Permite navegar entre varios gráficos y exportarlos en diversos formatos.

Paquetes: Enumera todos los paquetes R instalados. Permite instalar, actualizar o cargar/descargar paquetes con facilidad.

Ayuda: Proporciona acceso a la documentación de funciones y paquetes de R. Permite buscar y consultar la documentación de funciones específicas.

Visor: Se utiliza para visualizar contenidos web, como mapas interactivos o documentos R Markdown renderizados.

1.3. Proyectos y Archivos, Notebooks y Documentos R Markdown

En RStudio se pueden crear archivos o proyectos. La diferencia entre un archivo y un proyecto es importante y tiene que ver con la organización, gestión y reproducibilidad de tu trabajo.

1.3.1. Archivos

-Un archivo en R suele tener una extensión .R o .Rmd (para R Markdown). Contiene código R, comentarios y, en el caso de R Markdown, también puede contener texto enriquecido, ecuaciones, etc. -Se utiliza para escribir, guardar y ejecutar código R.

-Un archivo es una entidad independiente. Puede moverse, compartirse o ejecutarse sin necesidad de otros archivos, a menos que explícitamente dependa de otros (por ejemplo, si carga datos de otro archivo).

Con RStudio se pueden crear diferentes tipos de archivos. Vamos a mencionar 3 que son muy comunes.

1.3.1.1. Script de R (*.R)

Archivos de código que contienen secuencias de comandos y funciones en R.

1.3.1.2. R Markdown (*.Rmd)

Documentos que integran código R con texto narrativo, permitiendo la creación de informes, presentaciones y otros documentos que pueden ser renderizados en diversos formatos como HTML, PDF y Word.Si bien los notebooks generalmente se visualizan mejor como documentos HTML, con R Markdown puedes fácilmente renderizar a múltiples formatos, incluidos PDF, Word o presentaciones. Flujo de Trabajo Lineal: En un documento R Markdown tradicional, normalmente trabaja en el código y el contenido, y luego renderiza todo el documento de una vez para ver los resultados. Esto es útil cuando ya tiene un análisis establecido que desea ejecutar de principio a fin. Se usan si se requiere generar informes que documenten el código.

1.3.1.3.R Notebook (formato .Rmd)

Una variante de R Markdown donde puede ejecutar y ver resultados en línea. Permiten ejecutar bloques de código individualmente e inmediatamente ver los resultados debajo de ese bloque, similar a cómo funcionan los Jupyter Notebooks en Python. Es útil para un análisis exploratorio donde desea iterar rápidamente y ver los resultados al instante. Es decir que puede ver el código, los resultados y el texto en un formato casi final mientras trabaja, por lo que resulta útil para construir y refinar análisis y documentarlos simultáneamente ¡Esto es un notebook!

Ambas opciones, Notebook y R Markdown, tienen sus fortalezas y son adecuadas para diferentes escenarios. Si está en una fase exploratoria, iterativa y deseas ver resultados al instante, un notebook puede ser la mejor opción. Si está trabajando en un informe, artículo o análisis más estructurado y formal que requiere un flujo deAmbas opciones, Notebook y R Markdown, tienen sus fortalezas y son adecuadas para diferentes escenarios. Si está en una fase exploratoria, iterativa y desea ver resultados al instante, un notebook puede ser la mejor opción. Si está trabajando en un informe, artículo o análisis más estructurado y formal que requiere un flujo de trabajo más lineal y opcidcones de salida diversificadas, un documento R Markdown podría ser más adecuado. En cualquier caso, recuerde que puedes cambiar entre las experiencias de Notebook y Documento en RStudio con facilidad, por lo que no está estrictamente limitado a una elección u otra.

1.3.2. Proyectos

-Un proyecto en RStudio no es solo un archivo, sino un entorno de trabajo completo. Cuando crea un proyecto, RStudio genera un archivo con extensión .Rproj que guarda las configuraciones y el estado del proyecto.

-Los proyectos se utilizan para organizar conjuntos relacionados de archivos y datos. Facilitan la gestión de directorios de trabajo, rutas relativas y otras configuraciones específicas del proyecto.

-Entorno de trabajo: Cuando abre un proyecto, RStudio automáticamente configura el directorio de trabajo en la ubicación del proyecto. Esto es útil para garantizar que el código sea reproducible, ya que puede usar rutas relativas en lugar de rutas absolutas.

-Los proyectos de RStudio se integran bien con sistemas de control de versiones como Git, facilitando la gestión de versiones y colaboración.

-Al trabajar en un proyecto más grande, es posible que tengas múltiples scripts, conjuntos de datos y otros archivos relacionados. Los proyectos te ayudan a mantener todo organizado en un solo lugar.

-Un proyecto puede tener configuraciones específicas, como opciones de codificación, que no afectan a otros proyectos o scripts fuera del proyecto.

En resumen, mientras que un archivo en R es simplemente un documento que contiene código R, un proyecto en RStudio es un entorno de trabajo organizativo que facilita la gestión y reproducibilidad de trabajos más complejos y multifacéticos. Es especialmente útil cuando está trabajando en análisis más grandes o colaborativos.

2. Primeros pasos en R

2.1.Librerías

En R, las funcionalidades se amplían mediante paquetes o librerías. Algunos paquetes notables para el manejo de datos espaciales incluyen:

  • sf: Este paquete permite el manejo y análisis de datos espaciales simples. Ha ganado popularidad por su simplicidad y eficiencia.
  • sp: Una de las primeras librerías para datos espaciales en R. Aunque ha sido en parte superada por sf, sigue siendo ampliamente utilizada.
  • raster: Para el manejo y análisis de datos raster.
  • rgdal: Proporciona herramientas a la biblioteca GDAL para la conversión de formatos espaciales. Así que el primer paso consiste en instalar unas librerías básicas que nos proveen funciones para realizar análisis posteriormente. Esto lo tiene que lelvar a cabo solamente una vez. Observará que cuando trabajamos en un notebook, el código que se puede ejecutar se escribe así ** {r} código**. Puede ejecutarlo haciendo click sobre el símbolo de play.
install.packages("sf", "raster", "rgdal","dplyr")
Error in install.packages : Updating loaded packages

Ojo, solo puede ejecutar los códigos desde el editor de código de RStudio, no desde la visualización (renderización) en html.

Así se ve un bloque de código en el editor de código de Rstudio
¿A propósito, ya sabe cómo agregar una imagen a su notebook?. ¿Ya identificó cómo agregar color al texto que use para documentar su código?.
Ahora cargaremos las librerías. No es suficiente instalarlas, tenemos que decir explícitamente que vamos a traerlas a nuestro código.

El paquete sf (simple features) ofrece una amplia variedad de funcionalidades para trabajar con datos espaciales tipo vector como representación de datos espaciales, leere y escribir en variedad de formatos (ej. shp, GeoJSON, KML, entre otros), integración con librerías como GDAL que permite gestionar datos geoespaciale; manipular geometrías para calcular área, longitudes, etc; realizar operaciones topológicas, manipulación de sistemas de coordenadas; integración con otros paquetes de R; realizar operaciones de geoprocesamiento como buffer, clip, entre otras; así como manipulación de atributos (agregar, eliminar, modificar.

Representación de Datos Espaciales:

library(sf)
Linking to GEOS 3.11.2, GDAL 3.6.2, PROJ 9.2.0; sf_use_s2() is TRUE
library(rgdal)
Loading required package: sp
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

2.2. Variables

En programación, a menudo se requiere almacenar información para usarla más adelante. Aquí es donde entran las variables. Una variable puede ser imaginada como una caja en la que se guarda alguna información. Esta “caja” tiene un nombre, y siempre que quiera acceder a la información, simplemente usa el nombre de la variable. En R, se usa el símbolo <- para asignar un valor a una variable. Lo primero que vamos a hacer es instalar las librerías o paquetes con los que podremos realizar las operaciones y análisis.
La variable shp_ruta almacenará la ruta al archivo shp

shp_ruta <- "./datos/SHP_MGN2018_INTGRD_MPIO/MGN_ANM_MPIOS.shp"

Notará que en la medida en que se crean variables, estás empiezan a aparecer en el panel Global Environment.

2.3. Leyendo datos espaciales y visualizando sus propiedades

La siguiente línea usa funcionalidades de la librería sf para leer el shapefile disponible en la ruta shp_ruta como un archivo espacial y lo almacena en la variable vector_municipios.

vector_municipios <- st_read(shp_ruta)
Reading layer `MGN_ANM_MPIOS' from data source 
  `C:\Users\LILIANA\OneDrive - Universidad Nacional de Colombia\Cursos_2023_2\Geomatica_basica\introduccion_R\datos\SHP_MGN2018_INTGRD_MPIO\MGN_ANM_MPIOS.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS

La línea siguiente simplemente imprime la información de la variable vector_municipios en la consola. Como es un objeto espacial mostrará un resumen de ese objeto, así como todos los atributos y registros. ¿Qué información puede identificar ?.

vector_municipios
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS
First 5 features:
  DPTO_CCDGO MPIO_CCDGO             MPIO_CNMBR MPIO_CDPMP VERSION       AREA  LATITUD
1         18        001              FLORENCIA      18001    2018 2547637532 1.749139
2         18        029                ALBANIA      18029    2018  414122070 1.227865
3         18        094 BELÉN DE LOS ANDAQUÍES      18094    2018 1191618572 1.500923
4         18        247            EL DONCELLO      18247    2018 1106076151 1.791386
5         18        256              EL PAUJÍL      18256    2018 1234734145 1.617746
   LONGITUD STCTNENCUE STP3_1_SI STP3_2_NO STP3A_RI STP3B_TCN STP4_1_SI STP4_2_NO
1 -75.55824      71877        32     71845       32         0         0     71877
2 -75.88233       2825        24      2801       24         0         0      2825
3 -75.87565       4243        54      4189       54         0         1      4242
4 -75.19394       8809         0      8809        0         0         0      8809
5 -75.23404       5795         0      5795        0         0         0      5795
  STP9_1_USO STP9_2_USO STP9_3_USO STP9_4_USO STP9_2_1_M STP9_2_2_M STP9_2_3_M
1      61176       2178       8436         87         39       1550        566
2       1826         49        948          2          3         34         12
3       3223        109        900         11          4         99          6
4       6598        357       1850          4         11        259         87
5       4891        204        695          5          4        161         38
  STP9_2_4_M STP9_2_9_M STP9_3_1_N STP9_3_2_N STP9_3_3_N STP9_3_4_N STP9_3_5_N
1         18          5         54       2591       1061        535        368
2          0          0          3         21         32        728         53
3          0          0          8         88          6          2         61
4          0          0         21        334        124        807         89
5          1          0          5        239        104          4         70
  STP9_3_6_N STP9_3_7_N STP9_3_8_N STP9_3_9_N STP9_3_10 STP9_3_99 STVIVIENDA STP14_1_TI
1       3172        233          7         19       371        25      63354      47817
2         92          5          0          0        14         0       1875       1793
3        626          8          0          8        93         0       3332       3189
4        361         42          0         27        39         6       6955       6006
5        211         16          0          0        45         1       5095       4700
  STP14_2_TI STP14_3_TI STP14_4_TI STP14_5_TI STP14_6_TI STP15_1_OC STP15_2_OC
1      13764       1624         21          8        120      49809       2681
2         40         22         17          0          3       1409         13
3        113         24          2          2          2       2883          2
4        775        160          1          1         12       5767        304
5        145        188          4          1         57       4568          5
  STP15_3_OC STP15_4_OC TSP16_HOG STP19_EC_1 STP19_ES_2 STP19_EE_1 STP19_EE_2
1       2150       8714     51430      48638       1171      34851      10343
2         55        398      1559       1300        109       1184        106
3        107        340      3161       2595        288       2118        366
4        388        496      6129       5375        392       3548        962
5        323        199      5848       4195        373       3330        770
  STP19_EE_3 STP19_EE_4 STP19_EE_5 STP19_EE_6 STP19_EE_9 STP19_ACU1 STP19_ACU2
1       2169        509         13          3        750      45179       4630
2          1          0          0          0          9        808        601
3         17          2          1          0         91       2017        866
4        793          1          1          1         69       4175       1592
5         84          0          1          1          9       2505       2063
  STP19_ALC1 STP19_ALC2 STP19_GAS1 STP19_GAS2 STP19_GAS9 STP19_REC1 STP19_REC2
1      41138       8671      37028      12074        707      45491       4318
2        703        706         26       1371         12        727        682
3       1806       1077         52       2796         35       1905        978
4       4323       1444         57       5549        161       4348       1419
5       2359       2209       1463       3041         64       2414       2154
  STP19_INT1 STP19_INT2 STP19_INT9 STP27_PERS STPERSON_L STPERSON_S STP32_1_SE
1      13362      35727        720     156789       4315     152474      77620
2         27       1370         12       4514        151       4363       2323
3         73       2775         35       9075        346       8729       4551
4        211       5395        161      17775        203      17572       8790
5        125       4379         64      13014        192      12822       6601
  STP32_2_SE STP34_1_ED STP34_2_ED STP34_3_ED STP34_4_ED STP34_5_ED STP34_6_ED
1      79169      25503      30249      29951      23602      17235      14349
2       2191        725       1016        717        568        536        445
3       4524       1592       2254       1388       1121        986        816
4       8985       3047       3811       2601       2302       2032       1792
5       6413       2346       2882       2170       1587       1460       1188
  STP34_7_ED STP34_8_ED STP34_9_ED STP51_PRIM STP51_SECU STP51_SUPE STP51_POST
1       8969       4687       2244      48848      59610      21898       4592
2        253        162         92       1940       1712        231         41
3        487        286        145       3541       3340        490        119
4       1135        707        348       7571       6287       1029        228
5        703        430        248       6072       4066        639        108
  STP51_13_E STP51_99_E Shape_Leng Shape_Area                       geometry
1       5892       3799   2.942508 0.20692777 MULTIPOLYGON (((-75.42074 2...
2        215         46   1.112829 0.03361758 MULTIPOLYGON (((-75.89506 1...
3        720        123   2.234657 0.09674460 MULTIPOLYGON (((-75.78705 1...
4       1095        171   3.154370 0.08986744 MULTIPOLYGON (((-75.36167 2...
5        916         99   3.529316 0.10030928 MULTIPOLYGON (((-75.36638 2...

A veces solo requerimos ver los primeros registros para conocer la estructura general de la tabla de atributos. Podemos limitar el número de registros que se muestran al llamar la variable vector_municipios incluyendo una línea de texto en la que especificamos cuántos registros queremos que se presenten.

# Establecer el número máximo de filas a imprimir
options(sf_max_print = 5)
vector_municipios
Simple feature collection with 1122 features and 90 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
Geodetic CRS:  MAGNA-SIRGAS
First 5 features:
  DPTO_CCDGO MPIO_CCDGO             MPIO_CNMBR MPIO_CDPMP VERSION       AREA  LATITUD
1         18        001              FLORENCIA      18001    2018 2547637532 1.749139
2         18        029                ALBANIA      18029    2018  414122070 1.227865
3         18        094 BELÉN DE LOS ANDAQUÍES      18094    2018 1191618572 1.500923
4         18        247            EL DONCELLO      18247    2018 1106076151 1.791386
5         18        256              EL PAUJÍL      18256    2018 1234734145 1.617746
   LONGITUD STCTNENCUE STP3_1_SI STP3_2_NO STP3A_RI STP3B_TCN STP4_1_SI STP4_2_NO
1 -75.55824      71877        32     71845       32         0         0     71877
2 -75.88233       2825        24      2801       24         0         0      2825
3 -75.87565       4243        54      4189       54         0         1      4242
4 -75.19394       8809         0      8809        0         0         0      8809
5 -75.23404       5795         0      5795        0         0         0      5795
  STP9_1_USO STP9_2_USO STP9_3_USO STP9_4_USO STP9_2_1_M STP9_2_2_M STP9_2_3_M
1      61176       2178       8436         87         39       1550        566
2       1826         49        948          2          3         34         12
3       3223        109        900         11          4         99          6
4       6598        357       1850          4         11        259         87
5       4891        204        695          5          4        161         38
  STP9_2_4_M STP9_2_9_M STP9_3_1_N STP9_3_2_N STP9_3_3_N STP9_3_4_N STP9_3_5_N
1         18          5         54       2591       1061        535        368
2          0          0          3         21         32        728         53
3          0          0          8         88          6          2         61
4          0          0         21        334        124        807         89
5          1          0          5        239        104          4         70
  STP9_3_6_N STP9_3_7_N STP9_3_8_N STP9_3_9_N STP9_3_10 STP9_3_99 STVIVIENDA STP14_1_TI
1       3172        233          7         19       371        25      63354      47817
2         92          5          0          0        14         0       1875       1793
3        626          8          0          8        93         0       3332       3189
4        361         42          0         27        39         6       6955       6006
5        211         16          0          0        45         1       5095       4700
  STP14_2_TI STP14_3_TI STP14_4_TI STP14_5_TI STP14_6_TI STP15_1_OC STP15_2_OC
1      13764       1624         21          8        120      49809       2681
2         40         22         17          0          3       1409         13
3        113         24          2          2          2       2883          2
4        775        160          1          1         12       5767        304
5        145        188          4          1         57       4568          5
  STP15_3_OC STP15_4_OC TSP16_HOG STP19_EC_1 STP19_ES_2 STP19_EE_1 STP19_EE_2
1       2150       8714     51430      48638       1171      34851      10343
2         55        398      1559       1300        109       1184        106
3        107        340      3161       2595        288       2118        366
4        388        496      6129       5375        392       3548        962
5        323        199      5848       4195        373       3330        770
  STP19_EE_3 STP19_EE_4 STP19_EE_5 STP19_EE_6 STP19_EE_9 STP19_ACU1 STP19_ACU2
1       2169        509         13          3        750      45179       4630
2          1          0          0          0          9        808        601
3         17          2          1          0         91       2017        866
4        793          1          1          1         69       4175       1592
5         84          0          1          1          9       2505       2063
  STP19_ALC1 STP19_ALC2 STP19_GAS1 STP19_GAS2 STP19_GAS9 STP19_REC1 STP19_REC2
1      41138       8671      37028      12074        707      45491       4318
2        703        706         26       1371         12        727        682
3       1806       1077         52       2796         35       1905        978
4       4323       1444         57       5549        161       4348       1419
5       2359       2209       1463       3041         64       2414       2154
  STP19_INT1 STP19_INT2 STP19_INT9 STP27_PERS STPERSON_L STPERSON_S STP32_1_SE
1      13362      35727        720     156789       4315     152474      77620
2         27       1370         12       4514        151       4363       2323
3         73       2775         35       9075        346       8729       4551
4        211       5395        161      17775        203      17572       8790
5        125       4379         64      13014        192      12822       6601
  STP32_2_SE STP34_1_ED STP34_2_ED STP34_3_ED STP34_4_ED STP34_5_ED STP34_6_ED
1      79169      25503      30249      29951      23602      17235      14349
2       2191        725       1016        717        568        536        445
3       4524       1592       2254       1388       1121        986        816
4       8985       3047       3811       2601       2302       2032       1792
5       6413       2346       2882       2170       1587       1460       1188
  STP34_7_ED STP34_8_ED STP34_9_ED STP51_PRIM STP51_SECU STP51_SUPE STP51_POST
1       8969       4687       2244      48848      59610      21898       4592
2        253        162         92       1940       1712        231         41
3        487        286        145       3541       3340        490        119
4       1135        707        348       7571       6287       1029        228
5        703        430        248       6072       4066        639        108
  STP51_13_E STP51_99_E Shape_Leng Shape_Area                       geometry
1       5892       3799   2.942508 0.20692777 MULTIPOLYGON (((-75.42074 2...
2        215         46   1.112829 0.03361758 MULTIPOLYGON (((-75.89506 1...
3        720        123   2.234657 0.09674460 MULTIPOLYGON (((-75.78705 1...
4       1095        171   3.154370 0.08986744 MULTIPOLYGON (((-75.36167 2...
5        916         99   3.529316 0.10030928 MULTIPOLYGON (((-75.36638 2...

También podemos visualizar el listado de campos (atributos o columnas) a través de:

names(vector_municipios)
 [1] "DPTO_CCDGO" "MPIO_CCDGO" "MPIO_CNMBR" "MPIO_CDPMP" "VERSION"    "AREA"      
 [7] "LATITUD"    "LONGITUD"   "STCTNENCUE" "STP3_1_SI"  "STP3_2_NO"  "STP3A_RI"  
[13] "STP3B_TCN"  "STP4_1_SI"  "STP4_2_NO"  "STP9_1_USO" "STP9_2_USO" "STP9_3_USO"
[19] "STP9_4_USO" "STP9_2_1_M" "STP9_2_2_M" "STP9_2_3_M" "STP9_2_4_M" "STP9_2_9_M"
[25] "STP9_3_1_N" "STP9_3_2_N" "STP9_3_3_N" "STP9_3_4_N" "STP9_3_5_N" "STP9_3_6_N"
[31] "STP9_3_7_N" "STP9_3_8_N" "STP9_3_9_N" "STP9_3_10"  "STP9_3_99"  "STVIVIENDA"
[37] "STP14_1_TI" "STP14_2_TI" "STP14_3_TI" "STP14_4_TI" "STP14_5_TI" "STP14_6_TI"
[43] "STP15_1_OC" "STP15_2_OC" "STP15_3_OC" "STP15_4_OC" "TSP16_HOG"  "STP19_EC_1"
[49] "STP19_ES_2" "STP19_EE_1" "STP19_EE_2" "STP19_EE_3" "STP19_EE_4" "STP19_EE_5"
[55] "STP19_EE_6" "STP19_EE_9" "STP19_ACU1" "STP19_ACU2" "STP19_ALC1" "STP19_ALC2"
[61] "STP19_GAS1" "STP19_GAS2" "STP19_GAS9" "STP19_REC1" "STP19_REC2" "STP19_INT1"
[67] "STP19_INT2" "STP19_INT9" "STP27_PERS" "STPERSON_L" "STPERSON_S" "STP32_1_SE"
[73] "STP32_2_SE" "STP34_1_ED" "STP34_2_ED" "STP34_3_ED" "STP34_4_ED" "STP34_5_ED"
[79] "STP34_6_ED" "STP34_7_ED" "STP34_8_ED" "STP34_9_ED" "STP51_PRIM" "STP51_SECU"
[85] "STP51_SUPE" "STP51_POST" "STP51_13_E" "STP51_99_E" "Shape_Leng" "Shape_Area"
[91] "geometry"  

2.4. Visualizar su primer mapa

La siguiente línea utiliza la función plot() para visualizar el objeto espacial almacenado en la variable vector_municipios.

El primer argumento es el objeto espacial que desea trazar, en este caso vector_municipios. El segundo argumento contiene el atributo (columna) “DPTO_CCDGO”.La función plot() utilizará los valores de esa columna para determinar cómo colorear las entidades en el mapa. Como “DPTO_CCDGO” es una columna que representa diferentes departamentos, cada departamento se coloreará de forma diferente según los valores de esta columna.

plot(vector_municipios)
Warning: plotting the first 10 out of 90 attributes; use max.plot = 90 to plot all

Si le resulta muy pesado cargar todo el mapa completo, prueb con el archivo mun_santander_boyaca.shp

¿Qué diferencia evidencia en la siguiente salida con respecto a la anterior? ¿Qué cambió en el código?

plot(vector_municipios["DPTO_CCDGO"])

Ahora usted cree su propia visualización por municipios

#Escriba su código acá

2.5. Sistemas de Coordenadas y reproyecciones los datos

Verifique el sistema coordenado de la capa vector_municipios

st_crs(vector_municipios)
Coordinate Reference System:
  User input: MAGNA-SIRGAS 
  wkt:
GEOGCRS["MAGNA-SIRGAS",
    DATUM["Marco Geocentrico Nacional de Referencia",
        ELLIPSOID["GRS 1980",6378137,298.257222101,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    USAGE[
        SCOPE["Horizontal component of 3D system."],
        AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
        BBOX[-4.23,-84.77,15.51,-66.87]],
    ID["EPSG",4686]]

La salida se interpreta así:

PROJCRS[“MAGNA-SIRGAS 2018 / Origen-Nacional”]: Indica que está utilizando el sistema de referencia proyectado “MAGNA-SIRGAS 2018 / Origen-Nacional”.

BASEGEOGCRS[“MAGNA-SIRGAS 2018”]: Define el sistema de coordenadas geográficas subyacente llamado “MAGNA-SIRGAS 2018”.

DATUM[…]: Proporciona detalles sobre el datum que está siendo utilizado.

ELLIPOSOID[“GRS 1980”,…]: Detalles sobre el elipsoide utilizado.

CONVERSION[“Colombia Transverse Mercator”]: Detalles sobre cómo se convierten las coordenadas geográficas a coordenadas planas. Aquí se utiliza la proyección “Transverse Mercator”.

PARAMETER[…]: Estos son parámetros específicos de la proyección. Por ejemplo, “Latitude of natural origin” y “Longitude of natural origin” son las coordenadas en las que la proyección tiene cero distorsión. “False easting” y “False northing” son desplazamientos añadidos para evitar coordenadas negativas.

CS[Cartesian,2], AXIS[…], AXIS[…]: Indica que se trata de un sistema de coordenadas cartesianas bidimensional, con un eje norte y un eje este.

USAGE[…], AREA[…]: Proporciona detalles sobre el uso y la área de aplicabilidad del sistema de referencia.

ID[“EPSG”..]: Es un identificador único para este sistema de coordenadas. En este caso, el EPSG 9377 corresponde al sistema “MAGNA-SIRGAS 2018 / Origen-Nacional” que se utiliza en Colombia. #### 2.5.1. Sistemas de Coordenadas y reproyecciones los datos #### La función st_transform hace parte del paquete sf y reproyecta las coordenadas de un conjunto de datos espaciales,

vector_municipios_reproject <- st_transform(vector_municipios, 9377)

Escriba la línea para revisar el sistema de coordenadas de su capa reproyectada

#Escriba acá su script

2.6. Exportar datos almacenados en una variable a un archivo

Felicitaciones, usted ya ha reproyectado su conjunto de datos. Sin embargo, solo se encuentran almacenados en la memoria de R bajo el nombre de la variable vector_municipios_reproject. Si usted quiere guardar sus capa reproyectada en el almacenamiento de su computador requiere exportarlo aun archivo ( por ejemplo shapefile). Modifique el código ejemplo presentado y escriba una ruta válida para almacenar sus archivo shapfile. ¿A propósito, ya sabe en qué casos coloca ./ al inicio de su ruta?.

st_write(capa_reproyectada, "(./mi_capa_reproyectada.shp")

2.7. Revise sus resultados en QGIS

Abra en QGIS su capa original de municipios y su capa reproyectada. Verifique los sistemas de referencia de cada capa. Son diferentes los sistemas de referencia? Cuál procedimiento le resulta más interesante para reproyectar datos espaciales QGIS o líneas de código en R?

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed. ### 2.8. Realice una selección del departamento con el codigo 18 unicamente #### La siguiente sección del script realiza una selección de los registros que cumplen una condición: DPTO_CCDGO == 18.

%>% es un operador del paquete dplyr. Toma el objeto o resultado de la izquierda y lo “pasa” como el primer argumento a la función de la derecha. Es una manera concisa y legible de encadenar operaciones en R.

La función filter() del paquete dplyr se utiliza para filtrar filas en un dataframe (tabla con encabezados) o, en este caso, en un objeto sf basado en una condición.

DPTO_CCDGO == 18 es la condición que se usa para filtrar. Esta condición seleccionará todas las filas donde el valor de la columna DPTO_CCDGO es igual a 18.

depto_18 <- vector_municipios_reproject %>% 
  filter( DPTO_CCDGO == 18)

Visualice el mapa de municipios de depto_18

plot (depto_18)
Warning: plotting the first 9 out of 90 attributes; use max.plot = 90 to plot all

Ahora guarde en un archivo shapefile en su computador el contenido de depto_18

plot(depto_18["MPIO_CCDGO"])

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLg0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4NCg0KIyAqKjEuIEludHJvZHVjY2nDs24qKg0KDQojIyAqKjEuMS4gSW50cm9kdWNjacOzbiBhIFIqKg0KDQpSIGVzIHVuIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24geSB1biBlbnRvcm5vIGRlIHNvZnR3YXJlIGxpYnJlIHV0aWxpemFkbyBwcmluY2lwYWxtZW50ZSBwYXJhIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28geSBncsOhZmljb3MuIE5hY2nDsyBjb21vIHVuYSBpbXBsZW1lbnRhY2nDs24gZGVsIGxlbmd1YWplIFMsIGRlc2Fycm9sbGFkbyBlbiBsb3MgbGFib3JhdG9yaW9zIEJlbGwuIEEgbG8gbGFyZ28gZGVsIHRpZW1wbywgUiBoYSBldm9sdWNpb25hZG8gcGFyYSBjb252ZXJ0aXJzZSBlbiB1bmEgaGVycmFtaWVudGEgaW5kaXNwZW5zYWJsZSBwYXJhIGxhIGNpZW5jaWEgZGUgZGF0b3MsIGxhIGJpb2luZm9ybcOhdGljYSwgbGEgaW52ZXN0aWdhY2nDs24gYWNhZMOpbWljYSB5IG3DoXMuDQoNCiMjICoqMS4yLiBJbnRyb2R1Y2Npw7NuIGEgUlN0dWRpbyoqDQoNClJTdHVkaW8gZXMgdW4gZW50b3JubyBkZSBkZXNhcnJvbGxvIGludGVncmFkbyAoSURFKSBwYXJhIFIuIFByb3BvcmNpb25hIHVuYSBjb25zb2xhLCB1biBlZGl0b3IgZGUgc2NyaXB0cyBxdWUgc29wb3J0YSBsYSBlamVjdWNpw7NuIGRpcmVjdGEgZGUgY8OzZGlnbywgYXPDrSBjb21vIGhlcnJhbWllbnRhcyBwYXJhIGxhIHZpc3VhbGl6YWNpw7NuIGRlIGRhdG9zIHkgbGEgZ2VzdGnDs24gZGVsIGVzcGFjaW8gZGUgdHJhYmFqby4gUlN0dWRpbyBoYSBmYWNpbGl0YWRvIGVsIHVzbyBkZSBSIGFsIG9mcmVjZXIgdW5hIGludGVyZmF6IG3DoXMgYW1pZ2FibGUgeSBoZXJyYW1pZW50YXMgw7p0aWxlcyBwYXJhIGVsIGFuw6FsaXNpcy4NCiMjIyAqKjEuMi4xLiBJbnRlcmZheiBkZSBSU3R1ZGlvKioNCg0KIVtJbnRlcmZheiBSU3R1ZGlvLl0oLi9pbWFnZW5lcy9pbnRlcmZhei5wbmcpDQpFbiBsYSAqKmNvbnNvbGEqKiBzZSBlamVjdXRhIGVsIGPDs2RpZ28gUiBlbiB0aWVtcG8gcmVhbC4gTG9zIHVzdWFyaW9zIHB1ZWRlbiBpbmdyZXNhciBjb21hbmRvcyBkaXJlY3RhbWVudGUgeSB2ZXIgbG9zIHJlc3VsdGFkb3MgYWwgaW5zdGFudGUuDQoNCioqRWRpdG9yIGRlIHNjcmlwdHM6KiogRWwgZWRpdG9yIGRlIGPDs2RpZ28gcGVybWl0ZSBlc2NyaWJpciB5IGVkaXRhciBzY3JpcHRzIGVuIFIuIFJlc2FsdGEgbGEgc2ludGF4aXMgZGVsIGPDs2RpZ28uIFByb3BvcmNpb25hIHN1Z2VyZW5jaWFzIGRlIGPDs2RpZ28geSBhdXRvY29tcGxldGFkby4gVGllbmUgYm90b25lcyBwYXJhIGVqZWN1dGFyIGzDrW5lYXMgbyBibG9xdWVzIGRlIGPDs2RpZ28gZXNwZWPDrWZpY29zLiBFcyBqdXN0byBkb25kZSBlc3RveSBlc2NyaWJpZW5kbyBlc3RlIHNjcmlwdC4gDQoNCioqRW52aXJvbm1lbnQ6KiogRWwgRW50b3JubyBvIEVudmlyb25tZW50IG11ZXN0cmEgbG9zIG9iamV0b3MgKHZlY3RvcmVzLCBtYXRyaWNlcywgZGF0YSBmcmFtZXMsIGV0Yy4pIHF1ZSBlc3TDoW4gZW4gZWwgZW50b3JubyBnbG9iYWwuIE9mcmVjZSBsYSBvcGNpw7NuIGRlIGltcG9ydGFyIGNvbmp1bnRvcyBkZSBkYXRvcy4gRWwgImVudG9ybm8gZ2xvYmFsIiBzZSByZWZpZXJlIGFsIGVzcGFjaW8gZGUgdHJhYmFqbyBkZSBuaXZlbCBzdXBlcmlvciBkb25kZSBsYXMgdmFyaWFibGVzLCBmdW5jaW9uZXMgeSBvdHJvcyBvYmpldG9zIHF1ZSBjcmVhcyBzZSBhbG1hY2VuYW4gZGUgbWFuZXJhIHByZWRldGVybWluYWRhIGR1cmFudGUgdW5hIHNlc2nDs24gaW50ZXJhY3RpdmEuIEVzIGVsIGx1Z2FyIGRvbmRlIHNlIGd1YXJkYW4geSBzZSBwdWVkZW4gYWNjZWRlciBhIGxhcyB2YXJpYWJsZXMgcXVlIGRlZmluZXMgeSBhIGxvcyBkYXRvcyBxdWUgY2FyZ2FzLCBhIG1lbm9zIHF1ZSBzZSBlc3BlY2lmaXF1ZSBvIHV0aWxpYyB1biBlbnRvcm5vIGRpZmVyZW50ZS4NCg0KKipIaXN0b3JpYWw6KiogTXVlc3RyYSB1biByZWdpc3RybyBkZSBsb3MgY29tYW5kb3MgcHJldmlhbWVudGUgZWplY3V0YWRvcyBlbiBsYSBjb25zb2xhLg0KDQoqKkFyY2hpdm9zOioqIFByb3BvcmNpb25hIHVuYSB2aXN0YSBkZWwgc2lzdGVtYSBkZSBhcmNoaXZvcywgbG8gcXVlIHBlcm1pdGUgbmF2ZWdhciwgYWJyaXIsIHkgZ2VzdGlvbmFyIGFyY2hpdm9zIHkgZGlyZWN0b3Jpb3MuDQoNCioqUGxvdHM6KiogTXVlc3RyYSBncsOhZmljb3MgZ2VuZXJhZG9zIHBvciBlbCBjw7NkaWdvIFIuDQpQZXJtaXRlIG5hdmVnYXIgZW50cmUgdmFyaW9zIGdyw6FmaWNvcyB5IGV4cG9ydGFybG9zIGVuIGRpdmVyc29zIGZvcm1hdG9zLg0KDQoqKlBhcXVldGVzOioqIEVudW1lcmEgdG9kb3MgbG9zIHBhcXVldGVzIFIgaW5zdGFsYWRvcy4NClBlcm1pdGUgaW5zdGFsYXIsIGFjdHVhbGl6YXIgbyBjYXJnYXIvZGVzY2FyZ2FyIHBhcXVldGVzIGNvbiBmYWNpbGlkYWQuDQoNCioqQXl1ZGE6KiogUHJvcG9yY2lvbmEgYWNjZXNvIGEgbGEgZG9jdW1lbnRhY2nDs24gZGUgZnVuY2lvbmVzIHkgcGFxdWV0ZXMgZGUgUi4NClBlcm1pdGUgYnVzY2FyIHkgY29uc3VsdGFyIGxhIGRvY3VtZW50YWNpw7NuIGRlIGZ1bmNpb25lcyBlc3BlY8OtZmljYXMuDQoNCioqVmlzb3I6KiogU2UgdXRpbGl6YSBwYXJhIHZpc3VhbGl6YXIgY29udGVuaWRvcyB3ZWIsIGNvbW8gbWFwYXMgaW50ZXJhY3Rpdm9zIG8gZG9jdW1lbnRvcyBSIE1hcmtkb3duIHJlbmRlcml6YWRvcy4NCg0KIyMgMS4zLiBQcm95ZWN0b3MgeSBBcmNoaXZvcywgTm90ZWJvb2tzIHkgRG9jdW1lbnRvcyBSIE1hcmtkb3duDQoNCkVuIFJTdHVkaW8gc2UgcHVlZGVuIGNyZWFyIGFyY2hpdm9zIG8gcHJveWVjdG9zLiBMYSBkaWZlcmVuY2lhIGVudHJlIHVuIGFyY2hpdm8geSB1biBwcm95ZWN0byBlcyBpbXBvcnRhbnRlIHkgdGllbmUgcXVlIHZlciBjb24gbGEgb3JnYW5pemFjacOzbiwgZ2VzdGnDs24geSByZXByb2R1Y2liaWxpZGFkIGRlIHR1IHRyYWJham8uIA0KDQojIyMgMS4zLjEuIEFyY2hpdm9zDQotVW4gYXJjaGl2byBlbiBSIHN1ZWxlIHRlbmVyIHVuYSBleHRlbnNpw7NuIC5SIG8gLlJtZCAocGFyYSBSIE1hcmtkb3duKS4gQ29udGllbmUgY8OzZGlnbyBSLCBjb21lbnRhcmlvcyB5LCBlbiBlbCBjYXNvIGRlIFIgTWFya2Rvd24sIHRhbWJpw6luIHB1ZWRlIGNvbnRlbmVyIHRleHRvIGVucmlxdWVjaWRvLCBlY3VhY2lvbmVzLCBldGMuIA0KLVNlIHV0aWxpemEgcGFyYSBlc2NyaWJpciwgZ3VhcmRhciB5IGVqZWN1dGFyIGPDs2RpZ28gUi4NCg0KLVVuIGFyY2hpdm8gZXMgdW5hIGVudGlkYWQgaW5kZXBlbmRpZW50ZS4gUHVlZGUgbW92ZXJzZSwgY29tcGFydGlyc2UgbyBlamVjdXRhcnNlIHNpbiBuZWNlc2lkYWQgZGUgb3Ryb3MgYXJjaGl2b3MsIGEgbWVub3MgcXVlIGV4cGzDrWNpdGFtZW50ZSBkZXBlbmRhIGRlIG90cm9zIChwb3IgZWplbXBsbywgc2kgY2FyZ2EgZGF0b3MgZGUgb3RybyBhcmNoaXZvKS4NCg0KQ29uIFJTdHVkaW8gc2UgcHVlZGVuIGNyZWFyIGRpZmVyZW50ZXMgdGlwb3MgZGUgYXJjaGl2b3MuIFZhbW9zIGEgbWVuY2lvbmFyIDMgcXVlIHNvbiBtdXkgY29tdW5lcy4NCg0KIyMjIyAxLjMuMS4xLiBTY3JpcHQgZGUgUiAoKi5SKQ0KQXJjaGl2b3MgZGUgY8OzZGlnbyBxdWUgY29udGllbmVuIHNlY3VlbmNpYXMgZGUgY29tYW5kb3MgeSBmdW5jaW9uZXMgZW4gUi4NCg0KIyMjIyMgIDEuMy4xLjIuIFIgTWFya2Rvd24gKCouUm1kKQ0KRG9jdW1lbnRvcyBxdWUgaW50ZWdyYW4gY8OzZGlnbyBSIGNvbiB0ZXh0byBuYXJyYXRpdm8sIHBlcm1pdGllbmRvIGxhIGNyZWFjacOzbiBkZSBpbmZvcm1lcywgcHJlc2VudGFjaW9uZXMgeSBvdHJvcyBkb2N1bWVudG9zIHF1ZSBwdWVkZW4gc2VyIHJlbmRlcml6YWRvcyBlbiBkaXZlcnNvcyBmb3JtYXRvcyBjb21vIEhUTUwsIFBERiB5IFdvcmQuU2kgYmllbiBsb3Mgbm90ZWJvb2tzIGdlbmVyYWxtZW50ZSBzZSB2aXN1YWxpemFuIG1lam9yIGNvbW8gZG9jdW1lbnRvcyBIVE1MLCBjb24gUiBNYXJrZG93biBwdWVkZXMgZsOhY2lsbWVudGUgcmVuZGVyaXphciBhIG3Dumx0aXBsZXMgZm9ybWF0b3MsIGluY2x1aWRvcyBQREYsIFdvcmQgbyBwcmVzZW50YWNpb25lcy4gRmx1am8gZGUgVHJhYmFqbyBMaW5lYWw6IEVuIHVuIGRvY3VtZW50byBSIE1hcmtkb3duIHRyYWRpY2lvbmFsLCBub3JtYWxtZW50ZSB0cmFiYWphIGVuIGVsIGPDs2RpZ28geSBlbCBjb250ZW5pZG8sIHkgbHVlZ28gcmVuZGVyaXphIHRvZG8gZWwgZG9jdW1lbnRvIGRlIHVuYSB2ZXogcGFyYSB2ZXIgbG9zIHJlc3VsdGFkb3MuIEVzdG8gZXMgw7p0aWwgY3VhbmRvIHlhIHRpZW5lIHVuIGFuw6FsaXNpcyBlc3RhYmxlY2lkbyBxdWUgZGVzZWEgZWplY3V0YXIgZGUgcHJpbmNpcGlvIGEgZmluLg0KU2UgdXNhbiBzaSBzZSByZXF1aWVyZSBnZW5lcmFyIGluZm9ybWVzIHF1ZSBkb2N1bWVudGVuIGVsIGPDs2RpZ28uDQoNCiMjIyMjIDEuMy4xLjMuUiBOb3RlYm9vayAoZm9ybWF0byAuUm1kKQ0KVW5hIHZhcmlhbnRlIGRlIFIgTWFya2Rvd24gZG9uZGUgcHVlZGUgZWplY3V0YXIgeSB2ZXIgcmVzdWx0YWRvcyBlbiBsw61uZWEuIFBlcm1pdGVuIGVqZWN1dGFyIGJsb3F1ZXMgZGUgY8OzZGlnbyBpbmRpdmlkdWFsbWVudGUgZSBpbm1lZGlhdGFtZW50ZSB2ZXIgbG9zIHJlc3VsdGFkb3MgZGViYWpvIGRlIGVzZSBibG9xdWUsIHNpbWlsYXIgYSBjw7NtbyBmdW5jaW9uYW4gbG9zIEp1cHl0ZXIgTm90ZWJvb2tzIGVuIFB5dGhvbi4gRXMgw7p0aWwgcGFyYSB1biBhbsOhbGlzaXMgZXhwbG9yYXRvcmlvIGRvbmRlIGRlc2VhIGl0ZXJhciByw6FwaWRhbWVudGUgeSB2ZXIgbG9zIHJlc3VsdGFkb3MgYWwgaW5zdGFudGUuIEVzIGRlY2lyIHF1ZSBwdWVkZSB2ZXIgZWwgY8OzZGlnbywgbG9zIHJlc3VsdGFkb3MgeSBlbCB0ZXh0byBlbiB1biBmb3JtYXRvIGNhc2kgZmluYWwgbWllbnRyYXMgdHJhYmFqYSwgcG9yIGxvIHF1ZSByZXN1bHRhIMO6dGlsIHBhcmEgY29uc3RydWlyIHkgcmVmaW5hciBhbsOhbGlzaXMgeSBkb2N1bWVudGFybG9zIHNpbXVsdMOhbmVhbWVudGUgICoqwqFFc3RvIGVzIHVuIG5vdGVib29rISoqDQoNCkFtYmFzIG9wY2lvbmVzLCBOb3RlYm9vayB5IFIgTWFya2Rvd24sIHRpZW5lbiBzdXMgZm9ydGFsZXphcyB5IHNvbiBhZGVjdWFkYXMgcGFyYSBkaWZlcmVudGVzIGVzY2VuYXJpb3MuIFNpIGVzdMOhIGVuIHVuYSBmYXNlIGV4cGxvcmF0b3JpYSwgaXRlcmF0aXZhIHkgZGVzZWFzIHZlciByZXN1bHRhZG9zIGFsIGluc3RhbnRlLCB1biBub3RlYm9vayBwdWVkZSBzZXIgbGEgbWVqb3Igb3BjacOzbi4gU2kgZXN0w6EgdHJhYmFqYW5kbyBlbiB1biBpbmZvcm1lLCBhcnTDrWN1bG8gbyBhbsOhbGlzaXMgbcOhcyBlc3RydWN0dXJhZG8geSBmb3JtYWwgcXVlIHJlcXVpZXJlIHVuIGZsdWpvIGRlQW1iYXMgb3BjaW9uZXMsIE5vdGVib29rIHkgUiBNYXJrZG93biwgdGllbmVuIHN1cyBmb3J0YWxlemFzIHkgc29uIGFkZWN1YWRhcyBwYXJhIGRpZmVyZW50ZXMgZXNjZW5hcmlvcy4gU2kgZXN0w6EgZW4gdW5hIGZhc2UgZXhwbG9yYXRvcmlhLCBpdGVyYXRpdmEgeSBkZXNlYSB2ZXIgcmVzdWx0YWRvcyBhbCBpbnN0YW50ZSwgdW4gbm90ZWJvb2sgcHVlZGUgc2VyIGxhIG1lam9yIG9wY2nDs24uIFNpIGVzdMOhIHRyYWJhamFuZG8gZW4gdW4gaW5mb3JtZSwgYXJ0w61jdWxvIG8gYW7DoWxpc2lzIG3DoXMgZXN0cnVjdHVyYWRvIHkgZm9ybWFsIHF1ZSByZXF1aWVyZSB1biBmbHVqbyBkZSB0cmFiYWpvIG3DoXMgbGluZWFsIHkgb3BjaWRjb25lcyBkZSBzYWxpZGEgZGl2ZXJzaWZpY2FkYXMsIHVuIGRvY3VtZW50byBSIE1hcmtkb3duIHBvZHLDrWEgc2VyIG3DoXMgYWRlY3VhZG8uDQpFbiBjdWFscXVpZXIgY2FzbywgcmVjdWVyZGUgcXVlIHB1ZWRlcyBjYW1iaWFyIGVudHJlIGxhcyBleHBlcmllbmNpYXMgZGUgTm90ZWJvb2sgeSBEb2N1bWVudG8gZW4gUlN0dWRpbyBjb24gZmFjaWxpZGFkLCBwb3IgbG8gcXVlIG5vIGVzdMOhIGVzdHJpY3RhbWVudGUgbGltaXRhZG8gYSB1bmEgZWxlY2Npw7NuIHUgb3RyYS4NCg0KDQojIyMgKioxLjMuMi4gUHJveWVjdG9zKioNCi1VbiBwcm95ZWN0byBlbiBSU3R1ZGlvIG5vIGVzIHNvbG8gdW4gYXJjaGl2bywgc2lubyB1biBlbnRvcm5vIGRlIHRyYWJham8gY29tcGxldG8uIEN1YW5kbyBjcmVhIHVuIHByb3llY3RvLCBSU3R1ZGlvIGdlbmVyYSB1biBhcmNoaXZvIGNvbiBleHRlbnNpw7NuIC5ScHJvaiBxdWUgZ3VhcmRhIGxhcyBjb25maWd1cmFjaW9uZXMgeSBlbCBlc3RhZG8gZGVsIHByb3llY3RvLg0KDQotTG9zIHByb3llY3RvcyBzZSB1dGlsaXphbiBwYXJhIG9yZ2FuaXphciBjb25qdW50b3MgcmVsYWNpb25hZG9zIGRlIGFyY2hpdm9zIHkgZGF0b3MuIEZhY2lsaXRhbiBsYSBnZXN0acOzbiBkZSBkaXJlY3RvcmlvcyBkZSB0cmFiYWpvLCBydXRhcyByZWxhdGl2YXMgeSBvdHJhcyBjb25maWd1cmFjaW9uZXMgZXNwZWPDrWZpY2FzIGRlbCBwcm95ZWN0by4NCg0KLUVudG9ybm8gZGUgdHJhYmFqbzogQ3VhbmRvIGFicmUgdW4gcHJveWVjdG8sIFJTdHVkaW8gYXV0b23DoXRpY2FtZW50ZSBjb25maWd1cmEgZWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvIGVuIGxhIHViaWNhY2nDs24gZGVsIHByb3llY3RvLiBFc3RvIGVzIMO6dGlsIHBhcmEgZ2FyYW50aXphciBxdWUgZWwgY8OzZGlnbyBzZWEgcmVwcm9kdWNpYmxlLCB5YSBxdWUgcHVlZGUgdXNhciBydXRhcyByZWxhdGl2YXMgZW4gbHVnYXIgZGUgcnV0YXMgYWJzb2x1dGFzLg0KDQotTG9zIHByb3llY3RvcyBkZSBSU3R1ZGlvIHNlIGludGVncmFuIGJpZW4gY29uIHNpc3RlbWFzIGRlIGNvbnRyb2wgZGUgdmVyc2lvbmVzIGNvbW8gR2l0LCBmYWNpbGl0YW5kbyBsYSBnZXN0acOzbiBkZSB2ZXJzaW9uZXMgeSBjb2xhYm9yYWNpw7NuLg0KDQotQWwgdHJhYmFqYXIgZW4gdW4gcHJveWVjdG8gbcOhcyBncmFuZGUsIGVzIHBvc2libGUgcXVlIHRlbmdhcyBtw7psdGlwbGVzIHNjcmlwdHMsIGNvbmp1bnRvcyBkZSBkYXRvcyB5IG90cm9zIGFyY2hpdm9zIHJlbGFjaW9uYWRvcy4gTG9zIHByb3llY3RvcyB0ZSBheXVkYW4gYSBtYW50ZW5lciB0b2RvIG9yZ2FuaXphZG8gZW4gdW4gc29sbyBsdWdhci4NCg0KLVVuIHByb3llY3RvIHB1ZWRlIHRlbmVyIGNvbmZpZ3VyYWNpb25lcyBlc3BlY8OtZmljYXMsIGNvbW8gb3BjaW9uZXMgZGUgY29kaWZpY2FjacOzbiwgcXVlIG5vIGFmZWN0YW4gYSBvdHJvcyBwcm95ZWN0b3MgbyBzY3JpcHRzIGZ1ZXJhIGRlbCBwcm95ZWN0by4NCg0KKipFbiByZXN1bWVuLCBtaWVudHJhcyBxdWUgdW4gYXJjaGl2byBlbiBSIGVzIHNpbXBsZW1lbnRlIHVuIGRvY3VtZW50byBxdWUgY29udGllbmUgY8OzZGlnbyBSLCB1biBwcm95ZWN0byBlbiBSU3R1ZGlvIGVzIHVuIGVudG9ybm8gZGUgdHJhYmFqbyBvcmdhbml6YXRpdm8gcXVlIGZhY2lsaXRhIGxhIGdlc3Rpw7NuIHkgcmVwcm9kdWNpYmlsaWRhZCBkZSB0cmFiYWpvcyBtw6FzIGNvbXBsZWpvcyB5IG11bHRpZmFjw6l0aWNvcy4gRXMgZXNwZWNpYWxtZW50ZSDDunRpbCBjdWFuZG8gZXN0w6EgdHJhYmFqYW5kbyBlbiBhbsOhbGlzaXMgbcOhcyBncmFuZGVzIG8gY29sYWJvcmF0aXZvcy4qKg0KDQoNCiMgKioyLiBQcmltZXJvcyBwYXNvcyBlbiBSKiogIw0KIyMgMi4xLkxpYnJlcsOtYXMNCkVuIFIsIGxhcyBmdW5jaW9uYWxpZGFkZXMgc2UgYW1wbMOtYW4gbWVkaWFudGUgcGFxdWV0ZXMgbyBsaWJyZXLDrWFzLiBBbGd1bm9zIHBhcXVldGVzIG5vdGFibGVzIHBhcmEgZWwgbWFuZWpvIGRlIGRhdG9zIGVzcGFjaWFsZXMgaW5jbHV5ZW46DQoNCi0gKipzZioqOiBFc3RlIHBhcXVldGUgcGVybWl0ZSBlbCBtYW5lam8geSBhbsOhbGlzaXMgZGUgZGF0b3MgZXNwYWNpYWxlcyBzaW1wbGVzLiBIYSBnYW5hZG8gcG9wdWxhcmlkYWQgcG9yIHN1IHNpbXBsaWNpZGFkIHkgZWZpY2llbmNpYS4NCi0gKipzcCoqOiBVbmEgZGUgbGFzIHByaW1lcmFzIGxpYnJlcsOtYXMgcGFyYSBkYXRvcyBlc3BhY2lhbGVzIGVuIFIuIEF1bnF1ZSBoYSBzaWRvIGVuIHBhcnRlIHN1cGVyYWRhIHBvciAqKmBzZmAqKiwgc2lndWUgc2llbmRvIGFtcGxpYW1lbnRlIHV0aWxpemFkYS4NCi0gKipyYXN0ZXIqKjogUGFyYSBlbCBtYW5lam8geSBhbsOhbGlzaXMgZGUgZGF0b3MgcmFzdGVyLg0KLSAqKnJnZGFsKio6IFByb3BvcmNpb25hIGhlcnJhbWllbnRhcyBhIGxhIGJpYmxpb3RlY2EgR0RBTCBwYXJhIGxhIGNvbnZlcnNpw7NuIGRlIGZvcm1hdG9zIGVzcGFjaWFsZXMuDQpBc8OtIHF1ZSBlbCBwcmltZXIgcGFzbyBjb25zaXN0ZSBlbiBpbnN0YWxhciB1bmFzIGxpYnJlcsOtYXMgYsOhc2ljYXMgcXVlIG5vcyBwcm92ZWVuIGZ1bmNpb25lcyBwYXJhIHJlYWxpemFyIGFuw6FsaXNpcyBwb3N0ZXJpb3JtZW50ZS4gRXN0byBsbyB0aWVuZSBxdWUgbGVsdmFyIGEgY2FibyBzb2xhbWVudGUgdW5hIHZlei4gDQpPYnNlcnZhcsOhIHF1ZSBjdWFuZG8gdHJhYmFqYW1vcyBlbiB1biBub3RlYm9vaywgZWwgY8OzZGlnbyBxdWUgc2UgcHVlZGUgZWplY3V0YXIgc2UgZXNjcmliZSBhc8OtICoqIGBgYHtyfSBjw7NkaWdvIGBgYCoqLiBQdWVkZSBlamVjdXRhcmxvIGhhY2llbmRvIGNsaWNrIHNvYnJlIGVsIHPDrW1ib2xvIGRlIHBsYXkuIA0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInNmIiwgInJhc3RlciIsICJyZ2RhbCIsImRwbHlyIikNCmBgYA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+T2pvLCBzb2xvIHB1ZWRlIGVqZWN1dGFyIGxvcyBjw7NkaWdvcyBkZXNkZSBlbCBlZGl0b3IgZGUgY8OzZGlnbyBkZSBSU3R1ZGlvLCBubyBkZXNkZSBsYSB2aXN1YWxpemFjacOzbiAocmVuZGVyaXphY2nDs24pIGVuIGh0bWwuIDwvc3Bhbj4NClwNCg0KIVtBc8OtIHNlIHZlIHVuIGJsb3F1ZSBkZSBjw7NkaWdvIGVuIGVsIGVkaXRvciBkZSBjw7NkaWdvIGRlIFJzdHVkaW9dKC4vaW1hZ2VuZXMvY29kaWdvLnBuZykNClwNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPsK/QSBwcm9ww7NzaXRvLCB5YSBzYWJlIGPDs21vIGFncmVnYXIgdW5hIGltYWdlbiBhIHN1IG5vdGVib29rPy48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPsK/WWEgaWRlbnRpZmljw7MgY8OzbW8gYWdyZWdhciBjb2xvciBhbCB0ZXh0byBxdWUgdXNlIHBhcmEgZG9jdW1lbnRhciBzdSBjw7NkaWdvPzwvc3Bhbj4uDQpcDQpBaG9yYSBjYXJnYXJlbW9zIGxhcyBsaWJyZXLDrWFzLiBObyBlcyBzdWZpY2llbnRlIGluc3RhbGFybGFzLCB0ZW5lbW9zIHF1ZSBkZWNpciBleHBsw61jaXRhbWVudGUgcXVlIHZhbW9zIGEgdHJhZXJsYXMgYSBudWVzdHJvIGPDs2RpZ28uIA0KDQpFbCBwYXF1ZXRlIHNmIChzaW1wbGUgZmVhdHVyZXMpIG9mcmVjZSB1bmEgYW1wbGlhIHZhcmllZGFkIGRlIGZ1bmNpb25hbGlkYWRlcyBwYXJhIHRyYWJhamFyIGNvbiBkYXRvcyBlc3BhY2lhbGVzIHRpcG8gdmVjdG9yIGNvbW8gcmVwcmVzZW50YWNpw7NuIGRlIGRhdG9zIGVzcGFjaWFsZXMsIGxlZXJlIHkgZXNjcmliaXIgZW4gdmFyaWVkYWQgZGUgZm9ybWF0b3MgKGVqLiBzaHAsIEdlb0pTT04sIEtNTCwgZW50cmUgb3Ryb3MpLCBpbnRlZ3JhY2nDs24gY29uIGxpYnJlcsOtYXMgY29tbyBHREFMIHF1ZSBwZXJtaXRlIGdlc3Rpb25hciBkYXRvcyBnZW9lc3BhY2lhbGU7IG1hbmlwdWxhciBnZW9tZXRyw61hcyBwYXJhIGNhbGN1bGFyIMOhcmVhLCBsb25naXR1ZGVzLCBldGM7IHJlYWxpemFyIG9wZXJhY2lvbmVzIHRvcG9sw7NnaWNhcywgbWFuaXB1bGFjacOzbiBkZSBzaXN0ZW1hcyBkZSBjb29yZGVuYWRhczsgaW50ZWdyYWNpw7NuIGNvbiBvdHJvcyBwYXF1ZXRlcyBkZSBSOyByZWFsaXphciBvcGVyYWNpb25lcyBkZSBnZW9wcm9jZXNhbWllbnRvIGNvbW8gYnVmZmVyLCBjbGlwLCBlbnRyZSBvdHJhczsgYXPDrSBjb21vICBtYW5pcHVsYWNpw7NuIGRlIGF0cmlidXRvcyAoYWdyZWdhciwgZWxpbWluYXIsIG1vZGlmaWNhci4gDQoNClJlcHJlc2VudGFjacOzbiBkZSBEYXRvcyBFc3BhY2lhbGVzOg0KYGBge3J9DQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShyZ2RhbCkNCmxpYnJhcnkoZHBseXIpDQpgYGANCg0KIyMgMi4yLiBWYXJpYWJsZXMgIyMNCkVuIHByb2dyYW1hY2nDs24sIGEgbWVudWRvIHNlIHJlcXVpZXJlIGFsbWFjZW5hciBpbmZvcm1hY2nDs24gcGFyYSB1c2FybGEgbcOhcyBhZGVsYW50ZS4gQXF1w60gZXMgZG9uZGUgZW50cmFuIGxhcyB2YXJpYWJsZXMuIFVuYSB2YXJpYWJsZSBwdWVkZSBzZXIgaW1hZ2luYWRhIGNvbW8gdW5hIGNhamEgZW4gbGEgcXVlICBzZSBndWFyZGEgYWxndW5hIGluZm9ybWFjacOzbi4gRXN0YSAiY2FqYSIgdGllbmUgdW4gbm9tYnJlLCB5IHNpZW1wcmUgcXVlIHF1aWVyYSBhY2NlZGVyIGEgbGEgaW5mb3JtYWNpw7NuLCBzaW1wbGVtZW50ZSB1c2EgZWwgbm9tYnJlIGRlIGxhIHZhcmlhYmxlLiANCkVuIFIsIHNlIHVzYSBlbCBzw61tYm9sbyA8LSBwYXJhIGFzaWduYXIgdW4gdmFsb3IgYSB1bmEgdmFyaWFibGUuIA0KTG8gcHJpbWVybyBxdWUgdmFtb3MgYSBoYWNlciBlcyBpbnN0YWxhciBsYXMgbGlicmVyw61hcyBvIHBhcXVldGVzIGNvbiBsb3MgcXVlIHBvZHJlbW9zIHJlYWxpemFyIGxhcyBvcGVyYWNpb25lcyB5IGFuw6FsaXNpcy4gIA0KTGEgdmFyaWFibGUgc2hwX3J1dGEgYWxtYWNlbmFyw6EgbGEgcnV0YSBhbCBhcmNoaXZvIHNocCANCmBgYHtyfQ0Kc2hwX3J1dGEgPC0gIi4vZGF0b3MvU0hQX01HTjIwMThfSU5UR1JEX01QSU8vTUdOX0FOTV9NUElPUy5zaHAiDQpgYGANCk5vdGFyw6EgcXVlIGVuIGxhIG1lZGlkYSBlbiBxdWUgc2UgY3JlYW4gdmFyaWFibGVzLCBlc3TDoXMgZW1waWV6YW4gYSBhcGFyZWNlciBlbiBlbCBwYW5lbCBHbG9iYWwgRW52aXJvbm1lbnQuIA0KDQojIyMgMi4zLiBMZXllbmRvIGRhdG9zIGVzcGFjaWFsZXMgeSB2aXN1YWxpemFuZG8gc3VzIHByb3BpZWRhZGVzICMjIw0KDQoNCkxhIHNpZ3VpZW50ZSBsw61uZWEgdXNhIGZ1bmNpb25hbGlkYWRlcyBkZSBsYSBsaWJyZXLDrWEgc2YgcGFyYSBsZWVyIGVsIHNoYXBlZmlsZSBkaXNwb25pYmxlIGVuIGxhIHJ1dGEgKipzaHBfcnV0YSoqIGNvbW8gdW4gYXJjaGl2byBlc3BhY2lhbCB5IGxvIGFsbWFjZW5hIGVuIGxhIHZhcmlhYmxlICoqdmVjdG9yX211bmljaXBpb3MqKi4NCmBgYHtyfQ0KdmVjdG9yX211bmljaXBpb3MgPC0gc3RfcmVhZChzaHBfcnV0YSkNCmBgYA0KTGEgbMOtbmVhIHNpZ3VpZW50ZSBzaW1wbGVtZW50ZSBpbXByaW1lIGxhIGluZm9ybWFjacOzbiBkZSBsYSB2YXJpYWJsZSB2ZWN0b3JfbXVuaWNpcGlvcyBlbiBsYSBjb25zb2xhLiBDb21vIGVzIHVuIG9iamV0byBlc3BhY2lhbCBtb3N0cmFyw6EgdW4gcmVzdW1lbiBkZSBlc2Ugb2JqZXRvLCBhc8OtIGNvbW8gdG9kb3MgbG9zIGF0cmlidXRvcyB5IHJlZ2lzdHJvcy4NCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPsK/UXXDqSBpbmZvcm1hY2nDs24gcHVlZGUgaWRlbnRpZmljYXIgPy48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KYGBge3J9DQp2ZWN0b3JfbXVuaWNpcGlvcw0KYGBgDQpBIHZlY2VzIHNvbG8gcmVxdWVyaW1vcyB2ZXIgbG9zIHByaW1lcm9zIHJlZ2lzdHJvcyBwYXJhIGNvbm9jZXIgbGEgZXN0cnVjdHVyYSBnZW5lcmFsIGRlIGxhIHRhYmxhIGRlIGF0cmlidXRvcy4gUG9kZW1vcyBsaW1pdGFyIGVsIG7Dum1lcm8gZGUgcmVnaXN0cm9zIHF1ZSBzZSBtdWVzdHJhbiBhbCBsbGFtYXIgbGEgdmFyaWFibGUgKip2ZWN0b3JfbXVuaWNpcGlvcyoqIGluY2x1eWVuZG8gdW5hIGzDrW5lYSBkZSB0ZXh0byBlbiBsYSBxdWUgZXNwZWNpZmljYW1vcyBjdcOhbnRvcyByZWdpc3Ryb3MgcXVlcmVtb3MgcXVlIHNlIHByZXNlbnRlbi4gDQpgYGB7cn0NCiMgRXN0YWJsZWNlciBlbCBuw7ptZXJvIG3DoXhpbW8gZGUgZmlsYXMgYSBpbXByaW1pcg0Kb3B0aW9ucyhzZl9tYXhfcHJpbnQgPSA1KQ0KdmVjdG9yX211bmljaXBpb3MNCmBgYA0KVGFtYmnDqW4gcG9kZW1vcyB2aXN1YWxpemFyIGVsIGxpc3RhZG8gZGUgY2FtcG9zIChhdHJpYnV0b3MgbyBjb2x1bW5hcykgYSB0cmF2w6lzIGRlOg0KYGBge3J9DQpuYW1lcyh2ZWN0b3JfbXVuaWNpcGlvcykNCmBgYA0KDQojIyMgMi40LiBWaXN1YWxpemFyIHN1IHByaW1lciBtYXBhICMjIyMgDQpMYSBzaWd1aWVudGUgbMOtbmVhIHV0aWxpemEgbGEgZnVuY2nDs24gcGxvdCgpIHBhcmEgdmlzdWFsaXphciBlbCBvYmpldG8gZXNwYWNpYWwgYWxtYWNlbmFkbyBlbiBsYSB2YXJpYWJsZSB2ZWN0b3JfbXVuaWNpcGlvcy4NCg0KRWwgcHJpbWVyIGFyZ3VtZW50byBlcyBlbCBvYmpldG8gZXNwYWNpYWwgcXVlIGRlc2VhIHRyYXphciwgZW4gZXN0ZSBjYXNvIHZlY3Rvcl9tdW5pY2lwaW9zLg0KRWwgc2VndW5kbyBhcmd1bWVudG8gY29udGllbmUgZWwgYXRyaWJ1dG8gKGNvbHVtbmEpICJEUFRPX0NDREdPIi5MYSBmdW5jacOzbiBwbG90KCkgdXRpbGl6YXLDoSBsb3MgdmFsb3JlcyBkZSBlc2EgY29sdW1uYSBwYXJhIGRldGVybWluYXIgY8OzbW8gY29sb3JlYXIgbGFzIGVudGlkYWRlcyBlbiBlbCBtYXBhLiBDb21vICJEUFRPX0NDREdPIiBlcyB1bmEgY29sdW1uYSBxdWUgcmVwcmVzZW50YSBkaWZlcmVudGVzIGRlcGFydGFtZW50b3MsIGNhZGEgZGVwYXJ0YW1lbnRvIHNlIGNvbG9yZWFyw6EgZGUgZm9ybWEgZGlmZXJlbnRlIHNlZ8O6biBsb3MgdmFsb3JlcyBkZSBlc3RhIGNvbHVtbmEuDQoNCmBgYHtyfQ0KcGxvdCh2ZWN0b3JfbXVuaWNpcGlvcykNCmBgYA0KU2kgbGUgcmVzdWx0YSBtdXkgcGVzYWRvIGNhcmdhciB0b2RvIGVsIG1hcGEgY29tcGxldG8sIHBydWViIGNvbiBlbCBhcmNoaXZvIG11bl9zYW50YW5kZXJfYm95YWNhLnNocA0KDQoNCsK/UXXDqSBkaWZlcmVuY2lhIGV2aWRlbmNpYSBlbiBsYSBzaWd1aWVudGUgc2FsaWRhIGNvbiByZXNwZWN0byBhIGxhIGFudGVyaW9yPyDCv1F1w6kgY2FtYmnDsyBlbiBlbCBjw7NkaWdvPw0KDQpgYGB7cn0NCnBsb3QodmVjdG9yX211bmljaXBpb3NbIkRQVE9fQ0NER08iXSkNCmBgYA0KQWhvcmEgdXN0ZWQgY3JlZSBzdSBwcm9waWEgdmlzdWFsaXphY2nDs24gcG9yIG11bmljaXBpb3MNCmBgYHtyfQ0KI0VzY3JpYmEgc3UgY8OzZGlnbyBhY8OhDQpgYGANCiMjIyAyLjUuIFNpc3RlbWFzIGRlIENvb3JkZW5hZGFzIHkgcmVwcm95ZWNjaW9uZXMgbG9zIGRhdG9zICMjIyMgDQpWZXJpZmlxdWUgZWwgc2lzdGVtYSBjb29yZGVuYWRvIGRlIGxhIGNhcGEgKip2ZWN0b3JfbXVuaWNpcGlvcyoqDQpgYGB7cn0NCnN0X2Nycyh2ZWN0b3JfbXVuaWNpcGlvcykNCmBgYA0KDQpMYSBzYWxpZGEgc2UgaW50ZXJwcmV0YSBhc8OtOg0KDQpQUk9KQ1JTWyJNQUdOQS1TSVJHQVMgMjAxOCAvIE9yaWdlbi1OYWNpb25hbCJdOiBJbmRpY2EgcXVlIGVzdMOhIHV0aWxpemFuZG8gZWwgc2lzdGVtYSBkZSByZWZlcmVuY2lhIHByb3llY3RhZG8gIk1BR05BLVNJUkdBUyAyMDE4IC8gT3JpZ2VuLU5hY2lvbmFsIi4NCg0KQkFTRUdFT0dDUlNbIk1BR05BLVNJUkdBUyAyMDE4Il06IERlZmluZSBlbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGdlb2dyw6FmaWNhcyBzdWJ5YWNlbnRlIGxsYW1hZG8gIk1BR05BLVNJUkdBUyAyMDE4Ii4NCg0KREFUVU1bLi4uXTogUHJvcG9yY2lvbmEgZGV0YWxsZXMgc29icmUgZWwgZGF0dW0gcXVlIGVzdMOhIHNpZW5kbyB1dGlsaXphZG8uDQoNCkVMTElQT1NPSURbIkdSUyAxOTgwIiwuLi5dOiBEZXRhbGxlcyBzb2JyZSBlbCBlbGlwc29pZGUgdXRpbGl6YWRvLg0KDQpDT05WRVJTSU9OWyJDb2xvbWJpYSBUcmFuc3ZlcnNlIE1lcmNhdG9yIl06IERldGFsbGVzIHNvYnJlIGPDs21vIHNlIGNvbnZpZXJ0ZW4gbGFzIGNvb3JkZW5hZGFzIGdlb2dyw6FmaWNhcyBhIGNvb3JkZW5hZGFzIHBsYW5hcy4gQXF1w60gc2UgdXRpbGl6YSBsYSBwcm95ZWNjacOzbiAiVHJhbnN2ZXJzZSBNZXJjYXRvciIuDQoNClBBUkFNRVRFUlsuLi5dOiBFc3RvcyBzb24gcGFyw6FtZXRyb3MgZXNwZWPDrWZpY29zIGRlIGxhIHByb3llY2Npw7NuLiBQb3IgZWplbXBsbywgIkxhdGl0dWRlIG9mIG5hdHVyYWwgb3JpZ2luIiB5ICJMb25naXR1ZGUgb2YgbmF0dXJhbCBvcmlnaW4iIHNvbiBsYXMgY29vcmRlbmFkYXMgZW4gbGFzIHF1ZSBsYSBwcm95ZWNjacOzbiB0aWVuZSBjZXJvIGRpc3RvcnNpw7NuLiAiRmFsc2UgZWFzdGluZyIgeSAiRmFsc2Ugbm9ydGhpbmciIHNvbiBkZXNwbGF6YW1pZW50b3MgYcOxYWRpZG9zIHBhcmEgZXZpdGFyIGNvb3JkZW5hZGFzIG5lZ2F0aXZhcy4NCg0KQ1NbQ2FydGVzaWFuLDJdLCBBWElTWy4uLl0sIEFYSVNbLi4uXTogSW5kaWNhIHF1ZSBzZSB0cmF0YSBkZSB1biBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGNhcnRlc2lhbmFzIGJpZGltZW5zaW9uYWwsIGNvbiB1biBlamUgbm9ydGUgeSB1biBlamUgZXN0ZS4NCg0KVVNBR0VbLi4uXSwgQVJFQVsuLi5dOiBQcm9wb3JjaW9uYSBkZXRhbGxlcyBzb2JyZSBlbCB1c28geSBsYSDDoXJlYSBkZSBhcGxpY2FiaWxpZGFkIGRlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEuDQoNCklEWyJFUFNHIi4uXTogRXMgdW4gaWRlbnRpZmljYWRvciDDum5pY28gcGFyYSBlc3RlIHNpc3RlbWEgZGUgY29vcmRlbmFkYXMuIEVuIGVzdGUgY2FzbywgZWwgRVBTRyA5Mzc3IGNvcnJlc3BvbmRlIGFsIHNpc3RlbWEgIk1BR05BLVNJUkdBUyAyMDE4IC8gT3JpZ2VuLU5hY2lvbmFsIiBxdWUgc2UgdXRpbGl6YSBlbiBDb2xvbWJpYS4NCiMjIyMgMi41LjEuIFNpc3RlbWFzIGRlIENvb3JkZW5hZGFzIHkgcmVwcm95ZWNjaW9uZXMgbG9zIGRhdG9zICMjIyMgDQpMYSBmdW5jacOzbiBzdF90cmFuc2Zvcm0gaGFjZSBwYXJ0ZSBkZWwgcGFxdWV0ZSBzZiB5IHJlcHJveWVjdGEgbGFzIGNvb3JkZW5hZGFzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGVzcGFjaWFsZXMsIA0KDQpgYGB7cn0NCnZlY3Rvcl9tdW5pY2lwaW9zX3JlcHJvamVjdCA8LSBzdF90cmFuc2Zvcm0odmVjdG9yX211bmljaXBpb3MsIDkzNzcpDQpgYGANCkVzY3JpYmEgbGEgbMOtbmVhIHBhcmEgcmV2aXNhciBlbCBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGRlIHN1IGNhcGEgcmVwcm95ZWN0YWRhDQpgYGB7cn0NCiNFc2NyaWJhIGFjw6Egc3Ugc2NyaXB0DQpgYGANCg0KIyMjIDIuNi4gRXhwb3J0YXIgZGF0b3MgYWxtYWNlbmFkb3MgZW4gdW5hIHZhcmlhYmxlIGEgdW4gYXJjaGl2byAjIyMjIA0KRmVsaWNpdGFjaW9uZXMsIHVzdGVkIHlhIGhhIHJlcHJveWVjdGFkbyBzdSBjb25qdW50byBkZSBkYXRvcy4gU2luIGVtYmFyZ28sIHNvbG8gc2UgZW5jdWVudHJhbiBhbG1hY2VuYWRvcyBlbiBsYSBtZW1vcmlhIGRlIFIgYmFqbyBlbCBub21icmUgZGUgbGEgdmFyaWFibGUgKip2ZWN0b3JfbXVuaWNpcGlvc19yZXByb2plY3QqKi4gDQpTaSB1c3RlZCBxdWllcmUgZ3VhcmRhciBzdXMgY2FwYSByZXByb3llY3RhZGEgZW4gZWwgYWxtYWNlbmFtaWVudG8gZGUgc3UgY29tcHV0YWRvciByZXF1aWVyZSBleHBvcnRhcmxvIGF1biBhcmNoaXZvICggcG9yIGVqZW1wbG8gc2hhcGVmaWxlKS4gDQpNb2RpZmlxdWUgZWwgY8OzZGlnbyBlamVtcGxvIHByZXNlbnRhZG8geSBlc2NyaWJhIHVuYSBydXRhIHbDoWxpZGEgcGFyYSBhbG1hY2VuYXIgc3VzIGFyY2hpdm8gc2hhcGZpbGUuDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj7Cv0EgcHJvcMOzc2l0bywgeWEgc2FiZSBlbiBxdcOpIGNhc29zIGNvbG9jYSAqKi4vKiogYWwgaW5pY2lvIGRlIHN1IHJ1dGE/PC9zcGFuPi4NCg0KYGBge3J9DQpzdF93cml0ZShjYXBhX3JlcHJveWVjdGFkYSwgIiguL21pX2NhcGFfcmVwcm95ZWN0YWRhLnNocCIpDQpgYGANCiMjIyAyLjcuIFJldmlzZSBzdXMgcmVzdWx0YWRvcyBlbiBRR0lTICMjIyMgDQoNCkFicmEgZW4gUUdJUyBzdSBjYXBhIG9yaWdpbmFsIGRlIG11bmljaXBpb3MgeSBzdSBjYXBhIHJlcHJveWVjdGFkYS4gVmVyaWZpcXVlIGxvcyBzaXN0ZW1hcyBkZSByZWZlcmVuY2lhIGRlIGNhZGEgY2FwYS4gU29uIGRpZmVyZW50ZXMgbG9zIHNpc3RlbWFzIGRlIHJlZmVyZW5jaWE/DQpDdcOhbCBwcm9jZWRpbWllbnRvIGxlIHJlc3VsdGEgbcOhcyBpbnRlcmVzYW50ZSBwYXJhIHJlcHJveWVjdGFyIGRhdG9zIGVzcGFjaWFsZXMgUUdJUyBvIGzDrW5lYXMgZGUgY8OzZGlnbyBlbiBSPyANCg0KDQpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ21kK09wdGlvbitJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0KIyMjIDIuOC4gUmVhbGljZSB1bmEgc2VsZWNjacOzbiBkZWwgZGVwYXJ0YW1lbnRvIGNvbiBlbCBjb2RpZ28gMTggdW5pY2FtZW50ZSAjIyMjIA0KTGEgc2lndWllbnRlIHNlY2Npw7NuIGRlbCBzY3JpcHQgcmVhbGl6YSB1bmEgc2VsZWNjacOzbiBkZSBsb3MgcmVnaXN0cm9zIHF1ZSBjdW1wbGVuIHVuYSBjb25kaWNpw7NuOiBEUFRPX0NDREdPID09IDE4LiANCg0KJT4lIGVzIHVuIG9wZXJhZG9yIGRlbCBwYXF1ZXRlIGRwbHlyLiBUb21hIGVsIG9iamV0byBvIHJlc3VsdGFkbyBkZSBsYSBpenF1aWVyZGEgeSBsbyAicGFzYSIgY29tbyBlbCBwcmltZXIgYXJndW1lbnRvIGEgbGEgZnVuY2nDs24gZGUgbGEgZGVyZWNoYS4gRXMgdW5hIG1hbmVyYSBjb25jaXNhIHkgbGVnaWJsZSBkZSBlbmNhZGVuYXIgb3BlcmFjaW9uZXMgZW4gUi4NCg0KTGEgZnVuY2nDs24gZmlsdGVyKCkgZGVsIHBhcXVldGUgZHBseXIgc2UgdXRpbGl6YSBwYXJhIGZpbHRyYXIgZmlsYXMgZW4gdW4gZGF0YWZyYW1lICh0YWJsYSBjb24gZW5jYWJlemFkb3MpIG8sIGVuIGVzdGUgY2FzbywgZW4gdW4gb2JqZXRvIHNmIGJhc2FkbyBlbiB1bmEgY29uZGljacOzbi4NCg0KRFBUT19DQ0RHTyA9PSAxOCBlcyBsYSBjb25kaWNpw7NuIHF1ZSBzZSB1c2EgcGFyYSBmaWx0cmFyLiBFc3RhIGNvbmRpY2nDs24gc2VsZWNjaW9uYXLDoSB0b2RhcyBsYXMgZmlsYXMgZG9uZGUgZWwgdmFsb3IgZGUgbGEgY29sdW1uYSBEUFRPX0NDREdPIGVzIGlndWFsIGEgMTguIA0KYGBge3J9DQpkZXB0b18xOCA8LSB2ZWN0b3JfbXVuaWNpcGlvc19yZXByb2plY3QgJT4lIA0KICBmaWx0ZXIoIERQVE9fQ0NER08gPT0gMTgpDQpgYGANCg0KVmlzdWFsaWNlIGVsIG1hcGEgZGUgbXVuaWNpcGlvcyBkZSBkZXB0b18xOA0KYGBge3J9DQojRXNjcmliYSBhY8OhIHN1IGPDs2RpZ28NCmBgYA0KDQpBaG9yYSBndWFyZGUgZW4gdW4gYXJjaGl2byBzaGFwZWZpbGUgZW4gc3UgY29tcHV0YWRvciBlbCBjb250ZW5pZG8gZGUgZGVwdG9fMTgNCmBgYHtyfQ0KI0VzY3JpYmEgYWPDoSBzdSBjw7NkaWdvDQpgYGANCg0K