Análise do Jogo de Imagens aplicadas no Ensino médio

Amostra dos dados da pesquisa realizada

head(pos_gabarito$dados, 10)
ABCDEFGHIJ0123456789
codigo
<int>
municipio
<chr>
escola
<chr>
modelo
<dbl>
turmas
<dbl>
sexo
<chr>
idade
<chr>
temp.residencia
<chr>
area
<chr>
1SilvâniaParticular11Feminino17Urbana
2SilvâniaParticular11Feminino1717Urbana
3SilvâniaParticular11Masculino1717Urbana
4SilvâniaParticular11Masculino1717Urbana
5SilvâniaParticular21Feminino1717Rural
6SilvâniaParticular21Feminino1715Rural
7SilvâniaParticular21Masculino183Urbana
8SilvâniaParticular31Feminino168Rural
9SilvâniaParticular31Masculino16Urbana
10SilvâniaParticular31Feminino1717Urbana

Determinado a taxa de percepção

Entende-se por taxa de percepção o fator determinado pela quantidade média de acertos dentre as questões apresentadas aos alunos, em relação a turma em que o questionario foi aplicado.

Percepção dos alunos

print(pos_gabarito$percentual_acerto)
ABCDEFGHIJ0123456789
codigo
<int>
municipio
<chr>
turmas
<dbl>
area
<chr>
sexo
<chr>
frequencia
<chr>
fez.aula
<chr>
flona
<chr>
nota
<dbl>
1Silvânia1UrbanaFemininoÁs vezesSim, parque ou trilhaNão3.3
2Silvânia1UrbanaFemininoÁs vezesSim, parque ou trilhaSim5.0
3Silvânia1UrbanaMasculinoFrequentementeSim, FLONASim5.2
4Silvânia1UrbanaMasculinoFrequentementeNão fezNão2.2
5Silvânia1RuralFemininoFrequentementeNão fezNão2.6
6Silvânia1RuralFemininoSempreSim, fazendaNão3.0
7Silvânia1UrbanaMasculinoSempreNão fezNão1.0
8Silvânia1RuralFemininoSempreNão fezSim3.2
9Silvânia1UrbanaMasculinoÁs vezesNão fezSim3.3
10Silvânia1UrbanaFemininoFrequentementeSim, fazendaNão4.0

Entendendo a distribuição das médias

Níveis de reconhecimento (acertos) por tipo de origem dos animais

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_nome_exoticas,
                  pos_gabarito$percentual_acerto$p_nome_nativas,
                  "Identificação dos nomes"),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_origem_exoticas,
                  pos_gabarito$percentual_acerto$p_origem_nativas,
                  "Identificação das origens", y = ""),
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_indice_exoticas,
                  pos_gabarito$percentual_acerto$p_indice_nativas,
                  "Taxa de reconhecimento", y = ""), 
    ncol = 3,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

Diferença de acertos

grid.arrange(
    pos_gabarito$dados %>%
        ggplot(aes(x = exoticas - nativas)) +
        geom_histogram(binwidth = 1) +
        labs(title = "Nomes das espécies", y = "Freq") +
        my_theme +
        theme(axis.text.x = element_text(angle = 0, hjust = .5, size = 12)),
    pos_gabarito$dados %>%
        ggplot(aes(x = origem_exoticas - origem_nativas)) +
        geom_histogram(binwidth = 1) +
        labs(title = "Origem das espécies", y = "Freq") +
        my_theme +
        theme(axis.text.x = element_text(angle = 0, hjust = .5, size = 12)),
    pos_gabarito$dados %>%
        ggplot(aes(x = indice_exoticas - indice_nativas)) +
        geom_histogram(binwidth = 1) +
        labs(title = "Taxa de reconhecimento", y = "Freq") +
        my_theme +
        theme(axis.text.x = element_text(angle = 0, hjust = .5, size = 12)),
    ncol = 1,
    top = textGrob("Histograma das diferenças Exoticas x Nativas\n",
                   gp = gpar(fontsize = 20, font = 2)),
    #heights=c(3/4, 1/4),
    right = "\n",
    bottom = "\n"
)

Grupos taxonómicos

rbind(
    cbind(grupo = "Aves", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_aves))),
    cbind(grupo = "Aves", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_aves))),
    cbind(grupo = "Invertebrados", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_invertebrado))),
    cbind(grupo = "Invertebrados", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_invertebrado))),
    cbind(grupo = "Mamiferos", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_mamifero))),
    cbind(grupo = "Mamiferos", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_mamifero))),
    cbind(grupo = "Peixes", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_peixe))),
    cbind(grupo = "Peixes", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_peixe))),
    cbind(grupo = "Répteis", origem = "exotica",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_exotica_reptil))),
    cbind(grupo = "Répteis", origem = "nativa",
          as.data.frame(table(pos_gabarito$percentual_acerto$p_nativa_reptil)))
) %>%
        ggplot(aes(x=Var1, y = Freq, fill = origem)) + 
        geom_bar(stat="identity", width=.5, position = "dodge") +
        facet_wrap(~grupo, scales = "free") + 
        labs(title = "Percentual de acerto x grupos taxonomicos\n", 
             y = "Frequencia", x = "Percentual de acerto") +
        my_theme

Medindo as médias de acerto na identificação do nome das espécies

grafico_densidade <- function(variavel, cor, titulo) {
    plot <- 
        pos_gabarito$proporcoes$por_turma %>% 
        ggdensity(x = variavel, fill = cor,
          main = titulo,
          xlab = "Percentual de acertos") + 
        xlim(0, 1) + 
        ylim(0, 8)
    nomalidade <- 
        ggtexttable(
            normalidade(pos_gabarito$proporcoes$por_turma[[variavel]]), 
            rows = NULL, theme = ttheme(base_style = "mOrange", base_size = 8)
        )
    
    resultado <- list(
        plot = plot,
        normalidade = nomalidade
    )
    return(resultado)
}
t1 <- grafico_densidade("p_nativas", "green", "Identificação do nome das espécies de origem Nativas")
t2 <- grafico_densidade("p_exoticas", "red", "Identificação do nome das espécies de origem Exóticas")
t3 <- grafico_densidade("p_origem_nativas", "darkgreen", "Identificação de origem Nativas")
t4 <- grafico_densidade("p_origem_exoticas", "darkred", "Identificação de origem Exóticas")
t5 <- grafico_densidade("p_indice_nativas", "orange", "Indice de reconhecimento Nativas (origens + espécies)")
t6 <- grafico_densidade("p_indice_exoticas", "orangered", "Indice de reconhecimento Exóticas (origens + espécies)")
barplot(tapply(
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    pos_gabarito$percentual_acerto$turmas,
    mean), main = "\nMédia de taxa de reconhecimento das origens nativas por turmas\n")

Teste de normalidade

Para determinar a normalidade nas distribuiçoes das respostas do jogo de imagens.

Identificação médio das turmas (nomes das espécies & origens)

grid.arrange(t1$plot, t2$plot,
             t1$normalidade, t2$normalidade,
             t3$plot, t4$plot,
             t3$normalidade, t4$normalidade,
             ncol = 2,
             heights = c(3,2,3,2),
             top = textGrob("Densidade de identificação média das turmas entre \nespecies e suas origens\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Indice de reconhecimento médio das turmas

grid.arrange(t5$plot, t6$plot,
             t5$normalidade, t6$normalidade,
             ncol = 2,
             heights = c(4,3),
             top = textGrob("Densidade dos indices de reconhecimento médio das turmas\n",
                            gp = gpar(fontsize = 20, font = 2))
             )

Q-Q Test

qqplot.data <- function (vec, titulo) {
  # following four lines from base R's qqline()
  y <- quantile(vec[!is.na(vec)], c(0.25, 0.75))
  x <- qnorm(c(0.25, 0.75))
  slope <- diff(y)/diff(x)
  int <- y[1L] - slope * x[1L]
  d <- data.frame(resids = vec)
  ggplot(d, aes(sample = resids)) + 
      stat_qq() + 
      geom_abline(slope = slope, intercept = int, col = "red") +
      xlim(-2, 2) +
      ylim(0, 1) +
      theme_bw() +
      labs(
        title = titulo
    )
}
q1 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_nativas, "Identificação do nome das espécies de origem Nativas")
q2 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_exoticas, "Identificação do nome das espécies de origem Exoticas")
q3 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_nativas, "Identificação de origem Nativas")
q4 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_origem_exoticas, "Identificação de origem Exoticas")
q5 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_nativas, "Indice de reconhecimento Nativas (origens + espécies)")
q6 <- qqplot.data(pos_gabarito$proporcoes$por_turma$p_indice_exoticas, "Indice de reconhecimento Exoticas (origens + espécies)")
grid.arrange(q1, q2, 
             q3, q4,
             q5, q6,
             ncol = 2,
             top = textGrob("Normal Q-Q Plot\n", 
                            gp = gpar(fontsize = 20, font = 2))
             )

Teste de variância

Para determinar a variância

variancia <- data.frame(
    Algoritmo = c("F test to compare two variances"),
    "Comparação" = c("Nativas x Exóticas"),
    "Variável" = c(
        "Indice de reconhecimento",
        "Identificação do nome das espécies",
        "Identificação da origem"
    ),
    "p_valor" = c(
        var.test(pos_gabarito$proporcoes$por_turma$p_indice_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_indice_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_exoticas, 
                 alternative = "two.sided")$p.value,
        var.test(pos_gabarito$proporcoes$por_turma$p_origem_nativas, 
                 pos_gabarito$proporcoes$por_turma$p_origem_exoticas, 
                 alternative = "two.sided")$p.value
    )
)
variancia <- variancia %>%
    mutate(
        variancia = p_valor > 0.05,
        p_valor = cell_spec(round(p_valor, 4), bold = T, color = "black", align = "right"),
        variancia = cell_spec(variancia, bold = variancia,
                       color= ifelse(variancia, "white", "black"), 
                       background = ifelse(variancia, "green", "#CCCCCC"))
    )
package ‘bindrcpp’ was built under R version 3.4.4
variancia %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(1, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") 
Algoritmo Comparação Variável p_valor variancia
F test to compare two variances Nativas x Exóticas Indice de reconhecimento 0.2969 TRUE
Identificação do nome das espécies 0.7332 TRUE
Identificação da origem 0.0343 FALSE

Analises descritivas

pos_gabarito$especies
ABCDEFGHIJ0123456789
origem
<chr>
grupo
<chr>
especie
<fctr>
especieDesc
<fctr>
modelo
<int>
NativoMamiferotamandua-bandeiratamandua-bandeira1
ExóticoMamiferoornitorrincoornitorrinco4
ExóticoPeixepeixe-palhaçopeixe-palhaço4
ExóticoAveavestruzavestruz2
ExóticoMamiferojavalijavali2
ExóticoMamiferocoalacoala1
ExóticoRéptilcobra-najacobra-naja3
ExóticoInvertebradomosquito-denguemosquito-dengue1
ExóticoRéptilcamaleaocamaleao4
NativoAvecoruja-buraqueiracoruja-buraqueira3

Reconhecimento do nome das especies

Por origem
pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = grupo)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.5) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~origem, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Reconhecimento do nome das especies por origem",
         fill = "Grupos", x = "", y = "\nFrequencia relativa") +
    my_theme

Por espécie
pos_gabarito$especies %>% 
    ggplot(aes(especieDesc, fr, fill = origem)) + 
    geom_bar(stat="identity") +
    geom_text(aes(label = paste0(round(fr * 100, 1), "%")), 
              position = position_dodge(0.9), vjust = 0.5,
              hjust = -0.3) +
    scale_y_continuous(limits = c(0,1.2), labels = scales::percent) +
    facet_wrap(~grupo, scales = "free_y") +
    coord_flip() +
    theme_bw() +
    labs(title = "Reconhecimento do nome das especies por grupo taxonómico",
         fill = "Origem", x = "", y = "\nFrequencia relativa") +
    my_theme

