#Librerias
library(lubridate)

Attaching package: ‘lubridate’

The following object is masked from ‘package:base’:

    date
library(dplyr)

Attaching package: ‘dplyr’

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

    intersect, setdiff, union

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

    filter, lag

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

    intersect, setdiff, setequal, union
library(tidyr)
library(ggplot2)

Realizamos la lectura de los datasets y miramos su estructura

ipc = read.csv('../Fuentes/ipc-mensual.csv')
dolar = read.csv('../Fuentes/dolar-diario.csv')
glimpse(ipc)
Observations: 4
Variables: 29
$ Apertura <fct> Nivel general, Estacionales, Núcleo, Regulados
$ Apr.16   <dbl> 85.5, 89.9, 85.4, 84.0
$ May.16   <dbl> 89.1, 93.7, 87.6, 91.3
$ Jun.16   <dbl> 91.9, 96.3, 90.3, 94.5
$ Jul.16   <dbl> 93.7, 99.6, 92.0, 96.3
$ Aug.16   <dbl> 93.9, 95.3, 93.5, 94.6
$ Sep.16   <dbl> 95.0, 99.2, 94.9, 93.3
$ Oct.16   <dbl> 97.2, 101.1, 96.7, 97.2
$ Nov.16   <dbl> 98.8, 101.6, 98.3, 99.1
$ Dec.16   <dbl> 100, 100, 100, 100
$ Jan.17   <dbl> 101.3, 101.6, 101.3, 101.1
$ Feb.17   <dbl> 103.8, 102.1, 103.2, 106.3
$ Mar.17   <dbl> 106.3, 105.9, 105.1, 109.9
$ Apr.17   <dbl> 109.1, 108.5, 107.5, 113.9
$ May.17   <dbl> 110.5, 108.0, 109.2, 115.2
$ Jun.17   <dbl> 112.0, 109.6, 110.9, 116.4
$ Jul.17   <dbl> 113.9, 110.1, 112.8, 118.8
$ Aug.17   <dbl> 115.6, 111.5, 114.5, 120.6
$ Sep.17   <dbl> 118.0, 117.2, 116.5, 122.5
$ Oct.17   <dbl> 119.5, 119.8, 117.9, 124.1
$ Nov.17   <dbl> 120.9, 121.0, 119.4, 125.2
$ Dec.17   <dbl> 125.0, 121.2, 121.8, 136.4
$ Jan.18   <dbl> 127.0, 125.2, 123.5, 138.1
$ Feb.18   <dbl> 130.3, 124.0, 126.2, 145.1
$ Mar.18   <dbl> 133.5, 127.3, 129.3, 148.5
$ Apr.18   <dbl> 136.9, 126.8, 132.1, 155.8
$ May.18   <dbl> 139.6, 130.8, 135.4, 155.7
$ Jun.18   <dbl> 145.1, 135.0, 141.1, 161.2
$ Jul.18   <dbl> 149.1, 140.5, 145.2, 164.5
glimpse(dolar)
Observations: 4,056
Variables: 2
$ Fecha                                               <fct> 04-03-02, 05-03-02, 06-03-02, 07-03-02, 08-03-02, 11-03-02,...
$ Tipo.de.Cambio.de.Referencia...en.Pesos...por.Dólar <dbl> 2.0083, 1.9917, 2.0508, 2.1375, 2.2033, 2.2525, 2.3650, 2.3...

Renombramos la variable del tipo de cambio por algo más sencillo

dolar = dolar %>% rename(tipo_cambio = Tipo.de.Cambio.de.Referencia...en.Pesos...por.Dólar)

Creamos las variables fecha, año, mes y día

dolar = dolar %>% mutate(date=dmy(Fecha), year=year(date), month=month(date),
                         day=day(date))
