Generación de escenarios futuros con modelos de pronósticos en series de tiempo

Ejemplo en clase Población

(Lunes 17)

## Librerias
library(forecast)
library(tidyverse)
library(ggplot2)

Importar base de datos (población)

#file.choose()
bdpob <- read_csv("/Users/genarorodriguezalcantara/Desktop/Tec/Generacion de escenarios futuros con analítica (Gpo 101)/PIB/M1 - Actividad 2/population.csv")

Analisis Descriptivo

summary(bdpob)
##     state                year        population      
##  Length:6020        Min.   :1900   Min.   :   43000  
##  Class :character   1st Qu.:1930   1st Qu.:  901483  
##  Mode  :character   Median :1960   Median : 2359000  
##                     Mean   :1960   Mean   : 3726003  
##                     3rd Qu.:1990   3rd Qu.: 4541883  
##                     Max.   :2019   Max.   :39512223
str(bdpob)
## spc_tbl_ [6,020 × 3] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ state     : chr [1:6020] "AK" "AK" "AK" "AK" ...
##  $ year      : num [1:6020] 1950 1951 1952 1953 1954 ...
##  $ population: num [1:6020] 135000 158000 189000 205000 215000 222000 224000 231000 224000 224000 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   state = col_character(),
##   ..   year = col_double(),
##   ..   population = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
head(bdpob)
## # A tibble: 6 × 3
##   state  year population
##   <chr> <dbl>      <dbl>
## 1 AK     1950     135000
## 2 AK     1951     158000
## 3 AK     1952     189000
## 4 AK     1953     205000
## 5 AK     1954     215000
## 6 AK     1955     222000

Serie de tiempo en Texas

poblacion_texas <- bdpob %>% filter(state=="TX")
ggplot(poblacion_texas, aes(x=year, y=population)) +
        geom_line() +
        labs(title="Poblacion Texas", x = "Año", y = "Población")

ts_texas <- ts(poblacion_texas$population, start = 1900, frequency = 1) #ts anual

# ts trimestral 
#ts_texas <- ts(poblaciomn_texas$population, start=c(1900, 4), frequency=4)

# ts mensual 
#ts_texas <- ts(poblaciomn_texas$population, start=c(1900, 8), frequency=12)

arima_texas <- auto.arima(ts_texas)
summary(ts_texas)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##  3055000  5823500  9514500 11825205 16866230 28995881
pronostico_texas <- forecast(arima_texas, level=95, h=10)
plot(pronostico_texas, main="Población en Texas")

Ejercicio en clase: Mapa

Librerias

library(forecast)
library(tidyverse)
library(ggplot2)
library(maps)
library(leaflet)

Crear Mapa Inicial

# crear mapa de EUA por decada, con unngradiente verde-rojo de la poblacion por estado, desde 1950, 2050
#map(database="state")
#map(database="state", regions="Texas", col="darkred", fill=TRUE, add=TRUE)
#ap(database="state", regions="New York", col="darkgreen", fill=TRUE, add=TRUE)

Leche saborizada Hershey´s

Instalar paquetes y llamar librerias

library(forecast)
library(tidyverse)
library(ggplot2)
library(readxl)

Importar la base de datos

ventas <- read.csv("/Users/genarorodriguezalcantara/Desktop/Tec/Generacion de escenarios futuros con analítica (Gpo 101)/PIB/M1 - Actividad 2/Ventas_Históricas_Lechitas.csv")

Modelo AUTO.ARIMA

ts_ventas <- ts(ventas$Ventas, start = c(2017,1), frequency = 12)
autoplot(ts_ventas) + labs(title = "Ventas de leche saborizada Hersheys", x = "Tiempo", y = "Miles de dolares")

