# Create a clipboard button on the rendered HTML page
source(here::here("clipboard.R")); clipboard
# Set seed for reproducibility
set.seed(1982) 
# Set global options for all code chunks
knitr::opts_chunk$set(
  # Disable messages printed by R code chunks
  message = FALSE,    
  # Disable warnings printed by R code chunks
  warning = FALSE,    
  # Show R code within code chunks in output
  echo = TRUE,        
  # Include both R code and its results in output
  include = TRUE,     
  # Evaluate R code chunks
  eval = TRUE,       
  # Enable caching of R code chunks for faster rendering
  cache = FALSE,      
  # Align figures in the center of the output
  fig.align = "center",
  # Enable retina display for high-resolution figures
  retina = 2,
  # Show errors in the output instead of stopping rendering
  error = TRUE,
  # Do not collapse code and output into a single block
  collapse = FALSE
)
# Start the figure counter
fig_count <- 0
# Define the captioner function
captioner <- function(caption) {
  fig_count <<- fig_count + 1
  paste0("Figure ", fig_count, ": ", caption)
}
library(sf)
library(tmap)
library(mapview)
# set mapview options
mapviewOptions(basemaps = c("OpenStreetMap",
                            "Esri.WorldImagery",
                            "OpenTopoMap"))

source("jobbers/custom_bounding_box.R")

1 Introduction

Let us first show the area of interest. I show it at the four available levels: country, province, canton, and parish. The data is from the GADM project, which provides high-resolution maps of administrative areas worldwide.

Here are the specific steps:

  • Go to this website
  • In the search bar, type Ecuador
  • Click on the “Geopackage” hyperlink
  • This will download a file named gadm41_ECU.gpkg
  • This is a file with several layers, each representing a different administrative level
  • If you do st_layers("gadm41_ECU.gpkg"), you will see the available layers, which are ADM_ADM_0, ADM_ADM_1, ADM_ADM_2, and ADM_ADM_3. These correspond to country, province, canton, and parish, respectively.

2 Data manipulation

Here are the steps I follow to obtain the files below (see this script for more details):

  • Read the layers from the gadm41_ECU.gpkg file
  • Get the polygon that represents the mainland of Ecuador. With that polygon at hand, filter the layers to keep only the features that are inside the mainland polygon. That way islands (even The Galapagos) and other features that are not part of the mainland are removed. I did this because at the moment I wanted to do the analysis on the entire mainland of Ecuador.
  • But then I realized that is not doable, so I created a custom polygon that delimits the area of interest. This polygon is defined by the coordinates of the four corners: Northeast, Southeast, Southwest, and Northwest. The coordinates are defined in this file.

Note: The area of interest is delimited by the coordinates defined in this file. The corresponding sf object is stored here. However, a more adequate area for future analysis can be found here. This area is not a box but a polygon that follows the administrative boundaries of the country.


  • With the custom polygon at hand, I crop the layers to keep only the features that are inside the custom polygon. This is done using the st_intersection() function from the sf package.
# read the files
gadm41_ECU_country <- readRDS("clean_data/gadm41_ECU_country_custom.RDS")
gadm41_ECU_provinces <- readRDS("clean_data/gadm41_ECU_province_custom.RDS")
gadm41_ECU_cantons <- readRDS("clean_data/gadm41_ECU_canton_custom.RDS")
gadm41_ECU_parishes <- readRDS("clean_data/gadm41_ECU_parish_custom.RDS")

3 Visualization of the area of interest

I choose the following polygon to delimit the area of interest. The polygon is defined by the coordinates of the four corners: Northeast, Southeast, Southwest, and Northwest.

coords <- rbind(NE, SE, SW, NW, NE) # from source("jobbers/custom_bounding_box.R")
crop_polygon <- st_polygon(list(coords)) %>% 
  st_sfc(crs = st_crs(gadm41_ECU_country)) # match CRS of your data
crop_polygon_sf <- st_sf(geom = crop_polygon)
mapview::mapview(crop_polygon_sf,
                 alpha.regions = 0.4,    # fill transparency
                 color = "black",        # border color
                 alpha = 1,            # border transparency
                 legend = FALSE)