glimpse(dolar)
Observations: 4,056
Variables: 6
$ Fecha       <fct> 04-03-02, 05-03-02, 06-03-02, 07-03-02, 08-03-02, 11-03-02, 12-03-02, 13-03-02, 14-03-02, 15-03-02,...
$ tipo_cambio <dbl> 2.0083, 1.9917, 2.0508, 2.1375, 2.2033, 2.2525, 2.3650, 2.3317, 2.3650, 2.3408, 2.3175, 2.3783, 2.4...
$ date        <date> 2002-03-04, 2002-03-05, 2002-03-06, 2002-03-07, 2002-03-08, 2002-03-11, 2002-03-12, 2002-03-13, 20...
$ year        <dbl> 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 200...
$ month       <dbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, ...
$ day         <int> 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 18, 19, 20, 21, 22, 25, 26, 27, 2, 3, 4, 5, 8, 9, 10, 11, 12, 15...

Seleccionamos el primer día hábil del mes para obtener la primer cotización del mes. La cotización del dólar se disponibiliza el primer día hábil del mes y no el primer día del mes.

fecha_cotizacion= dolar%>% group_by(year,month) %>% 
  summarise(day=min(day))

Realizamos el join con el dataframe del primer día hábil

dolar = dolar %>% inner_join(fecha_cotizacion, by=c('year', 'month', 'day')) %>% select(-c(Fecha, day))

Graficamos la evolución del tipo de cambio para todo el dataset

ggplot(dolar, aes(x=date, y=tipo_cambio)) +
  geom_line() +
  labs(x="Fecha", y="Tipo de cambio", title="Evolución del tipo de cambio")+
  theme_bw()

Los datos de IPC están en un formato que hace su análisis bastante complicado. Pasamos los datos a un formato más util usando gather().

ipc= ipc %>% gather(., key   = date, value = ipc, 2:29)
glimpse(ipc)
Observations: 112
Variables: 3
$ Apertura <fct> Nivel general, Estacionales, Núcleo, Regulados, Nivel general, Estacionales, Núcleo, Regulados, Nivel ...
$ date     <chr> "Apr.16", "Apr.16", "Apr.16", "Apr.16", "May.16", "May.16", "May.16", "May.16", "Jun.16", "Jun.16", "J...
$ ipc      <dbl> 85.5, 89.9, 85.4, 84.0, 89.1, 93.7, 87.6, 91.3, 91.9, 96.3, 90.3, 94.5, 93.7, 99.6, 92.0, 96.3, 93.9, ...

Creamos las variables fecha, año y mes

ipc= ipc %>% mutate(date=ymd(parse_date_time(date, orders = 'my')),
                    year=year(date), month=month(date))

Graficamos la distribución del IPC a nivel general

ipc %>% filter(Apertura== "Nivel general") %>% 
ggplot(., aes(x= date, y = ipc, group = Apertura )) +
  geom_point(color="firebrick")+
  geom_line(size= 1,alpha=0.75, color = "firebrick")+
  labs(x="Fecha", y="IPC", title="Evolución del IPC")+
  theme_bw()

Graficamos la distribución del IPC por grupo

ggplot(ipc, aes(x= date, y = ipc, group = Apertura, color = Apertura )) +
  geom_point()+
  geom_line(size=1,alpha=0.75)+
  labs(x="Fecha", y="IPC", title="Evolución del IPC por grupo")+
  theme_bw()+
  scale_color_brewer(palette = "Set1")

Procedemos a joinear ambos datasets usando como keys para joinear el año y el mes. No podemos utilizar la fecha porque van a diferir entre las bases. Utilizamos un inner join ya que solo queremos quedarnos con los meses para los cuales tenemos información del IPC y del dólar.

ipc_dolar = ipc %>% inner_join(dolar, by=c('year', 'month'))
glimpse(ipc_dolar)
Observations: 112
Variables: 7
$ Apertura    <fct> Nivel general, Estacionales, Núcleo, Regulados, Nivel general, Estacionales, Núcleo, Regulados, Niv...
$ date.x      <date> 2016-04-01, 2016-04-01, 2016-04-01, 2016-04-01, 2016-05-01, 2016-05-01, 2016-05-01, 2016-05-01, 20...
$ ipc         <dbl> 85.5, 89.9, 85.4, 84.0, 89.1, 93.7, 87.6, 91.3, 91.9, 96.3, 90.3, 94.5, 93.7, 99.6, 92.0, 96.3, 93....
$ year        <dbl> 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 201...
$ month       <dbl> 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11,...
$ tipo_cambio <dbl> 14.7033, 14.7033, 14.7033, 14.7033, 14.2617, 14.2617, 14.2617, 14.2617, 13.9537, 13.9537, 13.9537, ...
$ date.y      <date> 2016-04-01, 2016-04-01, 2016-04-01, 2016-04-01, 2016-05-02, 2016-05-02, 2016-05-02, 2016-05-02, 20...

