1) Descripción del problema

Banco de la república en Colombia se ha caracterizado por contralar bien la inflación vía tasa de interés, mantener la inflación baja y estable. Es su principal objetivo, contribuye a mantener un crecimiento sostenido y sin fluctuaciones considerables. El primero de estos aspectos es que, al estar en un entorno de precios bajos, se preserva el poder adquisitivo de las personas. El segundo, es que, al estar la inflación bajo control, los recursos de una economía se asignan de la mejor manera para lograr mayor bienestar y crecimiento. El tercer aspecto, es que con precios bajos a las autoridades económicas les resulta más sencillo adoptar las medidas económicas correctas. Y de esta manera en Colombia podemos decir que no existen choches drásticos en la economía derivados por la tasa interés. Pero surge una pregunta ¿Cuáles son los mecanismos de transmisión que determinan a la tasa de interés que sirve de referencia para establecer la postura de política monetaria del Banco de la república? En la literatura se analiza el papel de la tasa de desocupación, la demanda real, la demanda de dinero, el producto interno bruto, y la inflación en la determinación de la tasa de interés.

En este ejercicio vamos a revisar las relaciones de dependencia temporal entre la Tasa de interés del Banco de la República y la Tasa de Inflación usando modelos de series de tiempo multivariadas, específicamente a través de un modelo Vectorial Autorregresivo.

  1. Objetivos del análisis

Verificar de forma emperica para el caso colombiano la relación de dependencia entre la Inflación y la tasa de interés del banco de la república. Tomando series de tiempo de tasas de crecimiento trimestral de la Tasa de interés y la Tasa de Inflación para el periodo comprendido entre 2001-2019.

Identificar un modelo de serie de tiempo vectorial autogresivo que nos permita entender la dependencia dinámica entre las Tasa de inflación y la Tasa de interés.

Librerias

library(MTS)
library(vars)
library(dygraphs)
library(forecast)
library(urca)
library(readxl) # importar excel
library(TSstudio)

Datos

#print(getwd())
datos <- read_excel("Inflacion.xlsx",  sheet = "datos1")
attach(datos)
The following objects are masked from datos (pos = 3):

    Desem, Feha, Infla, Int

The following objects are masked from datos (pos = 4):

    Desem, Feha, Infla, Int

The following objects are masked from datos (pos = 5):

    Desem, Feha, Infla, Int

The following objects are masked from datos (pos = 6):

    Desem, Feha, Infla, Int

Encabezados

head(datos)

Grafico de las series de tiempo

gdp=ts(cbind(Inflacion=datos[,2],Interes=datos[,4]))
head(gdp)
Time Series:
Start = 1 
End = 6 
Frequency = 1 
     Infla       Int
1 8.120000 11.892473
2 7.926667 11.500000
3 8.030000 10.583513
4 7.813333  8.983333
5 6.653333  7.994624
6 5.913333  6.096595

Grafico

options(repr.plot.width=15, repr.plot.height=8) # tamaño
plot.ts(gdp,type="o",col="darkblue")

Modelar las tasa de crecimiento

tc_gdp=diffM(log(gdp))

Gráfico de las tasa de crecimiento

options(repr.plot.width=15, repr.plot.height=8) # tamaño
plot.ts(tc_gdp,col="darkblue")

pairs(tc_gdp,col="darkblue")

Relacion contemporanea de las series

Test de Raiz Unitaria

p=round(length(Infla)^(1/3))

ru_Infla = ur.df(diff(log(Infla)), type="drift", lags=p, selectlags=c("AIC"))
summary(ru_Infla)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression drift 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.34759 -0.06768  0.00860  0.07924  0.26186 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.004329   0.014828  -0.292 0.771248    
z.lag.1     -0.696063   0.144450  -4.819 9.03e-06 ***
z.diff.lag1  0.188350   0.145464   1.295 0.199963    
z.diff.lag2  0.103045   0.128014   0.805 0.423783    
z.diff.lag3  0.412678   0.112788   3.659 0.000509 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1232 on 65 degrees of freedom
Multiple R-squared:  0.4145,    Adjusted R-squared:  0.3785 
F-statistic:  11.5 on 4 and 65 DF,  p-value: 4.03e-07


Value of test-statistic is: -4.8187 11.6396 

Critical values for test statistics: 
      1pct  5pct 10pct
tau2 -3.51 -2.89 -2.58
phi1  6.70  4.71  3.86
  • No hay Raiz Unitaria
ru_Int=ur.df(diff(log(Int)), type="drift", lags=p, selectlags=c("AIC"))
summary(ru_Int)

############################################### 
# Augmented Dickey-Fuller Test Unit Root Test # 
############################################### 

Test regression drift 


Call:
lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.255227 -0.024814  0.000258  0.032720  0.157973 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0002578  0.0077198  -0.033 0.973456    
z.lag.1     -0.3884690  0.0769482  -5.048 3.65e-06 ***
z.diff.lag   0.3742039  0.1058730   3.534 0.000746 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.06426 on 67 degrees of freedom
Multiple R-squared:  0.302, Adjusted R-squared:  0.2811 
F-statistic: 14.49 on 2 and 67 DF,  p-value: 5.887e-06


Value of test-statistic is: -5.0485 12.851 

