Introdução

A Agência Nacional das Águas (ANA) disponibiliza um banco de informações hidrológicas para as regiões hidrográficas brasileiras através do site hidroweb1. As informações são fornecidas no formato shapefile (extensão .shp). Na verdade, um shapefile está associado a um conjunto de arquivos (no mínimo 3). Os dados são divididos por regiões hidrográficas:

Nesse tutorial veremos como converter o conjunto de arquivos associados ao shapefile da hidrografia da região hidrográfica do Rio Uruguai (Bacia 7) para o formato KML para visualização no Google Earth. Arquivos KML são geralmente distribuídos como arquivos KMZ, que são arquivos KML zipados e com uma extensão .kmz.

Pré-requisitos

Este tutorial foi produzido com o software R através do RStudio em um desktop com linux ubuntu.

Para manipulação de dados espaciais existem bibliotecas (externas ao R) específicas que precisam ser instaladas. Essas bibliotecas são acessadas através do R por meio de pacotes. Um exemplo desse tipo de interface entre o R e uma biblioteca externa é o pacote rgdal que faz a interface com a biblioteca Geospatial Data Abstraction Library (GDAL) que possibilita realizar operações de transformação/projeção com a biblioteca PROJ.4. Então para usarmos o pacote rgdal é necessário a instalação das bibliotecas: proj-bin, libproj-dev, gdal-bin, libgdal1-dev. Elas podem ser instaladas digitando em um terminal linux ubuntu o comando abaixo.

# instala bibliotecas linux, adicione 'sudo' antes do comando abaixo para ter acesso como super usuário
apt-get install proj-bin libproj-dev gdal-bin libgdal1-dev

Para converter os arquivos associados ao shapefile utilizaremos a função KML() disponibilizada com o pacote raster. Para instalar um pacote no R, digite install.packages("nomeDoPacote").

# carregando pacotes 
library(raster)
library(sp)
library(rgdal)
rgdal: version: 1.1-10, (SVN revision 622)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 1.11.2, released 2015/02/10
 Path to GDAL shared files: /usr/share/gdal/1.11
 Loaded PROJ.4 runtime: Rel. 4.8.0, 6 March 2012, [PJ_VERSION: 480]
 Path to PROJ.4 shared files: (autodetected)
 Linking to sp version: 1.2-3 
# opção para não interpretar caracteres como factor (uma tipo de objeto do R especial para variáveis categóricas)
options(stringsAsFactors = TRUE)

Download de arquivo shapefile

Para baixar o arquivo compactado com as informações hidrológicas de uma região hidrográfica precisamos do código identificador da região. No caso da região hidrográfica do Rio Uruguai o identificador é o número 7.

# identificador da bacia hidrográfica (BH)
id_bh <- 7
# site do arquivo definido conforme nº identificador da BH
website <- "http://hidroweb.ana.gov.br/baixar/mapa/BaciaX.zip"
(website <- gsub("X", id_bh, website))
[1] "http://hidroweb.ana.gov.br/baixar/mapa/Bacia7.zip"
# nome e caminho para o arquivo que será baixado 
(zip_file <- paste0("data/", basename(website)))
[1] "data/Bacia7.zip"
# baixand arquico compactado
download.file(website, destfile = zip_file)
# diretório para descompactar
extract_dir <- gsub("\\.zip", "", zip_file)
extract_dir
[1] "data/Bacia7"
# descompactando arquivo
unzip(zip_file, exdir = extract_dir)

Lista dos arquivos shapefile da ANA baixados.

#lista dos shapefiles contidos no arquivo compactado
shapefiles_list <- list.files(extract_dir,
                              pattern = "shp$", 
                              recursive = TRUE, 
                              full.names = TRUE)
shapefiles_list
 [1] "data/Bacia7/Bacia 7.shp"                           
 [2] "data/Bacia7/Est_Fluviometricas_ANA_2010.shp"       
 [3] "data/Bacia7/Est_Fluviometricas_outras_ent_2010.shp"
 [4] "data/Bacia7/Est_Pluviometricas_ANA_2010.shp"       
 [5] "data/Bacia7/Est_Pluviometricas_outras_ent_2010.shp"
 [6] "data/Bacia7/Est_Qualidade_ANA_2010.shp"            
 [7] "data/Bacia7/Est_Qualidade_outras_ent_2010.shp"     
 [8] "data/Bacia7/Est_Sedimentos_ANA_2010.shp"           
 [9] "data/Bacia7/Est_Sedimentos_outras_ent_2010.shp"    
