1. Introducción

CHIRPS que incorpora imágenes de satélite de 5 km × 5 km de resolución con datos de estaciones in situ para crear series temporales de precipitaciones cuadriculadas para el análisis de tendencias, eventos severos y seguimiento de sequías estacionales (Tymvios et al., 2016).

2. Librerias


# remotes::install_github("mikejohnson51/AOI")
# remotes::install_github("mikejohnson51/climateR")
rm(list=ls())
library(AOI)
library(climateR)
library(sf)
Linking to GEOS 3.9.1, GDAL 3.3.2, PROJ 7.2.1; sf_use_s2() is TRUE
library(raster)
Loading required package: sp
library(rasterVis)
Loading required package: lattice
library(dplyr)

Attaching package: ‘dplyr’

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

    intersect, select, union

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

    filter, lag

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

    intersect, setdiff, setequal, union
library(leaflet)
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(RColorBrewer)

3. Datos climáticos

(mun.tmp = st_read("C:\\Users\\ynata\\OneDrive\\Documentos\\GGB2022\\Datos\\DPTOCASANARE.shp"))
Reading layer `DPTOCASANARE' from data source 
  `C:\Users\ynata\OneDrive\Documentos\GGB2022\Datos\DPTOCASANARE.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 19 features and 11 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
Geodetic CRS:  WGS 84
Simple feature collection with 19 features and 11 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
Geodetic CRS:  WGS 84
First 10 features:
   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR                                MPIO_CRSLC
1          85        001      YOPAL     Ordenanza 0038 del 8 de Julio de 1942
2          85        010    AGUAZUL                                      1950
3          85        015    CHÁMEZA Ordenanza 0021 del 3 de Diciembre de 1959
4          85        136  LA SALINA                                      1780
5          85        139       MANÍ                                      1953
6          85        162  MONTERREY                                      1960
7          85        225    NUNCHÍA                                      1748
8          85        230     OROCUÉ                                      1845
9          85        263       PORE                                      1799
10         85        279    RECETOR                                      1798
   MPIO_NAREA MPIO_CCNCT MPIO_NANO DPTO_CNMBR SHAPE_AREA SHAPE_LEN ORIG_FID
1   2482.9386      85001      2020   CASANARE 0.20233677 3.1592326       55
2   1442.5073      85010      2020   CASANARE 0.11756477 2.2242959       56
3    313.5325      85015      2020   CASANARE 0.02556381 1.0678483       57
4    199.8943      85136      2020   CASANARE 0.01631711 0.8413073       58
5   3754.5485      85139      2020   CASANARE 0.30568793 4.1536144       59
6    779.1725      85162      2020   CASANARE 0.06349198 1.5420451       60
7   1101.8132      85225      2020   CASANARE 0.08981176 2.0246932       61
8   4753.4841      85230      2020   CASANARE 0.38683367 4.1890475       62
9    780.4712      85263      2020   CASANARE 0.06361918 1.7216899       63
10   181.2268      85279      2020   CASANARE 0.01477602 0.6745774       64
                         geometry