Critical values for test statistics: 
      1pct  5pct 10pct
tau2 -3.51 -2.89 -2.58
phi1  6.70  4.71  3.86
  • No hay Raiz Unitaria

  • Vamor a Modelar un modelo Estacionario, AR(P). Multivariado se llama VAR(P)

Identificación del modelo

  • Esa serie tiene extructura de dependencia

Selección del orden del modelo suponiendo que es un VAR(P)

  • Usando librería vars
VARselect(data.frame(tc_gdp), lag.max = 13)
$selection
AIC(n)  HQ(n)  SC(n) FPE(n) 
     4      1      1      4 

$criteria
                   1             2             3             4             5             6             7
AIC(n) -9.547470e+00 -9.582426e+00 -9.641289e+00 -9.676313e+00 -9.5564526925 -9.486346e+00 -9.445992e+00
HQ(n)  -9.466647e+00 -9.447722e+00 -9.452703e+00 -9.433845e+00 -9.2601032448 -9.136115e+00 -9.041879e+00
SC(n)  -9.341618e+00 -9.239340e+00 -9.160968e+00 -9.058758e+00 -8.8016630720 -8.594322e+00 -8.416733e+00
FPE(n)  7.139246e-05  6.897794e-05  6.511504e-05  6.301219e-05  0.0000712823  7.684503e-05  8.056725e-05
                   8             9            10            11            12            13
AIC(n) -9.502645e+00 -9.470207e+00 -9.437117e+00 -9.411463e+00 -9.328574e+00 -9.400609e+00
HQ(n)  -9.044651e+00 -8.958331e+00 -8.871359e+00 -8.791824e+00 -8.655053e+00 -8.673206e+00
SC(n)  -8.336152e+00 -8.166480e+00 -7.996155e+00 -7.833267e+00 -7.613143e+00 -7.547944e+00
FPE(n)  7.683512e-05  8.031808e-05  8.427553e-05  8.808969e-05  9.790656e-05  9.364794e-05

Modelo1: Inicialmente se selecciona un VAR(4)

var_p= vars::VAR(tc_gdp,p=4)
summary(var_p)

VAR Estimation Results:
========================= 
Endogenous variables: Infla, Int 
Deterministic variables: const 
Sample size: 71 
Log Likelihood: 158.869 
Roots of the characteristic polynomial:
0.8311 0.8311 0.8089 0.8089 0.6435 0.6435 0.363 0.363
Call:
vars::VAR(y = tc_gdp, p = 4)


Estimation results for equation Infla: 
====================================== 
Infla = Infla.l1 + Int.l1 + Infla.l2 + Int.l2 + Infla.l3 + Int.l3 + Infla.l4 + Int.l4 + const 

          Estimate Std. Error t value Pr(>|t|)   
Infla.l1  0.416209   0.130814   3.182  0.00229 **
Int.l1    0.220360   0.260712   0.845  0.40124   
Infla.l2 -0.151735   0.138992  -1.092  0.27920   
Int.l2    0.227660   0.312574   0.728  0.46915   
Infla.l3  0.269565   0.137359   1.962  0.05420 . 
Int.l3   -0.368027   0.312692  -1.177  0.24371   
Infla.l4 -0.314838   0.138184  -2.278  0.02616 * 
Int.l4    0.022056   0.228406   0.097  0.92338   
const    -0.005503   0.014712  -0.374  0.70962   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.1223 on 62 degrees of freedom
Multiple R-Squared: 0.3867, Adjusted R-squared: 0.3076 
F-statistic: 4.887 on 8 and 62 DF,  p-value: 0.0001053 


Estimation results for equation Int: 
==================================== 
Int = Infla.l1 + Int.l1 + Infla.l2 + Int.l2 + Infla.l3 + Int.l3 + Infla.l4 + Int.l4 + const 

          Estimate Std. Error t value Pr(>|t|)    
Infla.l1  0.231265   0.068470   3.378  0.00127 ** 
Int.l1    0.758654   0.136461   5.559 6.09e-07 ***
Infla.l2  0.007224   0.072751   0.099  0.92122    
Int.l2   -0.277996   0.163607  -1.699  0.09430 .  
Infla.l3 -0.007653   0.071896  -0.106  0.91557    
Int.l3   -0.005043   0.163669  -0.031  0.97552    
Infla.l4  0.037890   0.072328   0.524  0.60225    
Int.l4   -0.080983   0.119552  -0.677  0.50068    
const    -0.002883   0.007700  -0.374  0.70938    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.06403 on 62 degrees of freedom
Multiple R-Squared: 0.6811, Adjusted R-squared:  0.64 
F-statistic: 16.56 on 8 and 62 DF,  p-value: 8.079e-13 



Covariance matrix of residuals:
         Infla      Int
Infla 0.014966 0.003188
Int   0.003188 0.004100

Correlation matrix of residuals:
      Infla   Int
Infla 1.000 0.407
Int   0.407 1.000
#plot(var_p)

Datos Atipicos

Varianza

sigma2_Infla=sum(var_p$varresult$Infla$residuals^2)/var_p$varresult$Infla$df.residual
sigma2_Int=sum(var_p$varresult$Int$residuals^2)/var_p$varresult$Int$df.residual

