###1. Introduction This Notebook is made as a form of presentation of the first partial of the Basic Geomatics course of the semester 2024 - 2 where an analysis of the agricultural dynamics of the department of Caquetá from 2019 to 2023 will be presented. The data that will be visualized below come from the Municipal Agricultural Evaluations (EVA) from 2019 to 2023 provided by the Ministry of Agriculture and Rural Development. This notebook will show all the steps for the process, from downloading programs for the R library to downloading and organizing the database

###2. Set up. In this step, we will install and load the required R libraries. Previously, most of the programs had already been downloaded, so only those that are needed were downloaded

install.packages("readr")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/Karol Ruiz/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
probando la URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/readr_2.1.5.zip'
Content type 'application/zip' length 1211560 bytes (1.2 MB)
downloaded 1.2 MB
package ‘readr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\Karol Ruiz\AppData\Local\Temp\RtmpoHbLF0\downloaded_packages
install.packages("dplyr")
Error in install.packages : Updating loaded packages
install.packages("tidyverse")
Error in install.packages : Updating loaded packages
install.packages("ggplot2")
Error in install.packages : Updating loaded packages
library(readr)
library(ggplot2)
library(dplyr)

###3. Download the multi-year EVA dataset for your department Go to https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA-2019-20/uejq-wxrr/explore to find the dataset.In the linked website (i.e datos.gov.co), we are going to visualize the data and apply a filter to obtain only the data from Caquetá. Then export the data in csv format.

Now, go to the downloads directory to find out the Evaluaciones_Agropecuarias_Municipales_EVA.csv file. Move it to your working directory

###4. Read the EVA dataset

Now, change names for several columns which contains empty or “noisy” characters:

datos %>%  dplyr::rename('Cod_Mun' = 'Código.Dane.municipio', 
                         'Cod_dpto'= 'Código.Dane.departamento',
                         'Grupo_cultivo' = 'Grupo.cultivo',
                         'Desagregacion_cultivo' = 'Desagregación.cultivo',
                         'Year' = 'Año',
                         'Area_Sembrada' = 'Área.sembrada',
                         'Area_Cosechada' = 'Área.cosechada',
                         'Produccion' = 'Producción',
                         'Estado' = 'Estado.físico.del.cultivo',
                         'Ciclo_del_cultivo' = 'Ciclo.del.cultivo',
                         'Cod_cultivo' = 'Código.del.cultivo',)-> new_eva
new_eva

###5. Data analysis Many data analysis tasks can be approached using the split-apply-combine paradigm: split the data into groups, apply some analysis to each group, and then combine the results.

The dplyr library makes this very easy through the use of the group_by() function, which splits the data into groups. When the data is grouped in this way, summarize() can be used to collapse each group into a single-row summary. summarize() does this by applying an aggregating or summary function to each group.

##5.1 The most importance crops between 2019 and 2023

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

This table shows the total crop production in the department of Caquetá from 2019 to 2023. The most productive crops in that period of time in Caquetá were “cultivos tropicales tradiconales” and “frutales”

Then we must save this table as follows

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

The next step is filter the most important crops. In the department of Caquetá, the two crops with the highest production range from 90,000. So we’ll filter from that number

PT %>% 
  filter(total_produccion > 90000) -> main.groups
(value = sum(main.groups$total_produccion))
[1] 2140835

Now we’ll create a pie chart from the main crops

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

##5.2 Municipalities with higher production for every group of crops

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

Now, we are going to save the object

leaders

Now, we are going to filter the most important municipalities from the agricultural point of view and let’s plot the filtered leaders

leaders %>% 
  filter(total_prod > 50000) -> main.leaders
# Basic barplot
Top<-ggplot(data=main.leaders, aes(x=Municipio, y=total_prod)) +
  geom_bar(stat="identity")
Top

##5.3 Dynamics of the municipality with the highest group production

San Vicente del Caguán was the municipality where the highest crop production was reported, so we will make a visualization to know how the crops behave in this municipality

new <- select(new_eva, Municipio, Cultivo, Year, Produccion, Rendimiento)
new
new_SVC <- filter(new, Municipio == "San Vicente del Caguán")
new_SVC

This table shows the production of all crops year after year in the municipality, but now we will see what has been the highest crop production per year

new_SVC %>%
  group_by(Year, Cultivo) %>%
  summarize(Produccion = max(Produccion, na.rm = TRUE)) %>%
  slice(which.max(Produccion)) -> HC
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
HC
# we use the ggplot 2 library
g <- ggplot(aes(x=Year, y=Produccion/1000), data = HC) + geom_bar(stat='identity') + labs(y='Produccion de Caña [Ton x 1000]')
g + ggtitle("Evolution of Cane Crop Production in San Vicente del Caguán from 2019 to 2023") + labs(caption= "Based on EVA data (Minagricultura, 2024)")

The crop that has been more produced in the period of years from 2019 to 2023 has been the crop of cane, with a similar production in all years.

##5.4 Dynamics of one important crop between 2019 and 2023

Let’s analyze the highest crop production by municipality in any year

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

In the municipality of San Jose del Fragua, the highest production of traditional tropical crops was reported, at least in 2023. We will continue to explore the production of this municipality in the crop group with the highest demand among traditional tropical crops

new_eva %>% 
  filter(Municipio=="San José del Fragua" & Cultivo=="Caña") %>% 
  group_by(Year, Cultivo) %>%
  select(Municipio, Cultivo, Produccion, Year) -> SJF_C

SJF_C
# we use the ggplot 2 library
g <- ggplot(aes(x=Year, y=Produccion/1000), data = SJF_C) + geom_bar(stat='identity') + labs(y='Produccion de Caña [Ton x 1000]')
g + ggtitle("Evolution of Cane Crop Production in San José del Fragua from 2019 to 2023") + labs(caption= "Based on EVA data (Minagricultura, 2024)")

Just like in San Vicente, in San José del Fragua the crop with the highest production was the cane or sugarcane, but in this municipality there was a low production in 2022 and 2021.

###6. Analysis of agricultural dynamics

The department of Caquetá has an agricultural frontier area of 1,735,461 ha, which corresponds to 19% of its territory, and its natural forests and agricultural areas occupy 23.5% of its territory (2,115,159 ha), with San Vicente del Caguán being the municipality with the largest agricultural frontier area (FA area: 324,585 ha – 19%). therefore, as we saw in the previous data visualization, the municipality of San Vicente del Caguán represents the largest agricultural production at a general level in the department. However, a fact that is worth highlighting is that this municipality, despite being the largest agricultural producer in the department, has livestock as its main economic activity.

This department has a high aptitude for traditional tropical crops and fruit trees, with sugarcane, cassava, corn, banana and pineapple being the main crops of this region and the principal agricultural economy of the department.

In the pandemic season (2020-2022) there was a decrease in agricultural production, visualized in the data specifically for sugarcane cultivation in the department of San José del Fragua, however, in 2023 all production was efficiently recovered, which indicates that this department has very good resistance and adaptability.

The department of Caquetá has a high agricultural potential, which helps to draw a hopeful panorama in the face of soil recovery, food sovereignty and even the economic recovery of the country, however, the current situation in which this department finds itself in terms of land use and internal conflict leaves us with the unknown of what we are really taking advantage of or not using the country’s soils. generating an invitation to redirect attention to this type of departments that have been forgotten politically, but that have sufficient agricultural potential to promote and strengthen this sector and contribute to the development of the country.

###6. Analysis of agricultural dynamics (Spanish)

El departamento del Caquetá cuenta con un área de frontera agrícola de 1.735.461 ha lo que corresponde al 19% de su territorio, y en sus bosques naturales y áreas agropecuarias ocupan el 23.5% de su territorio (2.115.159 ha), siendo San Vicente del Caguán el municipio con mayor área de frontera agrícola (Área de FA: 324.585 ha – 19%), por lo cual, como ya vimos en la visualización de datos previa, el municipio de San Vicente del Caguán representa la mayor producción agrícola a nivel general en el departamento. Sin embargo, un dato que vale la pena resaltar es que este municipio a pesar de ser el mayor productor agrícola del departamento tiene como principal actividad económica la ganadería.

Este departamento presenta una aptitud alta frente a los cultivos tropicales tradicionales y frutales, siendo la caña, la yuca, el maíz, el plátano y la piña los cultivos principales de esta región y bajo los cuales se mueve la economía agrícola del departamento.

En la temporada de pandemia (2020-2022) se presentó una disminución de producción agrícola, visualizada en los datos específicamente del cultivo de caña en el departamento de San José del Fragua, sin embargo, en el 2023 se recuperó eficientemente toda la producción, lo cual indica que en este departamento se presenta muy buena resistencia y adaptabilidad.

El departamento del Caquetá tiene un alto potencial agrícola, el cual ayuda a dibujar un panorama esperanzador frente a la recuperación de suelos, la soberanía alimentaria e incluso la recuperación económica del país, sin embargo, la situación actual en la que se encuentra este departamento en cuestión de uso de suelos y conflicto interno nos deja la incógnita de en qué estamos aprovechando o desaprovechando los suelos del país realmente, generando una invitación para redireccionar la atención a este tipo de departamentos que han sido olvidados políticamente, pero que cuentan con el potencial agrícola suficiente para impulsar y fortalecer este sector contribuyendo así al desarrollo del país.

