Ana María Montaño Hernández

precip <- raster(("C:/Users/user/Documents/Intro_to_R/chirps-v2.0.2020.04.6.tif"))
precip
class      : RasterLayer 
dimensions : 2000, 7200, 14400000  (nrow, ncol, ncell)
resolution : 0.05, 0.05  (x, y)
extent     : -180, 180, -50, 50  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
source     : C:/Users/user/Documents/Intro_to_R/chirps-v2.0.2020.04.6.tif 
names      : chirps.v2.0.2020.04.6 
(aoi <- st_read("C:/Users/user/Documents/Norte de Santander/54_NORTE DE SANTANDER/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp"))
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\user\Documents\Norte de Santander\54_NORTE DE SANTANDER\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 40 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.63379 ymin: 6.872201 xmax: -72.04761 ymax: 9.290847
geographic CRS: WGS 84
Simple feature collection with 40 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.63379 ymin: 6.872201 xmax: -72.04761 ymax: 9.290847
geographic CRS: WGS 84
First 10 features:
   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR                           MPIO_CRSLC
1          54      54001     CÚCUTA                                 1972
2          54      54003     ABREGO                                 1806
3          54      54051  ARBOLEDAS                                 1835
4          54      54099  BOCHALEMA                                 1826
5          54      54109 BUCARASICA                                 1838
6          54      54125     CÁCOTA                                 1630
7          54      54128    CÁCHIRA                                 1911
8          54      54172  CHINÁCOTA                                 1775
9          54      54223  CUCUTILLA                                 1834
10         54      54239    DURANIA Ordenanza 12 del 27 de Marzo de 1911
   MPIO_NAREA MPIO_NANO         DPTO_CNMBR Shape_Leng Shape_Area
1   1133.2031      2017 NORTE DE SANTANDER  2.8636253 0.09289252
2   1382.4498      2017 NORTE DE SANTANDER  2.2393759 0.11336240
3    456.1490      2017 NORTE DE SANTANDER  1.1611936 0.03736204
4    170.2669      2017 NORTE DE SANTANDER  0.7565329 0.01394455
5    270.7909      2017 NORTE DE SANTANDER  0.8281364 0.02220518
6    138.9222      2017 NORTE DE SANTANDER  0.5561253 0.01136823
7    615.8199      2017 NORTE DE SANTANDER  1.6560289 0.05045724
8    166.2543      2017 NORTE DE SANTANDER  0.7572865 0.01361349
9    374.9105      2017 NORTE DE SANTANDER  0.8858476 0.03069885
10   175.0128      2017 NORTE DE SANTANDER  0.6020091 0.01433714
                         geometry