arima_ventas <- auto.arima(ts_ventas)
summary(arima_ventas)
## Series: ts_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8980
## s.e.  0.1551   0.2047   14.5025
## 
## sigma^2 = 202700:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE      MAE        MPE      MAPE       MASE
## Training set 25.22163 343.863 227.1699 0.08059942 0.7069541 0.06491041
##                   ACF1
## Training set 0.2081043
pronostico_ventas <- forecast(arima_ventas, level = 95, h = 12) 
autoplot(pronostico_ventas, main = "Pronostico de ventas de leche saborizada Hersheys")

Modelo Regresión Lineal

ventas$mes <- 1:36
regresion_ventas <- lm(Ventas ~ mes, data = ventas)
summary(regresion_ventas)
## 
## Call:
## lm(formula = Ventas ~ mes, data = ventas)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2075.79  -326.41    33.74   458.41  1537.04 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 24894.67     275.03   90.52   <2e-16 ***
## mes           298.37      12.96   23.02   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 808 on 34 degrees of freedom
## Multiple R-squared:  0.9397, Adjusted R-squared:  0.9379 
## F-statistic: 529.8 on 1 and 34 DF,  p-value: < 2.2e-16
siguiente_anio <- data.frame(mes=37:48)
prediccion_regresion <- predict(regresion_ventas, siguiente_anio)
prediccion_regresion
##        1        2        3        4        5        6        7        8 
## 35934.49 36232.86 36531.23 36829.61 37127.98 37426.35 37724.73 38023.10 
##        9       10       11       12 
## 38321.47 38619.85 38918.22 39216.59
plot(ventas$mes, ventas$Ventas, main = "Pronóstico de ventas de Hersheys", xlab = "Tiempo", ylab = "Miles de dolares")
abline(regresion_ventas, col = "blue")
points(siguiente_anio$mes, prediccion_regresion, col = "red")

predicciones_reales <- predict(regresion_ventas, ventas)
MAPE <- mean(abs((ventas$Ventas - predicciones_reales)/ventas$Ventas))*100
MAPE
## [1] 2.011298

Conclusiones

El mejor modelo que se adapta a la serie es el SARIMA con un Mape de 0.71%, comparado con la Regresion Lineal que su MAPE es de 2.01%

Para el siguiente año, la proyección de ventas es la siguiente:

Mes y Año Escenario Optimista Escenario Esperado Escenario Pesimista
Jan 2020 35498.90 34616.48 36381.32
Feb 2020 34202.17 33155.28 35249.05
Mar 2020 36703.01 35596.10 37809.92
Apr 2020 36271.90 35141.44 37402.36
May 2020 37121.98 35982.07 38261.90
Jun 2020 37102.65 35958.90 38246.40
Jul 2020 37151.04 36005.73 38296.34
Aug 2020 38564.64 37418.70 39710.58
Sep 2020 38755.22 37609.03 39901.42
Oct 2020 39779.02 38632.72 40925.32
Nov 2020 38741.63 37595.28 39887.97
Dec 2020 38645.86 37499.50 39792.22
ventasporanio <- read.csv("/Users/genarorodriguezalcantara/Desktop/Tec/Generacion de escenarios futuros con analítica (Gpo 101)/PIB/M1 - Actividad 2/ventas_por_anio.csv")
ggplot(ventasporanio, aes(x = mes,y= ventas, col=as.factor(anio), group=anio))+
  geom_line() + labs(title = "Ventas de Leche Saborizada Hershey's por Año", x="Mes", y= "Miles de Dólares")

