── Attaching core tidyverse packages ────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.1     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     ── Conflicts ──────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
Attaching package: ‘modelr’

The following object is masked from ‘package:broom’:

    bootstrap

Dados da CAPES sobre avaliação da pós-graduação

A CAPES é um órgão do MEC que tem a atribuição de acompanhar a pós-graduação na universidade brasileira. Uma das formas que ela encontrou de fazer isso e pela qual ela é bastante criticada é através de uma avaliação quantitativa a cada x anos (era 3, mudou para 4).

Usaremos dados da penúltima avaliação da CAPES:

cacc_tudo = read_projectdata()

glimpse(cacc_tudo)
Rows: 73
Columns: 31
$ Instituição                  <chr> "UNIVERSIDADE FEDERAL DO AMAZONAS", "UNIVERSIDADE FEDERAL DO PARÁ", "UNIVER…
$ Programa                     <chr> "INFORMÁTICA (12001015012P2)", "CIÊNCIA DA COMPUTAÇÃO (15001016047P9)", "CI…
$ Nível                        <int> 5, 4, 3, 3, 3, 5, 4, 3, 3, 3, 5, 3, 3, 3, 4, 6, 3, 3, 3, 3, 3, 3, 4, 3, 4, …
$ Sigla                        <chr> "UFAM", "UFPA", "UFMA", "UEMA", "FUFPI", "UFC", "UNIFOR", "UECE/Prof", "UEC…
$ `Tem doutorado`              <chr> "Sim", "Sim", "Não", "Não", "Não", "Sim", "Sim", "Não", "Não", "Não", "Sim"…
$ `Docentes colaboradores`     <dbl> 0.25, 5.50, 3.00, 6.25, 1.75, 2.00, 1.00, 6.25, 2.75, 0.75, 2.25, 2.00, 4.2…
$ `Docentes permanentes`       <dbl> 24.75, 14.00, 10.00, 14.00, 9.50, 20.75, 16.00, 15.75, 8.50, 9.00, 26.25, 8…
$ `Docentes visitantes`        <dbl> 0.00, 0.00, 0.00, 0.00, 0.00, 0.75, 0.50, 1.00, 0.50, 0.00, 0.00, 0.00, 0.5…
$ `Resumos em conf`            <int> 20, 23, 15, 5, 4, 10, 6, 136, 0, 24, 27, 4, 30, 20, 5, 14, 49, 63, 33, 3, 8…
$ `Resumos expandidos em conf` <int> 25, 24, 7, 10, 1, 68, 9, 13, 4, 6, 16, 5, 25, 29, 28, 81, 65, 38, 14, 6, 18…
$ `Artigos em conf`            <int> 390, 284, 115, 73, 150, 269, 179, 0, 120, 92, 389, 60, 127, 322, 338, 763, …
$ Dissertacoes                 <int> 108, 77, 50, 25, 31, 75, 60, 129, 45, 3, 108, 12, 94, 108, 104, 433, 92, 26…
$ Teses                        <int> 14, 0, 0, 0, 0, 24, 5, 0, 0, 0, 29, 0, 0, 0, 40, 144, 0, 0, 0, 0, 0, 0, 20,…
$ periodicos_A1                <int> 15, 19, 5, 1, 7, 21, 21, 0, 3, 8, 44, 0, 6, 21, 20, 93, 70, 16, 16, 0, 22, …
$ periodicos_A2                <int> 19, 21, 11, 1, 4, 32, 13, 0, 9, 2, 23, 2, 6, 20, 15, 43, 23, 5, 5, 1, 12, 4…
$ periodicos_B1                <int> 19, 38, 7, 3, 6, 26, 16, 2, 6, 4, 32, 4, 2, 11, 29, 51, 29, 11, 8, 1, 14, 6…
$ periodicos_B2                <int> 1, 12, 2, 6, 0, 0, 11, 0, 0, 2, 1, 0, 0, 4, 1, 10, 6, 1, 2, 0, 1, 3, 2, 1, …
$ periodicos_B3                <int> 3, 16, 2, 2, 3, 16, 15, 0, 4, 6, 9, 0, 2, 6, 16, 20, 13, 9, 2, 0, 12, 0, 6,…
$ periodicos_B4                <int> 0, 4, 0, 3, 3, 0, 1, 3, 1, 6, 0, 0, 4, 5, 1, 3, 3, 5, 3, 0, 4, 2, 2, 2, 2, …
$ periodicos_B5                <int> 10, 16, 8, 4, 12, 4, 16, 2, 6, 2, 11, 0, 4, 16, 9, 29, 18, 16, 18, 0, 3, 15…
$ periodicos_C                 <int> 9, 34, 12, 5, 2, 3, 11, 9, 5, 10, 16, 1, 14, 28, 8, 19, 24, 23, 9, 0, 7, 26…
$ periodicos_NA                <int> 7, 15, 8, 11, 12, 6, 19, 31, 7, 14, 19, 0, 27, 26, 18, 29, 19, 21, 25, 0, 7…
$ per_comaluno_A1              <int> 4, 1, 0, 0, 1, 7, 5, 0, 1, 0, 10, 0, 0, 2, 8, 63, 1, 1, 3, 0, 5, 0, 3, 1, 1…
$ per_comaluno_A2              <int> 5, 5, 5, 0, 2, 15, 3, 0, 3, 0, 3, 0, 0, 1, 11, 22, 0, 0, 0, 0, 2, 0, 13, 2,…
$ per_comaluno_B1              <int> 4, 2, 5, 2, 2, 14, 6, 0, 2, 0, 17, 0, 1, 5, 18, 37, 0, 1, 1, 0, 2, 0, 9, 0,…
$ per_comaluno_B2              <int> 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0, 0, 0, 1, 0, 1, 0, 0, …
$ per_comaluno_B3              <int> 2, 2, 0, 1, 0, 7, 9, 0, 2, 0, 4, 0, 0, 1, 10, 12, 0, 0, 0, 0, 2, 0, 6, 4, 0…
$ per_comaluno_B4              <int> 0, 0, 0, 0, 2, 0, 1, 0, 1, 3, 0, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 1, 0, 1, 1, …
$ per_comaluno_B5              <int> 5, 0, 4, 0, 8, 3, 6, 0, 4, 0, 4, 0, 2, 5, 3, 17, 1, 4, 5, 0, 0, 5, 2, 0, 1,…
$ per_comaluno_C               <int> 6, 5, 3, 1, 2, 3, 7, 1, 2, 4, 8, 0, 11, 3, 8, 13, 4, 5, 2, 0, 0, 13, 6, 1, …
$ per_comaluno_NA              <int> 6, 14, 2, 2, 9, 3, 6, 4, 5, 1, 10, 0, 17, 6, 7, 17, 0, 3, 5, 0, 1, 8, 6, 1,…