1  MULTIPOLYGON (((-72.4778 8....
2  MULTIPOLYGON (((-73.01687 8...
3  MULTIPOLYGON (((-72.73134 7...
4  MULTIPOLYGON (((-72.60265 7...
5  MULTIPOLYGON (((-72.95019 8...
6  MULTIPOLYGON (((-72.62101 7...
7  MULTIPOLYGON (((-73.04222 7...
8  MULTIPOLYGON (((-72.58771 7...
9  MULTIPOLYGON (((-72.79776 7...
10 MULTIPOLYGON (((-72.63625 7...
precip.crop <- raster::crop(precip, extent(aoi))
precip.mask <- mask(x = precip.crop, mask = aoi)
precip.mask
class      : RasterLayer 
dimensions : 49, 32, 1568  (nrow, ncol, ncell)
resolution : 0.05, 0.05  (x, y)
extent     : -73.65, -72.05, 6.849999, 9.299999  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
source     : memory
names      : chirps.v2.0.2020.04.6 
values     : 2.060457, 38.14587  (min, max)

Plotear:

library(leaflet)
library(RColorBrewer)
pal <- colorNumeric(c("red", "orange", "yellow", "blue", "darkblue"), values(precip.mask),
  na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(precip.mask, colors = pal, opacity = 0.6) %>%
  addLegend(pal = pal, values = values(precip.mask),
    title = "CHIRPS precipitaciones en Norte de Santander desde 26.04 hasta 30.04 de 2020 [mm]")
ning昼㹡n argumento finito para min; retornando Infningun argumento finito para max; retornando -Inf
(precip.points <- rasterToPoints(precip.mask, spatial = TRUE))
class       : SpatialPointsDataFrame 
features    : 721 
extent      : -73.575, -72.075, 6.924999, 9.274999  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 1
names       : chirps.v2.0.2020.04.6 
min values  :      2.06045699119568 
max values  :      38.1458702087402 
names(precip.points) <- "Lluvia"
precip.points
class       : SpatialPointsDataFrame 
features    : 721 
extent      : -73.575, -72.075, 6.924999, 9.274999  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 1
names       :           Lluvia 
min values  : 2.06045699119568 
max values  : 38.1458702087402 
str(precip.points)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 721 obs. of  1 variable:
  .. ..$ Lluvia: num [1:721] 21.53 13.99 16.87 16.75 8.82 ...
  ..@ coords.nrs : num(0) 
  ..@ coords     : num [1:721, 1:2] -73 -73.1 -73.1 -73 -73.2 ...
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : NULL
  .. .. ..$ : chr [1:2] "x" "y"
  ..@ bbox       : num [1:2, 1:2] -73.57 6.92 -72.07 9.27
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr [1:2] "x" "y"
  .. .. ..$ : chr [1:2] "min" "max"
  ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
  .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
plot(precip.mask, main= "Datos CHIRPS de precipitaciones desde el 26 al 30.04.2020 [mm]")
plot(aoi, add=TRUE)
ignoring all but the first attribute
points(precip.points$x, precip.points$y, col = "darkblue", cex = 0.4)

aoi$area = st_area(aoi)
aoi
Simple feature collection with 40 features and 10 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.63379 ymin: 6.872201 xmax: -72.04761 ymax: 9.290847
geographic CRS: WGS 84
First 10 features:
   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR                           MPIO_CRSLC
1          54      54001     CÚCUTA                                 1972
2          54      54003     ABREGO                                 1806
3          54      54051  ARBOLEDAS                                 1835
4          54      54099  BOCHALEMA                                 1826
5          54      54109 BUCARASICA                                 1838
6          54      54125     CÁCOTA                                 1630
7          54      54128    CÁCHIRA                                 1911
8          54      54172  CHINÁCOTA                                 1775
9          54      54223  CUCUTILLA                                 1834
10         54      54239    DURANIA Ordenanza 12 del 27 de Marzo de 1911
   MPIO_NAREA MPIO_NANO         DPTO_CNMBR Shape_Leng Shape_Area
1   1133.2031      2017 NORTE DE SANTANDER  2.8636253 0.09289252
2   1382.4498      2017 NORTE DE SANTANDER  2.2393759 0.11336240
3    456.1490      2017 NORTE DE SANTANDER  1.1611936 0.03736204
4    170.2669      2017 NORTE DE SANTANDER  0.7565329 0.01394455
5    270.7909      2017 NORTE DE SANTANDER  0.8281364 0.02220518
6    138.9222      2017 NORTE DE SANTANDER  0.5561253 0.01136823
7    615.8199      2017 NORTE DE SANTANDER  1.6560289 0.05045724
8    166.2543      2017 NORTE DE SANTANDER  0.7572865 0.01361349
9    374.9105      2017 NORTE DE SANTANDER  0.8858476 0.03069885
10   175.0128      2017 NORTE DE SANTANDER  0.6020091 0.01433714
                         geometry             area
1  MULTIPOLYGON (((-72.4778 8.... 1132277146 [m^2]
2  MULTIPOLYGON (((-73.01687 8... 1382095614 [m^2]
3  MULTIPOLYGON (((-72.73134 7...  455945007 [m^2]
4  MULTIPOLYGON (((-72.60265 7...  170163472 [m^2]
5  MULTIPOLYGON (((-72.95019 8...  270683414 [m^2]
6  MULTIPOLYGON (((-72.62101 7...  138836998 [m^2]
7  MULTIPOLYGON (((-73.04222 7...  615651563 [m^2]
8  MULTIPOLYGON (((-72.58771 7...  166142537 [m^2]
9  MULTIPOLYGON (((-72.79776 7...  374725056 [m^2]
10 MULTIPOLYGON (((-72.63625 7...  174908727 [m^2]
(border_sf <- aoi %>%
   summarise(area = sum(area)/1000000))
Simple feature collection with 1 feature and 1 field
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.63379 ymin: 6.872201 xmax: -72.04761 ymax: 9.290847
geographic CRS: WGS 84
            area                       geometry
1 21846.28 [m^2] POLYGON ((-72.4556 7.553288...
(border <- as(border_sf, "Spatial"))
class       : SpatialPolygonsDataFrame 
features    : 1 
extent      : -73.63379, -72.04761, 6.872201, 9.290847  (xmin, xmax, ymin, ymax)
crs         : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0 
variables   : 1
names       :             area 
value       : 21846.2845105745 
p.sf.magna2 <- st_transform(st_as_sf(precip.points), crs= 3116)
NSantander.sf.magna <- st_transform(aoi, crs= 3116)
precip2 <- as(p.sf.magna2, "Spatial")
precip2$precipitaciones <- round(precip2$Lluvia, 1)
precip2
class       : SpatialPointsDataFrame 
features    : 721 
extent      : 1055435, 1221276, 1257812, 1517605  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 2
names       :           Lluvia, precipitaciones 
min values  : 2.06045699119568,             2.1 
max values  : 38.1458702087402,            38.1 
(NSantander2 <- as(NSantander.sf.magna, "Spatial"))
class       : SpatialPolygonsDataFrame 
features    : 40 
extent      : 1048947, 1224322, 1252020, 1519363  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 10
names       : DPTO_CCDGO, MPIO_CCDGO,        MPIO_CNMBR,                          MPIO_CRSLC,    MPIO_NAREA, MPIO_NANO,         DPTO_CNMBR,     Shape_Leng,       Shape_Area,             area 
min values  :         54,      54001,            ABREGO,                                1555,   44.94540102,      2017, NORTE DE SANTANDER, 0.455016349208, 0.00368621836307, 44907945.6872762 
max values  :         54,      54874, VILLA DEL ROSARIO, Ordenanza 9 de Noviembre 25 de 1948, 2680.07859017,      2017, NORTE DE SANTANDER,  4.08629755008,   0.220098910874,  2678750166.7455 
precip2@bbox <- NSantander2@bbox
train_index <- sample(1:nrow(precip2), 0.7 * nrow(precip2))
test_index <- setdiff(1:nrow(precip2), train_index)
ptos_train <- precip2[train_index, ]
ptos_test  <- precip2[test_index,]
ptrain <- spTransform(ptos_train, crs(precip.mask))
ptest <- spTransform(ptos_test, crs(precip.mask))

Plotear

lplot <- leaflet(data = precip2) %>% # data = original body - to get the zoom right
  addProviderTiles("CartoDB.Positron") %>% 
  addRasterImage(precip.mask, colors = pal, opacity = 0.6) %>%
  addCircleMarkers(data = ptrain, # first group
                   radius = 1,
                   fillOpacity = .7,
                   stroke = FALSE,
                   popup = ~htmlEscape(precipitaciones),
                   color = pal(ptos_train$precipitaciones), # using already created palette
                   clusterOptions = markerClusterOptions(),
                   group = "Training") %>% 
  addCircleMarkers(data = ptest, # second group
                   radius = 10,
                   fillOpacity = .7,
                   stroke = FALSE,
                   popup = ~htmlEscape(precipitaciones),
                   color = pal(ptos_test$precipitaciones), # using already created palette
                   clusterOptions = markerClusterOptions(),
                   group = "Test") %>% 
  addLegend(position = "bottomright",
            values = ~precipitaciones,
            opacity = .7,
            pal = pal, # palette declared previously
            title = "Precipitación") %>% 
  leaflet::addLayersControl(overlayGroups = c("Training", "Test"),
                   options = layersControlOptions(collapsed = FALSE)) %>% 
  addResetMapButton()
lplot

Interpolación

  1. Polígonos Thiessen
th <- as(dirichlet(as.ppp(ptos_train)), "SpatialPolygons")

crs(th) <- crs(ptos_train)
crs(NSantander2) <- crs(ptos_train)
crs(th)
CRS arguments:
 +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667
+k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80
+towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
crs(ptos_train)
CRS arguments:
 +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667
+k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80
+towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
th.z <- over(th, ptos_train, fn=mean)

th.spdf <- SpatialPolygonsDataFrame(th, th.z)

th.clp <- raster::intersect(NSantander2, th.spdf)
tm_shape(th.clp) + 
  tm_polygons(col="precipitaciones", palette="RdBu", midpoint=30.0,
              title="Polígonos Thiessen\n Precipitación predicha\n [en mm])") +
  tm_legend(legend.outside=TRUE)

  1. IDW
grd              <- as.data.frame(spsample(ptos_train, "regular", n=500000))
# You need to figure out what is the expected size of the output grd
names(grd)       <- c("X", "Y")
coordinates(grd) <- c("X", "Y")
gridded(grd)     <- TRUE  # Create SpatialPixel object
fullgrid(grd)    <- TRUE  # Create SpatialGrid object

# Add P's projection information to the empty grid
proj4string(grd) <- proj4string(ptos_train)

# Interpolate the grid cells using a power value of 2 (idp=2.0)
P.idw <- gstat::idw(precipitaciones ~ 1, ptos_train, newdata=grd, idp=2.0)
[inverse distance weighted interpolation]
# Convert to raster object then clip to AOI
r       <- raster(P.idw)
r
class      : RasterLayer 
dimensions : 900, 556, 500400  (nrow, ncol, ncell)
resolution : 288.7443, 288.7443  (x, y)
extent     : 1060841, 1221383, 1257800, 1517670  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : var1.pred 
values     : 2.100869, 38.09815  (min, max)
NSantander2
class       : SpatialPolygonsDataFrame 
features    : 40 
extent      : 1048947, 1224322, 1252020, 1519363  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 10
names       : DPTO_CCDGO, MPIO_CCDGO,        MPIO_CNMBR,                          MPIO_CRSLC,    MPIO_NAREA, MPIO_NANO,         DPTO_CNMBR,     Shape_Leng,       Shape_Area,             area 
min values  :         54,      54001,            ABREGO,                                1555,   44.94540102,      2017, NORTE DE SANTANDER, 0.455016349208, 0.00368621836307, 44907945.6872762 
max values  :         54,      54874, VILLA DEL ROSARIO, Ordenanza 9 de Noviembre 25 de 1948, 2680.07859017,      2017, NORTE DE SANTANDER,  4.08629755008,   0.220098910874,  2678750166.7455 
r.m <- raster::mask(r, NSantander2)
r.m
class      : RasterLayer 
dimensions : 900, 556, 500400  (nrow, ncol, ncell)
resolution : 288.7443, 288.7443  (x, y)
extent     : 1060841, 1221383, 1257800, 1517670  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : var1.pred 
values     : 2.100869, 38.09815  (min, max)

Plotear


tm_shape(r.m) + 
  tm_raster(n=10,palette = "RdBu", auto.palette.mapping = FALSE,
            title="Distancia Inversa Ponderada\n Precipitación prevista [en mm]") + 
  tm_shape(ptos_train) + tm_dots(size=0.05, col ="black") +
  tm_legend(legend.outside=TRUE)
The argument auto.palette.mapping is deprecated. Please use midpoint for numeric data and stretch.palette for categorical data to control the palette mapping.

P <- ptos_train
IDW.out <- vector(length = length(P))
for (i in 1:length(P)) {
  IDW.out[i] <- gstat::idw(precipitaciones ~ 1, P[-i,], P[i,], idp=2.0)$var1.pred
}
OP <- par(pty="s", mar=c(4,3,0,0))
  plot(IDW.out ~ P$precipitaciones, asp=1, xlab="Observado", ylab="Predicho", pch=16,
       col=rgb(0,0,0,0.5))
  abline(lm(IDW.out ~ P$precipitaciones), col="red", lw=2,lty=2)
  abline(0,1)

par(OP)
sqrt( sum((IDW.out - P$precipitaciones)^2)/ length(P))
[1] 2.371934

Cross-validation

index = sample(1:nrow(ptos_train), 0.2 * nrow(ptos_train))
(P <- ptos_train[index, ])
class       : SpatialPointsDataFrame 
features    : 100 
extent      : 1060831, 1204606, 1268823, 1512058  (xmin, xmax, ymin, ymax)
crs         : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
variables   : 2
names       :           Lluvia, precipitaciones 
min values  : 2.60495686531067,             2.6 
max values  : 38.1458702087402,            38.1 
img <- gstat::idw(precipitaciones~1, P, newdata=grd, idp=2.0)
n   <- length(P)
Zi  <- matrix(nrow = length(img$var1.pred), ncol = n)

# Remove a point then interpolate (do this n times for each point)
st <- stack()
for (i in 1:n){
  Z1 <- gstat::idw(precipitaciones~1, P[-i,], newdata=grd, idp=2.0)
  st <- addLayer(st,raster(Z1,layer=1))
  # Calculated pseudo-value Z at j
  Zi[,i] <- n * img$var1.pred - (n-1) * Z1$var1.pred
}

# Jackknife estimator of parameter Z at location j
Zj <- as.matrix(apply(Zi, 1, sum, na.rm=T) / n )

# Compute (Zi* - Zj)^2
c1 <- apply(Zi,2,'-',Zj)            # Compute the difference
c1 <- apply(c1^2, 1, sum, na.rm=T ) # Sum the square of the difference

# Compute the confidence interval
CI <- sqrt( 1/(n*(n-1)) * c1)

# Create (CI / interpolated value) raster
img.sig   <- img
img.sig$v <- CI /img$var1.pred 
r <- raster(img.sig, layer="v")
r.m <- raster::mask(r, NSantander2)

# Plot the map
tm_shape(r.m) + tm_raster(n=7 ,title="IDW\n95% intervalo de confianza \n(en mm)") +
  tm_shape(P) + tm_dots(size=0.2) +
  
  tm_legend(legend.outside=TRUE)

Cambiar o revisar los intervalos donde muestran el error.

  1. Kriging
f.1 <- as.formula(precipitaciones ~ X + Y) 
P$X <- coordinates(P)[,1]
P$Y <- coordinates(P)[,2]

# Compute the sample variogram; note that the f.1 trend model is one of the
# parameters passed to variogram(). This tells the function to create the 
# variogram on the de-trended data.
var.smpl <- variogram(f.1, P, cloud = FALSE, cutoff=100000, width=8990)

# Compute the variogram model by passing the nugget, sill and range values
# to fit.variogram() via the vgm() function.
dat.fit  <- fit.variogram(var.smpl, fit.ranges = TRUE, fit.sills = TRUE,
                          vgm(psill=3, model="Gau", range=150000, nugget=0.2))
dat.fit
plot(var.smpl, dat.fit, xlim=c(0,110000))

f.1 <- as.formula(precipitaciones ~ X + Y)
dat.krg <- krige(f.1, P, grd, dat.fit)
[using universal kriging]
r <- raster(dat.krg)
r.m <- raster::mask(r, NSantander2)
r.m
class      : RasterLayer 
dimensions : 900, 556, 500400  (nrow, ncol, ncell)
resolution : 288.7443, 288.7443  (x, y)
extent     : 1060841, 1221383, 1257800, 1517670  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : var1.pred 
values     : 1.414373, 36.52093  (min, max)
tm_shape(r.m) + 
  tm_raster(n=10, palette="RdBu", auto.palette.mapping=FALSE, midpoint = NA,
            title="Universal Kriging\nPrecipitación predicha \n(en mm)") +
  tm_shape(P) + tm_dots(size=0.02, col="black") +
  tm_legend(legend.outside=TRUE)
The argument auto.palette.mapping is deprecated. Please use midpoint for numeric data and stretch.palette for categorical data to control the palette mapping.

library(leaflet)
library(RColorBrewer)
pal <- colorNumeric(c("red", "orange", "yellow", "blue", "darkblue"), values(precip.mask),
  na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(r.m, colors = pal, opacity = 0.6) %>%
  addLegend(pal = pal, values = values(r.m),
    title = "Precipitación interpolada con Kriging en Norte de Santander desde 26.04 al 30.04.2020 [mm]")
ning昼㹡n argumento finito para min; retornando Infningun argumento finito para max; retornando -InfSome values were outside the color scale and will be treated as NASome values were outside the color scale and will be treated as NA
r   <- raster(dat.krg, layer="var1.var")
r.m <- raster::mask(r, NSantander2)

tm_shape(r.m) + 
  tm_raster(n=7, palette ="Reds",
            title="Interpolación kriging\nMapa de varianza \n(en mm cuadrados)") +tm_shape(P) + tm_dots(size=0.02) +
  tm_legend(legend.outside=TRUE)

r   <- sqrt(raster(dat.krg, layer="var1.var")) * 1.96
r.m <- raster::mask(r, NSantander2)

tm_shape(r.m) + 
  tm_raster(n=7, palette ="Reds",
            title="Kriging Interpolation\n95% CI map \n(in mm)") +tm_shape(P) + tm_dots(size=0.02, col="black") +
  tm_legend(legend.outside=TRUE)

LS0tDQp0aXRsZTogIkludGVycG9sYWNpw7NuIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCkFuYSBNYXLDrWEgTW9udGHDsW8gSGVybsOhbmRleiANCg0KYGBge3J9DQpwcmVjaXAgPC0gcmFzdGVyKCgiQzovVXNlcnMvdXNlci9Eb2N1bWVudHMvSW50cm9fdG9fUi9jaGlycHMtdjIuMC4yMDIwLjA0LjYudGlmIikpDQpgYGANCg0KYGBge3J9DQpwcmVjaXANCmBgYA0KDQpgYGB7cn0NCihhb2kgPC0gc3RfcmVhZCgiQzovVXNlcnMvdXNlci9Eb2N1bWVudHMvTm9ydGUgZGUgU2FudGFuZGVyLzU0X05PUlRFIERFIFNBTlRBTkRFUi9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKSkNCmBgYA0KYGBge3J9DQpwcmVjaXAuY3JvcCA8LSByYXN0ZXI6OmNyb3AocHJlY2lwLCBleHRlbnQoYW9pKSkNCmBgYA0KDQpgYGB7cn0NCnByZWNpcC5tYXNrIDwtIG1hc2soeCA9IHByZWNpcC5jcm9wLCBtYXNrID0gYW9pKQ0KYGBgDQoNCmBgYHtyfQ0KcHJlY2lwLm1hc2sNCmBgYA0KDQpQbG90ZWFyOg0KYGBge3J9DQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCnBhbCA8LSBjb2xvck51bWVyaWMoYygicmVkIiwgIm9yYW5nZSIsICJ5ZWxsb3ciLCAiYmx1ZSIsICJkYXJrYmx1ZSIpLCB2YWx1ZXMocHJlY2lwLm1hc2spLA0KICBuYS5jb2xvciA9ICJ0cmFuc3BhcmVudCIpDQoNCmxlYWZsZXQoKSAlPiUgYWRkVGlsZXMoKSAlPiUNCiAgYWRkUmFzdGVySW1hZ2UocHJlY2lwLm1hc2ssIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuNikgJT4lDQogIGFkZExlZ2VuZChwYWwgPSBwYWwsIHZhbHVlcyA9IHZhbHVlcyhwcmVjaXAubWFzayksDQogICAgdGl0bGUgPSAiQ0hJUlBTIHByZWNpcGl0YWNpb25lcyBlbiBOb3J0ZSBkZSBTYW50YW5kZXIgZGVzZGUgMjYuMDQgaGFzdGEgMzAuMDQgZGUgMjAyMCBbbW1dIikNCmBgYA0KDQpgYGB7cn0NCihwcmVjaXAucG9pbnRzIDwtIHJhc3RlclRvUG9pbnRzKHByZWNpcC5tYXNrLCBzcGF0aWFsID0gVFJVRSkpDQpgYGANCmBgYHtyfQ0KbmFtZXMocHJlY2lwLnBvaW50cykgPC0gIkxsdXZpYSINCmBgYA0KYGBge3J9DQpwcmVjaXAucG9pbnRzDQpgYGANCg0KYGBge3J9DQpzdHIocHJlY2lwLnBvaW50cykNCmBgYA0KYGBge3J9DQpwbG90KHByZWNpcC5tYXNrLCBtYWluPSAiRGF0b3MgQ0hJUlBTIGRlIHByZWNpcGl0YWNpb25lcyBkZXNkZSBlbCAyNiBhbCAzMC4wNC4yMDIwIFttbV0iKQ0KcGxvdChhb2ksIGFkZD1UUlVFKQ0KDQpwb2ludHMocHJlY2lwLnBvaW50cyR4LCBwcmVjaXAucG9pbnRzJHksIGNvbCA9ICJkYXJrYmx1ZSIsIGNleCA9IDAuNCkNCmBgYA0KDQpgYGB7cn0NCmFvaSRhcmVhID0gc3RfYXJlYShhb2kpDQpgYGANCg0KYGBge3J9DQphb2kNCmBgYA0KYGBge3J9DQooYm9yZGVyX3NmIDwtIGFvaSAlPiUNCiAgIHN1bW1hcmlzZShhcmVhID0gc3VtKGFyZWEpLzEwMDAwMDApKQ0KYGBgDQoNCmBgYHtyfQ0KKGJvcmRlciA8LSBhcyhib3JkZXJfc2YsICJTcGF0aWFsIikpDQpgYGANCg0KYGBge3J9DQpwLnNmLm1hZ25hMiA8LSBzdF90cmFuc2Zvcm0oc3RfYXNfc2YocHJlY2lwLnBvaW50cyksIGNycz0gMzExNikNCmBgYA0KDQpgYGB7cn0NCk5TYW50YW5kZXIuc2YubWFnbmEgPC0gc3RfdHJhbnNmb3JtKGFvaSwgY3JzPSAzMTE2KQ0KYGBgDQoNCmBgYHtyfQ0KcHJlY2lwMiA8LSBhcyhwLnNmLm1hZ25hMiwgIlNwYXRpYWwiKQ0KYGBgDQoNCmBgYHtyfQ0KcHJlY2lwMiRwcmVjaXBpdGFjaW9uZXMgPC0gcm91bmQocHJlY2lwMiRMbHV2aWEsIDEpDQpgYGANCg0KYGBge3J9DQpwcmVjaXAyDQpgYGANCg0KYGBge3J9DQooTlNhbnRhbmRlcjIgPC0gYXMoTlNhbnRhbmRlci5zZi5tYWduYSwgIlNwYXRpYWwiKSkNCmBgYA0KDQpgYGB7cn0NCnByZWNpcDJAYmJveCA8LSBOU2FudGFuZGVyMkBiYm94DQpgYGANCg0KYGBge3J9DQp0cmFpbl9pbmRleCA8LSBzYW1wbGUoMTpucm93KHByZWNpcDIpLCAwLjcgKiBucm93KHByZWNpcDIpKQ0KdGVzdF9pbmRleCA8LSBzZXRkaWZmKDE6bnJvdyhwcmVjaXAyKSwgdHJhaW5faW5kZXgpDQpwdG9zX3RyYWluIDwtIHByZWNpcDJbdHJhaW5faW5kZXgsIF0NCnB0b3NfdGVzdCAgPC0gcHJlY2lwMlt0ZXN0X2luZGV4LF0NCmBgYA0KDQpgYGB7cn0NCnB0cmFpbiA8LSBzcFRyYW5zZm9ybShwdG9zX3RyYWluLCBjcnMocHJlY2lwLm1hc2spKQ0KcHRlc3QgPC0gc3BUcmFuc2Zvcm0ocHRvc190ZXN0LCBjcnMocHJlY2lwLm1hc2spKQ0KYGBgDQoNClBsb3RlYXINCmBgYHtyfQ0KbHBsb3QgPC0gbGVhZmxldChkYXRhID0gcHJlY2lwMikgJT4lICMgZGF0YSA9IG9yaWdpbmFsIGJvZHkgLSB0byBnZXQgdGhlIHpvb20gcmlnaHQNCiAgYWRkUHJvdmlkZXJUaWxlcygiQ2FydG9EQi5Qb3NpdHJvbiIpICU+JSANCiAgYWRkUmFzdGVySW1hZ2UocHJlY2lwLm1hc2ssIGNvbG9ycyA9IHBhbCwgb3BhY2l0eSA9IDAuNikgJT4lDQogIGFkZENpcmNsZU1hcmtlcnMoZGF0YSA9IHB0cmFpbiwgIyBmaXJzdCBncm91cA0KICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IDEsDQogICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNywNCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICBwb3B1cCA9IH5odG1sRXNjYXBlKHByZWNpcGl0YWNpb25lcyksDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBwYWwocHRvc190cmFpbiRwcmVjaXBpdGFjaW9uZXMpLCAjIHVzaW5nIGFscmVhZHkgY3JlYXRlZCBwYWxldHRlDQogICAgICAgICAgICAgICAgICAgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpLA0KICAgICAgICAgICAgICAgICAgIGdyb3VwID0gIlRyYWluaW5nIikgJT4lIA0KICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBwdGVzdCwgIyBzZWNvbmQgZ3JvdXANCiAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAxMCwNCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IC43LA0KICAgICAgICAgICAgICAgICAgIHN0cm9rZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgIHBvcHVwID0gfmh0bWxFc2NhcGUocHJlY2lwaXRhY2lvbmVzKSwNCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IHBhbChwdG9zX3Rlc3QkcHJlY2lwaXRhY2lvbmVzKSwgIyB1c2luZyBhbHJlYWR5IGNyZWF0ZWQgcGFsZXR0ZQ0KICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSwNCiAgICAgICAgICAgICAgICAgICBncm91cCA9ICJUZXN0IikgJT4lIA0KICBhZGRMZWdlbmQocG9zaXRpb24gPSAiYm90dG9tcmlnaHQiLA0KICAgICAgICAgICAgdmFsdWVzID0gfnByZWNpcGl0YWNpb25lcywNCiAgICAgICAgICAgIG9wYWNpdHkgPSAuNywNCiAgICAgICAgICAgIHBhbCA9IHBhbCwgIyBwYWxldHRlIGRlY2xhcmVkIHByZXZpb3VzbHkNCiAgICAgICAgICAgIHRpdGxlID0gIlByZWNpcGl0YWNpw7NuIikgJT4lIA0KICBsZWFmbGV0OjphZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCJUcmFpbmluZyIsICJUZXN0IiksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKSkgJT4lIA0KICBhZGRSZXNldE1hcEJ1dHRvbigpDQpgYGANCg0KYGBge3J9DQpscGxvdA0KYGBgDQoNCkludGVycG9sYWNpw7NuDQoNCjEuIFBvbMOtZ29ub3MgVGhpZXNzZW4gDQpgYGB7cn0NCnRoIDwtIGFzKGRpcmljaGxldChhcy5wcHAocHRvc190cmFpbikpLCAiU3BhdGlhbFBvbHlnb25zIikNCg0KY3JzKHRoKSA8LSBjcnMocHRvc190cmFpbikNCmNycyhOU2FudGFuZGVyMikgPC0gY3JzKHB0b3NfdHJhaW4pDQpgYGANCg0KYGBge3J9DQpjcnModGgpDQpgYGANCmBgYHtyfQ0KY3JzKHB0b3NfdHJhaW4pDQpgYGANCg0KYGBge3J9DQp0aC56IDwtIG92ZXIodGgsIHB0b3NfdHJhaW4sIGZuPW1lYW4pDQoNCnRoLnNwZGYgPC0gU3BhdGlhbFBvbHlnb25zRGF0YUZyYW1lKHRoLCB0aC56KQ0KDQp0aC5jbHAgPC0gcmFzdGVyOjppbnRlcnNlY3QoTlNhbnRhbmRlcjIsIHRoLnNwZGYpDQpgYGANCg0KYGBge3J9DQp0bV9zaGFwZSh0aC5jbHApICsgDQogIHRtX3BvbHlnb25zKGNvbD0icHJlY2lwaXRhY2lvbmVzIiwgcGFsZXR0ZT0iUmRCdSIsIG1pZHBvaW50PTMwLjAsDQogICAgICAgICAgICAgIHRpdGxlPSJQb2zDrWdvbm9zIFRoaWVzc2VuXG4gUHJlY2lwaXRhY2nDs24gcHJlZGljaGFcbiBbZW4gbW1dKSIpICsNCiAgdG1fbGVnZW5kKGxlZ2VuZC5vdXRzaWRlPVRSVUUpDQpgYGANCg0KDQoyLiBJRFcNCmBgYHtyfQ0KZ3JkICAgICAgICAgICAgICA8LSBhcy5kYXRhLmZyYW1lKHNwc2FtcGxlKHB0b3NfdHJhaW4sICJyZWd1bGFyIiwgbj01MDAwMDApKQ0KIyBZb3UgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgaXMgdGhlIGV4cGVjdGVkIHNpemUgb2YgdGhlIG91dHB1dCBncmQNCm5hbWVzKGdyZCkgICAgICAgPC0gYygiWCIsICJZIikNCmNvb3JkaW5hdGVzKGdyZCkgPC0gYygiWCIsICJZIikNCmdyaWRkZWQoZ3JkKSAgICAgPC0gVFJVRSAgIyBDcmVhdGUgU3BhdGlhbFBpeGVsIG9iamVjdA0KZnVsbGdyaWQoZ3JkKSAgICA8LSBUUlVFICAjIENyZWF0ZSBTcGF0aWFsR3JpZCBvYmplY3QNCg0KIyBBZGQgUCdzIHByb2plY3Rpb24gaW5mb3JtYXRpb24gdG8gdGhlIGVtcHR5IGdyaWQNCnByb2o0c3RyaW5nKGdyZCkgPC0gcHJvajRzdHJpbmcocHRvc190cmFpbikNCg0KIyBJbnRlcnBvbGF0ZSB0aGUgZ3JpZCBjZWxscyB1c2luZyBhIHBvd2VyIHZhbHVlIG9mIDIgKGlkcD0yLjApDQpQLmlkdyA8LSBnc3RhdDo6aWR3KHByZWNpcGl0YWNpb25lcyB+IDEsIHB0b3NfdHJhaW4sIG5ld2RhdGE9Z3JkLCBpZHA9Mi4wKQ0KDQojIENvbnZlcnQgdG8gcmFzdGVyIG9iamVjdCB0aGVuIGNsaXAgdG8gQU9JDQpyICAgICAgIDwtIHJhc3RlcihQLmlkdykNCmBgYA0KYGBge3J9DQpyDQpgYGANCmBgYHtyfQ0KTlNhbnRhbmRlcjINCmBgYA0KYGBge3J9DQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIE5TYW50YW5kZXIyKQ0KYGBgDQoNCmBgYHtyfQ0Kci5tDQpgYGANCg0KUGxvdGVhcg0KYGBge3J9DQoNCnRtX3NoYXBlKHIubSkgKyANCiAgdG1fcmFzdGVyKG49MTAscGFsZXR0ZSA9ICJSZEJ1IiwgYXV0by5wYWxldHRlLm1hcHBpbmcgPSBGQUxTRSwNCiAgICAgICAgICAgIHRpdGxlPSJEaXN0YW5jaWEgSW52ZXJzYSBQb25kZXJhZGFcbiBQcmVjaXBpdGFjacOzbiBwcmV2aXN0YSBbZW4gbW1dIikgKyANCiAgdG1fc2hhcGUocHRvc190cmFpbikgKyB0bV9kb3RzKHNpemU9MC4wNSwgY29sID0iYmxhY2siKSArDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQoNCg0KYGBge3J9DQpQIDwtIHB0b3NfdHJhaW4NCmBgYA0KDQpgYGB7cn0NCklEVy5vdXQgPC0gdmVjdG9yKGxlbmd0aCA9IGxlbmd0aChQKSkNCmBgYA0KDQpgYGB7cn0NCmZvciAoaSBpbiAxOmxlbmd0aChQKSkgew0KICBJRFcub3V0W2ldIDwtIGdzdGF0OjppZHcocHJlY2lwaXRhY2lvbmVzIH4gMSwgUFstaSxdLCBQW2ksXSwgaWRwPTIuMCkkdmFyMS5wcmVkDQp9DQpgYGANCg0KYGBge3J9DQpPUCA8LSBwYXIocHR5PSJzIiwgbWFyPWMoNCwzLDAsMCkpDQogIHBsb3QoSURXLm91dCB+IFAkcHJlY2lwaXRhY2lvbmVzLCBhc3A9MSwgeGxhYj0iT2JzZXJ2YWRvIiwgeWxhYj0iUHJlZGljaG8iLCBwY2g9MTYsDQogICAgICAgY29sPXJnYigwLDAsMCwwLjUpKQ0KICBhYmxpbmUobG0oSURXLm91dCB+IFAkcHJlY2lwaXRhY2lvbmVzKSwgY29sPSJyZWQiLCBsdz0yLGx0eT0yKQ0KICBhYmxpbmUoMCwxKQ0KYGBgDQoNCmBgYHtyfQ0KcGFyKE9QKQ0KYGBgDQoNCmBgYHtyfQ0Kc3FydCggc3VtKChJRFcub3V0IC0gUCRwcmVjaXBpdGFjaW9uZXMpXjIpLyBsZW5ndGgoUCkpDQpgYGANCg0KQ3Jvc3MtdmFsaWRhdGlvbg0KDQpgYGB7cn0NCmluZGV4ID0gc2FtcGxlKDE6bnJvdyhwdG9zX3RyYWluKSwgMC4yICogbnJvdyhwdG9zX3RyYWluKSkNCihQIDwtIHB0b3NfdHJhaW5baW5kZXgsIF0pDQpgYGANCg0KYGBge3J9DQppbWcgPC0gZ3N0YXQ6OmlkdyhwcmVjaXBpdGFjaW9uZXN+MSwgUCwgbmV3ZGF0YT1ncmQsIGlkcD0yLjApDQpuICAgPC0gbGVuZ3RoKFApDQpaaSAgPC0gbWF0cml4KG5yb3cgPSBsZW5ndGgoaW1nJHZhcjEucHJlZCksIG5jb2wgPSBuKQ0KDQojIFJlbW92ZSBhIHBvaW50IHRoZW4gaW50ZXJwb2xhdGUgKGRvIHRoaXMgbiB0aW1lcyBmb3IgZWFjaCBwb2ludCkNCnN0IDwtIHN0YWNrKCkNCmZvciAoaSBpbiAxOm4pew0KICBaMSA8LSBnc3RhdDo6aWR3KHByZWNpcGl0YWNpb25lc34xLCBQWy1pLF0sIG5ld2RhdGE9Z3JkLCBpZHA9Mi4wKQ0KICBzdCA8LSBhZGRMYXllcihzdCxyYXN0ZXIoWjEsbGF5ZXI9MSkpDQogICMgQ2FsY3VsYXRlZCBwc2V1ZG8tdmFsdWUgWiBhdCBqDQogIFppWyxpXSA8LSBuICogaW1nJHZhcjEucHJlZCAtIChuLTEpICogWjEkdmFyMS5wcmVkDQp9DQoNCiMgSmFja2tuaWZlIGVzdGltYXRvciBvZiBwYXJhbWV0ZXIgWiBhdCBsb2NhdGlvbiBqDQpaaiA8LSBhcy5tYXRyaXgoYXBwbHkoWmksIDEsIHN1bSwgbmEucm09VCkgLyBuICkNCg0KIyBDb21wdXRlIChaaSogLSBaaileMg0KYzEgPC0gYXBwbHkoWmksMiwnLScsWmopICAgICAgICAgICAgIyBDb21wdXRlIHRoZSBkaWZmZXJlbmNlDQpjMSA8LSBhcHBseShjMV4yLCAxLCBzdW0sIG5hLnJtPVQgKSAjIFN1bSB0aGUgc3F1YXJlIG9mIHRoZSBkaWZmZXJlbmNlDQoNCiMgQ29tcHV0ZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbA0KQ0kgPC0gc3FydCggMS8obioobi0xKSkgKiBjMSkNCg0KIyBDcmVhdGUgKENJIC8gaW50ZXJwb2xhdGVkIHZhbHVlKSByYXN0ZXINCmltZy5zaWcgICA8LSBpbWcNCmltZy5zaWckdiA8LSBDSSAvaW1nJHZhcjEucHJlZCANCmBgYA0KDQpgYGB7cn0NCnIgPC0gcmFzdGVyKGltZy5zaWcsIGxheWVyPSJ2IikNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgTlNhbnRhbmRlcjIpDQoNCiMgUGxvdCB0aGUgbWFwDQp0bV9zaGFwZShyLm0pICsgdG1fcmFzdGVyKG49NyAsdGl0bGU9IklEV1xuOTUlIGludGVydmFsbyBkZSBjb25maWFuemEgXG4oZW4gbW0pIikgKw0KICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjIpICsNCiAgDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQpDYW1iaWFyIG8gcmV2aXNhciBsb3MgaW50ZXJ2YWxvcyBkb25kZSBtdWVzdHJhbiBlbCBlcnJvci4NCg0KMy4gS3JpZ2luZyANCg0KYGBge3J9DQpmLjEgPC0gYXMuZm9ybXVsYShwcmVjaXBpdGFjaW9uZXMgfiBYICsgWSkgDQpQJFggPC0gY29vcmRpbmF0ZXMoUClbLDFdDQpQJFkgPC0gY29vcmRpbmF0ZXMoUClbLDJdDQoNCiMgQ29tcHV0ZSB0aGUgc2FtcGxlIHZhcmlvZ3JhbTsgbm90ZSB0aGF0IHRoZSBmLjEgdHJlbmQgbW9kZWwgaXMgb25lIG9mIHRoZQ0KIyBwYXJhbWV0ZXJzIHBhc3NlZCB0byB2YXJpb2dyYW0oKS4gVGhpcyB0ZWxscyB0aGUgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSANCiMgdmFyaW9ncmFtIG9uIHRoZSBkZS10cmVuZGVkIGRhdGEuDQp2YXIuc21wbCA8LSB2YXJpb2dyYW0oZi4xLCBQLCBjbG91ZCA9IEZBTFNFLCBjdXRvZmY9MTAwMDAwLCB3aWR0aD04OTkwKQ0KDQojIENvbXB1dGUgdGhlIHZhcmlvZ3JhbSBtb2RlbCBieSBwYXNzaW5nIHRoZSBudWdnZXQsIHNpbGwgYW5kIHJhbmdlIHZhbHVlcw0KIyB0byBmaXQudmFyaW9ncmFtKCkgdmlhIHRoZSB2Z20oKSBmdW5jdGlvbi4NCmRhdC5maXQgIDwtIGZpdC52YXJpb2dyYW0odmFyLnNtcGwsIGZpdC5yYW5nZXMgPSBUUlVFLCBmaXQuc2lsbHMgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2Z20ocHNpbGw9MywgbW9kZWw9IkdhdSIsIHJhbmdlPTE1MDAwMCwgbnVnZ2V0PTAuMikpDQpgYGANCg0KYGBge3J9DQpkYXQuZml0DQpgYGANCg0KYGBge3J9DQpwbG90KHZhci5zbXBsLCBkYXQuZml0LCB4bGltPWMoMCwxMTAwMDApKQ0KYGBgDQoNCmBgYHtyfQ0KZi4xIDwtIGFzLmZvcm11bGEocHJlY2lwaXRhY2lvbmVzIH4gWCArIFkpDQpkYXQua3JnIDwtIGtyaWdlKGYuMSwgUCwgZ3JkLCBkYXQuZml0KQ0KYGBgDQoNCmBgYHtyfQ0KciA8LSByYXN0ZXIoZGF0LmtyZykNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgTlNhbnRhbmRlcjIpDQpgYGANCg0KYGBge3J9DQpyLm0NCmBgYA0KDQpgYGB7cn0NCnRtX3NoYXBlKHIubSkgKyANCiAgdG1fcmFzdGVyKG49MTAsIHBhbGV0dGU9IlJkQnUiLCBhdXRvLnBhbGV0dGUubWFwcGluZz1GQUxTRSwgbWlkcG9pbnQgPSBOQSwNCiAgICAgICAgICAgIHRpdGxlPSJVbml2ZXJzYWwgS3JpZ2luZ1xuUHJlY2lwaXRhY2nDs24gcHJlZGljaGEgXG4oZW4gbW0pIikgKw0KICB0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjAyLCBjb2w9ImJsYWNrIikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpwYWwgPC0gY29sb3JOdW1lcmljKGMoInJlZCIsICJvcmFuZ2UiLCAieWVsbG93IiwgImJsdWUiLCAiZGFya2JsdWUiKSwgdmFsdWVzKHByZWNpcC5tYXNrKSwNCiAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZFJhc3RlckltYWdlKHIubSwgY29sb3JzID0gcGFsLCBvcGFjaXR5ID0gMC42KSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgdmFsdWVzID0gdmFsdWVzKHIubSksDQogICAgdGl0bGUgPSAiUHJlY2lwaXRhY2nDs24gaW50ZXJwb2xhZGEgY29uIEtyaWdpbmcgZW4gTm9ydGUgZGUgU2FudGFuZGVyIGRlc2RlIDI2LjA0IGFsIDMwLjA0LjIwMjAgW21tXSIpDQpgYGANCg0KYGBge3J9DQpyICAgPC0gcmFzdGVyKGRhdC5rcmcsIGxheWVyPSJ2YXIxLnZhciIpDQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIE5TYW50YW5kZXIyKQ0KDQp0bV9zaGFwZShyLm0pICsgDQogIHRtX3Jhc3RlcihuPTcsIHBhbGV0dGUgPSJSZWRzIiwNCiAgICAgICAgICAgIHRpdGxlPSJJbnRlcnBvbGFjacOzbiBrcmlnaW5nXG5NYXBhIGRlIHZhcmlhbnphIFxuKGVuIG1tIGN1YWRyYWRvcykiKSArdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemU9MC4wMikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KDQpgYGB7cn0NCnIgICA8LSBzcXJ0KHJhc3RlcihkYXQua3JnLCBsYXllcj0idmFyMS52YXIiKSkgKiAxLjk2DQpyLm0gPC0gcmFzdGVyOjptYXNrKHIsIE5TYW50YW5kZXIyKQ0KDQp0bV9zaGFwZShyLm0pICsgDQogIHRtX3Jhc3RlcihuPTcsIHBhbGV0dGUgPSJSZWRzIiwNCiAgICAgICAgICAgIHRpdGxlPSJLcmlnaW5nIEludGVycG9sYXRpb25cbjk1JSBDSSBtYXAgXG4oaW4gbW0pIikgK3RtX3NoYXBlKFApICsgdG1fZG90cyhzaXplPTAuMDIsIGNvbD0iYmxhY2siKSArDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQoNCg==