Testes de
Aderência - Caso Normal
Aspectos
Históricos
Os principais testes estatísticos empregados na análise de dados
clínicos e experimentais são baseados em modelos teóricos que pressupõem
a Distribuição Normal dos dados amostrais (MIOT,
2017).
Porém, tal suposição é, muitas vezes, deixada de lado por
profissionais, por diversos motivos:
- Esquecimento;
- Falta de Conhecimento;
- Desconhecimento de qual o Melhor Método;
Assim, O objetivo do trabalho foi analisar o desempenho dos
principais teste de normalidade implementados no Software Estatístico
\(R_{(4.3)}\) para decidir quais
apresentam o melhor desempenho ao responder se os dados podem ser
considerados normais.
Teste de
Kolmogorov-Smirnov
È um teste não paramétrico de bondade do ajuste sobre a igualdade de
distribuições de probabilidade contínuas e unidimensionais que pode ser
usado para comparar uma amostra com uma distribuição de probabilidade de
referência.
O nome é uma referência aso matemáticos russos Andrei
Nikolaevich Kolmogorov e Nikolai Vasilyevich
Smirnov. A estatística de Kolmogorov–Smirnov quantifica a
distância entre a função distribuição empírica da amostra e a função
distribuição acumulada da distribuição de referência.
O teste de Kolmogorov-Smirnov pode ser modificado para servir como um
teste da qualidade do ajuste. No caso especial do teste da normalidade
da distribuição, as amostras são padronizadas e comparadas com uma
distribuição normal padrão.
Andrei
Nikolaevich Kolmogorov 
Kolmogorov nasceu em 25 ade abril de 1903 em Tambov, na cidade de
Moscou. Foi um matemtático Russo, participou das maiores descobertas
científicas do século XX, nas áreas de Probabilidade e Estatística, e em
Teoria da Informação.
Em, 1933 Kolmogorov estabeleceu a definição de probabilidade por
Axiomatização, na sua obra intitulada **Foundations of Theory of
Probability*. Foi com base nas propriedades das frequências relativas e
das operações sobre conjuntos que Kolmogorov concebeu a primeira
construção Axiomática Geral para a Teoria das Probabilidades.
Considerado um dos grandes cientista em sua época, Kolmogorov foi
agraciado por diversas honrarias ao longo de sua carreira:
- Prêmio Lenin em 1941;
- Prêmio Balzan em 1962;
- Medalha Helmholtz em 195;
- Prêmio Wolf de Matemática em 1980;
- Medalha Lobachevsky em 1986;
Nikolai
Vasilyevich Smirnov
Snirnov nasceu em em 17 de outubro de 1900, em Moscou, na família de
um escrivão de igreja que também trabalhava como escriturário no
escritório do Teatro Bolshoi . Ele completou seus estudos de ginásio
durante a Primeira Guerra Mundial , durante a qual serviu em várias
unidades médicas do exército. Foi um matemático russo soviético
conhecido por seu trabalho em vários campos, incluindo teoria de
probabilidade e estatística.
Smirnov formou-se na Faculdade de Física e Matemática da Universidade
Estadual de Moscou e, a partir de 1926, ensinou matemática por muitos
anos na Academia Agrícola Timiryazev.
Smirnov recebeu o Prêmio de Estado da URSS em 1951. Em 1953 foi
agraciado com a Ordem da Bandeira Vermelha do Trabalho.
Estatística
do Teste
A função distribuição empírica \(F_{n}\) para n observações \(X_{i}\) independentes e identicamente
distribuídas é definida como:
\[ F_{n}(x) = \frac{1}{n} \sum_{i=1}^{n}
I_{[- \infty,x]}(X_{i}) \]
Em que \(I_{(-\infty,x)}X_{i}\) é a
função indicadora, igual a 1 se \(X_{i} \leq
x\) e igual a 0 de outro modo.
A estatística de Kolmogorov–Smirnov para uma dada função distribuição
acumulada \(F(X)\)
\[ D_{n} = \displaystyle \sup_{x} \
|F_{n}(x) - F(x)|\]
em que \(\displaystyle \sup_{x}\) é
o supremo do conjunto de distâncias. Pelo Teorema de
Glivenko–Cantelli, se a amostra vier da distribuição \(F(X)\) entao \(D_{n}\) converge a 0 quase certamente no
limite quando n vai ao infinito.
Função de
Distribuição Empírica
Na figura abaixo mostra-se à função de distribuição empírica
correspondente à amostra obtida da distribuição Normal Padrão (0,1)
enquantro a curva vermelha corresponde à distriuição teórica
respectiva.
set.seed(18340)
x = rnorm(50)
par(mar=c(4,2,1,1))
plot(ecdf(x),
xlim = range(c(-3, 3)),
main = "",
ylab="")
text(0,0.8,expression(F[n](x)))
curve(pnorm(x),
add = TRUE,
col = "red",
lwd = 2)
rug(x)

