# librarias
library(nortest)
library(corrplot)
library(car)
library(ellipse)
library(mvnormalTest)
library(ACSWR)
  1. O objeto air_polution contém 42 observações de 7 variáveis sobre a poluição de ar registradas às 12:00 PM em Los Angeles em diferentes dias. Com os dados sobre a poluição do ar examine a suposição de normalidade bivariada para o par de variáveis \(X_5\) = NO2 e \(X_6\) = O3.
  1. Examine a normalidade univariada de \(X_5\) e \(X_6\).
  2. Calcule as formas quadráticas \(d_i^2 = (\mathbf{x}_i - \mathbf{\bar{x}})^\top \mathbf{S}^{-1}(\mathbf{x}_i - \mathbf{\bar{x}})\), \(i = 1,\ldots, 42\), \(\mathbf{x}_j^\top = [x_{i5},x_{i6}]\) e construa um Q-Q plot apropriado para a forma quadrática \(d^2\). A suposição de normalidade bivariada para os dados é razoável?
  3. Determine a proporção de observações de \(\mathbf{x}_i^\top = [x_{i5},x_{i6}]\), \(i = 1,\ldots, 42\) dentro do gráfico de contorno de uma normal bivariada com uma probabilidade de 50%.
air_pollution <- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/air_pollution.dat")
colnames(air_pollution) <- c("wind","solar_radiation","CO","NO","NO2","O3","HC")
head(air_pollution)
air_pollution_56 <- air_pollution[,c(5,6)]
pairs(air_pollution_56, pch = 19)

boxplot(air_pollution_56, pch = 19)

par(mfrow=c(2,2))
nvar  <- ncol(air_pollution_56)
nomes <- names(air_pollution_56)
for (i in 1:ncol(air_pollution_56)) {
  hist(air_pollution_56[,i], main = paste("Histograma de",nomes[i]), xlab = paste(nomes[i]))
  plot(density(air_pollution_56[,i]), main = paste("Densidade de",nomes[i]))
}

par(mfrow=c(1,2))
for (j in 1:nvar)
{
  qqPlot(scale(air_pollution_56[,j]),dist="norm",mean=0,sd=1,col.lines=1,grid="FALSE",
         xlab="quantil da N(0,1)",ylab=nomes[j],cex=1.2,pch=20,id=FALSE)
}

# Shapiro Wilks Test
shapiro.test(air_pollution_56[,1])

    Shapiro-Wilk normality test

data:  air_pollution_56[, 1]
W = 0.93004, p-value = 0.013
shapiro.test(air_pollution_56[,2])

    Shapiro-Wilk normality test

data:  air_pollution_56[, 2]
W = 0.89603, p-value = 0.001098
n <- nrow(air_pollution_56)
nvar <- ncol(air_pollution_56)
vmu <- colMeans(air_pollution_56)
mcov <- cov(air_pollution_56)
# forma quadrática
d2 <- n*mahalanobis(air_pollution_56,center=vmu,cov=mcov)
qqPlot(d2,dist="chisq",df=nvar,col.lines=1,grid="FALSE",
       xlab="quantil da distribuição qui-quadrado",
       ylab="d2",
       cex=1.2, 
       pch = 20,
       id = FALSE)

Mardia_Test<-mardia(air_pollution_56)
Mardia_Test$mv.test
rho <- cor(air_pollution_56)
var <- diag(mcov)
i=1;j=2
plot(ellipse::ellipse(x = rho[i,j],
                      scale = c(sqrt(var[i]),sqrt(var[j])),
                      centre = c(vmu[i],vmu[j]),
                      level = 0.5
                      ),
     type = "l",
     xlab = nomes[i],
     ylab = nomes[j])