Residuales Estandarizados Para Ver Observaciones Atipicas

res_est_Infla=var_p$varresult$Infla$residuals/sigma2_Infla^0.5
res_est_Int=var_p$varresult$Int$residuals/sigma2_Int^0.5
  • los analizamos entre -3 y 3, lo que se salga es datos atipicos
plot.ts(res_est_Infla)
abline(a=-2.7,b=0, col="blue")
abline(a=2.7, b=0, col="blue")

plot.ts(res_est_Int)
abline(a=-2.7, b=0, col="blue")
abline(a=2.7, b=0, col="blue")

  • los Datos Atipicos afectan Normalidad Normalidad
shapiro.test(res_est_Infla)

    Shapiro-Wilk normality test

data:  res_est_Infla
W = 0.98814, p-value = 0.7452
shapiro.test(res_est_Int)

    Shapiro-Wilk normality test

data:  res_est_Int
W = 0.92241, p-value = 0.0003041
  • No hay normalidad en la serie de Interes, pero la serie de inflacion es normal

Controlar los datos atipicos

Inflacion

out_Infla=(abs(res_est_Infla)>2.7)
sum(out_Infla)
[1] 0
subset(res_est_Infla, out_Infla==1)
named numeric(0)

Interes

out_Int=(abs(res_est_Int)>2.7)
sum(out_Int)
[1] 2
subset(res_est_Int, out_Int==1)
        1        29 
-2.967656 -3.792508 

Creación de variables dummy para obs atípicas: hay que tener en cuenta las diferentes longitudes de de las series y los residuales

length(diff(Infla))
[1] 75
length(res_est_Infla)
[1] 71

Series dummies

out5=as.matrix((seq(tc_gdp[,1])==5))
out33=as.matrix((seq(tc_gdp[,1])==33))
OUT=cbind(out5,out33)
#OUT

Modelo Estimado Nuevamente excluyendo datos Atipicos

var_pn= vars::VAR(tc_gdp,p=4,exogen=as.matrix(OUT))
No column names supplied in exogen, using: exo1, exo2 , instead.
summary(var_pn)

VAR Estimation Results:
========================= 
Endogenous variables: Infla, Int 
Deterministic variables: const 
Sample size: 71 
Log Likelihood: 180.58 
Roots of the characteristic polynomial:
0.8326 0.8326 0.8161 0.8161 0.674 0.674 0.4358 0.4358
Call:
vars::VAR(y = tc_gdp, p = 4, exogen = as.matrix(OUT))


Estimation results for equation Infla: 
====================================== 
Infla = Infla.l1 + Int.l1 + Infla.l2 + Int.l2 + Infla.l3 + Int.l3 + Infla.l4 + Int.l4 + const + exo1 + exo2 

          Estimate Std. Error t value Pr(>|t|)   
Infla.l1  0.394080   0.128806   3.059  0.00331 **
Int.l1    0.100453   0.261028   0.385  0.70172   
Infla.l2 -0.109573   0.137836  -0.795  0.42977   
Int.l2    0.254375   0.311971   0.815  0.41808   
Infla.l3  0.329575   0.138004   2.388  0.02010 * 
Int.l3   -0.383909   0.306350  -1.253  0.21500   
Infla.l4 -0.303167   0.135481  -2.238  0.02896 * 
Int.l4   -0.007494   0.224097  -0.033  0.97343   
const    -0.001274   0.014575  -0.087  0.93061   
exo1     -0.046595   0.125677  -0.371  0.71213   
exo2     -0.277623   0.127332  -2.180  0.03317 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.1197 on 60 degrees of freedom
Multiple R-Squared: 0.4322, Adjusted R-squared: 0.3376 
F-statistic: 4.568 on 10 and 60 DF,  p-value: 8.135e-05 


Estimation results for equation Int: 
==================================== 
Int = Infla.l1 + Int.l1 + Infla.l2 + Int.l2 + Infla.l3 + Int.l3 + Infla.l4 + Int.l4 + const + exo1 + exo2 

           Estimate Std. Error t value Pr(>|t|)    
Infla.l1  0.1913982  0.0522680   3.662 0.000531 ***
Int.l1    0.6417156  0.1059227   6.058 9.82e-08 ***
Infla.l2  0.0710467  0.0559323   1.270 0.208908    
Int.l2   -0.3341294  0.1265945  -2.639 0.010568 *  
Infla.l3  0.0809206  0.0560005   1.445 0.153661    
Int.l3    0.0002168  0.1243136   0.002 0.998614    
Infla.l4  0.0617469  0.0549768   1.123 0.265850    
Int.l4   -0.1298701  0.0909362  -1.428 0.158435    
const     0.0036129  0.0059143   0.611 0.543597    
exo1     -0.2257959  0.0509982  -4.428 4.10e-05 ***
exo2     -0.2876563  0.0516698  -5.567 6.40e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.04855 on 60 degrees of freedom
Multiple R-Squared: 0.8226, Adjusted R-squared: 0.793 
F-statistic: 27.82 on 10 and 60 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
         Infla      Int
Infla 0.014316 0.002023
Int   0.002023 0.002357

Correlation matrix of residuals:
       Infla    Int