Hipóteses
do Teste
As Hipóteses do teste de kolmogorov-smirnov são:
\[
H_{0}: a \ diferença \ entre \ frequências \ observadas \ e \ esperadas
\ é \ pequena \ ou \ F_{0}(X) - S_{n}(X) \approx 0. \\
H_{1}: Caso \ Contrário.
\]
Nível de
Significância do Teste
Escolha de um nível de a \(\alpha =
0.05\) ou \(\alpha = 0.01\),
sendo teste de natureza bicaudal.
Regra de
Decisão do Teste
Observando o \(p-valor\) maior que
\(0.05\), concluí-se que \(\textbf{Não}\) há evidências para Rejeitar
\(H_{0}\), caso contrário, se o \(p-valor\) seja menor que \(0.05\).
O teste de kolmogorov-smirnov pode ser aplicado utilizando a função
ks.test() do pacote stats do software
R_{4.3.2} versão windows.
Teste de
Shapiro-Wilk
È um teste de normalidade publicado em 1965 por Samuel
Sanford Shapiro e Martin Wilk e se baseia na
regressão dos valores amostrais ordenados com as correspondentes
estatísticas de seis ordens normais que, para uma amostra de uma
população normalmente distribuída, é linear (ROYSTON, 1982).
Samuel
Sanford Shapiro 
Samuel nasceu na cidade de Nova York , Shapiro formou-se em
estatística no City College of New York em 1952, e fez
mestrado em engenharia industrial na Universidade de
Columbia em 1954. Ele serviu brevemente como estatístico no
Corpo Químico do Exército dos EUA, antes de obter um mestrado (1960) e
um doutorado (1963) em estatística na Rutgers
University. Em 1972 ingressou no corpo docente da
Florida International University.
Martin
Bradbury Wilk 
Martin nasceu em Montreal, Quebec, ele recebeu o diploma de bacharel
em engenharia química pela Universidade McGill em 1945.
Durante o período de 1951 a 1955, obteve o título de mestrado e
doutorado em estatística pela Iowa State
University.
O teste de Shapiro-Wilk testa a hipótese nula de que uma amostra
\(x_{1}, \ldots, x_{n}\) veio de uma
população normalmente distribuída. A estatística de teste é:
\[ W = \frac{(\sum_{i=1}^{n}
a_{i}x_{i})^{2}}{\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}}\]
O teste de shapiro-wilk pode ser aplicado utilizando a função
shapiro.test() do pacote stats do
software R_{4.3.2} versão windows.
Teste de
Jarque-Bera
È um teste de qualidade de ajuste para verificar se os dados da
amostra têm assimetria e curtose correspondentes a uma distribuição
normal . A prova leva o nome de Carlos M. Jarque Uribe
e Anil K. Bera. A estatística de teste é sempre não
negativa. Se estiver longe de zero, sinaliza que os dados não têm
distribuição normal.
Carlos M.
Jarque Uribe 
Carlos Jarque (nascido em 18 de outubro de 1954 na Cidade do México)
é um economista mexicano, atualmente Diretor Executivo da América Móvil
e Membro do Conselho do Grupo Líder Global em Serviços ao Cidadão FCC
(Fomento de Construcciones y Contratas). Teve uma carreira destacada no
sector privado, na função pública (nacional e multilateral) e no mundo
académico.
Jarque é formado em Ciências Atuariais pela Universidade
Anahuac, na Cidade do México. Ele tem Pós-Graduação em
Estatística e Mestrado em Econometria pela London School of
Economics; Certificado de Pós-Graduação em Política Econômica e
Planeamento Urbano e Regional pela Universidade de Oslo; Doutorado em
Economia (Ph.D) pela Australian National University; e
pós-doutorado em Economia pela Universidade de
Harvard.
Anil K.
Bera 
Anil K. Bera (nascido em 1955) é um econometrista indiano-americano.
Ele é professor de Economia na Universidade de Illinois
no Departamento de Economia de Urbana – Champaign.
Bera nasceu em uma remota vila de Paschimchak, Bengala Ocidental ,
Índia. Seu pai era um médico que não cobrava honorários formais de seus
pacientes e dependia de contribuições voluntárias.
Bera recebeu um Bacharelado da Universidade de Calcutá em 1975 em
Estatística, mestrado pelo Indian Statistical Institute em 1977 em
Econometria e Planejamento (Primeira Classe) e doutorado. em 1983 pela
Australian National University (Phd Aspects of Econometric
Modeling).
A estatística do teste de Jarque-Ber é definida como:
\[ JB = \frac{n}{6} (S^{2} +
\frac{1}{4}+(K-3)^{2}) \]
onde n é o número de observações(ou graus de liberdade em geral); S é
a assimetria da amostra; K é a curtose da amostra:
\[S=\frac{\hat{\mu_{3}}}{\hat{\sigma^{3}}}
= \frac{\frac{1}{n} \sum_{i=1}^{n} (x_{i}-\bar{x})^{3}}{\frac{1}{n}
\sum_{i=1}^{n} (x_{i}-\bar{x})^{2})^{\frac{3}{2}}}\] e
\[ K =
\frac{\hat{\mu_{4}}}{\hat{\sigma^{4}}} = \frac{\frac{1}{n}
\sum_{i=1}^{n} (x_{i}-\bar{x})^{4}}{\frac{1}{n} \sum_{i=1}^{n}
(x_{i}-\bar{x})^{2}}\]
onde \(\hat{\mu_{3}}\) e \(\hat{\mu_{4}}\) são as estimativas do
terceiro e quarto momentos centrais, respectivamente, \(\bar{x}\) é a média amostral e \(\hat{\sigma}^{2}\) é a estimativa do
segundo momento central, a variância.
Se os dados vierem de uma distribuição normal, a estatística JB tem
assintoticamente uma distribuição qui-quadrado \((\chi^{2})\) com dois graus de liberdade,
portanto a estatística pode ser usada para testar a hipótese de que os
dados são de uma distribuição normal.
Esta estatística é simples e seu poder se mostrou comparável a outros
testes poderosos. O teste JB Esta programado na função
JarqueBeraTest() no pacote DescTools
do R_{4.3.2}.
Material e
Métodos
A simulação Moonte Carlos foi utilizada para simular amostras normais
sob a hipótese nula de normalidade, \(H_{0}\), para avaliar as taxas de erro tipo
I dos testes e amostras sob a hipótese alternativa \(H_{1}\), ou seja, dados de distribuição não
normais para avaliar o poder.
Em cada situação, os testes de normalidade foram aplicados ao nível
nominal de significância pré-definido \(\alpha\) com o valor de 0.05.
Se o teste rejeita a hipótese nula e a amostra é da distribuição
normal comete-se um erro tipo I e, se não for normal, uma decisão
correta foi tomada.
Simulação e
Poder dos Testes
Foram efetuadas \(N=1000\)
simulações sob \(H_{0}\) e sob \(H_{1}\). Cada simulação de cada
distribuição produziu amostras de tamanho \(n\) e esses valores foram: 10,20,50,100,500
e 1000.
Os teste de normalidade foram aplicados em cada uma da \(N = 1000\) amostras de cada distribuição
simulada e a proporção de rejeições corretas da hipótese nula foi
computada. Os valores obtidos representam o poder dos testes, que foram
comparados entre si.
Resultados e
Discussões
Os resultados serão apresentados de acordo com as taxas de erro tipo
I, na situação de distribuição normal, e poder, na situação de outras
distribuições.
Pacotes
Utilizados
library(DistributionTest)
library(moments)
library(nortest)
library(DescTools)
library(fBasics)
library(dplyr)
library(tidyr)
library(ggplot2)
#library(kableExtra)
library(knitr)
library(tinytex)
library(Publish)
Simulação
# Tamanho de Amostra
Resultados <- NULL
NN <- 10
# Repetição
escopo <- expand.grid(
tamanho_amostra = seq(25, 30, 5),
repeticao = seq(1, NN)
)
Resultados <- purrr::map2_dfr(escopo$tamanho_amostra,escopo$repeticao, function(tamanho_amostra, ii){
print(paste0(tamanho_amostra, "-", ii))
#x <-rcauchy(tamanho_amostra, 0,1)
x <-rnorm(tamanho_amostra, 0,1)
#x <- rgamma(tamanho_amostra, shape = 10, rate = 1/10)
tibble(
Kolmogorov_Smirnov = ks.test(x, pnorm, mean(x), sd(x))$p.value,
Jarque_Bera = JarqueBeraTest(x)$p.value,
Anderson_Darling = AndersonDarlingTest(x, null = "pnorm", mean(x), sd(x))$p.value,
Lilliefors = LillieTest(x)$p.value,
Shapiro_Wilk = shapiro.test(x)$p.value,
Cramer_Von_Mises = cvm.test(x)$p.value,
D_Agostino = agostino.test(x)$p.value,
ZK = zk.test(x, 'norm')$p.value,
ZC = zc.test(x, 'norm')$p.value,
ZA = za.test(x, 'norm')$p.value,
amostra = tamanho_amostra,
tentativa = ii
)
}
)
## [1] "25-1"
## [1] "30-1"
## [1] "25-2"
## [1] "30-2"
## [1] "25-3"
## [1] "30-3"
## [1] "25-4"
## [1] "30-4"
## [1] "25-5"
## [1] "30-5"
## [1] "25-6"
## [1] "30-6"
## [1] "25-7"
## [1] "30-7"
## [1] "25-8"
## [1] "30-8"
## [1] "25-9"
## [1] "30-9"
## [1] "25-10"
## [1] "30-10"
Comparação do
P-valor
Resultados |>
tidyr::pivot_longer(
names_to = "modelo",
values_to = "estatistica",
cols = c(Kolmogorov_Smirnov,
Jarque_Bera,
Anderson_Darling,
Lilliefors,
Shapiro_Wilk,
Cramer_Von_Mises,
D_Agostino,
ZK,
ZC,
ZA))|>
group_by(amostra, modelo)|>
summarise(
minimo = min(estatistica),
mediana = mean(estatistica),
maximo = median(estatistica)+sd(estatistica))|>
ggplot(aes(x = amostra, y = mediana, ymin = minimo, ymax = maximo,
color = modelo))+
geom_line()+
geom_jitter()+
geom_point()+
ggtitle("Comparação do P-valor Médio")+
theme_bw()+
scale_y_continuous(labels = scales::percent, limits = c(0,1))+
labs(x = "Tamanho Amostral",
y = "Erro Tipo I",
color = "Tipos de Testes")

Poder do
Teste
A figura 2 Estão apresentados os valores de poder para os oito testes
em função do tamanho da amostra n para distribuição gamma.
Resultados |>
tidyr::pivot_longer(
names_to = "modelo",
values_to = "estatistica",
cols = c(Kolmogorov_Smirnov,
Jarque_Bera,
Anderson_Darling,
Lilliefors,
Shapiro_Wilk,
Cramer_Von_Mises,
D_Agostino,
ZK,
ZC,
ZA))|>
group_by(amostra, modelo)|>
summarise(
minimo = min(estatistica),
mediana = mean(estatistica < .05),
maximo = median(estatistica)+sd(estatistica))|>
ggplot(aes(x = amostra, y = mediana, ymin = minimo, ymax = maximo, color = modelo))+
geom_line()+
geom_jitter()+
geom_point()+
ggtitle("Comparação do Poder do Teste", subtitle = "Simulação")+
theme_bw()+
scale_y_continuous(labels = scales::percent, limits = c(0,1))+
labs(x = "Tamanho Amostral",
y = "Poder do Teste",
color = "Tipos de Testes")