[10] "data/Bacia7/Est_Telemetricas_ANA_2010.shp"         
[11] "data/Bacia7/Est_Telemetricas_outras_ent_2010.shp"  
[12] "data/Bacia7/Hidrografia 1000000.shp"               
[13] "data/Bacia7/Hidrografia 2500000.shp"               
[14] "data/Bacia7/Municipios.shp"                        
[15] "data/Bacia7/Rodovias.shp"                          
[16] "data/Bacia7/Sedes municipais.shp"                  
[17] "data/Bacia7/Sub_bacias.shp"                        

Conversão do shapefile para KMZ

Vamos importar o arquivo shapefile e ver as diversas informações contidas nele:

# nome do shapefile com a rede drenagem da bacia de interesse
dren_file <- grep(x = shapefiles_list, 
                  pattern = "Hidrografia 1000000", 
                  value = TRUE)
dren_file
[1] "data/Bacia7/Hidrografia 1000000.shp"
# importando shapefile
dren <- shapefile(dren_file)
plot(dren, axes = TRUE, las = 1)

# primeiras linhas da tabela de dados do shapefile
head(dren@data)
ABCDEFGHIJ0123456789
 
 
COTRECHO
<int>
COCURSODAG
<chr>
COBACIA
<chr>
CORIO
<chr>
NUCOMPTREC
<dbl>
NUDISTBACT
<dbl>
NUDISTCDAG
<dbl>
NUAREACONT
<dbl>
0119193775499477549947754994_026.74249.200174.02
1119205775499277549927754992_022.23236.060134.21
2119232775496775496775496_054.82226.030472.32
3119330775489677548967754896_019.49239.46088.65
4119334775489877548987754898_022.48240.180117.04
5119338775696677569667756966_09.45136.48037.89
ncol(dren@data)
[1] 32

Nós não precisamos das 32 variáveis contidas na tabela de dados do shapefile. Quanto mais variáveis, maior será o tamanho do arquivo KMZ gerado. Então vamos selecionar somente algumas variáveis de interesse, como o nome do rio (NORIOCOMP), o código da bacia hidrográfica (COBACIA) e o do rio (CORIO). Essas informações poderão ser visualizadas no Google Earth ao clicar sobre o rio de interesse. Entretanto, nem todos rios possuem nomes definidos como pode ser visto pelos valores <NA> na coluna NORIOCOMP da tabela de dados acima.

#selecionando somente as variáveis de interesse no slot de dados do objeto dren (SpatialLinesDataFrame)  
dren@data <- subset(dren@data, sel = c("NORIOCOMP", "COBACIA", "CORIO"))
# projeção do shapefile da ANA
projection(dren)
[1] "+proj=longlat +ellps=aust_SA +no_defs"
# classe de dados espaciais
class(dren)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"

Antes de exportar o objeto dren para KML (ou KMZ) devemos primeiro reprojetá-lo para coordenadas geográficas Lat/Lon (sistema de coordenadas polares WGS84) usadas no Google Earth. A função spTransform() do pacote rgdal permite reprojetar objetos da classe SpatialLinesDataFrame para qualquer outra projeção. Ela usa a biblioteca PROJ.4 mencionada anteriormente. O pacote rgdal é a interface entre a biblioteca PROJ.4 e o R que permite realizar essa operação. O argumento CRSobjdeve receber uma expressão proj4. Expressões proj4 são strings que fornecem os parâmetros das projeções cartográficas2.

