1 Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

2 Citação

Sugestão de citação:

FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: Deflacao e TGC com R-Code. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em http://rpubs.com/amrofi/deflate_GDP.

3 Introdução

Exemplo rápido de como fazer o PIB real e obter a taxa de crescimento TGC. Vou baixar a série do PIB do Centro-Oeste com o BETS. Os dados do IBGE-SIDRA são da Tabela 5938 - Produto interno bruto a preços correntes, impostos, líquidos de subsídios, sobre produtos a preços correntes e valor adicionado bruto a preços correntes total e por atividade econômica, e respectivas participações - Referência 2010.

São idênticos à série do BCB-SGST 23986 - Produto Interno Bruto corrente a preços de mercado (Ref. 2010) - Centro-Oeste. A referência 2010 quer dizer conforme o SCN atualizado em 2010. Está com valores correntes, nominais da época, ou a preços de mercado

4 Dados nominais

library(BETS)
PIBN <- BETSget(23986, data.frame = TRUE)
# pedi em data.frame porque quero fazer regressao por lm e depois por ts
print(PIBN)
         date        value
1  2002-01-01 128162640836
2  2003-01-01 152557676744
3  2004-01-01 174941298901
4  2005-01-01 187580106760
5  2006-01-01 203404866571
6  2007-01-01 232926912103
7  2008-01-01 278138889231
8  2009-01-01 309400654698
9  2010-01-01 354815822844
10 2011-01-01 400152793985
11 2012-01-01 444538053531
12 2013-01-01 485623020493
13 2014-01-01 542632029966
14 2015-01-01 579746186416
15 2016-01-01 633072229064
16 2017-01-01 659912881933
17 2018-01-01 694910923205

Observe que ao fazer isso ocorre uma imprecisão. O indice da data consta sempre o primeiro dia do ano, enquanto esse valor de PIB se refere ao ano completo, portanto fim de ano. Alterarei para constar 2002-12-01, 2003-12-01 etc, de modo a ficar compatível com o IPCA que será usado para deflacionar mais a frente. Do mesmo modo, deve-se entender que embora apareça sempre dia primeiro, se refere ao mês inteiro! Uma opção é chamar do BETS em objeto ts e converter em tibble, mas o indice temporal ficará apenas os quatro digitos do ano, sem o mês.

# nao executado
PIBN.ts <- BETSget(23986, data.frame = FALSE)
PIBN.ts
library(tidyverse)
library(timetk)
data_tbl <- tk_tbl(PIBN.ts)

4.1 TGC no PIB nominal

vmt <- PIBN[1:17, 2]

t <- seq(from = 2002, to = 2018)  # anos 2002 a 2018

logv <- log(vmt)

eq = lm(logv ~ t)
summary(eq)

Call:
lm(formula = logv ~ t)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.13381 -0.02823  0.01190  0.05267  0.07702 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.925e+02  6.286e+00  -30.62 6.14e-15 ***
t            1.090e-01  3.127e-03   34.84 9.08e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.06317 on 15 degrees of freedom
Multiple R-squared:  0.9878,    Adjusted R-squared:  0.987 
F-statistic:  1214 on 1 and 15 DF,  p-value: 9.077e-16
# pego o segundo parâmetro - o primeiro é o intercepto

beta <- summary(eq)$coefficients[2]

# Calculo da TGC
(TGC = I((exp(beta) - 1) * 100))
[1] 11.51259

O p-value = 9.08e-16 do coeficiente de t foi significativo. A TGC do PIB nominal foi 11.51% a.a.

5 Dados Reais: Deflação pelo IPCA

Primeiro vou carregar os pacotes necessários.

# pacotes e deflacao -----
library(sidrar)
library(readxl)
library(tidyverse)
library(ggplot2)
library(magrittr)
library(lubridate)

Neste exercício fiz com o IPCA. Alguns leitores podem criticar de que deveria ser o deflator implícito do PIB. Deixarei a discussão de qual o melhor índice para deflacionar itens das contas nacionais para vocês!

Vou baixar o IPCA do IBGE-SIDRA pelo pacote sidrar. O código da api deve ser obtido no site do IBGE. A variável 2266, IPCA - Número-índice (base: dezembro de 1993 = 100), Série encadeada, ou seja, dezembro de 1993 vale 100 e as demais estão relativizadas para ela. Se fizer a divisão entre o valor nominal pela série encadeada (divisão1), você estará deflacionando para a base (neste caso, colocando em valores deflacionados de dezembro de 1993). Para obter em valores do período desejado, você precisa multiplicar pelo valor correspondente ao mês para onde quer. Exemplo: para alterar para valores de dezembro de 2018, vou multiplicar o resultado da divisão1 pelo valor da linha de dez/2018 do objeto ipca do chunk abaixo. (ipca[ipca[, "Mês (Código)"] == "201812","Valor"] que retornará o valor 5100.61)