Produção e produtividade de artigos

Uma das maneiras de avaliar a produção dos docentes que a CAPES utiliza é quantificando a produção de artigos pelos docentes. Os artigos são categorizados em extratos ordenados (A1 é o mais alto), e separados entre artigos em conferências e periódicos. Usaremos para esse lab a produção em periódicos avaliados com A1, A2 e B1.

cacc = cacc_tudo %>%
  transmute(
    docentes = `Docentes permanentes`,
    producao = (periodicos_A1 + periodicos_A2 + periodicos_B1),
    produtividade = producao / docentes,
    mestrados = Dissertacoes,
    doutorados = Teses,
    tem_doutorado = tolower(`Tem doutorado`) == "sim",
    mestrados_pprof = mestrados / docentes,
    doutorados_pprof = doutorados / docentes
  )

cacc_md = cacc %>% 
  filter(tem_doutorado)

EDA

skimr::skim(cacc)
── Data Summary ────────────────────────
                           Values
Name                       cacc  
Number of rows             73    
Number of columns          8     
_______________________          
Column type frequency:           
  logical                  1     
  numeric                  7     
________________________         
Group variables            None  
cacc %>% 
  ggplot(aes(x = docentes)) + 
  geom_histogram(bins = 15, fill = paleta[1])


cacc %>% 
  ggplot(aes(x = producao)) + 
  geom_histogram(bins = 15, fill = paleta[2])


cacc %>% 
  ggplot(aes(x = produtividade)) + 
  geom_histogram(bins = 15, fill = paleta[3])

Se quisermos modelar o efeito do tamanho do programa em termos de docentes (permanentes) na quantidade de artigos publicados, podemos usar regressão.

Importante: sempre queremos ver os dados antes de fazermos qualquer modelo ou sumário:

cacc %>% 
  ggplot(aes(x = docentes, y = producao)) + 
  geom_point()

Parece que existe uma relação. Vamos criar um modelo então:

modelo1 = lm(producao ~ docentes, data = cacc)

tidy(modelo1, conf.int = TRUE, conf.level = 0.95)
glance(modelo1)

Para visualizar o modelo:

cacc_augmented = cacc %>% 
  add_predictions(modelo1) 

cacc_augmented %>% 
  ggplot(aes(x = docentes)) + 
  geom_line(aes(y = pred), colour = "brown") + 
  geom_point(aes(y = producao)) + 
  labs(y = "Produção do programa")

Se considerarmos que temos apenas uma amostra de todos os programas de pós em CC no Brasil, o que podemos inferir a partir desse modelo sobre a relação entre número de docentes permanentes e produção de artigos em programas de pós?

Normalmente reportaríamos o resultado da seguinte maneira, substituindo VarIndepX e todos os x’s e y’s pelos nomes e valores de fato:

Regressão múltipla foi utilizada para analisar se VarIndep1 e VarIndep2 tem uma associação significativa com VarDep. Os resultados da regressão indicam que um modelo com os 2 preditores no formato VarDep = XXX.VarIndep1 + YYY.VarIndep2 explicam XX,XX% da variância da variável de resposta (R2 = XX,XX). VarIndep1, medida como/em [unidade ou o que é o 0 e o que é 1] tem uma relação significativa com o erro (b = [yy,yy; zz,zz], IC com 95%), assim como VarIndep2 medida como [unidade ou o que é o 0 e o que é 1] (b = [yy,yy; zz,zz], IC com 95%). O aumento de 1 unidade de VarIndep1 produz uma mudança de xxx em VarDep, enquanto um aumento…

Produza aqui a sua versão desse texto, portanto:

Regressão simples foi utilizada para analisar se docentes têm uma associação significativa com a produção de artigos (produção do programa). Os resultados de regressão indicam que um modelo com 1 preditor no formato produção do programa = -41.27 + 4,81 * docentes explica 81,46% da variança da variável de resposta (R² = 0,81458). A quantidade de docentes, tem uma relação significativa com o erro(b = [4,27;5,36], IC com 95%). O aumento de 1 unidade de docentes produz uma mudança de 4,81 na produção dos artigos.


Dito isso, o que significa a relação que você encontrou na prática para entendermos os programas de pós graduação no Brasil? E algum palpite de por que a relação que encontramos é forte?


Com base na análise realizada, a relação encontrada entre o número de docentes e a produção de artigos nos programas de pós-graduação em ciência da computação no Brasil indica que um aumento no número de docentes está associado a um aumento na produção de artigos. Um palpite é que, isso sugere que os programas de pós-graduação que possuem um maior corpo docente tendem a ter uma maior produtividade acadêmica em termos de publicações de artigos.


Mais fatores

modelo2 = lm(producao ~ docentes + mestrados_pprof + doutorados_pprof + tem_doutorado, 
             data = cacc_md)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

E se considerarmos também o número de alunos?

modelo2 = lm(producao ~ docentes + mestrados + doutorados, data = cacc)

tidy(modelo2, conf.int = TRUE, conf.level = 0.95)
glance(modelo2)

Visualizar o modelo com muitas variáveis independentes fica mais difícil

para_plotar_modelo = cacc %>% 
  data_grid(producao = seq_range(producao, 10), # Crie um vetor de 10 valores no range
            docentes = seq_range(docentes, 4),  
            # mestrados = seq_range(mestrados, 3),
            mestrados = median(mestrados),
            doutorados = seq_range(doutorados, 3)) %>% 
  add_predictions(modelo2)

glimpse(para_plotar_modelo)
Rows: 120
Columns: 5
$ producao   <dbl> 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.0…
$ docentes   <dbl> 8.25000, 8.25000, 8.25000, 27.91667, 27.91667, 27.91667, 47.58333, 47.58333, 47.58333, 67.250…
$ mestrados  <int> 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 5…
$ doutorados <dbl> 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 152, 0, 76, 15…
$ pred       <dbl> 3.199123, 79.257725, 155.316327, 72.026777, 148.085378, 224.143980, 140.854430, 216.913032, 2…
para_plotar_modelo %>% 
  ggplot(aes(x = docentes, y = pred)) + 
  geom_line(aes(group = doutorados, colour = doutorados)) + 
  geom_point(data = cacc, aes(y = producao, colour = doutorados))

Considerando agora esses três fatores, o que podemos dizer sobre como cada um deles se relaciona com a produção de um programa de pós em CC? E sobre o modelo? Ele explica mais que o modelo 1?


EXPLICAÇÃO:

Regressão múltipla foi utilizada para analisar se o número de teses doutorado, o número de dissertações de mestrado e número de docentes tem uma associação com produção de artigos na pós graduação. Os resultados da regressão indicam que um modelo com os 3 preditores no formato:

explicam 87,06% da variância da variável de resposta (R2 = 0,8706). Portanto, podemos afirmar o seguinte:

Logo, com base nos resultados da regressão múltipla, observamos que o número de docentes e de doutorados tem um efeito positivo e significativo na produção de artigos na pós-graduação. Além disso, o modelo 2, possui um R² maior (0,8706) em comparação com o modelo 1(R² =. 0,8145) , indicando que ele explica melhor a variação na produção de artigos. Esses resultados sugerem que investimentos no aumento do número de docentes e na formação de doutores podem contribuir para um aumento na produtividade científica da pós-graduação.


Agora produtividade

Diferente de medirmos produção (total produzido), é medirmos produtividade (produzido / utilizado). Abaixo focaremos nessa análise. Para isso crie um modelo que investiga como um conjunto de fatores que você julga que são relevantes se relacionam com a produtividade dos programas. Crie um modelo que avalie como pelo menos 3 fatores se relacionam com a produtividade de um programa. Pode reutilizar fatores que já definimos e analizamos para produção. Mas cuidado para não incluir fatores que sejam função linear de outros já incluídos (ex: incluir A, B e um tercero C=A+B)

Produza abaixo o modelo e um texto que comente (i) o modelo, tal como os que fizemos antes, e (ii) as implicações - o que aprendemos sobre como funcionam programas de pós no brasil?.

Modelo

Utilizaremos o modelo de regressão linear múltipla, realizamos uma análise da produtividade em relação a quatro variáveis preditoras: tem_doutorado, doutorados_pprof, doutorados e doutorados.

modelo_prod = lm(produtividade ~ tem_doutorado + doutorados_pprof + doutorados + mestrados_pprof, data = cacc)

tidy(modelo_prod, conf.int = TRUE, conf.level = 0.95)
glance(modelo_prod)

Debatendo resultado

Utilizando a regressão linear múltipla, investigamos a associação significativa entre as variáveis tem_doutorado, doutorados_pprof, mestrados_pprof e doutorados com a variável de resposta produtividade. Os resultados da regressão indicam que o modelo com os quatro preditores pode explicar 51,85% da variância na produtividade (R² = 0,5185).

LS0tCnRpdGxlOiAiUmVncmVzc8OjbyBsaW5lYXIgbmEgcHLDoXRpY2EiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IEpvw6NvIFZpY3RvciBTb2FyZXMgZGUgQWxtZWlkYQotLS0KCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KG1vZGVscikKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCgprbml0cjo6b3B0c19jaHVuayRzZXQodGlkeSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gNiwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5oZWlnaHQgPSA1KQoKcGFsZXRhID0gYygiIzQwNEU0RCIsCiAgICAgICAgICAgIiM5MkRDRTUiLAogICAgICAgICAgICIjOTM4QkExIiwKICAgICAgICAgICAiIzJEMzE0MiIsCiAgICAgICAgICAgIiNGNDc0M0IiKQpgYGAKCiMjIERhZG9zIGRhIENBUEVTIHNvYnJlIGF2YWxpYcOnw6NvIGRhIHDDs3MtZ3JhZHVhw6fDo28KCkEgQ0FQRVMgw6kgdW0gw7NyZ8OjbyBkbyBNRUMgcXVlIHRlbSBhIGF0cmlidWnDp8OjbyBkZSBhY29tcGFuaGFyIGEgcMOzcy1ncmFkdWHDp8OjbyBuYSB1bml2ZXJzaWRhZGUgYnJhc2lsZWlyYS4gVW1hIGRhcyBmb3JtYXMgcXVlIGVsYSBlbmNvbnRyb3UgZGUgZmF6ZXIgaXNzbyBlIHBlbGEgcXVhbCBlbGEgw6kgYmFzdGFudGUgY3JpdGljYWRhIMOpIGF0cmF2w6lzIGRlIHVtYSBhdmFsaWHDp8OjbyBxdWFudGl0YXRpdmEgYSBjYWRhIHggYW5vcyAoZXJhIDMsIG11ZG91IHBhcmEgNCkuCgpVc2FyZW1vcyBkYWRvcyBkYSBwZW7Dumx0aW1hIGF2YWxpYcOnw6NvIGRhIENBUEVTOgoKYGBge3J9CmNhY2NfdHVkbyA9IHJlYWRfcHJvamVjdGRhdGEoKQoKZ2xpbXBzZShjYWNjX3R1ZG8pCmBgYAoKIyMjIFByb2R1w6fDo28gZSBwcm9kdXRpdmlkYWRlIGRlIGFydGlnb3MKClVtYSBkYXMgbWFuZWlyYXMgZGUgYXZhbGlhciBhIHByb2R1w6fDo28gZG9zIGRvY2VudGVzIHF1ZSBhIENBUEVTIHV0aWxpemEgw6kgcXVhbnRpZmljYW5kbyBhIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBwZWxvcyBkb2NlbnRlcy4gT3MgYXJ0aWdvcyBzw6NvIGNhdGVnb3JpemFkb3MgZW0gZXh0cmF0b3Mgb3JkZW5hZG9zIChBMSDDqSBvIG1haXMgYWx0byksIGUgc2VwYXJhZG9zIGVudHJlIGFydGlnb3MgZW0gY29uZmVyw6puY2lhcyBlIHBlcmnDs2RpY29zLiBVc2FyZW1vcyBwYXJhIGVzc2UgbGFiIGEgcHJvZHXDp8OjbyBlbSBwZXJpw7NkaWNvcyBhdmFsaWFkb3MgY29tIEExLCBBMiBlIEIxLgoKYGBge3J9CmNhY2MgPSBjYWNjX3R1ZG8gJT4lCiAgdHJhbnNtdXRlKAogICAgZG9jZW50ZXMgPSBgRG9jZW50ZXMgcGVybWFuZW50ZXNgLAogICAgcHJvZHVjYW8gPSAocGVyaW9kaWNvc19BMSArIHBlcmlvZGljb3NfQTIgKyBwZXJpb2RpY29zX0IxKSwKICAgIHByb2R1dGl2aWRhZGUgPSBwcm9kdWNhbyAvIGRvY2VudGVzLAogICAgbWVzdHJhZG9zID0gRGlzc2VydGFjb2VzLAogICAgZG91dG9yYWRvcyA9IFRlc2VzLAogICAgdGVtX2RvdXRvcmFkbyA9IHRvbG93ZXIoYFRlbSBkb3V0b3JhZG9gKSA9PSAic2ltIiwKICAgIG1lc3RyYWRvc19wcHJvZiA9IG1lc3RyYWRvcyAvIGRvY2VudGVzLAogICAgZG91dG9yYWRvc19wcHJvZiA9IGRvdXRvcmFkb3MgLyBkb2NlbnRlcwogICkKCmNhY2NfbWQgPSBjYWNjICU+JSAKICBmaWx0ZXIodGVtX2RvdXRvcmFkbykKYGBgCgojIyMgRURBCgpgYGB7cn0Kc2tpbXI6OnNraW0oY2FjYykKYGBgCgpgYGB7cn0KY2FjYyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSwgZmlsbCA9IHBhbGV0YVsxXSkKCmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IHByb2R1Y2FvKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbMl0pCgpjYWNjICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBwcm9kdXRpdmlkYWRlKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUsIGZpbGwgPSBwYWxldGFbM10pCmBgYAoKU2UgcXVpc2VybW9zIG1vZGVsYXIgbyBlZmVpdG8gZG8gdGFtYW5obyBkbyBwcm9ncmFtYSBlbSB0ZXJtb3MgZGUgZG9jZW50ZXMgKHBlcm1hbmVudGVzKSBuYSBxdWFudGlkYWRlIGRlIGFydGlnb3MgcHVibGljYWRvcywgcG9kZW1vcyB1c2FyIHJlZ3Jlc3PDo28uCgoqSW1wb3J0YW50ZSo6IHNlbXByZSBxdWVyZW1vcyB2ZXIgb3MgZGFkb3MgYW50ZXMgZGUgZmF6ZXJtb3MgcXVhbHF1ZXIgbW9kZWxvIG91IHN1bcOhcmlvOgoKYGBge3J9CmNhY2MgJT4lIAogIGdncGxvdChhZXMoeCA9IGRvY2VudGVzLCB5ID0gcHJvZHVjYW8pKSArIAogIGdlb21fcG9pbnQoKQpgYGAKClBhcmVjZSBxdWUgZXhpc3RlIHVtYSByZWxhw6fDo28uIFZhbW9zIGNyaWFyIHVtIG1vZGVsbyBlbnTDo286CgpgYGB7cn0KbW9kZWxvMSA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8xLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMSkKYGBgCgpQYXJhIHZpc3VhbGl6YXIgbyBtb2RlbG86CgpgYGB7cn0KY2FjY19hdWdtZW50ZWQgPSBjYWNjICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMSkgCgpjYWNjX2F1Z21lbnRlZCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZG9jZW50ZXMpKSArIAogIGdlb21fbGluZShhZXMoeSA9IHByZWQpLCBjb2xvdXIgPSAiYnJvd24iKSArIAogIGdlb21fcG9pbnQoYWVzKHkgPSBwcm9kdWNhbykpICsgCiAgbGFicyh5ID0gIlByb2R1w6fDo28gZG8gcHJvZ3JhbWEiKQpgYGAKClNlIGNvbnNpZGVyYXJtb3MgcXVlIHRlbW9zIGFwZW5hcyB1bWEgYW1vc3RyYSBkZSB0b2RvcyBvcyBwcm9ncmFtYXMgZGUgcMOzcyBlbSBDQyBubyBCcmFzaWwsIG8gcXVlIHBvZGVtb3MgaW5mZXJpciBhIHBhcnRpciBkZXNzZSBtb2RlbG8gc29icmUgYSByZWxhw6fDo28gZW50cmUgbsO6bWVybyBkZSBkb2NlbnRlcyBwZXJtYW5lbnRlcyBlIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBlbSBwcm9ncmFtYXMgZGUgcMOzcz8KCk5vcm1hbG1lbnRlIHJlcG9ydGFyw61hbW9zIG8gcmVzdWx0YWRvIGRhIHNlZ3VpbnRlIG1hbmVpcmEsIHN1YnN0aXR1aW5kbyBWYXJJbmRlcFggZSB0b2RvcyBvcyB4J3MgZSB5J3MgcGVsb3Mgbm9tZXMgZSB2YWxvcmVzIGRlIGZhdG86Cgo+IFJlZ3Jlc3PDo28gbcO6bHRpcGxhIGZvaSB1dGlsaXphZGEgcGFyYSBhbmFsaXNhciBzZSBWYXJJbmRlcDEgZSBWYXJJbmRlcDIgdGVtIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gVmFyRGVwLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgdW0gbW9kZWxvIGNvbSBvcyAyIHByZWRpdG9yZXMgbm8gZm9ybWF0byBWYXJEZXAgPSBYWFguVmFySW5kZXAxICsgWVlZLlZhckluZGVwMiBleHBsaWNhbSBYWCxYWCUgZGEgdmFyacOibmNpYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKFIyID0gWFgsWFgpLiBWYXJJbmRlcDEsIG1lZGlkYSBjb21vL2VtIFt1bmlkYWRlIG91IG8gcXVlIMOpIG8gMCBlIG8gcXVlIMOpIDFdIHRlbSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgY29tIG8gZXJybyAoYiA9IFt5eSx5eTsgenosenpdLCBJQyBjb20gOTUlKSwgYXNzaW0gY29tbyBWYXJJbmRlcDIgbWVkaWRhIGNvbW8gW3VuaWRhZGUgb3UgbyBxdWUgw6kgbyAwIGUgbyBxdWUgw6kgMV0gKGIgPSBbeXkseXk7IHp6LHp6XSwgSUMgY29tIDk1JSkuIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgVmFySW5kZXAxIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgeHh4IGVtIFZhckRlcCwgZW5xdWFudG8gdW0gYXVtZW50by4uLgoKIyMjIFByb2R1emEgYXF1aSBhIHN1YSB2ZXJzw6NvIGRlc3NlIHRleHRvLCBwb3J0YW50bzoKClJlZ3Jlc3PDo28gKipzaW1wbGVzKiogZm9pIHV0aWxpemFkYSBwYXJhIGFuYWxpc2FyIHNlICoqZG9jZW50ZXMqKiB0w6ptIHVtYSBhc3NvY2lhw6fDo28gc2lnbmlmaWNhdGl2YSBjb20gYSAqKnByb2R1w6fDo28gZGUgYXJ0aWdvcyAocHJvZHXDp8OjbyBkbyBwcm9ncmFtYSkqKi4gT3MgcmVzdWx0YWRvcyBkZSByZWdyZXNzw6NvIGluZGljYW0gcXVlIHVtIG1vZGVsbyBjb20gMSBwcmVkaXRvciBubyBmb3JtYXRvICoqcHJvZHXDp8OjbyBkbyBwcm9ncmFtYSoqID0gKiotNDEuMjcgKyA0LDgxIFwqIGRvY2VudGVzKiogZXhwbGljYSAqKjgxLDQ2JSoqIGRhIHZhcmlhbsOnYSBkYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEgKCoqUsKyID0gKjAsODE0NTgqKiopLiBBIHF1YW50aWRhZGUgZGUgKipkb2NlbnRlcywqKiB0ZW0gdW1hIHJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIGNvbSBvICoqZXJybyhiID0gWzQsMjc7NSwzNl0sIElDIGNvbSA5NSUpLioqIE8gYXVtZW50byBkZSAxIHVuaWRhZGUgZGUgKipkb2NlbnRlcyoqIHByb2R1eiB1bWEgbXVkYW7Dp2EgZGUgKio0LDgxKiogbmEgcHJvZHXDp8OjbyBkb3MgYXJ0aWdvcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRGl0byBpc3NvLCBvIHF1ZSBzaWduaWZpY2EgYSByZWxhw6fDo28gcXVlIHZvY8OqIGVuY29udHJvdSBuYSBwcsOhdGljYSBwYXJhIGVudGVuZGVybW9zIG9zIHByb2dyYW1hcyBkZSBww7NzIGdyYWR1YcOnw6NvIG5vIEJyYXNpbD8gRSBhbGd1bSBwYWxwaXRlIGRlIHBvciBxdWUgYSByZWxhw6fDo28gcXVlIGVuY29udHJhbW9zIMOpIGZvcnRlPwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpDb20gYmFzZSBuYSBhbsOhbGlzZSByZWFsaXphZGEsIGEgcmVsYcOnw6NvIGVuY29udHJhZGEgZW50cmUgbyBuw7ptZXJvIGRlIGRvY2VudGVzIGUgYSBwcm9kdcOnw6NvIGRlIGFydGlnb3Mgbm9zIHByb2dyYW1hcyBkZSBww7NzLWdyYWR1YcOnw6NvIGVtIGNpw6puY2lhIGRhIGNvbXB1dGHDp8OjbyBubyBCcmFzaWwgKippbmRpY2EgcXVlIHVtIGF1bWVudG8gbm8gbsO6bWVybyoqIGRlIGRvY2VudGVzIGVzdMOhIGFzc29jaWFkbyBhICoqdW0gYXVtZW50byBuYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MqKi4gVW0gcGFscGl0ZSDDqSBxdWUsIGlzc28gc3VnZXJlIHF1ZSBvcyBwcm9ncmFtYXMgZGUgcMOzcy1ncmFkdWHDp8OjbyBxdWUgcG9zc3VlbSB1bSAqKm1haW9yIGNvcnBvIGRvY2VudGUqKiB0ZW5kZW0gYSAqKnRlciB1bWEgbWFpb3IgcHJvZHV0aXZpZGFkZSBhY2Fkw6ptaWNhKiogZW0gdGVybW9zIGRlIHB1YmxpY2HDp8O1ZXMgZGUgYXJ0aWdvcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgTWFpcyBmYXRvcmVzCgpgYGB7cn0KbW9kZWxvMiA9IGxtKHByb2R1Y2FvIH4gZG9jZW50ZXMgKyBtZXN0cmFkb3NfcHByb2YgKyBkb3V0b3JhZG9zX3Bwcm9mICsgdGVtX2RvdXRvcmFkbywgCiAgICAgICAgICAgICBkYXRhID0gY2FjY19tZCkKCnRpZHkobW9kZWxvMiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45NSkKZ2xhbmNlKG1vZGVsbzIpCmBgYAoKRSBzZSBjb25zaWRlcmFybW9zIHRhbWLDqW0gbyBuw7ptZXJvIGRlIGFsdW5vcz8KCmBgYHtyfQptb2RlbG8yID0gbG0ocHJvZHVjYW8gfiBkb2NlbnRlcyArIG1lc3RyYWRvcyArIGRvdXRvcmFkb3MsIGRhdGEgPSBjYWNjKQoKdGlkeShtb2RlbG8yLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpnbGFuY2UobW9kZWxvMikKYGBgCgpWaXN1YWxpemFyIG8gbW9kZWxvIGNvbSBtdWl0YXMgdmFyacOhdmVpcyBpbmRlcGVuZGVudGVzIGZpY2EgbWFpcyBkaWbDrWNpbAoKYGBge3J9CnBhcmFfcGxvdGFyX21vZGVsbyA9IGNhY2MgJT4lIAogIGRhdGFfZ3JpZChwcm9kdWNhbyA9IHNlcV9yYW5nZShwcm9kdWNhbywgMTApLCAjIENyaWUgdW0gdmV0b3IgZGUgMTAgdmFsb3JlcyBubyByYW5nZQogICAgICAgICAgICBkb2NlbnRlcyA9IHNlcV9yYW5nZShkb2NlbnRlcywgNCksICAKICAgICAgICAgICAgIyBtZXN0cmFkb3MgPSBzZXFfcmFuZ2UobWVzdHJhZG9zLCAzKSwKICAgICAgICAgICAgbWVzdHJhZG9zID0gbWVkaWFuKG1lc3RyYWRvcyksCiAgICAgICAgICAgIGRvdXRvcmFkb3MgPSBzZXFfcmFuZ2UoZG91dG9yYWRvcywgMykpICU+JSAKICBhZGRfcHJlZGljdGlvbnMobW9kZWxvMikKCmdsaW1wc2UocGFyYV9wbG90YXJfbW9kZWxvKQoKYGBgCgpgYGB7cn0KcGFyYV9wbG90YXJfbW9kZWxvICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBkb2NlbnRlcywgeSA9IHByZWQpKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBkb3V0b3JhZG9zLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBjYWNjLCBhZXMoeSA9IHByb2R1Y2FvLCBjb2xvdXIgPSBkb3V0b3JhZG9zKSkKYGBgCgpDb25zaWRlcmFuZG8gYWdvcmEgZXNzZXMgdHLDqnMgZmF0b3JlcywgbyBxdWUgcG9kZW1vcyBkaXplciBzb2JyZSBjb21vIGNhZGEgdW0gZGVsZXMgc2UgcmVsYWNpb25hIGNvbSBhIHByb2R1w6fDo28gZGUgdW0gcHJvZ3JhbWEgZGUgcMOzcyBlbSBDQz8gRSBzb2JyZSBvIG1vZGVsbz8gRWxlIGV4cGxpY2EgbWFpcyBxdWUgbyBtb2RlbG8gMT8KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipFWFBMSUNBw4fDg08qKjoKCioqUmVncmVzc8OjbyBtw7psdGlwbGEqKiBmb2kgdXRpbGl6YWRhIHBhcmEgYW5hbGlzYXIgc2UgKm8gbsO6bWVybyBkZSB0ZXNlcyBkb3V0b3JhZG8sIG8gbsO6bWVybyBkZSBkaXNzZXJ0YcOnw7VlcyBkZSBtZXN0cmFkbyBlIG7Dum1lcm8gZGUgZG9jZW50ZXMqIHRlbSB1bWEgYXNzb2NpYcOnw6NvIGNvbSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgbmEgKipww7NzIGdyYWR1YcOnw6NvKiouIE9zIHJlc3VsdGFkb3MgZGEgcmVncmVzc8OjbyBpbmRpY2FtIHF1ZSB1bSBtb2RlbG8gY29tIG9zIDMgcHJlZGl0b3JlcyBubyBmb3JtYXRvOgoKLSAgICoqcHJvZHXDp8OjbyoqID0gKiotMTQsMzcgKyAzLDUwIFwqIGRvY2VudGVzICsgMSwwMCBcKiBkb3V0b3JhZG9zIC0gMCwxOSBcKiBtZXN0cmFkb3MqKgoKZXhwbGljYW0gKio4NywwNiUqKiBkYSB2YXJpw6JuY2lhIGRhIHZhcmnDoXZlbCBkZSByZXNwb3N0YSAoKipSMiA9IDAsODcwNioqKS4gUG9ydGFudG8sIHBvZGVtb3MgYWZpcm1hciBvIHNlZ3VpbnRlOgoKLSAgIE8gbW9kZWxvIGluZGljYSBxdWUgbyAqKm7Dum1lcm8gZGUgZG9jZW50ZXMgdGVtIHVtYSByZWxhw6fDo28gcG9zaXRpdmEgZSBzaWduaWZpY2F0aXZhIGNvbSBhIHByb2R1w6fDo28gZGUgYXJ0aWdvcyBuYSBww7NzLWdyYWR1YcOnw6NvIChiID0gWzIsNTg7IDQsNDFdLCBJQyBjb20gOTUlKSoqLiBQYXJhIGNhZGEgdW5pZGFkZSBhZGljaW9uYWwgbm8gbsO6bWVybyBkZSBkb2NlbnRlcywgZXNwZXJhLXNlIHVtIGF1bWVudG8gZGUgMyw1IG5hIHByb2R1w6fDo28gZGUgYXJ0aWdvcy4KCi0gICBPIG7Dum1lcm8gZGUgdGVzZXMgZGUgZG91dG9yYWRvIHRhbWLDqW0gYXByZXNlbnRhIHVtYSAqKnJlbGHDp8OjbyBwb3NpdGl2YSBlIHNpZ25pZmljYXRpdmEgY29tIGEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zKiogKigqKipiID0gWzAsNjM7IDEsMzddLCBJQyBjb20gOTUlKS4qKiBQYXJhIGNhZGEgdW5pZGFkZSBhZGljaW9uYWwgbm8gbsO6bWVybyBkZSB0ZXNlcyBkZSBkb3V0b3JhZG8sIGVzcGVyYS1zZSB1bSBhdW1lbnRvIGRlIDEgbmEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zLgoKLSAgIEFsw6ltIGRpc3NvLCBvcyByZXN1bHRhZG9zIGluZGljYW0gcXVlIG7Do28gZioqb2kgZW5jb250cmFkYSB1bWEgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgZW50cmUgbyBuw7ptZXJvIGRlIGRpc3NlcnRhw6fDtWVzIGRlIG1lc3RyYWRvIGUgYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgKGIgPSBbLTAsMzY7IC0wLDAzMl0sIElDIGNvbSA5NSUpKiouIElzc28gc3VnZXJlIHF1ZSBvIGF1bWVudG8gbm8gbsO6bWVybyBkZSBkaXNzZXJ0YcOnw7VlcyBkZSBtZXN0cmFkbyBuw6NvIHRlbSB1bSBlZmVpdG8gc3Vic3RhbmNpYWwgbmEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zLgoKTG9nbywgY29tIGJhc2Ugbm9zIHJlc3VsdGFkb3MgZGEgcmVncmVzc8OjbyBtw7psdGlwbGEsIG9ic2VydmFtb3MgcXVlIG8gbsO6bWVybyBkZSAqKmRvY2VudGVzIGUgZGUgZG91dG9yYWRvcyB0ZW0gdW0gZWZlaXRvIHBvc2l0aXZvIGUgc2lnbmlmaWNhdGl2byBuYSBwcm9kdcOnw6NvIGRlIGFydGlnb3MgbmEgcMOzcy1ncmFkdWHDp8OjbyoqLiBBbMOpbSBkaXNzbywgbyBtb2RlbG8gMiwgcG9zc3VpIHVtIFLCsiBtYWlvciAoMCw4NzA2KSBlbSBjb21wYXJhw6fDo28gY29tIG8gbW9kZWxvIDEoUsKyID0uIDAsODE0NSkgLCBpbmRpY2FuZG8gcXVlIGVsZSBleHBsaWNhIG1lbGhvciBhIHZhcmlhw6fDo28gbmEgcHJvZHXDp8OjbyBkZSBhcnRpZ29zLiBFc3NlcyByZXN1bHRhZG9zIHN1Z2VyZW0gcXVlIGludmVzdGltZW50b3Mgbm8gYXVtZW50byBkbyBuw7ptZXJvIGRlIGRvY2VudGVzIGUgbmEgZm9ybWHDp8OjbyBkZSBkb3V0b3JlcyBwb2RlbSBjb250cmlidWlyIHBhcmEgdW0gYXVtZW50byBuYSBwcm9kdXRpdmlkYWRlIGNpZW50w61maWNhIGRhIHDDs3MtZ3JhZHVhw6fDo28uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIEFnb3JhIHByb2R1dGl2aWRhZGUKCkRpZmVyZW50ZSBkZSBtZWRpcm1vcyBwcm9kdcOnw6NvICh0b3RhbCBwcm9kdXppZG8pLCDDqSBtZWRpcm1vcyBwcm9kdXRpdmlkYWRlIChwcm9kdXppZG8gLyB1dGlsaXphZG8pLiBBYmFpeG8gZm9jYXJlbW9zIG5lc3NhIGFuw6FsaXNlLiBQYXJhIGlzc28gY3JpZSB1bSBtb2RlbG8gcXVlIGludmVzdGlnYSBjb21vIHVtIGNvbmp1bnRvIGRlIGZhdG9yZXMgcXVlIHZvY8OqIGp1bGdhIHF1ZSBzw6NvIHJlbGV2YW50ZXMgc2UgcmVsYWNpb25hbSBjb20gYSBwcm9kdXRpdmlkYWRlIGRvcyBwcm9ncmFtYXMuIENyaWUgdW0gbW9kZWxvIHF1ZSBhdmFsaWUgY29tbyAqcGVsbyBtZW5vcyAzIGZhdG9yZXMqIHNlIHJlbGFjaW9uYW0gY29tIGEgcHJvZHV0aXZpZGFkZSBkZSB1bSBwcm9ncmFtYS4gUG9kZSByZXV0aWxpemFyIGZhdG9yZXMgcXVlIGrDoSBkZWZpbmltb3MgZSBhbmFsaXphbW9zIHBhcmEgcHJvZHXDp8Ojby4gTWFzIGN1aWRhZG8gcGFyYSBuw6NvIGluY2x1aXIgZmF0b3JlcyBxdWUgc2VqYW0gZnVuw6fDo28gbGluZWFyIGRlIG91dHJvcyBqw6EgaW5jbHXDrWRvcyAoZXg6IGluY2x1aXIgQSwgQiBlIHVtIHRlcmNlcm8gQz1BK0IpCgpQcm9kdXphIGFiYWl4byBvIG1vZGVsbyBlIHVtIHRleHRvIHF1ZSBjb21lbnRlIChpKSBvIG1vZGVsbywgdGFsIGNvbW8gb3MgcXVlIGZpemVtb3MgYW50ZXMsIGUgKGlpKSBhcyBpbXBsaWNhw6fDtWVzIC0gbyBxdWUgYXByZW5kZW1vcyBzb2JyZSBjb21vIGZ1bmNpb25hbSBwcm9ncmFtYXMgZGUgcMOzcyBubyBicmFzaWw/LgoKIyMgTW9kZWxvCgpVdGlsaXphcmVtb3MgbyBtb2RlbG8gZGUgcmVncmVzc8OjbyBsaW5lYXIgbcO6bHRpcGxhLCByZWFsaXphbW9zIHVtYSBhbsOhbGlzZSBkYSBwcm9kdXRpdmlkYWRlIGVtIHJlbGHDp8OjbyBhIHF1YXRybyB2YXJpw6F2ZWlzIHByZWRpdG9yYXM6IHRlbV9kb3V0b3JhZG8sIGRvdXRvcmFkb3NfcHByb2YsIGRvdXRvcmFkb3MgZSBkb3V0b3JhZG9zLgoKYGBge3J9Cm1vZGVsb19wcm9kID0gbG0ocHJvZHV0aXZpZGFkZSB+IHRlbV9kb3V0b3JhZG8gKyBkb3V0b3JhZG9zX3Bwcm9mICsgZG91dG9yYWRvcyArIG1lc3RyYWRvc19wcHJvZiwgZGF0YSA9IGNhY2MpCgp0aWR5KG1vZGVsb19wcm9kLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjk1KQpgYGAKCmBgYHtyfQpnbGFuY2UobW9kZWxvX3Byb2QpCmBgYAoKIyMgRGViYXRlbmRvIHJlc3VsdGFkbwoKVXRpbGl6YW5kbyBhICoqcmVncmVzc8OjbyBsaW5lYXIgbcO6bHRpcGxhKiosIGludmVzdGlnYW1vcyBhIGFzc29jaWHDp8OjbyBzaWduaWZpY2F0aXZhIGVudHJlIGFzIHZhcmnDoXZlaXMgKip0ZW1fZG91dG9yYWRvLCBkb3V0b3JhZG9zX3Bwcm9mLCBtZXN0cmFkb3NfcHByb2YgZSBkb3V0b3JhZG9zKiogY29tIGEgdmFyacOhdmVsIGRlIHJlc3Bvc3RhICoqcHJvZHV0aXZpZGFkZSoqLiBPcyByZXN1bHRhZG9zIGRhIHJlZ3Jlc3PDo28gaW5kaWNhbSBxdWUgbyBtb2RlbG8gY29tIG9zIHF1YXRybyBwcmVkaXRvcmVzIHBvZGUgZXhwbGljYXIgKio1MSw4NSUqKiBkYSB2YXJpw6JuY2lhIG5hIHByb2R1dGl2aWRhZGUgKFLCsiA9IDAsNTE4NSkuCgotICAgQSB2YXJpw6F2ZWwgKipkb3V0b3JhZG9zKiogYXByZXNlbnRhIHVtYSByZWxhw6fDo28gcG91Y28gc2lnbmlmaWNhdGl2YSBjb20gYSBwcm9kdXRpdmlkYWRlLiBPIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JSBwYXJhIG8gY29lZmljaWVudGUgw6kgKipbLTAsMDE7IDAsMDJdKio7CgotICAgT2JzZXJ2YW1vcyB1bWEgcmVsYcOnw6NvIHBvdWNvIHNpZ25pZmljYXRpdmEgZW50cmUgbyBuw7ptZXJvIGRlICoqZG91dG9yYWRvc19wcHJvZioqIGUgYSBwcm9kdXRpdmlkYWRlLiBPIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JSBwYXJhIG8gY29lZmljaWVudGUgw6kgKipbLTAsMzc7IDEsMjRdKio7CgotICAgQSB2YXJpw6F2ZWwgKiptZXN0cmFkb3NfcHByb2YqKiBtb3N0cmEgdW1hIHJlbGHDp8OjbyBwb3VjbyBzaWduaWZpY2F0aXZhIGNvbSBhIHByb2R1dGl2aWRhZGUuIE8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlIHBhcmEgbyBjb2VmaWNpZW50ZSDDqSAqKlstMCwxMjsgMCwxNF0qKi4KCi0gICBPIGZhdG9yICoqdGVtX2RvdXRvcmFkbyoqIGRlbW9uc3RyYSB1bWEgcmVsYcOnw6NvIG1haXMgc2lnbmlmaWNhdGl2YSBjb20gYSBwcm9kdXRpdmlkYWRlLCBtb3N0cmFuZG8gcXVlIGEgcHJlc2Vuw6dhIGRlIGRvdXRvcmFkbyBlc3TDoSBhc3NvY2lhZGEgYSB1bSBhdW1lbnRvIG5hIHByb2R1dGl2aWRhZGUuIE8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlIHBhcmEgbyBjb2VmaWNpZW50ZSDDqSAqKlswLDU0OyAxLDc0XSoqLiBNYWlzIGVzcGVjaWZpY2FtZW50ZSwgcGFyYSBjYWRhIHVuaWRhZGUgYWRpY2lvbmFsIG5hIHZhcmnDoXZlbCAqKnRlbV9kb3V0b3JhZG8qKiwgb2JzZXJ2YW1vcyB1bSAqKmF1bWVudG8gZXN0aW1hZG8gZGUgMSwxMyoqIG5hIHByb2R1dGl2aWRhZGUuIEVzc2EgcmVsYcOnw6NvIHNpZ25pZmljYXRpdmEgc3VnZXJlIHF1ZSAqKmEgcHJlc2Vuw6dhIGRlIGRvdXRvcmFkbyB0ZW0gdW0gaW1wYWN0byBwb3NpdGl2byBuYSBwcm9kdXRpdmlkYWRlIGRvIGN1cnNvIGRlIHDDs3MtZ3JhZHVhw6fDo28qKi4K