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. Séries
Temporais com R: Análise do Consumo do Varejo em MS. Campo
Grande-MS,Brasil: RStudio/Rpubs, 2019. Disponível em http://rpubs.com/amrofi/arima_varejoms.
Introdução
Neste arquivo utilizo a série do Índice de volume de vendas no varejo
Total de Mato Grosso do Sul, série mensal a partir de jan/2000 até
jul/2019 obtida com o pacote BETS
e importada do Banco
Central do Brasil. Portanto, são 235 observações mensais.
Conforme Hyndman e Athanasopoulos (2018), se combinarmos a
diferenciação com autoregressão e um modelo de média móvel, obteremos um
modelo ARIMA não sazonal. ARIMA é um acrônimo para Média Móvel Integrada
AutoRegressiva (neste contexto, “integração” é o inverso da
diferenciação). O modelo completo pode ser escrito como \[
\begin{equation}
y'_{t} = c + \phi_{1}y'_{t-1} + \cdots + \phi_{p}y'_{t-p}
+ \theta_{1}\varepsilon_{t-1} + \cdots +
\theta_{q}\varepsilon_{t-q} + \varepsilon_{t}, \tag{1.1}
\end{equation}
\]
onde \(y'_{t}\) é a série
diferenciada (pode ter sido diferenciada mais de uma vez). Os
“preditores” no lado direito incluem valores defasados de \(y'_{t}\) assim como erros defasados.
Chamamos isso de modelo ARIMA(p,d,q), em que p é a ordem da parte
autoregressiva (AR(p)); d é a ordem de diferenciação envolvida (I(d)); q
é a ordem da parte da média móvel (MA(q)).
Dados
Farei de duas formas para o leitor. Uma carrega direto do site do
Banco Central do Brasil com o pacote BETS
(FERREIRA,
SPERANZA e COSTA, 2018) e a outra eu gerei a estrutura idêntica pela
função dput()
para os leitores que não conseguirem por
qualquer motivo o acesso ao site do Banco Central (as vezes vejo isso
ocorrer dependendo dos bloqueios da sua rede de internet). A forma pelo
dput assume o nome varejoms2 enquanto a extraída pelo BETS tem nome
varejoms. Esclareço ao leitor que após baixar a série pelo BETS, fiz o
dput e a partir de então, desabilitei o bloco (Chunk
) que
acessa o BETS apenas para agilizar os cálculos.
library(BETS)
# Pegando as séries a partir do site do Banco Central do Brasil
# Índice de volume de vendas no varejo Total de Mato Grosso do Sul
# mensal a partir de jan/2000 até jul/2019
# 235 observações mensais
varejoms <- BETSget(1479)
print(varejoms)
class(varejoms)
dput(varejoms) # opção para ter os dados como na structure abaixo
suppressMessages(library(readxl))
suppressMessages(library(foreign))
suppressMessages(library(dynlm))
suppressMessages(library(car))
suppressMessages(library(lmtest))
suppressMessages(library(sandwich))
suppressMessages(library(fpp2))
suppressMessages(library(tseries))
suppressMessages(library(zoo))
suppressMessages(library(forecast))
suppressMessages(library(ggplot2))
# Pegando as séries a partir do site do Banco Central do Brasil Índice de
# volume de vendas no varejo Total de Mato Grosso do Sul mensal a partir de
# jan/2000 até jul/2019 Loading the dataset library(readxl) dados <-
# read_excel('dados.xlsx',sheet = 'dados') attach(dados)
library(BETS)
# Pegando as séries a partir do site do Banco Central do Brasil Índice de
# volume de vendas no varejo Total de Mato Grosso do Sul mensal a partir de
# jan/2000 até jul/2019 (em 12.09.2019)
# varejoms <- BETSget(1479)
varejoms <- structure(c(35.2, 35.6, 39.2, 40.5, 41.6, 40.4, 40.8, 38.7, 37.3, 37.6,
35.6, 47.4, 34.2, 32.2, 38, 37.5, 38.8, 35, 38.4, 40.2, 38.2, 39.3, 36, 46.3,
36.4, 34, 39, 37.8, 38.9, 35.3, 37.2, 38.1, 35.6, 38.3, 35.6, 45.7, 32.2, 31.6,
35.2, 36.8, 37.5, 34.8, 38.4, 38.1, 37, 39, 37.3, 49, 35.8, 35.3, 40.2, 41.3,
43.9, 41.6, 45.9, 42.3, 42.2, 44, 41.3, 56.9, 38.5, 38.5, 45.3, 43.6, 46.2, 44.3,
47.5, 46.5, 46.4, 46, 44.1, 61, 42, 40.2, 44.6, 44.5, 47.8, 45.3, 46.5, 48.5,
47.7, 50.2, 49.3, 64.5, 47, 46.8, 51, 50.5, 55, 51.3, 52.8, 55.3, 54.8, 55.6,
55.3, 72.2, 54.5, 52.1, 56.2, 57.2, 60.8, 56.1, 61.8, 61.6, 59.8, 63.3, 57.7,
77.4, 61.4, 51.9, 57.3, 57.9, 61.9, 57.3, 61.1, 61.1, 60.6, 65.6, 63.5, 83.1,
64.1, 60.2, 67.8, 67.1, 72.8, 68.5, 71.1, 69.3, 69.9, 71.1, 67.9, 92.7, 67.5,
64.8, 69.1, 69.4, 79.6, 70.2, 73.8, 72.5, 71.3, 75.6, 74.7, 100.8, 79.5, 75.7,
82.4, 78, 84.8, 83.2, 84.8, 88.5, 86.3, 91.7, 92.8, 111.4, 92.8, 83.7, 92.5,
88.3, 93.9, 88.8, 96, 95.9, 93.2, 98.3, 100.5, 128.8, 97.2, 90.2, 94.3, 94.4,
101.1, 92, 96.4, 98.2, 97.6, 105.8, 103.1, 129.6, 99.6, 87.8, 97, 94.8, 98.6,
93.4, 98.4, 96.4, 92.5, 100.6, 97.2, 124.5, 91.5, 85.1, 91.6, 88.5, 92.2, 87.4,
90.5, 88.1, 85.2, 89.4, 93.4, 116.9, 90.8, 84, 89.7, 86.3, 90, 87.3, 90.8, 93.5,
93.7, 91.4, 93.5, 114.1, 87.8, 81.1, 94.5, 83.2, 89.9, 88.8, 89.3, 93.7, 93.5,
96.3, 101.3, 118.3, 93.8, 85.2, 90, 86.6, 90, 85.2, 90.9), .Tsp = c(2000, 2019.5,
12), class = "ts")
A rotina de dados obtidos pelo BETS já retorna a série em formato
ts
, ou seja, série temporal. Farei então a criação de uma
série em diferenças para observar o comportamento da série em nível e em
diferenças.
Inicialmente olharei as estatísticas descritivas da série. Em seguida
farei um plot básico da série e o plot pelo pacote
dygraphs
, útil para ver os pontos de picos e momentos
específicos.
dvarejo <- diff(varejoms)
# estatisticas basicas
summary(varejoms)
Min. 1st Qu. Median Mean 3rd Qu. Max.
31.60 44.05 64.50 67.28 90.00 129.60
# Min. 1st Qu. Median Mean 3rd Qu. Max. 31.60 44.05 64.50 67.28 90.00 129.60
# plot basico lembrar que em class(), ele já indicou que era ts = serie
# temporal
plot(varejoms)

# pelo pacote dygraph dá mais opções
library(dygraphs)
library(htmlwidgets)
dygraph(varejoms, main = "Índice de volume de vendas no varejo total de Mato Grosso do Sul <br> (Mensal) (2011=100) BCB 1479") %>%
dyAxis("x", drawGrid = TRUE) %>%
dyEvent("2005-1-01", "2005", labelLoc = "bottom") %>%
dyEvent("2015-1-01", "2015", labelLoc = "bottom") %>%
dyEvent("2018-1-01", "2018", labelLoc = "bottom") %>%
dyEvent("2019-1-01", "2019", labelLoc = "bottom") %>%
dyOptions(drawPoints = TRUE, pointSize = 2)
É possivel visualizar nos plots acima: sazonalidade (por exemplo,
picos em dezembro de cada ano); a tendência aparentemente crescente até
2014 e decresce com a “crise” brasileira; e uma aparente
não-estacionariedade (média e variância mudam no tempo). Mais a frente,
aplicarei o teste de raiz unitária na série para avaliar a
estacionariedade de modo mais explícito.
Análise da série
Uma ressalva deve ser feita, que no presente exercício, não farei a
divisão entre amostra teste e amostra treino, de modo que usarei a série
toda para os ajustes. O leitor deve em geral fazer estas divisões para
certificar de que o modelo é um bom preditor.
Geralmente, não é possível dizer olhando o gráfico de tempo, quais
valores de lags p e q serão apropriados para os dados. Às vezes, é
possível usar o gráfico ACF e o gráfico PACF para determinar valores
apropriados para p e q. A primeira análise indica olhar os gráficos
(correlogramas) da Função de Autocorrelação (FAC, em português, ou ACF
em inglês) e Autocorrelação parcial (FACp, em português, ou PACF em
inglês).
um gráfico FAC mostra as autocorrelações que medem a relação
entre
\(y_t\) e \(y_{t-k}\) para diferentes valores de k.
Agora, se \(y_t\) e \(y_{t-1}\) estão correlacionados, então
\(y_{t}\) e \(y_{t-2}\) também deve ser correlacionado.
Mas isso pode ser porque ambos estão correlacionados com \(y_{t-1}\). Para evitar essas
“interferências” é que se faz a FACp. As autocorrelações parciais na
FACp medem a relação entre \(y_t\) e
\(y_{t-k}\) depois de remover os
efeitos dos lags 1, 2, 3, … , (k-1). Portanto, a primeira autocorrelação
parcial é idêntica à primeira autocorrelação, porque não há nada entre
elas para remover. Cada autocorrelação parcial pode ser estimada como o
último coeficiente em um modelo autoregressivo. Isto pode ser obtido com
as funções acf
e pacf
, ou usando as funções
ggAcf
e ggPacf
do pacote
forecast
. Faremos o mesmo procedimento para a série em
nível e para a série em primeira diferença.
Função de
Autocorrelação (FAC) e Autocorrelação parcial (FACp) com defasagem
36
Série em nível
Usarei a rotina do Hyndman e Athanasopoulos (2018).
require(forecast)
varejo <- varejoms
varejo %>%
ggtsdisplay(main = "")

Neste caso, o ggtsdisplay
do pacote
forecast
já retorna os gráficos da série, e respectivas ACF
e PACF.
Série em primeira
diferença
Como a série apresenta variações sazonais importantes, assim como
tendência importante, claramente não-estacionárias, vou olhar também em
primeira diferença.
varejo %>%
diff() %>%
ggtsdisplay(main = "Série varejo de MS em primeira diferença")

Primeira diferença
sazonal e ACF e PACF
Farei agora a diferença sazonal.
varejo %>%
diff(lag = 12) %>%
ggtsdisplay(main = "Série varejo de MS em primeira diferença sazonal")

Ajuste sazonal e
ACF e PACF
Aplicaremos o ajuste sazonal tipo STL (Seasonal Decomposition of Time
Series by Loess) aos dados.
library(fpp2)
varejo %>%
stl(s.window = "periodic") %>%
seasadj() -> varejoadj
autoplot(varejoadj)

E agora os plots de ACF e PACF na série ajustada sazonalmente.
varejoadj %>%
diff() %>%
ggtsdisplay(main = "Série varejo de MS em primeira diferença e ajuste sazonal")

Parece indicar para algum AR de ordem 4 na PACF, alguma sazonalidade
marcante na ACF (indicando um termo SMA), e indicacao de um ARIMA
(4,1,1)(0,1,1)[12].
Uma estimação inicial desse modelo daria algo como
(fit <- Arima(varejoadj, order = c(4, 1, 1), seasonal = c(0, 1, 1)))
Series: varejoadj
ARIMA(4,1,1)(0,1,1)[12]
Coefficients:
ar1 ar2 ar3 ar4 ma1 sma1
-0.6053 -0.2438 -0.0731 -0.1830 0.1582 -0.4622
s.e. 0.3095 0.1571 0.0871 0.0689 0.3134 0.0621
sigma^2 = 6.179: log likelihood = -515.75
AIC=1045.51 AICc=1046.03 BIC=1069.33
É possível observar os AICc = 1046.03, suspeitar da não significância
de ar3 e olhar os resíduos. A função autoplot
retorna o
círculo unitário e as raízes unitárias desta estimação, enquanto a
checkresiduals
fornece os correlogramas residuais.
O círculo unitário indica estabilidade das raízes unitárias do
modelo, enquanto o Ljung-Box retorna a não-rejeição de H0 de que os
parâmetros de autocorrelação residual são nulos (retorna um grande valor
p, sugerindo também que os resíduos são ruído branco). O gráfico ACF dos
resíduos do modelo ARIMA (4,1,1)(0,1,1)[12] mostra que todas as
autocorrelações estão dentro dos limites à exceção de um lag 23,
indicando que os resíduos estão se comportando como ruído branco.
autoplot(fit)

checkresiduals(fit)

Ljung-Box test
data: Residuals from ARIMA(4,1,1)(0,1,1)[12]
Q* = 13.198, df = 18, p-value = 0.7797
Model df: 6. Total lags used: 24
library(FitAR) # pratico para plotar graficos de Q
# LBQPlot(res, lag.max = 30) res é a série que temos interesse de realizar os
# testes lag.max é o número de lags que se deseja imprimir o gráfico
LBQPlot(residuals(fit), 36)

# Alternativa pelo LSTS
library(LSTS)
p <- Box.Ljung.Test(residuals(fit), lag = 36, main = "LSTS Ljung-Box test")
p + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

Checando a normalidade dos resíduos.
# checar normalidade dos resíduos
library(tseries)
jarque.bera.test(residuals(fit))
Jarque Bera Test
data: residuals(fit)
X-squared = 8.5422, df = 2, p-value = 0.01397
ARIMA
Uma estimação automatizada pela função auto.arima
{forecast} padrão indica um modelo diferente.
fit2 <- auto.arima(varejo)
summary(fit2)
Series: varejo
ARIMA(0,1,1)(0,1,1)[12]
Coefficients:
ma1 sma1
-0.4558 -0.4691
s.e. 0.0592 0.0617
sigma^2 = 6.312: log likelihood = -520.11
AIC=1046.23 AICc=1046.34 BIC=1056.44
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set 0.01107351 2.430819 1.79931 0.02282225 2.64575 0.3926471
ACF1
Training set -0.01460341
# p-values dos coeficientes
pvalues <- (1 - pnorm(abs(fit2$coef)/sqrt(diag(fit2$var.coef)))) * 2
pvalues
ma1 sma1
1.332268e-14 2.775558e-14
library(FitAR) # pratico para plotar graficos de Q
LBQPlot(residuals(fit2), 36)

# Alternativa pelo LSTS
library(LSTS)
p2 <- Box.Ljung.Test(residuals(fit2), lag = 36, main = "LSTS Ljung-Box test")
p2 + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

# checar normalidade dos resíduos
library(tseries)
jarque.bera.test(residuals(fit2))
Jarque Bera Test
data: residuals(fit2)
X-squared = 8.847, df = 2, p-value = 0.01199
Neste caso, o modelo teve a indicação de ARIMA(0,1,1)(0,1,1)[12],
diferente do anterior (ARIMA(4,1,1)(0,1,1)[12] - definido pela intuição
dos correlogramas), como reflexo do default da função admitir lags
máximos e procedimentos que restringem a otimização da função
verossimilhança. O AICc foi de 1046.34, pouco acima do anterior,
indicando ajuste inferior que o primeiro.
Modelo ARIMA automático
mais geral
A recomendação do Hyndman e Athanasopoulos (2018), nestas situações,
é fazer um modelo auto.arima
mais geral, que investigue
mais possibilidades de modelos,fazendo os argumentos da
auto.arima
da forma stepwise=FALSE
e
approximation=FALSE
. Se estiver usando a série com ajuste
sazonal (dessazonalizada), será interessante usar tambem o argumento
seasonal=FALSE
.
require(fpp2)
fit3 <- auto.arima(varejoms, stepwise = FALSE, approximation = FALSE)
summary(fit3)
Series: varejoms
ARIMA(4,1,0)(0,1,1)[12]
Coefficients:
ar1 ar2 ar3 ar4 sma1
-0.4529 -0.1741 -0.0504 -0.1874 -0.4610
s.e. 0.0662 0.0726 0.0725 0.0660 0.0618
sigma^2 = 6.158: log likelihood = -515.88
AIC=1043.75 AICc=1044.14 BIC=1064.17
Training set error measures:
ME RMSE MAE MPE MAPE MASE
Training set 0.009480306 2.384598 1.779725 0.02458176 2.619097 0.3883732
ACF1
Training set 0.004907171
# p-values dos coeficientes
pvalues <- (1 - pnorm(abs(fit3$coef)/sqrt(diag(fit3$var.coef)))) * 2
pvalues
ar1 ar2 ar3 ar4 sma1
7.652989e-12 1.642129e-02 4.869277e-01 4.524327e-03 8.726353e-14
Neste cenário, a rotina auto.arima
encontra o
ARIMA(4,1,0)(0,1,1)[12], com AICc de 1044.14, portanto, melhor (menor)
que as duas primeiras estimações. como intuido anteriormente, ele
detecta o AR(4), a Integração (I(1)), a integração sazonal e o SMA(1). O
termo ar3 não foi significativo, mas os demais foram.
Checando
resíduos
Os modelos podem ser considerados white noise, mas não normais.
checkresiduals(fit3)

Ljung-Box test
data: Residuals from ARIMA(4,1,0)(0,1,1)[12]
Q* = 13.381, df = 19, p-value = 0.8185
Model df: 5. Total lags used: 24
require(FitAR) # pratico para plotar graficos de Q
LBQPlot(residuals(fit3), 36)

# Alternativa pelo pacote LSTS
library(LSTS)
p3 <- Box.Ljung.Test(residuals(fit3), lag = 36, main = "LSTS Ljung-Box test")
p3 + ggthemes::theme_economist_white() + labs(x = "Lag = k", y = "P-valor do Teste Ljung-Box para até lag = k ",
title = "Série de consumo:", subtitle = "varejo de MS", caption = "Fonte: Elaboração própria a partir de dados do BCB.")

# checar normalidade dos resíduos
require(tseries)
jarque.bera.test(residuals(fit3))
Jarque Bera Test
data: residuals(fit3)
X-squared = 8.0982, df = 2, p-value = 0.01744
Pode-se fazer o gráfico dos forecasts deste modelo:
autoplot(forecast(fit3, h = 24), title = "Forecasts de volume de vendas no varejo total de Mato Grosso do Sul",
xlab = "Ano", ylab = "Índice (2011=100)")

Teste de raiz
unitária
O teste de raiz unitária deveria ser feito antes de rodar o ARIMA, a
fim de investigar e/ou confirmar a não-estacionariedade da série, que
foi intuida a partir da ACF e PACF. A rotina auto.arima
já
faz esse teste em seu processo. Existem diferentes testes de raiz
unitária possíveis (ADF, PP, KPSS) assim como diferentes testes para a
sazonalidade.
Teste ADF
O teste de Dickey-Fuller aumentado (ADF) é nossa primeira escolha. O
padrão é que H0: série não estacionária ou série tem raiz unitária.
ADF.test <- adf.test(varejoms)
ADF.test
Augmented Dickey-Fuller Test
data: varejoms
Dickey-Fuller = -1.7075, Lag order = 6, p-value = 0.6988
alternative hypothesis: stationary
Teste ADF
invertendo a hipótese nula
Neste caso, o padrão é que H0: a série é estacionária ou a série não
tem raiz unitária. Neste caso, a hipótese alternativa é que a série é
“explosiva”.
ADF.test12 <- adf.test(varejoms, k = 12, alternative = c("explosive"))
ADF.test12
Augmented Dickey-Fuller Test
data: varejoms
Dickey-Fuller = -1.0897, Lag order = 12, p-value = 0.07762
alternative hypothesis: explosive
ARIMA - Codigo do
Hyndman e Athanasopoulos, secao 8.1
A função ndiffs
usa um teste de raiz unitária para
determinar o número de diferenças necessárias para que séries temporais
xsejam feitas estacionárias.
Se test="kpss"
, o teste KPSS é usado com a hipótese nula
que x possui uma raiz estacionária contra uma alternativa de raiz
unitária. Em seguida, o teste retorna o menor número de diferenças
necessárias para passar no teste ao nível alpha.
Se test="adf"
, o teste ADF é utilizado e se
test="pp"
, o teste de Phillips-Perron é usado. Em ambos os
casos, a hipótese nula é que x tem uma raiz unitária contra uma
alternativa de série estacionária. Em seguida, o teste retorna o menor
número de diferenças necessárias para falhar o teste no nível alpha.
A função nsdiffs
usa testes de raiz unitária sazonal
para determinar o número de diferenças sazonais necessárias para que as
séries temporais x sejam feitas estacionárias (possivelmente com algum
diferencial de atraso também). Se test="ch"
, o teste de
Canova-Hansen (1995) é usado (com hipótese nula de sazonalidade
determinística) e se test="ocsb"
o teste de
Osborn-Chui-Smith-Birchenhall (1988) é usado (com hipótese nula de
existir uma raiz unitária sazonal).
x <- varejoms
ns <- nsdiffs(x) #numero de diferencas sazonais
ns
[1] 1
if (ns > 0) {
xstar <- diff(x, lag = frequency(x), differences = ns)
} else {
xstar <- x
}
Portanto, temos uma diferença sazonal necessária (ns=1) e a série na
diferença sazonal está armazenada em xstar.
nd <- ndiffs(xstar) # numero de diferencas
nd
[1] 1
if (nd > 0) {
xstar <- diff(xstar, differences = nd)
}
# xstar será a série devidamente em diferenças sazonais e diferenças normais
autoplot(xstar)

auto.arima(xstar) # ver que o resultado é igual, mas agora nao tem diferencas
Series: xstar
ARIMA(0,0,1)(0,0,1)[12] with zero mean
Coefficients:
ma1 sma1
-0.4558 -0.4691
s.e. 0.0592 0.0617
sigma^2 = 6.312: log likelihood = -520.11
AIC=1046.23 AICc=1046.34 BIC=1056.44
modelo <- auto.arima(xstar, stepwise = FALSE, approximation = FALSE)
summary(modelo)
Series: xstar
ARIMA(4,0,0)(0,0,1)[12] with zero mean
Coefficients:
ar1 ar2 ar3 ar4 sma1
-0.4529 -0.1741 -0.0504 -0.1874 -0.4610
s.e. 0.0662 0.0726 0.0725 0.0660 0.0618
sigma^2 = 6.158: log likelihood = -515.88
AIC=1043.75 AICc=1044.14 BIC=1064.17
Training set error measures:
ME RMSE MAE MPE MAPE MASE ACF1
Training set 0.01044227 2.453404 1.882938 -Inf Inf 0.5055836 0.004680592
autoplot(modelo)

Comentário: uma vez que a série utilizada em auto.arima
é a resultante xstar, o mmodelo não identifica a necessidade de
diferenciação nem diferenciação sazonal. Com esse procedimento, ele
encontra o ARIMA(4,0,0)(0,01)[12] para xstar que já teve as diferenças
aplicadas sobre varejoms. Da mesma forma que em fit e fit3, o modelo com
argumentos stepwise=FALSE, approximation=FALSE
retorna os
melhores ajustes.
Referências
FERREIRA, Pedro Costa; SPERANZA, Talitha; COSTA, Jonatha (2018).
BETS: Brazilian Economic Time Series. R package version 0.4.9.
Disponível em: https://CRAN.R-project.org/package=BETS.
HYNDMAN, Rob. (2018). fpp2: Data for “Forecasting: Principles and
Practice” (2nd Edition). R package version 2.3. Disponível em: https://CRAN.R-project.org/package=fpp2.
HYNDMAN, R.J., & ATHANASOPOULOS, G. (2018) Forecasting:
principles and practice, 2nd edition, OTexts: Melbourne, Australia.
Disponível em: https://otexts.com/fpp2/. Accessed on 12 Set 2019.
LS0tDQp0aXRsZTogIlPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBBbsOhbGlzZSBBUklNQSBkbyBDb25zdW1vIGRvIFZhcmVqbyBlbSBNUyINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvLCAqZS1tYWlsOiBhZHJpYW5vLmZpZ3VlaXJlZG9AdWZtcy5icioiDQpsaW5rY29sb3I6IGJsdWUNCmFic3RyYWN0OiANCiAgVGhpcyBpcyBhbiBleGVyY2lzZSBmb3IgY2xhc3MgdXNlLiBXZSBhbmFseXNlIGRhdGEgb24gUmV0YWlsIGNvbnN1bXB0aW9uLCBmcm9tIEphbnVhcnkvMjAwMCB0byBub3dhZGF5cy4gDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogbm8NCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KLS0tDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0KDQojIyBHbG9iYWwgb3B0aW9ucw0Kb3B0aW9ucyhtYXgucHJpbnQ9IjEwMCIpDQpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsDQoJICAgICAgICAgICAgIGNhY2hlPUYsDQogICAgICAgICAgICAgICBwcm9tcHQ9RkFMU0UsDQogICAgICAgICAgICAgICB0aWR5PVRSVUUsDQogICAgICAgICAgICAgICBjb21tZW50PU5BLA0KICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwNCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpDQpvcHRzX2tuaXQkc2V0KHdpZHRoPTEwMCkNCmBgYA0KDQojIExpY2Vuw6dhIHsjTGljZW7Dp2EgLnVubnVtYmVyZWR9DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpe3dpZHRoPSIyNSUifQ0KDQojIENpdGHDp8OjbyB7I0NpdGHDp8OjbyAudW5udW1iZXJlZH0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzogRklHVUVJUkVETywgQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzLiBTw6lyaWVzIFRlbXBvcmFpcyBjb20gUjogQW7DoWxpc2UgZG8gQ29uc3VtbyBkbyBWYXJlam8gZW0gTVMuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTkuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9hcmltYV92YXJlam9tcz4uDQoNCiMgSW50cm9kdcOnw6NvDQoNCk5lc3RlIGFycXVpdm8gdXRpbGl6byBhIHPDqXJpZSBkbyDDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIE1hdG8gR3Jvc3NvIGRvIFN1bCwgc8OpcmllIG1lbnNhbCBhIHBhcnRpciBkZSBqYW4vMjAwMCBhdMOpIGp1bC8yMDE5IG9idGlkYSBjb20gbyBwYWNvdGUgYEJFVFNgIGUgaW1wb3J0YWRhIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsLiBQb3J0YW50bywgc8OjbyAyMzUgb2JzZXJ2YcOnw7VlcyBtZW5zYWlzLg0KDQpDb25mb3JtZSBIeW5kbWFuIGUgQXRoYW5hc29wb3Vsb3MgKDIwMTgpLCBzZSBjb21iaW5hcm1vcyBhIGRpZmVyZW5jaWHDp8OjbyBjb20gYXV0b3JlZ3Jlc3PDo28gZSB1bSBtb2RlbG8gZGUgbcOpZGlhIG3Ds3ZlbCwgb2J0ZXJlbW9zIHVtIG1vZGVsbyBBUklNQSBuw6NvIHNhem9uYWwuIEFSSU1BIMOpIHVtIGFjcsO0bmltbyBwYXJhIE3DqWRpYSBNw7N2ZWwgSW50ZWdyYWRhIEF1dG9SZWdyZXNzaXZhIChuZXN0ZSBjb250ZXh0bywgImludGVncmHDp8OjbyIgw6kgbyBpbnZlcnNvIGRhIGRpZmVyZW5jaWHDp8OjbykuIE8gbW9kZWxvIGNvbXBsZXRvIHBvZGUgc2VyIGVzY3JpdG8gY29tbyANCiQkDQpcYmVnaW57ZXF1YXRpb259DQogIHknX3t0fSA9IGMgKyBccGhpX3sxfXknX3t0LTF9ICsgXGNkb3RzICsgXHBoaV97cH15J197dC1wfQ0KICAgICArIFx0aGV0YV97MX1cdmFyZXBzaWxvbl97dC0xfSArIFxjZG90cyArIFx0aGV0YV97cX1cdmFyZXBzaWxvbl97dC1xfSArIFx2YXJlcHNpbG9uX3t0fSwgIFx0YWd7MS4xfQ0KXGVuZHtlcXVhdGlvbn0NCiQkDQogICAgDQogICAgDQpvbmRlICR5J197dH0kIMOpIGEgc8OpcmllIGRpZmVyZW5jaWFkYSAocG9kZSB0ZXIgc2lkbyBkaWZlcmVuY2lhZGEgbWFpcyBkZSB1bWEgdmV6KS4gT3MgInByZWRpdG9yZXMiIG5vIGxhZG8gZGlyZWl0byBpbmNsdWVtIHZhbG9yZXMgZGVmYXNhZG9zIGRlICR5J197dH0kIGFzc2ltIGNvbW8gZXJyb3MgZGVmYXNhZG9zLiBDaGFtYW1vcyBpc3NvIGRlIG1vZGVsbyBBUklNQShwLGQscSksIGVtIHF1ZSBwIMOpIGEgb3JkZW0gZGEgcGFydGUgYXV0b3JlZ3Jlc3NpdmEgKEFSKHApKTsgZCDDqSBhIG9yZGVtIGRlIGRpZmVyZW5jaWHDp8OjbyBlbnZvbHZpZGEgKEkoZCkpOyBxIMOpIGEgb3JkZW0gZGEgcGFydGUgZGEgbcOpZGlhIG3Ds3ZlbCAoTUEocSkpLg0KDQojIERhZG9zDQoNCkZhcmVpIGRlIGR1YXMgZm9ybWFzIHBhcmEgbyBsZWl0b3IuIFVtYSBjYXJyZWdhIGRpcmV0byBkbyBzaXRlIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIGNvbSBvIHBhY290ZSBgQkVUU2AgKEZFUlJFSVJBLCBTUEVSQU5aQSBlIENPU1RBLCAyMDE4KSBlIGEgb3V0cmEgZXUgZ2VyZWkgYSBlc3RydXR1cmEgaWTDqm50aWNhIHBlbGEgZnVuw6fDo28gYGRwdXQoKWAgcGFyYSBvcyBsZWl0b3JlcyBxdWUgbsOjbyBjb25zZWd1aXJlbSBwb3IgcXVhbHF1ZXIgbW90aXZvIG8gYWNlc3NvIGFvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCAoYXMgdmV6ZXMgdmVqbyBpc3NvIG9jb3JyZXIgZGVwZW5kZW5kbyBkb3MgYmxvcXVlaW9zIGRhIHN1YSByZWRlIGRlIGludGVybmV0KS4gQSBmb3JtYSBwZWxvIGRwdXQgYXNzdW1lIG8gbm9tZSB2YXJlam9tczIgZW5xdWFudG8gYSBleHRyYcOtZGEgcGVsbyBCRVRTIHRlbSBub21lIHZhcmVqb21zLiBFc2NsYXJlw6dvIGFvIGxlaXRvciBxdWUgYXDDs3MgYmFpeGFyIGEgc8OpcmllIHBlbG8gQkVUUywgZml6IG8gZHB1dCBlIGEgcGFydGlyIGRlIGVudMOjbywgZGVzYWJpbGl0ZWkgbyBibG9jbyAoYENodW5rYCkgcXVlIGFjZXNzYSBvIEJFVFMgYXBlbmFzIHBhcmEgYWdpbGl6YXIgb3MgY8OhbGN1bG9zLg0KDQogICAgbGlicmFyeShCRVRTKQ0KICAgICMgUGVnYW5kbyBhcyBzw6lyaWVzIGEgcGFydGlyIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCiAgICAjIMONbmRpY2UgZGUgdm9sdW1lIGRlIHZlbmRhcyBubyB2YXJlam8gVG90YWwgZGUgTWF0byBHcm9zc28gZG8gU3VsDQogICAgIyBtZW5zYWwgYSBwYXJ0aXIgZGUgamFuLzIwMDAgYXTDqSBqdWwvMjAxOSANCiAgICAjIDIzNSBvYnNlcnZhw6fDtWVzIG1lbnNhaXMNCiAgICB2YXJlam9tcyA8LSBCRVRTZ2V0KDE0NzkpIA0KICAgIHByaW50KHZhcmVqb21zKQ0KICAgIGNsYXNzKHZhcmVqb21zKQ0KICAgIGRwdXQodmFyZWpvbXMpICAjIG9ww6fDo28gcGFyYSB0ZXIgb3MgZGFkb3MgY29tbyBuYSBzdHJ1Y3R1cmUgYWJhaXhvDQoNCiAgICANCiAgICANCmBgYHtyIGRhZG9zLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PUZBTFNFfQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KHJlYWR4bCkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShmb3JlaWduKSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShkeW5sbSkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShjYXIpKQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGxtdGVzdCkpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeShzYW5kd2ljaCkpDQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZnBwMikpO3N1cHByZXNzTWVzc2FnZXMobGlicmFyeSh0c2VyaWVzKSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeSh6b28pKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZm9yZWNhc3QpKQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGdncGxvdDIpKQ0KIyBQZWdhbmRvIGFzIHPDqXJpZXMgYSBwYXJ0aXIgZG8gc2l0ZSBkbyBCYW5jbyBDZW50cmFsIGRvIEJyYXNpbA0KIyDDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIE1hdG8gR3Jvc3NvIGRvIFN1bA0KIyBtZW5zYWwgYSBwYXJ0aXIgZGUgamFuLzIwMDAgYXTDqSBqdWwvMjAxOSANCiMgTG9hZGluZyB0aGUgZGF0YXNldA0KIyBsaWJyYXJ5KHJlYWR4bCkNCiMgZGFkb3MgPC0gcmVhZF9leGNlbCgiZGFkb3MueGxzeCIsc2hlZXQgPSAiZGFkb3MiKQ0KIyBhdHRhY2goZGFkb3MpDQpsaWJyYXJ5KEJFVFMpDQoNCiMgUGVnYW5kbyBhcyBzw6lyaWVzIGEgcGFydGlyIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCiMgw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyBUb3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwNCiMgbWVuc2FsIGEgcGFydGlyIGRlIGphbi8yMDAwIGF0w6kganVsLzIwMTkgKGVtIDEyLjA5LjIwMTkpDQoNCiN2YXJlam9tcyA8LSBCRVRTZ2V0KDE0NzkpIA0KDQp2YXJlam9tczwtIHN0cnVjdHVyZShjKDM1LjIsIDM1LjYsIDM5LjIsIDQwLjUsIDQxLjYsIDQwLjQsIDQwLjgsIDM4LjcsIDM3LjMsIA0KMzcuNiwgMzUuNiwgNDcuNCwgMzQuMiwgMzIuMiwgMzgsIDM3LjUsIDM4LjgsIDM1LCAzOC40LCA0MC4yLCANCjM4LjIsIDM5LjMsIDM2LCA0Ni4zLCAzNi40LCAzNCwgMzksIDM3LjgsIDM4LjksIDM1LjMsIDM3LjIsIDM4LjEsIA0KMzUuNiwgMzguMywgMzUuNiwgNDUuNywgMzIuMiwgMzEuNiwgMzUuMiwgMzYuOCwgMzcuNSwgMzQuOCwgMzguNCwgDQozOC4xLCAzNywgMzksIDM3LjMsIDQ5LCAzNS44LCAzNS4zLCA0MC4yLCA0MS4zLCA0My45LCA0MS42LCA0NS45LCANCjQyLjMsIDQyLjIsIDQ0LCA0MS4zLCA1Ni45LCAzOC41LCAzOC41LCA0NS4zLCA0My42LCA0Ni4yLCA0NC4zLCANCjQ3LjUsIDQ2LjUsIDQ2LjQsIDQ2LCA0NC4xLCA2MSwgNDIsIDQwLjIsIDQ0LjYsIDQ0LjUsIDQ3LjgsIDQ1LjMsIA0KNDYuNSwgNDguNSwgNDcuNywgNTAuMiwgNDkuMywgNjQuNSwgNDcsIDQ2LjgsIDUxLCA1MC41LCA1NSwgNTEuMywgDQo1Mi44LCA1NS4zLCA1NC44LCA1NS42LCA1NS4zLCA3Mi4yLCA1NC41LCA1Mi4xLCA1Ni4yLCA1Ny4yLCA2MC44LCANCjU2LjEsIDYxLjgsIDYxLjYsIDU5LjgsIDYzLjMsIDU3LjcsIDc3LjQsIDYxLjQsIDUxLjksIDU3LjMsIDU3LjksIA0KNjEuOSwgNTcuMywgNjEuMSwgNjEuMSwgNjAuNiwgNjUuNiwgNjMuNSwgODMuMSwgNjQuMSwgNjAuMiwgNjcuOCwgDQo2Ny4xLCA3Mi44LCA2OC41LCA3MS4xLCA2OS4zLCA2OS45LCA3MS4xLCA2Ny45LCA5Mi43LCA2Ny41LCA2NC44LCANCjY5LjEsIDY5LjQsIDc5LjYsIDcwLjIsIDczLjgsIDcyLjUsIDcxLjMsIDc1LjYsIDc0LjcsIDEwMC44LCANCjc5LjUsIDc1LjcsIDgyLjQsIDc4LCA4NC44LCA4My4yLCA4NC44LCA4OC41LCA4Ni4zLCA5MS43LCA5Mi44LCANCjExMS40LCA5Mi44LCA4My43LCA5Mi41LCA4OC4zLCA5My45LCA4OC44LCA5NiwgOTUuOSwgOTMuMiwgOTguMywgDQoxMDAuNSwgMTI4LjgsIDk3LjIsIDkwLjIsIDk0LjMsIDk0LjQsIDEwMS4xLCA5MiwgOTYuNCwgOTguMiwgDQo5Ny42LCAxMDUuOCwgMTAzLjEsIDEyOS42LCA5OS42LCA4Ny44LCA5NywgOTQuOCwgOTguNiwgOTMuNCwgDQo5OC40LCA5Ni40LCA5Mi41LCAxMDAuNiwgOTcuMiwgMTI0LjUsIDkxLjUsIDg1LjEsIDkxLjYsIDg4LjUsIA0KOTIuMiwgODcuNCwgOTAuNSwgODguMSwgODUuMiwgODkuNCwgOTMuNCwgMTE2LjksIDkwLjgsIDg0LCA4OS43LCANCjg2LjMsIDkwLCA4Ny4zLCA5MC44LCA5My41LCA5My43LCA5MS40LCA5My41LCAxMTQuMSwgODcuOCwgODEuMSwgDQo5NC41LCA4My4yLCA4OS45LCA4OC44LCA4OS4zLCA5My43LCA5My41LCA5Ni4zLCAxMDEuMywgMTE4LjMsIA0KOTMuOCwgODUuMiwgOTAsIDg2LjYsIDkwLCA4NS4yLCA5MC45KSwgLlRzcCA9IGMoMjAwMCwgMjAxOS41LCANCjEyKSwgY2xhc3MgPSAidHMiKQ0KDQpgYGANCg0KQSByb3RpbmEgZGUgZGFkb3Mgb2J0aWRvcyBwZWxvIEJFVFMgasOhIHJldG9ybmEgYSBzw6lyaWUgZW0gZm9ybWF0byBgdHNgLCBvdSBzZWphLCBzw6lyaWUgdGVtcG9yYWwuIEZhcmVpIGVudMOjbyBhIGNyaWHDp8OjbyBkZSB1bWEgc8OpcmllIGVtIGRpZmVyZW7Dp2FzIHBhcmEgb2JzZXJ2YXIgbyBjb21wb3J0YW1lbnRvIGRhIHPDqXJpZSBlbSBuw612ZWwgZSBlbSBkaWZlcmVuw6dhcy4NCg0KSW5pY2lhbG1lbnRlIG9saGFyZWkgYXMgZXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcyBkYSBzw6lyaWUuIEVtIHNlZ3VpZGEgZmFyZWkgdW0gcGxvdCBiw6FzaWNvIGRhIHPDqXJpZSBlIG8gcGxvdCBwZWxvIHBhY290ZSBgZHlncmFwaHNgLCDDunRpbCBwYXJhIHZlciBvcyBwb250b3MgZGUgcGljb3MgZSBtb21lbnRvcyBlc3BlY8OtZmljb3MuDQoNCmBgYHtyIGRpZmZ9DQpkdmFyZWpvPC1kaWZmKHZhcmVqb21zKQ0KIyBlc3RhdGlzdGljYXMgYmFzaWNhcw0Kc3VtbWFyeSh2YXJlam9tcykNCiMgTWluLiAxc3QgUXUuICBNZWRpYW4gICAgTWVhbiAzcmQgUXUuICAgIE1heC4gDQojIDMxLjYwICAgNDQuMDUgICA2NC41MCAgIDY3LjI4ICAgOTAuMDAgIDEyOS42MCANCg0KIyBwbG90IGJhc2ljbw0KIyBsZW1icmFyIHF1ZSBlbSBjbGFzcygpLCBlbGUgasOhIGluZGljb3UgcXVlIGVyYSB0cyA9IHNlcmllIHRlbXBvcmFsDQpwbG90KHZhcmVqb21zKSANCiMgcGVsbyBwYWNvdGUgZHlncmFwaCBkw6EgbWFpcyBvcMOnw7Vlcw0KbGlicmFyeShkeWdyYXBocyk7bGlicmFyeShodG1sd2lkZ2V0cykNCmR5Z3JhcGgodmFyZWpvbXMsIG1haW4gPSAiw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyB0b3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwgPGJyPiAoTWVuc2FsKSAgKDIwMTE9MTAwKSBCQ0IgMTQ3OSIpICU+JQ0KICBkeUF4aXMoIngiLCBkcmF3R3JpZCA9IFRSVUUpICU+JQ0KICBkeUV2ZW50KCIyMDA1LTEtMDEiLCAiMjAwNSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE1LTEtMDEiLCAiMjAxNSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE4LTEtMDEiLCAiMjAxOCIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeUV2ZW50KCIyMDE5LTEtMDEiLCAiMjAxOSIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JQ0KICBkeU9wdGlvbnMoZHJhd1BvaW50cyA9IFRSVUUsIHBvaW50U2l6ZSA9IDIpDQpgYGANCg0Kw4kgcG9zc2l2ZWwgdmlzdWFsaXphciBub3MgcGxvdHMgYWNpbWE6IHNhem9uYWxpZGFkZSAocG9yIGV4ZW1wbG8sIHBpY29zIGVtIGRlemVtYnJvIGRlIGNhZGEgYW5vKTsgYSB0ZW5kw6puY2lhIGFwYXJlbnRlbWVudGUgY3Jlc2NlbnRlIGF0w6kgMjAxNCBlIGRlY3Jlc2NlIGNvbSBhICJjcmlzZSIgYnJhc2lsZWlyYTsgZSB1bWEgYXBhcmVudGUgbsOjby1lc3RhY2lvbmFyaWVkYWRlIChtw6lkaWEgZSB2YXJpw6JuY2lhIG11ZGFtIG5vIHRlbXBvKS4gTWFpcyBhIGZyZW50ZSwgYXBsaWNhcmVpIG8gdGVzdGUgZGUgcmFpeiB1bml0w6FyaWEgbmEgc8OpcmllIHBhcmEgYXZhbGlhciBhIGVzdGFjaW9uYXJpZWRhZGUgZGUgbW9kbyBtYWlzIGV4cGzDrWNpdG8uDQoNCiMgQW7DoWxpc2UgZGEgc8OpcmllDQoNClVtYSByZXNzYWx2YSBkZXZlIHNlciBmZWl0YSwgcXVlIG5vIHByZXNlbnRlIGV4ZXJjw61jaW8sIG7Do28gZmFyZWkgYSBkaXZpc8OjbyBlbnRyZSBhbW9zdHJhIHRlc3RlIGUgYW1vc3RyYSB0cmVpbm8sIGRlIG1vZG8gcXVlIHVzYXJlaSBhIHPDqXJpZSB0b2RhIHBhcmEgb3MgYWp1c3Rlcy4gTyBsZWl0b3IgZGV2ZSBlbSBnZXJhbCBmYXplciBlc3RhcyBkaXZpc8O1ZXMgcGFyYSBjZXJ0aWZpY2FyIGRlIHF1ZSBvIG1vZGVsbyDDqSB1bSBib20gcHJlZGl0b3IuDQoNCkdlcmFsbWVudGUsIG7Do28gw6kgcG9zc8OtdmVsIGRpemVyIG9saGFuZG8gbyBncsOhZmljbyBkZSB0ZW1wbywgcXVhaXMgdmFsb3JlcyBkZSBsYWdzIHAgZSBxIHNlcsOjbyBhcHJvcHJpYWRvcyBwYXJhIG9zIGRhZG9zLiDDgHMgdmV6ZXMsIMOpIHBvc3PDrXZlbCB1c2FyIG8gZ3LDoWZpY28gQUNGIGUgbyBncsOhZmljbyBQQUNGIHBhcmEgZGV0ZXJtaW5hciB2YWxvcmVzIGFwcm9wcmlhZG9zIHBhcmEgcCBlIHEuIEEgcHJpbWVpcmEgYW7DoWxpc2UgaW5kaWNhIG9saGFyIG9zIGdyw6FmaWNvcyAoY29ycmVsb2dyYW1hcykgZGEgRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyAoRkFDLCBlbSBwb3J0dWd1w6pzLCBvdSBBQ0YgZW0gaW5nbMOqcykgZSBBdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ3AsIGVtIHBvcnR1Z3XDqnMsIG91IFBBQ0YgZW0gaW5nbMOqcykuDQoNCnVtIGdyw6FmaWNvIEZBQyBtb3N0cmEgYXMgYXV0b2NvcnJlbGHDp8O1ZXMgcXVlIG1lZGVtIGEgcmVsYcOnw6NvIGVudHJlXA0KJHlfdCQgZSAkeV97dC1rfSQgcGFyYSBkaWZlcmVudGVzIHZhbG9yZXMgZGUgay4gQWdvcmEsIHNlICR5X3QkIGUgJHlfe3QtMX0kIGVzdMOjbyBjb3JyZWxhY2lvbmFkb3MsIGVudMOjbyAkeV97dH0kIGUgJHlfe3QtMn0kIHRhbWLDqW0gZGV2ZSBzZXIgY29ycmVsYWNpb25hZG8uIE1hcyBpc3NvIHBvZGUgc2VyIHBvcnF1ZSBhbWJvcyBlc3TDo28gY29ycmVsYWNpb25hZG9zIGNvbSAkeV97dC0xfSQuIFBhcmEgZXZpdGFyIGVzc2FzICJpbnRlcmZlcsOqbmNpYXMiIMOpIHF1ZSBzZSBmYXogYSBGQUNwLiBBcyBhdXRvY29ycmVsYcOnw7VlcyBwYXJjaWFpcyBuYSBGQUNwIG1lZGVtIGEgcmVsYcOnw6NvIGVudHJlICR5X3QkIGUgJHlfe3Qta30kIGRlcG9pcyBkZSByZW1vdmVyIG9zIGVmZWl0b3MgZG9zIGxhZ3MgMSwgMiwgMywgLi4uICwgKGstMSkuIFBvcnRhbnRvLCBhIHByaW1laXJhIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCDDqSBpZMOqbnRpY2Egw6AgcHJpbWVpcmEgYXV0b2NvcnJlbGHDp8OjbywgcG9ycXVlIG7Do28gaMOhIG5hZGEgZW50cmUgZWxhcyBwYXJhIHJlbW92ZXIuIENhZGEgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsIHBvZGUgc2VyIGVzdGltYWRhIGNvbW8gbyDDumx0aW1vIGNvZWZpY2llbnRlIGVtIHVtIG1vZGVsbyBhdXRvcmVncmVzc2l2by4gSXN0byBwb2RlIHNlciBvYnRpZG8gY29tIGFzIGZ1bsOnw7VlcyBgYWNmYCBlIGBwYWNmYCwgb3UgdXNhbmRvIGFzIGZ1bsOnw7VlcyBgZ2dBY2ZgIGUgYGdnUGFjZmAgZG8gcGFjb3RlIGBmb3JlY2FzdGAuIEZhcmVtb3MgbyBtZXNtbyBwcm9jZWRpbWVudG8gcGFyYSBhIHPDqXJpZSBlbSBuw612ZWwgZSBwYXJhIGEgc8OpcmllIGVtIHByaW1laXJhIGRpZmVyZW7Dp2EuDQoNCiMjIEZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZSBBdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgKEZBQ3ApIGNvbSBkZWZhc2FnZW0gMzYNCg0KIyMjIFPDqXJpZSBlbSBuw612ZWwNCg0KVXNhcmVpIGEgcm90aW5hIGRvIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCkuDQoNCmBgYHtyIHBsb3R9DQpyZXF1aXJlKGZvcmVjYXN0KQ0KdmFyZWpvPC12YXJlam9tcw0KdmFyZWpvICU+JSBnZ3RzZGlzcGxheShtYWluPSIiKQ0KYGBgDQoNCk5lc3RlIGNhc28sIG8gYGdndHNkaXNwbGF5YCBkbyBwYWNvdGUgYGZvcmVjYXN0YCBqw6EgcmV0b3JuYSBvcyBncsOhZmljb3MgZGEgc8OpcmllLCBlIHJlc3BlY3RpdmFzIEFDRiBlIFBBQ0YuDQoNCiMjIyBTw6lyaWUgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYQ0KDQpDb21vIGEgc8OpcmllIGFwcmVzZW50YSB2YXJpYcOnw7VlcyBzYXpvbmFpcyBpbXBvcnRhbnRlcywgYXNzaW0gY29tbyB0ZW5kw6puY2lhIGltcG9ydGFudGUsIGNsYXJhbWVudGUgbsOjby1lc3RhY2lvbsOhcmlhcywgdm91IG9saGFyIHRhbWLDqW0gZW0gcHJpbWVpcmEgZGlmZXJlbsOnYS4NCg0KYGBge3IgZGlmZl9nZ3RzZGlzcGxheX0NCnZhcmVqbyAlPiUgZGlmZigpICU+JSBnZ3RzZGlzcGxheShtYWluPSJTw6lyaWUgdmFyZWpvIGRlIE1TIGVtIHByaW1laXJhIGRpZmVyZW7Dp2EiKQ0KYGBgDQoNCiMjIyBQcmltZWlyYSBkaWZlcmVuw6dhIHNhem9uYWwgZSBBQ0YgZSBQQUNGDQoNCkZhcmVpIGFnb3JhIGEgZGlmZXJlbsOnYSBzYXpvbmFsLg0KDQpgYGB7ciBkaWZmdmFyZWpvfQ0KdmFyZWpvICU+JSBkaWZmKGxhZz0xMikgJT4lIGdndHNkaXNwbGF5KG1haW49IlPDqXJpZSB2YXJlam8gZGUgTVMgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYSBzYXpvbmFsIikgIA0KYGBgDQoNCiMjIyBBanVzdGUgc2F6b25hbCBlIEFDRiBlIFBBQ0YNCg0KQXBsaWNhcmVtb3MgbyBhanVzdGUgc2F6b25hbCB0aXBvIFNUTCAoU2Vhc29uYWwgRGVjb21wb3NpdGlvbiBvZiBUaW1lIFNlcmllcyBieSBMb2VzcykgYW9zIGRhZG9zLg0KDQpgYGB7ciBzZWFzYWRqfQ0KbGlicmFyeShmcHAyKQ0KdmFyZWpvICU+JSBzdGwocy53aW5kb3c9J3BlcmlvZGljJykgJT4lIHNlYXNhZGooKSAtPiB2YXJlam9hZGoNCmF1dG9wbG90KHZhcmVqb2FkaikNCmBgYA0KDQpFIGFnb3JhIG9zIHBsb3RzIGRlIEFDRiBlIFBBQ0YgbmEgc8OpcmllIGFqdXN0YWRhIHNhem9uYWxtZW50ZS4NCg0KYGBge3IgdmFyZWpvYWRqfQ0KdmFyZWpvYWRqICU+JSBkaWZmKCkgJT4lIGdndHNkaXNwbGF5KG1haW49IlPDqXJpZSB2YXJlam8gZGUgTVMgZW0gcHJpbWVpcmEgZGlmZXJlbsOnYSBlIGFqdXN0ZSBzYXpvbmFsIikNCmBgYA0KDQpQYXJlY2UgaW5kaWNhciBwYXJhIGFsZ3VtIEFSIGRlIG9yZGVtIDQgbmEgUEFDRiwgYWxndW1hIHNhem9uYWxpZGFkZSBtYXJjYW50ZSBuYSBBQ0YgKGluZGljYW5kbyB1bSB0ZXJtbyBTTUEpLCBlIGluZGljYWNhbyBkZSB1bSBBUklNQSAoNCwxLDEpKDAsMSwxKVsxMl0uDQoNClVtYSBlc3RpbWHDp8OjbyBpbmljaWFsIGRlc3NlIG1vZGVsbyBkYXJpYSBhbGdvIGNvbW8NCg0KYGBge3IgZml0fQ0KKGZpdCA8LSBBcmltYSh2YXJlam9hZGosIG9yZGVyPWMoNCwxLDEpLHNlYXNvbmFsID0gYygwLCAxLCAxKSkpDQpgYGANCg0Kw4kgcG9zc8OtdmVsIG9ic2VydmFyIG9zIEFJQ2MgPSAxMDQ2LjAzLCBzdXNwZWl0YXIgZGEgbsOjbyBzaWduaWZpY8OibmNpYSBkZSBhcjMgZSBvbGhhciBvcyByZXPDrWR1b3MuIEEgZnVuw6fDo28gYGF1dG9wbG90YCByZXRvcm5hIG8gY8OtcmN1bG8gdW5pdMOhcmlvIGUgYXMgcmHDrXplcyB1bml0w6FyaWFzIGRlc3RhIGVzdGltYcOnw6NvLCBlbnF1YW50byBhIGBjaGVja3Jlc2lkdWFsc2AgZm9ybmVjZSBvcyBjb3JyZWxvZ3JhbWFzIHJlc2lkdWFpcy4NCg0KTyBjw61yY3VsbyB1bml0w6FyaW8gaW5kaWNhIGVzdGFiaWxpZGFkZSBkYXMgcmHDrXplcyB1bml0w6FyaWFzIGRvIG1vZGVsbywgZW5xdWFudG8gbyBManVuZy1Cb3ggcmV0b3JuYSBhIG7Do28tcmVqZWnDp8OjbyBkZSBIMCBkZSBxdWUgb3MgcGFyw6JtZXRyb3MgZGUgYXV0b2NvcnJlbGHDp8OjbyByZXNpZHVhbCBzw6NvIG51bG9zIChyZXRvcm5hIHVtIGdyYW5kZSB2YWxvciBwLCBzdWdlcmluZG8gdGFtYsOpbSBxdWUgb3MgcmVzw61kdW9zIHPDo28gcnXDrWRvIGJyYW5jbykuIE8gZ3LDoWZpY28gQUNGIGRvcyByZXPDrWR1b3MgZG8gbW9kZWxvIEFSSU1BICg0LDEsMSkoMCwxLDEpWzEyXSBtb3N0cmEgcXVlIHRvZGFzIGFzIGF1dG9jb3JyZWxhw6fDtWVzIGVzdMOjbyBkZW50cm8gZG9zIGxpbWl0ZXMgw6AgZXhjZcOnw6NvIGRlIHVtIGxhZyAyMywgaW5kaWNhbmRvIHF1ZSBvcyByZXPDrWR1b3MgZXN0w6NvIHNlIGNvbXBvcnRhbmRvIGNvbW8gcnXDrWRvIGJyYW5jby4NCg0KYGBge3IgTEJRcGxvdH0NCmF1dG9wbG90KGZpdCkNCmNoZWNrcmVzaWR1YWxzKGZpdCkNCmxpYnJhcnkoRml0QVIpICAjIHByYXRpY28gcGFyYSBwbG90YXIgZ3JhZmljb3MgZGUgUQ0KI0xCUVBsb3QocmVzLCBsYWcubWF4ID0gMzApDQojIyMgcmVzIMOpIGEgc8OpcmllIHF1ZSB0ZW1vcyBpbnRlcmVzc2UgZGUgcmVhbGl6YXIgb3MgdGVzdGVzDQojIyMgbGFnLm1heCDDqSBvIG7Dum1lcm8gZGUgbGFncyBxdWUgc2UgZGVzZWphIGltcHJpbWlyIG8gZ3LDoWZpY28NCkxCUVBsb3QocmVzaWR1YWxzKGZpdCksMzYpDQojIEFsdGVybmF0aXZhIHBlbG8gTFNUUw0KbGlicmFyeShMU1RTKQ0KcDwtQm94LkxqdW5nLlRlc3QocmVzaWR1YWxzKGZpdCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gMzYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJMU1RTIExqdW5nLUJveCB0ZXN0IikNCnArDQogIGdndGhlbWVzOjp0aGVtZV9lY29ub21pc3Rfd2hpdGUoKSsNCiAgbGFicygNCiAgICB4ID0gIkxhZyA9IGsiLA0KICAgIHkgPSAiUC12YWxvciBkbyBUZXN0ZSBManVuZy1Cb3ggcGFyYSBhdMOpIGxhZyA9IGsgIiwNCiAgICB0aXRsZSA9ICJTw6lyaWUgZGUgY29uc3VtbzoiLA0KICAgIHN1YnRpdGxlID0gInZhcmVqbyBkZSBNUyIsDQogICAgY2FwdGlvbiA9ICJGb250ZTogRWxhYm9yYcOnw6NvIHByw7NwcmlhIGEgcGFydGlyIGRlIGRhZG9zIGRvIEJDQi4iDQogICkgDQpgYGANCg0KQ2hlY2FuZG8gYSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zLg0KDQpgYGB7ciBub3JtYWxpZGFkZX0NCiMgY2hlY2FyIG5vcm1hbGlkYWRlIGRvcyByZXPDrWR1b3MNCmxpYnJhcnkodHNlcmllcykNCmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKGZpdCkpDQpgYGANCg0KDQojIEFSSU1BDQoNClVtYSBlc3RpbWHDp8OjbyBhdXRvbWF0aXphZGEgcGVsYSBmdW7Dp8OjbyBgYXV0by5hcmltYWAge2ZvcmVjYXN0fSBwYWRyw6NvIGluZGljYSB1bSBtb2RlbG8gZGlmZXJlbnRlLg0KDQpgYGB7ciBmaXQyfQ0KZml0MiA8LSBhdXRvLmFyaW1hKHZhcmVqbykNCnN1bW1hcnkoZml0MikNCiNwLXZhbHVlcyBkb3MgY29lZmljaWVudGVzDQpwdmFsdWVzPC0oMS1wbm9ybShhYnMoZml0MiRjb2VmKS9zcXJ0KGRpYWcoZml0MiR2YXIuY29lZikpKSkqMg0KcHZhbHVlcw0KbGlicmFyeShGaXRBUikgICMgcHJhdGljbyBwYXJhIHBsb3RhciBncmFmaWNvcyBkZSBRDQpMQlFQbG90KHJlc2lkdWFscyhmaXQyKSwzNikNCiMgQWx0ZXJuYXRpdmEgcGVsbyBMU1RTDQpsaWJyYXJ5KExTVFMpDQpwMjwtQm94LkxqdW5nLlRlc3QocmVzaWR1YWxzKGZpdDIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IDM2LCANCiAgICAgICAgICAgICAgICAgICAgICAgIG1haW4gPSAiTFNUUyBManVuZy1Cb3ggdGVzdCIpDQpwMisNCiAgZ2d0aGVtZXM6OnRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpKw0KICBsYWJzKA0KICAgIHggPSAiTGFnID0gayIsDQogICAgeSA9ICJQLXZhbG9yIGRvIFRlc3RlIExqdW5nLUJveCBwYXJhIGF0w6kgbGFnID0gayAiLA0KICAgIHRpdGxlID0gIlPDqXJpZSBkZSBjb25zdW1vOiIsDQogICAgc3VidGl0bGUgPSAidmFyZWpvIGRlIE1TIiwNCiAgICBjYXB0aW9uID0gIkZvbnRlOiBFbGFib3Jhw6fDo28gcHLDs3ByaWEgYSBwYXJ0aXIgZGUgZGFkb3MgZG8gQkNCLiINCiAgKSANCiMgY2hlY2FyIG5vcm1hbGlkYWRlIGRvcyByZXPDrWR1b3MNCmxpYnJhcnkodHNlcmllcykNCmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKGZpdDIpKQ0KYGBgDQoNCk5lc3RlIGNhc28sIG8gbW9kZWxvIHRldmUgYSBpbmRpY2HDp8OjbyBkZSBBUklNQSgwLDEsMSkoMCwxLDEpWzEyXSwgZGlmZXJlbnRlIGRvIGFudGVyaW9yIChBUklNQSg0LDEsMSkoMCwxLDEpWzEyXSAtIGRlZmluaWRvIHBlbGEgaW50dWnDp8OjbyBkb3MgY29ycmVsb2dyYW1hcyksIGNvbW8gcmVmbGV4byBkbyBkZWZhdWx0IGRhIGZ1bsOnw6NvIGFkbWl0aXIgbGFncyBtw6F4aW1vcyBlIHByb2NlZGltZW50b3MgcXVlIHJlc3RyaW5nZW0gYSBvdGltaXphw6fDo28gZGEgZnVuw6fDo28gdmVyb3NzaW1pbGhhbsOnYS4gTyBBSUNjIGZvaSBkZSAxMDQ2LjM0LCBwb3VjbyBhY2ltYSBkbyBhbnRlcmlvciwgaW5kaWNhbmRvIGFqdXN0ZSBpbmZlcmlvciBxdWUgbyBwcmltZWlyby4NCg0KIyBNb2RlbG8gQVJJTUEgYXV0b23DoXRpY28gbWFpcyBnZXJhbA0KDQpBIHJlY29tZW5kYcOnw6NvIGRvIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAxOCksIG5lc3RhcyBzaXR1YcOnw7Vlcywgw6kgZmF6ZXIgdW0gbW9kZWxvIGBhdXRvLmFyaW1hYCBtYWlzIGdlcmFsLCBxdWUgaW52ZXN0aWd1ZSBtYWlzIHBvc3NpYmlsaWRhZGVzIGRlIG1vZGVsb3MsZmF6ZW5kbyBvcyBhcmd1bWVudG9zIGRhIGBhdXRvLmFyaW1hYCBkYSBmb3JtYSBgc3RlcHdpc2U9RkFMU0VgIGUgYGFwcHJveGltYXRpb249RkFMU0VgLiBTZSBlc3RpdmVyIHVzYW5kbyBhIHPDqXJpZSBjb20gYWp1c3RlIHNhem9uYWwgKGRlc3Nhem9uYWxpemFkYSksIHNlcsOhIGludGVyZXNzYW50ZSB1c2FyIHRhbWJlbSBvIGFyZ3VtZW50byBgc2Vhc29uYWw9RkFMU0VgLg0KDQpgYGB7ciBmaXQzfQ0KcmVxdWlyZShmcHAyKQ0KZml0MyA8LSBhdXRvLmFyaW1hKHZhcmVqb21zLHN0ZXB3aXNlPUZBTFNFLCBhcHByb3hpbWF0aW9uPUZBTFNFKQ0Kc3VtbWFyeShmaXQzKQ0KI3AtdmFsdWVzIGRvcyBjb2VmaWNpZW50ZXMNCnB2YWx1ZXM8LSgxLXBub3JtKGFicyhmaXQzJGNvZWYpL3NxcnQoZGlhZyhmaXQzJHZhci5jb2VmKSkpKSoyDQpwdmFsdWVzDQpgYGANCg0KTmVzdGUgY2Vuw6FyaW8sIGEgcm90aW5hIGBhdXRvLmFyaW1hYCBlbmNvbnRyYSBvIEFSSU1BKDQsMSwwKSgwLDEsMSlbMTJdLCBjb20gQUlDYyBkZSAxMDQ0LjE0LCBwb3J0YW50bywgbWVsaG9yIChtZW5vcikgcXVlIGFzIGR1YXMgcHJpbWVpcmFzIGVzdGltYcOnw7Vlcy4gY29tbyBpbnR1aWRvIGFudGVyaW9ybWVudGUsIGVsZSBkZXRlY3RhIG8gQVIoNCksIGEgSW50ZWdyYcOnw6NvIChJKDEpKSwgYSBpbnRlZ3Jhw6fDo28gc2F6b25hbCBlIG8gU01BKDEpLiBPIHRlcm1vIGFyMyBuw6NvIGZvaSBzaWduaWZpY2F0aXZvLCBtYXMgb3MgZGVtYWlzIGZvcmFtLg0KDQojIyMgQ2hlY2FuZG8gcmVzw61kdW9zDQoNCk9zIG1vZGVsb3MgcG9kZW0gc2VyIGNvbnNpZGVyYWRvcyB3aGl0ZSBub2lzZSwgbWFzIG7Do28gbm9ybWFpcy4NCg0KYGBge3IgY2hlY2tmaXQzfQ0KY2hlY2tyZXNpZHVhbHMoZml0MykNCnJlcXVpcmUoRml0QVIpICAjIHByYXRpY28gcGFyYSBwbG90YXIgZ3JhZmljb3MgZGUgUQ0KTEJRUGxvdChyZXNpZHVhbHMoZml0MyksMzYpDQojIEFsdGVybmF0aXZhIHBlbG8gcGFjb3RlIExTVFMNCmxpYnJhcnkoTFNUUykNCnAzPC1Cb3guTGp1bmcuVGVzdChyZXNpZHVhbHMoZml0MyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gMzYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbWFpbiA9ICJMU1RTIExqdW5nLUJveCB0ZXN0IikNCnAzKw0KICBnZ3RoZW1lczo6dGhlbWVfZWNvbm9taXN0X3doaXRlKCkrDQogIGxhYnMoDQogICAgeCA9ICJMYWcgPSBrIiwNCiAgICB5ID0gIlAtdmFsb3IgZG8gVGVzdGUgTGp1bmctQm94IHBhcmEgYXTDqSBsYWcgPSBrICIsDQogICAgdGl0bGUgPSAiU8OpcmllIGRlIGNvbnN1bW86IiwNCiAgICBzdWJ0aXRsZSA9ICJ2YXJlam8gZGUgTVMiLA0KICAgIGNhcHRpb24gPSAiRm9udGU6IEVsYWJvcmHDp8OjbyBwcsOzcHJpYSBhIHBhcnRpciBkZSBkYWRvcyBkbyBCQ0IuIg0KICApIA0KIyBjaGVjYXIgbm9ybWFsaWRhZGUgZG9zIHJlc8OtZHVvcw0KcmVxdWlyZSh0c2VyaWVzKQ0KamFycXVlLmJlcmEudGVzdChyZXNpZHVhbHMoZml0MykpDQpgYGANCg0KUG9kZS1zZSBmYXplciBvIGdyw6FmaWNvIGRvcyBmb3JlY2FzdHMgZGVzdGUgbW9kZWxvOg0KDQpgYGB7ciBwbG90Zml0M30NCmF1dG9wbG90KGZvcmVjYXN0KGZpdDMsaD0yNCksDQogICAgICAgICB0aXRsZSA9IkZvcmVjYXN0cyBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyB0b3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwiLA0KICAgICAgICAgeGxhYiA9ICJBbm8iLCB5bGFiID0gIsONbmRpY2UgKDIwMTE9MTAwKSINCiAgICAgICAgICkNCmBgYA0KDQojIyMgVGVzdGUgZGUgcmFpeiB1bml0w6FyaWENCg0KTyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBkZXZlcmlhIHNlciBmZWl0byBhbnRlcyBkZSByb2RhciBvIEFSSU1BLCBhIGZpbSBkZSBpbnZlc3RpZ2FyIGUvb3UgY29uZmlybWFyIGEgbsOjby1lc3RhY2lvbmFyaWVkYWRlIGRhIHPDqXJpZSwgcXVlIGZvaSBpbnR1aWRhIGEgcGFydGlyIGRhIEFDRiBlIFBBQ0YuIEEgcm90aW5hIGBhdXRvLmFyaW1hYCBqw6EgZmF6IGVzc2UgdGVzdGUgZW0gc2V1IHByb2Nlc3NvLiBFeGlzdGVtIGRpZmVyZW50ZXMgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhIHBvc3PDrXZlaXMgKEFERiwgUFAsIEtQU1MpIGFzc2ltIGNvbW8gZGlmZXJlbnRlcyB0ZXN0ZXMgcGFyYSBhIHNhem9uYWxpZGFkZS4NCg0KIyMjIyBUZXN0ZSBBREYNCg0KTyB0ZXN0ZSBkZSBEaWNrZXktRnVsbGVyIGF1bWVudGFkbyAoQURGKSDDqSBub3NzYSBwcmltZWlyYSBlc2NvbGhhLiBPIHBhZHLDo28gw6kgcXVlIEgwOiBzw6lyaWUgbsOjbyBlc3RhY2lvbsOhcmlhIG91IHPDqXJpZSB0ZW0gcmFpeiB1bml0w6FyaWEuDQoNCmBgYHtyIGFkZnRlc3R9DQpBREYudGVzdDwtYWRmLnRlc3QodmFyZWpvbXMpDQpBREYudGVzdA0KYGBgDQoNCiMjIyMgVGVzdGUgQURGIGludmVydGVuZG8gYSBoaXDDs3Rlc2UgbnVsYQ0KDQpOZXN0ZSBjYXNvLCBvIHBhZHLDo28gw6kgcXVlIEgwOiBhIHPDqXJpZSDDqSBlc3RhY2lvbsOhcmlhIG91IGEgc8OpcmllIG7Do28gdGVtIHJhaXogdW5pdMOhcmlhLiBOZXN0ZSBjYXNvLCBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSDDqSBxdWUgYSBzw6lyaWUgw6kgImV4cGxvc2l2YSIuDQoNCmBgYHtyIEFERi50ZXN0MTJ9DQpBREYudGVzdDEyPC1hZGYudGVzdCh2YXJlam9tcyxrPTEyLGFsdGVybmF0aXZlID0gYygiZXhwbG9zaXZlIikpDQpBREYudGVzdDEyDQpgYGANCg0KIyBBUklNQSAtIENvZGlnbyBkbyBIeW5kbWFuIGUgQXRoYW5hc29wb3Vsb3MsIHNlY2FvIDguMQ0KDQpBIGZ1bsOnw6NvIGBuZGlmZnNgIHVzYSB1bSB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBwYXJhIGRldGVybWluYXIgbyBuw7ptZXJvIGRlIGRpZmVyZW7Dp2FzIG5lY2Vzc8OhcmlhcyBwYXJhIHF1ZSBzw6lyaWVzIHRlbXBvcmFpcyB4c2VqYW0gZmVpdGFzIGVzdGFjaW9uw6FyaWFzLg0KDQpTZSBgdGVzdD0ia3BzcyJgLCBvIHRlc3RlIEtQU1Mgw6kgdXNhZG8gY29tIGEgaGlww7N0ZXNlIG51bGEgcXVlIHggcG9zc3VpIHVtYSByYWl6IGVzdGFjaW9uw6FyaWEgY29udHJhIHVtYSBhbHRlcm5hdGl2YSBkZSByYWl6IHVuaXTDoXJpYS4gRW0gc2VndWlkYSwgbyB0ZXN0ZSByZXRvcm5hIG8gbWVub3IgbsO6bWVybyBkZSBkaWZlcmVuw6dhcyBuZWNlc3PDoXJpYXMgcGFyYSBwYXNzYXIgbm8gdGVzdGUgYW8gbsOtdmVsIGFscGhhLg0KDQpTZSBgdGVzdD0iYWRmImAsIG8gdGVzdGUgQURGIMOpIHV0aWxpemFkbyBlIHNlIGB0ZXN0PSJwcCJgLCBvIHRlc3RlIGRlIFBoaWxsaXBzLVBlcnJvbiDDqSB1c2Fkby4gRW0gYW1ib3Mgb3MgY2Fzb3MsIGEgaGlww7N0ZXNlIG51bGEgw6kgcXVlIHggdGVtIHVtYSByYWl6IHVuaXTDoXJpYSBjb250cmEgdW1hIGFsdGVybmF0aXZhIGRlIHPDqXJpZSBlc3RhY2lvbsOhcmlhLiBFbSBzZWd1aWRhLCBvIHRlc3RlIHJldG9ybmEgbyBtZW5vciBuw7ptZXJvIGRlIGRpZmVyZW7Dp2FzIG5lY2Vzc8OhcmlhcyBwYXJhIGZhbGhhciBvIHRlc3RlIG5vIG7DrXZlbCBhbHBoYS4NCg0KQSBmdW7Dp8OjbyBgbnNkaWZmc2AgdXNhIHRlc3RlcyBkZSByYWl6IHVuaXTDoXJpYSBzYXpvbmFsIHBhcmEgZGV0ZXJtaW5hciBvIG7Dum1lcm8gZGUgZGlmZXJlbsOnYXMgc2F6b25haXMgbmVjZXNzw6FyaWFzIHBhcmEgcXVlIGFzIHPDqXJpZXMgdGVtcG9yYWlzIHggc2VqYW0gZmVpdGFzIGVzdGFjaW9uw6FyaWFzIChwb3NzaXZlbG1lbnRlIGNvbSBhbGd1bSBkaWZlcmVuY2lhbCBkZSBhdHJhc28gdGFtYsOpbSkuIFNlIGB0ZXN0PSJjaCJgLCBvIHRlc3RlIGRlIENhbm92YS1IYW5zZW4gKDE5OTUpIMOpIHVzYWRvIChjb20gaGlww7N0ZXNlIG51bGEgZGUgc2F6b25hbGlkYWRlIGRldGVybWluw61zdGljYSkgZSBzZSBgdGVzdD0ib2NzYiJgIG8gdGVzdGUgZGUgT3Nib3JuLUNodWktU21pdGgtQmlyY2hlbmhhbGwgKDE5ODgpIMOpIHVzYWRvIChjb20gaGlww7N0ZXNlIG51bGEgZGUgZXhpc3RpciB1bWEgcmFpeiB1bml0w6FyaWEgc2F6b25hbCkuDQoNCmBgYHtyIHhzdGFyfQ0KeDwtdmFyZWpvbXMNCm5zIDwtIG5zZGlmZnMoeCkgICAjbnVtZXJvIGRlIGRpZmVyZW5jYXMgc2F6b25haXMNCm5zDQppZihucyA+IDApIHsNCiAgeHN0YXIgPC0gZGlmZih4LGxhZz1mcmVxdWVuY3koeCksZGlmZmVyZW5jZXM9bnMpDQp9IGVsc2Ugew0KICB4c3RhciA8LSB4DQp9IA0KYGBgDQoNClBvcnRhbnRvLCB0ZW1vcyB1bWEgZGlmZXJlbsOnYSBzYXpvbmFsIG5lY2Vzc8OhcmlhIChucz0xKSBlIGEgc8OpcmllIG5hIGRpZmVyZW7Dp2Egc2F6b25hbCBlc3TDoSBhcm1hemVuYWRhIGVtIHhzdGFyLg0KDQpgYGB7ciBuZGlmZnN9DQpuZCA8LSBuZGlmZnMoeHN0YXIpICAgIyBudW1lcm8gZGUgZGlmZXJlbmNhcw0KbmQNCmlmKG5kID4gMCkgew0KICB4c3RhciA8LSBkaWZmKHhzdGFyLGRpZmZlcmVuY2VzPW5kKQ0KfQ0KIyB4c3RhciBzZXLDoSBhIHPDqXJpZSBkZXZpZGFtZW50ZSBlbSBkaWZlcmVuw6dhcyBzYXpvbmFpcyBlIGRpZmVyZW7Dp2FzIG5vcm1haXMNCmF1dG9wbG90KHhzdGFyKQ0KYXV0by5hcmltYSh4c3RhcikgICMgdmVyIHF1ZSBvIHJlc3VsdGFkbyDDqSBpZ3VhbCwgbWFzIGFnb3JhIG5hbyB0ZW0gZGlmZXJlbmNhcw0KbW9kZWxvPC1hdXRvLmFyaW1hKHhzdGFyLHN0ZXB3aXNlPUZBTFNFLCBhcHByb3hpbWF0aW9uPUZBTFNFKQ0Kc3VtbWFyeShtb2RlbG8pDQphdXRvcGxvdChtb2RlbG8pIA0KYGBgDQoNCkNvbWVudMOhcmlvOiB1bWEgdmV6IHF1ZSBhIHPDqXJpZSB1dGlsaXphZGEgZW0gYGF1dG8uYXJpbWFgIMOpIGEgcmVzdWx0YW50ZSB4c3RhciwgbyBtbW9kZWxvIG7Do28gaWRlbnRpZmljYSBhIG5lY2Vzc2lkYWRlIGRlIGRpZmVyZW5jaWHDp8OjbyBuZW0gZGlmZXJlbmNpYcOnw6NvIHNhem9uYWwuIENvbSBlc3NlIHByb2NlZGltZW50bywgZWxlIGVuY29udHJhIG8gQVJJTUEoNCwwLDApKDAsMDEpWzEyXSBwYXJhIHhzdGFyIHF1ZSBqw6EgdGV2ZSBhcyBkaWZlcmVuw6dhcyBhcGxpY2FkYXMgc29icmUgdmFyZWpvbXMuIERhIG1lc21hIGZvcm1hIHF1ZSBlbSBmaXQgZSBmaXQzLCBvIG1vZGVsbyBjb20gYXJndW1lbnRvcyBgc3RlcHdpc2U9RkFMU0UsIGFwcHJveGltYXRpb249RkFMU0VgIHJldG9ybmEgb3MgbWVsaG9yZXMgYWp1c3Rlcy4NCg0KIyBSZWZlcsOqbmNpYXMgeyNSZWZlcsOqbmNpYXMgLnVubnVtYmVyZWR9DQoNCkZFUlJFSVJBLCBQZWRybyBDb3N0YTsgU1BFUkFOWkEsIFRhbGl0aGE7IENPU1RBLCBKb25hdGhhICgyMDE4KS4gQkVUUzogQnJhemlsaWFuIEVjb25vbWljIFRpbWUgU2VyaWVzLiBSIHBhY2thZ2UgdmVyc2lvbiAwLjQuOS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPUJFVFM+Lg0KDQpIWU5ETUFOLCBSb2IuICgyMDE4KS4gZnBwMjogRGF0YSBmb3IgIkZvcmVjYXN0aW5nOiBQcmluY2lwbGVzIGFuZCBQcmFjdGljZSIgKDJuZCBFZGl0aW9uKS4gUiBwYWNrYWdlIHZlcnNpb24gMi4zLiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9ZnBwMj4uDQoNCkhZTkRNQU4sIFIuSi4sICYgQVRIQU5BU09QT1VMT1MsIEcuICgyMDE4KSBGb3JlY2FzdGluZzogcHJpbmNpcGxlcyBhbmQgcHJhY3RpY2UsIDJuZCBlZGl0aW9uLCBPVGV4dHM6IE1lbGJvdXJuZSwgQXVzdHJhbGlhLiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vb3RleHRzLmNvbS9mcHAyLz4uIEFjY2Vzc2VkIG9uIDEyIFNldCAyMDE5Lg0K