Infla 1.0000 0.3483
Int   0.3483 1.0000
#plot(var_pn)
normalitytest = normality.test(var_pn)
normalitytest
$JB

    JB-Test (multivariate)

data:  Residuals of VAR object var_pn
Chi-squared = 2.8434, df = 4, p-value = 0.5844


$Skewness

    Skewness only (multivariate)

data:  Residuals of VAR object var_pn
Chi-squared = 1.1573, df = 2, p-value = 0.5607


$Kurtosis

    Kurtosis only (multivariate)

data:  Residuals of VAR object var_pn
Chi-squared = 1.6861, df = 2, p-value = 0.4304

Restricciones: simplificación del modelo

summary(var_p.rest)

VAR Estimation Results:
========================= 
Endogenous variables: Infla, Int 
Deterministic variables: const 
Sample size: 71 
Log Likelihood: 173.664 
Roots of the characteristic polynomial:
0.8105 0.8105 0.7872 0.7872 0.5297 0.5297     0     0
Call:
vars::VAR(y = tc_gdp, p = 4, exogen = as.matrix(OUT))


Estimation results for equation Infla: 
====================================== 
Infla = Infla.l1 + Infla.l3 + Infla.l4 + exo2 

         Estimate Std. Error t value Pr(>|t|)    
Infla.l1  0.42858    0.09814   4.367 4.47e-05 ***
Infla.l3  0.31629    0.10844   2.917  0.00481 ** 
Infla.l4 -0.40707    0.10700  -3.805  0.00031 ***
exo2     -0.28633    0.12004  -2.385  0.01990 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.1172 on 67 degrees of freedom
Multiple R-Squared: 0.3932, Adjusted R-squared: 0.357 
F-statistic: 10.86 on 4 and 67 DF,  p-value: 7.634e-07 


Estimation results for equation Int: 
==================================== 
Int = Infla.l1 + Int.l1 + Int.l2 + exo1 + exo2 

         Estimate Std. Error t value Pr(>|t|)    
Infla.l1  0.22195    0.04849   4.578 2.14e-05 ***
Int.l1    0.70269    0.09278   7.574 1.53e-10 ***
Int.l2   -0.28063    0.08174  -3.433 0.001035 ** 
exo1     -0.19944    0.04990  -3.997 0.000164 ***
exo2     -0.25486    0.05017  -5.080 3.32e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 0.04895 on 66 degrees of freedom
Multiple R-Squared: 0.803,  Adjusted R-squared: 0.7881 
F-statistic: 53.82 on 5 and 66 DF,  p-value: < 2.2e-16 



Covariance matrix of residuals:
         Infla      Int
Infla 0.015343 0.002101
Int   0.002101 0.002621

Correlation matrix of residuals:
       Infla    Int
Infla 1.0000 0.3313
Int   0.3313 1.0000
#plot(var_p.rest)

Estabilidad del modelo

var_p.estabil = stability(var_p.rest, type = "OLS-CUSUM")
plot(var_p.estabil)

Funcion Impulso Respuesta

var_p.irf = irf(var_p.rest, impulse = "Infla", response = c("Int"), n.ahead = 12, 
                ortho = TRUE, boot = TRUE, runs=1000)
plot(var_p.irf)

Predicción

h=4
var_p.rest_pred = predict(var_p.rest, n.ahead = h, ci = 0.95, dumvar=OUT[(length(diff(Int))-h+1):length(diff(Int)),])
var_p.rest_pred
$Infla
             fcst      lower     upper        CI
[1,]  0.042948184 -0.1867983 0.2726946 0.2297464
[2,]  0.032972957 -0.2169845 0.2829304 0.2499575
[3,] -0.034308551 -0.2878033 0.2191862 0.2534948
[4,] -0.006105874 -0.2753561 0.2631444 0.2692503

$Int
              fcst       lower      upper        CI
[1,]  0.0027185765 -0.09322043 0.09865758 0.0959390
[2,]  0.0114426387 -0.12500738 0.14789266 0.1364500
[3,]  0.0145960125 -0.13753248 0.16672450 0.1521285
[4,] -0.0005694822 -0.15652982 0.15539085 0.1559603

Exportar los resultados

P_Inflacion=as.data.frame(var_p.rest_pred$fcst$Infla)
P_Inflacion$Variable="Inflacion"
p_Interes=as.data.frame(var_p.rest_pred$fcst$Int)
p_Interes$Variable="Interes"

Pronostico=rbind(P_Inflacion,p_Interes)
library("writexl")
write_xlsx("Pronostico.xlsx")
Error in write_xlsx("Pronostico.xlsx") : 
  Argument x must be a data frame or list of data frames