Referências
Bibliográficas
ANDERSON, T. W.; DARLING, D. A. A test of goodness of t.Journal of
AmericanStatistical Association, v.49, p. 765-769, 1954.
D`AGOSTINO, R. B. Transformation to Nomality of the Null Distribution
of G1.Biome-trika, v.57, n.3, p.679-681, 1970
Jarque CM, Bera AK (1987). “A Test for Normality of Observations and
Regression Residuals.” International Statistical Review. Revue
International de Statistique, 55(2), 163–172. doi:10.2307/1403192.
Kolmogorov, A., Sulla determinazione empirica di una legge di
distributione, Giornale dell’ Istituto Italiano degli Attuari 4 (1933),
83–91.
LILLIEFORS, H. W. On the Kolmogorov-Smirnov test for normality with
mean and vari-ance unknown.Journal of American Statistical Association,
v.62, p.534-544, 1967.
SHAPIRO, S. S.; WILK, M. B. An analysis of variance test for
normality (complete sam-ples).Biometrika, v.52, p. 591-611, 1965.
Zhang J (2002). “Powerful Goodness-of-Fit Tests Based on the
Likelihood Ratio.” Journal of the Royal Statistical Society B, 64(2),
281–294. doi:10.1111/1467-9868.00337.
LS0tDQp0aXRsZTogIioqVGVzdGVzIGRlIEFkZXLDqm5jaWEgbm8gUjogdW0gR3VpYSBQcsOhdGljbyoqIg0KYXV0aG9yOg0KLSBuYW1lOiBNw6FyaW8gRGllZ28gVmFsZW50ZQ0KLSBuYW1lOiBDYXJsb3MgUGFpeMOjbw0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNicNCmluc3RpdHV0ZToNCmFic3RyYWN0OiAiQXR1YWxtZW50ZSwgZXhpc3RlbSB2w6FyaW9zIHRlc3RlcyBkZSBub3JtYWxpZGFkZSBxdWUsIG11aXRhcyB2ZXplcywgcHJvZHV6ZW0gcmVzdWx0YWRvcyBkaWZlcmVudGVzIHBvZGVuZG8gcmVqZWl0YXIgb3UgbsOjbyBhIGhpcMOzdGVzZSBudWxhIGRlIG5vcm1hbGlkYWRlLiBPIG9iamV0aXZvIGRvIHRyYWJhbGhvIGZvaSBhdmFsaWFyIGFzIHRheGFzIGRlIGVycm8gdGlwbyBJIGUgcG9kZXIgZG9zIHRlc3Rlczoga29sbW9nb3Jvdi1TbWlybm92LCBBbmRlcnNvbi1EYXJsaW5nLCBDcmFtZXJfVm9uX01pc2VzLCBEX0Fnb3N0aW5vLCBKYXJxdWVfQmVyYSwgTGlsbGllZm9ycywgU2hhcGlyby1XaWxrLCBaQSwgWkIsIFpLLiINCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHl7dGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KIyAqKlRlc3RlcyBkZSBBZGVyw6puY2lhIC0gQ2FzbyBOb3JtYWwqKg0KIyMgKipBc3BlY3RvcyBIaXN0w7NyaWNvcyoqDQoNCk9zIHByaW5jaXBhaXMgdGVzdGVzIGVzdGF0w61zdGljb3MgZW1wcmVnYWRvcyBuYSBhbsOhbGlzZSBkZSBkYWRvcyBjbMOtbmljb3MgZSBleHBlcmltZW50YWlzIHPDo28gYmFzZWFkb3MgZW0gbW9kZWxvcyB0ZcOzcmljb3MgcXVlIHByZXNzdXDDtWVtIGEgKipEaXN0cmlidWnDp8OjbyBOb3JtYWwqKiBkb3MgZGFkb3MgYW1vc3RyYWlzIChNSU9ULCAyMDE3KS4NCg0KUG9yw6ltLCB0YWwgc3Vwb3Npw6fDo28gw6ksIG11aXRhcyB2ZXplcywgZGVpeGFkYSBkZSBsYWRvIHBvciBwcm9maXNzaW9uYWlzLCBwb3IgZGl2ZXJzb3MgbW90aXZvczoNCg0KLSAgIEVzcXVlY2ltZW50bzsNCi0gICBGYWx0YSBkZSBDb25oZWNpbWVudG87DQotICAgRGVzY29uaGVjaW1lbnRvIGRlIHF1YWwgbyBNZWxob3IgTcOpdG9kbzsNCg0KQXNzaW0sIE8gb2JqZXRpdm8gZG8gdHJhYmFsaG8gZm9pIGFuYWxpc2FyIG8gZGVzZW1wZW5obyBkb3MgcHJpbmNpcGFpcyB0ZXN0ZSBkZSBub3JtYWxpZGFkZSBpbXBsZW1lbnRhZG9zIG5vIFNvZnR3YXJlIEVzdGF0w61zdGljbyAkUl97KDQuMyl9JCBwYXJhIGRlY2lkaXIgcXVhaXMgYXByZXNlbnRhbSBvIG1lbGhvciBkZXNlbXBlbmhvIGFvIHJlc3BvbmRlciBzZSBvcyBkYWRvcyBwb2RlbSBzZXIgY29uc2lkZXJhZG9zIG5vcm1haXMuDQoNCg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCg0KDQoNCiMjICoqVGVzdGUgZGUgS29sbW9nb3Jvdi1TbWlybm92KioNCg0Kw4ggdW0gdGVzdGUgbsOjbyBwYXJhbcOpdHJpY28gZGUgYm9uZGFkZSBkbyBhanVzdGUgc29icmUgYSBpZ3VhbGRhZGUgZGUgZGlzdHJpYnVpw6fDtWVzIGRlIHByb2JhYmlsaWRhZGUgY29udMOtbnVhcyBlIHVuaWRpbWVuc2lvbmFpcyBxdWUgcG9kZSBzZXIgdXNhZG8gcGFyYSBjb21wYXJhciB1bWEgYW1vc3RyYSBjb20gdW1hIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgZGUgcmVmZXLDqm5jaWEuDQoNCk8gbm9tZSDDqSB1bWEgcmVmZXLDqm5jaWEgYXNvIG1hdGVtw6F0aWNvcyBydXNzb3MgKipBbmRyZWkgTmlrb2xhZXZpY2ggS29sbW9nb3JvdioqIGUgKipOaWtvbGFpIFZhc2lseWV2aWNoIFNtaXJub3YqKi4gQSBlc3RhdMOtc3RpY2EgZGUgS29sbW9nb3Jvdi0tU21pcm5vdiBxdWFudGlmaWNhIGEgZGlzdMOibmNpYSBlbnRyZSBhIGZ1bsOnw6NvIGRpc3RyaWJ1acOnw6NvIGVtcMOtcmljYSBkYSBhbW9zdHJhIGUgYSBmdW7Dp8OjbyBkaXN0cmlidWnDp8OjbyBhY3VtdWxhZGEgZGEgZGlzdHJpYnVpw6fDo28gZGUgcmVmZXLDqm5jaWEuDQoNCk8gdGVzdGUgZGUgS29sbW9nb3Jvdi1TbWlybm92IHBvZGUgc2VyIG1vZGlmaWNhZG8gcGFyYSBzZXJ2aXIgY29tbyB1bSB0ZXN0ZSBkYSBxdWFsaWRhZGUgZG8gYWp1c3RlLiBObyBjYXNvIGVzcGVjaWFsIGRvIHRlc3RlIGRhIG5vcm1hbGlkYWRlIGRhIGRpc3RyaWJ1acOnw6NvLCBhcyBhbW9zdHJhcyBzw6NvIHBhZHJvbml6YWRhcyBlIGNvbXBhcmFkYXMgY29tIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwgcGFkcsOjby4NCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQojIyMgKipBbmRyZWkgTmlrb2xhZXZpY2ggS29sbW9nb3JvdioqICFbXShpbWFnZXMvS29sbW9nb3Jvdi5qcGVnKXt3aWR0aD0iMzIiIGhlaWdodD0iNDcifQ0KDQpLb2xtb2dvcm92IG5hc2NldSBlbSAyNSBhZGUgYWJyaWwgZGUgMTkwMyBlbSBUYW1ib3YsIG5hIGNpZGFkZSBkZSBNb3Njb3UuIEZvaSB1bSBtYXRlbXTDoXRpY28gUnVzc28sIHBhcnRpY2lwb3UgZGFzIG1haW9yZXMgZGVzY29iZXJ0YXMgY2llbnTDrWZpY2FzIGRvIHPDqWN1bG8gWFgsIG5hcyDDoXJlYXMgZGUgUHJvYmFiaWxpZGFkZSBlIEVzdGF0w61zdGljYSwgZSBlbSBUZW9yaWEgZGEgSW5mb3JtYcOnw6NvLg0KDQpFbSwgMTkzMyBLb2xtb2dvcm92IGVzdGFiZWxlY2V1IGEgZGVmaW5pw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBwb3IgQXhpb21hdGl6YcOnw6NvLCBuYSBzdWEgb2JyYSBpbnRpdHVsYWRhIFwqXCpGb3VuZGF0aW9ucyBvZiBUaGVvcnkgb2YgUHJvYmFiaWxpdHlcKi4gRm9pIGNvbSBiYXNlIG5hcyBwcm9wcmllZGFkZXMgZGFzIGZyZXF1w6puY2lhcyByZWxhdGl2YXMgZSBkYXMgb3BlcmHDp8O1ZXMgc29icmUgY29uanVudG9zIHF1ZSBLb2xtb2dvcm92IGNvbmNlYmV1IGEgcHJpbWVpcmEgY29uc3RydcOnw6NvIEF4aW9tw6F0aWNhIEdlcmFsIHBhcmEgYSBUZW9yaWEgZGFzIFByb2JhYmlsaWRhZGVzLg0KDQpDb25zaWRlcmFkbyB1bSBkb3MgZ3JhbmRlcyBjaWVudGlzdGEgZW0gc3VhIMOpcG9jYSwgS29sbW9nb3JvdiBmb2kgYWdyYWNpYWRvIHBvciBkaXZlcnNhcyBob25yYXJpYXMgYW8gbG9uZ28gZGUgc3VhIGNhcnJlaXJhOg0KDQotICAgUHLDqm1pbyBMZW5pbiBlbSAxOTQxOw0KLSAgIFByw6ptaW8gQmFsemFuIGVtIDE5NjI7DQotICAgTWVkYWxoYSBIZWxtaG9sdHogZW0gMTk1Ow0KLSAgIFByw6ptaW8gV29sZiBkZSBNYXRlbcOhdGljYSBlbSAxOTgwOw0KLSAgIE1lZGFsaGEgTG9iYWNoZXZza3kgZW0gMTk4NjsNCg0KIyMjICoqTmlrb2xhaSBWYXNpbHlldmljaCBTbWlybm92KiohW10oaW1hZ2VzL05pa29sYWlfU21pcm5vdi5qcGcpe3dpZHRoPSIzMiIgaGVpZ2h0PSI0MiJ9DQoNClNuaXJub3YgbmFzY2V1IGVtIGVtIDE3IGRlIG91dHVicm8gZGUgMTkwMCwgZW0gTW9zY291LCBuYSBmYW3DrWxpYSBkZSB1bSBlc2NyaXbDo28gZGUgaWdyZWphIHF1ZSB0YW1iw6ltIHRyYWJhbGhhdmEgY29tbyBlc2NyaXR1csOhcmlvIG5vIGVzY3JpdMOzcmlvIGRvIFRlYXRybyBCb2xzaG9pIC4gRWxlIGNvbXBsZXRvdSBzZXVzIGVzdHVkb3MgZGUgZ2luw6FzaW8gZHVyYW50ZSBhIFByaW1laXJhIEd1ZXJyYSBNdW5kaWFsICwgZHVyYW50ZSBhIHF1YWwgc2Vydml1IGVtIHbDoXJpYXMgdW5pZGFkZXMgbcOpZGljYXMgZG8gZXjDqXJjaXRvLiBGb2kgdW0gbWF0ZW3DoXRpY28gcnVzc28gc292acOpdGljbyBjb25oZWNpZG8gcG9yIHNldSB0cmFiYWxobyBlbSB2w6FyaW9zIGNhbXBvcywgaW5jbHVpbmRvIHRlb3JpYSBkZSBwcm9iYWJpbGlkYWRlIGUgZXN0YXTDrXN0aWNhLg0KDQpTbWlybm92IGZvcm1vdS1zZSBuYSBGYWN1bGRhZGUgZGUgRsOtc2ljYSBlIE1hdGVtw6F0aWNhIGRhIFVuaXZlcnNpZGFkZSBFc3RhZHVhbCBkZSBNb3Njb3UgZSwgYSBwYXJ0aXIgZGUgMTkyNiwgZW5zaW5vdSBtYXRlbcOhdGljYSBwb3IgbXVpdG9zIGFub3MgbmEgQWNhZGVtaWEgQWdyw61jb2xhIFRpbWlyeWF6ZXYuDQoNClNtaXJub3YgcmVjZWJldSBvIFByw6ptaW8gZGUgRXN0YWRvIGRhIFVSU1MgZW0gMTk1MS4gRW0gMTk1MyBmb2kgYWdyYWNpYWRvIGNvbSBhIE9yZGVtIGRhIEJhbmRlaXJhIFZlcm1lbGhhIGRvIFRyYWJhbGhvLg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCiMjIyAqKkVzdGF0w61zdGljYSBkbyBUZXN0ZSoqDQoNCkEgZnVuw6fDo28gZGlzdHJpYnVpw6fDo28gZW1ww61yaWNhICRGX3tufSQgcGFyYSBuIG9ic2VydmHDp8O1ZXMgJFhfe2l9JCBpbmRlcGVuZGVudGVzIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZGFzIMOpIGRlZmluaWRhIGNvbW86DQoNCiQkIEZfe259KHgpID0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gSV97Wy0gXGluZnR5LHhdfShYX3tpfSkgJCQNCg0KRW0gcXVlICRJX3soLVxpbmZ0eSx4KX1YX3tpfSQgw6kgYSBmdW7Dp8OjbyBpbmRpY2Fkb3JhLCBpZ3VhbCBhIDEgc2UgJFhfe2l9IFxsZXEgeCQgZSBpZ3VhbCBhIDAgZGUgb3V0cm8gbW9kby4NCg0KQSBlc3RhdMOtc3RpY2EgZGUgS29sbW9nb3Jvdi0tU21pcm5vdiBwYXJhIHVtYSBkYWRhIGZ1bsOnw6NvIGRpc3RyaWJ1acOnw6NvIGFjdW11bGFkYSAkRihYKSQNCg0KJCQgRF97bn0gPSBcZGlzcGxheXN0eWxlIFxzdXBfe3h9IFwgfEZfe259KHgpIC0gRih4KXwkJA0KDQplbSBxdWUgJFxkaXNwbGF5c3R5bGUgXHN1cF97eH0kIMOpIG8gc3VwcmVtbyBkbyBjb25qdW50byBkZSBkaXN0w6JuY2lhcy4gUGVsbyAqKlRlb3JlbWEgZGUgR2xpdmVua28tLUNhbnRlbGxpKiosIHNlIGEgYW1vc3RyYSB2aWVyIGRhIGRpc3RyaWJ1acOnw6NvICRGKFgpJCBlbnRhbyAkRF97bn0kIGNvbnZlcmdlIGEgMCBxdWFzZSBjZXJ0YW1lbnRlIG5vIGxpbWl0ZSBxdWFuZG8gbiB2YWkgYW8gaW5maW5pdG8uDQoNCg0KIyMjIyAqKkZ1bsOnw6NvIGRlIERpc3RyaWJ1acOnw6NvIEVtcMOtcmljYSoqDQoNCk5hIGZpZ3VyYSBhYmFpeG8gbW9zdHJhLXNlIMOgIGZ1bsOnw6NvIGRlIGRpc3RyaWJ1acOnw6NvIGVtcMOtcmljYSBjb3JyZXNwb25kZW50ZSDDoCBhbW9zdHJhIG9idGlkYSBkYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgUGFkcsOjbyAoMCwxKSBlbnF1YW50cm8gYSBjdXJ2YSB2ZXJtZWxoYSBjb3JyZXNwb25kZSDDoCBkaXN0cml1acOnw6NvIHRlw7NyaWNhIHJlc3BlY3RpdmEuDQoNCg0KYGBge3J9DQpzZXQuc2VlZCgxODM0MCkNCnggPSBybm9ybSg1MCkNCnBhcihtYXI9Yyg0LDIsMSwxKSkNCnBsb3QoZWNkZih4KSwgDQogICAgIHhsaW0gPSByYW5nZShjKC0zLCAzKSksIA0KICAgICBtYWluID0gIiIsIA0KICAgICB5bGFiPSIiKQ0KdGV4dCgwLDAuOCxleHByZXNzaW9uKEZbbl0oeCkpKQ0KY3VydmUocG5vcm0oeCksIA0KICAgICAgYWRkID0gVFJVRSwgDQogICAgICBjb2wgPSAicmVkIiwgDQogICAgICBsd2QgPSAyKQ0KcnVnKHgpDQpgYGANCg0KDQoNCg0KDQojIyMgKipIaXDDs3Rlc2VzIGRvIFRlc3RlKioNCg0KQXMgSGlww7N0ZXNlcyBkbyB0ZXN0ZSBkZSBrb2xtb2dvcm92LXNtaXJub3Ygc8OjbzoNCg0KJCQNCkhfezB9OiBhIFwgZGlmZXJlbsOnYSBcIGVudHJlIFwgZnJlcXXDqm5jaWFzIFwgb2JzZXJ2YWRhcyBcIGUgXCBlc3BlcmFkYXMgXCDDqSBcIHBlcXVlbmEgXCBvdSBcICBGX3swfShYKSAtIFNfe259KFgpIFxhcHByb3ggMC4gICAgXFwgDQpIX3sxfTogQ2FzbyBcIENvbnRyw6FyaW8uDQokJA0KDQojIyMgKipOw612ZWwgZGUgU2lnbmlmaWPDom5jaWEgZG8gVGVzdGUqKg0KDQpFc2NvbGhhIGRlIHVtIG7DrXZlbCBkZSBhICRcYWxwaGEgPSAwLjA1JCBvdSAkXGFscGhhID0gMC4wMSQsIHNlbmRvIHRlc3RlIGRlIG5hdHVyZXphIGJpY2F1ZGFsLg0KDQojIyMgKipSZWdyYSBkZSBEZWNpc8OjbyBkbyBUZXN0ZSoqDQoNCk9ic2VydmFuZG8gbyAkcC12YWxvciQgbWFpb3IgcXVlICQwLjA1JCwgY29uY2x1w60tc2UgcXVlICRcdGV4dGJme07Do299JCBow6EgZXZpZMOqbmNpYXMgcGFyYSBSZWplaXRhciAkSF97MH0kLCBjYXNvIGNvbnRyw6FyaW8sIHNlIG8gJHAtdmFsb3IkIHNlamEgbWVub3IgcXVlICQwLjA1JC4NCg0KDQoNCk8gdGVzdGUgZGUga29sbW9nb3Jvdi1zbWlybm92IHBvZGUgc2VyIGFwbGljYWRvIHV0aWxpemFuZG8gYSBmdW7Dp8OjbyAqKmtzLnRlc3QoKSoqIGRvICoqcGFjb3RlIHN0YXRzKiogZG8gc29mdHdhcmUgKipSXF97NC4zLjJ9KiogdmVyc8OjbyB3aW5kb3dzLg0KDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KDQoNCiMjICoqVGVzdGUgZGUgU2hhcGlyby1XaWxrKioNCg0Kw4ggdW0gdGVzdGUgZGUgbm9ybWFsaWRhZGUgcHVibGljYWRvIGVtIDE5NjUgcG9yICoqU2FtdWVsIFNhbmZvcmQgU2hhcGlybyoqIGUgKipNYXJ0aW4gV2lsayoqIGUgc2UgYmFzZWlhIG5hIHJlZ3Jlc3PDo28gZG9zIHZhbG9yZXMgYW1vc3RyYWlzIG9yZGVuYWRvcyBjb20gYXMgY29ycmVzcG9uZGVudGVzIGVzdGF0w61zdGljYXMgZGUgc2VpcyBvcmRlbnMgbm9ybWFpcyBxdWUsIHBhcmEgdW1hIGFtb3N0cmEgZGUgdW1hIHBvcHVsYcOnw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kYSwgw6kgbGluZWFyIChST1lTVE9OLCAxOTgyKS4NCg0KIyMjICoqU2FtdWVsIFNhbmZvcmQgU2hhcGlybyoqICFbXShpbWFnZXMvc2hhcGlyby5qcGcpe3dpZHRoPSIzMiJ9DQoNClNhbXVlbCBuYXNjZXUgbmEgY2lkYWRlIGRlIE5vdmEgWW9yayAsIFNoYXBpcm8gZm9ybW91LXNlIGVtIGVzdGF0w61zdGljYSBubyAqKkNpdHkgQ29sbGVnZSBvZiBOZXcgWW9yayoqIGVtIDE5NTIsIGUgZmV6IG1lc3RyYWRvIGVtIGVuZ2VuaGFyaWEgaW5kdXN0cmlhbCBuYSAqKlVuaXZlcnNpZGFkZSBkZSBDb2x1bWJpYSoqIGVtIDE5NTQuIEVsZSBzZXJ2aXUgYnJldmVtZW50ZSBjb21vIGVzdGF0w61zdGljbyBubyBDb3JwbyBRdcOtbWljbyBkbyBFeMOpcmNpdG8gZG9zIEVVQSwgYW50ZXMgZGUgb2J0ZXIgdW0gbWVzdHJhZG8gKDE5NjApIGUgdW0gZG91dG9yYWRvICgxOTYzKSBlbSBlc3RhdMOtc3RpY2EgbmEgKipSdXRnZXJzIFVuaXZlcnNpdHkqKi4gRW0gMTk3MiBpbmdyZXNzb3Ugbm8gY29ycG8gZG9jZW50ZSBkYSAqKkZsb3JpZGEgSW50ZXJuYXRpb25hbCBVbml2ZXJzaXR5KiouDQoNCiMjIyAqKk1hcnRpbiBCcmFkYnVyeSBXaWxrKiogIVtdKGltYWdlcy9NYXJ0aW5fV2lsay5qcGcpe3dpZHRoPSIzMiJ9DQoNCk1hcnRpbiBuYXNjZXUgZW0gTW9udHJlYWwsIFF1ZWJlYywgZWxlIHJlY2ViZXUgbyBkaXBsb21hIGRlIGJhY2hhcmVsIGVtIGVuZ2VuaGFyaWEgcXXDrW1pY2EgcGVsYSAqKlVuaXZlcnNpZGFkZSBNY0dpbGwqKiBlbSAxOTQ1LiBEdXJhbnRlIG8gcGVyw61vZG8gZGUgMTk1MSBhIDE5NTUsIG9idGV2ZSBvIHTDrXR1bG8gZGUgbWVzdHJhZG8gZSBkb3V0b3JhZG8gZW0gZXN0YXTDrXN0aWNhIHBlbGEgKipJb3dhIFN0YXRlIFVuaXZlcnNpdHkqKi4NCg0KTyB0ZXN0ZSBkZSBTaGFwaXJvLVdpbGsgdGVzdGEgYSBoaXDDs3Rlc2UgbnVsYSBkZSBxdWUgdW1hIGFtb3N0cmEgJHhfezF9LCBcbGRvdHMsIHhfe259JCB2ZWlvIGRlIHVtYSBwb3B1bGHDp8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZGEuIEEgZXN0YXTDrXN0aWNhIGRlIHRlc3RlIMOpOg0KDQokJCBXID0gXGZyYWN7KFxzdW1fe2k9MX1ee259IGFfe2l9eF97aX0pXnsyfX17XHN1bV97aT0xfV57bn0oeF97aX0tXGJhcnt4fSleezJ9fSQkDQoNCk8gdGVzdGUgZGUgc2hhcGlyby13aWxrIHBvZGUgc2VyIGFwbGljYWRvIHV0aWxpemFuZG8gYSBmdW7Dp8OjbyAqKnNoYXBpcm8udGVzdCgpKiogZG8gKipwYWNvdGUgc3RhdHMqKiBkbyBzb2Z0d2FyZSAqKlJcX3s0LjMuMn0qKiB2ZXJzw6NvIHdpbmRvd3MuDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KIyMgKipUZXN0ZSBkZSBKYXJxdWUtQmVyYSoqIA0KDQrDiCB1bSB0ZXN0ZSBkZSBxdWFsaWRhZGUgZGUgYWp1c3RlIHBhcmEgdmVyaWZpY2FyIHNlIG9zIGRhZG9zIGRhIGFtb3N0cmEgdMOqbSBhc3NpbWV0cmlhIGUgY3VydG9zZSBjb3JyZXNwb25kZW50ZXMgYSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsIC4gQSBwcm92YSBsZXZhIG8gbm9tZSBkZSAqKkNhcmxvcyBNLiBKYXJxdWUgVXJpYmUqKiBlICoqQW5pbCBLLiBCZXJhKiouIEEgZXN0YXTDrXN0aWNhIGRlIHRlc3RlIMOpIHNlbXByZSBuw6NvIG5lZ2F0aXZhLiBTZSBlc3RpdmVyIGxvbmdlIGRlIHplcm8sIHNpbmFsaXphIHF1ZSBvcyBkYWRvcyBuw6NvIHTDqm0gZGlzdHJpYnVpw6fDo28gbm9ybWFsLg0KDQoNCiMjIyAqKkNhcmxvcyBNLiBKYXJxdWUgVXJpYmUqKiAhW10oaW1hZ2VzL0phcnF1ZV9VcmliZS5qcGcpe3dpZHRoPSIzMiIgaGVpZ2h0PSI0MiJ9DQoNCkNhcmxvcyBKYXJxdWUgKG5hc2NpZG8gZW0gMTggZGUgb3V0dWJybyBkZSAxOTU0IG5hIENpZGFkZSBkbyBNw6l4aWNvKSDDqSB1bSBlY29ub21pc3RhIG1leGljYW5vLCBhdHVhbG1lbnRlIERpcmV0b3IgRXhlY3V0aXZvIGRhIEFtw6lyaWNhIE3Ds3ZpbCBlIE1lbWJybyBkbyBDb25zZWxobyBkbyBHcnVwbyBMw61kZXIgR2xvYmFsIGVtIFNlcnZpw6dvcyBhbyBDaWRhZMOjbyBGQ0MgKEZvbWVudG8gZGUgQ29uc3RydWNjaW9uZXMgeSBDb250cmF0YXMpLiBUZXZlIHVtYSBjYXJyZWlyYSBkZXN0YWNhZGEgbm8gc2VjdG9yIHByaXZhZG8sIG5hIGZ1bsOnw6NvIHDDumJsaWNhIChuYWNpb25hbCBlIG11bHRpbGF0ZXJhbCkgZSBubyBtdW5kbyBhY2Fkw6ltaWNvLg0KDQpKYXJxdWUgw6kgZm9ybWFkbyBlbSBDacOqbmNpYXMgQXR1YXJpYWlzIHBlbGEgKipVbml2ZXJzaWRhZGUgQW5haHVhYyoqLCBuYSBDaWRhZGUgZG8gTcOpeGljby4gRWxlIHRlbSBQw7NzLUdyYWR1YcOnw6NvIGVtIEVzdGF0w61zdGljYSBlIE1lc3RyYWRvIGVtIEVjb25vbWV0cmlhIHBlbGEgKipMb25kb24gU2Nob29sIG9mIEVjb25vbWljcyoqOyBDZXJ0aWZpY2FkbyBkZSBQw7NzLUdyYWR1YcOnw6NvIGVtIFBvbMOtdGljYSBFY29uw7RtaWNhIGUgUGxhbmVhbWVudG8gVXJiYW5vIGUgUmVnaW9uYWwgcGVsYSBVbml2ZXJzaWRhZGUgZGUgT3NsbzsgRG91dG9yYWRvIGVtIEVjb25vbWlhIChQaC5EKSBwZWxhICoqQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5Kio7IGUgcMOzcy1kb3V0b3JhZG8gZW0gRWNvbm9taWEgcGVsYSAqKlVuaXZlcnNpZGFkZSBkZSBIYXJ2YXJkKiouDQoNCg0KIyMjICoqQW5pbCBLLiBCZXJhKiogIVtdKGltYWdlcy9CZXJhLmpwZyl7d2lkdGg9IjMyIiBoZWlnaHQ9IjMyIn0NCg0KQW5pbCBLLiBCZXJhIChuYXNjaWRvIGVtIDE5NTUpIMOpIHVtIGVjb25vbWV0cmlzdGEgaW5kaWFuby1hbWVyaWNhbm8uIEVsZSDDqSBwcm9mZXNzb3IgZGUgRWNvbm9taWEgbmEgKipVbml2ZXJzaWRhZGUgZGUgSWxsaW5vaXMqKiBubyBEZXBhcnRhbWVudG8gZGUgRWNvbm9taWEgZGUgVXJiYW5hIC0tIENoYW1wYWlnbi4NCg0KQmVyYSBuYXNjZXUgZW0gdW1hIHJlbW90YSB2aWxhIGRlIFBhc2NoaW1jaGFrLCBCZW5nYWxhIE9jaWRlbnRhbCAsIMONbmRpYS4gU2V1IHBhaSBlcmEgdW0gbcOpZGljbyBxdWUgbsOjbyBjb2JyYXZhIGhvbm9yw6FyaW9zIGZvcm1haXMgZGUgc2V1cyBwYWNpZW50ZXMgZSBkZXBlbmRpYSBkZSBjb250cmlidWnDp8O1ZXMgdm9sdW50w6FyaWFzLg0KDQpCZXJhIHJlY2ViZXUgdW0gQmFjaGFyZWxhZG8gZGEgVW5pdmVyc2lkYWRlIGRlIENhbGN1dMOhIGVtIDE5NzUgZW0gRXN0YXTDrXN0aWNhLCBtZXN0cmFkbyBwZWxvIEluZGlhbiBTdGF0aXN0aWNhbCBJbnN0aXR1dGUgZW0gMTk3NyBlbSBFY29ub21ldHJpYSBlIFBsYW5lamFtZW50byAoUHJpbWVpcmEgQ2xhc3NlKSBlIGRvdXRvcmFkby4gZW0gMTk4MyBwZWxhIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eSAoUGhkIEFzcGVjdHMgb2YgRWNvbm9tZXRyaWMgTW9kZWxpbmcpLg0KDQpBIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSBkZSBKYXJxdWUtQmVyIMOpIGRlZmluaWRhIGNvbW86DQoNCiQkIEpCID0gXGZyYWN7bn17Nn0gKFNeezJ9ICsgXGZyYWN7MX17NH0rKEstMyleezJ9KSAkJA0KDQpvbmRlIG4gw6kgbyBuw7ptZXJvIGRlIG9ic2VydmHDp8O1ZXMob3UgZ3JhdXMgZGUgbGliZXJkYWRlIGVtIGdlcmFsKTsgUyDDqSBhIGFzc2ltZXRyaWEgZGEgYW1vc3RyYTsgSyDDqSBhIGN1cnRvc2UgZGEgYW1vc3RyYToNCg0KJCRTPVxmcmFje1xoYXR7XG11X3szfX19e1xoYXR7XHNpZ21hXnszfX19ID0gXGZyYWN7XGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gKHhfe2l9LVxiYXJ7eH0pXnszfX17XGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gKHhfe2l9LVxiYXJ7eH0pXnsyfSlee1xmcmFjezN9ezJ9fX0kJCBlDQoNCiQkIEsgPSBcZnJhY3tcaGF0e1xtdV97NH19fXtcaGF0e1xzaWdtYV57NH19fSA9IFxmcmFje1xmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh4X3tpfS1cYmFye3h9KV57NH19e1xmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh4X3tpfS1cYmFye3h9KV57Mn19JCQNCg0Kb25kZSAkXGhhdHtcbXVfezN9fSQgZSAkXGhhdHtcbXVfezR9fSQgc8OjbyBhcyBlc3RpbWF0aXZhcyBkbyB0ZXJjZWlybyBlIHF1YXJ0byBtb21lbnRvcyBjZW50cmFpcywgcmVzcGVjdGl2YW1lbnRlLCAkXGJhcnt4fSQgw6kgYSBtw6lkaWEgYW1vc3RyYWwgZSAkXGhhdHtcc2lnbWF9XnsyfSQgw6kgYSBlc3RpbWF0aXZhIGRvIHNlZ3VuZG8gbW9tZW50byBjZW50cmFsLCBhIHZhcmnDom5jaWEuDQoNClNlIG9zIGRhZG9zIHZpZXJlbSBkZSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLCBhIGVzdGF0w61zdGljYSBKQiB0ZW0gYXNzaW50b3RpY2FtZW50ZSB1bWEgZGlzdHJpYnVpw6fDo28gcXVpLXF1YWRyYWRvICQoXGNoaV57Mn0pJCBjb20gZG9pcyBncmF1cyBkZSBsaWJlcmRhZGUsIHBvcnRhbnRvIGEgZXN0YXTDrXN0aWNhIHBvZGUgc2VyIHVzYWRhIHBhcmEgdGVzdGFyIGEgaGlww7N0ZXNlIGRlIHF1ZSBvcyBkYWRvcyBzw6NvIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwuDQoNCkVzdGEgZXN0YXTDrXN0aWNhIMOpIHNpbXBsZXMgZSBzZXUgcG9kZXIgc2UgbW9zdHJvdSBjb21wYXLDoXZlbCBhIG91dHJvcyB0ZXN0ZXMgcG9kZXJvc29zLiBPIHRlc3RlIEpCIEVzdGEgcHJvZ3JhbWFkbyBuYSBmdW7Dp8OjbyAqKkphcnF1ZUJlcmFUZXN0KCkqKiBubyAqKnBhY290ZSBEZXNjVG9vbHMqKiBkbyAqKlJcX3s0LjMuMn0qKi4NCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQojICoqTWF0ZXJpYWwgZSBNw6l0b2RvcyoqDQoNCkEgc2ltdWxhw6fDo28gTW9vbnRlIENhcmxvcyBmb2kgdXRpbGl6YWRhIHBhcmEgc2ltdWxhciBhbW9zdHJhcyBub3JtYWlzIHNvYiBhIGhpcMOzdGVzZSBudWxhIGRlIG5vcm1hbGlkYWRlLCAkSF97MH0kLCBwYXJhIGF2YWxpYXIgYXMgdGF4YXMgZGUgZXJybyB0aXBvIEkgZG9zIHRlc3RlcyBlIGFtb3N0cmFzIHNvYiBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSAkSF97MX0kLCBvdSBzZWphLCBkYWRvcyBkZSBkaXN0cmlidWnDp8OjbyBuw6NvIG5vcm1haXMgcGFyYSBhdmFsaWFyIG8gcG9kZXIuDQoNCkVtIGNhZGEgc2l0dWHDp8Ojbywgb3MgdGVzdGVzIGRlIG5vcm1hbGlkYWRlIGZvcmFtIGFwbGljYWRvcyBhbyBuw612ZWwgbm9taW5hbCBkZSBzaWduaWZpY8OibmNpYSBwcsOpLWRlZmluaWRvICRcYWxwaGEkIGNvbSBvIHZhbG9yIGRlIDAuMDUuDQoNClNlIG8gdGVzdGUgcmVqZWl0YSBhIGhpcMOzdGVzZSBudWxhIGUgYSBhbW9zdHJhIMOpIGRhIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCBjb21ldGUtc2UgdW0gZXJybyB0aXBvIEkgZSwgc2UgbsOjbyBmb3Igbm9ybWFsLCB1bWEgZGVjaXPDo28gY29ycmV0YSBmb2kgdG9tYWRhLg0KDQojIyAqKlNpbXVsYcOnw6NvIGUgUG9kZXIgZG9zIFRlc3RlcyoqDQoNCkZvcmFtIGVmZXR1YWRhcyAkTj0xMDAwJCBzaW11bGHDp8O1ZXMgc29iICRIX3swfSQgZSBzb2IgJEhfezF9JC4gQ2FkYSBzaW11bGHDp8OjbyBkZSBjYWRhIGRpc3RyaWJ1acOnw6NvIHByb2R1eml1IGFtb3N0cmFzIGRlIHRhbWFuaG8gJG4kIGUgZXNzZXMgdmFsb3JlcyBmb3JhbTogMTAsMjAsNTAsMTAwLDUwMCBlIDEwMDAuDQoNCk9zIHRlc3RlIGRlIG5vcm1hbGlkYWRlIGZvcmFtIGFwbGljYWRvcyBlbSBjYWRhIHVtYSBkYSAkTiA9IDEwMDAkIGFtb3N0cmFzIGRlIGNhZGEgZGlzdHJpYnVpw6fDo28gc2ltdWxhZGEgZSBhIHByb3BvcsOnw6NvIGRlIHJlamVpw6fDtWVzIGNvcnJldGFzIGRhIGhpcMOzdGVzZSBudWxhIGZvaSBjb21wdXRhZGEuIE9zIHZhbG9yZXMgb2J0aWRvcyByZXByZXNlbnRhbSBvIHBvZGVyIGRvcyB0ZXN0ZXMsIHF1ZSBmb3JhbSBjb21wYXJhZG9zIGVudHJlIHNpLg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCiMgKipSZXN1bHRhZG9zIGUgRGlzY3Vzc8O1ZXMqKg0KDQpPcyByZXN1bHRhZG9zIHNlcsOjbyBhcHJlc2VudGFkb3MgZGUgYWNvcmRvIGNvbSBhcyB0YXhhcyBkZSBlcnJvIHRpcG8gSSwgbmEgc2l0dWHDp8OjbyBkZSBkaXN0cmlidWnDp8OjbyBub3JtYWwsIGUgcG9kZXIsIG5hIHNpdHVhw6fDo28gZGUgb3V0cmFzIGRpc3RyaWJ1acOnw7Vlcy4NCg0KIyMgKipQYWNvdGVzIFV0aWxpemFkb3MqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShEaXN0cmlidXRpb25UZXN0KQ0KbGlicmFyeShtb21lbnRzKQ0KbGlicmFyeShub3J0ZXN0KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGZCYXNpY3MpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCiNsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aW55dGV4KQ0KbGlicmFyeShQdWJsaXNoKQ0KYGBgDQoNCg0KDQoNCg0KIyMgKipTaW11bGHDp8OjbyoqDQoNCg0KYGBge3IgYW1vc3RyYSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVGFtYW5obyBkZSBBbW9zdHJhDQpSZXN1bHRhZG9zIDwtIE5VTEwNCk5OIDwtIDEwDQoNCiMgUmVwZXRpw6fDo28NCmVzY29wbyA8LSBleHBhbmQuZ3JpZCgNCiAgdGFtYW5ob19hbW9zdHJhID0gc2VxKDI1LCAzMCwgNSksDQogIHJlcGV0aWNhbyA9IHNlcSgxLCBOTikNCikNCg0KUmVzdWx0YWRvcyA8LSBwdXJycjo6bWFwMl9kZnIoZXNjb3BvJHRhbWFuaG9fYW1vc3RyYSxlc2NvcG8kcmVwZXRpY2FvLCBmdW5jdGlvbih0YW1hbmhvX2Ftb3N0cmEsIGlpKXsNCiAgcHJpbnQocGFzdGUwKHRhbWFuaG9fYW1vc3RyYSwgIi0iLCBpaSkpDQogICN4IDwtcmNhdWNoeSh0YW1hbmhvX2Ftb3N0cmEsIDAsMSkNCiAgeCA8LXJub3JtKHRhbWFuaG9fYW1vc3RyYSwgMCwxKQ0KICAjeCA8LSByZ2FtbWEodGFtYW5ob19hbW9zdHJhLCBzaGFwZSA9IDEwLCByYXRlID0gMS8xMCkNCiAgdGliYmxlKA0KICAgIEtvbG1vZ29yb3ZfU21pcm5vdiA9IGtzLnRlc3QoeCwgcG5vcm0sIG1lYW4oeCksIHNkKHgpKSRwLnZhbHVlLA0KICAgIEphcnF1ZV9CZXJhID0gSmFycXVlQmVyYVRlc3QoeCkkcC52YWx1ZSwNCiAgICBBbmRlcnNvbl9EYXJsaW5nID0gQW5kZXJzb25EYXJsaW5nVGVzdCh4LCBudWxsID0gInBub3JtIiwgbWVhbih4KSwgc2QoeCkpJHAudmFsdWUsDQogICAgTGlsbGllZm9ycyA9IExpbGxpZVRlc3QoeCkkcC52YWx1ZSwNCiAgICBTaGFwaXJvX1dpbGsgPSBzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSwNCiAgICBDcmFtZXJfVm9uX01pc2VzID0gY3ZtLnRlc3QoeCkkcC52YWx1ZSwNCiAgICBEX0Fnb3N0aW5vID0gYWdvc3Rpbm8udGVzdCh4KSRwLnZhbHVlLA0KICAgIFpLID0gemsudGVzdCh4LCAnbm9ybScpJHAudmFsdWUsDQogICAgWkMgPSB6Yy50ZXN0KHgsICdub3JtJykkcC52YWx1ZSwNCiAgICBaQSA9IHphLnRlc3QoeCwgJ25vcm0nKSRwLnZhbHVlLA0KICAgIGFtb3N0cmEgPSB0YW1hbmhvX2Ftb3N0cmEsDQogICAgdGVudGF0aXZhID0gaWkNCiAgKQ0KfQ0KKQ0KYGBgDQoNCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQoNCg0KIyMgKipDb21wYXJhw6fDo28gZG8gUC12YWxvcioqDQoNCg0KYGBge3IgY29tcGFyYWNhbywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClJlc3VsdGFkb3MgfD4NCiAgdGlkeXI6OnBpdm90X2xvbmdlcigNCiAgICBuYW1lc190byA9ICJtb2RlbG8iLA0KICAgIHZhbHVlc190byA9ICJlc3RhdGlzdGljYSIsDQogICAgY29scyA9IGMoS29sbW9nb3Jvdl9TbWlybm92LA0KICAgICAgICAgICAgIEphcnF1ZV9CZXJhLA0KICAgICAgICAgICAgIEFuZGVyc29uX0RhcmxpbmcsDQogICAgICAgICAgICAgTGlsbGllZm9ycywNCiAgICAgICAgICAgICBTaGFwaXJvX1dpbGssDQogICAgICAgICAgICAgQ3JhbWVyX1Zvbl9NaXNlcywNCiAgICAgICAgICAgICBEX0Fnb3N0aW5vLA0KICAgICAgICAgICAgIFpLLA0KICAgICAgICAgICAgIFpDLA0KICAgICAgICAgICAgIFpBKSl8Pg0KICBncm91cF9ieShhbW9zdHJhLCBtb2RlbG8pfD4NCiAgc3VtbWFyaXNlKA0KICAgIG1pbmltbyA9IG1pbihlc3RhdGlzdGljYSksDQogICAgbWVkaWFuYSA9IG1lYW4oZXN0YXRpc3RpY2EpLA0KICAgIG1heGltbyA9IG1lZGlhbihlc3RhdGlzdGljYSkrc2QoZXN0YXRpc3RpY2EpKXw+DQogIGdncGxvdChhZXMoeCA9IGFtb3N0cmEsIHkgPSBtZWRpYW5hLCB5bWluID0gbWluaW1vLCB5bWF4ID0gIG1heGltbywgDQogICAgICAgICAgICAgY29sb3IgPSBtb2RlbG8pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21faml0dGVyKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2d0aXRsZSgiQ29tcGFyYcOnw6NvIGRvIFAtdmFsb3IgTcOpZGlvIikrDQogIHRoZW1lX2J3KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoMCwxKSkrDQogIGxhYnMoeCA9ICJUYW1hbmhvIEFtb3N0cmFsIiwgDQogICAgICAgeSA9ICJFcnJvIFRpcG8gSSIsIA0KICAgICAgIGNvbG9yID0gIlRpcG9zIGRlIFRlc3RlcyIpDQpgYGANCg0KDQoNCg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCg0KDQojIyAqKlBvZGVyIGRvIFRlc3RlKioNCg0KQSBmaWd1cmEgMiBFc3TDo28gYXByZXNlbnRhZG9zIG9zIHZhbG9yZXMgZGUgcG9kZXIgcGFyYSBvcyBvaXRvIHRlc3RlcyBlbSBmdW7Dp8OjbyBkbyB0YW1hbmhvIGRhIGFtb3N0cmEgbiBwYXJhIGRpc3RyaWJ1acOnw6NvIGdhbW1hLg0KDQoNCg0KYGBge3IgcG9kZXIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpSZXN1bHRhZG9zIHw+DQogIHRpZHlyOjpwaXZvdF9sb25nZXIoDQogICAgbmFtZXNfdG8gPSAibW9kZWxvIiwNCiAgICB2YWx1ZXNfdG8gPSAiZXN0YXRpc3RpY2EiLA0KICAgIGNvbHMgPSBjKEtvbG1vZ29yb3ZfU21pcm5vdiwNCiAgICAgICAgICAgICBKYXJxdWVfQmVyYSwNCiAgICAgICAgICAgICBBbmRlcnNvbl9EYXJsaW5nLA0KICAgICAgICAgICAgIExpbGxpZWZvcnMsDQogICAgICAgICAgICAgU2hhcGlyb19XaWxrLA0KICAgICAgICAgICAgIENyYW1lcl9Wb25fTWlzZXMsDQogICAgICAgICAgICAgRF9BZ29zdGlubywNCiAgICAgICAgICAgICBaSywNCiAgICAgICAgICAgICBaQywNCiAgICAgICAgICAgICBaQSkpfD4NCiAgZ3JvdXBfYnkoYW1vc3RyYSwgbW9kZWxvKXw+DQogIHN1bW1hcmlzZSgNCiAgICBtaW5pbW8gPSBtaW4oZXN0YXRpc3RpY2EpLA0KICAgIG1lZGlhbmEgPSBtZWFuKGVzdGF0aXN0aWNhIDwgLjA1KSwNCiAgICBtYXhpbW8gPSBtZWRpYW4oZXN0YXRpc3RpY2EpK3NkKGVzdGF0aXN0aWNhKSl8Pg0KICBnZ3Bsb3QoYWVzKHggPSBhbW9zdHJhLCB5ID0gbWVkaWFuYSwgeW1pbiA9IG1pbmltbywgeW1heCA9ICBtYXhpbW8sIGNvbG9yID0gbW9kZWxvKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX2ppdHRlcigpKw0KICBnZW9tX3BvaW50KCkrDQogIGdndGl0bGUoIkNvbXBhcmHDp8OjbyBkbyBQb2RlciBkbyBUZXN0ZSIsIHN1YnRpdGxlID0gIlNpbXVsYcOnw6NvIikrDQogIHRoZW1lX2J3KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoMCwxKSkrDQogIGxhYnMoeCA9ICJUYW1hbmhvIEFtb3N0cmFsIiwgDQogICAgICAgeSA9ICJQb2RlciBkbyBUZXN0ZSIsIA0KICAgICAgIGNvbG9yID0gIlRpcG9zIGRlIFRlc3RlcyIpDQpgYGANCg0KDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KDQoNCg0KDQojICoqUmVmZXLDqm5jaWFzIEJpYmxpb2dyw6FmaWNhcyoqDQoNCkFOREVSU09OLCBULiBXLjsgREFSTElORywgRC4gQS4gQSB0ZXN0IG9mIGdvb2RuZXNzIG9mIHQuSm91cm5hbCBvZiBBbWVyaWNhblN0YXRpc3RpY2FsIEFzc29jaWF0aW9uLCB2LjQ5LCBwLiA3NjUtNzY5LCAxOTU0Lg0KDQpEYEFHT1NUSU5PLCBSLiBCLiBUcmFuc2Zvcm1hdGlvbiB0byBOb21hbGl0eSBvZiB0aGUgTnVsbCBEaXN0cmlidXRpb24gb2YgRzEuQmlvbWUtdHJpa2EsIHYuNTcsIG4uMywgcC42NzktNjgxLCAxOTcwDQoNCkphcnF1ZSBDTSwgQmVyYSBBSyAoMTk4NykuIOKAnEEgVGVzdCBmb3IgTm9ybWFsaXR5IG9mIE9ic2VydmF0aW9ucyBhbmQgUmVncmVzc2lvbiBSZXNpZHVhbHMu4oCdIEludGVybmF0aW9uYWwgU3RhdGlzdGljYWwgUmV2aWV3LiBSZXZ1ZSBJbnRlcm5hdGlvbmFsIGRlIFN0YXRpc3RpcXVlLCA1NSgyKSwgMTYz4oCTMTcyLg0KZG9pOjEwLjIzMDcvMTQwMzE5Mi4NCg0KS29sbW9nb3JvdiwgQS4sIFN1bGxhIGRldGVybWluYXppb25lIGVtcGlyaWNhIGRpIHVuYSBsZWdnZSBkaSBkaXN0cmlidXRpb25lLA0KR2lvcm5hbGUgZGVsbOKAmSBJc3RpdHV0byBJdGFsaWFubyBkZWdsaSBBdHR1YXJpIDQgKDE5MzMpLCA4M+KAkzkxLg0KDQpMSUxMSUVGT1JTLCBILiBXLiBPbiB0aGUgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgZm9yIG5vcm1hbGl0eSB3aXRoIG1lYW4gYW5kIHZhcmktYW5jZSB1bmtub3duLkpvdXJuYWwgb2YgQW1lcmljYW4gU3RhdGlzdGljYWwgQXNzb2NpYXRpb24sIHYuNjIsIHAuNTM0LTU0NCwgMTk2Ny4NCg0KU0hBUElSTywgUy4gUy47IFdJTEssIE0uIEIuIEFuIGFuYWx5c2lzIG9mIHZhcmlhbmNlIHRlc3QgZm9yIG5vcm1hbGl0eSAoY29tcGxldGUgc2FtLXBsZXMpLkJpb21ldHJpa2EsIHYuNTIsIHAuIDU5MS02MTEsIDE5NjUuDQoNCg0KWmhhbmcgSiAoMjAwMikuIOKAnFBvd2VyZnVsIEdvb2RuZXNzLW9mLUZpdCBUZXN0cyBCYXNlZCBvbiB0aGUgTGlrZWxpaG9vZCBSYXRpby7igJ0gSm91cm5hbCBvZg0KdGhlIFJveWFsIFN0YXRpc3RpY2FsIFNvY2lldHkgQiwgNjQoMiksIDI4MeKAkzI5NC4gZG9pOjEwLjExMTEvMTQ2Ny05ODY4LjAwMzM3Lg0KDQoNCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=