3.1 At the country level

mapview(
  gadm41_ECU_country,
  zcol = "COUNTRY",        # attribute used for fill
  alpha.regions = 0.4,    # fill transparency
  color = "black",        # border color
  alpha = 1,            # border transparency
  legend = FALSE           # remove legend
)

3.2 At the province level

mapview(
  gadm41_ECU_provinces,
  zcol = "NAME_1",        # attribute used for fill
  alpha.regions = 0.4,    # fill transparency
  color = "black",        # border color
  alpha = 1,            # border transparency
  legend = FALSE           # remove legend
)

3.3 At the canton level

mapview(
  gadm41_ECU_cantons,
  zcol = "NAME_2",        # attribute used for fill
  alpha.regions = 0.4,    # fill transparency
  color = "black",        # border color
  alpha = 1,            # border transparency
  legend = FALSE           # remove legend
)

3.4 At the parish level

mapview(
  gadm41_ECU_parishes,
  zcol = "NAME_3",        # attribute used for fill
  alpha.regions = 0.4,    # fill transparency
  color = "black",        # border color
  alpha = 1,            # border transparency
  legend = FALSE           # remove legend
)

4 References

grateful::cite_packages(output = "paragraph", out.dir = ".")

We used R version 4.5.0 (R Core Team 2025) and the following R packages: here v. 1.0.1 (Müller 2020), htmltools v. 0.5.8.1 (Cheng et al. 2024), knitr v. 1.50 (Xie 2014, 2015, 2025), mapview v. 2.11.2 (Appelhans et al. 2023), osmextract v. 0.5.3 (Gilardi and Lovelace 2025), plotly v. 4.11.0 (Sievert 2020), renv v. 1.1.5 (Ushey and Wickham 2025), rmarkdown v. 2.29 (Xie, Allaire, and Grolemund 2018; Xie, Dervieux, and Riederer 2020; Allaire et al. 2024), sf v. 1.0.21 (Pebesma 2018; Pebesma and Bivand 2023), tidyverse v. 2.0.0 (Wickham et al. 2019), tmap v. 4.1 (Tennekes 2018), xaringanExtra v. 0.8.0 (Aden-Buie and Warkentin 2024).