LS0tDQp0aXRsZTogIlRhc2EgSW5mbGFjaW9uIFZzIFRhc2EgSW50ZXJlcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KIyAxKSBEZXNjcmlwY2nDs24gZGVsIHByb2JsZW1hDQoNCkJhbmNvIGRlIGxhIHJlcMO6YmxpY2EgZW4gQ29sb21iaWEgc2UgaGEgY2FyYWN0ZXJpemFkbyBwb3IgY29udHJhbGFyIGJpZW4gbGEgaW5mbGFjacOzbiB2w61hIHRhc2EgZGUgaW50ZXLDqXMsIG1hbnRlbmVyIGxhIGluZmxhY2nDs24gYmFqYSB5IGVzdGFibGUuIEVzIHN1IHByaW5jaXBhbCBvYmpldGl2bywgY29udHJpYnV5ZSBhIG1hbnRlbmVyIHVuIGNyZWNpbWllbnRvIHNvc3RlbmlkbyB5IHNpbiBmbHVjdHVhY2lvbmVzIGNvbnNpZGVyYWJsZXMuIEVsIHByaW1lcm8gZGUgZXN0b3MgYXNwZWN0b3MgZXMgcXVlLCBhbCBlc3RhciBlbiB1biBlbnRvcm5vIGRlIHByZWNpb3MgYmFqb3MsIHNlIHByZXNlcnZhIGVsIHBvZGVyIGFkcXVpc2l0aXZvIGRlIGxhcyBwZXJzb25hcy4gRWwgc2VndW5kbywgZXMgcXVlLCBhbCBlc3RhciBsYSBpbmZsYWNpw7NuIGJham8gY29udHJvbCwgbG9zIHJlY3Vyc29zIGRlIHVuYSBlY29ub23DrWEgc2UgYXNpZ25hbiBkZSBsYSBtZWpvciBtYW5lcmEgcGFyYSBsb2dyYXIgbWF5b3IgYmllbmVzdGFyIHkgY3JlY2ltaWVudG8uIEVsIHRlcmNlciBhc3BlY3RvLCBlcyBxdWUgY29uIHByZWNpb3MgYmFqb3MgYSBsYXMgYXV0b3JpZGFkZXMgZWNvbsOzbWljYXMgbGVzIHJlc3VsdGEgbcOhcyBzZW5jaWxsbyBhZG9wdGFyIGxhcyBtZWRpZGFzIGVjb27Ds21pY2FzIGNvcnJlY3Rhcy4gWSBkZSBlc3RhIG1hbmVyYSBlbiBDb2xvbWJpYSBwb2RlbW9zIGRlY2lyIHF1ZSBubyBleGlzdGVuIGNob2NoZXMgZHLDoXN0aWNvcyBlbiBsYSBlY29ub23DrWEgZGVyaXZhZG9zIHBvciBsYSB0YXNhIGludGVyw6lzLiBQZXJvIHN1cmdlIHVuYSBwcmVndW50YSDCv0N1w6FsZXMgc29uIGxvcyBtZWNhbmlzbW9zIGRlIHRyYW5zbWlzacOzbiBxdWUgZGV0ZXJtaW5hbiBhIGxhIHRhc2EgZGUgaW50ZXLDqXMgcXVlIHNpcnZlIGRlIHJlZmVyZW5jaWEgcGFyYSBlc3RhYmxlY2VyIGxhIHBvc3R1cmEgZGUgcG9sw610aWNhIG1vbmV0YXJpYSBkZWwgQmFuY28gZGUgbGEgcmVww7pibGljYT8gRW4gbGEgbGl0ZXJhdHVyYSBzZSBhbmFsaXphIGVsIHBhcGVsIGRlIGxhIHRhc2EgZGUgZGVzb2N1cGFjacOzbiwgbGEgZGVtYW5kYSByZWFsLCBsYSBkZW1hbmRhIGRlIGRpbmVybywgZWwgcHJvZHVjdG8gaW50ZXJubyBicnV0bywgeSBsYSBpbmZsYWNpw7NuIGVuIGxhIGRldGVybWluYWNpw7NuIGRlIGxhIHRhc2EgZGUgaW50ZXLDqXMuDQoNCkVuIGVzdGUgZWplcmNpY2lvIHZhbW9zIGEgcmV2aXNhciBsYXMgcmVsYWNpb25lcyBkZSBkZXBlbmRlbmNpYSB0ZW1wb3JhbCBlbnRyZSBsYSBUYXNhIGRlIGludGVyw6lzIGRlbCBCYW5jbyBkZSBsYSBSZXDDumJsaWNhIHkgbGEgVGFzYSBkZSBJbmZsYWNpw7NuIHVzYW5kbyBtb2RlbG9zIGRlIHNlcmllcyBkZSB0aWVtcG8gbXVsdGl2YXJpYWRhcywgZXNwZWPDrWZpY2FtZW50ZSBhIHRyYXbDqXMgZGUgdW4gbW9kZWxvIFZlY3RvcmlhbCBBdXRvcnJlZ3Jlc2l2by4NCg0KDQoyKSBPYmpldGl2b3MgZGVsIGFuw6FsaXNpcw0KDQpWZXJpZmljYXIgZGUgZm9ybWEgZW1wZXJpY2EgcGFyYSBlbCBjYXNvIGNvbG9tYmlhbm8gbGEgcmVsYWNpw7NuIGRlIGRlcGVuZGVuY2lhIGVudHJlIGxhIEluZmxhY2nDs24geSBsYSB0YXNhIGRlIGludGVyw6lzIGRlbCBiYW5jbyBkZSBsYSByZXDDumJsaWNhLiBUb21hbmRvIHNlcmllcyBkZSB0aWVtcG8gZGUgdGFzYXMgZGUgY3JlY2ltaWVudG8gdHJpbWVzdHJhbCBkZSBsYSBUYXNhIGRlIGludGVyw6lzIHkgbGEgVGFzYSBkZSBJbmZsYWNpw7NuIHBhcmEgZWwgcGVyaW9kbyBjb21wcmVuZGlkbyBlbnRyZSAyMDAxLTIwMTkuDQoNCklkZW50aWZpY2FyIHVuIG1vZGVsbyBkZSBzZXJpZSBkZSB0aWVtcG8gdmVjdG9yaWFsIGF1dG9ncmVzaXZvIHF1ZSBub3MgcGVybWl0YSBlbnRlbmRlciBsYSBkZXBlbmRlbmNpYSBkaW7DoW1pY2EgZW50cmUgbGFzIFRhc2EgZGUgaW5mbGFjacOzbiB5IGxhIFRhc2EgZGUgaW50ZXLDqXMuDQoNCg0KKipMaWJyZXJpYXMqKg0KDQpgYGB7cn0NCmxpYnJhcnkoTVRTKQ0KbGlicmFyeSh2YXJzKQ0KbGlicmFyeShkeWdyYXBocykNCmxpYnJhcnkoZm9yZWNhc3QpDQpsaWJyYXJ5KHVyY2EpDQpsaWJyYXJ5KHJlYWR4bCkgIyBpbXBvcnRhciBleGNlbA0KbGlicmFyeShUU3N0dWRpbykNCmBgYA0KDQoNCioqRGF0b3MqKg0KDQpgYGB7cn0NCiNwcmludChnZXR3ZCgpKQ0KZGF0b3MgPC0gcmVhZF9leGNlbCgiSW5mbGFjaW9uLnhsc3giLCAgc2hlZXQgPSAiZGF0b3MxIikNCmF0dGFjaChkYXRvcykNCmBgYA0KDQoqKkVuY2FiZXphZG9zKioNCg0KYGBge3J9DQpoZWFkKGRhdG9zKQ0KYGBgDQoNCioqR3JhZmljbyBkZSBsYXMgc2VyaWVzIGRlIHRpZW1wbyoqDQoNCmBgYHtyfQ0KZ2RwPXRzKGNiaW5kKEluZmxhY2lvbj1kYXRvc1ssMl0sSW50ZXJlcz1kYXRvc1ssNF0pKQ0KaGVhZChnZHApDQpgYGANCg0KKipHcmFmaWNvKioNCg0KYGBge3J9DQpvcHRpb25zKHJlcHIucGxvdC53aWR0aD0xNSwgcmVwci5wbG90LmhlaWdodD04KSAjIHRhbWHDsW8NCnBsb3QudHMoZ2RwLHR5cGU9Im8iLGNvbD0iZGFya2JsdWUiKQ0KYGBgDQoNCioqTW9kZWxhciBsYXMgdGFzYSBkZSBjcmVjaW1pZW50byoqDQoNCmBgYHtyfQ0KdGNfZ2RwPWRpZmZNKGxvZyhnZHApKQ0KYGBgDQoNCioqR3LDoWZpY28gZGUgbGFzIHRhc2EgZGUgY3JlY2ltaWVudG8qKg0KYGBge3J9DQpvcHRpb25zKHJlcHIucGxvdC53aWR0aD0xNSwgcmVwci5wbG90LmhlaWdodD04KSAjIHRhbWHDsW8NCnBsb3QudHModGNfZ2RwLGNvbD0iZGFya2JsdWUiKQ0KcGFpcnModGNfZ2RwLGNvbD0iZGFya2JsdWUiKQ0KYGBgDQoNCiogUGFyZWNlbiBlc3RhY2lvbmFyaWFzDQoNCioqUmVsYWNpb24gY29udGVtcG9yYW5lYSBkZSBsYXMgc2VyaWVzKioNCg0KIyMgKipUZXN0IGRlIFJhaXogVW5pdGFyaWEqKg0KYGBge3J9DQpwPXJvdW5kKGxlbmd0aChJbmZsYSleKDEvMykpDQoNCnJ1X0luZmxhID0gdXIuZGYoZGlmZihsb2coSW5mbGEpKSwgdHlwZT0iZHJpZnQiLCBsYWdzPXAsIHNlbGVjdGxhZ3M9YygiQUlDIikpDQpzdW1tYXJ5KHJ1X0luZmxhKQ0KDQpgYGANCg0KKiBObyBoYXkgUmFpeiBVbml0YXJpYQ0KYGBge3J9DQpydV9JbnQ9dXIuZGYoZGlmZihsb2coSW50KSksIHR5cGU9ImRyaWZ0IiwgbGFncz1wLCBzZWxlY3RsYWdzPWMoIkFJQyIpKQ0Kc3VtbWFyeShydV9JbnQpDQpgYGANCg0KKiBObyBoYXkgUmFpeiBVbml0YXJpYQ0KDQoqIFZhbW9yIGEgTW9kZWxhciB1biBtb2RlbG8gRXN0YWNpb25hcmlvLCBBUihQKS4gTXVsdGl2YXJpYWRvIHNlIGxsYW1hIFZBUihQKQ0KDQoNCg0KIyMgSWRlbnRpZmljYWNpw7NuIGRlbCBtb2RlbG8NCg0KKiBFc2Egc2VyaWUgdGllbmUgZXh0cnVjdHVyYSBkZSBkZXBlbmRlbmNpYQ0KDQoNCiMjIyBTZWxlY2Npw7NuIGRlbCBvcmRlbiBkZWwgbW9kZWxvIHN1cG9uaWVuZG8gcXVlIGVzIHVuIFZBUihQKQ0KDQoqIFVzYW5kbyBsaWJyZXLDrWEgdmFycw0KDQoNCmBgYHtyfQ0KVkFSc2VsZWN0KGRhdGEuZnJhbWUodGNfZ2RwKSwgbGFnLm1heCA9IDEzKQ0KYGBgDQoNCiMgTW9kZWxvMTogSW5pY2lhbG1lbnRlIHNlIHNlbGVjY2lvbmEgdW4gVkFSKDQpDQoNCmBgYHtyfQ0KdmFyX3A9IHZhcnM6OlZBUih0Y19nZHAscD00KQ0Kc3VtbWFyeSh2YXJfcCkNCiNwbG90KHZhcl9wKQ0KYGBgDQoNCg0KIyMgRGF0b3MgQXRpcGljb3MNCg0KKipWYXJpYW56YSoqDQpgYGB7cn0NCnNpZ21hMl9JbmZsYT1zdW0odmFyX3AkdmFycmVzdWx0JEluZmxhJHJlc2lkdWFsc14yKS92YXJfcCR2YXJyZXN1bHQkSW5mbGEkZGYucmVzaWR1YWwNCnNpZ21hMl9JbnQ9c3VtKHZhcl9wJHZhcnJlc3VsdCRJbnQkcmVzaWR1YWxzXjIpL3Zhcl9wJHZhcnJlc3VsdCRJbnQkZGYucmVzaWR1YWwNCmBgYA0KDQoqKlJlc2lkdWFsZXMgRXN0YW5kYXJpemFkb3MgUGFyYSBWZXIgT2JzZXJ2YWNpb25lcyBBdGlwaWNhcyoqDQoNCmBgYHtyfQ0KcmVzX2VzdF9JbmZsYT12YXJfcCR2YXJyZXN1bHQkSW5mbGEkcmVzaWR1YWxzL3NpZ21hMl9JbmZsYV4wLjUNCnJlc19lc3RfSW50PXZhcl9wJHZhcnJlc3VsdCRJbnQkcmVzaWR1YWxzL3NpZ21hMl9JbnReMC41DQpgYGANCg0KKiBsb3MgYW5hbGl6YW1vcyBlbnRyZSAtMyB5IDMsIGxvIHF1ZSBzZSBzYWxnYSBlcyBkYXRvcyBhdGlwaWNvcw0KYGBge3J9DQpwbG90LnRzKHJlc19lc3RfSW5mbGEpDQphYmxpbmUoYT0tMi43LGI9MCwgY29sPSJibHVlIikNCmFibGluZShhPTIuNywgYj0wLCBjb2w9ImJsdWUiKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdC50cyhyZXNfZXN0X0ludCkNCmFibGluZShhPS0yLjcsIGI9MCwgY29sPSJibHVlIikNCmFibGluZShhPTIuNywgYj0wLCBjb2w9ImJsdWUiKQ0KYGBgDQoNCiogbG9zIERhdG9zIEF0aXBpY29zIGFmZWN0YW4gTm9ybWFsaWRhZA0KTm9ybWFsaWRhZA0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChyZXNfZXN0X0luZmxhKQ0Kc2hhcGlyby50ZXN0KHJlc19lc3RfSW50KQ0KDQpgYGANCg0KKiBObyBoYXkgbm9ybWFsaWRhZCBlbiBsYSBzZXJpZSBkZSBJbnRlcmVzLCBwZXJvIGxhIHNlcmllIGRlIGluZmxhY2lvbiBlcyBub3JtYWwNCg0KDQojIyAqKkNvbnRyb2xhciBsb3MgZGF0b3MgYXRpcGljb3MqKg0KDQoqSW5mbGFjaW9uKg0KYGBge3J9DQpvdXRfSW5mbGE9KGFicyhyZXNfZXN0X0luZmxhKT4yLjcpDQpzdW0ob3V0X0luZmxhKQ0Kc3Vic2V0KHJlc19lc3RfSW5mbGEsIG91dF9JbmZsYT09MSkNCmBgYA0KDQoqSW50ZXJlcyoNCmBgYHtyfQ0Kb3V0X0ludD0oYWJzKHJlc19lc3RfSW50KT4yLjcpDQpzdW0ob3V0X0ludCkNCnN1YnNldChyZXNfZXN0X0ludCwgb3V0X0ludD09MSkNCmBgYA0KDQoNCiMjIyBDcmVhY2nDs24gZGUgdmFyaWFibGVzIGR1bW15IHBhcmEgb2JzIGF0w61waWNhczogaGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgbGFzIGRpZmVyZW50ZXMgbG9uZ2l0dWRlcyBkZSBkZSBsYXMgc2VyaWVzIHkgbG9zIHJlc2lkdWFsZXMNCg0KYGBge3J9DQpsZW5ndGgoZGlmZihJbmZsYSkpDQpsZW5ndGgocmVzX2VzdF9JbmZsYSkNCmBgYA0KDQoqKlNlcmllcyBkdW1taWVzKioNCmBgYHtyfQ0Kb3V0NT1hcy5tYXRyaXgoKHNlcSh0Y19nZHBbLDFdKT09NSkpDQpvdXQzMz1hcy5tYXRyaXgoKHNlcSh0Y19nZHBbLDFdKT09MzMpKQ0KYGBgDQoNCmBgYHtyfQ0KT1VUPWNiaW5kKG91dDUsb3V0MzMpDQojT1VUDQpgYGANCg0KIyBNb2RlbG8gRXN0aW1hZG8gTnVldmFtZW50ZSBleGNsdXllbmRvIGRhdG9zIEF0aXBpY29zDQpgYGB7cn0NCnZhcl9wbj0gdmFyczo6VkFSKHRjX2dkcCxwPTQsZXhvZ2VuPWFzLm1hdHJpeChPVVQpKQ0Kc3VtbWFyeSh2YXJfcG4pDQpgYGANCmBgYHtyfQ0KI3Bsb3QodmFyX3BuKQ0KYGBgDQoqIE5vcm1hbGlkYWQgY29uanVudGENCmBgYHtyfQ0Kbm9ybWFsaXR5dGVzdCA9IG5vcm1hbGl0eS50ZXN0KHZhcl9wbikNCm5vcm1hbGl0eXRlc3QNCmBgYA0KDQoqIFNlIGN1bXBsZSBsYSBub3JtYWxpZGFkDQoNCiogRWxpbWluYXIgbG9zIGNvZWZpY2llbnRlcyBubyBzaWduaWZpY2F0aXZvcw0KDQoNCg0KIyMjICoqUmVzdHJpY2Npb25lczogc2ltcGxpZmljYWNpw7NuIGRlbCBtb2RlbG8qKg0KDQpgYGB7cn0NCnZhcl9wLnJlc3QgPSByZXN0cmljdCh2YXJfcG4sIG1ldGhvZCA9ICJzZXIiLCB0aHJlc2ggPSAyKQ0Kc3VtbWFyeSh2YXJfcC5yZXN0KQ0KYGBgDQoNCg0KYGBge3J9DQojcGxvdCh2YXJfcC5yZXN0KQ0KYGBgDQoNCiMjIEVzdGFiaWxpZGFkIGRlbCBtb2RlbG8NCmBgYHtyfQ0KdmFyX3AuZXN0YWJpbCA9IHN0YWJpbGl0eSh2YXJfcC5yZXN0LCB0eXBlID0gIk9MUy1DVVNVTSIpDQpwbG90KHZhcl9wLmVzdGFiaWwpDQpgYGANCg0KKkZ1bmNpb24gSW1wdWxzbyBSZXNwdWVzdGEqDQoNCmBgYHtyfQ0KdmFyX3AuaXJmID0gaXJmKHZhcl9wLnJlc3QsIGltcHVsc2UgPSAiSW5mbGEiLCByZXNwb25zZSA9IGMoIkludCIpLCBuLmFoZWFkID0gMTIsIA0KICAgICAgICAgICAgICAgIG9ydGhvID0gVFJVRSwgYm9vdCA9IFRSVUUsIHJ1bnM9MTAwMCkNCmBgYA0KDQpgYGB7cn0NCnBsb3QodmFyX3AuaXJmKQ0KYGBgDQoNCiMgUHJlZGljY2nDs24NCg0KYGBge3J9DQpoPTQNCnZhcl9wLnJlc3RfcHJlZCA9IHByZWRpY3QodmFyX3AucmVzdCwgbi5haGVhZCA9IGgsIGNpID0gMC45NSwgZHVtdmFyPU9VVFsobGVuZ3RoKGRpZmYoSW50KSktaCsxKTpsZW5ndGgoZGlmZihJbnQpKSxdKQ0KYGBgDQpgYGB7cn0NCnZhcl9wLnJlc3RfcHJlZA0KYGBgDQoNCg0KYGBge3J9DQpwbG90KHZhcl9wLnJlc3RfcHJlZCkNCmBgYA0KDQoNCiMgRXhwb3J0YXIgbG9zIHJlc3VsdGFkb3MNCmBgYHtyfQ0KdGFpbChkYXRvcykNCmBgYA0KDQpgYGB7cn0NClBfSW5mbGFjaW9uPWFzLmRhdGEuZnJhbWUodmFyX3AucmVzdF9wcmVkJGZjc3QkSW5mbGEpDQpQX0luZmxhY2lvbiRWYXJpYWJsZT0iSW5mbGFjaW9uIg0KcF9JbnRlcmVzPWFzLmRhdGEuZnJhbWUodmFyX3AucmVzdF9wcmVkJGZjc3QkSW50KQ0KcF9JbnRlcmVzJFZhcmlhYmxlPSJJbnRlcmVzIg0KDQpQcm9ub3N0aWNvPXJiaW5kKFBfSW5mbGFjaW9uLHBfSW50ZXJlcykNCmxpYnJhcnkoIndyaXRleGwiKQ0Kd3JpdGVfeGxzeChQcm9ub3N0aWNvLCJQcm9ub3N0aWNvLnhsc3giKQ0KYGBgDQoNCg0KDQoNCg0KDQo=