Nuestra recomendación sería realizar campañas publicitarias para aumentar el consumo de leche saborizada Hershey’s en el primer semestre del año.

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDIuIEdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvcyBjb24gbW9kZWxvcyBkZSBwcm9uw7NzdGljb3MgZW4gc2VyaWVzIGRlIHRpZW1wbyB8IEEwMDgzMzE3MiIKYXV0aG9yOiAiR2VuYXJvIFJvZHLDrWd1ZXogQWxjw6FudGFyYSAtIEEwMDgzMzE3MiIKZGF0ZTogIjIwMjUtMDItMTkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogY2VydWxlYW4KLS0tCiFbXSgvVXNlcnMvZ2VuYXJvcm9kcmlndWV6YWxjYW50YXJhL0Rlc2t0b3AvVGVjL0dlbmVyYWNpb24gZGUgZXNjZW5hcmlvcyBmdXR1cm9zIGNvbiBhbmFsacyBdGljYSAoR3BvIDEwMSkvUElCLzIwMC5naWYpCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOiBicm93bjsiPkdlbmVyYWNpw7NuIGRlIGVzY2VuYXJpb3MgZnV0dXJvcyBjb24gbW9kZWxvcyBkZSBwcm9uw7NzdGljb3MgZW4gc2VyaWVzIGRlIHRpZW1wbwoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGJyb3duOyI+RWplbXBsbyBlbiBjbGFzZSBQb2JsYWNpw7NuCihMdW5lcyAxNykKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIExpYnJlcmlhcwpsaWJyYXJ5KGZvcmVjYXN0KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogYnJvd247Ij5JbXBvcnRhciBiYXNlIGRlIGRhdG9zIChwb2JsYWNpw7NuKQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI2ZpbGUuY2hvb3NlKCkKYmRwb2IgPC0gcmVhZF9jc3YoIi9Vc2Vycy9nZW5hcm9yb2RyaWd1ZXphbGNhbnRhcmEvRGVza3RvcC9UZWMvR2VuZXJhY2lvbiBkZSBlc2NlbmFyaW9zIGZ1dHVyb3MgY29uIGFuYWxpzIF0aWNhIChHcG8gMTAxKS9QSUIvTTEgLSBBY3RpdmlkYWQgMi9wb3B1bGF0aW9uLmNzdiIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiBicm93bjsiPkFuYWxpc2lzIERlc2NyaXB0aXZvCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdW1tYXJ5KGJkcG9iKQpzdHIoYmRwb2IpCmhlYWQoYmRwb2IpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiBicm93bjsiPlNlcmllIGRlIHRpZW1wbyBlbiBUZXhhcwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcG9ibGFjaW9uX3RleGFzIDwtIGJkcG9iICU+JSBmaWx0ZXIoc3RhdGU9PSJUWCIpCmdncGxvdChwb2JsYWNpb25fdGV4YXMsIGFlcyh4PXllYXIsIHk9cG9wdWxhdGlvbikpICsKCQlnZW9tX2xpbmUoKSArCgkJbGFicyh0aXRsZT0iUG9ibGFjaW9uIFRleGFzIiwgeCA9ICJBw7FvIiwgeSA9ICJQb2JsYWNpw7NuIikKCQkKdHNfdGV4YXMgPC0gdHMocG9ibGFjaW9uX3RleGFzJHBvcHVsYXRpb24sIHN0YXJ0ID0gMTkwMCwgZnJlcXVlbmN5ID0gMSkgI3RzIGFudWFsCgojIHRzIHRyaW1lc3RyYWwgCiN0c190ZXhhcyA8LSB0cyhwb2JsYWNpb21uX3RleGFzJHBvcHVsYXRpb24sIHN0YXJ0PWMoMTkwMCwgNCksIGZyZXF1ZW5jeT00KQoKIyB0cyBtZW5zdWFsIAojdHNfdGV4YXMgPC0gdHMocG9ibGFjaW9tbl90ZXhhcyRwb3B1bGF0aW9uLCBzdGFydD1jKDE5MDAsIDgpLCBmcmVxdWVuY3k9MTIpCgphcmltYV90ZXhhcyA8LSBhdXRvLmFyaW1hKHRzX3RleGFzKQpzdW1tYXJ5KHRzX3RleGFzKQpwcm9ub3N0aWNvX3RleGFzIDwtIGZvcmVjYXN0KGFyaW1hX3RleGFzLCBsZXZlbD05NSwgaD0xMCkKcGxvdChwcm9ub3N0aWNvX3RleGFzLCBtYWluPSJQb2JsYWNpw7NuIGVuIFRleGFzIikKYGBgCgojIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogYnJvd247Ij5FamVyY2ljaW8gZW4gY2xhc2U6IE1hcGEKCiMjIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogYnJvd247Ij5MaWJyZXJpYXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobWFwcykKbGlicmFyeShsZWFmbGV0KQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogYnJvd247Ij5DcmVhciBNYXBhIEluaWNpYWwKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgY3JlYXIgbWFwYSBkZSBFVUEgcG9yIGRlY2FkYSwgY29uIHVubmdyYWRpZW50ZSB2ZXJkZS1yb2pvIGRlIGxhIHBvYmxhY2lvbiBwb3IgZXN0YWRvLCBkZXNkZSAxOTUwLCAyMDUwCiNtYXAoZGF0YWJhc2U9InN0YXRlIikKI21hcChkYXRhYmFzZT0ic3RhdGUiLCByZWdpb25zPSJUZXhhcyIsIGNvbD0iZGFya3JlZCIsIGZpbGw9VFJVRSwgYWRkPVRSVUUpCiNhcChkYXRhYmFzZT0ic3RhdGUiLCByZWdpb25zPSJOZXcgWW9yayIsIGNvbD0iZGFya2dyZWVuIiwgZmlsbD1UUlVFLCBhZGQ9VFJVRSkKYGBgCiFbXSgvVXNlcnMvZ2VuYXJvcm9kcmlndWV6YWxjYW50YXJhL0Rlc2t0b3AvVGVjL0dlbmVyYWNpb24gZGUgZXNjZW5hcmlvcyBmdXR1cm9zIGNvbiBhbmFsacyBdGljYSAoR3BvIDEwMSkvUElCL00xIC0gQWN0aXZpZGFkIDIvbWFwYS0wMDAwMTQtbWkuZ2lmKQoKIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGJyb3duOyI+TGVjaGUgc2Fib3JpemFkYSBIZXJzaGV5wrRzPC9hcGFuPgoKIyMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiBicm93bjsiPkluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlhczwvYXBhbj4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVhZHhsKQpgYGAKCiMjIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjogIzgwNDAwMDsiPkltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3M8L2FwYW4+CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp2ZW50YXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9nZW5hcm9yb2RyaWd1ZXphbGNhbnRhcmEvRGVza3RvcC9UZWMvR2VuZXJhY2lvbiBkZSBlc2NlbmFyaW9zIGZ1dHVyb3MgY29uIGFuYWxpzIF0aWNhIChHcG8gMTAxKS9QSUIvTTEgLSBBY3RpdmlkYWQgMi9WZW50YXNfSGlzdG/MgXJpY2FzX0xlY2hpdGFzLmNzdiIpCmBgYAoKIyMjIDxzcGFuIHN0eWxlID0gImNvbG9yOiAjODA0MDAwOyI+TW9kZWxvIEFVVE8uQVJJTUE8L2FwYW4+CgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0c192ZW50YXMgPC0gdHModmVudGFzJFZlbnRhcywgc3RhcnQgPSBjKDIwMTcsMSksIGZyZXF1ZW5jeSA9IDEyKQphdXRvcGxvdCh0c192ZW50YXMpICsgbGFicyh0aXRsZSA9ICJWZW50YXMgZGUgbGVjaGUgc2Fib3JpemFkYSBIZXJzaGV5cyIsIHggPSAiVGllbXBvIiwgeSA9ICJNaWxlcyBkZSBkb2xhcmVzIikKYXJpbWFfdmVudGFzIDwtIGF1dG8uYXJpbWEodHNfdmVudGFzKQpzdW1tYXJ5KGFyaW1hX3ZlbnRhcykKcHJvbm9zdGljb192ZW50YXMgPC0gZm9yZWNhc3QoYXJpbWFfdmVudGFzLCBsZXZlbCA9IDk1LCBoID0gMTIpIAphdXRvcGxvdChwcm9ub3N0aWNvX3ZlbnRhcywgbWFpbiA9ICJQcm9ub3N0aWNvIGRlIHZlbnRhcyBkZSBsZWNoZSBzYWJvcml6YWRhIEhlcnNoZXlzIikKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGJyb3duOyI+TW9kZWxvIFJlZ3Jlc2nDs24gTGluZWFsPC9hcGFuPgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdmVudGFzJG1lcyA8LSAxOjM2CnJlZ3Jlc2lvbl92ZW50YXMgPC0gbG0oVmVudGFzIH4gbWVzLCBkYXRhID0gdmVudGFzKQpzdW1tYXJ5KHJlZ3Jlc2lvbl92ZW50YXMpCnNpZ3VpZW50ZV9hbmlvIDwtIGRhdGEuZnJhbWUobWVzPTM3OjQ4KQpwcmVkaWNjaW9uX3JlZ3Jlc2lvbiA8LSBwcmVkaWN0KHJlZ3Jlc2lvbl92ZW50YXMsIHNpZ3VpZW50ZV9hbmlvKQpwcmVkaWNjaW9uX3JlZ3Jlc2lvbgpwbG90KHZlbnRhcyRtZXMsIHZlbnRhcyRWZW50YXMsIG1haW4gPSAiUHJvbsOzc3RpY28gZGUgdmVudGFzIGRlIEhlcnNoZXlzIiwgeGxhYiA9ICJUaWVtcG8iLCB5bGFiID0gIk1pbGVzIGRlIGRvbGFyZXMiKQphYmxpbmUocmVncmVzaW9uX3ZlbnRhcywgY29sID0gImJsdWUiKQpwb2ludHMoc2lndWllbnRlX2FuaW8kbWVzLCBwcmVkaWNjaW9uX3JlZ3Jlc2lvbiwgY29sID0gInJlZCIpCnByZWRpY2Npb25lc19yZWFsZXMgPC0gcHJlZGljdChyZWdyZXNpb25fdmVudGFzLCB2ZW50YXMpCk1BUEUgPC0gbWVhbihhYnMoKHZlbnRhcyRWZW50YXMgLSBwcmVkaWNjaW9uZXNfcmVhbGVzKS92ZW50YXMkVmVudGFzKSkqMTAwCk1BUEUKYGBgCgojIyMgPHNwYW4gc3R5bGUgPSAiY29sb3I6IGJyb3duOyI+Q29uY2x1c2lvbmVzPC9hcGFuPgoKRWwgbWVqb3IgbW9kZWxvIHF1ZSBzZSBhZGFwdGEgYSBsYSBzZXJpZSBlcyBlbCAqKlNBUklNQSoqIGNvbiB1biBNYXBlIGRlIDAuNzElLCBjb21wYXJhZG8gY29uIGxhIFJlZ3Jlc2lvbiBMaW5lYWwgcXVlIHN1IE1BUEUgZXMgZGUgMi4wMSUKClBhcmEgZWwgc2lndWllbnRlIGHDsW8sIGxhIHByb3llY2Npw7NuIGRlIHZlbnRhcyBlcyBsYSBzaWd1aWVudGU6Cgp8IE1lcyB5IEHDsW8gfCBFc2NlbmFyaW8gT3B0aW1pc3RhIHwgRXNjZW5hcmlvIEVzcGVyYWRvIHwgRXNjZW5hcmlvIFBlc2ltaXN0YSB8CnwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IEphbiAyMDIwICB8IDM1NDk4LjkwICAgICAgICAgICAgfCAzNDYxNi40OCAgICAgICAgICAgfCAzNjM4MS4zMiAgICAgICAgICAgIHwKfCBGZWIgMjAyMCAgfCAzNDIwMi4xNyAgICAgICAgICAgIHwgMzMxNTUuMjggICAgICAgICAgIHwgMzUyNDkuMDUgICAgICAgICAgICB8CnwgTWFyIDIwMjAgIHwgMzY3MDMuMDEgICAgICAgICAgICB8IDM1NTk2LjEwICAgICAgICAgICB8IDM3ODA5LjkyICAgICAgICAgICAgfAp8IEFwciAyMDIwICB8IDM2MjcxLjkwICAgICAgICAgICAgfCAzNTE0MS40NCAgICAgICAgICAgfCAzNzQwMi4zNiAgICAgICAgICAgIHwKfCBNYXkgMjAyMCAgfCAzNzEyMS45OCAgICAgICAgICAgIHwgMzU5ODIuMDcgICAgICAgICAgIHwgMzgyNjEuOTAgICAgICAgICAgICB8CnwgSnVuIDIwMjAgIHwgMzcxMDIuNjUgICAgICAgICAgICB8IDM1OTU4LjkwICAgICAgICAgICB8IDM4MjQ2LjQwICAgICAgICAgICAgfAp8IEp1bCAyMDIwICB8IDM3MTUxLjA0ICAgICAgICAgICAgfCAzNjAwNS43MyAgICAgICAgICAgfCAzODI5Ni4zNCAgICAgICAgICAgIHwKfCBBdWcgMjAyMCAgfCAzODU2NC42NCAgICAgICAgICAgIHwgMzc0MTguNzAgICAgICAgICAgIHwgMzk3MTAuNTggICAgICAgICAgICB8CnwgU2VwIDIwMjAgIHwgMzg3NTUuMjIgICAgICAgICAgICB8IDM3NjA5LjAzICAgICAgICAgICB8IDM5OTAxLjQyICAgICAgICAgICAgfAp8IE9jdCAyMDIwICB8IDM5Nzc5LjAyICAgICAgICAgICAgfCAzODYzMi43MiAgICAgICAgICAgfCA0MDkyNS4zMiAgICAgICAgICAgIHwKfCBOb3YgMjAyMCAgfCAzODc0MS42MyAgICAgICAgICAgIHwgMzc1OTUuMjggICAgICAgICAgIHwgMzk4ODcuOTcgICAgICAgICAgICB8CnwgRGVjIDIwMjAgIHwgMzg2NDUuODYgICAgICAgICAgICB8IDM3NDk5LjUwICAgICAgICAgICB8IDM5NzkyLjIyICAgICAgICAgICAgfAoKYGBge3J9CnZlbnRhc3BvcmFuaW8gPC0gcmVhZC5jc3YoIi9Vc2Vycy9nZW5hcm9yb2RyaWd1ZXphbGNhbnRhcmEvRGVza3RvcC9UZWMvR2VuZXJhY2lvbiBkZSBlc2NlbmFyaW9zIGZ1dHVyb3MgY29uIGFuYWxpzIF0aWNhIChHcG8gMTAxKS9QSUIvTTEgLSBBY3RpdmlkYWQgMi92ZW50YXNfcG9yX2FuaW8uY3N2IikKZ2dwbG90KHZlbnRhc3BvcmFuaW8sIGFlcyh4ID0gbWVzLHk9IHZlbnRhcywgY29sPWFzLmZhY3RvcihhbmlvKSwgZ3JvdXA9YW5pbykpKwogIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICJWZW50YXMgZGUgTGVjaGUgU2Fib3JpemFkYSBIZXJzaGV5J3MgcG9yIEHDsW8iLCB4PSJNZXMiLCB5PSAiTWlsZXMgZGUgRMOzbGFyZXMiKQpgYGAKCk51ZXN0cmEgcmVjb21lbmRhY2nDs24gc2Vyw61hIHJlYWxpemFyIGNhbXBhw7FhcyBwdWJsaWNpdGFyaWFzIHBhcmEgYXVtZW50YXIgZWwgY29uc3VtbyBkZSBsZWNoZSBzYWJvcml6YWRhIEhlcnNoZXkncyBlbiBlbCBwcmltZXIgc2VtZXN0cmUgZGVsIGHDsW8u