Introdução
Este trabalho tem como objetivo explorar e analisar o conjunto de
dados “Abortion” do pacote ltm, contendo itens
de um instrumento de medida associado a um traço latente. A análise será
conduzida com base na Teoria de Resposta ao Item (TRI), uma abordagem
estatística amplamente utilizada para modelar a relação entre as
respostas dos participantes e o traço latente subjacente.
Posteriormente, procederemos com a calibração dos itens, utilizando o
modelo TRI mais adequado. A escolha deste modelo será fundamentada em
evidências estatísticas, considerando critérios como ajuste do modelo
aos dados e robustez estatística e partir do modelo escolhido, será
estimado o traço latente de cada indivíduo.
No ínicio, os dados consistiam nas respostas em 1986
a 7 questões relacionadas à atitude em relação ao aborto por membros de
um painel pesquisado em cada um dos anos de 1983 a 1986, como parte de
uma investigação das atitudes sociais britânicas (ver McGrath &
Waterton, 1986). Para cada questão, os entrevistados foram questionados
se a lei deveria permitir o aborto. Porém, no banco de
dados “Abortion” do pacote ltm, 3 questões
foram retiradas resultando em um banco com 4 variáveis.
Além disso, o banco continha no total 410 observações entretanto um
pequeno número de indivíduos (31) não respondeu algumas das 4 questões e
portanto essas observações foram deletadas resultando num banco com 379
observações.
VARIÁVEL LATENTE:
Percepção em relação a
aprovação do aborto pela lei.
QUESTÕES
(1) The woman decides on her own she does not wish
to have the child.
(2) The couple agree they do not wish to have the
child.
(3) The woman is not married and does not wish to
marry thp man.
(4) The couple cannot afford any more children.
Ao todo, temos 379 observações,

str(banco_abortion)
## 'data.frame': 379 obs. of 4 variables:
## $ Item 1: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
## $ Item 2: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
## $ Item 3: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
## $ Item 4: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
Matriz de Correlação
Foi utilizada neste caso a
correlação tetracórica já que tem presença de variáveis categóricas
binárias (dummies).