Como existían dos columnas llamadas date, al realizar el join se le asigna por default el sufijo .x a la columna del primer dataframe y el sufijo .y al del segundo dataframe. Eliminamos una y modificamos el nombre de la restante

ipc_dolar = ipc_dolar %>% rename(date=date.x) %>% select(-date.y)

Realizamos algunas estadísticas descriptivas por año y mes para el IPC general y para el tipo de cambio

resumen=ipc_dolar %>% filter(Apertura=="Nivel general") %>%
              group_by(year) %>% 
              summarise(dolar_promedio=mean(tipo_cambio),
                        desvio_dolar=sd(tipo_cambio),
                        mediana_dolar=median(tipo_cambio),
                        rango_dolar=max(tipo_cambio)-min(tipo_cambio),
                        ipc_promedio=mean(ipc),
                        desvio_ipc=sd(ipc),
                        mediana_ipc=median(ipc),
                        rango_ipc=max(ipc)-min(ipc))
resumen

Con las dos fuentes de información juntas, podemos realizar gráficos conjuntos Como los rangos de las variables son muy diferentes, tenemos que utilizar un segundo eje.

ggplot()+
  geom_line(data = ipc_dolar %>% filter(Apertura=="Nivel general"),aes(x=date,y=ipc, color ="Nivel general"))+
  geom_line(data = ipc_dolar,aes(date,tipo_cambio*10, color ="Dolar"))+
  labs(x="Fecha", y="IPC", title="Evolución del IPC y Dolar")+
  theme_bw()+
  scale_y_continuous(sec.axis = sec_axis(~.*.1, name = "Dolar"))

También agrupando por apertura

ggplot()+
  geom_line(data = ipc_dolar,aes(date,ipc))+
  geom_line(data = ipc_dolar,aes(date,tipo_cambio*7, color ="Dolar"))+
  scale_y_continuous(sec.axis = sec_axis(~./7, name = "Dolar"))+
  scale_colour_manual("Color",values=c("darkgreen"))+
  theme_bw()+
  labs(x="Fecha", y="IPC", title="Evolución del IPC y Dolar por grupo")+
  facet_wrap(.~Apertura)