1  POLYGON ((-72.39513 5.56853...
2  POLYGON ((-72.56545 5.36972...
3  POLYGON ((-72.81017 5.36659...
4  POLYGON ((-72.33885 6.34470...
5  POLYGON ((-72.34155 5.06495...
6  POLYGON ((-72.89989 5.03465...
7  POLYGON ((-72.19558 5.71924...
8  POLYGON ((-71.50965 5.21730...
9  POLYGON ((-72.04587 5.83819...
10 POLYGON ((-72.80501 5.38092...
(mun.tmp %>% dplyr::select( MPIO_CCNCT, MPIO_CNMBR) -> casanare)
Simple feature collection with 19 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
Geodetic CRS:  WGS 84
First 10 features:
   MPIO_CCNCT MPIO_CNMBR                       geometry
1       85001      YOPAL POLYGON ((-72.39513 5.56853...
2       85010    AGUAZUL POLYGON ((-72.56545 5.36972...
3       85015    CHÁMEZA POLYGON ((-72.81017 5.36659...
4       85136  LA SALINA POLYGON ((-72.33885 6.34470...
5       85139       MANÍ POLYGON ((-72.34155 5.06495...
6       85162  MONTERREY POLYGON ((-72.89989 5.03465...
7       85225    NUNCHÍA POLYGON ((-72.19558 5.71924...
8       85230     OROCUÉ POLYGON ((-71.50965 5.21730...
9       85263       PORE POLYGON ((-72.04587 5.83819...
10      85279    RECETOR POLYGON ((-72.80501 5.38092...
rename(casanare, MPIO_CCDGO = MPIO_CCNCT)
Simple feature collection with 19 features and 2 fields
Geometry type: POLYGON
Dimension:     XY
Bounding box:  xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
Geodetic CRS:  WGS 84
First 10 features:
   MPIO_CCDGO MPIO_CNMBR                       geometry
1       85001      YOPAL POLYGON ((-72.39513 5.56853...
2       85010    AGUAZUL POLYGON ((-72.56545 5.36972...
3       85015    CHÁMEZA POLYGON ((-72.81017 5.36659...
4       85136  LA SALINA POLYGON ((-72.33885 6.34470...
5       85139       MANÍ POLYGON ((-72.34155 5.06495...
6       85162  MONTERREY POLYGON ((-72.89989 5.03465...
7       85225    NUNCHÍA POLYGON ((-72.19558 5.71924...
8       85230     OROCUÉ POLYGON ((-71.50965 5.21730...
9       85263       PORE POLYGON ((-72.04587 5.83819...
10      85279    RECETOR POLYGON ((-72.80501 5.38092...

3.1 Obtención de datos meteorológicos de TerraClimate

tc_prcp = getTerraClim(casanare, param = "prcp", startDate = "2019-02-01")
Spherical geometry (s2) switched off
Spherical geometry (s2) switched on
tc_tmp <- tc_prcp[[1]]
tc_tmp
class      : RasterStack 
dimensions : 51, 78, 3978, 1  (nrow, ncol, ncell, nlayers)
resolution : 0.04166667, 0.04166667  (x, y)
extent     : -73.08333, -69.83333, 4.25, 6.375  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      : X2019.02 
min values :      0.2 
max values :    161.1 
pal <- colorNumeric(c("red", "orange", "#fcc000","yellow", "cyan", "blue", "#3240cd"), values(tc_tmp$X2019.02), 
                    na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(tc_tmp$X2019.02 , colors = pal, opacity = 0.8) %>%
  addLegend(pal = pal, values = values(tc_tmp$X2019.02),
    title = "Rainfall-Feb.2019 [mm]")
Warning in showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj = prefer_proj) :
  Discarded ellps WGS 84 in Proj4 definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs +type=crs
Warning in showSRID(uprojargs, format = "PROJ", multiline = "NO", prefer_proj = prefer_proj) :
  Discarded datum World Geodetic System 1984 in Proj4 definition
writeRaster(tc_tmp, filename="precip", format="GTiff", overwrite=TRUE)
head(param_meta$terraclim)

** Índice de Severidad de la Sequía de Palmer (PDSI) **

tc_palmer = getTerraClim(casanare, param = "palmer", startDate = "2019-02-01")
Spherical geometry (s2) switched off
Spherical geometry (s2) switched on
tc_tmp <- tc_palmer[[1]]
tc_tmp
class      : RasterStack 
dimensions : 51, 78, 3978, 1  (nrow, ncol, ncell, nlayers)
resolution : 0.04166667, 0.04166667  (x, y)
extent     : -73.08333, -69.83333, 4.25, 6.375  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      : X2019.02 
min values :     -3.5 
max values :      1.9 
pal <- colorNumeric(c("#fc7300","orange", "yellow","#9acd32", "green"), values(tc_tmp$X2019.02), 
                    na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(tc_tmp$X2019.02, colors = pal, opacity = 0.8) %>%
  addLegend(pal = pal, values = values(tc_tmp$X2019.02),
    title = "PDSI-Feb.2019")
Warning in colors(.) :
  Some values were outside the color scale and will be treated as NA

3.2 Obtención de las normales de TerraClimate

Datos del déficit hídrico climático en febrero (período: 1981- 2010):

# CWD
wat_def = getTerraClimNormals(casanare, param = "water_deficit", period = "19812010", month=2)
Spherical geometry (s2) switched off
Spherical geometry (s2) switched on
wat_def
$terraclim_19812010_water_deficit
class      : RasterStack 
dimensions : 51, 78, 3978, 1  (nrow, ncol, ncell, nlayers)
resolution : 0.04166667, 0.04166667  (x, y)
extent     : -73.08333, -69.83333, 4.25, 6.375  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      :  X02 
min values :  4.8 
max values : 83.4 
tc_tmp <- wat_def[[1]]
pal <- colorNumeric(c("green", "#9acd32","yellow", "orange", 
                    "#fc7300"), values(tc_tmp$X02), 
                    na.color = "transparent")
leaflet() %>% addTiles() %>%
  addRasterImage(tc_tmp$X02, colors = pal, opacity = 0.8) %>%
  addLegend(pal = pal, values = values(tc_tmp$X02),
    title = "WaterDeficit-February")
Warning in colors(.) :
  Some values were outside the color scale and will be treated as NA

En su Informe Nº 2 analice el eventual vínculo entre la topografía y el clima.

3.3 Obtención de los datos de CHIRPS

chirps = getCHIRPS(casanare, startDate = "2020-11-01", endDate = "2020-11-06" )
Spherical geometry (s2) switched off
Spherical geometry (s2) switched on
chirps
class      : RasterStack 
dimensions : 42, 66, 2772, 6  (nrow, ncol, ncell, nlayers)
resolution : 0.05, 0.05  (x, y)
extent     : -73.10001, -69.80001, 4.25, 6.35  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      : prcp_20201101, prcp_20201102, prcp_20201103, prcp_20201104, prcp_20201105, prcp_20201106 
min values :             0,             0,             0,             0,             0,             0 
max values :           255,           255,           255,           255,           255,           255 
names(chirps) <- c("P1","P2","P3", "P4", "P5", "P6")
chirps
class      : RasterStack 
dimensions : 42, 66, 2772, 6  (nrow, ncol, ncell, nlayers)
resolution : 0.05, 0.05  (x, y)
extent     : -73.10001, -69.80001, 4.25, 6.35  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs 
names      :  P1,  P2,  P3,  P4,  P5,  P6 
min values :   0,   0,   0,   0,   0,   0 
max values : 255, 255, 255, 255, 255, 255 

dimensions: el “tamaño” del archivo en píxeles nrow, ncol: el número de filas y columnas de los datos (imagine una hoja de cálculo o una matriz). ncells: el número total de píxeles o celdas que componen el raster. resolution: el tamaño de cada píxel (en grados decimales en este caso). Recordemos que 1 grado decimal representa aproximadamente 111,11 km en el Ecuador. extent: la extensión espacial de la trama. Este valor estará en las mismas unidades de coordenadas que el sistema de referencia de coordenadas del raster. crs: la cadena del sistema de referencia de coordenadas del ráster. Este ráster está en coordenadas geográficas con un datum de WGS 84. Obsérvese también que cada capa representa las precipitaciones acumuladas en cinco días.

(capas <- names(chirps))
[1] "P1" "P2" "P3" "P4" "P5" "P6"
pentads <-c("P1", "P2", "P3", "P4", "P5", "P6")
cellStats(chirps, mean)
       P1        P2        P3        P4        P5        P6 
44.117605 20.787879 17.773449 24.879509  7.705988  7.511544 
for (penta in capas) {
  tmp <- chirps[[penta]]
  print(cellStats(tmp, max))
}
[1] 171
[1] 115
[1] 100
[1] 122
[1] 77
[1] 218
(valores <- seq(from=1,to=230,by=4))
 [1]   1   5   9  13  17  21  25  29  33  37  41  45  49  53  57  61  65  69  73
[20]  77  81  85  89  93  97 101 105 109 113 117 121 125 129 133 137 141 145 149
[39] 153 157 161 165 169 173 177 181 185 189 193 197 201 205 209 213 217 221 225
[58] 229
pal <- colorNumeric(c("red", "orange", "#fcc000","yellow", 
                        "cyan", "blue", "#3240cd"), 
                         valores, na.color = "transparent")
# Create leaflet widget --------------------------------------------------------
m <- leaflet() %>%
  addTiles(group = "OSM (default)") 
# Add multiple layers with a loop ----------------------------------------------
 for (penta in capas) {
  tmp <- chirps[[penta]]
  m <- m %>% 
  addRasterImage(tmp, colors = pal, opacity = 0.8, group= penta) 
 }

#
# Additional leaflet options 
m <- m %>%
  # Add layers controls
  addLayersControl(
    baseGroups = pentads,
    options = layersControlOptions(collapsed = FALSE)
  ) %>%
  # Add common legend
  addLegend(pal = pal, values = valores,
   title = "CHIRPS - Nov.2020")
m

Estadistica basica de los datos climaticos

# histograma
par(mfrow=c(2,3))
for (penta in capas) {
  hist(chirps[[penta]])
}

# works for large files
for (penta in capas) {
   tmp <-  chirps[[penta]]
   media= cellStats(tmp, 'mean')
   desv= cellStats(tmp, 'sd')
   print(paste("pentad=", penta))
   print(paste("mean=", round(media,digits = 2)))
   print(paste("sd=", round(desv,digits=2)))
}
[1] "pentad= P1"
[1] "mean= 44.12"
[1] "sd= 27.74"
[1] "pentad= P2"
[1] "mean= 20.79"
[1] "sd= 22.61"
[1] "pentad= P3"
[1] "mean= 17.77"
[1] "sd= 17.07"
[1] "pentad= P4"
[1] "mean= 24.88"
[1] "sd= 18.05"
[1] "pentad= P5"
[1] "mean= 7.71"
[1] "sd= 12.23"
[1] "pentad= P6"
[1] "mean= 7.51"
[1] "sd= 17.48"
writeRaster(tc_tmp, filename="precip", format="GTiff", overwrite=TRUE)
LS0tDQp0aXRsZTogIkRhdG9zIGNsaW3DoXRpY29zIGRlIENhc2FuYXJlIGVuIFIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjIDEuIEludHJvZHVjY2nDs24NCg0KQ0hJUlBTIHF1ZSBpbmNvcnBvcmEgaW3DoWdlbmVzIGRlIHNhdMOpbGl0ZSBkZSA1IGttIMOXIDUga20gZGUgcmVzb2x1Y2nDs24gY29uIGRhdG9zIGRlIGVzdGFjaW9uZXMgaW4gc2l0dSBwYXJhIGNyZWFyIHNlcmllcyB0ZW1wb3JhbGVzIGRlIHByZWNpcGl0YWNpb25lcyBjdWFkcmljdWxhZGFzIHBhcmEgZWwgYW7DoWxpc2lzIGRlIHRlbmRlbmNpYXMsIGV2ZW50b3Mgc2V2ZXJvcyB5IHNlZ3VpbWllbnRvIGRlIHNlcXXDrWFzIGVzdGFjaW9uYWxlcyAoVHltdmlvcyBldCBhbC4sIDIwMTYpLg0KDQojIyAyLiBMaWJyZXJpYXMNCg0KYGBge3J9DQoNCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1pa2Vqb2huc29uNTEvQU9JIikNCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1pa2Vqb2huc29uNTEvY2xpbWF0ZVIiKQ0KYGBgDQoNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShBT0kpDQpsaWJyYXJ5KGNsaW1hdGVSKQ0KbGlicmFyeShzZikNCmxpYnJhcnkocmFzdGVyKQ0KbGlicmFyeShyYXN0ZXJWaXMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpgYGANCg0KIyMgMy4gRGF0b3MgY2xpbcOhdGljb3MNCg0KYGBge3J9DQoobXVuLnRtcCA9IHN0X3JlYWQoIkM6XFxVc2Vyc1xceW5hdGFcXE9uZURyaXZlXFxEb2N1bWVudG9zXFxHR0IyMDIyXFxEYXRvc1xcRFBUT0NBU0FOQVJFLnNocCIpKQ0KYGBgDQpgYGB7cn0NCihtdW4udG1wICU+JSBkcGx5cjo6c2VsZWN0KCBNUElPX0NDTkNULCBNUElPX0NOTUJSKSAtPiBjYXNhbmFyZSkNCg0KYGBgDQpgYGB7cn0NCnJlbmFtZShjYXNhbmFyZSwgTVBJT19DQ0RHTyA9IE1QSU9fQ0NOQ1QpDQpgYGANCg0KIyMjIDMuMSBPYnRlbmNpw7NuIGRlIGRhdG9zIG1ldGVvcm9sw7NnaWNvcyBkZSBUZXJyYUNsaW1hdGUNCg0KYGBge3J9DQp0Y19wcmNwID0gZ2V0VGVycmFDbGltKGNhc2FuYXJlLCBwYXJhbSA9ICJwcmNwIiwgc3RhcnREYXRlID0gIjIwMTktMDItMDEiKQ0KYGBgDQpgYGB7cn0NCnRjX3RtcCA8LSB0Y19wcmNwW1sxXV0NCmBgYA0KDQpgYGB7cn0NCnRjX3RtcA0KYGBgDQpgYGB7cn0NCnBhbCA8LSBjb2xvck51bWVyaWMoYygicmVkIiwgIm9yYW5nZSIsICIjZmNjMDAwIiwieWVsbG93IiwgImN5YW4iLCAiYmx1ZSIsICIjMzI0MGNkIiksIHZhbHVlcyh0Y190bXAkWDIwMTkuMDIpLCANCiAgICAgICAgICAgICAgICAgICAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZFJhc3RlckltYWdlKHRjX3RtcCRYMjAxOS4wMiAsIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuOCkgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyh0Y190bXAkWDIwMTkuMDIpLA0KICAgIHRpdGxlID0gIlJhaW5mYWxsLUZlYi4yMDE5IFttbV0iKQ0KYGBgDQpgYGB7cn0NCndyaXRlUmFzdGVyKHRjX3RtcCwgZmlsZW5hbWU9InByZWNpcCIsIGZvcm1hdD0iR1RpZmYiLCBvdmVyd3JpdGU9VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KaGVhZChwYXJhbV9tZXRhJHRlcnJhY2xpbSkNCmBgYA0KDQoqKiDDjW5kaWNlIGRlIFNldmVyaWRhZCBkZSBsYSBTZXF1w61hIGRlIFBhbG1lciAoUERTSSkgKiogDQoNCmBgYHtyfQ0KdGNfcGFsbWVyID0gZ2V0VGVycmFDbGltKGNhc2FuYXJlLCBwYXJhbSA9ICJwYWxtZXIiLCBzdGFydERhdGUgPSAiMjAxOS0wMi0wMSIpDQpgYGANCg0KYGBge3J9DQp0Y190bXAgPC0gdGNfcGFsbWVyW1sxXV0NCnRjX3RtcA0KYGBgDQoNCmBgYHtyfQ0KcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCIjZmM3MzAwIiwib3JhbmdlIiwgInllbGxvdyIsIiM5YWNkMzIiLCAiZ3JlZW4iKSwgdmFsdWVzKHRjX3RtcCRYMjAxOS4wMiksIA0KICAgICAgICAgICAgICAgICAgICBuYS5jb2xvciA9ICJ0cmFuc3BhcmVudCIpDQoNCmxlYWZsZXQoKSAlPiUgYWRkVGlsZXMoKSAlPiUNCiAgYWRkUmFzdGVySW1hZ2UodGNfdG1wJFgyMDE5LjAyLCBjb2xvcnMgPSBwYWwsIG9wYWNpdHkgPSAwLjgpICU+JQ0KICBhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSB2YWx1ZXModGNfdG1wJFgyMDE5LjAyKSwNCiAgICB0aXRsZSA9ICJQRFNJLUZlYi4yMDE5IikNCg0KYGBgDQojIyMgMy4yIE9idGVuY2nDs24gZGUgbGFzIG5vcm1hbGVzIGRlIFRlcnJhQ2xpbWF0ZQ0KDQpEYXRvcyBkZWwgZMOpZmljaXQgaMOtZHJpY28gY2xpbcOhdGljbyBlbiBmZWJyZXJvIChwZXLDrW9kbzogMTk4MS0gMjAxMCk6DQoNCmBgYHtyfQ0KIyBDV0QNCndhdF9kZWYgPSBnZXRUZXJyYUNsaW1Ob3JtYWxzKGNhc2FuYXJlLCBwYXJhbSA9ICJ3YXRlcl9kZWZpY2l0IiwgcGVyaW9kID0gIjE5ODEyMDEwIiwgbW9udGg9MikNCmBgYA0KYGBge3J9DQp3YXRfZGVmDQpgYGANCmBgYHtyfQ0KdGNfdG1wIDwtIHdhdF9kZWZbWzFdXQ0KYGBgDQoNCmBgYHtyfQ0KcGFsIDwtIGNvbG9yTnVtZXJpYyhjKCJncmVlbiIsICIjOWFjZDMyIiwieWVsbG93IiwgIm9yYW5nZSIsIA0KICAgICAgICAgICAgICAgICAgICAiI2ZjNzMwMCIpLCB2YWx1ZXModGNfdG1wJFgwMiksIA0KICAgICAgICAgICAgICAgICAgICBuYS5jb2xvciA9ICJ0cmFuc3BhcmVudCIpDQpgYGANCg0KYGBge3J9DQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZFJhc3RlckltYWdlKHRjX3RtcCRYMDIsIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuOCkgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyh0Y190bXAkWDAyKSwNCiAgICB0aXRsZSA9ICJXYXRlckRlZmljaXQtRmVicnVhcnkiKQ0KYGBgDQoNCkVuIHN1IEluZm9ybWUgTsK6IDIgYW5hbGljZSBlbCBldmVudHVhbCB2w61uY3VsbyBlbnRyZSBsYSB0b3BvZ3JhZsOtYSB5IGVsIGNsaW1hLg0KDQojIyMgMy4zIE9idGVuY2nDs24gZGUgbG9zIGRhdG9zIGRlIENISVJQUw0KDQoNCmBgYHtyfQ0KY2hpcnBzID0gZ2V0Q0hJUlBTKGNhc2FuYXJlLCBzdGFydERhdGUgPSAiMjAyMC0xMS0wMSIsIGVuZERhdGUgPSAiMjAyMC0xMS0wNiIgKQ0KYGBgDQoNCmBgYHtyfQ0KY2hpcnBzDQpgYGANCg0KYGBge3J9DQpuYW1lcyhjaGlycHMpIDwtIGMoIlAxIiwiUDIiLCJQMyIsICJQNCIsICJQNSIsICJQNiIpDQpgYGANCg0KYGBge3J9DQpjaGlycHMNCmBgYA0KDQpkaW1lbnNpb25zOiBlbCAidGFtYcOxbyIgZGVsIGFyY2hpdm8gZW4gcMOteGVsZXMNCm5yb3csIG5jb2w6IGVsIG7Dum1lcm8gZGUgZmlsYXMgeSBjb2x1bW5hcyBkZSBsb3MgZGF0b3MgKGltYWdpbmUgdW5hIGhvamEgZGUgY8OhbGN1bG8gbyB1bmEgbWF0cml6KS4NCm5jZWxsczogZWwgbsO6bWVybyB0b3RhbCBkZSBww614ZWxlcyBvIGNlbGRhcyBxdWUgY29tcG9uZW4gZWwgcmFzdGVyLg0KcmVzb2x1dGlvbjogZWwgdGFtYcOxbyBkZSBjYWRhIHDDrXhlbCAoZW4gZ3JhZG9zIGRlY2ltYWxlcyBlbiBlc3RlIGNhc28pLiBSZWNvcmRlbW9zIHF1ZSAxIGdyYWRvIGRlY2ltYWwgcmVwcmVzZW50YSBhcHJveGltYWRhbWVudGUgMTExLDExIGttIGVuIGVsIEVjdWFkb3IuDQpleHRlbnQ6IGxhIGV4dGVuc2nDs24gZXNwYWNpYWwgZGUgbGEgdHJhbWEuIEVzdGUgdmFsb3IgZXN0YXLDoSBlbiBsYXMgbWlzbWFzIHVuaWRhZGVzIGRlIGNvb3JkZW5hZGFzIHF1ZSBlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEgZGUgY29vcmRlbmFkYXMgZGVsIHJhc3Rlci4NCmNyczogbGEgY2FkZW5hIGRlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEgZGUgY29vcmRlbmFkYXMgZGVsIHLDoXN0ZXIuIEVzdGUgcsOhc3RlciBlc3TDoSBlbiBjb29yZGVuYWRhcyBnZW9ncsOhZmljYXMgY29uIHVuIGRhdHVtIGRlIFdHUyA4NC4NCk9ic8OpcnZlc2UgdGFtYmnDqW4gcXVlIGNhZGEgY2FwYSByZXByZXNlbnRhIGxhcyBwcmVjaXBpdGFjaW9uZXMgYWN1bXVsYWRhcyBlbiBjaW5jbyBkw61hcy4NCg0KYGBge3J9DQooY2FwYXMgPC0gbmFtZXMoY2hpcnBzKSkNCmBgYA0KDQpgYGB7cn0NCnBlbnRhZHMgPC1jKCJQMSIsICJQMiIsICJQMyIsICJQNCIsICJQNSIsICJQNiIpDQpgYGANCg0KYGBge3J9DQpjZWxsU3RhdHMoY2hpcnBzLCBtZWFuKQ0KYGBgDQoNCmBgYHtyfQ0KZm9yIChwZW50YSBpbiBjYXBhcykgew0KICB0bXAgPC0gY2hpcnBzW1twZW50YV1dDQogIHByaW50KGNlbGxTdGF0cyh0bXAsIG1heCkpDQp9DQpgYGANCg0KYGBge3J9DQoodmFsb3JlcyA8LSBzZXEoZnJvbT0xLHRvPTIzMCxieT00KSkNCmBgYA0KDQpgYGB7cn0NCnBhbCA8LSBjb2xvck51bWVyaWMoYygicmVkIiwgIm9yYW5nZSIsICIjZmNjMDAwIiwieWVsbG93IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAiY3lhbiIsICJibHVlIiwgIiMzMjQwY2QiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3JlcywgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpgYGANCg0KYGBge3J9DQojIENyZWF0ZSBsZWFmbGV0IHdpZGdldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KbSA8LSBsZWFmbGV0KCkgJT4lDQogIGFkZFRpbGVzKGdyb3VwID0gIk9TTSAoZGVmYXVsdCkiKSANCiMgQWRkIG11bHRpcGxlIGxheWVycyB3aXRoIGEgbG9vcCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogZm9yIChwZW50YSBpbiBjYXBhcykgew0KICB0bXAgPC0gY2hpcnBzW1twZW50YV1dDQogIG0gPC0gbSAlPiUgDQogIGFkZFJhc3RlckltYWdlKHRtcCwgY29sb3JzID0gcGFsLCBvcGFjaXR5ID0gMC44LCBncm91cD0gcGVudGEpIA0KIH0NCg0KIw0KIyBBZGRpdGlvbmFsIGxlYWZsZXQgb3B0aW9ucyANCm0gPC0gbSAlPiUNCiAgIyBBZGQgbGF5ZXJzIGNvbnRyb2xzDQogIGFkZExheWVyc0NvbnRyb2woDQogICAgYmFzZUdyb3VwcyA9IHBlbnRhZHMsDQogICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKQ0KICApICU+JQ0KICAjIEFkZCBjb21tb24gbGVnZW5kDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbG9yZXMsDQogICB0aXRsZSA9ICJDSElSUFMgLSBOb3YuMjAyMCIpDQpgYGANCg0KYGBge3J9DQptDQpgYGANCg0KIyMjIEVzdGFkaXN0aWNhIGJhc2ljYSBkZSBsb3MgZGF0b3MgY2xpbWF0aWNvcyANCg0KYGBge3J9DQojIGhpc3RvZ3JhbWENCnBhcihtZnJvdz1jKDIsMykpDQpmb3IgKHBlbnRhIGluIGNhcGFzKSB7DQogIGhpc3QoY2hpcnBzW1twZW50YV1dKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KIyB3b3JrcyBmb3IgbGFyZ2UgZmlsZXMNCmZvciAocGVudGEgaW4gY2FwYXMpIHsNCiAgIHRtcCA8LSAgY2hpcnBzW1twZW50YV1dDQogICBtZWRpYT0gY2VsbFN0YXRzKHRtcCwgJ21lYW4nKQ0KICAgZGVzdj0gY2VsbFN0YXRzKHRtcCwgJ3NkJykNCiAgIHByaW50KHBhc3RlKCJwZW50YWQ9IiwgcGVudGEpKQ0KICAgcHJpbnQocGFzdGUoIm1lYW49Iiwgcm91bmQobWVkaWEsZGlnaXRzID0gMikpKQ0KICAgcHJpbnQocGFzdGUoInNkPSIsIHJvdW5kKGRlc3YsZGlnaXRzPTIpKSkNCn0NCmBgYA0KDQpgYGB7cn0NCndyaXRlUmFzdGVyKHRjX3RtcCwgZmlsZW5hbWU9InByZWNpcCIsIGZvcm1hdD0iR1RpZmYiLCBvdmVyd3JpdGU9VFJVRSkNCmBgYA0KDQoNCg0KDQoNCg0K