As correlações mais fortes (0.90) foram entre
Item1 e Item 2 de um lado e entre
Item 3 e Item 4 do outro .
Cálculo dos autovalores:
round(eigen(correlacao$rho)$values,2)
## [1] 3.57 0.26 0.10 0.07
Cálculo da proporção explicada por cada fator:
proporcao_explicacao<-eigen(correlacao$rho)$values/
sum(eigen(correlacao$rho)$values)
proporcao_explicacao
## [1] 0.89310395 0.06476400 0.02417373 0.01795831
Olhando as saídas que obtivemos dos códigos acima podemos dizer que
temos um único fator para esses 4 itens.
desc <- descript(Abortion)
desc
##
## Descriptive statistics for the 'Abortion' data-set
##
## Sample:
## 4 items and 379 sample units; 0 missing values
##
## Proportions for each level of response:
## 0 1 logit
## Item 1 0.5620 0.4380 -0.2493
## Item 2 0.4063 0.5937 0.3791
## Item 3 0.3641 0.6359 0.5575
## Item 4 0.3826 0.6174 0.4786
##
##
## Frequencies of total scores:
## 0 1 2 3 4
## Freq 103 33 37 65 141
##
##
## Point Biserial correlation with Total Score:
## Included Excluded
## Item 1 0.8164 0.6673
## Item 2 0.8674 0.7541
## Item 3 0.8769 0.7737
## Item 4 0.8355 0.7025
##
##
## Cronbach's alpha:
## value
## All Items 0.8707
## Excluding Item 1 0.8573
## Excluding Item 2 0.8223
## Excluding Item 3 0.8148
## Excluding Item 4 0.8430
##
##
## Pairwise Associations:
## Item i Item j p.value
## 1 1 4 <2e-16
## 2 1 3 <2e-16
## 3 2 4 <2e-16
## 4 1 2 <2e-16
## 5 2 3 <2e-16
## 6 3 4 <2e-16
Com essa função se tem o alpha de cronbach que vai informar sobre o
fato de um item prejudicar a consistencia interna do modelo
Resultado
1: Podemos observar que teve mais indivíduos que
aprovaram o aborto diante da circunstância do item 3 (0
= 0,3641 vs 1 = 0,6359) do que diante da circunstância dos outros
itens.
Resultado
2: Podemos observar que teve mais indivíduos que
aprovaram o aborto diante de todas as circunstâncias dos 4 itens (um
total de 141 pessoas).
Resultado
3: Podemos observar que a correlação ponto bisserial de
cada item com o Escore Total quando o item em evidência não está
incluído no cálculo do Escore Total ficou menor do que a correlação
ponto bisserial de cada item com o Escore Total quando o item em
evidência está incluído no cáclulo do Escore Total.
Resultado
4: Podemos observar pelos alphas de Cronbach (todos
menores que 0,8707) que nenhum item parece prejudicar a consistência
interna do modelo.
Resultado
5: Podemos concluir pelos p-valores que
há dependência entre os pares de itens.
Modelo de Rasch
Aqui foi utilizado como discriminante o valor
1,702 para ter resultados semelhantes ao
da função ogiva normal com qual
trabalhavam os pioneiros da TRI
fit.Abortion<-rasch(banco_abortion,constraint=cbind(ncol(banco_abortion)+1,1.702))
summary(fit.Abortion)
##
## Call:
## rasch(data = banco_abortion, constraint = cbind(ncol(banco_abortion) +
## 1, 1.702))
##
## Model Summary:
## log.Lik AIC BIC
## -771.3321 1550.664 1566.414
##
## Coefficients:
## value std.err z.vals
## Dffclt.Item 1 0.2702 0.0952 2.8380
## Dffclt.Item 2 -0.3586 0.0965 -3.7162
## Dffclt.Item 3 -0.5372 0.0979 -5.4898
## Dffclt.Item 4 -0.4584 0.0972 -4.7153
## Dscrmn 1.7020 NA NA
##
## Integration:
## method: Gauss-Hermite
## quadrature points: 21
##
## Optimization:
## Convergence: 0
## max(|grad|): 9.7e-05
## quasi-Newton: BFGS
Ordenando os resultados do parâmetro de ‘dificuldade’
coef(fit.Abortion, prob = TRUE, order = TRUE)
## Dffclt Dscrmn P(x=1|z=0)
## Item 3 -0.5372455 1.702 0.7138980
## Item 4 -0.4583559 1.702 0.6857064
## Item 2 -0.3586260 1.702 0.6480278
## Item 1 0.2701994 1.702 0.3870144
Olhando os resultados encontrados após implementação desse modelo de
Rasch, o item mais grave (mais difícil) é o
item 1.
Desse modo, também podemos interpretar que vai ser maior a aptidão
exigida para que o indivíduo tenha 50% de chance de
aprovar o aborto diante da situação do item 1.
Outra interpretação seria: os indivíduos que apresentam um traço
latente de ‘0,27’ acima da média terão probabilidade de aprovar o aborto
diante da situação do item 1 igual a 0,5.
Informação do teste
information(fit.Abortion, c(-4,4))
##
## Call:
## rasch(data = banco_abortion, constraint = cbind(ncol(banco_abortion) +
## 1, 1.702))
##
## Total Information = 6.81
## Information in (-4, 4) = 6.79 (99.72%)
## Based on all the items
Information in (-4, 4) = 6,79 (99,72%). Isso quer dizer que quase
100% dos traços latentes ficaram no intervalo (-4, 4).
Curva Característica do item
plot(fit.Abortion,legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", main="Curva Característica do item",col = rep(1:4, 2), lwd = 2, cex = 1.2)
abline(h=0.5, lty="dashed",lwd=2)

O gráfico acima mostra como a probabilidade de resposta correta varia
em função da habilidade do respondente.
Modelo Logístico de 2 Parâmetros
fit.Abortion_2param <- ltm(banco_abortion ~ z1)
summary(fit.Abortion_2param)
##
## Call:
## ltm(formula = banco_abortion ~ z1)
##
## Model Summary:
## log.Lik AIC BIC
## -706.3369 1428.674 1460.174
##
## Coefficients:
## value std.err z.vals
## Dffclt.Item 1 0.1697 0.0659 2.5749
## Dffclt.Item 2 -0.2362 0.0618 -3.8198
## Dffclt.Item 3 -0.3428 0.0671 -5.1062
## Dffclt.Item 4 -0.3165 0.0654 -4.8411
## Dscrmn.Item 1 4.4532 1.0245 4.3468
## Dscrmn.Item 2 4.3226 0.6824 6.3340
## Dscrmn.Item 3 5.6639 0.9957 5.6883
## Dscrmn.Item 4 3.6254 0.5570 6.5087
##
## Integration:
## method: Gauss-Hermite
## quadrature points: 21
##
## Optimization:
## Convergence: 0
## max(|grad|): 0.0039
## quasi-Newton: BFGS
coef(fit.Abortion_2param, prob = TRUE, order = TRUE)
## Dffclt Dscrmn P(x=1|z=0)
## Item 3 -0.3428040 5.663928 0.8745297
## Item 4 -0.3164814 3.625383 0.7590295
## Item 2 -0.2362298 4.322628 0.7351934
## Item 1 0.1696615 4.453179 0.3196169
Podemos ver que assim como no modelo de Rasch, o item
3 foi o que apresentou a menor dificuldade além de ter a
maior capacidade de discriminação, enquanto que o item
1 foi considerado o mais difícil.
information(fit.Abortion_2param, c(-4,4))
##
## Call:
## ltm(formula = banco_abortion ~ z1)
##
## Total Information = 18.07
## Information in (-4, 4) = 18.07 (100%)
## Based on all the items
O modelo apresentou uma Informação Total de 18.07, muito maior se
comparada ao modelo de Rasch (6.81). Além disso, Information in (-4, 4)
indica que este valor (18.07) representa a informação contida na faixa
de habilidade entre -4 e 4. O fato de a informação dentro da faixa de
habilidade específica ser 100% do total indica que a maior parte da
informação relevante está contida nessa faixa. Isso sugere que o modelo
é bastante preciso em estimar habilidades dentro desse intervalo
específico.
Curva Característica do Item
plot(fit.Abortion_2param, legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", col = rep(1:4, 2), lwd = 2, cex = 1.2, main="Curva Característica do Item")
abline(h=0.5, lty="dashed",lwd=2)
O gráfico acima mostra como a probabilidade de aprovação do aborto varia
em função da habilidade do respondente.
Modelo Logístico de 3 Parâmetros
fit.Abortion_3param <- tpm(banco_abortion)
summary(fit.Abortion_3param)
##
## Call:
## tpm(data = banco_abortion)
##
## Model Summary:
## log.Lik AIC BIC
## -706.292 1436.584 1483.835
##
## Coefficients:
## value std.err z.vals
## Gussng.Item 1 0.0000 0.0006 0.0154
## Gussng.Item 2 0.0390 0.1132 0.3447
## Gussng.Item 3 0.0000 0.0001 0.0009
## Gussng.Item 4 0.0000 0.0000 0.0002
## Dffclt.Item 1 0.1719 0.0659 2.6078
## Dffclt.Item 2 -0.1713 0.2172 -0.7884
## Dffclt.Item 3 -0.3361 0.0690 -4.8718
## Dffclt.Item 4 -0.3112 0.0661 -4.7086
## Dscrmn.Item 1 4.4876 1.0337 4.3411
## Dscrmn.Item 2 5.3638 4.8697 1.1015
## Dscrmn.Item 3 5.6622 0.9939 5.6969
## Dscrmn.Item 4 3.6449 0.5644 6.4585
##
## Integration:
## method: Gauss-Hermite
## quadrature points: 21
##
## Optimization:
## Optimizer: optim (BFGS)
## Convergence: 0
## max(|grad|): 0.0033
coef(fit.Abortion_3param, prob = TRUE, order = TRUE)
## Gussng Dffclt Dscrmn P(x=1|z=0)
## Item 3 1.224925e-07 -0.3361170 5.662157 0.8702473
## Item 4 2.586972e-09 -0.3111613 3.644916 0.7566052
## Item 2 3.901043e-02 -0.1712674 5.363785 0.7258924
## Item 1 8.973992e-06 0.1718710 4.487565 0.3162079
Por um lado, podemos ver que assim como no modelo de Rasch e no
modelo de 2 parâmetros, o item3 foi o que
apresentou a menor dificuldade além de ter a maior capacidade de
discriminação, enquanto que o item1 foi
considerado o mais difícil. Por outro lado o modelo Logístico de 3
Parâmetros adiciona um terceiro parâmetro que representa o efeito de
adivinhação (acerto casual). No nosso caso este parâmetro reflete a
probabilidade de um respondente com percepção em relação ao aborto muito
baixa ainda aprovar o aborto ao acaso. Podemos ver que nesse caso de
estudo não há a presença de “chute”, visto que não estamos medindo uma
habilidade específica. Os resultados corroboram essa conclusão, já que o
único coeficiente de “advinhação” acima de 0 foi o item 2 com
um valor de 0,039.
Curva Característica do Item
plot(fit.Abortion_3param, legend = TRUE, pch = rep(1:2, each = 4),ylab="Probabilidade de aprovação do aborto", xlab = "Percepção em relação ao Aborto", main="Curva Característica do Item", col = rep(1:4, 2), lwd = 2, cex = 1.2)
abline(h=0.5, lty="dashed",lwd=2)

O gráfico acima mostra como a probabilidade de aprovação do aborto
varia em função da habilidade do respondente.
Escolhendo o melhor modelo
Modelo de Rasch vs Modelo de 2
parâmetros
anova(fit.Abortion,fit.Abortion_2param)
##
## Likelihood Ratio Table
## AIC BIC log.Lik LRT df p.value
## fit.Abortion 1550.66 1566.41 -771.33
## fit.Abortion_2param 1428.67 1460.17 -706.34 129.99 4 <0.001
Modelo de 2 parâmetros vs
Modelo de 3 parâmetros
anova(fit.Abortion_2param,fit.Abortion_3param)
##
## Likelihood Ratio Table
## AIC BIC log.Lik LRT df p.value
## fit.Abortion_2param 1428.67 1460.17 -706.34
## fit.Abortion_3param 1436.58 1483.83 -706.29 0.09 4 0.999
Pelo resultado do teste da razão de verossimilhança para modelos
encaixados, podemos ver que o modelo logístico de 2 parâmetros
apresentou o menor AIC, logo, concluímos que este modelo é o que melhor
se ajusta aos dados em comparação ao Modelo de Rasch. Posteriormente
iremos compará-lo com o modelo logístico de 3 parâmetros.
Pelos resultados dos testes da razão de verossimilhança para modelos
encaixados, podemos ver que o modelo logístico de 2 parâmetros
apresentou o menor AIC e BIC, logo, concluímos que este modelo é o que
melhor se ajusta aos dados. Também olhando os valores-p, chegamos na
mesma conclusão.
Estimação do Traço Latente
O traço latente foi
estimado a partir do modelo de 2 parâmetros.
teta2param_abortion = ltm::factor.scores(fit.Abortion_2param, resp.patterns=banco_abortion)
banco_DT = round(teta2param_abortion$score.dat, 4)
datatable(banco_DT, rownames = T)
Descrição completa do traço latente estimado
hist(banco_DT$z1, main= "Histograma do traço latente estimado", xlab="Percepção em relação ao aborto estimada")

Olhando o gráfico acima, fica óbvio que o traço latente não tem uma
distribuição normal.
Referências:
Bartholomew, D., Steel, F., Moustaki, I. and Galbraith, J. (2002)
The Analysis and Interpretation of Multivariate Data for Social
Scientists. London: Chapman and Hall. Knott, M., Albanese, M. and
Galbraith, J. (1990) Scoring attitudes to abortion. The
Statistician, 40, 217–223. McGrath, K. and Waterton, J. (1986)
British social attitudes, 1983-86 panel survey. London:
SCPR.
NB: O
artigo está no site:https://www.jstor.org/stable/2348494?origin=crossref&seq=1
LS0tDQp0aXRsZTogIlRyYWJhbGhvMiAtIEludHJ1bWVudG9zIGRlIG1lZGlkYXMiDQphdXRob3I6ICJKb8OjbyBMLiBTaW1vbiBlIEtww6hkw6kgRGppZGpvaG8gUm9kbmVsIEplYW4tUGF0ZXJuZSBEb3NzYSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KLS0tDQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduID0gJ2NlbnRlcicpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGx0bSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShzcWxkZikNCmBgYA0KDQoNCjxicj4NCjxicj4NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keSB7DQp0ZXh0LWFsaWduOiBqdXN0aWZ5fQ0KPC9zdHlsZT4NCmBgYA0KDQoNCiMgSW50cm9kdcOnw6NvDQoNCkVzdGUgdHJhYmFsaG8gdGVtIGNvbW8gb2JqZXRpdm8gZXhwbG9yYXIgZSBhbmFsaXNhciBvIGNvbmp1bnRvIGRlIGRhZG9zICoqIkFib3J0aW9uIioqIGRvIHBhY290ZSAqbHRtKiwgY29udGVuZG8gaXRlbnMgZGUgdW0gaW5zdHJ1bWVudG8gZGUgbWVkaWRhIGFzc29jaWFkbyBhIHVtIHRyYcOnbyBsYXRlbnRlLiBBIGFuw6FsaXNlIHNlcsOhIGNvbmR1emlkYSBjb20gYmFzZSBuYSBUZW9yaWEgZGUgUmVzcG9zdGEgYW8gSXRlbSAoVFJJKSwgdW1hIGFib3JkYWdlbSBlc3RhdMOtc3RpY2EgYW1wbGFtZW50ZSB1dGlsaXphZGEgcGFyYSBtb2RlbGFyIGEgcmVsYcOnw6NvIGVudHJlIGFzIHJlc3Bvc3RhcyBkb3MgcGFydGljaXBhbnRlcyBlIG8gdHJhw6dvIGxhdGVudGUgc3ViamFjZW50ZS4gUG9zdGVyaW9ybWVudGUsIHByb2NlZGVyZW1vcyBjb20gYSBjYWxpYnJhw6fDo28gZG9zIGl0ZW5zLCB1dGlsaXphbmRvIG8gbW9kZWxvIFRSSSBtYWlzIGFkZXF1YWRvLiBBIGVzY29saGEgZGVzdGUgbW9kZWxvIHNlcsOhIGZ1bmRhbWVudGFkYSBlbSBldmlkw6puY2lhcyBlc3RhdMOtc3RpY2FzLCBjb25zaWRlcmFuZG8gY3JpdMOpcmlvcyBjb21vIGFqdXN0ZSBkbyBtb2RlbG8gYW9zIGRhZG9zIGUgcm9idXN0ZXogZXN0YXTDrXN0aWNhIGUgcGFydGlyIGRvIG1vZGVsbyBlc2NvbGhpZG8sIHNlcsOhIGVzdGltYWRvIG8gdHJhw6dvIGxhdGVudGUgZGUgY2FkYSBpbmRpdsOtZHVvLiAgDQoNCk5vIMOtbmljaW8sIG9zIGRhZG9zIGNvbnNpc3RpYW0gbmFzIHJlc3Bvc3RhcyBlbSAqKjE5ODYqKiBhIDcgcXVlc3TDtWVzIHJlbGFjaW9uYWRhcyDDoCBhdGl0dWRlIGVtIHJlbGHDp8OjbyBhbyBhYm9ydG8gcG9yIG1lbWJyb3MgZGUgdW0gcGFpbmVsIHBlc3F1aXNhZG8gZW0gY2FkYSB1bSBkb3MgYW5vcyBkZSAxOTgzIGEgMTk4NiwgY29tbyBwYXJ0ZSBkZSB1bWEgaW52ZXN0aWdhw6fDo28gZGFzIGF0aXR1ZGVzIHNvY2lhaXMgYnJpdMOibmljYXMgKHZlciBNY0dyYXRoICYgV2F0ZXJ0b24sIDE5ODYpLiBQYXJhIGNhZGEgcXVlc3TDo28sIG9zIGVudHJldmlzdGFkb3MgZm9yYW0gcXVlc3Rpb25hZG9zIHNlICoqYSBsZWkgZGV2ZXJpYSBwZXJtaXRpciBvIGFib3J0byoqLiBQb3LDqW0sIG5vIGJhbmNvIGRlIGRhZG9zICoqIkFib3J0aW9uIioqIGRvIHBhY290ZSAqbHRtKiwgMyBxdWVzdMO1ZXMgZm9yYW0gcmV0aXJhZGFzIHJlc3VsdGFuZG8gZW0gdW0gYmFuY28gY29tIDQgdmFyacOhdmVpcy4gICANCkFsw6ltIGRpc3NvLCBvIGJhbmNvIGNvbnRpbmhhIG5vIHRvdGFsIDQxMCBvYnNlcnZhw6fDtWVzIGVudHJldGFudG8gdW0gcGVxdWVubyBuw7ptZXJvIGRlIGluZGl2w61kdW9zICgzMSkgbsOjbyByZXNwb25kZXUgYWxndW1hcyBkYXMgNCBxdWVzdMO1ZXMgZSBwb3J0YW50byBlc3NhcyBvYnNlcnZhw6fDtWVzIGZvcmFtIGRlbGV0YWRhcyByZXN1bHRhbmRvIG51bSBiYW5jbyBjb20gMzc5IG9ic2VydmHDp8O1ZXMuDQoNCjxicj4NCg0KKipWQVJJw4FWRUwgTEFURU5URToqKg0KDQo+IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4OyI+IFBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhIGFwcm92YcOnw6NvIGRvIGFib3J0byBwZWxhIGxlaS4gPC9zcGFuPg0KDQo8YnI+DQoNCjxjZW50ZXI+DQoqKlFVRVNUw5VFUyoqDQo8L2NlbnRlcj4NCg0KPiAqKigxKSoqIFRoZSB3b21hbiBkZWNpZGVzIG9uIGhlciBvd24gc2hlIGRvZXMgbm90IHdpc2ggdG8gaGF2ZSB0aGUgY2hpbGQuDQoNCj4gKiooMikqKiBUaGUgY291cGxlIGFncmVlIHRoZXkgZG8gbm90IHdpc2ggdG8gaGF2ZSB0aGUgY2hpbGQuDQoNCj4gKiooMykqKiBUaGUgd29tYW4gaXMgbm90IG1hcnJpZWQgYW5kIGRvZXMgbm90IHdpc2ggdG8gbWFycnkgdGhwIG1hbi4NCg0KPiAqKig0KSoqIFRoZSBjb3VwbGUgY2Fubm90IGFmZm9yZCBhbnkgbW9yZSBjaGlsZHJlbi4NCg0KPGJyPg0KDQpBbyB0b2RvLCB0ZW1vcyAzNzkgb2JzZXJ2YcOnw7VlcywNCg0KYGBge3IgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9DQpiYW5jb19hYm9ydGlvbiA8LSBBYm9ydGlvbg0KDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAxYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gMWApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAyYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gMmApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSAzYCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gM2ApDQpiYW5jb19hYm9ydGlvbiRgSXRlbSA0YCA8LSBhcy5mYWN0b3IoYmFuY29fYWJvcnRpb24kYEl0ZW0gNGApDQoNCiMgQ3JpYW5kbyBvIGdyw6FmaWNvIGRlIGJhcnJhcyBjb20gbyB0b3RhbCBkZSAiMCIgZSAiMSIgcGFyYSBjYWRhIEl0ZW0NCmdhdGhlcihiYW5jb19hYm9ydGlvbikgJT4lIA0KICBncm91cF9ieShrZXksIHZhbHVlKSAlPiUgDQogIHN1bW1hcmlzZShUb3RhbF9TdW0gPSBuKCkpICU+JSANCiAgZ3JvdXBfYnkoa2V5KSAlPiUgDQogIG11dGF0ZShQZXJjZW50YWdlID0gKFRvdGFsX1N1bSAvIHN1bShUb3RhbF9TdW0pKSAqIDEwMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IGtleSwgeSA9IFRvdGFsX1N1bSwgZmlsbCA9IHZhbHVlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKFRvdGFsX1N1bSwgIiAoIiwgcm91bmQoUGVyY2VudGFnZSksICIlKSIpKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoeD0iSXRlbSIsIHk9IkZyZXF1w6puY2lhIiwgZmlsbD0iVmFsb3IiKSArDQogIGdndGl0bGUoIkRlc2NyacOnw6NvIGRvcyBEYWRvcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0PTAuNSkpDQpgYGANCg0KDQo8YnI+DQoNCg0KYGBge3J9DQpzdHIoYmFuY29fYWJvcnRpb24pDQpgYGANCg0KPGJyPg0KDQojIE1hdHJpeiBkZSBDb3JyZWxhw6fDo28NCg0KDQo+IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4OyI+IA0KRm9pIHV0aWxpemFkYSBuZXN0ZSBjYXNvIGEgY29ycmVsYcOnw6NvIHRldHJhY8OzcmljYSBqw6EgcXVlIHRlbSBwcmVzZW7Dp2EgZGUgdmFyacOhdmVpcyBjYXRlZ8OzcmljYXMgYmluw6FyaWFzIChkdW1taWVzKS4NCjwvc3Bhbj4NCg0KDQpgYGB7ciBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD00LCBmaWcuYWxpZ249J2NlbnRlcicsIGVjaG89RkFMU0V9DQpjb3JyZWxhY2FvIDwtIHRldHJhY2hvcmljKEFib3J0aW9uKQ0KDQpjb3JycGxvdChjb3JyZWxhY2FvJHJobywgbWV0aG9kID0gJ251bWJlcicpDQpgYGANCg0KDQoNCg0KQXMgY29ycmVsYcOnw7VlcyBtYWlzIGZvcnRlcyAoKiowLjkwKiopIGZvcmFtIGVudHJlICoqSXRlbTEqKiBlICoqSXRlbSAyKiogZGUgdW0gbGFkbyBlIGVudHJlICoqSXRlbSAzKiogZSAqKkl0ZW0gNCoqIGRvIG91dHJvIC4NCg0KPGJyPg0KDQoqKkPDoWxjdWxvIGRvcyBhdXRvdmFsb3JlczoqKg0KDQpgYGB7cn0NCnJvdW5kKGVpZ2VuKGNvcnJlbGFjYW8kcmhvKSR2YWx1ZXMsMikNCmBgYA0KPGJyPg0KDQoqKkPDoWxjdWxvIGRhIHByb3BvcsOnw6NvIGV4cGxpY2FkYSBwb3IgY2FkYSBmYXRvcjoqKg0KDQpgYGB7cn0NCnByb3BvcmNhb19leHBsaWNhY2FvPC1laWdlbihjb3JyZWxhY2FvJHJobykkdmFsdWVzLw0Kc3VtKGVpZ2VuKGNvcnJlbGFjYW8kcmhvKSR2YWx1ZXMpDQpwcm9wb3JjYW9fZXhwbGljYWNhbw0KYGBgDQoNCg0KT2xoYW5kbyBhcyBzYcOtZGFzIHF1ZSBvYnRpdmVtb3MgZG9zIGPDs2RpZ29zICBhY2ltYSBwb2RlbW9zICBkaXplciBxdWUgdGVtb3MgdW0gw7puaWNvIGZhdG9yIHBhcmEgZXNzZXMgIDQgaXRlbnMuDQoNCjxicj4NCg0KYGBge3J9DQoNCmRlc2MgPC0gZGVzY3JpcHQoQWJvcnRpb24pDQpkZXNjDQpgYGANCg0KDQoNCiBDb20gZXNzYSBmdW7Dp8OjbyBzZSB0ZW0gbyBhbHBoYSBkZSBjcm9uYmFjaCBxdWUgdmFpIGluZm9ybWFyIHNvYnJlIG8gZmF0byBkZSB1bSBpdGVtIHByZWp1ZGljYXIgYSBjb25zaXN0ZW5jaWEgaW50ZXJuYSBkbyAgbW9kZWxvDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToxNXB4OyI+IA0KKipSZXN1bHRhZG8gMToqKjwvc3Bhbj4gUG9kZW1vcyBvYnNlcnZhciBxdWUgdGV2ZSBtYWlzIGluZGl2w61kdW9zIHF1ZSBhcHJvdmFyYW0gbyBhYm9ydG8gZGlhbnRlIGRhIGNpcmN1bnN0w6JuY2lhIGRvICoqaXRlbSAzKiogKDAgPSAwLDM2NDEgdnMgMSA9IDAsNjM1OSkgZG8gcXVlIGRpYW50ZSBkYSBjaXJjdW5zdMOibmNpYSBkb3Mgb3V0cm9zIGl0ZW5zLiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjE1cHg7Ij4gDQoqKlJlc3VsdGFkbyAyOioqPC9zcGFuPiBQb2RlbW9zIG9ic2VydmFyIHF1ZSB0ZXZlIG1haXMgaW5kaXbDrWR1b3MgcXVlIGFwcm92YXJhbSBvIGFib3J0byBkaWFudGUgZGUgdG9kYXMgYXMgY2lyY3Vuc3TDom5jaWFzIGRvcyA0IGl0ZW5zICh1bSB0b3RhbCBkZSAxNDEgcGVzc29hcykuIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTtmb250LXNpemU6MTVweDsiPiANCioqUmVzdWx0YWRvIDM6Kio8L3NwYW4+IFBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGEgY29ycmVsYcOnw6NvIHBvbnRvIGJpc3NlcmlhbCBkZSBjYWRhIGl0ZW0gY29tIG8gRXNjb3JlIFRvdGFsIHF1YW5kbyBvIGl0ZW0gZW0gZXZpZMOqbmNpYSBuw6NvIGVzdMOhIGluY2x1w61kbyBubyBjw6FsY3VsbyBkbyBFc2NvcmUgVG90YWwgZmljb3UgbWVub3IgZG8gcXVlIGEgY29ycmVsYcOnw6NvIHBvbnRvIGJpc3NlcmlhbCBkZSBjYWRhIGl0ZW0gY29tIG8gRXNjb3JlIFRvdGFsIHF1YW5kbyBvIGl0ZW0gZW0gZXZpZMOqbmNpYSBlc3TDoSBpbmNsdcOtZG8gbm8gY8OhY2x1bG8gZG8gRXNjb3JlIFRvdGFsLiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjE1cHg7Ij4gDQoqKlJlc3VsdGFkbyA0OioqPC9zcGFuPiBQb2RlbW9zIG9ic2VydmFyIHBlbG9zIGFscGhhcyBkZSBDcm9uYmFjaCAodG9kb3MgbWVub3JlcyBxdWUgMCw4NzA3KSBxdWUgbmVuaHVtIGl0ZW0gcGFyZWNlIHByZWp1ZGljYXIgYSBjb25zaXN0w6puY2lhIGludGVybmEgZG8gbW9kZWxvLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTtmb250LXNpemU6MTVweDsiPiANCioqUmVzdWx0YWRvIDU6Kio8L3NwYW4+IFBvZGVtb3MgY29uY2x1aXIgcGVsb3MgKipwLXZhbG9yZXMqKiBxdWUgaMOhIGRlcGVuZMOqbmNpYSBlbnRyZSBvcyBwYXJlcyBkZSBpdGVucy4NCg0KPGJyPg0KDQojIE1vZGVsbyBkZSBSYXNjaA0KDQpBcXVpIGZvaSB1dGlsaXphZG8gY29tbyBkaXNjcmltaW5hbnRlIG8gdmFsb3IgICoqYDEsNzAyYCoqIHBhcmEgdGVyIHJlc3VsdGFkb3Mgc2VtZWxoYW50ZXMgYW8gZGEgZnVuw6fDo28gKipgb2dpdmEgbm9ybWFsYCoqIGNvbSBxdWFsIHRyYWJhbGhhdmFtIG9zIHBpb25laXJvcyBkYSBUUkkgDQoNCmBgYHtyfQ0KZml0LkFib3J0aW9uPC1yYXNjaChiYW5jb19hYm9ydGlvbixjb25zdHJhaW50PWNiaW5kKG5jb2woYmFuY29fYWJvcnRpb24pKzEsMS43MDIpKQ0Kc3VtbWFyeShmaXQuQWJvcnRpb24pDQpgYGANCg0KPGJyPg0KDQpPcmRlbmFuZG8gb3MgcmVzdWx0YWRvcyBkbyBwYXLDom1ldHJvIGRlICdkaWZpY3VsZGFkZScNCg0KYGBge3J9DQpjb2VmKGZpdC5BYm9ydGlvbiwgcHJvYiA9IFRSVUUsIG9yZGVyID0gVFJVRSkNCmBgYA0KDQoNCjxicj4NCg0KT2xoYW5kbyBvcyByZXN1bHRhZG9zIGVuY29udHJhZG9zIGFww7NzIGltcGxlbWVudGHDp8OjbyBkZXNzZSBtb2RlbG8gZGUgUmFzY2gsIG8gaXRlbSBtYWlzIGdyYXZlICgqKm1haXMgZGlmw61jaWwqKikgw6kgbyAqKippdGVtIDEqKiouDQoNCkRlc3NlIG1vZG8sIHRhbWLDqW0gcG9kZW1vcyBpbnRlcnByZXRhciBxdWUgdmFpIHNlciBtYWlvciBhIGFwdGlkw6NvIGV4aWdpZGEgcGFyYSBxdWUgbyBpbmRpdsOtZHVvIHRlbmhhICoqNTAlKiogZGUgY2hhbmNlIGRlIGFwcm92YXIgbyBhYm9ydG8gZGlhbnRlIGRhIHNpdHVhw6fDo28gZG8gKml0ZW0gMSouDQogDQogT3V0cmEgaW50ZXJwcmV0YcOnw6NvIHNlcmlhOiBvcyBpbmRpdsOtZHVvcyBxdWUgYXByZXNlbnRhbSB1bSB0cmHDp28gbGF0ZW50ZSBkZSAnMCwyNycgYWNpbWEgZGEgbcOpZGlhIHRlcsOjbyBwcm9iYWJpbGlkYWRlIGRlIGFwcm92YXIgbyBhYm9ydG8gZGlhbnRlIGRhIHNpdHVhw6fDo28gZG8gKml0ZW0gMSogaWd1YWwgYSAqKjAsNSoqLg0KDQoNCkluZm9ybWHDp8OjbyBkbyB0ZXN0ZQ0KDQpgYGB7cn0NCmluZm9ybWF0aW9uKGZpdC5BYm9ydGlvbiwgYygtNCw0KSkNCmBgYA0KDQoNCkluZm9ybWF0aW9uIGluICgtNCwgNCkgPSA2LDc5ICg5OSw3MiUpLg0KSXNzbyBxdWVyIGRpemVyIHF1ZSBxdWFzZSAxMDAlIGRvcyB0cmHDp29zIGxhdGVudGVzIGZpY2FyYW0gbm8gaW50ZXJ2YWxvICgtNCwgNCkuIA0KDQo8YnI+DQoNCiMjIEN1cnZhIENhcmFjdGVyw61zdGljYSBkbyBpdGVtIA0KDQpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcid9DQpwbG90KGZpdC5BYm9ydGlvbixsZWdlbmQgPSBUUlVFLCBwY2ggPSByZXAoMToyLCBlYWNoID0gNCkseWxhYj0iUHJvYmFiaWxpZGFkZSBkZSBhcHJvdmHDp8OjbyBkbyBhYm9ydG8iLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gaXRlbSIsY29sID0gcmVwKDE6NCwgMiksIGx3ZCA9IDIsIGNleCA9IDEuMikNCmFibGluZShoPTAuNSwgbHR5PSJkYXNoZWQiLGx3ZD0yKQ0KYGBgDQoNCg0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgcmVzcG9zdGEgY29ycmV0YSB2YXJpYSBlbSBmdW7Dp8OjbyBkYSBoYWJpbGlkYWRlIGRvIHJlc3BvbmRlbnRlLg0KDQo8YnI+DQoNCiMjIEN1cnZhIGRlIEluZm9ybWHDp8OjbyBkbyBJdGVtDQoNCmBgYHtyfQ0KcGxvdChmaXQuQWJvcnRpb24sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIHhsYWIgPSAiUGVyY2Vww6fDo28gZW0gcmVsYcOnw6NvIGFvIEFib3J0byIsIGNvbCA9IHJlcCgxOjQsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIpDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hIHBhcmVjZSBxdWUgdG9kb3Mgb3MgNCBpdGVucyBzw6NvIGltcG9ydGFudGVzIHBhcmEgbWVkaXIgYSBwZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvLg0KDQoNCg0KPGJyPg0KDQojIyBDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gVGVzdGUNCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgQ2FsY3VsYXIgYSBpbmZvcm1hw6fDo28gZSBwbG90YXIgbyBncsOhZmljbyBkZSBpbmZvcm1hw6fDo28NCmluZm8xIDwtIHBsb3QoZml0LkFib3J0aW9uLCB0eXBlID0gIklJQyIsIGl0ZW1zID0gMCwgbHdkID0gMiwgeGxhYiA9ICJQZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvIikNCg0KIyBDb25maWd1cmFyIG8gbGF5b3V0IHBhcmEgYWRpY2lvbmFyIHVtIG5vdm8gZ3LDoWZpY28gc29icmUgbyBhbnRlcmlvcg0KcGFyKG5ldyA9IFRSVUUpDQoNCiMgQ2FsY3VsYXIgbyBlcnJvIHBhZHLDo28gZSBwbG90YXIgbyBncsOhZmljbyBkZSBlcnJvIHBhZHLDo28NCnBsb3QoaW5mbzFbLCAieiJdLCAxIC8gc3FydChpbmZvMVssICJpbmZvIl0pLCB0eXBlID0gImwiLCBsd2QgPSAyLCB4bGFiID0gIiIsIHlsYWIgPSAiIiwgbWFpbiA9ICIiLCBjb2w9J3JlZCcpDQoNCiMgQWRpY2lvbmFyIHLDs3R1bG9zIGFvcyBlaXhvcyBkbyBzZWd1bmRvIGdyw6FmaWNvDQpheGlzKDQpICAjIEVpeG8gZG8gbGFkbyBkaXJlaXRvIHBhcmEgbyBlcnJvIHBhZHLDo28NCm10ZXh0KCJFcnJvIHBhZHLDo28iLCBzaWRlID0gNCwgbGluZSA9IDMpDQoNCiMgQWRpY2lvbmFyIHVtYSBsZWdlbmRhIHBhcmEgZGlzdGluZ3VpciBvcyBkb2lzIGNvbmp1bnRvcyBkZSBkYWRvcw0KbGVnZW5kKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGMoIkluZm9ybWHDp8OjbyIsICJFcnJvIHBhZHLDo28iKSwgbHR5ID0gYygxLCAxKSwgbHdkID0gYygyLCAyKSwgY29sID0gYygiYmxhY2siLCAicmVkIikpDQoNCmBgYA0KDQo8YnI+DQoNCiMgTW9kZWxvIExvZ8Otc3RpY28gZGUgMiBQYXLDom1ldHJvcw0KDQpgYGB7cn0NCmZpdC5BYm9ydGlvbl8ycGFyYW0gPC0gbHRtKGJhbmNvX2Fib3J0aW9uIH4gejEpDQpzdW1tYXJ5KGZpdC5BYm9ydGlvbl8ycGFyYW0pDQpgYGANCg0KDQpgYGB7cn0NCmNvZWYoZml0LkFib3J0aW9uXzJwYXJhbSwgcHJvYiA9IFRSVUUsIG9yZGVyID0gVFJVRSkNCmBgYA0KDQpQb2RlbW9zIHZlciBxdWUgYXNzaW0gY29tbyBubyBtb2RlbG8gZGUgUmFzY2gsIG8gKioqaXRlbSAzKioqIGZvaSBvIHF1ZSBhcHJlc2VudG91IGEgbWVub3IgZGlmaWN1bGRhZGUgYWzDqW0gZGUgdGVyIGEgbWFpb3IgY2FwYWNpZGFkZSBkZSBkaXNjcmltaW5hw6fDo28sIGVucXVhbnRvIHF1ZSBvICoqKml0ZW0gMSoqKiBmb2kgY29uc2lkZXJhZG8gbyAqKm1haXMgZGlmw61jaWwqKi4NCg0KDQoNCmBgYHtyfQ0KaW5mb3JtYXRpb24oZml0LkFib3J0aW9uXzJwYXJhbSwgYygtNCw0KSkNCmBgYA0KDQpPIG1vZGVsbyBhcHJlc2VudG91IHVtYSBJbmZvcm1hw6fDo28gVG90YWwgZGUgMTguMDcsIG11aXRvIG1haW9yIHNlIGNvbXBhcmFkYSBhbyBtb2RlbG8gZGUgUmFzY2ggKDYuODEpLiBBbMOpbSBkaXNzbywgSW5mb3JtYXRpb24gaW4gKC00LCA0KSBpbmRpY2EgcXVlIGVzdGUgdmFsb3IgKDE4LjA3KSByZXByZXNlbnRhIGEgaW5mb3JtYcOnw6NvIGNvbnRpZGEgbmEgZmFpeGEgZGUgaGFiaWxpZGFkZSBlbnRyZSAtNCBlIDQuIE8gZmF0byBkZSBhIGluZm9ybWHDp8OjbyBkZW50cm8gZGEgZmFpeGEgZGUgaGFiaWxpZGFkZSBlc3BlY8OtZmljYSBzZXIgMTAwJSBkbyB0b3RhbCBpbmRpY2EgcXVlIGEgbWFpb3IgcGFydGUgZGEgaW5mb3JtYcOnw6NvIHJlbGV2YW50ZSBlc3TDoSBjb250aWRhIG5lc3NhIGZhaXhhLiBJc3NvIHN1Z2VyZSBxdWUgbyBtb2RlbG8gw6kgYmFzdGFudGUgcHJlY2lzbyBlbSBlc3RpbWFyIGhhYmlsaWRhZGVzIGRlbnRybyBkZXNzZSBpbnRlcnZhbG8gZXNwZWPDrWZpY28uDQoNCg0KDQo8YnI+DQoNCiMjIEN1cnZhIENhcmFjdGVyw61zdGljYSBkbyBJdGVtDQoNCmBgYHtyfQ0KcGxvdChmaXQuQWJvcnRpb25fMnBhcmFtLCBsZWdlbmQgPSBUUlVFLCBwY2ggPSByZXAoMToyLCBlYWNoID0gNCkseWxhYj0iUHJvYmFiaWxpZGFkZSBkZSBhcHJvdmHDp8OjbyBkbyBhYm9ydG8iLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBjb2wgPSByZXAoMTo0LCAyKSwgbHdkID0gMiwgY2V4ID0gMS4yLCBtYWluPSJDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gSXRlbSIpDQphYmxpbmUoaD0wLjUsIGx0eT0iZGFzaGVkIixsd2Q9MikNCmBgYA0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIHZhcmlhIGVtIGZ1bsOnw6NvIGRhIGhhYmlsaWRhZGUgZG8gcmVzcG9uZGVudGUuDQoNCjxicj4NCg0KIyMgQ3VydmEgZGUgSW5mb3JtYcOnw6NvIGRvIEl0ZW0NCg0KYGBge3J9DQpwbG90KGZpdC5BYm9ydGlvbl8ycGFyYW0sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIGNvbCA9IHJlcCgxOjQsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIsIHN1YiA9IHBhc3RlKCJDYWxsOiAiLCBkZXBhcnNlKGZpdC5BYm9ydGlvbl8ycGFyYW0kY2FsbCkpKQ0KDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hIHBhcmVjZSBxdWUgbyBpdGVtIG1haXMgaW1wb3J0YW50ZSDDqSBvICoqYGl0ZW0gM2AqKiBlIG8gaXRlbSBtZW5vcyBpbXBvcnRhbnRlIMOpIG8gKipgaXRlbSA0YCoqLiANCg0KDQojIyBDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gVGVzdGUNCg0KYGBge3J9DQoNCmluZm8yPSBwbG90KGZpdC5BYm9ydGlvbl8ycGFyYW0sIHR5cGUgPSAiSUlDIiwgaXRlbXMgPSAwLCBsd2QgPSAyLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iKQ0KDQoNCiMgQ29uZmlndXJhciBvIGxheW91dCBwYXJhIGFkaWNpb25hciB1bSBub3ZvIGdyw6FmaWNvIHNvYnJlIG8gYW50ZXJpb3INCnBhcihuZXcgPSBUUlVFKQ0KDQojIENhbGN1bGFyIG8gZXJybyBwYWRyw6NvIGUgcGxvdGFyIG8gZ3LDoWZpY28gZGUgZXJybyBwYWRyw6NvDQpwbG90KGluZm8yWywgInoiXSwgMSAvIHNxcnQoaW5mbzJbLCAiaW5mbyJdKSwgdHlwZSA9ICJsIiwgbHdkID0gMiwgeGxhYiA9ICIiLCB5bGFiID0gIiIsIG1haW4gPSAiIiwgY29sPSdyZWQnKQ0KDQojIEFkaWNpb25hciByw7N0dWxvcyBhb3MgZWl4b3MgZG8gc2VndW5kbyBncsOhZmljbw0KYXhpcyg0KSAgIyBFaXhvIGRvIGxhZG8gZGlyZWl0byBwYXJhIG8gZXJybyBwYWRyw6NvDQptdGV4dCgiRXJybyBwYWRyw6NvIiwgc2lkZSA9IDQsIGxpbmUgPSAzKQ0KDQojIEFkaWNpb25hciB1bWEgbGVnZW5kYSBwYXJhIGRpc3Rpbmd1aXIgb3MgZG9pcyBjb25qdW50b3MgZGUgZGFkb3MNCmxlZ2VuZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCJJbmZvcm1hw6fDo28iLCAiRXJybyBwYWRyw6NvIiksIGx0eSA9IGMoMSwgMSksIGx3ZCA9IGMoMiwgMiksIGNvbCA9IGMoImJsYWNrIiwgInJlZCIpKQ0KDQpgYGANCg0KPGJyPg0KDQojIE1vZGVsbyBMb2fDrXN0aWNvIGRlIDMgUGFyw6JtZXRyb3MNCg0KYGBge3J9DQpmaXQuQWJvcnRpb25fM3BhcmFtIDwtIHRwbShiYW5jb19hYm9ydGlvbikNCnN1bW1hcnkoZml0LkFib3J0aW9uXzNwYXJhbSkNCg0KYGBgDQoNCmBgYHtyfQ0KY29lZihmaXQuQWJvcnRpb25fM3BhcmFtLCBwcm9iID0gVFJVRSwgb3JkZXIgPSBUUlVFKQ0KYGBgDQoNClBvciB1bSBsYWRvLCBwb2RlbW9zIHZlciBxdWUgYXNzaW0gY29tbyBubyBtb2RlbG8gZGUgUmFzY2ggZSBubyBtb2RlbG8gZGUgMiBwYXLDom1ldHJvcywgbyAqKippdGVtMyoqKiBmb2kgbyBxdWUgYXByZXNlbnRvdSBhIG1lbm9yIGRpZmljdWxkYWRlIGFsw6ltIGRlIHRlciBhIG1haW9yIGNhcGFjaWRhZGUgZGUgZGlzY3JpbWluYcOnw6NvLCBlbnF1YW50byBxdWUgbyAqKippdGVtMSoqKiBmb2kgY29uc2lkZXJhZG8gbyBtYWlzIGRpZsOtY2lsLg0KUG9yIG91dHJvIGxhZG8gbyBtb2RlbG8gTG9nw61zdGljbyBkZSAzIFBhcsOibWV0cm9zIGFkaWNpb25hIHVtIHRlcmNlaXJvIHBhcsOibWV0cm8gcXVlIHJlcHJlc2VudGEgbyBlZmVpdG8gZGUgYWRpdmluaGHDp8OjbyAoYWNlcnRvIGNhc3VhbCkuIE5vIG5vc3NvIGNhc28gZXN0ZSBwYXLDom1ldHJvIHJlZmxldGUgYSBwcm9iYWJpbGlkYWRlIGRlIHVtIHJlc3BvbmRlbnRlIGNvbSBwZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gYWJvcnRvIG11aXRvIGJhaXhhIGFpbmRhIGFwcm92YXIgbyBhYm9ydG8gYW8gYWNhc28uIFBvZGVtb3MgdmVyIHF1ZSBuZXNzZSBjYXNvIGRlIGVzdHVkbyBuw6NvIGjDoSBhIHByZXNlbsOnYSBkZSAiY2h1dGUiLCB2aXN0byBxdWUgbsOjbyBlc3RhbW9zIG1lZGluZG8gdW1hIGhhYmlsaWRhZGUgZXNwZWPDrWZpY2EuIE9zIHJlc3VsdGFkb3MgY29ycm9ib3JhbSBlc3NhIGNvbmNsdXPDo28sIGrDoSBxdWUgbyDDum5pY28gY29lZmljaWVudGUgZGUgImFkdmluaGHDp8OjbyIgYWNpbWEgZGUgMCBmb2kgbyAqaXRlbSAyKiBjb20gdW0gdmFsb3IgZGUgMCwwMzkuDQoNCg0KPGJyPg0KDQojIyBDdXJ2YSBDYXJhY3RlcsOtc3RpY2EgZG8gSXRlbQ0KDQpgYGB7cn0NCnBsb3QoZml0LkFib3J0aW9uXzNwYXJhbSwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDQpLHlsYWI9IlByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIiwgeGxhYiA9ICJQZXJjZXDDp8OjbyBlbSByZWxhw6fDo28gYW8gQWJvcnRvIiwgbWFpbj0iQ3VydmEgQ2FyYWN0ZXLDrXN0aWNhIGRvIEl0ZW0iLCBjb2wgPSByZXAoMTo0LCAyKSwgbHdkID0gMiwgY2V4ID0gMS4yKQ0KYWJsaW5lKGg9MC41LCBsdHk9ImRhc2hlZCIsbHdkPTIpDQpgYGANCg0KTyBncsOhZmljbyBhY2ltYSBtb3N0cmEgY29tbyBhIHByb2JhYmlsaWRhZGUgZGUgYXByb3Zhw6fDo28gZG8gYWJvcnRvIHZhcmlhIGVtIGZ1bsOnw6NvIGRhIGhhYmlsaWRhZGUgZG8gcmVzcG9uZGVudGUuDQoNCg0KIyMgQ3VydmEgZGUgSW5mb3JtYcOnw6NvIGRvIEl0ZW0NCmBgYHtyfQ0KDQpwbG90KGZpdC5BYm9ydGlvbl8zcGFyYW0sIHR5cGUgPSAiSUlDIiwgbGVnZW5kID0gVFJVRSwgcGNoID0gcmVwKDE6MiwgZWFjaCA9IDUpLCB4bGFiID0gIlBlcmNlcMOnw6NvIGVtIHJlbGHDp8OjbyBhbyBBYm9ydG8iLCBtYWluPSJDdXJ2YSBkZSBJbmZvcm1hw6fDo28gZG8gSXRlbSIsIGNvbCA9IHJlcCgxOjUsIDIpLCBsd2QgPSAyLCBjZXggPSAxLjIpDQoNCmBgYA0KDQoNCk9saGFuZG8gbyBncsOhZmljbyBhY2ltYSBwYXJlY2UgcXVlIG8gaXRlbSBtYWlzIGltcG9ydGFudGUgw6kgbyAqKmBpdGVtIDNgKiogZSBvIGl0ZW0gbWVub3MgaW1wb3J0YW50ZSBjb250aW51YSBzZW5kbyBvICoqYGl0ZW0gNGAqKi4gUG9yw6ltIG5lc3RlIGNhc28gYXF1aSBvIGl0ZW0gMiBwYXJlY2UgaW5mb3JtYXIgbWFpcyBkbyBxdWUgbyBpdGVtIDEuDQoNCg0KPGJyPiANCg0KIyBFc2NvbGhlbmRvIG8gbWVsaG9yIG1vZGVsbw0KDQo8YnI+DQoNCjxjZW50ZXI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Zm9udC1zaXplOjIycHgiPiBNb2RlbG8gZGUgUmFzY2ggdnMgTW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MgPC9zcGFuPiA8L2NlbnRlcj4NCg0KYGBge3J9DQphbm92YShmaXQuQWJvcnRpb24sZml0LkFib3J0aW9uXzJwYXJhbSkNCg0KYGBgDQoNCg0KPGJyPg0KDQo8Y2VudGVyPjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlO2ZvbnQtc2l6ZToyMnB4Ij4gTW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MgdnMgTW9kZWxvIGRlIDMgcGFyw6JtZXRyb3MgPC9zcGFuPiA8L2NlbnRlcj4NCg0KDQpgYGB7cn0NCmFub3ZhKGZpdC5BYm9ydGlvbl8ycGFyYW0sZml0LkFib3J0aW9uXzNwYXJhbSkNCmBgYA0KDQoNClBlbG8gcmVzdWx0YWRvIGRvIHRlc3RlIGRhIHJhesOjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIHBhcmEgbW9kZWxvcyBlbmNhaXhhZG9zLCBwb2RlbW9zIHZlciBxdWUgbyBtb2RlbG8gbG9nw61zdGljbyBkZSAyIHBhcsOibWV0cm9zIGFwcmVzZW50b3UgbyBtZW5vciBBSUMsIGxvZ28sIGNvbmNsdcOtbW9zIHF1ZSBlc3RlIG1vZGVsbyDDqSBvIHF1ZSBtZWxob3Igc2UgYWp1c3RhIGFvcyBkYWRvcyBlbSBjb21wYXJhw6fDo28gYW8gTW9kZWxvIGRlIFJhc2NoLiBQb3N0ZXJpb3JtZW50ZSBpcmVtb3MgY29tcGFyw6EtbG8gY29tIG8gbW9kZWxvIGxvZ8Otc3RpY28gZGUgMyBwYXLDom1ldHJvcy4NCg0KDQpQZWxvcyByZXN1bHRhZG9zIGRvcyB0ZXN0ZXMgZGEgcmF6w6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgcGFyYSBtb2RlbG9zIGVuY2FpeGFkb3MsIHBvZGVtb3MgdmVyIHF1ZSBvIG1vZGVsbyBsb2fDrXN0aWNvIGRlIDIgcGFyw6JtZXRyb3MgYXByZXNlbnRvdSBvIG1lbm9yIEFJQyBlIEJJQywgbG9nbywgY29uY2x1w61tb3MgcXVlIGVzdGUgbW9kZWxvIMOpIG8gcXVlIG1lbGhvciBzZSBhanVzdGEgYW9zIGRhZG9zLiBUYW1iw6ltIG9saGFuZG8gb3MgdmFsb3Jlcy1wLCBjaGVnYW1vcyBuYSBtZXNtYSBjb25jbHVzw6NvLiANCg0KPGJyPg0KDQojIEVzdGltYcOnw6NvIGRvIFRyYcOnbyBMYXRlbnRlDQoNCg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZTsgZm9udC1zaXplOjE2cHgiPg0KTyB0cmHDp28gbGF0ZW50ZSBmb2kgZXN0aW1hZG8gYSBwYXJ0aXIgZG8gbW9kZWxvIGRlIDIgcGFyw6JtZXRyb3MuIDwvc3Bhbj4NCg0KYGBge3J9DQoNCnRldGEycGFyYW1fYWJvcnRpb24gPSBsdG06OmZhY3Rvci5zY29yZXMoZml0LkFib3J0aW9uXzJwYXJhbSwgcmVzcC5wYXR0ZXJucz1iYW5jb19hYm9ydGlvbikNCg0KYGBgDQoNCg0KYGBge3J9DQpiYW5jb19EVCA9ICByb3VuZCh0ZXRhMnBhcmFtX2Fib3J0aW9uJHNjb3JlLmRhdCwgNCkNCmRhdGF0YWJsZShiYW5jb19EVCwgcm93bmFtZXMgPSBUKQ0KDQpgYGANCg0KPGJyPg0KDQojIERlc2NyacOnw6NvIGNvbXBsZXRhIGRvIHRyYcOnbyBsYXRlbnRlIGVzdGltYWRvDQoNCg0KDQpgYGB7cn0NCmhpc3QoYmFuY29fRFQkejEsIG1haW49ICJIaXN0b2dyYW1hIGRvIHRyYcOnbyBsYXRlbnRlIGVzdGltYWRvIiwgeGxhYj0iUGVyY2Vww6fDo28gZW0gcmVsYcOnw6NvIGFvIGFib3J0byBlc3RpbWFkYSIpDQpgYGANCg0KT2xoYW5kbyBvIGdyw6FmaWNvIGFjaW1hLCBmaWNhIMOzYnZpbyBxdWUgbyB0cmHDp28gbGF0ZW50ZSBuw6NvIHRlbSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLg0KDQojIyBSZXRvcm5hbmRvIGFzIGxpbmhhcyBjb20gdHJhw6dvIGxhdGVudGUgbcOtbmltbyBlIG3DoXhpbW8NCg0KDQpgYGB7cn0NCnN1bW1hcnkoYmFuY29fRFQkejEpDQpgYGANCg0KYGBge3J9DQpRdWVyeSA9IHNxbGRmOjpzcWxkZignc2VsZWN0Kg0KICAgICAgICAgICAgICAgICAgZnJvbSBiYW5jb19EVA0KICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgejEgaW4oLTAuODk4MTAsMC42NjAxMCknKQ0KDQoNCkRUOjpkYXRhdGFibGUoUXVlcnkpDQoNCmBgYA0KDQo8YnI+DQoNCg0KIyBSZWZlcsOqbmNpYXM6DQoNCkJhcnRob2xvbWV3LCBELiwgU3RlZWwsIEYuLCBNb3VzdGFraSwgSS4gYW5kIEdhbGJyYWl0aCwgSi4gKDIwMDIpICpUaGUgQW5hbHlzaXMgYW5kIEludGVycHJldGF0aW9uIG9mDQpNdWx0aXZhcmlhdGUgRGF0YSBmb3IgU29jaWFsIFNjaWVudGlzdHMqLiBMb25kb246IENoYXBtYW4gYW5kIEhhbGwuDQpLbm90dCwgTS4sIEFsYmFuZXNlLCBNLiBhbmQgR2FsYnJhaXRoLCBKLiAoMTk5MCkgU2NvcmluZyBhdHRpdHVkZXMgdG8gYWJvcnRpb24uICpUaGUgU3RhdGlzdGljaWFuKiwgNDAsDQoyMTfigJMyMjMuDQpNY0dyYXRoLCBLLiBhbmQgV2F0ZXJ0b24sIEouICgxOTg2KSAqQnJpdGlzaCBzb2NpYWwgYXR0aXR1ZGVzKiwgMTk4My04NiBwYW5lbCBzdXJ2ZXkuIExvbmRvbjogU0NQUi4NCg0KDQo8c3BhbiBzdHlsZT0gImNvbG9yOnJlZDsgZm9udC1zaXplOjE4cHgiPioqTkI6KiogTyBhcnRpZ28gZXN0w6Egbm8gc2l0ZTpodHRwczovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzIzNDg0OTQ/b3JpZ2luPWNyb3NzcmVmJnNlcT0xDQo=