Testes de hipoteses

Esperado p-valor >= 0.05 na normalidade (espera-se H0) Esperado p-valor <= 0.05 no teste de hipotese (espera-se H1)

Tabela dos testes de hipoteses aplicados

t1 <- t.test(
   pos_gabarito$percentual_acerto$p_nome_exoticas, 
   pos_gabarito$percentual_acerto$p_nome_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t2 <- t.test(
   pos_gabarito$percentual_acerto$p_origem_exoticas, 
   pos_gabarito$percentual_acerto$p_origem_nativas, 
   alternative = "two.sided", paired = TRUE, conf.level = .95)
t3 <- t.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE, conf.level = .95)
t1b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_nome_exoticas, 
    pos_gabarito$percentual_acerto$p_nome_nativas, 
    alternative = "two.sided", paired = TRUE)
t2b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_origem_exoticas, 
    pos_gabarito$percentual_acerto$p_origem_nativas, 
    alternative = "two.sided", paired = TRUE)
t3b <- wilcox.test(
    pos_gabarito$percentual_acerto$p_indice_exoticas, 
    pos_gabarito$percentual_acerto$p_indice_nativas, 
    alternative = "two.sided", paired = TRUE)
data.frame(
    "Comparação" = c("Exóticas x Nativas"),
    Algoritmo = c(t1$method, t2$method, t3$method, t1b$method, t2b$method, t3b$method),
    "Variável" = c(
        "Identificação do nome das espécies",
        "Identificação da origem",
        "Indice de reconhecimento"
    ),
    p_valor = c(t1$p.value, t2$p.value, t3$p.value, 
                t1b$p.value, t2b$p.value, t3b$p.value),
    H0 = c(t1$p.value >= 0.05, t2$p.value >= 0.05, t3$p.value >= 0.05, 
           t1b$p.value >= 0.05, t2b$p.value >= 0.05, t3b$p.value >= 0.05),
    H1 = c(t1$p.value < 0.05, t2$p.value < 0.05, t3$p.value < 0.05,
           t1b$p.value < 0.05, t2b$p.value < 0.05, t3b$p.value < 0.05),
    "Confiança" = c(
        paste(paste0(round(t1$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t2$conf.int * 100, 2), "%"), collapse = " ~ "),
        paste(paste0(round(t3$conf.int * 100, 2), "%"), collapse = " ~ "),
        "-",
        "-",
        "-"
    )
) %>%
  mutate(
    p_valor = cell_spec(p_valor, bold = T, color = "black", align = "right"),
    H0 = cell_spec(H0, bold = H0,
                   color= ifelse(H0, "white", "black"), 
                   background = ifelse(H0, "green", "#CCCCCC")),
    H1 = cell_spec(H1, bold = H1, 
                   color = ifelse(H1, "white", "black"), 
                   background = ifelse(H1, "green", "#CCCCCC"))
  ) %>%
  kable(escape = F) %>%
  kable_styling(c("striped", "bordered"), full_width = TRUE) %>%
  column_spec(2, bold = TRUE) %>%
  collapse_rows(columns = 1:2, valign = "top") %>%
  footnote(general = "Intervalo de confiança 95%",
           general_title = "\nObs.: ",
           footnote_as_chunk = T)
Comparação Algoritmo Variável p_valor H0 H1 Confiança
Exóticas x Nativas Paired t-test Identificação do nome das espécies 3.04980558564671e-88 FALSE TRUE 33.88% ~ 39.25%
Identificação da origem 9.53291446070658e-46 FALSE TRUE -31.12% ~ -24.46%
Indice de reconhecimento 2.42750761381397e-13 FALSE TRUE 8.53% ~ 14.47%
Wilcoxon signed rank test with continuity correction Identificação do nome das espécies 9.13901290530953e-52 FALSE TRUE -
Identificação da origem 1.34804992730944e-34 FALSE TRUE -
Indice de reconhecimento 4.73943028972212e-12 FALSE TRUE -

Obs.:
Intervalo de confiança 95%

1 - Estudantes têm maior proporção de acerto de espécies exóticas do que espécies nativas brasileiras

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
t = 27, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.3388 0.3925
sample estimates:
mean of the differences 
                 0.3657 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_nome_exoticas and pos_gabarito$percentual_acerto$p_nome_nativas
V = 52000, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

2 - Estudantes identificam mais origem das espécies exóticas

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
t = -16, df = 370, p-value <2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.3112 -0.2446
sample estimates:
mean of the differences 
                -0.2779 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_origem_exoticas and pos_gabarito$percentual_acerto$p_origem_nativas
V = 4100, p-value <2e-16
alternative hypothesis: true location shift is not equal to 0

3 - Estudantes tem maior proporção de reconhecimento (nome e origem) de espécies exóticas do que espécies nativas brasileiras

Resultado do teste paramétrico


    Paired t-test

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
t = 7.6, df = 370, p-value = 2e-13
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.08525 0.14472
sample estimates:
mean of the differences 
                  0.115 

Resultado do teste não paramétrico


    Wilcoxon signed rank test with continuity correction

data:  pos_gabarito$percentual_acerto$p_indice_exoticas and pos_gabarito$percentual_acerto$p_indice_nativas
V = 25000, p-value = 5e-12
alternative hypothesis: true location shift is not equal to 0

4 - Estudantes que residem em cidade próxima a UC têm maior proporção de acerto entre as espécies nativas brasileiras.

tmp <- pos_gabarito$percentual_acerto %>%
    select(municipio, p_nome_exoticas:p_indice_nativas)
t.test(p_indice_nativas ~ municipio, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by municipio
t = 0.65, df = 360, p-value = 0.5
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.02863  0.05711
sample estimates:
mean in group Bela Vista de Goiás            mean in group Silvânia 
                           0.3362                            0.3220 

5 - Estudantes que residem em área rural tem maior proporção de acertos sobre espécies nativas brasileiras do que estudantes que residem na área urbana

tmp <- pos_gabarito$percentual_acerto %>%
    select(area, p_nome_exoticas:p_indice_nativas)
t.test(p_indice_nativas ~ area, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by area
t = -2, df = 110, p-value = 0.05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1040103  0.0002798
sample estimates:
 mean in group Rural mean in group Urbana 
              0.2873               0.3392 
tmp <- pos_gabarito$percentual_acerto %>%
    select(area, p_nome_exoticas:p_indice_nativas) %>%
    melt("area")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(area, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = area, y = value, fill = origem), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

6 - Estudantes que visitam a UC têm maior proporção de acerto de espécies nativas do que estudantes que não visitam

tmp <- 
    pos_gabarito$percentual_acerto %>%
    filter(municipio == "Silvânia") %>%
    select(flona, p_indice_nativas)
#normalidade(tmp$p_indice_nativas)
t.test(p_indice_nativas ~ flona, tmp)

    Welch Two Sample t-test

data:  p_indice_nativas by flona
t = -1.6, df = 86, p-value = 0.1
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.13024  0.01485
sample estimates:
mean in group Não mean in group Sim 
           0.2808            0.3385 

7 - Estudantes tem maior proporção de acertos em relação aos grupos de maior porte e da fauna exótica do que espécies menores e nativas.

plotAnaliseTaxonomicosGenovart()

grid.arrange(
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_aves,
                  pos_gabarito$percentual_acerto$p_nativa_aves,
                  "Aves", "Média percentual de acertos\n",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_invertebrado,
                  pos_gabarito$percentual_acerto$p_nativa_invertebrado,
                  "Invertebrados", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)),
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_mamifero,
                  pos_gabarito$percentual_acerto$p_nativa_mamifero,
                  "Mamiferos", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_peixe,
                  pos_gabarito$percentual_acerto$p_nativa_peixe,
                  "Peixes", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    
    plotAnaliseMedias(pos_gabarito$percentual_acerto$p_exotica_reptil,
                  pos_gabarito$percentual_acerto$p_nativa_reptil,
                  "Répteis", y = "",
                  mean(pos_gabarito$percentual_acerto$p_indice_exoticas),
                  mean(pos_gabarito$percentual_acerto$p_indice_nativas)), 
    ncol = 5,
    top = textGrob("Niveis de reconhecimento por origem\n", 
                   gp = gpar(fontsize = 20, font = 2)),
    right = "\n"
)

tmp <- pos_gabarito$percentual_acerto %>%
    select(p_exotica_aves:p_nativa_reptil) %>%
    melt()
# anova(lm(value ~ variable, tmp))
tmp <- cbind(tmp, colsplit(tmp$variable, "_", c("p", "origem", "grupo"))) %>%
    select(origem, grupo, value)
anova(lm(value ~ grupo * origem, tmp))
Analysis of Variance Table

Response: value
               Df Sum Sq Mean Sq F value  Pr(>F)    
grupo           4     14     3.6    17.3 4.4e-14 ***
origem          1    123   122.7   597.4 < 2e-16 ***
grupo:origem    4     18     4.5    21.7 < 2e-16 ***
Residuals    3660    752     0.2                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
tukey <- TukeyHSD(aov(lm(value ~ grupo * origem, tmp)))
tukey
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(value ~ grupo * origem, tmp))

$grupo
                            diff      lwr      upr  p adj
invertebrado-aves     -1.458e-01 -0.21034 -0.08122 0.0000
mamifero-aves         -7.883e-15 -0.06456  0.06456 1.0000
peixe-aves            -4.905e-02 -0.11361  0.01551 0.2319
reptil-aves           -1.294e-01 -0.19399 -0.06487 0.0000
mamifero-invertebrado  1.458e-01  0.08122  0.21034 0.0000
peixe-invertebrado     9.673e-02  0.03217  0.16129 0.0004
reptil-invertebrado    1.635e-02 -0.04821  0.08091 0.9585
peixe-mamifero        -4.905e-02 -0.11361  0.01551 0.2319
reptil-mamifero       -1.294e-01 -0.19399 -0.06487 0.0000
reptil-peixe          -8.038e-02 -0.14494 -0.01582 0.0062

$origem
                  diff    lwr     upr p adj
nativa-exotica -0.3657 -0.395 -0.3363     0

$`grupo:origem`
                                              diff       lwr       upr  p adj
invertebrado:exotica-aves:exotica        -0.032698 -0.138602  0.073206 0.9935
mamifero:exotica-aves:exotica             0.103542 -0.002362  0.209446 0.0616
peixe:exotica-aves:exotica                0.114441  0.008537  0.220345 0.0222
reptil:exotica-aves:exotica              -0.147139 -0.253043 -0.041235 0.0005
aves:nativa-aves:exotica                 -0.220708 -0.326612 -0.114804 0.0000
invertebrado:nativa-aves:exotica         -0.479564 -0.585468 -0.373660 0.0000
mamifero:nativa-aves:exotica             -0.324251 -0.430155 -0.218347 0.0000
peixe:nativa-aves:exotica                -0.433243 -0.539147 -0.327339 0.0000
reptil:nativa-aves:exotica               -0.332425 -0.438329 -0.226521 0.0000
mamifero:exotica-invertebrado:exotica     0.136240  0.030336  0.242144 0.0019
peixe:exotica-invertebrado:exotica        0.147139  0.041235  0.253043 0.0005
reptil:exotica-invertebrado:exotica      -0.114441 -0.220345 -0.008537 0.0222
aves:nativa-invertebrado:exotica         -0.188011 -0.293915 -0.082107 0.0000
invertebrado:nativa-invertebrado:exotica -0.446866 -0.552770 -0.340962 0.0000
mamifero:nativa-invertebrado:exotica     -0.291553 -0.397457 -0.185649 0.0000
peixe:nativa-invertebrado:exotica        -0.400545 -0.506449 -0.294641 0.0000
reptil:nativa-invertebrado:exotica       -0.299728 -0.405632 -0.193824 0.0000
peixe:exotica-mamifero:exotica            0.010899 -0.095005  0.116803 1.0000
reptil:exotica-mamifero:exotica          -0.250681 -0.356585 -0.144777 0.0000
aves:nativa-mamifero:exotica             -0.324251 -0.430155 -0.218347 0.0000
invertebrado:nativa-mamifero:exotica     -0.583106 -0.689010 -0.477202 0.0000
mamifero:nativa-mamifero:exotica         -0.427793 -0.533697 -0.321889 0.0000
peixe:nativa-mamifero:exotica            -0.536785 -0.642689 -0.430881 0.0000
reptil:nativa-mamifero:exotica           -0.435967 -0.541871 -0.330063 0.0000
reptil:exotica-peixe:exotica             -0.261580 -0.367484 -0.155676 0.0000
aves:nativa-peixe:exotica                -0.335150 -0.441054 -0.229246 0.0000
invertebrado:nativa-peixe:exotica        -0.594005 -0.699909 -0.488101 0.0000
mamifero:nativa-peixe:exotica            -0.438692 -0.544596 -0.332788 0.0000
peixe:nativa-peixe:exotica               -0.547684 -0.653588 -0.441780 0.0000
reptil:nativa-peixe:exotica              -0.446866 -0.552770 -0.340962 0.0000
aves:nativa-reptil:exotica               -0.073569 -0.179473  0.032335 0.4575
invertebrado:nativa-reptil:exotica       -0.332425 -0.438329 -0.226521 0.0000
mamifero:nativa-reptil:exotica           -0.177112 -0.283016 -0.071208 0.0000
peixe:nativa-reptil:exotica              -0.286104 -0.392008 -0.180200 0.0000
reptil:nativa-reptil:exotica             -0.185286 -0.291190 -0.079382 0.0000
invertebrado:nativa-aves:nativa          -0.258856 -0.364760 -0.152952 0.0000
mamifero:nativa-aves:nativa              -0.103542 -0.209446  0.002362 0.0616
peixe:nativa-aves:nativa                 -0.212534 -0.318438 -0.106630 0.0000
reptil:nativa-aves:nativa                -0.111717 -0.217621 -0.005813 0.0291
mamifero:nativa-invertebrado:nativa       0.155313  0.049409  0.261217 0.0002
peixe:nativa-invertebrado:nativa          0.046322 -0.059582  0.152226 0.9321
reptil:nativa-invertebrado:nativa         0.147139  0.041235  0.253043 0.0005
peixe:nativa-mamifero:nativa             -0.108992 -0.214896 -0.003088 0.0377
reptil:nativa-mamifero:nativa            -0.008174 -0.114078  0.097730 1.0000
reptil:nativa-peixe:nativa                0.100817 -0.005087  0.206721 0.0777
tky <- as.data.frame(tukey$`grupo:origem`)
tky <- tky %>%
  mutate(pair = reorder(rownames(tky), `diff`),
         signifcante = (`p adj` <= 0.05),
         cor = ifelse(`p adj` <= 0.05, "red", "black"))
ggplot(tky, aes(colour = cut(`p adj`, c(0, 0.05, 1), 
                               label = c("Significante", "Não significante")))) +
  geom_hline(yintercept=0, lty="11", colour="grey30") +
  geom_errorbar(aes(pair, ymin=lwr, ymax=upr), width=0.5, size=1) +
  geom_point(aes(pair, diff), size=3, shape=21) +
  scale_color_manual(values = c("red", "black"))+
  coord_flip() +
  theme_bw() +
  theme(axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10), 
        legend.position = "top") +
  labs(title = "Grupo taxonómico x Origem das espécies",
       subtitle = "Análise Tukey",
       colour = "", x = "Comparação de grupos", y = "\nDiferença entre as médias")

8 - Estudantes que possuem maior frequência de contato com a natureza têm maior proporção de acertos das espécies nativas

tmp <- pos_gabarito$percentual_acerto %>%
    select(frequencia, p_nome_exoticas:p_indice_nativas) %>%
    melt(id = "frequencia")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(frequencia, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = origem, y = value, fill = frequencia), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

anova(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
            Df Sum Sq Mean Sq F value Pr(>F)
frequencia   4    0.1  0.0247    0.46   0.76
Residuals  729   38.9  0.0533               
#TukeyHSD(aov(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice"))))

9 - Estudantes que participam de aulas práticas tem maior proporção de acertos sobre as espécies nativas do que estudantes sem tais aulas

tmp <- pos_gabarito$percentual_acerto %>%
    select(fez.aula, p_nome_exoticas:p_indice_nativas) %>%
    melt(id = "fez.aula")
tmp <-
    cbind(tmp, colsplit(tmp$variable, "_", c("p", "indicador", "origem"))) %>%
    select(fez.aula, indicador, origem, value)
tmp %>%
  ggplot() + 
  geom_boxplot(aes(x = origem, y = value, fill = fez.aula), show.legend = T) + 
  scale_y_continuous(limits = c(0,1), labels = scales::percent) +
  facet_wrap(~indicador) +
  theme_bw() +
  labs(title = "Boxplot de identificação de espécies Nativas nos critérios estabelecidos",
       y = "Percentual de identificação", x = "") +
  my_theme

anova(lm(value  ~ fez.aula, data = tmp %>% filter(indicador == "indice")))
Analysis of Variance Table

Response: value
           Df Sum Sq Mean Sq F value Pr(>F)
fez.aula    6    0.2  0.0388    0.73   0.63
Residuals 727   38.7  0.0533               
#TukeyHSD(aov(lm(value  ~ frequencia, data = tmp %>% filter(indicador == "indice"))))

10 - Rankings das espécies citadas

a1 <- 
    pos_gabarito$raking_animais$nativos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "orange", high = "red") +
    theme_bw() +
    labs(title = "Espécies citadas como nativas",
       y = "Frequencia", x = "") +
    my_theme
a2 <- 
    pos_gabarito$raking_animais$exoticos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,90)) +
    scale_fill_gradient(low = "lightblue", high = "darkblue") +
    theme_bw() +
    labs(title = "Espécies citadas como exóticas",
       y = "Frequencia", x = "") +
    my_theme
grid.arrange(a1, a2,
             nrow = 2,
             top = textGrob("TOP 20 - Ranking das espécies citadas como exemplo\n", 
                            gp = gpar(fontsize = 20, font = 2))
)

a3 <- 
    pos_gabarito$raking_animais$protegidos %>%
    head(20) %>%
    ggplot(aes(x = animais, y = freq, fill = freq)) +
    geom_bar(stat="identity", show.legend = F) +
    geom_text(aes(label = freq), position = position_dodge(0.9), vjust = -1, hjust = 0.5) +
    scale_y_continuous(limits = c(0,190)) +
    scale_fill_gradient(low = "green", high = "darkgreen") +
    theme_bw() +
    labs(title = "Espécies citadas como nativas",
       y = "Frequencia", x = "") +
    my_theme
grid.arrange(a3,
             top = textGrob("TOP 20 - Ranking das espécies citadas como exemplo para proteção\n", 
                            gp = gpar(fontsize = 20, font = 2))
)