ipca = get_sidra(api = "/t/1737/n1/all/v/2266/p/all/d/v2266%2013")
# criar coluna date no formato para series temporais
ipca %<>%
    mutate(date = parse_date_time(`Mês (Código)`, "ym"))
ipcadez2018 <- ipca[ipca[, "Mês (Código)"] == "201812", "Valor"]
ipcadez2018
FALSE [1] 5100.61

Baixei o IPCA e vou juntar com o dataset de PIB nominal selecionando apenas as colunas de interesse.

Antes de juntar, vou arrumar a série de data para constar sempre dezembro do ano.

## by month
mesano <- seq(as.Date("2002-12-1"), as.Date("2018-12-1"), by = "years")
mesano
 [1] "2002-12-01" "2003-12-01" "2004-12-01" "2005-12-01" "2006-12-01"
 [6] "2007-12-01" "2008-12-01" "2009-12-01" "2010-12-01" "2011-12-01"
[11] "2012-12-01" "2013-12-01" "2014-12-01" "2015-12-01" "2016-12-01"
[16] "2017-12-01" "2018-12-01"

Neste caso, no chunk abaixo, juntarei conforme a coluna date, ou seja, o programa procura nos dois datasets (ipca e PIBN) e coloca lado a lado respeitando a data.

Preciso certificar de que a coluna date em PIBN é a coluna mesano criada no último chunk.

PIBN$date <- mesano
PIBN

Ao mesmo tempo usei o na.omit() para omitir as linhas com valores ausentes. Assim, ficarei apenas com as linhas completas para ipca e PIBN. Como o PIBN é uma observação por ano, terei as mesmas 17 observações de ipca.

O comando mutate faz a deflação pela fórmula, obtendo o PIB Real (PIBR) no ano t em valores de dez/2018.

\[ PIBR_t=\frac{PIBN_t}{IPCA_t} *IPCA_{dez2018} \]

#
ajuste <- left_join(ipca, PIBN, by = "date") %>%
    select(date, Valor, value) %>%
    na.omit()
# trouxe para 2018 - linha 17
# ajuste$PIBR<-I((ajuste$value/ajuste$Valor)*ipcadez2018)
ajuste <- ajuste %>%
    mutate(PIBR = (value/Valor) * ipcadez2018)
# alterarei os nomes das colunas para ficar mais amigável
colnames(ajuste) <- c("date", "IPCA", "PIBN", "PIBR")
# ajuste
ajuste$date <- t
table.tbl <- tibble::as_tibble(ajuste)
table.tbl
library(gt)
library(glue)
library(gtsummary)
gttable <- gt::gt(table.tbl)
tabela <- gttable %>%
    tab_header(title = "Valores de PIB do Centro-Oeste do Brasil, nominais (PIBN) e reais (PIBR)",
        subtitle = "(em R$ deflacionados pelo IPCA para Dez/2018)") %>%
    tab_source_note(source_note = "Fonte: Elaborado com dados brutos do SIDRA-IBGE.")
# mostrar tabela
tabela
Valores de PIB do Centro-Oeste do Brasil, nominais (PIBN) e reais (PIBR)
(em R$ deflacionados pelo IPCA para Dez/2018)
date IPCA PIBN PIBR
2002 2039.78 128162640836 320479486747
2003 2229.49 152557676744 349020274402
2004 2398.92 174941298901 371962107360
2005 2535.40 187580106760 377365689178
2006 2615.05 203404866571 396737690095
2007 2731.62 232926912103 434932141785
2008 2892.86 278138889231 490406725455
2009 3017.59 309400654698 522977632268
2010 3195.89 354815822844 566282673732
2011 3403.73 400152793985 599643139300
2012 3602.46 444538053531 629407471901
2013 3815.39 485623020493 649205883162
2014 4059.86 542632029966 681736404301
2015 4493.17 579746186416 658123150447
2016 4775.70 633072229064 676142668570
2017 4916.46 659912881933 684630454579
2018 5100.61 694910923205 694910923205
Fonte: Elaborado com dados brutos do SIDRA-IBGE.
library(ggplot2)
library(tidyverse)
ajuste %>%
    select(date, PIBN, PIBR) %>%
    pivot_longer(-date, names_to = "Variáveis", values_to = "Valor") %>%
    ggplot(aes(x = date, y = Valor, color = Variáveis)) + geom_line() + labs(title = "PIB do Centro-Oeste do Brasil, nominais e reais",
    x = "Data", color = "") + theme_light()