Aden-Buie, Garrick, and Matthew T. Warkentin. 2024. xaringanExtra: Extras and Extensions for xaringan Slides. https://doi.org/10.32614/CRAN.package.xaringanExtra.
Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, et al. 2024. rmarkdown: Dynamic Documents for r. https://github.com/rstudio/rmarkdown.
Appelhans, Tim, Florian Detsch, Christoph Reudenbach, and Stefan Woellauer. 2023. mapview: Interactive Viewing of Spatial Data in r. https://github.com/r-spatial/mapview.
Cheng, Joe, Carson Sievert, Barret Schloerke, Winston Chang, Yihui Xie, and Jeff Allen. 2024. htmltools: Tools for HTML. https://github.com/rstudio/htmltools.
Gilardi, Andrea, and Robin Lovelace. 2025. osmextract: Download and Import Open Street Map Data Extracts. https://docs.ropensci.org/osmextract/.
Müller, Kirill. 2020. here: A Simpler Way to Find Your Files. https://doi.org/10.32614/CRAN.package.here.
Pebesma, Edzer. 2018. Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.
Pebesma, Edzer, and Roger Bivand. 2023. Spatial Data Science: With applications in R. Chapman and Hall/CRC. https://doi.org/10.1201/9780429459016.
R Core Team. 2025. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Sievert, Carson. 2020. Interactive Web-Based Data Visualization with r, Plotly, and Shiny. Chapman; Hall/CRC. https://plotly-r.com.
Tennekes, Martijn. 2018. tmap: Thematic Maps in R.” Journal of Statistical Software 84 (6): 1–39. https://doi.org/10.18637/jss.v084.i06.
Ushey, Kevin, and Hadley Wickham. 2025. renv: Project Environments. https://rstudio.github.io/renv/.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Xie, Yihui. 2014. knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2025. knitr: A General-Purpose Package for Dynamic Report Generation in R. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
LS0tCnRpdGxlOiAiQWRtaW5pc3RyYXRpdmUgVW5pdHMiCmRhdGU6ICJMYXN0IG1vZGlmaWVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZLicpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBtYXRoamF4OiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9tYXRoamF4QDMvZXM1L3RleC1tbWwtY2h0bWwuanMiCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiAgICB0aGVtZTogZmxhdGx5CiAgICBjb2RlX2ZvbGRpbmc6IHNob3cgIyBjbGFzcy5zb3VyY2UgPSAiZm9sZC1oaWRlIiB0byBoaWRlIGNvZGUgYW5kIGFkZCBhIGJ1dHRvbiB0byBzaG93IGl0CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY3NzOiB2aXN1YWwuY3NzCmFsd2F5c19hbGxvd19odG1sOiB0cnVlCmJpYmxpb2dyYXBoeTogCiAgLSByZWZlcmVuY2VzLmJpYgogIC0gZ3JhdGVmdWwtcmVmcy5iaWIKLS0tCgpgYGB7cn0KIyBDcmVhdGUgYSBjbGlwYm9hcmQgYnV0dG9uIG9uIHRoZSByZW5kZXJlZCBIVE1MIHBhZ2UKc291cmNlKGhlcmU6OmhlcmUoImNsaXBib2FyZC5SIikpOyBjbGlwYm9hcmQKIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDE5ODIpIAojIFNldCBnbG9iYWwgb3B0aW9ucyBmb3IgYWxsIGNvZGUgY2h1bmtzCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAjIERpc2FibGUgbWVzc2FnZXMgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAKICAjIERpc2FibGUgd2FybmluZ3MgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAKICAjIFNob3cgUiBjb2RlIHdpdGhpbiBjb2RlIGNodW5rcyBpbiBvdXRwdXQKICBlY2hvID0gVFJVRSwgICAgICAgIAogICMgSW5jbHVkZSBib3RoIFIgY29kZSBhbmQgaXRzIHJlc3VsdHMgaW4gb3V0cHV0CiAgaW5jbHVkZSA9IFRSVUUsICAgICAKICAjIEV2YWx1YXRlIFIgY29kZSBjaHVua3MKICBldmFsID0gVFJVRSwgICAgICAgCiAgIyBFbmFibGUgY2FjaGluZyBvZiBSIGNvZGUgY2h1bmtzIGZvciBmYXN0ZXIgcmVuZGVyaW5nCiAgY2FjaGUgPSBGQUxTRSwgICAgICAKICAjIEFsaWduIGZpZ3VyZXMgaW4gdGhlIGNlbnRlciBvZiB0aGUgb3V0cHV0CiAgZmlnLmFsaWduID0gImNlbnRlciIsCiAgIyBFbmFibGUgcmV0aW5hIGRpc3BsYXkgZm9yIGhpZ2gtcmVzb2x1dGlvbiBmaWd1cmVzCiAgcmV0aW5hID0gMiwKICAjIFNob3cgZXJyb3JzIGluIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiBzdG9wcGluZyByZW5kZXJpbmcKICBlcnJvciA9IFRSVUUsCiAgIyBEbyBub3QgY29sbGFwc2UgY29kZSBhbmQgb3V0cHV0IGludG8gYSBzaW5nbGUgYmxvY2sKICBjb2xsYXBzZSA9IEZBTFNFCikKIyBTdGFydCB0aGUgZmlndXJlIGNvdW50ZXIKZmlnX2NvdW50IDwtIDAKIyBEZWZpbmUgdGhlIGNhcHRpb25lciBmdW5jdGlvbgpjYXB0aW9uZXIgPC0gZnVuY3Rpb24oY2FwdGlvbikgewogIGZpZ19jb3VudCA8PC0gZmlnX2NvdW50ICsgMQogIHBhc3RlMCgiRmlndXJlICIsIGZpZ19jb3VudCwgIjogIiwgY2FwdGlvbikKfQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHRtYXApCmxpYnJhcnkobWFwdmlldykKIyBzZXQgbWFwdmlldyBvcHRpb25zCm1hcHZpZXdPcHRpb25zKGJhc2VtYXBzID0gYygiT3BlblN0cmVldE1hcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXNyaS5Xb3JsZEltYWdlcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9wZW5Ub3BvTWFwIikpCgpzb3VyY2UoImpvYmJlcnMvY3VzdG9tX2JvdW5kaW5nX2JveC5SIikKYGBgCgoKIyBJbnRyb2R1Y3Rpb24KCkxldCB1cyBmaXJzdCBzaG93IHRoZSBhcmVhIG9mIGludGVyZXN0LiBJIHNob3cgaXQgYXQgdGhlIGZvdXIgYXZhaWxhYmxlIGxldmVsczogY291bnRyeSwgcHJvdmluY2UsIGNhbnRvbiwgYW5kIHBhcmlzaC4gVGhlIGRhdGEgaXMgZnJvbSB0aGUgW0dBRE1dKGh0dHBzOi8vZ2FkbS5vcmcvKSBwcm9qZWN0LCB3aGljaCBwcm92aWRlcyBoaWdoLXJlc29sdXRpb24gbWFwcyBvZiBhZG1pbmlzdHJhdGl2ZSBhcmVhcyB3b3JsZHdpZGUuCgpIZXJlIGFyZSB0aGUgc3BlY2lmaWMgc3RlcHM6CgotIEdvIHRvIHRoaXMgW3dlYnNpdGVdKGh0dHBzOi8vZ2FkbS5vcmcvZG93bmxvYWRfY291bnRyeS5odG1sKQotIEluIHRoZSBzZWFyY2ggYmFyLCB0eXBlIEVjdWFkb3IKLSBDbGljayBvbiB0aGUgIkdlb3BhY2thZ2UiIGh5cGVybGluawotIFRoaXMgd2lsbCBkb3dubG9hZCBhIGZpbGUgbmFtZWQgYGdhZG00MV9FQ1UuZ3BrZ2AKLSBUaGlzIGlzIGEgZmlsZSB3aXRoIHNldmVyYWwgbGF5ZXJzLCBlYWNoIHJlcHJlc2VudGluZyBhIGRpZmZlcmVudCBhZG1pbmlzdHJhdGl2ZSBsZXZlbAotIElmIHlvdSBkbyBgc3RfbGF5ZXJzKCJnYWRtNDFfRUNVLmdwa2ciKWAsIHlvdSB3aWxsIHNlZSB0aGUgYXZhaWxhYmxlIGxheWVycywgd2hpY2ggYXJlIGBBRE1fQURNXzBgLCBgQURNX0FETV8xYCwgYEFETV9BRE1fMmAsIGFuZCBgQURNX0FETV8zYC4gVGhlc2UgY29ycmVzcG9uZCB0byBjb3VudHJ5LCBwcm92aW5jZSwgY2FudG9uLCBhbmQgcGFyaXNoLCByZXNwZWN0aXZlbHkuCgojIERhdGEgbWFuaXB1bGF0aW9uCgpIZXJlIGFyZSB0aGUgc3RlcHMgSSBmb2xsb3cgdG8gb2J0YWluIHRoZSBmaWxlcyBiZWxvdyAoc2VlIHRoaXMgW3NjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2xlbmlucmFmYWVscmllcmFzZWd1cmEvbWFuYWJpL2Jsb2IvbWFpbi9hZG1pbmlzdHJhdGl2ZV91bml0cy5SKSBmb3IgbW9yZSBkZXRhaWxzKToKCi0gUmVhZCB0aGUgbGF5ZXJzIGZyb20gdGhlIGBnYWRtNDFfRUNVLmdwa2dgIGZpbGUKLSBHZXQgdGhlIHBvbHlnb24gdGhhdCByZXByZXNlbnRzIHRoZSBtYWlubGFuZCBvZiBFY3VhZG9yLiBXaXRoIHRoYXQgcG9seWdvbiBhdCBoYW5kLCBmaWx0ZXIgdGhlIGxheWVycyB0byBrZWVwIG9ubHkgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluc2lkZSB0aGUgbWFpbmxhbmQgcG9seWdvbi4gVGhhdCB3YXkgaXNsYW5kcyAoZXZlbiBUaGUgR2FsYXBhZ29zKSBhbmQgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW5sYW5kIGFyZSByZW1vdmVkLiBgSSBkaWQgdGhpcyBiZWNhdXNlIGF0IHRoZSBtb21lbnQgSSB3YW50ZWQgdG8gZG8gdGhlIGFuYWx5c2lzIG9uIHRoZSBlbnRpcmUgbWFpbmxhbmQgb2YgRWN1YWRvci5gCi0gQnV0IHRoZW4gSSByZWFsaXplZCB0aGF0IGlzIG5vdCBkb2FibGUsIHNvIEkgY3JlYXRlZCBhIGN1c3RvbSBwb2x5Z29uIHRoYXQgZGVsaW1pdHMgdGhlIGFyZWEgb2YgaW50ZXJlc3QuIFRoaXMgcG9seWdvbiBpcyBkZWZpbmVkIGJ5IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZm91ciBjb3JuZXJzOiBOb3J0aGVhc3QsIFNvdXRoZWFzdCwgU291dGh3ZXN0LCBhbmQgTm9ydGh3ZXN0LiBUaGUgY29vcmRpbmF0ZXMgYXJlIGRlZmluZWQgaW4gdGhpcyBbZmlsZV0oaHR0cHM6Ly9naXRodWIuY29tL2xlbmlucmFmYWVscmllcmFzZWd1cmEvbWFuYWJpL2Jsb2IvbWFpbi9qb2JiZXJzL2N1c3RvbV9ib3VuZGluZ19ib3guUikuIAoKCi0tLQoKTm90ZTogVGhlIGFyZWEgb2YgaW50ZXJlc3QgaXMgZGVsaW1pdGVkIGJ5IHRoZSBjb29yZGluYXRlcyBkZWZpbmVkIGluIHRoaXMgW2ZpbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZW5pbnJhZmFlbHJpZXJhc2VndXJhL21hbmFiaS9ibG9iL21haW4vam9iYmVycy9jdXN0b21fYm91bmRpbmdfYm94LlIpLiBUaGUgY29ycmVzcG9uZGluZyBgc2ZgIG9iamVjdCBpcyBzdG9yZWQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZW5pbnJhZmFlbHJpZXJhc2VndXJhL21hbmFiaS9ibG9iL21haW4vY2xlYW5fZGF0YS9tYW5hYmlfYmJveF9jdXN0b20uUkRTKS4gSG93ZXZlciwgYSBtb3JlIGFkZXF1YXRlIGFyZWEgZm9yIGZ1dHVyZSBhbmFseXNpcyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZW5pbnJhZmFlbHJpZXJhc2VndXJhL21hbmFiaS9ibG9iL21haW4vY2xlYW5fZGF0YS9tYW5hYmlfYXJlYV9zaW1wbGUuUkRTKS4gVGhpcyBhcmVhIGlzIG5vdCBhIGJveCBidXQgYSBwb2x5Z29uIHRoYXQgZm9sbG93cyB0aGUgYWRtaW5pc3RyYXRpdmUgYm91bmRhcmllcyBvZiB0aGUgY291bnRyeS4KCi0tLQoKLSBXaXRoIHRoZSBjdXN0b20gcG9seWdvbiBhdCBoYW5kLCBJIGNyb3AgdGhlIGxheWVycyB0byBrZWVwIG9ubHkgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluc2lkZSB0aGUgY3VzdG9tIHBvbHlnb24uIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgYHN0X2ludGVyc2VjdGlvbigpYCBmdW5jdGlvbiBmcm9tIHRoZSBgc2ZgIHBhY2thZ2UuCgoKYGBge3J9CiMgcmVhZCB0aGUgZmlsZXMKZ2FkbTQxX0VDVV9jb3VudHJ5IDwtIHJlYWRSRFMoImNsZWFuX2RhdGEvZ2FkbTQxX0VDVV9jb3VudHJ5X2N1c3RvbS5SRFMiKQpnYWRtNDFfRUNVX3Byb3ZpbmNlcyA8LSByZWFkUkRTKCJjbGVhbl9kYXRhL2dhZG00MV9FQ1VfcHJvdmluY2VfY3VzdG9tLlJEUyIpCmdhZG00MV9FQ1VfY2FudG9ucyA8LSByZWFkUkRTKCJjbGVhbl9kYXRhL2dhZG00MV9FQ1VfY2FudG9uX2N1c3RvbS5SRFMiKQpnYWRtNDFfRUNVX3BhcmlzaGVzIDwtIHJlYWRSRFMoImNsZWFuX2RhdGEvZ2FkbTQxX0VDVV9wYXJpc2hfY3VzdG9tLlJEUyIpCmBgYAoKIyBWaXN1YWxpemF0aW9uIG9mIHRoZSBhcmVhIG9mIGludGVyZXN0CgpJIGNob29zZSB0aGUgZm9sbG93aW5nIHBvbHlnb24gdG8gZGVsaW1pdCB0aGUgYXJlYSBvZiBpbnRlcmVzdC4gVGhlIHBvbHlnb24gaXMgZGVmaW5lZCBieSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGZvdXIgY29ybmVyczogTm9ydGhlYXN0LCBTb3V0aGVhc3QsIFNvdXRod2VzdCwgYW5kIE5vcnRod2VzdC4KCmBgYHtyLCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIlRoaXMgc2hvd3MgdGhlIHBvbHlnb24gdGhhdCBkZWxpbWl0cyB0aGUgYXJlYSBvZiBpbnRlcmVzdC4gQ2xpY2sgb24gdGhlIHJlZ2lvbiB0byBzZWUgbW9yZSBkZXRhaWxzLiIpfQpjb29yZHMgPC0gcmJpbmQoTkUsIFNFLCBTVywgTlcsIE5FKSAjIGZyb20gc291cmNlKCJqb2JiZXJzL2N1c3RvbV9ib3VuZGluZ19ib3guUiIpCmNyb3BfcG9seWdvbiA8LSBzdF9wb2x5Z29uKGxpc3QoY29vcmRzKSkgJT4lIAogIHN0X3NmYyhjcnMgPSBzdF9jcnMoZ2FkbTQxX0VDVV9jb3VudHJ5KSkgIyBtYXRjaCBDUlMgb2YgeW91ciBkYXRhCmNyb3BfcG9seWdvbl9zZiA8LSBzdF9zZihnZW9tID0gY3JvcF9wb2x5Z29uKQptYXB2aWV3OjptYXB2aWV3KGNyb3BfcG9seWdvbl9zZiwKICAgICAgICAgICAgICAgICBhbHBoYS5yZWdpb25zID0gMC40LCAgICAjIGZpbGwgdHJhbnNwYXJlbmN5CiAgICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCAgICAgICAgIyBib3JkZXIgY29sb3IKICAgICAgICAgICAgICAgICBhbHBoYSA9IDEsICAgICAgICAgICAgIyBib3JkZXIgdHJhbnNwYXJlbmN5CiAgICAgICAgICAgICAgICAgbGVnZW5kID0gRkFMU0UpCmBgYAoKCiMjIEF0IHRoZSBjb3VudHJ5IGxldmVsCgpgYGB7ciwgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJUaGlzIHNob3dzIHRoZSByZWdpb24gb2YgaW50ZXJlc3QgYXQgdGhlIGNvdW50cnkgbGV2ZWwuIENsaWNrIG9uIHRoZSByZWdpb24gdG8gc2VlIG1vcmUgZGV0YWlscy4iKX0KbWFwdmlldygKICBnYWRtNDFfRUNVX2NvdW50cnksCiAgemNvbCA9ICJDT1VOVFJZIiwgICAgICAgICMgYXR0cmlidXRlIHVzZWQgZm9yIGZpbGwKICBhbHBoYS5yZWdpb25zID0gMC40LCAgICAjIGZpbGwgdHJhbnNwYXJlbmN5CiAgY29sb3IgPSAiYmxhY2siLCAgICAgICAgIyBib3JkZXIgY29sb3IKICBhbHBoYSA9IDEsICAgICAgICAgICAgIyBib3JkZXIgdHJhbnNwYXJlbmN5CiAgbGVnZW5kID0gRkFMU0UgICAgICAgICAgICMgcmVtb3ZlIGxlZ2VuZAopCmBgYAoKIyMgQXQgdGhlIHByb3ZpbmNlIGxldmVsCgpgYGB7ciwgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJUaGlzIHNob3dzIHRoZSByZWdpb24gb2YgaW50ZXJlc3QgYXQgdGhlIHByb3ZpbmNlIGxldmVsLiBDbGljayBvbiB0aGUgcmVnaW9uIHRvIHNlZSBtb3JlIGRldGFpbHMuIil9Cm1hcHZpZXcoCiAgZ2FkbTQxX0VDVV9wcm92aW5jZXMsCiAgemNvbCA9ICJOQU1FXzEiLCAgICAgICAgIyBhdHRyaWJ1dGUgdXNlZCBmb3IgZmlsbAogIGFscGhhLnJlZ2lvbnMgPSAwLjQsICAgICMgZmlsbCB0cmFuc3BhcmVuY3kKICBjb2xvciA9ICJibGFjayIsICAgICAgICAjIGJvcmRlciBjb2xvcgogIGFscGhhID0gMSwgICAgICAgICAgICAjIGJvcmRlciB0cmFuc3BhcmVuY3kKICBsZWdlbmQgPSBGQUxTRSAgICAgICAgICAgIyByZW1vdmUgbGVnZW5kCikKYGBgCgojIyBBdCB0aGUgY2FudG9uIGxldmVsCgpgYGB7ciwgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJUaGlzIHNob3dzIHRoZSByZWdpb24gb2YgaW50ZXJlc3QgYXQgdGhlIGNhbnRvbiBsZXZlbC4gQ2xpY2sgb24gdGhlIHJlZ2lvbiB0byBzZWUgbW9yZSBkZXRhaWxzLiIpfQptYXB2aWV3KAogIGdhZG00MV9FQ1VfY2FudG9ucywKICB6Y29sID0gIk5BTUVfMiIsICAgICAgICAjIGF0dHJpYnV0ZSB1c2VkIGZvciBmaWxsCiAgYWxwaGEucmVnaW9ucyA9IDAuNCwgICAgIyBmaWxsIHRyYW5zcGFyZW5jeQogIGNvbG9yID0gImJsYWNrIiwgICAgICAgICMgYm9yZGVyIGNvbG9yCiAgYWxwaGEgPSAxLCAgICAgICAgICAgICMgYm9yZGVyIHRyYW5zcGFyZW5jeQogIGxlZ2VuZCA9IEZBTFNFICAgICAgICAgICAjIHJlbW92ZSBsZWdlbmQKKQpgYGAKCiMjIEF0IHRoZSBwYXJpc2ggbGV2ZWwKCmBgYHtyLCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIlRoaXMgc2hvd3MgdGhlIHJlZ2lvbiBvZiBpbnRlcmVzdCBhdCB0aGUgcGFyaXNoIGxldmVsLiBDbGljayBvbiB0aGUgcmVnaW9uIHRvIHNlZSBtb3JlIGRldGFpbHMuIil9Cm1hcHZpZXcoCiAgZ2FkbTQxX0VDVV9wYXJpc2hlcywKICB6Y29sID0gIk5BTUVfMyIsICAgICAgICAjIGF0dHJpYnV0ZSB1c2VkIGZvciBmaWxsCiAgYWxwaGEucmVnaW9ucyA9IDAuNCwgICAgIyBmaWxsIHRyYW5zcGFyZW5jeQogIGNvbG9yID0gImJsYWNrIiwgICAgICAgICMgYm9yZGVyIGNvbG9yCiAgYWxwaGEgPSAxLCAgICAgICAgICAgICMgYm9yZGVyIHRyYW5zcGFyZW5jeQogIGxlZ2VuZCA9IEZBTFNFICAgICAgICAgICAjIHJlbW92ZSBsZWdlbmQKKQpgYGAKCgojIFJlZmVyZW5jZXMgCgpgYGB7cn0KZ3JhdGVmdWw6OmNpdGVfcGFja2FnZXMob3V0cHV0ID0gInBhcmFncmFwaCIsIG91dC5kaXIgPSAiLiIpCmBgYAoK