# definindo o a projeção de acordo com a do Google Earth
dren_ll <- spTransform(dren, CRSobj = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0")

Finalmente, exportamos os dados reprojetados para KMZ.

# gerando arquivo KML para visualização no google-earth
(kml_file <- gsub("X", id_bh, "data/drenX.kmz"))
[1] "data/dren7.kmz"
KML(x = dren_ll, 
    file = kml_file, 
    overwrite = TRUE)
# verificando existência do arquivo
file.exists(kml_file)
[1] TRUE

Agora, tendo o Google Earth instalado, podemos visualizar o arquivo KMZ da Hidrografia da região hidrográfica do Uruguai, clicando duas vezes sobre o ele.

Para gerar o arquivo KMZ para outras regiões é só repetir os procedimentos descritos acima, alterando id_bh de acordo com a região hidrográfica de interesse, ou seja, id_bh = 6 para região do Paraná e id_bh = 8 para região do Atlântico, Trecho Sudeste.

Informações da sessão R

sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.5 LTS

locale:
 [1] LC_CTYPE=en_US.UTF-8      
 [2] LC_NUMERIC=C              
 [3] LC_TIME=pt_BR.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=pt_BR.UTF-8   
 [6] LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=pt_BR.UTF-8      
 [8] LC_NAME=C                 
 [9] LC_ADDRESS=C              
[10] LC_TELEPHONE=C            
[11] LC_MEASUREMENT=pt_BR.UTF-8
[12] LC_IDENTIFICATION=C       

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

other attached packages:
[1] rgdal_1.1-10 raster_2.5-8 sp_1.2-3    

loaded via a namespace (and not attached):
[1] assertthat_0.1  formatR_1.4     tools_3.3.1    
[4] tibble_1.2      Rcpp_0.12.7     grid_3.3.1     
[7] knitr_1.14.4    lattice_0.20-34

  1. Para saber mais o conjunto de informações hidrológicas disponibilizadas pela ANA clique aqui

  2. Um local para para procurar por projeções é o site de referência espacial. Dessa base de dados podemos buscar qualquer referência espacial e obtê-la em praticamente qualquer formato, incluindo o formato das expressões proj4.

LS0tCnRpdGxlOiAiR2VyYcOnw6NvIGRlIEtNTCBhIHBhcnRpciBkZSAqc2hhcGVmaWxlKiBkYSBbQU5BXShodHRwOi8vd3d3LmFuYS5nb3YuYnIvKSIKYXV0aG9yOiAiSsO0bmF0YW4gVGF0c2NoIC0gVUZTTSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfaGVpZ2h0OiA2CiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIGNodW5jazAsIGVjaG8gPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNvbW1lbnQgPSAiIiwgIGZpZy5wYXRoID0gImZpZ3MvIikKI2dldHdkKCkKYGBgCgoKIyBJbnRyb2R1w6fDo28gCgpBIEFnw6puY2lhIE5hY2lvbmFsIGRhcyDDgWd1YXMgKFtBTkFdKGh0dHA6Ly93d3cuYW5hLmdvdi5ici8pKSBkaXNwb25pYmlsaXphIHVtIGJhbmNvIGRlIGluZm9ybWHDp8O1ZXMgaGlkcm9sw7NnaWNhcyBwYXJhIGFzIHJlZ2nDtWVzIGhpZHJvZ3LDoWZpY2FzIGJyYXNpbGVpcmFzIGF0cmF2w6lzIGRvIHNpdGUgW2hpZHJvd2ViXShodHRwOi8vaGlkcm93ZWIuYW5hLmdvdi5ici9IaWRyb1dlYi5hc3A/VG9jSXRlbT00MTAwKVteMV0uIEFzIGluZm9ybWHDp8O1ZXMgc8OjbyBmb3JuZWNpZGFzIG5vIGZvcm1hdG8gW3NoYXBlZmlsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hhcGVmaWxlKSAoZXh0ZW5zw6NvIGAuc2hwYCkuIE5hIHZlcmRhZGUsIHVtICpzaGFwZWZpbGUqIGVzdMOhIGFzc29jaWFkbyBhIHVtIGNvbmp1bnRvIGRlIGFycXVpdm9zIChubyBtw61uaW1vIDMpLiBPcyBkYWRvcyBzw6NvIGRpdmlkaWRvcyBwb3IgW3JlZ2nDtWVzIGhpZHJvZ3LDoWZpY2FzXShodHRwczovL3B0Lndpa2lwZWRpYS5vcmcvd2lraS9SZWdpJUMzJUI1ZXNfaGlkcm9nciVDMyVBMWZpY2FzX2RvX0JyYXNpbCk6CgotIEJhY2lhIDEgKFJpbyBBbWF6b25hcykKCi0gQmFjaWEgMiAoUmlvIFRvY2FudGlucykKCi0gQmFjaWEgMyAoQXRsw6JudGljbywgVHJlY2hvIE5vcnRlL05vcmRlc3RlKQoKLSBCYWNpYSA0IChSaW8gU8OjbyBGcmFuY2lzY28pCgotIEJhY2lhIDUgKEF0bMOibnRpY28sIFRyZWNobyBMZXN0ZSkKCi0gQmFjaWEgNiAoUmlvIFBhcmFuw6EpCgotIEJhY2lhIDcgKFJpbyBVcnVndWFpKQoKLSBCYWNpYSA4IChBdGzDom50aWNvLCBUcmVjaG8gU3VkZXN0ZSkKCk5lc3NlIHR1dG9yaWFsIHZlcmVtb3MgY29tbyBjb252ZXJ0ZXIgbyBjb25qdW50byBkZSBhcnF1aXZvcyBhc3NvY2lhZG9zIGFvICpzaGFwZWZpbGUqIGRhIGhpZHJvZ3JhZmlhIGRhIHJlZ2nDo28gaGlkcm9ncsOhZmljYSBkbyBSaW8gVXJ1Z3VhaSAoQmFjaWEgNykgcGFyYSBvIGZvcm1hdG8gW0tNTF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvS2V5aG9sZV9NYXJrdXBfTGFuZ3VhZ2UpIHBhcmEgdmlzdWFsaXphw6fDo28gbm8gW0dvb2dsZSBFYXJ0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR29vZ2xlX0VhcnRoKS4gQXJxdWl2b3MgS01MIHPDo28gZ2VyYWxtZW50ZSBkaXN0cmlidcOtZG9zIGNvbW8gYXJxdWl2b3MgS01aLCBxdWUgc8OjbyBhcnF1aXZvcyBLTUwgemlwYWRvcyBlIGNvbSB1bWEgZXh0ZW5zw6NvIGAua216YC4KCgo8L3N0eWxlPgo8ZGl2IGNsYXNzPSJtaWRjZW50ZXIiIHN0eWxlPSJtYXJnaW4tbGVmdDoyMDBweDsgbWFyZ2luLXRvcDo1MHB4OyI+CjxpbWcgc3JjPSJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzgvOGMvQnJhc2lsX0JhY2lhc19oaWRyb2dyYWZpY2FzLnN2Zy8zMDBweC1CcmFzaWxfQmFjaWFzX2hpZHJvZ3JhZmljYXMuc3ZnLnBuZyIgaGVpZ2h0PSIzMDBweCIgd2lkdGg9IjMwMHB4IiAvPgo8L2Rpdj4KCiMgUHLDqS1yZXF1aXNpdG9zCgpFc3RlIHR1dG9yaWFsIGZvaSBwcm9kdXppZG8gY29tIG8gc29mdHdhcmUgW1JdKGh0dHA6Ly93d3cuci1wcm9qZWN0Lm9yZy8pIGF0cmF2w6lzIGRvIFtSU3R1ZGlvXShodHRwOi8vd3d3LnJzdHVkaW8uY29tLykgZW0gdW0gZGVza3RvcCBjb20gbGludXggdWJ1bnR1LgoKUGFyYSBtYW5pcHVsYcOnw6NvIGRlIGRhZG9zIGVzcGFjaWFpcyBleGlzdGVtIGJpYmxpb3RlY2FzIChleHRlcm5hcyBhbyBSKSBlc3BlY8OtZmljYXMgcXVlIHByZWNpc2FtIHNlciBpbnN0YWxhZGFzLiBFc3NhcyBiaWJsaW90ZWNhcyBzw6NvIGFjZXNzYWRhcyBhdHJhdsOpcyBkbyBSIHBvciBtZWlvIGRlIHBhY290ZXMuIFVtIGV4ZW1wbG8gZGVzc2UgdGlwbyBkZSBpbnRlcmZhY2UgZW50cmUgbyBSIGUgdW1hIGJpYmxpb3RlY2EgZXh0ZXJuYSDDqSBvIHBhY290ZSBbcmdkYWxdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9yZ2RhbC9pbmRleC5odG1sKSBxdWUgZmF6IGEgaW50ZXJmYWNlIGNvbSBhIGJpYmxpb3RlY2EgKkdlb3NwYXRpYWwgRGF0YSBBYnN0cmFjdGlvbiBMaWJyYXJ5KiAoW0dEQUxdKGh0dHA6Ly93d3cuZ2RhbC5vcmcvKSkgcXVlIHBvc3NpYmlsaXRhIHJlYWxpemFyIG9wZXJhw6fDtWVzIGRlIHRyYW5zZm9ybWHDp8Ojby9wcm9qZcOnw6NvIGNvbSBhIGJpYmxpb3RlY2EgW1BST0ouNF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUFJPSi40KS4gRW50w6NvIHBhcmEgdXNhcm1vcyBvIHBhY290ZSBbcmdkYWxdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9yZ2RhbC9pbmRleC5odG1sKSDDqSBuZWNlc3PDoXJpbyBhIGluc3RhbGHDp8OjbyBkYXMgYmlibGlvdGVjYXM6IGBwcm9qLWJpbmAsIGBsaWJwcm9qLWRldmAsIGBnZGFsLWJpbmAsIGBsaWJnZGFsMS1kZXZgLiBFbGFzIHBvZGVtIHNlciBpbnN0YWxhZGFzIGRpZ2l0YW5kbyBlbSB1bSB0ZXJtaW5hbCBsaW51eCB1YnVudHUgbyBjb21hbmRvIGFiYWl4by4KCmBgYHtiYXNoLCBldmFsID0gRkFMU0V9CiMgaW5zdGFsYSBiaWJsaW90ZWNhcyBsaW51eCwgYWRpY2lvbmUgJ3N1ZG8nIGFudGVzIGRvIGNvbWFuZG8gYWJhaXhvIHBhcmEgdGVyIGFjZXNzbyBjb21vIHN1cGVyIHVzdcOhcmlvCmFwdC1nZXQgaW5zdGFsbCBwcm9qLWJpbiBsaWJwcm9qLWRldiBnZGFsLWJpbiBsaWJnZGFsMS1kZXYKYGBgCgpQYXJhIGNvbnZlcnRlciBvcyBhcnF1aXZvcyBhc3NvY2lhZG9zIGFvICpzaGFwZWZpbGUqIHV0aWxpemFyZW1vcyBhIGZ1bsOnw6NvIGBLTUwoKWAgZGlzcG9uaWJpbGl6YWRhIGNvbSBvIHBhY290ZSBbcmFzdGVyXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcmFzdGVyL2luZGV4Lmh0bWwpLiBQYXJhIGluc3RhbGFyIHVtIHBhY290ZSBubyBSLCBkaWdpdGUgYGluc3RhbGwucGFja2FnZXMoIm5vbWVEb1BhY290ZSIpYC4KCmBgYHtyIGNodW5jazEsIGVjaG89VFJVRX0KIyBjYXJyZWdhbmRvIHBhY290ZXMgCmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHNwKQpsaWJyYXJ5KHJnZGFsKQojIG9ww6fDo28gcGFyYSBuw6NvIGludGVycHJldGFyIGNhcmFjdGVyZXMgY29tbyBmYWN0b3IgKHVtYSB0aXBvIGRlIG9iamV0byBkbyBSIGVzcGVjaWFsIHBhcmEgdmFyacOhdmVpcyBjYXRlZ8OzcmljYXMpCm9wdGlvbnMoc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpCmBgYAoKIyAqRG93bmxvYWQqIGRlIGFycXVpdm8gKnNoYXBlZmlsZSoKClBhcmEgYmFpeGFyIG8gYXJxdWl2byBjb21wYWN0YWRvIGNvbSBhcyBpbmZvcm1hw6fDtWVzIGhpZHJvbMOzZ2ljYXMgZGUgdW1hIHJlZ2nDo28gaGlkcm9ncsOhZmljYSBwcmVjaXNhbW9zIGRvIGPDs2RpZ28gaWRlbnRpZmljYWRvciBkYSByZWdpw6NvLiBObyBjYXNvIGRhIHJlZ2nDo28gaGlkcm9ncsOhZmljYSBkbyBSaW8gVXJ1Z3VhaSBvIGlkZW50aWZpY2Fkb3Igw6kgbyBuw7ptZXJvIDcuCgpgYGB7ciBjaHVuY2syLCBlY2hvPVRSVUUsIGV2YWwgPSBUUlVFfQojIGlkZW50aWZpY2Fkb3IgZGEgYmFjaWEgaGlkcm9ncsOhZmljYSAoQkgpCmlkX2JoIDwtIDcKIyBzaXRlIGRvIGFycXVpdm8gZGVmaW5pZG8gY29uZm9ybWUgbsK6IGlkZW50aWZpY2Fkb3IgZGEgQkgKd2Vic2l0ZSA8LSAiaHR0cDovL2hpZHJvd2ViLmFuYS5nb3YuYnIvYmFpeGFyL21hcGEvQmFjaWFYLnppcCIKKHdlYnNpdGUgPC0gZ3N1YigiWCIsIGlkX2JoLCB3ZWJzaXRlKSkKIyBub21lIGUgY2FtaW5obyBwYXJhIG8gYXJxdWl2byBxdWUgc2Vyw6EgYmFpeGFkbyAKKHppcF9maWxlIDwtIHBhc3RlMCgiZGF0YS8iLCBiYXNlbmFtZSh3ZWJzaXRlKSkpCmBgYAoKYGBge3IgY2h1bmNrMywgZXZhbD1GQUxTRX0KIyBiYWl4YW5kIGFycXVpY28gY29tcGFjdGFkbwpkb3dubG9hZC5maWxlKHdlYnNpdGUsIGRlc3RmaWxlID0gemlwX2ZpbGUpCmBgYAoKYGBge3IgY2h1bmNrNH0KIyBkaXJldMOzcmlvIHBhcmEgZGVzY29tcGFjdGFyCmV4dHJhY3RfZGlyIDwtIGdzdWIoIlxcLnppcCIsICIiLCB6aXBfZmlsZSkKZXh0cmFjdF9kaXIKYGBgCgpgYGB7ciBjaHVuY2s1LCBldmFsPUZBTFNFfQojIGRlc2NvbXBhY3RhbmRvIGFycXVpdm8KdW56aXAoemlwX2ZpbGUsIGV4ZGlyID0gZXh0cmFjdF9kaXIpCmBgYAoKTGlzdGEgZG9zIGFycXVpdm9zIHNoYXBlZmlsZSBkYSBBTkEgYmFpeGFkb3MuCgpgYGB7ciBjaHVuY2s2fQojbGlzdGEgZG9zIHNoYXBlZmlsZXMgY29udGlkb3Mgbm8gYXJxdWl2byBjb21wYWN0YWRvCnNoYXBlZmlsZXNfbGlzdCA8LSBsaXN0LmZpbGVzKGV4dHJhY3RfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gInNocCQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGwubmFtZXMgPSBUUlVFKQpzaGFwZWZpbGVzX2xpc3QKYGBgCgojIENvbnZlcnPDo28gZG8gc2hhcGVmaWxlIHBhcmEgS01aCgpWYW1vcyBpbXBvcnRhciBvIGFycXVpdm8gc2hhcGVmaWxlIGUgdmVyIGFzIGRpdmVyc2FzIGluZm9ybWHDp8O1ZXMgY29udGlkYXMgbmVsZToKCmBgYHtyIGNodW5jazcsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9Nn0KIyBub21lIGRvIHNoYXBlZmlsZSBjb20gYSByZWRlIGRyZW5hZ2VtIGRhIGJhY2lhIGRlIGludGVyZXNzZQpkcmVuX2ZpbGUgPC0gZ3JlcCh4ID0gc2hhcGVmaWxlc19saXN0LCAKICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICJIaWRyb2dyYWZpYSAxMDAwMDAwIiwgCiAgICAgICAgICAgICAgICAgIHZhbHVlID0gVFJVRSkKZHJlbl9maWxlCiMgaW1wb3J0YW5kbyBzaGFwZWZpbGUKZHJlbiA8LSBzaGFwZWZpbGUoZHJlbl9maWxlKQpwbG90KGRyZW4sIGF4ZXMgPSBUUlVFLCBsYXMgPSAxKQpgYGAKCmBgYHtyIGNodW5jazcxLCBldmFsPVRSVUV9CiMgcHJpbWVpcmFzIGxpbmhhcyBkYSB0YWJlbGEgZGUgZGFkb3MgZG8gc2hhcGVmaWxlCmhlYWQoZHJlbkBkYXRhKQpuY29sKGRyZW5AZGF0YSkKYGBgCgpOw7NzIG7Do28gcHJlY2lzYW1vcyBkYXMgMzIgdmFyacOhdmVpcyBjb250aWRhcyBuYSB0YWJlbGEgZGUgZGFkb3MgZG8gKnNoYXBlZmlsZSouIFF1YW50byBtYWlzIHZhcmnDoXZlaXMsIG1haW9yIHNlcsOhIG8gdGFtYW5obyBkbyBhcnF1aXZvIEtNWiBnZXJhZG8uIEVudMOjbyB2YW1vcyBzZWxlY2lvbmFyIHNvbWVudGUgYWxndW1hcyB2YXJpw6F2ZWlzIGRlIGludGVyZXNzZSwgY29tbyBvIG5vbWUgZG8gcmlvIChgTk9SSU9DT01QYCksIG8gY8OzZGlnbyBkYSBiYWNpYSBoaWRyb2dyw6FmaWNhIChgQ09CQUNJQWApIGUgbyBkbyByaW8gKGBDT1JJT2ApLiBFc3NhcyBpbmZvcm1hw6fDtWVzIHBvZGVyw6NvIHNlciB2aXN1YWxpemFkYXMgbm8gKkdvb2dsZSBFYXJ0aCogYW8gY2xpY2FyIHNvYnJlIG8gcmlvIGRlIGludGVyZXNzZS4gRW50cmV0YW50bywgbmVtIHRvZG9zIHJpb3MgcG9zc3VlbSBub21lcyBkZWZpbmlkb3MgY29tbyBwb2RlIHNlciB2aXN0byBwZWxvcyB2YWxvcmVzIGA8TkE+YCBuYSBjb2x1bmEgYE5PUklPQ09NUGAgZGEgdGFiZWxhIGRlIGRhZG9zIGFjaW1hLgoKYGBge3IgY2h1bmNrOH0KI3NlbGVjaW9uYW5kbyBzb21lbnRlIGFzIHZhcmnDoXZlaXMgZGUgaW50ZXJlc3NlIG5vIHNsb3QgZGUgZGFkb3MgZG8gb2JqZXRvIGRyZW4gKFNwYXRpYWxMaW5lc0RhdGFGcmFtZSkgIApkcmVuQGRhdGEgPC0gc3Vic2V0KGRyZW5AZGF0YSwgc2VsID0gYygiTk9SSU9DT01QIiwgIkNPQkFDSUEiLCAiQ09SSU8iKSkKIyBwcm9qZcOnw6NvIGRvIHNoYXBlZmlsZSBkYSBBTkEKcHJvamVjdGlvbihkcmVuKQojIGNsYXNzZSBkZSBkYWRvcyBlc3BhY2lhaXMKY2xhc3MoZHJlbikKYGBgCgpBbnRlcyBkZSBleHBvcnRhciBvIG9iamV0byBgZHJlbmAgcGFyYSBLTUwgKG91IEtNWikgZGV2ZW1vcyBwcmltZWlybyByZXByb2pldMOhLWxvIHBhcmEgY29vcmRlbmFkYXMgZ2VvZ3LDoWZpY2FzIExhdC9Mb24gKHNpc3RlbWEgZGUgY29vcmRlbmFkYXMgcG9sYXJlcyBbV0dTODRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dvcmxkX0dlb2RldGljX1N5c3RlbSkpIHVzYWRhcyBubyAqR29vZ2xlIEVhcnRoKi4gQSBmdW7Dp8OjbyBgc3BUcmFuc2Zvcm0oKWAgZG8gcGFjb3RlIGByZ2RhbGAgcGVybWl0ZSByZXByb2pldGFyIG9iamV0b3MgZGEgY2xhc3NlIGBTcGF0aWFsTGluZXNEYXRhRnJhbWVgIHBhcmEgcXVhbHF1ZXIgb3V0cmEgcHJvamXDp8Ojby4gRWxhIHVzYSAgYSBiaWJsaW90ZWNhIGBQUk9KLjRgIG1lbmNpb25hZGEgYW50ZXJpb3JtZW50ZS4gTyBwYWNvdGUgYHJnZGFsYCDDqSBhIGludGVyZmFjZSBlbnRyZSBhIGJpYmxpb3RlY2EgYFBST0ouNGAgZSBvIFIgcXVlIHBlcm1pdGUgcmVhbGl6YXIgZXNzYSBvcGVyYcOnw6NvLiBPIGFyZ3VtZW50byBgQ1JTb2JqYGRldmUgcmVjZWJlciB1bWEgZXhwcmVzc8OjbyBgcHJvajRgLiBFeHByZXNzw7VlcyBgcHJvajRgIHPDo28gICpzdHJpbmdzKiBxdWUgZm9ybmVjZW0gb3MgcGFyw6JtZXRyb3MgZGFzIHByb2plw6fDtWVzIGNhcnRvZ3LDoWZpY2FzW14yXS4gCgpgYGB7ciBjaHVuY2s5fQojIGRlZmluaW5kbyBvIGEgcHJvamXDp8OjbyBkZSBhY29yZG8gY29tIGEgZG8gR29vZ2xlIEVhcnRoCmRyZW5fbGwgPC0gc3BUcmFuc2Zvcm0oZHJlbiwgQ1JTb2JqID0gIitwcm9qPWxvbmdsYXQgK2VsbHBzPVdHUzg0ICtkYXR1bT1XR1M4NCArbm9fZGVmcyArdG93Z3M4ND0wLDAsMCIpCmBgYAoKRmluYWxtZW50ZSwgZXhwb3J0YW1vcyBvcyBkYWRvcyByZXByb2pldGFkb3MgcGFyYSBLTVouCgpgYGB7ciBjaHVuY2sxMH0KIyBnZXJhbmRvIGFycXVpdm8gS01MIHBhcmEgdmlzdWFsaXphw6fDo28gbm8gZ29vZ2xlLWVhcnRoCihrbWxfZmlsZSA8LSBnc3ViKCJYIiwgaWRfYmgsICJkYXRhL2RyZW5YLmtteiIpKQpLTUwoeCA9IGRyZW5fbGwsIAogICAgZmlsZSA9IGttbF9maWxlLCAKICAgIG92ZXJ3cml0ZSA9IFRSVUUpCiMgdmVyaWZpY2FuZG8gZXhpc3TDqm5jaWEgZG8gYXJxdWl2bwpmaWxlLmV4aXN0cyhrbWxfZmlsZSkKYGBgCgoKQWdvcmEsIHRlbmRvIG8gKkdvb2dsZSBFYXJ0aCogaW5zdGFsYWRvLCBwb2RlbW9zIHZpc3VhbGl6YXIgbyBhcnF1aXZvIEtNWiBkYSBIaWRyb2dyYWZpYSBkYSByZWdpw6NvIGhpZHJvZ3LDoWZpY2EgZG8gVXJ1Z3VhaSwgY2xpY2FuZG8gZHVhcyB2ZXplcyBzb2JyZSBvIGVsZS4gCgpQYXJhIGdlcmFyIG8gYXJxdWl2byBLTVogcGFyYSBvdXRyYXMgcmVnacO1ZXMgw6kgc8OzIHJlcGV0aXIgb3MgcHJvY2VkaW1lbnRvcyBkZXNjcml0b3MgYWNpbWEsIGFsdGVyYW5kbyBgaWRfYmhgIGRlIGFjb3JkbyBjb20gYSByZWdpw6NvIGhpZHJvZ3LDoWZpY2EgZGUgaW50ZXJlc3NlLCBvdSBzZWphLCBgaWRfYmggPSA2YCBwYXJhIHJlZ2nDo28gZG8gUGFyYW7DoSBlIGBpZF9iaCA9IDhgIHBhcmEgcmVnacOjbyBkbyBBdGzDom50aWNvLCBUcmVjaG8gU3VkZXN0ZS4KCiMgSW5mb3JtYcOnw7VlcyBkYSBzZXNzw6NvIFIKCmBgYHtyIENodW5jazExLCBlY2hvID0gVFJVRSwgZXZhbD1UUlVFfQpzZXNzaW9uSW5mbygpCmBgYAoKW14xXTogUGFyYSBzYWJlciBtYWlzIG8gY29uanVudG8gZGUgaW5mb3JtYcOnw7VlcyBoaWRyb2zDs2dpY2FzIGRpc3BvbmliaWxpemFkYXMgcGVsYSBBTkEgY2xpcXVlIFthcXVpXShodHRwOi8vd3d3Mi5hbmEuZ292LmJyL1BhZ2luYXMvc2Vydmljb3MvaW5mb3JtYWNvZXNoaWRyb2xvZ2ljYXMvcmVkZWhpZHJvLmFzcHgpCgpbXjJdOiBVbSBsb2NhbCBwYXJhIHBhcmEgcHJvY3VyYXIgcG9yIHByb2plw6fDtWVzIMOpIG8gW3NpdGUgZGUgcmVmZXLDqm5jaWEgZXNwYWNpYWxdKGh0dHA6Ly9zcGF0aWFscmVmZXJlbmNlLm9yZy9yZWYvc3Itb3JnLz9wYWdlPTEpLiBEZXNzYSBiYXNlIGRlIGRhZG9zIHBvZGVtb3MgYnVzY2FyIHF1YWxxdWVyIHJlZmVyw6puY2lhIGVzcGFjaWFsIGUgb2J0w6otbGEgZW0gcHJhdGljYW1lbnRlIHF1YWxxdWVyIGZvcm1hdG8sIGluY2x1aW5kbyBvIGZvcm1hdG8gZGFzIGV4cHJlc3PDtWVzIGBwcm9qNGAuCg==