###7. Bibliography - Evaluaciones agropecuarias municipales – EVA. Calendario Departamental de Siembras y Cosechas | Datos Abiertos Colombia. (2023, 7 noviembre). https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA-Calenda/m6bb-k2h4/about_data - Lizarazo, I., 2022. Understanding dynamic productivity of crops. Available at https://rpubs.com/ials2un/production_dyn_v1. - UPRA.(2023).Caquetá, microánalisis evaluaciones agropecuarias-EVA [PDF file]https://upra.gov.co/Kit_Territorial/2-%20Informaci%C3%B3n%20por%20Departamentos/CAQUET%C3%81/3-%20Microan%C3%A1lisis%20Evaluaciones%20agropecuarias%202023-Caqueta.pdf - UPRA.(2023).Resultados evaluaciones agropecuarias 2023.[PDF file].https://upra.gov.co/es-co/Evas_Documentos/Resultados%20Evaluaciones%20Agropecuarias%202023.pdf

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBsYSBkaW7DoW1pY2EgYWdyw61jb2xhIGRlbCBkZXBhcnRhbWVudG8gZGVsIENhcXVldMOhIg0KQXV0aG9yOiBMYXVyYSBNYW5yaXF1ZQ0KRGF0ZTogMjAuMTIuMjAyNA0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojIyMxLiBJbnRyb2R1Y3Rpb24gDQpUaGlzIE5vdGVib29rIGlzIG1hZGUgYXMgYSBmb3JtIG9mIHByZXNlbnRhdGlvbiBvZiB0aGUgZmlyc3QgcGFydGlhbCBvZiB0aGUgQmFzaWMgR2VvbWF0aWNzIGNvdXJzZSBvZiB0aGUgc2VtZXN0ZXIgMjAyNCAtIDIgd2hlcmUgYW4gYW5hbHlzaXMgb2YgdGhlIGFncmljdWx0dXJhbCBkeW5hbWljcyBvZiB0aGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBmcm9tIDIwMTkgdG8gMjAyMyB3aWxsIGJlIHByZXNlbnRlZC4gVGhlIGRhdGEgdGhhdCB3aWxsIGJlIHZpc3VhbGl6ZWQgYmVsb3cgY29tZSBmcm9tIHRoZSBNdW5pY2lwYWwgQWdyaWN1bHR1cmFsIEV2YWx1YXRpb25zIChFVkEpIGZyb20gMjAxOSB0byAyMDIzIHByb3ZpZGVkIGJ5IHRoZSBNaW5pc3RyeSBvZiBBZ3JpY3VsdHVyZSBhbmQgUnVyYWwgRGV2ZWxvcG1lbnQuIFRoaXMgbm90ZWJvb2sgd2lsbCBzaG93IGFsbCB0aGUgc3RlcHMgZm9yIHRoZSBwcm9jZXNzLCBmcm9tIGRvd25sb2FkaW5nIHByb2dyYW1zIGZvciB0aGUgUiBsaWJyYXJ5IHRvIGRvd25sb2FkaW5nIGFuZCBvcmdhbml6aW5nIHRoZSBkYXRhYmFzZQ0KDQojIyMyLiBTZXQgdXAuDQpJbiB0aGlzIHN0ZXAsIHdlIHdpbGwgaW5zdGFsbCBhbmQgbG9hZCB0aGUgcmVxdWlyZWQgUiBsaWJyYXJpZXMuIFByZXZpb3VzbHksIG1vc3Qgb2YgdGhlIHByb2dyYW1zIGhhZCBhbHJlYWR5IGJlZW4gZG93bmxvYWRlZCwgc28gb25seSB0aG9zZSB0aGF0IGFyZSBuZWVkZWQgd2VyZSBkb3dubG9hZGVkDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KYGBgDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpgYGANCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCiMjIzMuIERvd25sb2FkIHRoZSBtdWx0aS15ZWFyIEVWQSBkYXRhc2V0IGZvciB5b3VyIGRlcGFydG1lbnQNCkdvIHRvIGh0dHBzOi8vd3d3LmRhdG9zLmdvdi5jby9BZ3JpY3VsdHVyYS15LURlc2Fycm9sbG8tUnVyYWwvRXZhbHVhY2lvbmVzLUFncm9wZWN1YXJpYXMtTXVuaWNpcGFsZXMtRVZBLTIwMTktMjAvdWVqcS13eHJyL2V4cGxvcmUgdG8gZmluZCB0aGUgZGF0YXNldC5JbiB0aGUgbGlua2VkIHdlYnNpdGUgKGkuZSBkYXRvcy5nb3YuY28pLCB3ZSBhcmUgZ29pbmcgdG8gdmlzdWFsaXplIHRoZSBkYXRhIGFuZCBhcHBseSBhIGZpbHRlciB0byBvYnRhaW4gb25seSB0aGUgZGF0YSBmcm9tIENhcXVldMOhLiBUaGVuIGV4cG9ydCB0aGUgZGF0YSBpbiBjc3YgZm9ybWF0Lg0KDQpOb3csIGdvIHRvIHRoZSBkb3dubG9hZHMgZGlyZWN0b3J5IHRvIGZpbmQgb3V0IHRoZSBFdmFsdWFjaW9uZXNfQWdyb3BlY3Vhcmlhc19NdW5pY2lwYWxlc19FVkEuY3N2IGZpbGUuIE1vdmUgaXQgdG8geW91ciB3b3JraW5nIGRpcmVjdG9yeQ0KDQojIyM0LiBSZWFkIHRoZSBFVkEgZGF0YXNldA0KYGBge3J9DQpkYXRvcyA8LSByZWFkLmNzdigiQzovVXNlcnMvS2Fyb2wgUnVpei9Eb2N1bWVudHMvR0VPTUFUSUNBIDIwMjQtMi9SL0VWQTE5MjMuY3N2IikNCmRhdG9zDQpgYGANCk5vdywgY2hhbmdlIG5hbWVzIGZvciBzZXZlcmFsIGNvbHVtbnMgd2hpY2ggY29udGFpbnMgZW1wdHkgb3Ig4oCcbm9pc3nigJ0gY2hhcmFjdGVyczoNCg0KYGBge3J9DQpkYXRvcyAlPiUgIGRwbHlyOjpyZW5hbWUoJ0NvZF9NdW4nID0gJ0PDs2RpZ28uRGFuZS5tdW5pY2lwaW8nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ29kX2RwdG8nPSAnQ8OzZGlnby5EYW5lLmRlcGFydGFtZW50bycsDQogICAgICAgICAgICAgICAgICAgICAgICAgJ0dydXBvX2N1bHRpdm8nID0gJ0dydXBvLmN1bHRpdm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdEZXNhZ3JlZ2FjaW9uX2N1bHRpdm8nID0gJ0Rlc2FncmVnYWNpw7NuLmN1bHRpdm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdZZWFyJyA9ICdBw7FvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQXJlYV9TZW1icmFkYScgPSAnw4FyZWEuc2VtYnJhZGEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdBcmVhX0Nvc2VjaGFkYScgPSAnw4FyZWEuY29zZWNoYWRhJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnUHJvZHVjY2lvbicgPSAnUHJvZHVjY2nDs24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdFc3RhZG8nID0gJ0VzdGFkby5mw61zaWNvLmRlbC5jdWx0aXZvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ2ljbG9fZGVsX2N1bHRpdm8nID0gJ0NpY2xvLmRlbC5jdWx0aXZvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ29kX2N1bHRpdm8nID0gJ0PDs2RpZ28uZGVsLmN1bHRpdm8nLCktPiBuZXdfZXZhDQpuZXdfZXZhDQpgYGANCiMjIzUuIERhdGEgYW5hbHlzaXMgDQpNYW55IGRhdGEgYW5hbHlzaXMgdGFza3MgY2FuIGJlIGFwcHJvYWNoZWQgdXNpbmcgdGhlIHNwbGl0LWFwcGx5LWNvbWJpbmUgcGFyYWRpZ206IHNwbGl0IHRoZSBkYXRhIGludG8gZ3JvdXBzLCBhcHBseSBzb21lIGFuYWx5c2lzIHRvIGVhY2ggZ3JvdXAsIGFuZCB0aGVuIGNvbWJpbmUgdGhlIHJlc3VsdHMuDQoNClRoZSBkcGx5ciBsaWJyYXJ5IG1ha2VzIHRoaXMgdmVyeSBlYXN5IHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgZ3JvdXBfYnkoKSBmdW5jdGlvbiwgd2hpY2ggc3BsaXRzIHRoZSBkYXRhIGludG8gZ3JvdXBzLiBXaGVuIHRoZSBkYXRhIGlzIGdyb3VwZWQgaW4gdGhpcyB3YXksIHN1bW1hcml6ZSgpIGNhbiBiZSB1c2VkIHRvIGNvbGxhcHNlIGVhY2ggZ3JvdXAgaW50byBhIHNpbmdsZS1yb3cgc3VtbWFyeS4gc3VtbWFyaXplKCkgZG9lcyB0aGlzIGJ5IGFwcGx5aW5nIGFuIGFnZ3JlZ2F0aW5nIG9yIHN1bW1hcnkgZnVuY3Rpb24gdG8gZWFjaCBncm91cC4NCg0KIyM1LjEgVGhlIG1vc3QgaW1wb3J0YW5jZSBjcm9wcyBiZXR3ZWVuIDIwMTkgYW5kIDIwMjMNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICAjI2ZpbHRlcihQcm9kdWNjaW9uID4gMCkgJT4lDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8pICU+JQ0KICBzdW1tYXJpemUodG90YWxfcHJvZHVjY2lvbiA9IHN1bShQcm9kdWNjaW9uKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZHVjY2lvbikpDQpgYGANClRoaXMgdGFibGUgc2hvd3MgdGhlIHRvdGFsIGNyb3AgcHJvZHVjdGlvbiBpbiB0aGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBmcm9tIDIwMTkgdG8gMjAyMy4gVGhlIG1vc3QgcHJvZHVjdGl2ZSBjcm9wcyBpbiB0aGF0IHBlcmlvZCBvZiB0aW1lIGluIENhcXVldMOhIHdlcmUgImN1bHRpdm9zIHRyb3BpY2FsZXMgdHJhZGljb25hbGVzIiBhbmQgImZydXRhbGVzIg0KDQpUaGVuIHdlIG11c3Qgc2F2ZSB0aGlzIHRhYmxlIGFzIGZvbGxvd3MNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwb19jdWx0aXZvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2R1Y2Npb24gPSBzdW0oUHJvZHVjY2lvbikpIC0+IFBUDQpgYGANCg0KVGhlIG5leHQgc3RlcCBpcyAgZmlsdGVyIHRoZSBtb3N0IGltcG9ydGFudCBjcm9wcy4gSW4gdGhlIGRlcGFydG1lbnQgb2YgQ2FxdWV0w6EsIHRoZSB0d28gY3JvcHMgd2l0aCB0aGUgaGlnaGVzdCBwcm9kdWN0aW9uIHJhbmdlIGZyb20gOTAsMDAwLiBTbyB3ZSdsbCBmaWx0ZXIgZnJvbSB0aGF0IG51bWJlcg0KDQpgYGB7cn0NClBUICU+JSANCiAgZmlsdGVyKHRvdGFsX3Byb2R1Y2Npb24gPiA5MDAwMCkgLT4gbWFpbi5ncm91cHMNCmBgYA0KDQpgYGB7cn0NCih2YWx1ZSA9IHN1bShtYWluLmdyb3VwcyR0b3RhbF9wcm9kdWNjaW9uKSkNCmBgYA0KTm93IHdlJ2xsIGNyZWF0ZSBhIHBpZSBjaGFydCBmcm9tIHRoZSBtYWluIGNyb3BzDQoNCmBgYHtyfQ0KbWFpbi5ncm91cHMkcGVyY2VudCA9IG1haW4uZ3JvdXBzJHRvdGFsX3Byb2R1Y2Npb24vdmFsdWUNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIEJhcnBsb3QNCmJwPC0gZ2dwbG90KG1haW4uZ3JvdXBzLCBhZXMoeD0iIiwgeT1wZXJjZW50LCBmaWxsPUdydXBvX2N1bHRpdm8pKSsNCmdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpDQojIFBpZWNoYXJ0DQpwaWUgPC0gYnAgKyBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApDQpgYGANCmBgYHtyfQ0KcGllDQpgYGANCiMjNS4yIE11bmljaXBhbGl0aWVzIHdpdGggaGlnaGVyIHByb2R1Y3Rpb24gZm9yIGV2ZXJ5IGdyb3VwIG9mIGNyb3BzDQoNCmBgYHtyfQ0KbmV3X2V2YSAlPiUNCiAgZ3JvdXBfYnkoR3J1cG9fY3VsdGl2bywgTXVuaWNpcGlvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZCkpDQpgYGANCg0KTm93LCB3ZSBhcmUgZ29pbmcgdG8gc2F2ZSB0aGUgb2JqZWN0IA0KDQpgYGB7cn0NCm5ld19ldmEgJT4lDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8sIE11bmljaXBpbykgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9wcm9kID0gc3VtKFByb2R1Y2Npb24sIG5hLnJtID0gVFJVRSkpICU+JQ0KICBzbGljZSh3aGljaC5tYXgodG90YWxfcHJvZCkpICAtPiBsZWFkZXJzDQpgYGANCmBgYHtyfQ0KbGVhZGVycw0KYGBgDQoNCk5vdywgd2UgYXJlIGdvaW5nIHRvIGZpbHRlciB0aGUgbW9zdCBpbXBvcnRhbnQgbXVuaWNpcGFsaXRpZXMgZnJvbSB0aGUgYWdyaWN1bHR1cmFsIHBvaW50IG9mIHZpZXcgYW5kIGxldOKAmXMgcGxvdCB0aGUgZmlsdGVyZWQgbGVhZGVycw0KDQpgYGB7cn0NCmxlYWRlcnMgJT4lIA0KICBmaWx0ZXIodG90YWxfcHJvZCA+IDUwMDAwKSAtPiBtYWluLmxlYWRlcnMNCmBgYA0KYGBge3J9DQojIEJhc2ljIGJhcnBsb3QNClRvcDwtZ2dwbG90KGRhdGE9bWFpbi5sZWFkZXJzLCBhZXMoeD1NdW5pY2lwaW8sIHk9dG90YWxfcHJvZCkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KVG9wDQpgYGANCiMjNS4zIER5bmFtaWNzIG9mIHRoZSBtdW5pY2lwYWxpdHkgd2l0aCB0aGUgaGlnaGVzdCBncm91cCBwcm9kdWN0aW9uIA0KDQpTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiB3YXMgdGhlIG11bmljaXBhbGl0eSB3aGVyZSB0aGUgaGlnaGVzdCBjcm9wIHByb2R1Y3Rpb24gd2FzIHJlcG9ydGVkLCBzbyB3ZSB3aWxsIG1ha2UgYSB2aXN1YWxpemF0aW9uIHRvIGtub3cgaG93IHRoZSBjcm9wcyBiZWhhdmUgaW4gdGhpcyBtdW5pY2lwYWxpdHkNCg0KYGBge3J9DQpuZXcgPC0gc2VsZWN0KG5ld19ldmEsIE11bmljaXBpbywgQ3VsdGl2bywgWWVhciwgUHJvZHVjY2lvbiwgUmVuZGltaWVudG8pDQpuZXcNCmBgYA0KYGBge3J9DQpuZXdfU1ZDIDwtIGZpbHRlcihuZXcsIE11bmljaXBpbyA9PSAiU2FuIFZpY2VudGUgZGVsIENhZ3XDoW4iKQ0KbmV3X1NWQw0KYGBgDQpUaGlzIHRhYmxlIHNob3dzIHRoZSBwcm9kdWN0aW9uIG9mIGFsbCBjcm9wcyB5ZWFyIGFmdGVyIHllYXIgaW4gdGhlIG11bmljaXBhbGl0eSwgYnV0IG5vdyB3ZSB3aWxsIHNlZSB3aGF0IGhhcyBiZWVuIHRoZSBoaWdoZXN0IGNyb3AgcHJvZHVjdGlvbiBwZXIgeWVhcg0KDQpgYGB7cn0NCm5ld19TVkMgJT4lDQogIGdyb3VwX2J5KFllYXIsIEN1bHRpdm8pICU+JQ0KICBzdW1tYXJpemUoUHJvZHVjY2lvbiA9IG1heChQcm9kdWNjaW9uLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgc2xpY2Uod2hpY2gubWF4KFByb2R1Y2Npb24pKSAtPiBIQw0KSEMNCmBgYA0KYGBge3J9DQojIHdlIHVzZSB0aGUgZ2dwbG90IDIgbGlicmFyeQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gSEMpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBDYcOxYSBbVG9uIHggMTAwMF0nKQ0KZyArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBDYW5lIENyb3AgUHJvZHVjdGlvbiBpbiBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiBmcm9tIDIwMTkgdG8gMjAyMyIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDI0KSIpDQpgYGANCg0KVGhlIGNyb3AgdGhhdCBoYXMgYmVlbiBtb3JlIHByb2R1Y2VkIGluIHRoZSBwZXJpb2Qgb2YgeWVhcnMgZnJvbSAyMDE5IHRvIDIwMjMgaGFzIGJlZW4gdGhlIGNyb3Agb2YgY2FuZSwgd2l0aCBhIHNpbWlsYXIgcHJvZHVjdGlvbiBpbiBhbGwgeWVhcnMuDQoNCiMjNS40IER5bmFtaWNzIG9mIG9uZSBpbXBvcnRhbnQgY3JvcCBiZXR3ZWVuIDIwMTkgYW5kIDIwMjMNCg0KTGV0J3MgYW5hbHl6ZSB0aGUgaGlnaGVzdCBjcm9wIHByb2R1Y3Rpb24gYnkgbXVuaWNpcGFsaXR5IGluIGFueSB5ZWFyDQoNCmBgYHtyfQ0KbmV3X2V2YSAlPiUgDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8sIE11bmljaXBpbywgWWVhcikgJT4lDQogIHN1bW1hcml6ZShQcm9kdWNjaW9uID0gbWF4KFByb2R1Y2Npb24sIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIHNsaWNlKHdoaWNoLm1heChQcm9kdWNjaW9uKSkgJT4lDQogICAgYXJyYW5nZShkZXNjKFByb2R1Y2Npb24pKSAtPiBNYXhfY3JvcA0KDQpNYXhfY3JvcA0KYGBgDQoNCkluIHRoZSBtdW5pY2lwYWxpdHkgb2YgU2FuIEpvc2UgZGVsIEZyYWd1YSwgdGhlIGhpZ2hlc3QgcHJvZHVjdGlvbiBvZiB0cmFkaXRpb25hbCB0cm9waWNhbCBjcm9wcyB3YXMgcmVwb3J0ZWQsIGF0IGxlYXN0IGluIDIwMjMuIFdlIHdpbGwgY29udGludWUgdG8gZXhwbG9yZSB0aGUgcHJvZHVjdGlvbiBvZiB0aGlzIG11bmljaXBhbGl0eSBpbiB0aGUgY3JvcCBncm91cCB3aXRoIHRoZSBoaWdoZXN0IGRlbWFuZCBhbW9uZyB0cmFkaXRpb25hbCB0cm9waWNhbCBjcm9wcw0KDQpgYGB7cn0NCm5ld19ldmEgJT4lIA0KICBmaWx0ZXIoTXVuaWNpcGlvPT0iU2FuIEpvc8OpIGRlbCBGcmFndWEiICYgQ3VsdGl2bz09IkNhw7FhIikgJT4lIA0KICBncm91cF9ieShZZWFyLCBDdWx0aXZvKSAlPiUNCiAgc2VsZWN0KE11bmljaXBpbywgQ3VsdGl2bywgUHJvZHVjY2lvbiwgWWVhcikgLT4gU0pGX0MNCg0KU0pGX0MNCmBgYA0KYGBge3J9DQojIHdlIHVzZSB0aGUgZ2dwbG90IDIgbGlicmFyeQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gU0pGX0MpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBDYcOxYSBbVG9uIHggMTAwMF0nKQ0KZyArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBDYW5lIENyb3AgUHJvZHVjdGlvbiBpbiBTYW4gSm9zw6kgZGVsIEZyYWd1YSBmcm9tIDIwMTkgdG8gMjAyMyIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDI0KSIpDQpgYGANCg0KSnVzdCBsaWtlIGluIFNhbiBWaWNlbnRlLCBpbiBTYW4gSm9zw6kgZGVsIEZyYWd1YSB0aGUgY3JvcCB3aXRoIHRoZSBoaWdoZXN0IHByb2R1Y3Rpb24gd2FzIHRoZSBjYW5lIG9yIHN1Z2FyY2FuZSwgYnV0IGluIHRoaXMgbXVuaWNpcGFsaXR5IHRoZXJlIHdhcyBhIGxvdyBwcm9kdWN0aW9uIGluIDIwMjIgYW5kIDIwMjEuDQoNCiMjIzYuIEFuYWx5c2lzIG9mIGFncmljdWx0dXJhbCBkeW5hbWljcw0KDQpUaGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBoYXMgYW4gYWdyaWN1bHR1cmFsIGZyb250aWVyIGFyZWEgb2YgMSw3MzUsNDYxIGhhLCB3aGljaCBjb3JyZXNwb25kcyB0byAxOSUgb2YgaXRzIHRlcnJpdG9yeSwgYW5kIGl0cyBuYXR1cmFsIGZvcmVzdHMgYW5kIGFncmljdWx0dXJhbCBhcmVhcyBvY2N1cHkgMjMuNSUgb2YgaXRzIHRlcnJpdG9yeSAoMiwxMTUsMTU5IGhhKSwgd2l0aCBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiBiZWluZyB0aGUgbXVuaWNpcGFsaXR5IHdpdGggdGhlIGxhcmdlc3QgYWdyaWN1bHR1cmFsIGZyb250aWVyIGFyZWEgKEZBIGFyZWE6IDMyNCw1ODUgaGEg4oCTIDE5JSkuICB0aGVyZWZvcmUsIGFzIHdlIHNhdyBpbiB0aGUgcHJldmlvdXMgZGF0YSB2aXN1YWxpemF0aW9uLCB0aGUgbXVuaWNpcGFsaXR5IG9mIFNhbiBWaWNlbnRlIGRlbCBDYWd1w6FuIHJlcHJlc2VudHMgdGhlIGxhcmdlc3QgYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gYXQgYSBnZW5lcmFsIGxldmVsIGluIHRoZSBkZXBhcnRtZW50LiBIb3dldmVyLCBhIGZhY3QgdGhhdCBpcyB3b3J0aCBoaWdobGlnaHRpbmcgaXMgdGhhdCB0aGlzIG11bmljaXBhbGl0eSwgZGVzcGl0ZSBiZWluZyB0aGUgbGFyZ2VzdCBhZ3JpY3VsdHVyYWwgcHJvZHVjZXIgaW4gdGhlIGRlcGFydG1lbnQsIGhhcyBsaXZlc3RvY2sgYXMgaXRzIG1haW4gZWNvbm9taWMgYWN0aXZpdHkuIA0KDQpUaGlzIGRlcGFydG1lbnQgaGFzIGEgaGlnaCBhcHRpdHVkZSBmb3IgdHJhZGl0aW9uYWwgdHJvcGljYWwgY3JvcHMgYW5kIGZydWl0IHRyZWVzLCB3aXRoIHN1Z2FyY2FuZSwgY2Fzc2F2YSwgY29ybiwgYmFuYW5hIGFuZCBwaW5lYXBwbGUgYmVpbmcgdGhlIG1haW4gY3JvcHMgb2YgdGhpcyByZWdpb24gYW5kICB0aGUgcHJpbmNpcGFsIGFncmljdWx0dXJhbCBlY29ub215IG9mIHRoZSBkZXBhcnRtZW50Lg0KDQpJbiB0aGUgcGFuZGVtaWMgc2Vhc29uICgyMDIwLTIwMjIpIHRoZXJlIHdhcyBhIGRlY3JlYXNlIGluIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uLCB2aXN1YWxpemVkIGluIHRoZSBkYXRhIHNwZWNpZmljYWxseSBmb3Igc3VnYXJjYW5lIGN1bHRpdmF0aW9uIGluIHRoZSBkZXBhcnRtZW50IG9mIFNhbiBKb3PDqSBkZWwgRnJhZ3VhLCBob3dldmVyLCBpbiAyMDIzIGFsbCBwcm9kdWN0aW9uIHdhcyBlZmZpY2llbnRseSByZWNvdmVyZWQsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgZGVwYXJ0bWVudCBoYXMgdmVyeSBnb29kIHJlc2lzdGFuY2UgYW5kIGFkYXB0YWJpbGl0eS4NCg0KVGhlIGRlcGFydG1lbnQgb2YgQ2FxdWV0w6EgaGFzIGEgaGlnaCBhZ3JpY3VsdHVyYWwgcG90ZW50aWFsLCB3aGljaCBoZWxwcyB0byBkcmF3IGEgaG9wZWZ1bCBwYW5vcmFtYSBpbiB0aGUgZmFjZSBvZiBzb2lsIHJlY292ZXJ5LCBmb29kIHNvdmVyZWlnbnR5IGFuZCBldmVuIHRoZSBlY29ub21pYyByZWNvdmVyeSBvZiB0aGUgY291bnRyeSwgaG93ZXZlciwgdGhlIGN1cnJlbnQgc2l0dWF0aW9uIGluIHdoaWNoIHRoaXMgZGVwYXJ0bWVudCBmaW5kcyBpdHNlbGYgaW4gdGVybXMgb2YgbGFuZCB1c2UgYW5kIGludGVybmFsIGNvbmZsaWN0IGxlYXZlcyB1cyB3aXRoIHRoZSB1bmtub3duIG9mIHdoYXQgd2UgYXJlIHJlYWxseSB0YWtpbmcgYWR2YW50YWdlIG9mIG9yIG5vdCB1c2luZyB0aGUgY291bnRyeSdzIHNvaWxzLiAgZ2VuZXJhdGluZyBhbiBpbnZpdGF0aW9uIHRvIHJlZGlyZWN0IGF0dGVudGlvbiB0byB0aGlzIHR5cGUgb2YgZGVwYXJ0bWVudHMgdGhhdCBoYXZlIGJlZW4gZm9yZ290dGVuIHBvbGl0aWNhbGx5LCBidXQgdGhhdCBoYXZlIHN1ZmZpY2llbnQgYWdyaWN1bHR1cmFsIHBvdGVudGlhbCB0byBwcm9tb3RlIGFuZCBzdHJlbmd0aGVuIHRoaXMgc2VjdG9yIGFuZCBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgY291bnRyeS4gDQoNCiMjIzYuIEFuYWx5c2lzIG9mIGFncmljdWx0dXJhbCBkeW5hbWljcyAoU3BhbmlzaCkNCg0KRWwgZGVwYXJ0YW1lbnRvIGRlbCBDYXF1ZXTDoSBjdWVudGEgY29uIHVuIMOhcmVhIGRlIGZyb250ZXJhIGFncsOtY29sYSBkZSAxLjczNS40NjEgaGEgbG8gcXVlIGNvcnJlc3BvbmRlIGFsIDE5JSBkZSBzdSB0ZXJyaXRvcmlvLCB5IGVuIHN1cyBib3NxdWVzIG5hdHVyYWxlcyB5IMOhcmVhcyBhZ3JvcGVjdWFyaWFzIG9jdXBhbiBlbCAyMy41JSBkZSBzdSB0ZXJyaXRvcmlvICgyLjExNS4xNTkgaGEpLCBzaWVuZG8gU2FuIFZpY2VudGUgZGVsIENhZ3XDoW4gZWwgbXVuaWNpcGlvIGNvbiBtYXlvciDDoXJlYSBkZSBmcm9udGVyYSBhZ3LDrWNvbGEgKMOBcmVhIGRlIEZBOiAzMjQuNTg1IGhhIOKAkyAxOSUpLCBwb3IgbG8gY3VhbCwgY29tbyB5YSB2aW1vcyBlbiBsYSB2aXN1YWxpemFjacOzbiBkZSBkYXRvcyBwcmV2aWEsIGVsIG11bmljaXBpbyBkZSBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiByZXByZXNlbnRhIGxhIG1heW9yIHByb2R1Y2Npw7NuIGFncsOtY29sYSBhIG5pdmVsIGdlbmVyYWwgZW4gZWwgZGVwYXJ0YW1lbnRvLiBTaW4gZW1iYXJnbywgdW4gZGF0byBxdWUgdmFsZSBsYSBwZW5hIHJlc2FsdGFyIGVzIHF1ZSBlc3RlIG11bmljaXBpbyBhIHBlc2FyIGRlIHNlciBlbCBtYXlvciBwcm9kdWN0b3IgYWdyw61jb2xhIGRlbCBkZXBhcnRhbWVudG8gdGllbmUgY29tbyBwcmluY2lwYWwgYWN0aXZpZGFkIGVjb27Ds21pY2EgbGEgZ2FuYWRlcsOtYS4gDQoNCkVzdGUgZGVwYXJ0YW1lbnRvIHByZXNlbnRhIHVuYSBhcHRpdHVkIGFsdGEgZnJlbnRlIGEgbG9zIGN1bHRpdm9zIHRyb3BpY2FsZXMgdHJhZGljaW9uYWxlcyB5IGZydXRhbGVzLCBzaWVuZG8gbGEgY2HDsWEsIGxhIHl1Y2EsIGVsIG1hw616LCBlbCBwbMOhdGFubyB5IGxhIHBpw7FhIGxvcyBjdWx0aXZvcyBwcmluY2lwYWxlcyBkZSBlc3RhIHJlZ2nDs24geSBiYWpvIGxvcyBjdWFsZXMgc2UgbXVldmUgbGEgZWNvbm9tw61hIGFncsOtY29sYSBkZWwgZGVwYXJ0YW1lbnRvLiANCg0KRW4gbGEgdGVtcG9yYWRhIGRlIHBhbmRlbWlhICgyMDIwLTIwMjIpIHNlIHByZXNlbnTDsyB1bmEgZGlzbWludWNpw7NuIGRlIHByb2R1Y2Npw7NuIGFncsOtY29sYSwgdmlzdWFsaXphZGEgZW4gbG9zIGRhdG9zIGVzcGVjw61maWNhbWVudGUgZGVsIGN1bHRpdm8gZGUgY2HDsWEgZW4gZWwgZGVwYXJ0YW1lbnRvIGRlIFNhbiBKb3PDqSBkZWwgRnJhZ3VhLCBzaW4gZW1iYXJnbywgZW4gZWwgMjAyMyBzZSByZWN1cGVyw7MgZWZpY2llbnRlbWVudGUgdG9kYSBsYSBwcm9kdWNjacOzbiwgbG8gY3VhbCBpbmRpY2EgcXVlIGVuIGVzdGUgZGVwYXJ0YW1lbnRvIHNlIHByZXNlbnRhIG11eSBidWVuYSByZXNpc3RlbmNpYSB5IGFkYXB0YWJpbGlkYWQuIA0KDQpFbCBkZXBhcnRhbWVudG8gZGVsIENhcXVldMOhIHRpZW5lIHVuIGFsdG8gcG90ZW5jaWFsIGFncsOtY29sYSwgZWwgY3VhbCBheXVkYSBhIGRpYnVqYXIgdW4gcGFub3JhbWEgZXNwZXJhbnphZG9yIGZyZW50ZSBhIGxhIHJlY3VwZXJhY2nDs24gZGUgc3VlbG9zLCBsYSBzb2JlcmFuw61hIGFsaW1lbnRhcmlhIGUgaW5jbHVzbyBsYSByZWN1cGVyYWNpw7NuIGVjb27Ds21pY2EgZGVsIHBhw61zLCBzaW4gZW1iYXJnbywgbGEgc2l0dWFjacOzbiBhY3R1YWwgZW4gbGEgcXVlIHNlIGVuY3VlbnRyYSBlc3RlIGRlcGFydGFtZW50byBlbiBjdWVzdGnDs24gZGUgdXNvIGRlIHN1ZWxvcyB5IGNvbmZsaWN0byBpbnRlcm5vIG5vcyBkZWphIGxhIGluY8OzZ25pdGEgZGUgZW4gcXXDqSBlc3RhbW9zIGFwcm92ZWNoYW5kbyBvIGRlc2Fwcm92ZWNoYW5kbyBsb3Mgc3VlbG9zIGRlbCBwYcOtcyByZWFsbWVudGUsIGdlbmVyYW5kbyB1bmEgaW52aXRhY2nDs24gcGFyYSByZWRpcmVjY2lvbmFyIGxhIGF0ZW5jacOzbiBhIGVzdGUgdGlwbyBkZSBkZXBhcnRhbWVudG9zIHF1ZSBoYW4gc2lkbyBvbHZpZGFkb3MgcG9sw610aWNhbWVudGUsIHBlcm8gcXVlIGN1ZW50YW4gY29uIGVsIHBvdGVuY2lhbCBhZ3LDrWNvbGEgc3VmaWNpZW50ZSBwYXJhIGltcHVsc2FyIHkgZm9ydGFsZWNlciBlc3RlIHNlY3RvciBjb250cmlidXllbmRvIGFzw60gYWwgZGVzYXJyb2xsbyBkZWwgcGHDrXMuIA0KDQojIyM3LiBCaWJsaW9ncmFwaHkNCi0gRXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMgbXVuaWNpcGFsZXMg4oCTIEVWQS4gQ2FsZW5kYXJpbyBEZXBhcnRhbWVudGFsIGRlIFNpZW1icmFzIHkgQ29zZWNoYXMgfCBEYXRvcyBBYmllcnRvcyBDb2xvbWJpYS4gKDIwMjMsIDcgbm92aWVtYnJlKS4gaHR0cHM6Ly93d3cuZGF0b3MuZ292LmNvL0FncmljdWx0dXJhLXktRGVzYXJyb2xsby1SdXJhbC9FdmFsdWFjaW9uZXMtQWdyb3BlY3Vhcmlhcy1NdW5pY2lwYWxlcy1FVkEtQ2FsZW5kYS9tNmJiLWsyaDQvYWJvdXRfZGF0YQ0KLSBMaXphcmF6bywgSS4sIDIwMjIuIFVuZGVyc3RhbmRpbmcgZHluYW1pYyBwcm9kdWN0aXZpdHkgb2YgY3JvcHMuIEF2YWlsYWJsZSBhdCBodHRwczovL3JwdWJzLmNvbS9pYWxzMnVuL3Byb2R1Y3Rpb25fZHluX3YxLg0KLSBVUFJBLigyMDIzKS5DYXF1ZXTDoSwgbWljcm/DoW5hbGlzaXMgZXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMtRVZBIFtQREYgZmlsZV1odHRwczovL3VwcmEuZ292LmNvL0tpdF9UZXJyaXRvcmlhbC8yLSUyMEluZm9ybWFjaSVDMyVCM24lMjBwb3IlMjBEZXBhcnRhbWVudG9zL0NBUVVFVCVDMyU4MS8zLSUyME1pY3JvYW4lQzMlQTFsaXNpcyUyMEV2YWx1YWNpb25lcyUyMGFncm9wZWN1YXJpYXMlMjAyMDIzLUNhcXVldGEucGRmDQotIFVQUkEuKDIwMjMpLlJlc3VsdGFkb3MgZXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMgMjAyMy5bUERGIGZpbGVdLmh0dHBzOi8vdXByYS5nb3YuY28vZXMtY28vRXZhc19Eb2N1bWVudG9zL1Jlc3VsdGFkb3MlMjBFdmFsdWFjaW9uZXMlMjBBZ3JvcGVjdWFyaWFzJTIwMjAyMy5wZGYNCg==