LS0tCnRpdGxlOiAiTWVzdHJhZG8gQmlvbG9naWEiCmF1dGhvcjogIkhlcnNvbiBNZWxvIgpkYXRlOiAiMjgvMDYvMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNQotLS0KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlcnJvcj1GQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkobm9ydGVzdCkKbGlicmFyeShzdGF0cykKbGlicmFyeShtdWx0Y29tcFZpZXcpCgpzdXBwcmVzc1dhcm5pbmdzKFN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICdlbl9VUy5VVEYtOCcpKQojb3B0aW9ucyhzY2lwZW4gPSA5OTksIGRpZ2l0cyA9IDQpCm9wdGlvbnMoc2NpcGVuID0gMCwgZGlnaXRzID0gNCkKIyBvcHRpb25zKCJzY2lwZW4iPS0xMDAsICJkaWdpdHMiPTYpCiMgZ2V0d2QoKQpsb2FkKCJkYWRvcy5SRGF0YSIpCgoKbXlfdGhlbWUgPC0gCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9IDEsIHNpemUgPSAxMiksIAogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgdGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKbm9ybWFsaWRhZGUgPC0gZnVuY3Rpb24oeCkgewogICAgdDEgPC0gc2hhcGlyby50ZXN0KHgpCiAgICB0MiA8LSBzZi50ZXN0KHgpCiAgICB0MyA8LSBsaWxsaWUudGVzdCh4KQogICAgdDQgPC0gYWQudGVzdCh4KQogICAgdDUgPC0gY3ZtLnRlc3QoeCkKICAgIHJldHVybiggZGF0YS5mcmFtZSgKICAgICAgICBBbGdvcml0bW8gPSBjKHQxJG1ldGhvZCwgdDIkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQzJG1ldGhvZCwgdDQkbWV0aG9kLCAKICAgICAgICAgICAgICAgICAgIHQ1JG1ldGhvZCksCiAgICAgICAgcC52YWxvciA9IGModDEkcC52YWx1ZSwgdDIkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSwgdDQkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgdDUkcC52YWx1ZSksCiAgICAgICAgTm9ybWFsaWRhZGUgPSBjKHQxJHAudmFsdWUgPiAuMDUsIHQyJHAudmFsdWUgPiAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgdDMkcC52YWx1ZSA+IC4wNSwgdDQkcC52YWx1ZSA+IC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICB0NSRwLnZhbHVlID4gLjA1KQogICAgKSkKfQojIEltcGxlbWVudGFuZG8gZm9ybXVsYSBwYXJhIHRlc3RlcyBlc3RhdMOtc3RpY29zIHBhZHJvbml6YWRhCnRlc3RlLmFub3ZhIDwtIGZ1bmN0aW9uKGZvcm11bGEsIGRhdGEpIHsKICAgIHQubm9ybWFsaWRhZGUgPC0gCiAgICAgICAgYWdncmVnYXRlKGZvcm11bGEsIGRhdGEsIAogICAgICAgICAgICAgICAgICBGVU4gPSBmdW5jdGlvbih4KSBzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSkgJT4lCiAgICAgICAgbXV0YXRlKEgwID0gKHZhbHVlIDw9IDAuMDUpLAogICAgICAgICAgICAgICBub3JtYWxpZGFkZSA9IGNlbGxfc3BlYyhIMCwgYm9sZCA9IEgwLAogICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZShIMCwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMCwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICAgICAgICAgICAgKSAlPiUKICAgICAgICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICAgICAgICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogICAgICAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKQoKICAgIHQuYW5vdmEgPC0gYW5vdmEobG0oZm9ybXVsYSwgZGF0YSkpCiAgICB0LnR1a2V5IDwtIFR1a2V5SFNEKGFvdihsbShmb3JtdWxhLCBkYXRhKSkpCgogICAgaWYobGVuZ3RoKHQudHVrZXkpID4gMSkgewogICAgICAgIGVycm9yKCJBTk9WQSBmYXRvcmlhbCAoZmFsdGEgdHJhdGFyIGlzc28pISIpCiAgICB9CiAgICB0dWtleS50YmwgPC0gYXMuZGF0YS5mcmFtZSh0LnR1a2V5W1sxXV0sIGN1dC5uYW1lcyA9IEYpCiAgICB0dWtleS50YmwkY29tcGFyYWNhbyA9IHJvd25hbWVzKHR1a2V5LnRibCkKICAgIHJvd25hbWVzKHR1a2V5LnRibCkgPSBOVUxMCiAgICB0YWJlbGEudHVrZXkgPC0gdHVrZXkudGJsICU+JQogICAgICAgIG11dGF0ZShIMCA9IChgcCBhZGpgIDw9IDAuMDUpLAogICAgICAgICAgICAgICBzaWduaWZpY2FuY2lhID0gY2VsbF9zcGVjKEgwLCBib2xkID0gSDAsCiAgICAgICAgICAgICAgICAgICBjb2xvcj0gaWZlbHNlKEgwLCAid2hpdGUiLCAiYmxhY2siKSwgCiAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKEgwLCAiZ3JlZW4iLCAiI0NDQ0NDQyIpKQogICAgICAgICAgICAgICApICU+JQogICAgICAgIHNlbGVjdChjb21wYXJhY2FvLCBkaWZmOmBwIGFkamAsIHNpZ25pZmljYW5jaWEpICU+JQogICAgICAgIGthYmxlKGVzY2FwZSA9IEYpICU+JQogICAgICAgIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgICAgICAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpCiAgICAKICAgICAgICAKICAgIHJlc3VsdGFkbyA8LSAKICAgICAgICBsaXN0KAogICAgICAgICAgICB0ZXN0ZS5ub3JtYWxpZGFkZSA9IHQubm9ybWFsaWRhZGUsCiAgICAgICAgICAgIHRlc3RlLmFub3ZhID0gdC5hbm92YSwKICAgICAgICAgICAgdHVrZXkgPSB0LnR1a2V5LAogICAgICAgICAgICB0YWJlbGEudHVrZXkgPSB0YWJlbGEudHVrZXkKICAgICAgICApCiAgICByZXR1cm4ocmVzdWx0YWRvKQp9CgppYy5tZWRpYSA8LSBmdW5jdGlvbih2ZXRvckRhZG9zKXsKICAgICMjIwogICAgIyMgQ2FsY3VsYW5kbyBvIGludGVydmFsbyBkZSBjb25maWFuw6dhCiAgICAjIyMKICAgIG1lZGlhIDwtIG1lYW4odmV0b3JEYWRvcykgI23DqWRpYSBkYSBhbW9zdHJhCiAgICBzIDwtIHNkKHZldG9yRGFkb3MpICNkZXN2aW8gcGFkcsOjbwogICAgbiA8LSBsZW5ndGgodmV0b3JEYWRvcykgI3RhbWFuaG8gZGEgYW1vc3RyYQogICAgZXJyb1BhZHJhbyA8LSBxbm9ybSgwLjk3NSkqcy9zcXJ0KG4pCiAgICBsaW1pdGUgPC0gMS45NiAqIGVycm9QYWRyYW8KICAgIGVycm9yLmluZmVyaW9yIDwtIG1lZGlhIC0gZXJyb1BhZHJhbwogICAgZXJyb3Iuc3VwZXJpb3IgPC0gbWVkaWEgKyBlcnJvUGFkcmFvCiAgICBsaW1pdGUuaW5mZXJpb3IgPC0gbWVkaWEgLSBsaW1pdGUKICAgIGxpbWl0ZS5zdXBlcmlvciA8LSBtZWRpYSArIGxpbWl0ZQogICAgcmV0dXJuKGRhdGEuZnJhbWUoCiAgICAgICAgbWVkaWEsIAogICAgICAgIGRlc3ZpbyA9IHMsIAogICAgICAgIGVycm9QYWRyYW8sIAogICAgICAgIGVycm9yLmluZmVyaW9yLCBlcnJvci5zdXBlcmlvciwgCiAgICAgICAgbGltaXRlLmluZmVyaW9yLCBsaW1pdGUuc3VwZXJpb3IpKQp9CgpwbG90QW5hbGlzZU1lZGlhcyA8LSBmdW5jdGlvbih2ZXRvckV4b3RpY2FzLCB2ZXRvck5hdGl2YXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXR1bG8gPSAiIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl0ZXh0ID0gIk3DqWRpYSBwZXJjZW50dWFsIGRlIGFjZXJ0b3NcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXhvdGljYXMgPSAtMSwgbWVkaWFOYXRpdmFzID0gLTEpIHsKICAgIHRtcCA8LSByYmluZCgKICAgICAgICBjYmluZChvcmlnZW0gPSAiRXhvdGljYXMiLCBpYy5tZWRpYSh2ZXRvckV4b3RpY2FzKSksCiAgICAgICAgY2JpbmQob3JpZ2VtID0gIk5hdGl2YXMiLCBpYy5tZWRpYSh2ZXRvck5hdGl2YXMpKSMsCiAgICAgICAgI2NiaW5kKG9yaWdlbSA9ICJEaWZlcmVuw6dhIiwgaWMubWVkaWEodmV0b3JFeG90aWNhcyAtIHZldG9yTmF0aXZhcykpCiAgICApCiAgICAjIGxpbWl0ZXNFc2NhbGEgPSBjKG1pbih0bXAkbGltaXRlLmluZmVyaW9yKSowLjgsICMgMjAlIGEgbWVub3MgZG8gbWVub3IgbGltaXRlIGluZmVyaW9yIAogICAgIyAgICAgICAgICAgICAgICAgICBtYXgodG1wJGxpbWl0ZS5zdXBlcmlvcikqMS4yKSAjIDIwJSBhIG1haXMgZG8gbWVub3IgbGltaXRlIHN1cGVyaW9yIAogICAgbGltaXRlc0VzY2FsYSA8LSBjKDAsMSkKICAgIAogICAgcCA8LSAKICAgICAgICBnZ3Bsb3QodG1wLCBhZXMob3JpZ2VtLCBtZWRpYSwgY29sb3VyID0gb3JpZ2VtLCBzaGFwZSA9IG9yaWdlbSkpICsKICAgICAgICBnZW9tX2Nyb3NzYmFyKGFlcyh5bWluID0gZXJyb3IuaW5mZXJpb3IsIHltYXggPSBlcnJvci5zdXBlcmlvciksIHdpZHRoID0gMC4xKSArCiAgICAgICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxpbWl0ZS5pbmZlcmlvciwgeW1heCA9IGxpbWl0ZS5zdXBlcmlvciksIHdpZHRoID0gMC4xKSArCiAgICAgICAgZ2VvbV9wb2ludChhZXMob3JpZ2VtLCBtZWRpYSksIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgICMgZ2VvbV9wb2ludChhZXMoZ3J1cG8sIG1lZGlhLCBzaGFwZSA9IG9yaWdlbSksIHNpemUgPSA2LCBzaG93LmxlZ2VuZCA9IEYpICsKICAgICAgICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzPWMoMTUsIDE5KSkrCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGxpbWl0ZXNFc2NhbGEsIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgICAgIGxhYnModGl0bGUgPSB0aXR1bG8sCiAgICAgICAgICAgICB4ID0gIiIsCiAgICAgICAgICAgICB5ID0geXRleHQsCiAgICAgICAgICAgICBjb2xvciA9ICdNw6lkaWFzIG9yaWdlbnMgZ2VyYWwnKSArIAogICAgICAgICMgbXlfdGhlbWUgKyAKICAgICAgICAjIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgICAgICAgdGhlbWVfYncoKSArCiAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwgCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgIHRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKICAgIGlmKG1lZGlhRXhvdGljYXMgPiAwKSB7CiAgICAgICAgcCA8LSAKICAgICAgICAgICAgcCArCiAgICAgICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lZGlhRXhvdGljYXMsIGxpbmV0eXBlID0gMiwKICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXI9ImRhcmtibHVlIikgKwogICAgICAgICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWRpYU5hdGl2YXMsIGxpbmV0eXBlID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyPSJyZWQiKQogICAgfQogICAgcmV0dXJuKHApCn0KCnBsb3RBbmFsaXNlVGF4b25vbWljb3NHZW5vdmFydCA8LSBmdW5jdGlvbigpIHsKICAKICBtZWRpYUV4b3RpY2FzIDwtIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcykKICBtZWRpYU5hdGl2YXMgPC0gbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX25hdGl2YXMpCiAgCiAgdG1wIDwtIHJiaW5kKAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJleG90aWNhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9hdmVzKSksCiAgICBjYmluZChncnVwbyA9ICJJbnZlcnRlYnJhZG9zIiwgb3JpZ2VtID0gImV4b3RpY2EiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX2ludmVydGVicmFkbykpLAogICAgY2JpbmQoZ3J1cG8gPSAiTWFtw61mZXJvcyIsIG9yaWdlbSA9ICJleG90aWNhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9tYW1pZmVybykpLAogICAgY2JpbmQoZ3J1cG8gPSAiUGVpeGVzIiwgb3JpZ2VtID0gImV4b3RpY2EiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX3BlaXhlKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJleG90aWNhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9yZXB0aWwpKSwKICAgIAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJuYXRpdmEiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfYXZlcykpLAogICAgY2JpbmQoZ3J1cG8gPSAiSW52ZXJ0ZWJyYWRvcyIsIG9yaWdlbSA9ICJuYXRpdmEiLCBpYy5tZWRpYShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfaW52ZXJ0ZWJyYWRvKSksCiAgICBjYmluZChncnVwbyA9ICJNYW3DrWZlcm9zIiwgb3JpZ2VtID0gIm5hdGl2YSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9tYW1pZmVybykpLAogICAgY2JpbmQoZ3J1cG8gPSAiUGVpeGVzIiwgb3JpZ2VtID0gIm5hdGl2YSIsIGljLm1lZGlhKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9wZWl4ZSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiUsOpcHRlaXMiLCBvcmlnZW0gPSAibmF0aXZhIiwgaWMubWVkaWEocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3JlcHRpbCkpCiAgKQogIGxpbWl0ZXNFc2NhbGEgPC0gYygwLDEpCiAgCiAgcCA8LSAKICAgIGdncGxvdCh0bXAsIGFlcyhncnVwbywgbWVkaWEsIGNvbG91ciA9IG9yaWdlbSkpICsKICAgIGdlb21fY3Jvc3NiYXIoYWVzKHltaW4gPSBlcnJvci5pbmZlcmlvciwgeW1heCA9IGVycm9yLnN1cGVyaW9yKSwgd2lkdGggPSAwLjEpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsaW1pdGUuaW5mZXJpb3IsIHltYXggPSBsaW1pdGUuc3VwZXJpb3IpLCB3aWR0aCA9IDAuMSkgKwogICAgZ2VvbV9wb2ludChhZXMoZ3J1cG8sIG1lZGlhKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGxpbWl0ZXNFc2NhbGEsIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgbGFicyh0aXRsZSA9ICJSZWNvbmhlY2ltZW50byBkYXMgZXNww6ljaWVzIiwKICAgICAgICAgeCA9ICIiLAogICAgICAgICB5ID0gIlxuVGF4YSBkZSByZXNwb3N0YXMgY29ycmV0YXNcbiIsCiAgICAgICAgIGNvbG91ciA9ICdPcmlnZW06JykgKyAKICAgIG15X3RoZW1lICMrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgaWYobWVkaWFFeG90aWNhcyA+IDApIHsKICAgIHAgPC0gCiAgICAgIHAgKwogICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWRpYUV4b3RpY2FzLCBsaW5ldHlwZSA9IDIsCiAgICAgICAgICAgICAgICAgY29sb3VyPSJvcmFuZ2VyZWQiKQogIH0KICBpZihtZWRpYU5hdGl2YXMgPiAwKSB7CiAgICBwIDwtIAogICAgICBwICsKICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVkaWFOYXRpdmFzLCBsaW5ldHlwZSA9IDIsIAogICAgICAgICAgICAgICAgIGNvbG91cj0iZGFya2JsdWUiKQogIH0KICByZXR1cm4ocCkKfQpgYGAKCiMjIEFuw6FsaXNlIGRvIEpvZ28gZGUgSW1hZ2VucyBhcGxpY2FkYXMgbm8gRW5zaW5vIG3DqWRpbwoKIyMjIEFtb3N0cmEgZG9zIGRhZG9zIGRhIHBlc3F1aXNhIHJlYWxpemFkYQoKYGBge3J9CmhlYWQocG9zX2dhYmFyaXRvJGRhZG9zLCAxMCkKYGBgCgojIyMjIERldGVybWluYWRvIGEgdGF4YSBkZSBwZXJjZXDDp8OjbwoKRW50ZW5kZS1zZSBwb3IgdGF4YSBkZSBwZXJjZXDDp8OjbyBvIGZhdG9yIGRldGVybWluYWRvIHBlbGEgcXVhbnRpZGFkZSBtw6lkaWEgZGUgYWNlcnRvcyBkZW50cmUgYXMgcXVlc3TDtWVzIGFwcmVzZW50YWRhcyBhb3MgYWx1bm9zLCBlbSByZWxhw6fDo28gYSB0dXJtYSBlbSBxdWUgbyBxdWVzdGlvbmFyaW8gZm9pIGFwbGljYWRvLgoKUGVyY2Vww6fDo28gZG9zIGFsdW5vcwoKYGBge3J9CnByaW50KHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0bykKYGBgCgojIyMjIEVudGVuZGVuZG8gYSBkaXN0cmlidWnDp8OjbyBkYXMgbcOpZGlhcwoKTsOtdmVpcyBkZSByZWNvbmhlY2ltZW50byAoYWNlcnRvcykgcG9yIHRpcG8gZGUgb3JpZ2VtIGRvcyBhbmltYWlzCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9M30KZ3JpZC5hcnJhbmdlKAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9uYXRpdmFzLAogICAgICAgICAgICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRvcyBub21lcyIpLAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX2V4b3RpY2FzLAogICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9vcmlnZW1fbmF0aXZhcywKICAgICAgICAgICAgICAgICAgIklkZW50aWZpY2HDp8OjbyBkYXMgb3JpZ2VucyIsIHkgPSAiIiksCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsCiAgICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLAogICAgICAgICAgICAgICAgICAiVGF4YSBkZSByZWNvbmhlY2ltZW50byIsIHkgPSAiIiksIAogICAgbmNvbCA9IDMsCiAgICB0b3AgPSB0ZXh0R3JvYigiTml2ZWlzIGRlIHJlY29uaGVjaW1lbnRvIHBvciBvcmlnZW1cbiIsIAogICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSksCiAgICByaWdodCA9ICJcbiIKKQpgYGAKCkRpZmVyZW7Dp2EgZGUgYWNlcnRvcwoKYGBge3IsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTZ9CmdyaWQuYXJyYW5nZSgKICAgIHBvc19nYWJhcml0byRkYWRvcyAlPiUKICAgICAgICBnZ3Bsb3QoYWVzKHggPSBleG90aWNhcyAtIG5hdGl2YXMpKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgICAgICAgbGFicyh0aXRsZSA9ICJOb21lcyBkYXMgZXNww6ljaWVzIiwgeSA9ICJGcmVxIikgKwogICAgICAgIG15X3RoZW1lICsKICAgICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gLjUsIHNpemUgPSAxMikpLAogICAgcG9zX2dhYmFyaXRvJGRhZG9zICU+JQogICAgICAgIGdncGxvdChhZXMoeCA9IG9yaWdlbV9leG90aWNhcyAtIG9yaWdlbV9uYXRpdmFzKSkgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogICAgICAgIGxhYnModGl0bGUgPSAiT3JpZ2VtIGRhcyBlc3DDqWNpZXMiLCB5ID0gIkZyZXEiKSArCiAgICAgICAgbXlfdGhlbWUgKwogICAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgaGp1c3QgPSAuNSwgc2l6ZSA9IDEyKSksCiAgICBwb3NfZ2FiYXJpdG8kZGFkb3MgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4ID0gaW5kaWNlX2V4b3RpY2FzIC0gaW5kaWNlX25hdGl2YXMpKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgICAgICAgbGFicyh0aXRsZSA9ICJUYXhhIGRlIHJlY29uaGVjaW1lbnRvIiwgeSA9ICJGcmVxIikgKwogICAgICAgIG15X3RoZW1lICsKICAgICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gLjUsIHNpemUgPSAxMikpLAogICAgbmNvbCA9IDEsCiAgICB0b3AgPSB0ZXh0R3JvYigiSGlzdG9ncmFtYSBkYXMgZGlmZXJlbsOnYXMgRXhvdGljYXMgeCBOYXRpdmFzXG4iLAogICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSksCiAgICAjaGVpZ2h0cz1jKDMvNCwgMS80KSwKICAgIHJpZ2h0ID0gIlxuIiwKICAgIGJvdHRvbSA9ICJcbiIKKQpgYGAKCkdydXBvcyB0YXhvbsOzbWljb3MKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLjV9CnJiaW5kKAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9hdmVzKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiQXZlcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfYXZlcykpKSwKICAgIGNiaW5kKGdydXBvID0gIkludmVydGVicmFkb3MiLCBvcmlnZW0gPSAiZXhvdGljYSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfaW52ZXJ0ZWJyYWRvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiSW52ZXJ0ZWJyYWRvcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfaW52ZXJ0ZWJyYWRvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiTWFtaWZlcm9zIiwgb3JpZ2VtID0gImV4b3RpY2EiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX21hbWlmZXJvKSkpLAogICAgY2JpbmQoZ3J1cG8gPSAiTWFtaWZlcm9zIiwgb3JpZ2VtID0gIm5hdGl2YSIsCiAgICAgICAgICBhcy5kYXRhLmZyYW1lKHRhYmxlKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25hdGl2YV9tYW1pZmVybykpKSwKICAgIGNiaW5kKGdydXBvID0gIlBlaXhlcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9wZWl4ZSkpKSwKICAgIGNiaW5kKGdydXBvID0gIlBlaXhlcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcGVpeGUpKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJleG90aWNhIiwKICAgICAgICAgIGFzLmRhdGEuZnJhbWUodGFibGUocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9yZXB0aWwpKSksCiAgICBjYmluZChncnVwbyA9ICJSw6lwdGVpcyIsIG9yaWdlbSA9ICJuYXRpdmEiLAogICAgICAgICAgYXMuZGF0YS5mcmFtZSh0YWJsZShwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcmVwdGlsKSkpCikgJT4lCiAgICAgICAgZ2dwbG90KGFlcyh4PVZhcjEsIHkgPSBGcmVxLCBmaWxsID0gb3JpZ2VtKSkgKyAKICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS41LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAgICAgICBmYWNldF93cmFwKH5ncnVwbywgc2NhbGVzID0gImZyZWUiKSArIAogICAgICAgIGxhYnModGl0bGUgPSAiUGVyY2VudHVhbCBkZSBhY2VydG8geCBncnVwb3MgdGF4b25vbWljb3NcbiIsIAogICAgICAgICAgICAgeSA9ICJGcmVxdWVuY2lhIiwgeCA9ICJQZXJjZW50dWFsIGRlIGFjZXJ0byIpICsKICAgICAgICBteV90aGVtZQoKYGBgCgpNZWRpbmRvIGFzIG3DqWRpYXMgZGUgYWNlcnRvIG5hIGlkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMKCmBgYHtyIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTEuOH0KYmFycGxvdCh0YXBwbHkoCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHR1cm1hcywKICAgIG1lYW4pLCBtYWluID0gIlxuTcOpZGlhIGRlIHRheGEgZGUgcmVjb25oZWNpbWVudG8gZGFzIG9yaWdlbnMgZXjDs3RpY2FzIHBvciB0dXJtYXNcbiIpCmBgYAoKYGBge3IgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9MS44fQpiYXJwbG90KHRhcHBseSgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9uYXRpdmFzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byR0dXJtYXMsCiAgICBtZWFuKSwgbWFpbiA9ICJcbk3DqWRpYSBkZSB0YXhhIGRlIHJlY29uaGVjaW1lbnRvIGRhcyBvcmlnZW5zIG5hdGl2YXMgcG9yIHR1cm1hc1xuIikKYGBgCgoKIyMjIFRlc3RlIGRlIG5vcm1hbGlkYWRlCgpQYXJhIGRldGVybWluYXIgYSBub3JtYWxpZGFkZSBuYXMgZGlzdHJpYnVpw6dvZXMgZGFzIHJlc3Bvc3RhcyBkbyBqb2dvIGRlIGltYWdlbnMuCgpgYGB7ciwgZWNobz1GQUxTRX0KZ3JhZmljb19kZW5zaWRhZGUgPC0gZnVuY3Rpb24odmFyaWF2ZWwsIGNvciwgdGl0dWxvKSB7CiAgICBwbG90IDwtIAogICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSAlPiUgCiAgICAgICAgZ2dkZW5zaXR5KHggPSB2YXJpYXZlbCwgZmlsbCA9IGNvciwKICAgICAgICAgIG1haW4gPSB0aXR1bG8sCiAgICAgICAgICB4bGFiID0gIlBlcmNlbnR1YWwgZGUgYWNlcnRvcyIpICsgCiAgICAgICAgeGxpbSgwLCAxKSArIAogICAgICAgIHlsaW0oMCwgOCkKICAgIG5vbWFsaWRhZGUgPC0gCiAgICAgICAgZ2d0ZXh0dGFibGUoCiAgICAgICAgICAgIG5vcm1hbGlkYWRlKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYVtbdmFyaWF2ZWxdXSksIAogICAgICAgICAgICByb3dzID0gTlVMTCwgdGhlbWUgPSB0dGhlbWUoYmFzZV9zdHlsZSA9ICJtT3JhbmdlIiwgYmFzZV9zaXplID0gOCkKICAgICAgICApCiAgICAKICAgIHJlc3VsdGFkbyA8LSBsaXN0KAogICAgICAgIHBsb3QgPSBwbG90LAogICAgICAgIG5vcm1hbGlkYWRlID0gbm9tYWxpZGFkZQogICAgKQogICAgcmV0dXJuKHJlc3VsdGFkbykKfQoKdDEgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfbmF0aXZhcyIsICJncmVlbiIsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBOYXRpdmFzIikKdDIgPC0gZ3JhZmljb19kZW5zaWRhZGUoInBfZXhvdGljYXMiLCAicmVkIiwgIklkZW50aWZpY2HDp8OjbyBkbyBub21lIGRhcyBlc3DDqWNpZXMgZGUgb3JpZ2VtIEV4w7N0aWNhcyIpCnQzIDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX29yaWdlbV9uYXRpdmFzIiwgImRhcmtncmVlbiIsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIE5hdGl2YXMiKQp0NCA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9vcmlnZW1fZXhvdGljYXMiLCAiZGFya3JlZCIsICJJZGVudGlmaWNhw6fDo28gZGUgb3JpZ2VtIEV4w7N0aWNhcyIpCnQ1IDwtIGdyYWZpY29fZGVuc2lkYWRlKCJwX2luZGljZV9uYXRpdmFzIiwgIm9yYW5nZSIsICJJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gTmF0aXZhcyAob3JpZ2VucyArIGVzcMOpY2llcykiKQp0NiA8LSBncmFmaWNvX2RlbnNpZGFkZSgicF9pbmRpY2VfZXhvdGljYXMiLCAib3JhbmdlcmVkIiwgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byBFeMOzdGljYXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKYGBgCgojIyMjIElkZW50aWZpY2HDp8OjbyBtw6lkaW8gZGFzIHR1cm1hcyAobm9tZXMgZGFzIGVzcMOpY2llcyAmIG9yaWdlbnMpCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD01fQpncmlkLmFycmFuZ2UodDEkcGxvdCwgdDIkcGxvdCwKICAgICAgICAgICAgIHQxJG5vcm1hbGlkYWRlLCB0MiRub3JtYWxpZGFkZSwKICAgICAgICAgICAgIHQzJHBsb3QsIHQ0JHBsb3QsCiAgICAgICAgICAgICB0MyRub3JtYWxpZGFkZSwgdDQkbm9ybWFsaWRhZGUsCiAgICAgICAgICAgICBuY29sID0gMiwKICAgICAgICAgICAgIGhlaWdodHMgPSBjKDMsMiwzLDIpLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIkRlbnNpZGFkZSBkZSBpZGVudGlmaWNhw6fDo28gbcOpZGlhIGRhcyB0dXJtYXMgZW50cmUgXG5lc3BlY2llcyBlIHN1YXMgb3JpZ2Vuc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKIyMjIyBJbmRpY2UgZGUgcmVjb25oZWNpbWVudG8gbcOpZGlvIGRhcyB0dXJtYXMKCmBgYHtyIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CmdyaWQuYXJyYW5nZSh0NSRwbG90LCB0NiRwbG90LAogICAgICAgICAgICAgdDUkbm9ybWFsaWRhZGUsIHQ2JG5vcm1hbGlkYWRlLAogICAgICAgICAgICAgbmNvbCA9IDIsCiAgICAgICAgICAgICBoZWlnaHRzID0gYyg0LDMpLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIkRlbnNpZGFkZSBkb3MgaW5kaWNlcyBkZSByZWNvbmhlY2ltZW50byBtw6lkaW8gZGFzIHR1cm1hc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCiAgICAgICAgICAgICApCmBgYAoKCiMjIyBRLVEgVGVzdAoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTR9CnFxcGxvdC5kYXRhIDwtIGZ1bmN0aW9uICh2ZWMsIHRpdHVsbykgewogICMgZm9sbG93aW5nIGZvdXIgbGluZXMgZnJvbSBiYXNlIFIncyBxcWxpbmUoKQogIHkgPC0gcXVhbnRpbGUodmVjWyFpcy5uYSh2ZWMpXSwgYygwLjI1LCAwLjc1KSkKICB4IDwtIHFub3JtKGMoMC4yNSwgMC43NSkpCiAgc2xvcGUgPC0gZGlmZih5KS9kaWZmKHgpCiAgaW50IDwtIHlbMUxdIC0gc2xvcGUgKiB4WzFMXQoKICBkIDwtIGRhdGEuZnJhbWUocmVzaWRzID0gdmVjKQoKICBnZ3Bsb3QoZCwgYWVzKHNhbXBsZSA9IHJlc2lkcykpICsgCiAgICAgIHN0YXRfcXEoKSArIAogICAgICBnZW9tX2FibGluZShzbG9wZSA9IHNsb3BlLCBpbnRlcmNlcHQgPSBpbnQsIGNvbCA9ICJyZWQiKSArCiAgICAgIHhsaW0oLTIsIDIpICsKICAgICAgeWxpbSgwLCAxKSArCiAgICAgIHRoZW1lX2J3KCkgKwogICAgICBsYWJzKAogICAgICAgIHRpdGxlID0gdGl0dWxvCiAgICApCn0KCnExIDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX25hdGl2YXMsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBOYXRpdmFzIikKcTIgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfZXhvdGljYXMsICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIGRlIG9yaWdlbSBFeG90aWNhcyIpCnEzIDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9uYXRpdmFzLCAiSWRlbnRpZmljYcOnw6NvIGRlIG9yaWdlbSBOYXRpdmFzIikKcTQgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfb3JpZ2VtX2V4b3RpY2FzLCAiSWRlbnRpZmljYcOnw6NvIGRlIG9yaWdlbSBFeG90aWNhcyIpCnE1IDwtIHFxcGxvdC5kYXRhKHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2luZGljZV9uYXRpdmFzLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIE5hdGl2YXMgKG9yaWdlbnMgKyBlc3DDqWNpZXMpIikKcTYgPC0gcXFwbG90LmRhdGEocG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX2V4b3RpY2FzLCAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIEV4b3RpY2FzIChvcmlnZW5zICsgZXNww6ljaWVzKSIpCgpncmlkLmFycmFuZ2UocTEsIHEyLCAKICAgICAgICAgICAgIHEzLCBxNCwKICAgICAgICAgICAgIHE1LCBxNiwKICAgICAgICAgICAgIG5jb2wgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dEdyb2IoIk5vcm1hbCBRLVEgUGxvdFxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAyMCwgZm9udCA9IDIpKQogICAgICAgICAgICAgKQpgYGAKCiMjIyBUZXN0ZSBkZSB2YXJpw6JuY2lhCgpQYXJhIGRldGVybWluYXIgYSB2YXJpw6JuY2lhCgpgYGB7cn0KdmFyaWFuY2lhIDwtIGRhdGEuZnJhbWUoCiAgICBBbGdvcml0bW8gPSBjKCJGIHRlc3QgdG8gY29tcGFyZSB0d28gdmFyaWFuY2VzIiksCiAgICAiQ29tcGFyYcOnw6NvIiA9IGMoIk5hdGl2YXMgeCBFeMOzdGljYXMiKSwKICAgICJWYXJpw6F2ZWwiID0gYygKICAgICAgICAiSW5kaWNlIGRlIHJlY29uaGVjaW1lbnRvIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRvIG5vbWUgZGFzIGVzcMOpY2llcyIsCiAgICAgICAgIklkZW50aWZpY2HDp8OjbyBkYSBvcmlnZW0iCiAgICApLAogICAgInBfdmFsb3IiID0gYygKICAgICAgICB2YXIudGVzdChwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9pbmRpY2VfbmF0aXZhcywgCiAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHByb3BvcmNvZXMkcG9yX3R1cm1hJHBfaW5kaWNlX2V4b3RpY2FzLCAKICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlLAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX25hdGl2YXMsIAogICAgICAgICAgICAgICAgIHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX2V4b3RpY2FzLCAKICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlLAogICAgICAgIHZhci50ZXN0KHBvc19nYWJhcml0byRwcm9wb3Jjb2VzJHBvcl90dXJtYSRwX29yaWdlbV9uYXRpdmFzLCAKICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcHJvcG9yY29lcyRwb3JfdHVybWEkcF9vcmlnZW1fZXhvdGljYXMsIAogICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpJHAudmFsdWUKICAgICkKKQoKdmFyaWFuY2lhIDwtIHZhcmlhbmNpYSAlPiUKICAgIG11dGF0ZSgKICAgICAgICB2YXJpYW5jaWEgPSBwX3ZhbG9yID4gMC4wNSwKICAgICAgICBwX3ZhbG9yID0gY2VsbF9zcGVjKHJvdW5kKHBfdmFsb3IsIDQpLCBib2xkID0gVCwgY29sb3IgPSAiYmxhY2siLCBhbGlnbiA9ICJyaWdodCIpLAogICAgICAgIHZhcmlhbmNpYSA9IGNlbGxfc3BlYyh2YXJpYW5jaWEsIGJvbGQgPSB2YXJpYW5jaWEsCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9IGlmZWxzZSh2YXJpYW5jaWEsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kID0gaWZlbHNlKHZhcmlhbmNpYSwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICAgICkKCnZhcmlhbmNpYSAlPiUKICBrYWJsZShlc2NhcGUgPSBGKSAlPiUKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiYm9yZGVyZWQiKSwgZnVsbF93aWR0aCA9IFRSVUUpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUKICBjb2xsYXBzZV9yb3dzKGNvbHVtbnMgPSAxOjIsIHZhbGlnbiA9ICJ0b3AiKSAKYGBgCgojIyMgQW5hbGlzZXMgZGVzY3JpdGl2YXMKCmBgYHtyfQpwb3NfZ2FiYXJpdG8kZXNwZWNpZXMKYGBgCgojIyMjIFJlY29uaGVjaW1lbnRvIGRvIG5vbWUgZGFzIGVzcGVjaWVzCgojIyMjIyBQb3Igb3JpZ2VtCgpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0KcG9zX2dhYmFyaXRvJGVzcGVjaWVzICU+JSAKICAgIGdncGxvdChhZXMoZXNwZWNpZURlc2MsIGZyLCBmaWxsID0gZ3J1cG8pKSArIAogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKGZyICogMTAwLCAxKSwgIiUiKSksIAogICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAwLjUsCiAgICAgICAgICAgICAgaGp1c3QgPSAtMC41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEuMiksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgZmFjZXRfd3JhcCh+b3JpZ2VtLCBzY2FsZXMgPSAiZnJlZV95IikgKwogICAgY29vcmRfZmxpcCgpICsKICAgIHRoZW1lX2J3KCkgKwogICAgbGFicyh0aXRsZSA9ICJSZWNvbmhlY2ltZW50byBkbyBub21lIGRhcyBlc3BlY2llcyBwb3Igb3JpZ2VtIiwKICAgICAgICAgZmlsbCA9ICJHcnVwb3MiLCB4ID0gIiIsIHkgPSAiXG5GcmVxdWVuY2lhIHJlbGF0aXZhIikgKwogICAgbXlfdGhlbWUKYGBgCgojIyMjIyBQb3IgZXNww6ljaWUKCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQpwb3NfZ2FiYXJpdG8kZXNwZWNpZXMgJT4lIAogICAgZ2dwbG90KGFlcyhlc3BlY2llRGVzYywgZnIsIGZpbGwgPSBvcmlnZW0pKSArIAogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKGZyICogMTAwLCAxKSwgIiUiKSksIAogICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAwLjUsCiAgICAgICAgICAgICAgaGp1c3QgPSAtMC4zKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEuMiksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgZmFjZXRfd3JhcCh+Z3J1cG8sIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHRpdGxlID0gIlJlY29uaGVjaW1lbnRvIGRvIG5vbWUgZGFzIGVzcGVjaWVzIHBvciBncnVwbyB0YXhvbsOzbWljbyIsCiAgICAgICAgIGZpbGwgPSAiT3JpZ2VtIiwgeCA9ICIiLCB5ID0gIlxuRnJlcXVlbmNpYSByZWxhdGl2YSIpICsKICAgIG15X3RoZW1lCmBgYAoKIyMgVGVzdGVzIGRlIGhpcG90ZXNlcwoKRXNwZXJhZG8gcC12YWxvciA+PSAwLjA1IG5hIG5vcm1hbGlkYWRlIChlc3BlcmEtc2UgSDApCkVzcGVyYWRvIHAtdmFsb3IgPD0gMC4wNSBubyB0ZXN0ZSBkZSBoaXBvdGVzZSAoZXNwZXJhLXNlIEgxKQoKVGFiZWxhIGRvcyB0ZXN0ZXMgZGUgaGlwb3Rlc2VzIGFwbGljYWRvcwoKYGBge3J9CnQxIDwtIHQudGVzdCgKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcywgCiAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX25vbWVfbmF0aXZhcywgCiAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAuOTUpCnQyIDwtIHQudGVzdCgKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX25hdGl2YXMsIAogICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFLCBjb25mLmxldmVsID0gLjk1KQp0MyA8LSB0LnRlc3QoCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfZXhvdGljYXMsIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMsIAogICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSwgY29uZi5sZXZlbCA9IC45NSkKdDFiIDwtIHdpbGNveC50ZXN0KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbm9tZV9leG90aWNhcywgCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9ub21lX25hdGl2YXMsIAogICAgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwgcGFpcmVkID0gVFJVRSkKdDJiIDwtIHdpbGNveC50ZXN0KAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfb3JpZ2VtX2V4b3RpY2FzLCAKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX29yaWdlbV9uYXRpdmFzLCAKICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUpCnQzYiA8LSB3aWxjb3gudGVzdCgKICAgIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcywgCiAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcywgCiAgICBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBUUlVFKQpkYXRhLmZyYW1lKAogICAgIkNvbXBhcmHDp8OjbyIgPSBjKCJFeMOzdGljYXMgeCBOYXRpdmFzIiksCiAgICBBbGdvcml0bW8gPSBjKHQxJG1ldGhvZCwgdDIkbWV0aG9kLCB0MyRtZXRob2QsIHQxYiRtZXRob2QsIHQyYiRtZXRob2QsIHQzYiRtZXRob2QpLAogICAgIlZhcmnDoXZlbCIgPSBjKAogICAgICAgICJJZGVudGlmaWNhw6fDo28gZG8gbm9tZSBkYXMgZXNww6ljaWVzIiwKICAgICAgICAiSWRlbnRpZmljYcOnw6NvIGRhIG9yaWdlbSIsCiAgICAgICAgIkluZGljZSBkZSByZWNvbmhlY2ltZW50byIKICAgICksCiAgICBwX3ZhbG9yID0gYyh0MSRwLnZhbHVlLCB0MiRwLnZhbHVlLCB0MyRwLnZhbHVlLCAKICAgICAgICAgICAgICAgIHQxYiRwLnZhbHVlLCB0MmIkcC52YWx1ZSwgdDNiJHAudmFsdWUpLAogICAgSDAgPSBjKHQxJHAudmFsdWUgPj0gMC4wNSwgdDIkcC52YWx1ZSA+PSAwLjA1LCB0MyRwLnZhbHVlID49IDAuMDUsIAogICAgICAgICAgIHQxYiRwLnZhbHVlID49IDAuMDUsIHQyYiRwLnZhbHVlID49IDAuMDUsIHQzYiRwLnZhbHVlID49IDAuMDUpLAogICAgSDEgPSBjKHQxJHAudmFsdWUgPCAwLjA1LCB0MiRwLnZhbHVlIDwgMC4wNSwgdDMkcC52YWx1ZSA8IDAuMDUsCiAgICAgICAgICAgdDFiJHAudmFsdWUgPCAwLjA1LCB0MmIkcC52YWx1ZSA8IDAuMDUsIHQzYiRwLnZhbHVlIDwgMC4wNSksCiAgICAiQ29uZmlhbsOnYSIgPSBjKAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MSRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MiRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgIHBhc3RlKHBhc3RlMChyb3VuZCh0MyRjb25mLmludCAqIDEwMCwgMiksICIlIiksIGNvbGxhcHNlID0gIiB+ICIpLAogICAgICAgICItIiwKICAgICAgICAiLSIsCiAgICAgICAgIi0iCiAgICApCikgJT4lCiAgbXV0YXRlKAogICAgcF92YWxvciA9IGNlbGxfc3BlYyhwX3ZhbG9yLCBib2xkID0gVCwgY29sb3IgPSAiYmxhY2siLCBhbGlnbiA9ICJyaWdodCIpLAogICAgSDAgPSBjZWxsX3NwZWMoSDAsIGJvbGQgPSBIMCwKICAgICAgICAgICAgICAgICAgIGNvbG9yPSBpZmVsc2UoSDAsICJ3aGl0ZSIsICJibGFjayIpLCAKICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgPSBpZmVsc2UoSDAsICJncmVlbiIsICIjQ0NDQ0NDIikpLAogICAgSDEgPSBjZWxsX3NwZWMoSDEsIGJvbGQgPSBIMSwgCiAgICAgICAgICAgICAgICAgICBjb2xvciA9IGlmZWxzZShIMSwgIndoaXRlIiwgImJsYWNrIiksIAogICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCA9IGlmZWxzZShIMSwgImdyZWVuIiwgIiNDQ0NDQ0MiKSkKICApICU+JQogIGthYmxlKGVzY2FwZSA9IEYpICU+JQogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJib3JkZXJlZCIpLCBmdWxsX3dpZHRoID0gVFJVRSkgJT4lCiAgY29sdW1uX3NwZWMoMiwgYm9sZCA9IFRSVUUpICU+JQogIGNvbGxhcHNlX3Jvd3MoY29sdW1ucyA9IDE6MiwgdmFsaWduID0gInRvcCIpICU+JQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiSW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgOTUlIiwKICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIlxuT2JzLjogIiwKICAgICAgICAgICBmb290bm90ZV9hc19jaHVuayA9IFQpCmBgYAoKCiMjIyAxIC0gRXN0dWRhbnRlcyB0w6ptIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0byBkZSBlc3DDqWNpZXMgZXjDs3RpY2FzIGRvIHF1ZSBlc3DDqWNpZXMgbmF0aXZhcyBicmFzaWxlaXJhcwoKUmVzdWx0YWRvIGRvIHRlc3RlIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQxCmBgYApSZXN1bHRhZG8gZG8gdGVzdGUgbsOjbyBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MWIKYGBgCgoKIyMjIDIgLSBFc3R1ZGFudGVzIGlkZW50aWZpY2FtIG1haXMgb3JpZ2VtIGRhcyBlc3DDqWNpZXMgZXjDs3RpY2FzCgpSZXN1bHRhZG8gZG8gdGVzdGUgcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDIKYGBgCgpSZXN1bHRhZG8gZG8gdGVzdGUgbsOjbyBwYXJhbcOpdHJpY28KCmBgYHtyLCBlY2hvPUZBTFNFfQp0MmIKYGBgCgojIyMgMyAtIEVzdHVkYW50ZXMgdGVtIG1haW9yIHByb3BvcsOnw6NvIGRlIHJlY29uaGVjaW1lbnRvIChub21lIGUgb3JpZ2VtKSBkZSBlc3DDqWNpZXMgZXjDs3RpY2FzIGRvIHF1ZSBlc3DDqWNpZXMgbmF0aXZhcyBicmFzaWxlaXJhcwoKUmVzdWx0YWRvIGRvIHRlc3RlIHBhcmFtw6l0cmljbwoKYGBge3IsIGVjaG89RkFMU0V9CnQzCmBgYAoKUmVzdWx0YWRvIGRvIHRlc3RlIG7Do28gcGFyYW3DqXRyaWNvCgpgYGB7ciwgZWNobz1GQUxTRX0KdDNiCmBgYAoKIyMjIDQgLSBFc3R1ZGFudGVzIHF1ZSByZXNpZGVtIGVtIGNpZGFkZSBwcsOzeGltYSBhIFVDIHTDqm0gbWFpb3IgcHJvcG9yw6fDo28gZGUgYWNlcnRvIGVudHJlIGFzIGVzcMOpY2llcyBuYXRpdmFzIGJyYXNpbGVpcmFzLgoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTN9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QobXVuaWNpcGlvLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykKdC50ZXN0KHBfaW5kaWNlX25hdGl2YXMgfiBtdW5pY2lwaW8sIHRtcCkKYGBgCgojIyMgNSAtIEVzdHVkYW50ZXMgcXVlIHJlc2lkZW0gZW0gw6FyZWEgcnVyYWwgdGVtIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0b3Mgc29icmUgZXNww6ljaWVzIG5hdGl2YXMgYnJhc2lsZWlyYXMgZG8gcXVlIGVzdHVkYW50ZXMgcXVlIHJlc2lkZW0gbmEgw6FyZWEgdXJiYW5hCgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9M30KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChhcmVhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykKdC50ZXN0KHBfaW5kaWNlX25hdGl2YXMgfiBhcmVhLCB0bXApCmBgYAoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChhcmVhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBtZWx0KCJhcmVhIikKdG1wIDwtCiAgICBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogICAgc2VsZWN0KGFyZWEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkKdG1wICU+JQogIGdncGxvdCgpICsgCiAgZ2VvbV9ib3hwbG90KGFlcyh4ID0gYXJlYSwgeSA9IHZhbHVlLCBmaWxsID0gb3JpZ2VtKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofmluZGljYWRvcikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZGUgZXNww6ljaWVzIE5hdGl2YXMgbm9zIGNyaXTDqXJpb3MgZXN0YWJlbGVjaWRvcyIsCiAgICAgICB5ID0gIlBlcmNlbnR1YWwgZGUgaWRlbnRpZmljYcOnw6NvIiwgeCA9ICIiKSArCiAgbXlfdGhlbWUKYGBgCgojIyMgNiAtIEVzdHVkYW50ZXMgcXVlIHZpc2l0YW0gYSBVQyB0w6ptIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0byBkZSBlc3DDqWNpZXMgbmF0aXZhcyBkbyBxdWUgZXN0dWRhbnRlcyBxdWUgbsOjbyB2aXNpdGFtCgpgYGB7cn0KdG1wIDwtIAogICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvICU+JQogICAgZmlsdGVyKG11bmljaXBpbyA9PSAiU2lsdsOibmlhIikgJT4lCiAgICBzZWxlY3QoZmxvbmEsIHBfaW5kaWNlX25hdGl2YXMpCiNub3JtYWxpZGFkZSh0bXAkcF9pbmRpY2VfbmF0aXZhcykKdC50ZXN0KHBfaW5kaWNlX25hdGl2YXMgfiBmbG9uYSwgdG1wKQpgYGAKCgojIyMgNyAtIEVzdHVkYW50ZXMgdGVtIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0b3MgZW0gcmVsYcOnw6NvIGFvcyBncnVwb3MgZGUgbWFpb3IgcG9ydGUgZSBkYSBmYXVuYSBleMOzdGljYSBkbyBxdWUgZXNww6ljaWVzIG1lbm9yZXMgZSBuYXRpdmFzLgoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTR9CnBsb3RBbmFsaXNlVGF4b25vbWljb3NHZW5vdmFydCgpCmBgYAoKYGBge3IsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTN9CmdyaWQuYXJyYW5nZSgKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfYXZlcywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX2F2ZXMsCiAgICAgICAgICAgICAgICAgICJBdmVzIiwgIk3DqWRpYSBwZXJjZW50dWFsIGRlIGFjZXJ0b3NcbiIsCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzKSwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcykpLAogICAgCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX2ludmVydGVicmFkbywKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX2ludmVydGVicmFkbywKICAgICAgICAgICAgICAgICAgIkludmVydGVicmFkb3MiLCB5ID0gIiIsCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzKSwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcykpLAogICAgCiAgICBwbG90QW5hbGlzZU1lZGlhcyhwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9leG90aWNhX21hbWlmZXJvLAogICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfbWFtaWZlcm8sCiAgICAgICAgICAgICAgICAgICJNYW1pZmVyb3MiLCB5ID0gIiIsCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzKSwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcykpLCAKICAgIAogICAgcGxvdEFuYWxpc2VNZWRpYXMocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfZXhvdGljYV9wZWl4ZSwKICAgICAgICAgICAgICAgICAgcG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfbmF0aXZhX3BlaXhlLAogICAgICAgICAgICAgICAgICAiUGVpeGVzIiwgeSA9ICIiLAogICAgICAgICAgICAgICAgICBtZWFuKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2luZGljZV9leG90aWNhcyksCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX25hdGl2YXMpKSwgCiAgICAKICAgIHBsb3RBbmFsaXNlTWVkaWFzKHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byRwX2V4b3RpY2FfcmVwdGlsLAogICAgICAgICAgICAgICAgICBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9uYXRpdmFfcmVwdGlsLAogICAgICAgICAgICAgICAgICAiUsOpcHRlaXMiLCB5ID0gIiIsCiAgICAgICAgICAgICAgICAgIG1lYW4ocG9zX2dhYmFyaXRvJHBlcmNlbnR1YWxfYWNlcnRvJHBfaW5kaWNlX2V4b3RpY2FzKSwKICAgICAgICAgICAgICAgICAgbWVhbihwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8kcF9pbmRpY2VfbmF0aXZhcykpLCAKICAgIG5jb2wgPSA1LAogICAgdG9wID0gdGV4dEdyb2IoIk5pdmVpcyBkZSByZWNvbmhlY2ltZW50byBwb3Igb3JpZ2VtXG4iLCAKICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpLAogICAgcmlnaHQgPSAiXG4iCikKYGBgCgoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QocF9leG90aWNhX2F2ZXM6cF9uYXRpdmFfcmVwdGlsKSAlPiUKICAgIG1lbHQoKQojIGFub3ZhKGxtKHZhbHVlIH4gdmFyaWFibGUsIHRtcCkpCgp0bXAgPC0gY2JpbmQodG1wLCBjb2xzcGxpdCh0bXAkdmFyaWFibGUsICJfIiwgYygicCIsICJvcmlnZW0iLCAiZ3J1cG8iKSkpICU+JQogICAgc2VsZWN0KG9yaWdlbSwgZ3J1cG8sIHZhbHVlKQoKYW5vdmEobG0odmFsdWUgfiBncnVwbyAqIG9yaWdlbSwgdG1wKSkKYGBgCgpgYGB7cn0KdHVrZXkgPC0gVHVrZXlIU0QoYW92KGxtKHZhbHVlIH4gZ3J1cG8gKiBvcmlnZW0sIHRtcCkpKQp0dWtleQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD03fQp0a3kgPC0gYXMuZGF0YS5mcmFtZSh0dWtleSRgZ3J1cG86b3JpZ2VtYCkKdGt5IDwtIHRreSAlPiUKICBtdXRhdGUocGFpciA9IHJlb3JkZXIocm93bmFtZXModGt5KSwgYGRpZmZgKSwKICAgICAgICAgc2lnbmlmY2FudGUgPSAoYHAgYWRqYCA8PSAwLjA1KSwKICAgICAgICAgY29yID0gaWZlbHNlKGBwIGFkamAgPD0gMC4wNSwgInJlZCIsICJibGFjayIpKQoKZ2dwbG90KHRreSwgYWVzKGNvbG91ciA9IGN1dChgcCBhZGpgLCBjKDAsIDAuMDUsIDEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYygiU2lnbmlmaWNhbnRlIiwgIk7Do28gc2lnbmlmaWNhbnRlIikpKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsdHk9IjExIiwgY29sb3VyPSJncmV5MzAiKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMocGFpciwgeW1pbj1sd3IsIHltYXg9dXByKSwgd2lkdGg9MC41LCBzaXplPTEpICsKICBnZW9tX3BvaW50KGFlcyhwYWlyLCBkaWZmKSwgc2l6ZT0zLCBzaGFwZT0yMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmxhY2siKSkrCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksIAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgbGFicyh0aXRsZSA9ICJHcnVwbyB0YXhvbsOzbWljbyB4IE9yaWdlbSBkYXMgZXNww6ljaWVzIiwKICAgICAgIHN1YnRpdGxlID0gIkFuw6FsaXNlIFR1a2V5IiwKICAgICAgIGNvbG91ciA9ICIiLCB4ID0gIkNvbXBhcmHDp8OjbyBkZSBncnVwb3MiLCB5ID0gIlxuRGlmZXJlbsOnYSBlbnRyZSBhcyBtw6lkaWFzIikKYGBgCgoKIyMjIDggLSBFc3R1ZGFudGVzIHF1ZSBwb3NzdWVtIG1haW9yIGZyZXF1w6puY2lhIGRlIGNvbnRhdG8gY29tIGEgbmF0dXJlemEgdMOqbSBtYWlvciBwcm9wb3LDp8OjbyBkZSBhY2VydG9zIGRhcyBlc3DDqWNpZXMgbmF0aXZhcwoKYGBge3IsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNX0KdG1wIDwtIHBvc19nYWJhcml0byRwZXJjZW50dWFsX2FjZXJ0byAlPiUKICAgIHNlbGVjdChmcmVxdWVuY2lhLCBwX25vbWVfZXhvdGljYXM6cF9pbmRpY2VfbmF0aXZhcykgJT4lCiAgICBtZWx0KGlkID0gImZyZXF1ZW5jaWEiKQoKdG1wIDwtCiAgICBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogICAgc2VsZWN0KGZyZXF1ZW5jaWEsIGluZGljYWRvciwgb3JpZ2VtLCB2YWx1ZSkKCnRtcCAlPiUKICBnZ3Bsb3QoKSArIAogIGdlb21fYm94cGxvdChhZXMoeCA9IG9yaWdlbSwgeSA9IHZhbHVlLCBmaWxsID0gZnJlcXVlbmNpYSksIHNob3cubGVnZW5kID0gVCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEpLCBsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICBmYWNldF93cmFwKH5pbmRpY2Fkb3IpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3QgZGUgaWRlbnRpZmljYcOnw6NvIGRlIGVzcMOpY2llcyBOYXRpdmFzIG5vcyBjcml0w6lyaW9zIGVzdGFiZWxlY2lkb3MiLAogICAgICAgeSA9ICJQZXJjZW50dWFsIGRlIGlkZW50aWZpY2HDp8OjbyIsIHggPSAiIikgKwogIG15X3RoZW1lCmBgYAoKYGBge3J9CmFub3ZhKGxtKHZhbHVlICB+IGZyZXF1ZW5jaWEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkKI1R1a2V5SFNEKGFvdihsbSh2YWx1ZSAgfiBmcmVxdWVuY2lhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpKQpgYGAKCiMjIyA5IC0gRXN0dWRhbnRlcyBxdWUgcGFydGljaXBhbSBkZSBhdWxhcyBwcsOhdGljYXMgdGVtIG1haW9yIHByb3BvcsOnw6NvIGRlIGFjZXJ0b3Mgc29icmUgYXMgZXNww6ljaWVzIG5hdGl2YXMgZG8gcXVlIGVzdHVkYW50ZXMgc2VtIHRhaXMgYXVsYXMKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yLjV9CnRtcCA8LSBwb3NfZ2FiYXJpdG8kcGVyY2VudHVhbF9hY2VydG8gJT4lCiAgICBzZWxlY3QoZmV6LmF1bGEsIHBfbm9tZV9leG90aWNhczpwX2luZGljZV9uYXRpdmFzKSAlPiUKICAgIG1lbHQoaWQgPSAiZmV6LmF1bGEiKQoKdG1wIDwtCiAgICBjYmluZCh0bXAsIGNvbHNwbGl0KHRtcCR2YXJpYWJsZSwgIl8iLCBjKCJwIiwgImluZGljYWRvciIsICJvcmlnZW0iKSkpICU+JQogICAgc2VsZWN0KGZlei5hdWxhLCBpbmRpY2Fkb3IsIG9yaWdlbSwgdmFsdWUpCgp0bXAgJT4lCiAgZ2dwbG90KCkgKyAKICBnZW9tX2JveHBsb3QoYWVzKHggPSBvcmlnZW0sIHkgPSB2YWx1ZSwgZmlsbCA9IGZlei5hdWxhKSwgc2hvdy5sZWdlbmQgPSBUKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMSksIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofmluZGljYWRvcikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiQm94cGxvdCBkZSBpZGVudGlmaWNhw6fDo28gZGUgZXNww6ljaWVzIE5hdGl2YXMgbm9zIGNyaXTDqXJpb3MgZXN0YWJlbGVjaWRvcyIsCiAgICAgICB5ID0gIlBlcmNlbnR1YWwgZGUgaWRlbnRpZmljYcOnw6NvIiwgeCA9ICIiKSArCiAgbXlfdGhlbWUKYGBgCgpgYGB7cn0KYW5vdmEobG0odmFsdWUgIH4gZmV6LmF1bGEsIGRhdGEgPSB0bXAgJT4lIGZpbHRlcihpbmRpY2Fkb3IgPT0gImluZGljZSIpKSkKI1R1a2V5SFNEKGFvdihsbSh2YWx1ZSAgfiBmcmVxdWVuY2lhLCBkYXRhID0gdG1wICU+JSBmaWx0ZXIoaW5kaWNhZG9yID09ICJpbmRpY2UiKSkpKQpgYGAKCgojIyMgMTAgLSBSYW5raW5ncyBkYXMgZXNww6ljaWVzIGNpdGFkYXMKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD00fQphMSA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRuYXRpdm9zICU+JQogICAgaGVhZCgyMCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhbmltYWlzLCB5ID0gZnJlcSwgZmlsbCA9IGZyZXEpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXEpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gLTEsIGhqdXN0ID0gMC41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDkwKSkgKwogICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAib3JhbmdlIiwgaGlnaCA9ICJyZWQiKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBuYXRpdmFzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKYTIgPC0gCiAgICBwb3NfZ2FiYXJpdG8kcmFraW5nX2FuaW1haXMkZXhvdGljb3MgJT4lCiAgICBoZWFkKDIwKSAlPiUKICAgIGdncGxvdChhZXMoeCA9IGFuaW1haXMsIHkgPSBmcmVxLCBmaWxsID0gZnJlcSkpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZnJlcSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgdmp1c3QgPSAtMSwgaGp1c3QgPSAwLjUpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsOTApKSArCiAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJsaWdodGJsdWUiLCBoaWdoID0gImRhcmtibHVlIikgKwogICAgdGhlbWVfYncoKSArCiAgICBsYWJzKHRpdGxlID0gIkVzcMOpY2llcyBjaXRhZGFzIGNvbW8gZXjDs3RpY2FzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKCmdyaWQuYXJyYW5nZShhMSwgYTIsCiAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgIHRvcCA9IHRleHRHcm9iKCJUT1AgMjAgLSBSYW5raW5nIGRhcyBlc3DDqWNpZXMgY2l0YWRhcyBjb21vIGV4ZW1wbG9cbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRzaXplID0gMjAsIGZvbnQgPSAyKSkKKQpgYGAKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0yfQphMyA8LSAKICAgIHBvc19nYWJhcml0byRyYWtpbmdfYW5pbWFpcyRwcm90ZWdpZG9zICU+JQogICAgaGVhZCgyMCkgJT4lCiAgICBnZ3Bsb3QoYWVzKHggPSBhbmltYWlzLCB5ID0gZnJlcSwgZmlsbCA9IGZyZXEpKSArCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGZyZXEpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHZqdXN0ID0gLTEsIGhqdXN0ID0gMC41KSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE5MCkpICsKICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZWVuIiwgaGlnaCA9ICJkYXJrZ3JlZW4iKSArCiAgICB0aGVtZV9idygpICsKICAgIGxhYnModGl0bGUgPSAiRXNww6ljaWVzIGNpdGFkYXMgY29tbyBuYXRpdmFzIiwKICAgICAgIHkgPSAiRnJlcXVlbmNpYSIsIHggPSAiIikgKwogICAgbXlfdGhlbWUKCmdyaWQuYXJyYW5nZShhMywKICAgICAgICAgICAgIHRvcCA9IHRleHRHcm9iKCJUT1AgMjAgLSBSYW5raW5nIGRhcyBlc3DDqWNpZXMgY2l0YWRhcyBjb21vIGV4ZW1wbG8gcGFyYSBwcm90ZcOnw6NvXG4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDIwLCBmb250ID0gMikpCikKYGBgCgo=