lines(vmu[i],vmu[j], pch = 8, col = "red", type = "p")
points(air_pollution_56[,i],air_pollution_56[,j],
       pch=20,
       cex=1.2,
       cex.lab=1.2,
       cex.axis=1.2,
       col="darkgreen")

  1. Um ecologista de vida selvagem, mediu \(x_1\): comprimento do cauda (tail_length) em milimetros e \(x_2\): comprimento das asas (wing_length) em milimetros em uma amostra de 45 aves fêmeas da especie hook-billed kites (Gavião-caracoleiro em português). As observações estão armazenadas no objeto birds_data.
  1. Examine a normalidade univariada das variáveis \(X_1\): tail_length e \(X_2\) = wing_length.
  2. Examine a normalidade bivariada de \([X_1,X_2]^\top\). É um modelo viável para \([X_1,X_2]^\top\)?
  3. Suponha que é sabido que \(\mu_1\) = 190 mm e \(\mu_2\) = 275 mm para machos da espécie hook-billed kites. São esses valores razoáveis para o comprimento médio da cauda e o comprimento médio das assas para aves fêmeas? Explique.
birds_data<- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/birds.dat")
colnames(birds_data) <- c("tail_length","wing_length")
  1. O objeto psy_profile_data consiste de 130 observações geradas por pontuações (scores) de um teste psicológico administrado em adolescentes peruanos (15, 16 e 17 anos de idade). Para cada adolescente o sexo [gender (masc. = 1 , fem. = 2)] e estado socioeconômico [socio (baixo = 1, médio = 2)] também foi registrado. As pontuações foram acumuladas em 5 subescalas rotuladas como: independência (indep), suporte (supp), benevolência (benev), conformidade (conform), e liderança (leader).
  1. Examine a normalidade univariada de cada uma das seguintes variáveis: indep, supp, benev, conform, e leader.
  2. Usando todas as 5 variáveis, verifique a suposição de normalidade multivariada.
  3. Construa uma elipse de 99% de confiança para cada par de variáveis.
  4. Assumindo normalidade multivariada. Determine os comprimentos e direções dos eixos do ellipsóide de 95% de confiança para \(\mathbf{\mu}\).
psy_profile_data <- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/psy_profile.dat")
colnames(psy_profile_data) <- c("indep","supp","benev","conform","leader","gender","socio")
head(psy_profile_data)
  1. Um estudo psicológico formado por 4 testes foi conduzido em 32 mulheres e 32 homens. As pontuações de cada teste para cada indivíduo foram coletadas em um vetor [pict, formas,brinqu,vocab]. As componentes são descritas a seguir:

Um dos interesses do estudo é saber se o vetor de médias das pontuações dos testes é o mesmo para homens e mulheres. Para isso conduza um teste de hipóteses apropriado. Não esqueça de checar todas as suposições.

