Download
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.
Citação
Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Tópicos de econometria: ações. Campo Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/acoesBOV_VALE3.
Introdução
Inicialmente, agradeço a sugestão de leitores que permitem as melhorias das postagens. Sugiro que baixem alguns pacotes que serão necessários:
install.packages("quantmod")
install.packages("ggplot2")
install.packages("scales")
install.packages("ggthemes")
install.packages("dplyr")
install.packages("tidyquant")
install.packages("rbmfbovespa")
install.packages("xts")
Dados e gráfico
Esta primeira parte é baseada nas postagens do blog Análise Macro.
library(quantmod)
library(ggplot2)
library(scales)
library(ggthemes)
env = new.env()
getSymbols("VALE3.SA", src = "yahoo", env = env, from = as.Date("2019-01-14"))
[1] "VALE3.SA"
vale = env$VALE3.SA[, 4]
autoplot(vale) + geom_line(size = 0.8, colour = "darkblue") + scale_x_date(date_breaks = "15 days",
labels = date_format("%b %d")) + theme(axis.text.x = element_text(angle = 60,
vjust = 1, hjust = 1)) + labs(title = "VALE3.SA", caption = "Fonte: analisemacro.com.br com dados do Yahoo Finance.") +
xlab("") + ylab("R$")

Análise de ações brasileiras
Para esta análise, farei uso do quantmod
acima carregado, e gerarei o gráfico tipo candlestick
das ações da VALE3.SA, mas agora carregarei um período maior. Chamarei a série inteira disponível, e pedirei o candlestick apenas para os últimos 6 meses. Adicionaremos as bandas de Bollinger, para mostrar os desvios associados à série.
getSymbols("VALE3.SA", src = "yahoo")
[1] "VALE3.SA"
chart_Series(VALE3.SA)

# resumirei para os últimos 6 meses
chartSeries(VALE3.SA, subset = "last 6 months")

# adicionando as Bollinger Bands
addBBands()