LS0tCnRpdGxlOiAiRWplcmNpY2lvIFRpZHl2ZXJzZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CiNMaWJyZXJpYXMKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgpSZWFsaXphbW9zIGxhIGxlY3R1cmEgZGUgbG9zIGRhdGFzZXRzIHkgbWlyYW1vcyBzdSBlc3RydWN0dXJhCmBgYHtyfQppcGMgPSByZWFkLmNzdignLi4vRnVlbnRlcy9pcGMtbWVuc3VhbC5jc3YnKQpkb2xhciA9IHJlYWQuY3N2KCcuLi9GdWVudGVzL2RvbGFyLWRpYXJpby5jc3YnKQpnbGltcHNlKGlwYykKZ2xpbXBzZShkb2xhcikKYGBgCgpSZW5vbWJyYW1vcyBsYSB2YXJpYWJsZSBkZWwgdGlwbyBkZSBjYW1iaW8gcG9yIGFsZ28gbcOhcyBzZW5jaWxsbwpgYGB7cn0KZG9sYXIgPSBkb2xhciAlPiUgcmVuYW1lKHRpcG9fY2FtYmlvID0gVGlwby5kZS5DYW1iaW8uZGUuUmVmZXJlbmNpYS4uLmVuLlBlc29zLi4ucG9yLkTDs2xhcikKYGBgCgpDcmVhbW9zIGxhcyB2YXJpYWJsZXMgZmVjaGEsIGHDsW8sIG1lcyB5IGTDrWEKYGBge3J9CmRvbGFyID0gZG9sYXIgJT4lIG11dGF0ZShkYXRlPWRteShGZWNoYSksIHllYXI9eWVhcihkYXRlKSwgbW9udGg9bW9udGgoZGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXk9ZGF5KGRhdGUpKQpnbGltcHNlKGRvbGFyKQpgYGAKClNlbGVjY2lvbmFtb3MgZWwgcHJpbWVyIGTDrWEgaMOhYmlsIGRlbCBtZXMgcGFyYSBvYnRlbmVyIGxhIHByaW1lciBjb3RpemFjacOzbiBkZWwgbWVzLiBMYSBjb3RpemFjacOzbiBkZWwgZMOzbGFyIHNlIGRpc3BvbmliaWxpemEgZWwgcHJpbWVyIGTDrWEgaMOhYmlsIGRlbCBtZXMgeSBubyBlbCBwcmltZXIgZMOtYSBkZWwgbWVzLgpgYGB7cn0KZmVjaGFfY290aXphY2lvbj0gZG9sYXIlPiUgZ3JvdXBfYnkoeWVhcixtb250aCkgJT4lIAogIHN1bW1hcmlzZShkYXk9bWluKGRheSkpCmBgYAoKUmVhbGl6YW1vcyBlbCBqb2luIGNvbiBlbCBkYXRhZnJhbWUgZGVsIHByaW1lciBkw61hIGjDoWJpbApgYGB7cn0KZG9sYXIgPSBkb2xhciAlPiUgaW5uZXJfam9pbihmZWNoYV9jb3RpemFjaW9uLCBieT1jKCd5ZWFyJywgJ21vbnRoJywgJ2RheScpKSAlPiUgc2VsZWN0KC1jKEZlY2hhLCBkYXkpKQpgYGAKCkdyYWZpY2Ftb3MgbGEgZXZvbHVjacOzbiBkZWwgdGlwbyBkZSBjYW1iaW8gcGFyYSB0b2RvIGVsIGRhdGFzZXQKYGBge3J9CmdncGxvdChkb2xhciwgYWVzKHg9ZGF0ZSwgeT10aXBvX2NhbWJpbykpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh4PSJGZWNoYSIsIHk9IlRpcG8gZGUgY2FtYmlvIiwgdGl0bGU9IkV2b2x1Y2nDs24gZGVsIHRpcG8gZGUgY2FtYmlvIikrCiAgdGhlbWVfYncoKQpgYGAKCkxvcyBkYXRvcyBkZSBJUEMgZXN0w6FuIGVuIHVuIGZvcm1hdG8gcXVlIGhhY2Ugc3UgYW7DoWxpc2lzIGJhc3RhbnRlIGNvbXBsaWNhZG8uIFBhc2Ftb3MgbG9zIGRhdG9zIGEgdW4gZm9ybWF0byBtw6FzIHV0aWwgdXNhbmRvIGdhdGhlcigpLgpgYGB7cn0KaXBjPSBpcGMgJT4lIGdhdGhlciguLCBrZXkgICA9IGRhdGUsIHZhbHVlID0gaXBjLCAyOjI5KQpnbGltcHNlKGlwYykKYGBgCgpDcmVhbW9zIGxhcyB2YXJpYWJsZXMgZmVjaGEsIGHDsW8geSBtZXMgCmBgYHtyfQppcGM9IGlwYyAlPiUgbXV0YXRlKGRhdGU9eW1kKHBhcnNlX2RhdGVfdGltZShkYXRlLCBvcmRlcnMgPSAnbXknKSksCiAgICAgICAgICAgICAgICAgICAgeWVhcj15ZWFyKGRhdGUpLCBtb250aD1tb250aChkYXRlKSkKYGBgCgpHcmFmaWNhbW9zIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIElQQyBhIG5pdmVsIGdlbmVyYWwKCmBgYHtyfQppcGMgJT4lIGZpbHRlcihBcGVydHVyYT09ICJOaXZlbCBnZW5lcmFsIikgJT4lIApnZ3Bsb3QoLiwgYWVzKHg9IGRhdGUsIHkgPSBpcGMsIGdyb3VwID0gQXBlcnR1cmEgKSkgKwogIGdlb21fcG9pbnQoY29sb3I9ImZpcmVicmljayIpKwogIGdlb21fbGluZShzaXplPSAxLGFscGhhPTAuNzUsIGNvbG9yID0gImZpcmVicmljayIpKwogIGxhYnMoeD0iRmVjaGEiLCB5PSJJUEMiLCB0aXRsZT0iRXZvbHVjacOzbiBkZWwgSVBDIikrCiAgdGhlbWVfYncoKQoKYGBgCgoKCgpHcmFmaWNhbW9zIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIElQQyBwb3IgZ3J1cG8gCmBgYHtyfQpnZ3Bsb3QoaXBjLCBhZXMoeD0gZGF0ZSwgeSA9IGlwYywgZ3JvdXAgPSBBcGVydHVyYSwgY29sb3IgPSBBcGVydHVyYSApKSArCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fbGluZShzaXplPTEsYWxwaGE9MC43NSkrCiAgbGFicyh4PSJGZWNoYSIsIHk9IklQQyIsIHRpdGxlPSJFdm9sdWNpw7NuIGRlbCBJUEMgcG9yIGdydXBvIikrCiAgdGhlbWVfYncoKSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikKYGBgCgpQcm9jZWRlbW9zIGEgam9pbmVhciBhbWJvcyBkYXRhc2V0cyB1c2FuZG8gY29tbyBrZXlzIHBhcmEgam9pbmVhciBlbCBhw7FvIHkgZWwgbWVzLiBObyBwb2RlbW9zIHV0aWxpemFyIGxhIGZlY2hhIHBvcnF1ZSB2YW4gYSBkaWZlcmlyIGVudHJlIGxhcyBiYXNlcy4KVXRpbGl6YW1vcyB1biBpbm5lciBqb2luIHlhIHF1ZSBzb2xvIHF1ZXJlbW9zIHF1ZWRhcm5vcyBjb24gbG9zIG1lc2VzIHBhcmEgbG9zIGN1YWxlcyB0ZW5lbW9zIGluZm9ybWFjacOzbiBkZWwgSVBDIHkgZGVsIGTDs2xhci4KCmBgYHtyfQppcGNfZG9sYXIgPSBpcGMgJT4lIGlubmVyX2pvaW4oZG9sYXIsIGJ5PWMoJ3llYXInLCAnbW9udGgnKSkKZ2xpbXBzZShpcGNfZG9sYXIpCmBgYAoKQ29tbyBleGlzdMOtYW4gZG9zIGNvbHVtbmFzIGxsYW1hZGFzIGRhdGUsIGFsIHJlYWxpemFyIGVsIGpvaW4gc2UgbGUgYXNpZ25hIHBvciBkZWZhdWx0IGVsIHN1ZmlqbyAueCBhIGxhIGNvbHVtbmEgZGVsIHByaW1lciBkYXRhZnJhbWUgeSBlbCBzdWZpam8gLnkgYWwgZGVsIHNlZ3VuZG8gZGF0YWZyYW1lLiBFbGltaW5hbW9zIHVuYSB5IG1vZGlmaWNhbW9zIGVsIG5vbWJyZSBkZSBsYSByZXN0YW50ZSAKCmBgYHtyfQppcGNfZG9sYXIgPSBpcGNfZG9sYXIgJT4lIHJlbmFtZShkYXRlPWRhdGUueCkgJT4lIHNlbGVjdCgtZGF0ZS55KQpgYGAKUmVhbGl6YW1vcyBhbGd1bmFzIGVzdGFkw61zdGljYXMgZGVzY3JpcHRpdmFzIHBvciBhw7FvIHkgbWVzIHBhcmEgZWwgSVBDIGdlbmVyYWwgeSBwYXJhIGVsIHRpcG8gZGUgY2FtYmlvCgpgYGB7cn0KcmVzdW1lbj1pcGNfZG9sYXIgJT4lIGZpbHRlcihBcGVydHVyYT09Ik5pdmVsIGdlbmVyYWwiKSAlPiUKICAgICAgICAgICAgICBncm91cF9ieSh5ZWFyKSAlPiUgCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGRvbGFyX3Byb21lZGlvPW1lYW4odGlwb19jYW1iaW8pLAogICAgICAgICAgICAgICAgICAgICAgICBkZXN2aW9fZG9sYXI9c2QodGlwb19jYW1iaW8pLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5hX2RvbGFyPW1lZGlhbih0aXBvX2NhbWJpbyksCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdvX2RvbGFyPW1heCh0aXBvX2NhbWJpbyktbWluKHRpcG9fY2FtYmlvKSwKICAgICAgICAgICAgICAgICAgICAgICAgaXBjX3Byb21lZGlvPW1lYW4oaXBjKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdmlvX2lwYz1zZChpcGMpLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5hX2lwYz1tZWRpYW4oaXBjKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ29faXBjPW1heChpcGMpLW1pbihpcGMpKQoKcmVzdW1lbgpgYGAKCgpDb24gbGFzIGRvcyBmdWVudGVzIGRlIGluZm9ybWFjacOzbiBqdW50YXMsIHBvZGVtb3MgcmVhbGl6YXIgZ3LDoWZpY29zIGNvbmp1bnRvcwpDb21vIGxvcyByYW5nb3MgZGUgbGFzIHZhcmlhYmxlcyBzb24gbXV5IGRpZmVyZW50ZXMsIHRlbmVtb3MgcXVlIHV0aWxpemFyIHVuIHNlZ3VuZG8gZWplLgoKYGBge3J9CmdncGxvdCgpKwogIGdlb21fbGluZShkYXRhID0gaXBjX2RvbGFyICU+JSBmaWx0ZXIoQXBlcnR1cmE9PSJOaXZlbCBnZW5lcmFsIiksYWVzKHg9ZGF0ZSx5PWlwYywgY29sb3IgPSJOaXZlbCBnZW5lcmFsIikpKwogIGdlb21fbGluZShkYXRhID0gaXBjX2RvbGFyLGFlcyhkYXRlLHRpcG9fY2FtYmlvKjEwLCBjb2xvciA9IkRvbGFyIikpKwogIGxhYnMoeD0iRmVjaGEiLCB5PSJJUEMiLCB0aXRsZT0iRXZvbHVjacOzbiBkZWwgSVBDIHkgRG9sYXIiKSsKICB0aGVtZV9idygpKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uKi4xLCBuYW1lID0gIkRvbGFyIikpCgpgYGAKClRhbWJpw6luIGFncnVwYW5kbyBwb3IgYXBlcnR1cmEKCmBgYHtyfQpnZ3Bsb3QoKSsKICBnZW9tX2xpbmUoZGF0YSA9IGlwY19kb2xhcixhZXMoZGF0ZSxpcGMpKSsKICBnZW9tX2xpbmUoZGF0YSA9IGlwY19kb2xhcixhZXMoZGF0ZSx0aXBvX2NhbWJpbyo3LCBjb2xvciA9IkRvbGFyIikpKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4uLzcsIG5hbWUgPSAiRG9sYXIiKSkrCiAgc2NhbGVfY29sb3VyX21hbnVhbCgiQ29sb3IiLHZhbHVlcz1jKCJkYXJrZ3JlZW4iKSkrCiAgdGhlbWVfYncoKSsKICBsYWJzKHg9IkZlY2hhIiwgeT0iSVBDIiwgdGl0bGU9IkV2b2x1Y2nDs24gZGVsIElQQyB5IERvbGFyIHBvciBncnVwbyIpKwogIGZhY2V0X3dyYXAoLn5BcGVydHVyYSkKCmBgYAoK