5.1 TGC no PIB Real

vmt <- table.tbl$PIBR

t <- seq(from = 2002, to = 2018)  # anos 2002 a 2018

logv <- log(vmt)

eq = lm(logv ~ t)
summary(eq)

Call:
lm(formula = logv ~ t)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.12338 -0.05599 -0.01831  0.06608  0.09423 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -77.850057   7.163799  -10.87 1.66e-08 ***
t             0.052151   0.003564   14.63 2.75e-10 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.07199 on 15 degrees of freedom
Multiple R-squared:  0.9345,    Adjusted R-squared:  0.9302 
F-statistic: 214.1 on 1 and 15 DF,  p-value: 2.754e-10
# pego o segundo parâmetro - o primeiro é o intercepto

beta <- summary(eq)$coefficients[2]

# Calculo da TGC
(TGC = I((exp(beta) - 1) * 100))
[1] 5.353469

Portanto, o coeficiente de t foi significativo (p-value=2.75E-10) e a TGC calculada foi de 5.35% a.a. entre 2002 e 2018.

Referências de pacotes utilizados

Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2021. Rmarkdown: Dynamic Documents for r. https://CRAN.R-project.org/package=rmarkdown.
Bache, Stefan Milton, and Hadley Wickham. 2020. Magrittr: A Forward-Pipe Operator for r. https://CRAN.R-project.org/package=magrittr.
Barnier, Julien. 2021. Rmdformats: HTML Output Formats and Templates for Rmarkdown Documents. https://github.com/juba/rmdformats.
Costa Ferreira, Pedro, Talitha Speranza, and Jonatha Costa. 2018. BETS: Brazilian Economic Time Series. https://github.com/nmecsys/BETS.
Grolemund, Garrett, and Hadley Wickham. 2011. “Dates and Times Made Easy with lubridate.” Journal of Statistical Software 40 (3): 1–25. https://www.jstatsoft.org/v40/i03/.
Henry, Lionel, and Hadley Wickham. 2020. Purrr: Functional Programming Tools. https://CRAN.R-project.org/package=purrr.
Hester, Jim. 2020. Glue: Interpreted String Literals. https://CRAN.R-project.org/package=glue.
Iannone, Richard, Joe Cheng, and Barret Schloerke. 2021. Gt: Easily Create Presentation-Ready Display Tables. https://CRAN.R-project.org/package=gt.
Meireles, Fernando. 2018. deflateBR: Deflate Nominal Brazilian Reais. https://github.com/meirelesff/deflatebr/.
Müller, Kirill, and Hadley Wickham. 2021. Tibble: Simple Data Frames. https://CRAN.R-project.org/package=tibble.
Prado Siqueira, Renato. 2020. Sidrar: An Interface to IBGE’s SIDRA API. http://github.com/rpradosiqueira/sidrar.
R Core Team. 2021. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Sjoberg, Daniel D., Michael Curry, Margie Hannum, Joseph Larmarange, Karissa Whiting, and Emily C. Zabor. 2021. Gtsummary: Presentation-Ready Data Summary and Analytic Result Tables. https://CRAN.R-project.org/package=gtsummary.
Spinu, Vitalie, Garrett Grolemund, and Hadley Wickham. 2021. Lubridate: Make Dealing with Dates a Little Easier. https://CRAN.R-project.org/package=lubridate.
Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
———. 2019. Stringr: Simple, Consistent Wrappers for Common String Operations. https://CRAN.R-project.org/package=stringr.
———. 2021a. Forcats: Tools for Working with Categorical Variables (Factors). https://CRAN.R-project.org/package=forcats.
———. 2021b. Tidyr: Tidy Messy Data. https://CRAN.R-project.org/package=tidyr.
———. 2021c. Tidyverse: Easily Install and Load the Tidyverse. https://CRAN.R-project.org/package=tidyverse.
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.” Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, and Jennifer Bryan. 2019. Readxl: Read Excel Files. https://CRAN.R-project.org/package=readxl.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2021. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2021. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.
Wickham, Hadley, and Jim Hester. 2020. Readr: Read Rectangular Text Data. https://CRAN.R-project.org/package=readr.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC. http://www.crcpress.com/product/isbn/ 9781466561595.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2016. Bookdown: Authoring Books and Technical Documents with R Markdown. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/bookdown.
———. 2021a. Bookdown: Authoring Books and Technical Documents with r Markdown. https://CRAN.R-project.org/package=bookdown.
———. 2021b. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown.
Xie, Yihui, Christophe Dervieux, and Emily Riederer. 2020. R Markdown Cookbook. Boca Raton, Florida: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown-cookbook.
LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBEZWZsYWNhbyBlIFRHQyBjb20gUi1Db2RlIg0KYXV0aG9yOiAiQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8sICplLW1haWw6IGFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyKiINCmFic3RyYWN0OiANCiAgVGhpcyBpcyBhbiB1bmRlcmdyYWR1YXRlIGV4ZXJjaXNlIHRvIGRlZmxhdGUgdGhlIEdEUCBhbmQgY29tcHV0ZSBHZW9tZXRyaWMgR3Jvd3RoIFJhdGUuDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCmJpYmxpb2dyYXBoeTogcGFja2FnZXMuYmliDQpub2NpdGU6ICdAKicNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPVQsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQojIExpY2Vuw6dhDQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpe3dpZHRoPSIyNSUifQ0KDQojIENpdGHDp8Ojbw0KDQpTdWdlc3TDo28gZGUgY2l0YcOnw6NvOg0KDQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuICoqRWNvbm9tZXRyaWE6IERlZmxhY2FvIGUgVEdDIGNvbSBSLUNvZGUqKi4gQ2FtcG8gR3JhbmRlLU1TLEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMS4gRGlzcG9uw612ZWwgZW0gPGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL2RlZmxhdGVfR0RQPi4NCg0KIyBJbnRyb2R1w6fDo28NCg0KRXhlbXBsbyByw6FwaWRvIGRlIGNvbW8gZmF6ZXIgbyBQSUIgcmVhbCBlIG9idGVyIGEgdGF4YSBkZSBjcmVzY2ltZW50byBUR0MuIFZvdSBiYWl4YXIgYSBzw6lyaWUgZG8gUElCIGRvIENlbnRyby1PZXN0ZSBjb20gbyBCRVRTLiBPcyBkYWRvcyBkbyBJQkdFLVNJRFJBIHPDo28gZGEgKipUYWJlbGEgNTkzOCAtIFByb2R1dG8gaW50ZXJubyBicnV0byBhIHByZcOnb3MgY29ycmVudGVzLCBpbXBvc3RvcywgbMOtcXVpZG9zIGRlIHN1YnPDrWRpb3MsIHNvYnJlIHByb2R1dG9zIGEgcHJlw6dvcyBjb3JyZW50ZXMgZSB2YWxvciBhZGljaW9uYWRvIGJydXRvIGEgcHJlw6dvcyBjb3JyZW50ZXMgdG90YWwgZSBwb3IgYXRpdmlkYWRlIGVjb27DtG1pY2EsIGUgcmVzcGVjdGl2YXMgcGFydGljaXBhw6fDtWVzIC0gUmVmZXLDqm5jaWEgMjAxMC4qKg0KDQpTw6NvIGlkw6pudGljb3Mgw6Agc8OpcmllIGRvIEJDQi1TR1NUICoqMjM5ODYgLSBQcm9kdXRvIEludGVybm8gQnJ1dG8gY29ycmVudGUgYSBwcmXDp29zIGRlIG1lcmNhZG8gKFJlZi4gMjAxMCkgLSBDZW50cm8tT2VzdGUuKiogQSByZWZlcsOqbmNpYSAyMDEwIHF1ZXIgZGl6ZXIgY29uZm9ybWUgbyBTQ04gYXR1YWxpemFkbyBlbSAyMDEwLiBFc3TDoSBjb20gdmFsb3JlcyBjb3JyZW50ZXMsIG5vbWluYWlzIGRhIMOpcG9jYSwgb3UgYSBwcmXDp29zIGRlIG1lcmNhZG8NCg0KIyBEYWRvcyBub21pbmFpcw0KDQpgYGB7ciBkYWRvc30NCmxpYnJhcnkoQkVUUykNClBJQk48LSBCRVRTZ2V0KDIzOTg2LGRhdGEuZnJhbWUgPSBUUlVFKSANCiMgcGVkaSBlbSBkYXRhLmZyYW1lIHBvcnF1ZSBxdWVybyBmYXplciByZWdyZXNzYW8gcG9yIGxtIGUgZGVwb2lzIHBvciB0cw0KcHJpbnQoUElCTikNCmBgYA0KDQpPYnNlcnZlIHF1ZSBhbyBmYXplciBpc3NvIG9jb3JyZSB1bWEgaW1wcmVjaXPDo28uIE8gaW5kaWNlIGRhIGRhdGEgY29uc3RhIHNlbXByZSBvIHByaW1laXJvIGRpYSBkbyBhbm8sIGVucXVhbnRvIGVzc2UgdmFsb3IgZGUgUElCIHNlIHJlZmVyZSBhbyBhbm8gY29tcGxldG8sIHBvcnRhbnRvIGZpbSBkZSBhbm8uIEFsdGVyYXJlaSBwYXJhIGNvbnN0YXIgMjAwMi0xMi0wMSwgMjAwMy0xMi0wMSBldGMsIGRlIG1vZG8gYSBmaWNhciBjb21wYXTDrXZlbCBjb20gbyBJUENBIHF1ZSBzZXLDoSB1c2FkbyBwYXJhIGRlZmxhY2lvbmFyIG1haXMgYSBmcmVudGUuIERvIG1lc21vIG1vZG8sIGRldmUtc2UgZW50ZW5kZXIgcXVlIGVtYm9yYSBhcGFyZcOnYSBzZW1wcmUgZGlhIHByaW1laXJvLCBzZSByZWZlcmUgYW8gbcOqcyBpbnRlaXJvISBVbWEgb3DDp8OjbyDDqSBjaGFtYXIgZG8gQkVUUyBlbSBvYmpldG8gdHMgZSBjb252ZXJ0ZXIgZW0gdGliYmxlLCBtYXMgbyBpbmRpY2UgdGVtcG9yYWwgZmljYXLDoSBhcGVuYXMgb3MgcXVhdHJvIGRpZ2l0b3MgZG8gYW5vLCBzZW0gbyBtw6pzLg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgbmFvIGV4ZWN1dGFkbw0KUElCTi50czwtIEJFVFNnZXQoMjM5ODYsZGF0YS5mcmFtZSA9IEZBTFNFKSANClBJQk4udHMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aW1ldGspDQpkYXRhX3RibCA8LSB0a190YmwoUElCTi50cykNCmBgYA0KDQojIyBUR0Mgbm8gUElCIG5vbWluYWwNCg0KYGBge3IgdGdjX25vbWluYWx9DQp2bXQ8LVBJQk5bMToxNywyXQ0KDQp0PC1zZXEoZnJvbT0yMDAyLCB0bz0yMDE4KSAgICMgYW5vcyAyMDAyIGEgMjAxOA0KDQpsb2d2PC1sb2codm10KQ0KDQplcT1sbShsb2d2fnQpDQpzdW1tYXJ5KGVxKQ0KIyBwZWdvIG8gc2VndW5kbyBwYXLDom1ldHJvIC0gbyBwcmltZWlybyDDqSBvIGludGVyY2VwdG8NCg0KYmV0YSA8LSBzdW1tYXJ5KGVxKSRjb2VmZmljaWVudHNbMl0gIA0KDQojIENhbGN1bG8gZGEgVEdDDQooVEdDPUkoKGV4cChiZXRhKS0xKSoxMDApKQ0KDQpgYGANCg0KTyBwLXZhbHVlID0gOS4wOGUtMTYgZG8gY29lZmljaWVudGUgZGUgdCBmb2kgc2lnbmlmaWNhdGl2by4gQSBUR0MgZG8gUElCIG5vbWluYWwgZm9pIDExLjUxJSBhLmEuDQoNCiMgRGFkb3MgUmVhaXM6IERlZmxhw6fDo28gcGVsbyBJUENBDQoNClByaW1laXJvIHZvdSBjYXJyZWdhciBvcyBwYWNvdGVzIG5lY2Vzc8Ohcmlvcy4NCg0KYGBge3IgcGFjb3Rlcyx3YXJuaW5nPUZBTFNFLGNvbW1lbnQ9RkFMU0V9DQojIHBhY290ZXMgIGUgZGVmbGFjYW8gLS0tLS0NCmxpYnJhcnkoc2lkcmFyKTsgbGlicmFyeShyZWFkeGwpOyBsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkobWFncml0dHIpOyBsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KYGBgDQoNCk5lc3RlIGV4ZXJjw61jaW8gZml6IGNvbSBvIElQQ0EuIEFsZ3VucyBsZWl0b3JlcyBwb2RlbSBjcml0aWNhciBkZSBxdWUgZGV2ZXJpYSBzZXIgbyBkZWZsYXRvciBpbXBsw61jaXRvIGRvIFBJQi4gRGVpeGFyZWkgYSBkaXNjdXNzw6NvIGRlIHF1YWwgbyBtZWxob3Igw61uZGljZSBwYXJhIGRlZmxhY2lvbmFyIGl0ZW5zIGRhcyBjb250YXMgbmFjaW9uYWlzIHBhcmEgdm9jw6pzIQ0KDQpWb3UgYmFpeGFyIG8gSVBDQSBkbyBJQkdFLVNJRFJBIHBlbG8gcGFjb3RlIGBzaWRyYXJgLiBPIGPDs2RpZ28gZGEgYXBpIGRldmUgc2VyIG9idGlkbyBubyBzaXRlIGRvIElCR0UuIEEgdmFyacOhdmVsIDIyNjYsIElQQ0EgLSBOw7ptZXJvLcOtbmRpY2UgKGJhc2U6IGRlemVtYnJvIGRlIDE5OTMgPSAxMDApLCBTw6lyaWUgZW5jYWRlYWRhLCBvdSBzZWphLCBkZXplbWJybyBkZSAxOTkzIHZhbGUgMTAwIGUgYXMgZGVtYWlzIGVzdMOjbyByZWxhdGl2aXphZGFzIHBhcmEgZWxhLiBTZSBmaXplciBhIGRpdmlzw6NvIGVudHJlIG8gdmFsb3Igbm9taW5hbCBwZWxhIHPDqXJpZSBlbmNhZGVhZGEgKCoqZGl2aXPDo28xKiopLCB2b2PDqiBlc3RhcsOhIGRlZmxhY2lvbmFuZG8gcGFyYSBhIGJhc2UgKG5lc3RlIGNhc28sIGNvbG9jYW5kbyBlbSB2YWxvcmVzIGRlZmxhY2lvbmFkb3MgZGUgZGV6ZW1icm8gZGUgMTk5MykuIFBhcmEgb2J0ZXIgZW0gdmFsb3JlcyBkbyBwZXLDrW9kbyBkZXNlamFkbywgdm9jw6ogcHJlY2lzYSBtdWx0aXBsaWNhciBwZWxvIHZhbG9yIGNvcnJlc3BvbmRlbnRlIGFvIG3DqnMgcGFyYSBvbmRlIHF1ZXIuIEV4ZW1wbG86IHBhcmEgYWx0ZXJhciBwYXJhIHZhbG9yZXMgZGUgZGV6ZW1icm8gZGUgMjAxOCwgdm91IG11bHRpcGxpY2FyIG8gcmVzdWx0YWRvIGRhICoqZGl2aXPDo28xKiogcGVsbyB2YWxvciBkYSBsaW5oYSBkZSBkZXovMjAxOCBkbyBvYmpldG8gaXBjYSBkbyBjaHVuayBhYmFpeG8uIChgaXBjYVtpcGNhWywgIk3DqnMgKEPDs2RpZ28pIl0gPT0gIjIwMTgxMiIsIlZhbG9yIl1gIHF1ZSByZXRvcm5hcsOhIG8gdmFsb3IgNTEwMC42MSkNCg0KYGBge3IgaXBjYSx3YXJuaW5nPUZBTFNFLGNvbW1lbnQ9RkFMU0V9DQppcGNhID0gZ2V0X3NpZHJhKGFwaT0nL3QvMTczNy9uMS9hbGwvdi8yMjY2L3AvYWxsL2QvdjIyNjYlMjAxMycpDQojIGNyaWFyIGNvbHVuYSBkYXRlIG5vIGZvcm1hdG8gcGFyYSBzZXJpZXMgdGVtcG9yYWlzDQppcGNhICU8PiUgbXV0YXRlKGRhdGUgPSBwYXJzZV9kYXRlX3RpbWUoYE3DqnMgKEPDs2RpZ28pYCwgJ3ltJykpDQppcGNhZGV6MjAxODwtaXBjYVtpcGNhWywgIk3DqnMgKEPDs2RpZ28pIl0gPT0gIjIwMTgxMiIsIlZhbG9yIl0NCmlwY2FkZXoyMDE4DQpgYGANCg0KQmFpeGVpIG8gSVBDQSBlIHZvdSBqdW50YXIgY29tIG8gZGF0YXNldCBkZSBQSUIgbm9taW5hbCBzZWxlY2lvbmFuZG8gYXBlbmFzIGFzIGNvbHVuYXMgZGUgaW50ZXJlc3NlLg0KDQpBbnRlcyBkZSBqdW50YXIsIHZvdSBhcnJ1bWFyIGEgc8OpcmllIGRlIGRhdGEgcGFyYSBjb25zdGFyIHNlbXByZSBkZXplbWJybyBkbyBhbm8uDQoNCmBgYHtyfQ0KIyMgYnkgbW9udGgNCm1lc2Fubzwtc2VxKGFzLkRhdGUoIjIwMDItMTItMSIpLCBhcy5EYXRlKCIyMDE4LTEyLTEiKSwgYnkgPSAieWVhcnMiKQ0KbWVzYW5vDQpgYGANCg0KTmVzdGUgY2Fzbywgbm8gY2h1bmsgYWJhaXhvLCBqdW50YXJlaSBjb25mb3JtZSBhIGNvbHVuYSBkYXRlLCBvdSBzZWphLCBvIHByb2dyYW1hIHByb2N1cmEgbm9zIGRvaXMgZGF0YXNldHMgKGlwY2EgZSBQSUJOKSBlIGNvbG9jYSBsYWRvIGEgbGFkbyByZXNwZWl0YW5kbyBhIGRhdGEuDQoNClByZWNpc28gY2VydGlmaWNhciBkZSBxdWUgYSBjb2x1bmEgZGF0ZSBlbSBQSUJOIMOpIGEgY29sdW5hIG1lc2FubyBjcmlhZGEgbm8gw7psdGltbyBjaHVuay4NCg0KYGBge3IgYWx0ZXJhcmRhdGV9DQpQSUJOJGRhdGU8LW1lc2Fubw0KUElCTg0KYGBgDQoNCkFvIG1lc21vIHRlbXBvIHVzZWkgbyBgbmEub21pdCgpYCBwYXJhIG9taXRpciBhcyBsaW5oYXMgY29tIHZhbG9yZXMgYXVzZW50ZXMuIEFzc2ltLCBmaWNhcmVpIGFwZW5hcyBjb20gYXMgbGluaGFzIGNvbXBsZXRhcyBwYXJhIGlwY2EgZSBQSUJOLiBDb21vIG8gUElCTiDDqSB1bWEgb2JzZXJ2YcOnw6NvIHBvciBhbm8sIHRlcmVpIGFzIG1lc21hcyAxNyBvYnNlcnZhw6fDtWVzIGRlIGlwY2EuDQoNCk8gY29tYW5kbyBtdXRhdGUgZmF6IGEgZGVmbGHDp8OjbyBwZWxhIGbDs3JtdWxhLCBvYnRlbmRvIG8gUElCIFJlYWwgKFBJQlIpIG5vIGFubyB0IGVtIHZhbG9yZXMgZGUgZGV6LzIwMTguDQoNCiQkDQpQSUJSX3Q9XGZyYWN7UElCTl90fXtJUENBX3R9ICpJUENBX3tkZXoyMDE4fQ0KJCQNCg0KYGBge3Igam9pbmRhdGEsd2FybmluZz1GQUxTRSxjb21tZW50PUZBTFNFfQ0KIyANCmFqdXN0ZSA8LSBsZWZ0X2pvaW4oaXBjYSwgUElCTiwgYnk9J2RhdGUnKSAlPiUNCiAgc2VsZWN0KGRhdGUsIFZhbG9yLCB2YWx1ZSkgJT4lDQogIG5hLm9taXQoKQ0KIyB0cm91eGUgcGFyYSAyMDE4IC0gbGluaGEgMTcNCiMgYWp1c3RlJFBJQlI8LUkoKGFqdXN0ZSR2YWx1ZS9hanVzdGUkVmFsb3IpKmlwY2FkZXoyMDE4KQ0KYWp1c3RlPC1hanVzdGUgICU+JQ0KICBtdXRhdGUoJ1BJQlInID0gKHZhbHVlL1ZhbG9yKSppcGNhZGV6MjAxOCkNCiMgYWx0ZXJhcmVpIG9zIG5vbWVzIGRhcyBjb2x1bmFzIHBhcmEgZmljYXIgbWFpcyBhbWlnw6F2ZWwNCmNvbG5hbWVzKGFqdXN0ZSk8LWMoImRhdGUiLCJJUENBIiwiUElCTiIsIlBJQlIiKQ0KI2FqdXN0ZQ0KYWp1c3RlJGRhdGU8LXQNCnRhYmxlLnRibDwtdGliYmxlOjphc190aWJibGUoYWp1c3RlKQ0KdGFibGUudGJsDQpgYGANCg0KYGBge3IgdGFiZWxhfQ0KbGlicmFyeShndCk7bGlicmFyeShnbHVlKTtsaWJyYXJ5KGd0c3VtbWFyeSkNCmd0dGFibGU8LWd0OjpndCh0YWJsZS50YmwpIA0KdGFiZWxhIDwtIA0KICAgZ3R0YWJsZSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9ICJWYWxvcmVzIGRlIFBJQiBkbyBDZW50cm8tT2VzdGUgZG8gQnJhc2lsLCBub21pbmFpcyAoUElCTikgZSByZWFpcyAoUElCUikiLA0KICAgIHN1YnRpdGxlID0gIihlbSBSJCBkZWZsYWNpb25hZG9zIHBlbG8gSVBDQSBwYXJhIERlei8yMDE4KSINCiAgKSU+JQ0KICB0YWJfc291cmNlX25vdGUoDQogICAgc291cmNlX25vdGUgPSAiRm9udGU6IEVsYWJvcmFkbyBjb20gZGFkb3MgYnJ1dG9zIGRvIFNJRFJBLUlCR0UuIg0KICApIA0KIyBtb3N0cmFyIHRhYmVsYQ0KdGFiZWxhDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsY29tbWVudD1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90Mik7bGlicmFyeSh0aWR5dmVyc2UpDQphanVzdGUgJT4lIHNlbGVjdChkYXRlLCBQSUJOLCBQSUJSKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC1kYXRlLCBuYW1lc190byA9ICdWYXJpw6F2ZWlzJywgdmFsdWVzX3RvID0gJ1ZhbG9yJykgJT4lDQogIGdncGxvdChhZXMoeD1kYXRlLCB5PVZhbG9yLCBjb2xvcj1WYXJpw6F2ZWlzKSkgKyBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGU9J1BJQiBkbyBDZW50cm8tT2VzdGUgZG8gQnJhc2lsLCBub21pbmFpcyBlIHJlYWlzJywgeD0nRGF0YScsDQogICAgICAgY29sb3I9JycpICsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCiMjIFRHQyBubyBQSUIgUmVhbA0KDQpgYGB7ciB0Z2NfcmVhbH0NCnZtdDwtdGFibGUudGJsJFBJQlIgDQoNCnQ8LXNlcShmcm9tPTIwMDIsIHRvPTIwMTgpICAgIyBhbm9zIDIwMDIgYSAyMDE4DQoNCmxvZ3Y8LWxvZyh2bXQpDQoNCmVxPWxtKGxvZ3Z+dCkNCnN1bW1hcnkoZXEpDQojIHBlZ28gbyBzZWd1bmRvIHBhcsOibWV0cm8gLSBvIHByaW1laXJvIMOpIG8gaW50ZXJjZXB0bw0KDQpiZXRhIDwtIHN1bW1hcnkoZXEpJGNvZWZmaWNpZW50c1syXSAgDQoNCiMgQ2FsY3VsbyBkYSBUR0MNCihUR0M9SSgoZXhwKGJldGEpLTEpKjEwMCkpDQoNCmBgYA0KDQpQb3J0YW50bywgbyBjb2VmaWNpZW50ZSBkZSB0IGZvaSBzaWduaWZpY2F0aXZvIChwLXZhbHVlPTIuNzVFLTEwKSBlIGEgVEdDIGNhbGN1bGFkYSBmb2kgZGUgNS4zNSUgYS5hLiBlbnRyZSAyMDAyIGUgMjAxOC4NCg0KIyBSZWZlcsOqbmNpYXMgZGUgcGFjb3RlcyB1dGlsaXphZG9zIHsjUmVmZmVyZW5jZXMgLnVubnVtYmVyZWR9DQoNCmBgYHtyLGluY2x1ZGU9RkFMU0V9DQprbml0cjo6d3JpdGVfYmliKGMoLnBhY2thZ2VzKCksICJib29rZG93biIpLCAicGFja2FnZXMuYmliIiwgd2lkdGggPSA2MCkNCmBgYA0K