Dados da Bolsa de São Paulo (B3)
Agora farei exemplos puxando dados da Bolsa de São Paulo, B3, antiga Bovespa. O repositório antigo de dados históricos da Bolsa está em http://www.bmfbovespa.com.br/pt_br/servicos/market-data/historico/mercado-a-vista/series-historicas/ e pode-se usar o pacote rbmfbovespa
. O site atual da B3 é http://www.b3.com.br/pt_br/market-data-e-indices/servicos-de-dados/market-data/historico/mercado-a-vista/series-historicas/. O usuário pode obter várias séries diretamente do pacote quantmod
se desejar.
Neste exemplo, baixei o arquivo de dados diários do ano de 2019, que vem em formato compactado e extrai para o diretório do projeto. Este arquivo tem o nome COTAHIST_A2019.TXT
.
Agora adaptarei a rotina de Henrique Cesár Costa (https://rpubs.com/henrikun/256128) para carregar os dados.
library(dplyr)
library(rbmfbovespa)
library(xts)
library(quantmod)
library(tidyquant)
library(ggplot2)
ch_2019 <- read_marketdata("COTAHIST_A2019.TXT", "COTAHIST")
O objeto ch_2019 que carregou o ‘COTAHIST’, possui três partes (header, cotações e trailer). A parte das cotações tem 26 colunas, onde têm-se os dados de todos os papéis-mercado. Pode-se visualizar a parte das Cotações históricas por papel-mercado
fazendo o código abaixo (aqui não reproduzido por questões de espaço).
View(ch_2019$`Cotações históricas por papel-mercado`)
Por exemplo, as últimas linhas das seis primeiras colunas será:
knitr::kable(tail.matrix(ch_2019$`Cotações históricas por papel-mercado`[, 1:6]))
506460 |
1 |
2019-09-04 |
78 |
YDUQC345 |
70 |
YDUQ |
506461 |
1 |
2019-09-04 |
78 |
YDUQJ32 |
70 |
YDUQ FM |
506462 |
1 |
2019-09-04 |
78 |
YDUQJ34 |
70 |
YDUQ FM |
506463 |
1 |
2019-09-04 |
78 |
YDUQJ35 |
70 |
YDUQ |
506464 |
1 |
2019-09-04 |
82 |
YDUQU33 |
80 |
YDUQE FM |
506465 |
1 |
2019-09-04 |
82 |
YDUQO260 |
80 |
YDUQE |
Como indicado na postagem de Costa (2017), “Para conhecer as variáveis dos datasets criados com rbmfbovespa
, execute o addin
do RStudio rbmfbovespa View Template
. Selecione um template para visualizar todas as colunas tratadas pelo dataset com informação de tipo e descrição. Selecione o template COTAHIST
e depois feche a janela de templates.”
No caso, Costa (2017) indicou o código BOVA11, mas se quiser, por exemplo, a VALE3, indicaremos adequadamente. Ver a segunda caixa de script.
BOVA11.df <- ch_2019[[2]] %>% filter(cod_negociacao == "BOVA11") %>% select(Date = data_referencia,
Open = preco_abertura, High = preco_max, Low = preco_min, Close = preco_ult,
Volume = volume_titulos_negociados)
BOVA11 <- as.xts(select(BOVA11.df, -Date), order.by = BOVA11.df$Date)
Para VALE3
, para o papel da empresa VALE, especificação ON NM (sempre atentando para o formato de letras maiúsculas):
VALE3.df <- ch_2019[[2]] %>% filter(cod_negociacao == "VALE3") %>% select(Date = data_referencia,
Open = preco_abertura, High = preco_max, Low = preco_min, Close = preco_ult,
Volume = volume_titulos_negociados)
VALE3 <- as.xts(select(VALE3.df, -Date), order.by = VALE3.df$Date)
Agora utilizaremos o objeto de séries temporais (xts) para executar a função quantmod::candleChart
e criar os gráficos de candle.
candleChart(BOVA11)

addBBands()

candleChart(VALE3)

addBBands()

Para alterar os padrões de cores, pode-se utilizar como abaixo, conforme sugerido por COSTA (2017):
candleChart(VALE3, theme = "white")

addBBands()

chart_Series(VALE3)

Agora outra opção fazendo o candle pelo pacote ggplot2
:
ggplot(VALE3.df, aes(x = Date, y = Close)) + geom_candlestick(aes(open = Open,
close = Close, high = High, low = Low))

Como ilustrado por Costa (2017), no pacote tidyquant
têm-se funções auxiliares ao quantmod
, para incluir medidas de análise técnica (como a média móvel) nos gráficos do ggplot2. Especifiquei um range pequeno (n=10 dias), pois a série é curta.
ggplot(VALE3.df, aes(x = Date, y = Close)) + geom_candlestick(aes(open = Open,
close = Close, high = High, low = Low)) + geom_ma(ma_fun = SMA, n = 10,
color = "red", linetype = 4, size = 1)

Referências
Greene, William H. 2012. Econometric Analysis. Prentice Hall/Pearson Education.
Gujarati, Damodar N., and Dawn C. Porter. 2011. Econometria Básica. AMGH/Bookman/McGraw-Hill do Brasil.
Tsay, Ruey S. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.
Wooldridge, Jeffrey M. 2015. Introductory Econometrics - A Modern Approach. Nelson Education.
LS0tDQp0aXRsZTogIlTDs3BpY29zIGRlIGVjb25vbWV0cmlhOiBhw6fDtWVzIg0KYXV0aG9yOiAiQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8sICplLW1haWw6IGFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyKiINCmxpbmtjb2xvcjogYmx1ZQ0KYWJzdHJhY3Q6IA0KICBUaGlzIGlzIGFuIHVuZGVyZ3JhZCBzdHVkZW50IGxldmVsIGluc3RydWN0aW9uIGZvciBjbGFzcyB1c2UuICANCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCm5vY2l0ZTogfA0KICBAd29vbGRyaWRnZTIwMTVpbnRyb2R1Y3RvcnksIEB0c2F5MjAxNGludHJvZHVjdGlvbiwgQGdyZWVuZTIwMTIsQGd1amFyYXRpX3BvcnRlcjIwMTEsQGNvc3RhMjAxNw0KcmVmZXJlbmNlczoNCi0gYXV0aG9yOg0KICAtIGZhbWlseTogR3VqYXJhdGkNCiAgICBnaXZlbjogRGFtb2RhciBOLg0KICAtIGZhbWlseTogUG9ydGVyDQogICAgZ2l2ZW46IERhd24gQy4gDQogIGlkOiBndWphcmF0aV9wb3J0ZXIyMDExDQogIGlzc3VlZDoNCiAgICB5ZWFyOiAyMDExDQogIHB1Ymxpc2hlcjogQU1HSC9Cb29rbWFuL01jR3Jhdy1IaWxsIGRvIEJyYXNpbA0KICB0aXRsZTogRWNvbm9tZXRyaWEgYsOhc2ljYQ0KICB0eXBlOiBib29rDQotIGF1dGhvcjoNCiAgLSBmYW1pbHk6IENvc3RhDQogICAgZ2l2ZW46IEhlbnJpcXVlIEMuDQogIGlkOiBjb3N0YTIwMTcNCiAgaXNzdWVkOg0KICAgIHllYXI6IDIwMTcNCiAgcHVibGlzaGVyOiBSUHVicyhodHRwczovL3JwdWJzLmNvbS9oZW5yaWt1bi8yNTYxMjgpDQogIHRpdGxlOiAnU2hvcnQgUGFwZXI6IEFuw6FsaXNlIGRlIG1lcmNhZG9zIGRlIGHDp8O1ZXMgdXNhbmRvIFInDQogIHR5cGU6IGJvb2sNCiAgdXJsOiBodHRwczovL3JwdWJzLmNvbS9oZW5yaWt1bi8yNTYxMjggIA0KLSBhdXRob3I6DQogIC0gZmFtaWx5OiBXb29sZHJpZGdlDQogICAgZ2l2ZW46IEplZmZyZXkgTQ0KICBpZDogd29vbGRyaWRnZTIwMTVpbnRyb2R1Y3RvcnkNCiAgaXNzdWVkOg0KICAgIHllYXI6IDIwMTUNCiAgcHVibGlzaGVyOiBOZWxzb24gRWR1Y2F0aW9uDQogIHRpdGxlOiBJbnRyb2R1Y3RvcnkgZWNvbm9tZXRyaWNzIC0gQSBtb2Rlcm4gYXBwcm9hY2gNCiAgdHlwZTogYm9vaw0KLSBhdXRob3I6DQogIC0gZmFtaWx5OiBUc2F5DQogICAgZ2l2ZW46IFJ1ZXkgUw0KICBpZDogdHNheTIwMTRpbnRyb2R1Y3Rpb24NCiAgaXNzdWVkOg0KICAgIHllYXI6IDIwMTQNCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5ICYgU29ucw0KICB0aXRsZTogQW4gaW50cm9kdWN0aW9uIHRvIGFuYWx5c2lzIG9mIGZpbmFuY2lhbCBkYXRhIHdpdGggUg0KICB0eXBlOiBib29rDQotIGF1dGhvcjoNCiAgLSBmYW1pbHk6IEdyZWVuZQ0KICAgIGdpdmVuOiBXaWxsaWFtIEguIA0KICBpZDogZ3JlZW5lMjAxMg0KICBpc3N1ZWQ6ICAgDQogICAgeWVhcjogMjAxMg0KICBwdWJsaXNoZXI6IFByZW50aWNlIEhhbGwvUGVhcnNvbiBFZHVjYXRpb24NCiAgdGl0bGU6IEVjb25vbWV0cmljIGFuYWx5c2lzDQogIHR5cGU6IGJvb2sgIA0KZ3JhcGhpY3M6IHllcw0KLS0tDQpgYGB7ciBjb21tZW50ID0gTkEsIHJlc3VsdHMgPSAnYXNpcycsIGVjaG8gPSBGfQ0KYWRkX2Rvd25sb2FkX2xpbmsgPSBmdW5jdGlvbihmaWxlKXsNCiAgY2F0KHNwcmludGYoIjxhIGhyZWY9JyVzJyB0YXJnZXQ9J19ibGFuaycgZG93bmxvYWQ9J215bmIuUm1kJz4NCiAgIDxzcGFuIGNsYXNzPSdnbHlwaGljb24gZ2x5cGhpY29uLWNsb3VkLWRvd25sb2FkJyBzdHlsZT0nZm9udC1zaXplOjEuMmVtOyc+PC9zcGFuPiBEb3dubG9hZA0KICA8L2E+IiwNCiAgIGJhc2U2NGVuYzo6ZGF0YVVSSShmaWxlID0gZmlsZSwgbWltZSA9ICd0ZXh0L3JtZCcpICAgICAgICANCiAgKSkNCn0NCmFkZF9kb3dubG9hZF9saW5rKCJhY29lc19jb21fUi5SbWQiKQ0KYGBgDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPVRSVUUsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQoNCkxpY2Vuw6dhIHstI0xpY2Vuw6dhfQ0KPT09PT09PT09PT09PT09PT09PQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXsgd2lkdGg9MjUlIH0NCg0KQ2l0YcOnw6NvIHstI0NpdGHDp8Ojb30NCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286DQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIFTDs3BpY29zIGRlIGVjb25vbWV0cmlhOiBhw6fDtWVzLiBDYW1wbyBHcmFuZGUtTVMsQnJhc2lsOiBSU3R1ZGlvL1JwdWJzLCAyMDE5LiBEaXNwb27DrXZlbCBlbSA8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvYWNvZXNCT1ZfVkFMRTM+LiANCg0KDQpJbnRyb2R1w6fDo28NCj09PT09PT09PT09PT09PT09PT09PT0NCg0KSW5pY2lhbG1lbnRlLCBhZ3JhZGXDp28gYSBzdWdlc3TDo28gZGUgbGVpdG9yZXMgcXVlIHBlcm1pdGVtIGFzIG1lbGhvcmlhcyBkYXMgcG9zdGFnZW5zLg0KU3VnaXJvIHF1ZSBiYWl4ZW0gYWxndW5zIHBhY290ZXMgcXVlIHNlcsOjbyBuZWNlc3PDoXJpb3M6DQoNCmBgYA0KaW5zdGFsbC5wYWNrYWdlcygicXVhbnRtb2QiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQppbnN0YWxsLnBhY2thZ2VzKCJzY2FsZXMiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2d0aGVtZXMiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXF1YW50IikNCmluc3RhbGwucGFja2FnZXMoInJibWZib3Zlc3BhIikNCmluc3RhbGwucGFja2FnZXMoInh0cyIpDQpgYGANCg0KRGFkb3MgZSBncsOhZmljbw0KPT09PT09PT09PT09PT09PT09PT09PT0NCg0KRXN0YSBwcmltZWlyYSBwYXJ0ZSDDqSBiYXNlYWRhIG5hcyBwb3N0YWdlbnMgZG8gYmxvZyBBbsOhbGlzZSBNYWNyby4NCg0KYGBge3J9DQpsaWJyYXJ5KHF1YW50bW9kKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KDQplbnYgPSBuZXcuZW52KCkNCmdldFN5bWJvbHMoIlZBTEUzLlNBIixzcmM9InlhaG9vIiwgDQogICAgICAgICAgIGVudj1lbnYsDQogICAgICAgICAgIGZyb209YXMuRGF0ZSgnMjAxOS0wMS0xNCcpKQ0KdmFsZSA9IGVudiRWQUxFMy5TQVssNF0NCg0KYXV0b3Bsb3QodmFsZSkrDQogIGdlb21fbGluZShzaXplPS44LCBjb2xvdXI9J2RhcmtibHVlJykrDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICcxNSBkYXlzJywNCiAgICAgICAgICAgICAgIGxhYmVscyA9IGRhdGVfZm9ybWF0KCIlYiAlZCIpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgdmp1c3QgPSAxLjAsIGhqdXN0ID0gMS4wKSkrDQogIGxhYnModGl0bGU9J1ZBTEUzLlNBJywNCiAgICAgICBjYXB0aW9uPSdGb250ZTogYW5hbGlzZW1hY3JvLmNvbS5iciBjb20gZGFkb3MgZG8gWWFob28gRmluYW5jZS4nKSsNCiAgeGxhYignJykreWxhYignUiQnKQ0KYGBgDQoNCkFuw6FsaXNlIGRlIGHDp8O1ZXMgYnJhc2lsZWlyYXMNCj09PT09PT09PT09PT09PT09PT09PT09DQoNClBhcmEgZXN0YSBhbsOhbGlzZSwgZmFyZWkgdXNvIGRvIGBxdWFudG1vZGAgYWNpbWEgY2FycmVnYWRvLCBlIGdlcmFyZWkgbyBncsOhZmljbyB0aXBvIGBjYW5kbGVzdGlja2AgZGFzIGHDp8O1ZXMgZGEgVkFMRTMuU0EsIG1hcyBhZ29yYSBjYXJyZWdhcmVpIHVtIHBlcsOtb2RvIG1haW9yLiBDaGFtYXJlaSBhIHPDqXJpZSBpbnRlaXJhIGRpc3BvbsOtdmVsLCBlIHBlZGlyZWkgbyBjYW5kbGVzdGljayBhcGVuYXMgcGFyYSBvcyDDumx0aW1vcyA2IG1lc2VzLiBBZGljaW9uYXJlbW9zIGFzIGJhbmRhcyBkZSBCb2xsaW5nZXIsIHBhcmEgbW9zdHJhciBvcyBkZXN2aW9zIGFzc29jaWFkb3Mgw6Agc8OpcmllLg0KDQpgYGB7cn0NCmdldFN5bWJvbHMoIlZBTEUzLlNBIixzcmM9InlhaG9vIikNCmNoYXJ0X1NlcmllcyhWQUxFMy5TQSkNCiMgcmVzdW1pcmVpIHBhcmEgb3Mgw7psdGltb3MgNiBtZXNlcw0KY2hhcnRTZXJpZXMoVkFMRTMuU0EsIHN1YnNldD0ibGFzdCA2IG1vbnRocyIpDQojIGFkaWNpb25hbmRvIGFzIEJvbGxpbmdlciBCYW5kcw0KYWRkQkJhbmRzKCkNCmBgYA0KDQpEYWRvcyBkYSBCb2xzYSBkZSBTw6NvIFBhdWxvIChCMykNCj09PT09PT09PT09PT09PT09PT09PT09DQoNCkFnb3JhIGZhcmVpIGV4ZW1wbG9zIHB1eGFuZG8gZGFkb3MgZGEgQm9sc2EgZGUgU8OjbyBQYXVsbywgQjMsIGFudGlnYSBCb3Zlc3BhLiBPIHJlcG9zaXTDs3JpbyBhbnRpZ28gZGUgZGFkb3MgaGlzdMOzcmljb3MgZGEgQm9sc2EgZXN0w6EgZW0gPGh0dHA6Ly93d3cuYm1mYm92ZXNwYS5jb20uYnIvcHRfYnIvc2Vydmljb3MvbWFya2V0LWRhdGEvaGlzdG9yaWNvL21lcmNhZG8tYS12aXN0YS9zZXJpZXMtaGlzdG9yaWNhcy8+IGUgcG9kZS1zZSB1c2FyIG8gcGFjb3RlIGByYm1mYm92ZXNwYWAuIE8gc2l0ZSBhdHVhbCBkYSBCMyDDqSA8aHR0cDovL3d3dy5iMy5jb20uYnIvcHRfYnIvbWFya2V0LWRhdGEtZS1pbmRpY2VzL3NlcnZpY29zLWRlLWRhZG9zL21hcmtldC1kYXRhL2hpc3Rvcmljby9tZXJjYWRvLWEtdmlzdGEvc2VyaWVzLWhpc3RvcmljYXMvPi4gTyB1c3XDoXJpbyBwb2RlIG9idGVyIHbDoXJpYXMgc8OpcmllcyBkaXJldGFtZW50ZSBkbyBwYWNvdGUgYHF1YW50bW9kYCBzZSBkZXNlamFyLg0KDQpOZXN0ZSBleGVtcGxvLCBiYWl4ZWkgbyBhcnF1aXZvIGRlIGRhZG9zIGRpw6FyaW9zIGRvIGFubyBkZSAyMDE5LCBxdWUgdmVtIGVtIGZvcm1hdG8gY29tcGFjdGFkbyBlIGV4dHJhaSBwYXJhIG8gZGlyZXTDs3JpbyBkbyBwcm9qZXRvLiBFc3RlIGFycXVpdm8gdGVtIG8gbm9tZSBgQ09UQUhJU1RfQTIwMTkuVFhUYC4NCg0KQWdvcmEgYWRhcHRhcmVpIGEgcm90aW5hIGRlIEhlbnJpcXVlIENlc8OhciBDb3N0YSAoPGh0dHBzOi8vcnB1YnMuY29tL2hlbnJpa3VuLzI1NjEyOD4pIHBhcmEgY2FycmVnYXIgb3MgZGFkb3MuDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkocmJtZmJvdmVzcGEpDQpsaWJyYXJ5KHh0cykNCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRpZHlxdWFudCkNCmxpYnJhcnkoZ2dwbG90MikNCmNoXzIwMTkgPC0gcmVhZF9tYXJrZXRkYXRhKCdDT1RBSElTVF9BMjAxOS5UWFQnLCAnQ09UQUhJU1QnKQ0KYGBgDQoNCk8gb2JqZXRvIGNoXzIwMTkgcXVlIGNhcnJlZ291IG8gJ0NPVEFISVNUJywgcG9zc3VpIHRyw6pzIHBhcnRlcyAoaGVhZGVyLCBjb3Rhw6fDtWVzIGUgdHJhaWxlcikuIEEgcGFydGUgZGFzIGNvdGHDp8O1ZXMgdGVtIDI2IGNvbHVuYXMsIG9uZGUgdMOqbS1zZSBvcyBkYWRvcyBkZSB0b2RvcyBvcyBwYXDDqWlzLW1lcmNhZG8uIFBvZGUtc2UgdmlzdWFsaXphciBhIHBhcnRlIGRhcyBgQ290YcOnw7VlcyBoaXN0w7NyaWNhcyBwb3IgcGFwZWwtbWVyY2Fkb2AgZmF6ZW5kbyBvIGPDs2RpZ28gYWJhaXhvIChhcXVpIG7Do28gcmVwcm9kdXppZG8gcG9yIHF1ZXN0w7VlcyBkZSBlc3Bhw6dvKS4NCg0KYGBgDQpWaWV3KGNoXzIwMTkkYENvdGHDp8O1ZXMgaGlzdMOzcmljYXMgcG9yIHBhcGVsLW1lcmNhZG9gKQ0KYGBgDQpQb3IgZXhlbXBsbywgYXMgw7psdGltYXMgbGluaGFzIGRhcyBzZWlzIHByaW1laXJhcyBjb2x1bmFzIHNlcsOhOg0KDQpgYGB7cn0NCmtuaXRyOjprYWJsZSh0YWlsLm1hdHJpeChjaF8yMDE5JGBDb3Rhw6fDtWVzIGhpc3TDs3JpY2FzIHBvciBwYXBlbC1tZXJjYWRvYFssMTo2XSkpDQpgYGANCg0KQ29tbyBpbmRpY2FkbyBuYSBwb3N0YWdlbSBkZSBDb3N0YSAoMjAxNyksICJQYXJhIGNvbmhlY2VyIGFzIHZhcmnDoXZlaXMgZG9zIGRhdGFzZXRzIGNyaWFkb3MgY29tIGByYm1mYm92ZXNwYWAsIGV4ZWN1dGUgbyBgYWRkaW5gIGRvIFJTdHVkaW8gYHJibWZib3Zlc3BhIFZpZXcgVGVtcGxhdGVgLiBTZWxlY2lvbmUgdW0gdGVtcGxhdGUgcGFyYSB2aXN1YWxpemFyIHRvZGFzIGFzIGNvbHVuYXMgdHJhdGFkYXMgcGVsbyBkYXRhc2V0IGNvbSBpbmZvcm1hw6fDo28gZGUgdGlwbyBlIGRlc2NyacOnw6NvLiBTZWxlY2lvbmUgbyB0ZW1wbGF0ZSAgYENPVEFISVNUYCBlIGRlcG9pcyBmZWNoZSBhIGphbmVsYSBkZSB0ZW1wbGF0ZXMuIiAgIA0KDQpObyBjYXNvLCBDb3N0YSAoMjAxNykgaW5kaWNvdSBvIGPDs2RpZ28gQk9WQTExLCBtYXMgc2UgcXVpc2VyLCBwb3IgZXhlbXBsbywgYSBWQUxFMywgaW5kaWNhcmVtb3MgYWRlcXVhZGFtZW50ZS4gVmVyIGEgc2VndW5kYSBjYWl4YSBkZSBzY3JpcHQuIA0KDQoNCmBgYHtyfQ0KQk9WQTExLmRmIDwtIGNoXzIwMTlbWzJdXSAlPiUgZmlsdGVyKGNvZF9uZWdvY2lhY2FvID09ICdCT1ZBMTEnKSAlPiUNCiAgc2VsZWN0KA0KICAgIERhdGUgPSBkYXRhX3JlZmVyZW5jaWEsDQogICAgT3BlbiA9IHByZWNvX2FiZXJ0dXJhLA0KICAgIEhpZ2ggPSBwcmVjb19tYXgsDQogICAgTG93ID0gcHJlY29fbWluLA0KICAgIENsb3NlID0gcHJlY29fdWx0LA0KICAgIFZvbHVtZSA9IHZvbHVtZV90aXR1bG9zX25lZ29jaWFkb3MNCiAgKQ0KDQpCT1ZBMTEgPC0gYXMueHRzKHNlbGVjdChCT1ZBMTEuZGYsIC1EYXRlKSwgb3JkZXIuYnkgPSBCT1ZBMTEuZGYkRGF0ZSkNCmBgYA0KDQpQYXJhIGBWQUxFM2AsIHBhcmEgbyBwYXBlbCBkYSBlbXByZXNhIFZBTEUsIGVzcGVjaWZpY2HDp8OjbyBPTiBOTSAoc2VtcHJlIGF0ZW50YW5kbyBwYXJhIG8gZm9ybWF0byBkZSBsZXRyYXMgbWFpw7pzY3VsYXMpOg0KDQpgYGB7cn0NClZBTEUzLmRmIDwtIGNoXzIwMTlbWzJdXSAlPiUgZmlsdGVyKGNvZF9uZWdvY2lhY2FvID09ICdWQUxFMycpICU+JQ0KICBzZWxlY3QoDQogICAgRGF0ZSA9IGRhdGFfcmVmZXJlbmNpYSwNCiAgICBPcGVuID0gcHJlY29fYWJlcnR1cmEsDQogICAgSGlnaCA9IHByZWNvX21heCwNCiAgICBMb3cgPSBwcmVjb19taW4sDQogICAgQ2xvc2UgPSBwcmVjb191bHQsDQogICAgVm9sdW1lID0gdm9sdW1lX3RpdHVsb3NfbmVnb2NpYWRvcw0KICApDQoNClZBTEUzIDwtIGFzLnh0cyhzZWxlY3QoVkFMRTMuZGYsIC1EYXRlKSwgb3JkZXIuYnkgPSBWQUxFMy5kZiREYXRlKQ0KYGBgDQoNCkFnb3JhIHV0aWxpemFyZW1vcyBvIG9iamV0byBkZSBzw6lyaWVzIHRlbXBvcmFpcyAoeHRzKSBwYXJhIGV4ZWN1dGFyIGEgZnVuw6fDo28gYHF1YW50bW9kOjpjYW5kbGVDaGFydGAgZSBjcmlhciBvcyBncsOhZmljb3MgZGUgY2FuZGxlLg0KDQpgYGB7cn0NCmNhbmRsZUNoYXJ0KEJPVkExMSkNCmFkZEJCYW5kcygpDQpjYW5kbGVDaGFydChWQUxFMykNCmFkZEJCYW5kcygpDQpgYGANCg0KUGFyYSBhbHRlcmFyIG9zIHBhZHLDtWVzIGRlIGNvcmVzLCBwb2RlLXNlIHV0aWxpemFyIGNvbW8gYWJhaXhvLCBjb25mb3JtZSBzdWdlcmlkbyBwb3IgQ09TVEEgKDIwMTcpOg0KDQpgYGB7cn0NCmNhbmRsZUNoYXJ0KFZBTEUzLCB0aGVtZT0nd2hpdGUnKQ0KYWRkQkJhbmRzKCkNCmNoYXJ0X1NlcmllcyhWQUxFMykNCmBgYA0KDQpBZ29yYSBvdXRyYSBvcMOnw6NvIGZhemVuZG8gbyBjYW5kbGUgcGVsbyBwYWNvdGUgYGdncGxvdDJgOg0KDQpgYGB7cn0NCmdncGxvdChWQUxFMy5kZiwgYWVzKHggPSBEYXRlLCB5ID0gQ2xvc2UpKSArDQogIGdlb21fY2FuZGxlc3RpY2soYWVzKG9wZW4gPSBPcGVuLCBjbG9zZSA9IENsb3NlLCBoaWdoID0gSGlnaCwgbG93ID0gTG93KSkNCmBgYA0KDQpDb21vIGlsdXN0cmFkbyBwb3IgQ29zdGEgKDIwMTcpLCBubyBwYWNvdGUgYHRpZHlxdWFudGAgdMOqbS1zZSBmdW7Dp8O1ZXMgYXV4aWxpYXJlcyBhbyAgYHF1YW50bW9kYCwgcGFyYSBpbmNsdWlyIG1lZGlkYXMgZGUgYW7DoWxpc2UgdMOpY25pY2EgKGNvbW8gYSAgbcOpZGlhIG3Ds3ZlbCkgbm9zIGdyw6FmaWNvcyBkbyAgZ2dwbG90Mi4gRXNwZWNpZmlxdWVpIHVtIHJhbmdlIHBlcXVlbm8gKG49MTAgZGlhcyksIHBvaXMgYSBzw6lyaWUgw6kgY3VydGEuDQoNCmBgYHtyfQ0KZ2dwbG90KFZBTEUzLmRmLCBhZXMoeCA9IERhdGUsIHkgPSBDbG9zZSkpICsNCiAgZ2VvbV9jYW5kbGVzdGljayhhZXMob3BlbiA9IE9wZW4sIGNsb3NlID0gQ2xvc2UsIGhpZ2ggPSBIaWdoLCBsb3cgPSBMb3cpKSArDQogIGdlb21fbWEobWFfZnVuID0gU01BLCBuID0gMTAsIGNvbG9yID0gInJlZCIsIGxpbmV0eXBlID0gNCwgc2l6ZSA9IDEpDQpgYGANCg0KDQpSZWZlcsOqbmNpYXMgey0jUmVmZXLDqm5jaWFzfQ0KPT09PT09PT09PT09PT09PT09PT09PT0=