data(mfp)
homens = mfp[,1:4]
mulheres = mfp[,5:8]
colnames(homens) <- c("pict", "formas", "brinqu", "vocab")
colnames(mulheres) <- c("pict", "formas", "brinqu", "vocab")
psy_tests <- rbind(homens,mulheres)
sexo <- rbind(matrix("M",nrow = 32),matrix("F",nrow=32))
psy_tests$sexo <- sexo
head(psy_tests)
n1  <- nrow(homens); n2 <- nrow(mulheres); p <- ncol(mulheres)
m1  <- matrix(colMeans(homens),ncol = 1); m2 <- matrix(colMeans(mulheres),ncol = 1) 
S1  <- var(homens); S2 <- var(mulheres)
Spl <- (1/(n1+n2-2))*((n1-1)*S1 + (n2-1)*S2); invSpl <- solve(Spl)
t2_calc <- ((n1*n2)/(n1+n2))*t(m1 - m2)%*%invSpl%*%(m1-m2)
f_calc  <- (n1+n2-1-p)/((n1+n2-2)*p)*t2calc
p_valor <- pf(fcalc,df1=p,df2 = n1+n2-p-1,lower.tail = FALSE)
data.frame(t2_calc,f_calc,p_valor)
LS0tCnRpdGxlOiAiQXVsYSBQcsOhdGljYSAxIChHRVQwMDEyNikgLSBOb3JtYWwgTXVsdGl2YXJpYWRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBsaWJyYXJpYXMKbGlicmFyeShub3J0ZXN0KQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KGNhcikKbGlicmFyeShlbGxpcHNlKQpsaWJyYXJ5KG12bm9ybWFsVGVzdCkKbGlicmFyeShBQ1NXUikKYGBgCgoKMS4gTyBvYmpldG8gYGFpcl9wb2x1dGlvbmAgY29udMOpbSA0MiBvYnNlcnZhw6fDtWVzIGRlIDcgdmFyacOhdmVpcyBzb2JyZSBhIHBvbHVpw6fDo28gZGUgYXIgcmVnaXN0cmFkYXMgw6BzIDEyOjAwIFBNIGVtIExvcyBBbmdlbGVzIGVtIGRpZmVyZW50ZXMgZGlhcy4gCkNvbSBvcyBkYWRvcyBzb2JyZSBhIHBvbHVpw6fDo28gZG8gYXIgZXhhbWluZSBhIHN1cG9zacOnw6NvIGRlIG5vcm1hbGlkYWRlIGJpdmFyaWFkYSBwYXJhIG8gcGFyIGRlIHZhcmnDoXZlaXMgJFhfNSQgPSBOTzIgZSAkWF82JCA9IE8zLgoKYS4gRXhhbWluZSBhIG5vcm1hbGlkYWRlIHVuaXZhcmlhZGEgZGUgJFhfNSQgZSAkWF82JC4gCmIuIENhbGN1bGUgYXMgZm9ybWFzIHF1YWRyw6F0aWNhcyAkZF9pXjIgPSAoXG1hdGhiZnt4fV9pIC0gXG1hdGhiZntcYmFye3h9fSleXHRvcCBcbWF0aGJme1N9XnstMX0oXG1hdGhiZnt4fV9pIC0gXG1hdGhiZntcYmFye3h9fSkkLCAkaSA9IDEsXGxkb3RzLCA0MiQsICRcbWF0aGJme3h9X2peXHRvcCA9IFt4X3tpNX0seF97aTZ9XSQgZSBjb25zdHJ1YSB1bSBRLVEgcGxvdCBhcHJvcHJpYWRvIHBhcmEgYSBmb3JtYSBxdWFkcsOhdGljYSAkZF4yJC4gQSBzdXBvc2nDp8OjbyBkZSBub3JtYWxpZGFkZSBiaXZhcmlhZGEgcGFyYSBvcyBkYWRvcyDDqSByYXpvw6F2ZWw/CmMuIERldGVybWluZSBhIHByb3BvcsOnw6NvIGRlIG9ic2VydmHDp8O1ZXMgZGUgJFxtYXRoYmZ7eH1faV5cdG9wID0gW3hfe2k1fSx4X3tpNn1dJCwgJGkgPSAxLFxsZG90cywgNDIkIGRlbnRybyBkbyBncsOhZmljbyBkZSBjb250b3JubyBkZSB1bWEgbm9ybWFsIGJpdmFyaWFkYSBjb20gdW1hIHByb2JhYmlsaWRhZGUgZGUgNTAlLgoKCgpgYGB7cn0KYWlyX3BvbGx1dGlvbiA8LSByZWFkLnRhYmxlKCJ+L0RvY3VtZW50cy9DdXJzb3NfR0VUX1VGRi8yMDI0MUdFVDAwMTI2QTEvRGF0YXNldHMvYWlyX3BvbGx1dGlvbi5kYXQiKQpjb2xuYW1lcyhhaXJfcG9sbHV0aW9uKSA8LSBjKCJ3aW5kIiwic29sYXJfcmFkaWF0aW9uIiwiQ08iLCJOTyIsIk5PMiIsIk8zIiwiSEMiKQpoZWFkKGFpcl9wb2xsdXRpb24pCmBgYAoKYGBge3J9CmFpcl9wb2xsdXRpb25fNTYgPC0gYWlyX3BvbGx1dGlvblssYyg1LDYpXQpwYWlycyhhaXJfcG9sbHV0aW9uXzU2LCBwY2ggPSAxOSkKYGBgCmBgYHtyfQpib3hwbG90KGFpcl9wb2xsdXRpb25fNTYsIHBjaCA9IDE5KQpgYGAKCmBgYHtyfQpwYXIobWZyb3c9YygyLDIpKQpudmFyICA8LSBuY29sKGFpcl9wb2xsdXRpb25fNTYpCm5vbWVzIDwtIG5hbWVzKGFpcl9wb2xsdXRpb25fNTYpCmZvciAoaSBpbiAxOm5jb2woYWlyX3BvbGx1dGlvbl81NikpIHsKICBoaXN0KGFpcl9wb2xsdXRpb25fNTZbLGldLCBtYWluID0gcGFzdGUoIkhpc3RvZ3JhbWEgZGUiLG5vbWVzW2ldKSwgeGxhYiA9IHBhc3RlKG5vbWVzW2ldKSkKICBwbG90KGRlbnNpdHkoYWlyX3BvbGx1dGlvbl81NlssaV0pLCBtYWluID0gcGFzdGUoIkRlbnNpZGFkZSBkZSIsbm9tZXNbaV0pKQp9CmBgYApgYGB7cn0KcGFyKG1mcm93PWMoMSwyKSkKZm9yIChqIGluIDE6bnZhcikKewogIHFxUGxvdChzY2FsZShhaXJfcG9sbHV0aW9uXzU2WyxqXSksZGlzdD0ibm9ybSIsbWVhbj0wLHNkPTEsY29sLmxpbmVzPTEsZ3JpZD0iRkFMU0UiLAogICAgICAgICB4bGFiPSJxdWFudGlsIGRhIE4oMCwxKSIseWxhYj1ub21lc1tqXSxjZXg9MS4yLHBjaD0yMCxpZD1GQUxTRSkKfQpgYGAKCmBgYHtyfQojIFNoYXBpcm8gV2lsa3MgVGVzdApzaGFwaXJvLnRlc3QoYWlyX3BvbGx1dGlvbl81NlssMV0pCnNoYXBpcm8udGVzdChhaXJfcG9sbHV0aW9uXzU2WywyXSkKYGBgCgoKYGBge3J9Cm4gPC0gbnJvdyhhaXJfcG9sbHV0aW9uXzU2KQpudmFyIDwtIG5jb2woYWlyX3BvbGx1dGlvbl81NikKdm11IDwtIGNvbE1lYW5zKGFpcl9wb2xsdXRpb25fNTYpCm1jb3YgPC0gY292KGFpcl9wb2xsdXRpb25fNTYpCiMgZm9ybWEgcXVhZHLDoXRpY2EKZDIgPC0gbiptYWhhbGFub2JpcyhhaXJfcG9sbHV0aW9uXzU2LGNlbnRlcj12bXUsY292PW1jb3YpCnFxUGxvdChkMixkaXN0PSJjaGlzcSIsZGY9bnZhcixjb2wubGluZXM9MSxncmlkPSJGQUxTRSIsCiAgICAgICB4bGFiPSJxdWFudGlsIGRhIGRpc3RyaWJ1acOnw6NvIHF1aS1xdWFkcmFkbyIsCiAgICAgICB5bGFiPSJkMiIsCiAgICAgICBjZXg9MS4yLCAKICAgICAgIHBjaCA9IDIwLAogICAgICAgaWQgPSBGQUxTRSkKYGBgCmBgYHtyfQpNYXJkaWFfVGVzdDwtbWFyZGlhKGFpcl9wb2xsdXRpb25fNTYpCk1hcmRpYV9UZXN0JG12LnRlc3QKYGBgCgpgYGB7cn0KcmhvIDwtIGNvcihhaXJfcG9sbHV0aW9uXzU2KQp2YXIgPC0gZGlhZyhtY292KQppPTE7aj0yCnBsb3QoZWxsaXBzZTo6ZWxsaXBzZSh4ID0gcmhvW2ksal0sCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGMoc3FydCh2YXJbaV0pLHNxcnQodmFyW2pdKSksCiAgICAgICAgICAgICAgICAgICAgICBjZW50cmUgPSBjKHZtdVtpXSx2bXVbal0pLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwLjUKICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgdHlwZSA9ICJsIiwKICAgICB4bGFiID0gbm9tZXNbaV0sCiAgICAgeWxhYiA9IG5vbWVzW2pdKQpsaW5lcyh2bXVbaV0sdm11W2pdLCBwY2ggPSA4LCBjb2wgPSAicmVkIiwgdHlwZSA9ICJwIikKcG9pbnRzKGFpcl9wb2xsdXRpb25fNTZbLGldLGFpcl9wb2xsdXRpb25fNTZbLGpdLAogICAgICAgcGNoPTIwLAogICAgICAgY2V4PTEuMiwKICAgICAgIGNleC5sYWI9MS4yLAogICAgICAgY2V4LmF4aXM9MS4yLAogICAgICAgY29sPSJkYXJrZ3JlZW4iKQpgYGAKCgoKMi4gVW0gZWNvbG9naXN0YSBkZSB2aWRhIHNlbHZhZ2VtLCBtZWRpdSAkeF8xJDogY29tcHJpbWVudG8gZG8gY2F1ZGEgKGB0YWlsX2xlbmd0aGApIGVtIG1pbGltZXRyb3MgIGUgJHhfMiQ6IGNvbXByaW1lbnRvIGRhcyBhc2FzIChgd2luZ19sZW5ndGhgKSBlbSBtaWxpbWV0cm9zIGVtIHVtYSBhbW9zdHJhIGRlIDQ1IGF2ZXMgZsOqbWVhcyBkYSBlc3BlY2llICpob29rLWJpbGxlZCBraXRlcyogKEdhdmnDo28tY2FyYWNvbGVpcm8gZW0gcG9ydHVndcOqcykuIEFzIG9ic2VydmHDp8O1ZXMgZXN0w6NvIGFybWF6ZW5hZGFzIG5vIG9iamV0byBgYmlyZHNfZGF0YWAuCgphLiBFeGFtaW5lIGEgbm9ybWFsaWRhZGUgdW5pdmFyaWFkYSBkYXMgdmFyacOhdmVpcyAkWF8xJDogYHRhaWxfbGVuZ3RoYCBlICRYXzIkID0gYHdpbmdfbGVuZ3RoYC4KYi4gRXhhbWluZSBhIG5vcm1hbGlkYWRlIGJpdmFyaWFkYSBkZSAkW1hfMSxYXzJdXlx0b3AkLiDDiSB1bSBtb2RlbG8gdmnDoXZlbCBwYXJhICRbWF8xLFhfMl1eXHRvcCQ/CmMuIFN1cG9uaGEgcXVlIMOpIHNhYmlkbyBxdWUgJFxtdV8xJCA9IDE5MCBtbSBlICRcbXVfMiQgPSAyNzUgbW0gcGFyYSBtYWNob3MgZGEgZXNww6ljaWUgKmhvb2stYmlsbGVkIGtpdGVzKi4gU8OjbyBlc3NlcyB2YWxvcmVzIHJhem/DoXZlaXMgcGFyYSBvIGNvbXByaW1lbnRvIG3DqWRpbyBkYSBjYXVkYSBlIG8gY29tcHJpbWVudG8gbcOpZGlvIGRhcyBhc3NhcyBwYXJhIGF2ZXMgZsOqbWVhcz8gRXhwbGlxdWUuIAoKCmBgYHtyfQpiaXJkc19kYXRhPC0gcmVhZC50YWJsZSgifi9Eb2N1bWVudHMvQ3Vyc29zX0dFVF9VRkYvMjAyNDFHRVQwMDEyNkExL0RhdGFzZXRzL2JpcmRzLmRhdCIpCmNvbG5hbWVzKGJpcmRzX2RhdGEpIDwtIGMoInRhaWxfbGVuZ3RoIiwid2luZ19sZW5ndGgiKQpgYGAKCgozLiBPIG9iamV0byBgcHN5X3Byb2ZpbGVfZGF0YWAgY29uc2lzdGUgZGUgMTMwIG9ic2VydmHDp8O1ZXMgZ2VyYWRhcyBwb3IgcG9udHVhw6fDtWVzICgqc2NvcmVzKikgZGUgdW0gdGVzdGUgcHNpY29sw7NnaWNvIGFkbWluaXN0cmFkbyBlbSBhZG9sZXNjZW50ZXMgcGVydWFub3MgKDE1LCAxNiBlIDE3IGFub3MgZGUgaWRhZGUpLiBQYXJhIGNhZGEgYWRvbGVzY2VudGUgbyBzZXhvIFtnZW5kZXIgKG1hc2MuID0gMSAsIGZlbS4gPSAyKV0gZSBlc3RhZG8gc29jaW9lY29uw7RtaWNvIFtzb2NpbyAoYmFpeG8gPSAxLCBtw6lkaW8gPSAyKV0gdGFtYsOpbSBmb2kgcmVnaXN0cmFkby4gQXMgcG9udHVhw6fDtWVzIGZvcmFtIGFjdW11bGFkYXMgZW0gNSBzdWJlc2NhbGFzIHJvdHVsYWRhcyBjb21vOiBpbmRlcGVuZMOqbmNpYSAoaW5kZXApLCBzdXBvcnRlIChzdXBwKSwgYmVuZXZvbMOqbmNpYSAoYmVuZXYpLCBjb25mb3JtaWRhZGUgKGNvbmZvcm0pLCBlIGxpZGVyYW7Dp2EgKGxlYWRlcikuIAoKKGEpIEV4YW1pbmUgYSBub3JtYWxpZGFkZSB1bml2YXJpYWRhIGRlIGNhZGEgdW1hIGRhcyBzZWd1aW50ZXMgdmFyacOhdmVpczogYGluZGVwYCwgYHN1cHBgLCBgYmVuZXZgLCBgY29uZm9ybWAsIGUgYGxlYWRlcmAuCihiKSBVc2FuZG8gdG9kYXMgYXMgNSB2YXJpw6F2ZWlzLCB2ZXJpZmlxdWUgYSBzdXBvc2nDp8OjbyBkZSBub3JtYWxpZGFkZSBtdWx0aXZhcmlhZGEuIAooYykgQ29uc3RydWEgdW1hIGVsaXBzZSBkZSA5OSUgZGUgY29uZmlhbsOnYSBwYXJhIGNhZGEgcGFyIGRlIHZhcmnDoXZlaXMuCihkKSBBc3N1bWluZG8gbm9ybWFsaWRhZGUgbXVsdGl2YXJpYWRhLiBEZXRlcm1pbmUgb3MgY29tcHJpbWVudG9zIGUgZGlyZcOnw7VlcyBkb3MgZWl4b3MgZG8gZWxsaXBzw7NpZGUgZGUgOTUlIGRlIGNvbmZpYW7Dp2EgcGFyYSAkXG1hdGhiZntcbXV9JC4KCgoKYGBge3J9CnBzeV9wcm9maWxlX2RhdGEgPC0gcmVhZC50YWJsZSgifi9Eb2N1bWVudHMvQ3Vyc29zX0dFVF9VRkYvMjAyNDFHRVQwMDEyNkExL0RhdGFzZXRzL3BzeV9wcm9maWxlLmRhdCIpCmNvbG5hbWVzKHBzeV9wcm9maWxlX2RhdGEpIDwtIGMoImluZGVwIiwic3VwcCIsImJlbmV2IiwiY29uZm9ybSIsImxlYWRlciIsImdlbmRlciIsInNvY2lvIikKaGVhZChwc3lfcHJvZmlsZV9kYXRhKQpgYGAKCjQuIFVtIGVzdHVkbyBwc2ljb2zDs2dpY28gZm9ybWFkbyBwb3IgNCB0ZXN0ZXMgZm9pIGNvbmR1emlkbyBlbSAzMiBtdWxoZXJlcyBlIDMyIGhvbWVucy4gQXMgcG9udHVhw6fDtWVzIGRlIGNhZGEgdGVzdGUgcGFyYSBjYWRhIGluZGl2w61kdW8gZm9yYW0gY29sZXRhZGFzIGVtIHVtIHZldG9yIFtgcGljdGAsIGBmb3JtYXNgLGBicmlucXVgLGB2b2NhYmBdLiBBcyBjb21wb25lbnRlcyBzw6NvIGRlc2NyaXRhcyBhIHNlZ3VpcjoKCi0gYHBpY3RgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgaW5jb25zaXN0w6puY2lhIHBpY3RvcmlhaXMsIAotIGBmb3JtYXNgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgcGxhY2FzIGRlIGZvcm1hcywgCi0gYGJyaW5xdWA6IHNjb3JlIG9idGlkbyBubyB0ZXN0ZSBkZSByZWNvbmhlY2ltZW50byBkZSBicmlucXVlZG9zLCAKLSBgdm9jYWJgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgdm9jYWJ1bMOhcmlvLiAgCgpVbSBkb3MgaW50ZXJlc3NlcyBkbyBlc3R1ZG8gw6kgc2FiZXIgc2UgbyB2ZXRvciBkZSBtw6lkaWFzIGRhcyBwb250dWHDp8O1ZXMgZG9zIHRlc3RlcyDDqSBvIG1lc21vIHBhcmEgaG9tZW5zIGUgbXVsaGVyZXMuIFBhcmEgaXNzbyBjb25kdXphIHVtIHRlc3RlIGRlIGhpcMOzdGVzZXMgYXByb3ByaWFkby4gTsOjbyBlc3F1ZcOnYSBkZSBjaGVjYXIgdG9kYXMgYXMgc3Vwb3Npw6fDtWVzLiAKCgpgYGB7cn0KZGF0YShtZnApCmhvbWVucyA9IG1mcFssMTo0XQptdWxoZXJlcyA9IG1mcFssNTo4XQpjb2xuYW1lcyhob21lbnMpIDwtIGMoInBpY3QiLCAiZm9ybWFzIiwgImJyaW5xdSIsICJ2b2NhYiIpCmNvbG5hbWVzKG11bGhlcmVzKSA8LSBjKCJwaWN0IiwgImZvcm1hcyIsICJicmlucXUiLCAidm9jYWIiKQpwc3lfdGVzdHMgPC0gcmJpbmQoaG9tZW5zLG11bGhlcmVzKQpzZXhvIDwtIHJiaW5kKG1hdHJpeCgiTSIsbnJvdyA9IDMyKSxtYXRyaXgoIkYiLG5yb3c9MzIpKQpwc3lfdGVzdHMkc2V4byA8LSBzZXhvCmhlYWQocHN5X3Rlc3RzKQpgYGAKYGBge3J9Cm4xICA8LSBucm93KGhvbWVucyk7IG4yIDwtIG5yb3cobXVsaGVyZXMpOyBwIDwtIG5jb2wobXVsaGVyZXMpCm0xICA8LSBtYXRyaXgoY29sTWVhbnMoaG9tZW5zKSxuY29sID0gMSk7IG0yIDwtIG1hdHJpeChjb2xNZWFucyhtdWxoZXJlcyksbmNvbCA9IDEpIApTMSAgPC0gdmFyKGhvbWVucyk7IFMyIDwtIHZhcihtdWxoZXJlcykKU3BsIDwtICgxLyhuMStuMi0yKSkqKChuMS0xKSpTMSArIChuMi0xKSpTMik7IGludlNwbCA8LSBzb2x2ZShTcGwpCnQyX2NhbGMgPC0gKChuMSpuMikvKG4xK24yKSkqdChtMSAtIG0yKSUqJWludlNwbCUqJShtMS1tMikKZl9jYWxjICA8LSAobjErbjItMS1wKS8oKG4xK24yLTIpKnApKnQyY2FsYwpwX3ZhbG9yIDwtIHBmKGZjYWxjLGRmMT1wLGRmMiA9IG4xK24yLXAtMSxsb3dlci50YWlsID0gRkFMU0UpCmRhdGEuZnJhbWUodDJfY2FsYyxmX2NhbGMscF92YWxvcikKYGBgCgoKCgoK