Dados de despesas com alimentação
# Leitura do REGISTRO - CADERNETA COLETIVA (Questionario POF 3)
caderneta_coletiva <- readRDS("CADERNETA_COLETIVA.rds")
[1] Transformação do código do item (variável V9001) em 5 numeros, para ficar no mesmo padrão dos códigos que constam nos arquivos de tradutores das tabelas. Esses códigos são simplificados em 5 números, pois os 2 últimos números caracterizam sinônimos ou termos regionais do produto. Todos os resultados da pesquisa são trabalhados com os códigos considerando os 5 primeiros números. Por exemplo, tangerina e mexirica têm códigos diferentes quando se consideram 7 números, porém o mesmo código quando se consideram os 5 primeiros números.
[2] Exclusão dos itens do REGISTRO - CADERNETA COLETIVA (POF 3) que não se referem aos alimentos (grupos 86 a 89, ver cadastro de produtos).
[3] Anualização e expansão dos valores utilizados para a obtenção dos resultados (variável V8000_defla).
Para anualizar, utilizamos o quesito "fator_anualizacao". Os valores são anualizados para depois se obter uma média mensal.
Para expandir, utilizamos o quesito "peso_final".
Posteriormente, o resultado é dividido por 12 para obter a estimativa mensal.
cad_coletiva <- transform(subset(transform(caderneta_coletiva, codigo = round(V9001/100) # [1]
), codigo < 86001 | codigo > 89999), valor_mensal = (V8000_DEFLA * FATOR_ANUALIZACAO *
PESO_FINAL)/12 # [3]
)
rm(caderneta_coletiva) # para reduzir o uso da memoria
# Leitura do REGISTRO - DESPESA INDIVIDUAL (Questionario POF 4)
despesa_individual <- readRDS("DESPESA_INDIVIDUAL.rds")
[1] Transformação do código do item (variável V9001) em 5 numeros, para ficar no mesmo padrão dos códigos que constam nos arquivos de tradutores das tabelas. Esses códigos são simplificados em 5 números, pois os 2 últimos números caracterizam sinônimos ou termos regionais do produto. Todos os resultados da pesquisa são trabalhados com os códigos considerando os 5 primeiros números.
[2] Selecao dos itens do REGISTRO - DESPESA INDIVIDUAL (POF 4) que entram na tabela de alimentacao (todos do quadro 24 e codigos 41001,48018,49075,49089).
[3] Anualizacao e expansao dos valores utilizados para a obtenção dos resultados (variável V8000_defla).
Para anualizar, utilizamos o quesito "fator_anualizacao". No caso específico dos quadros 48 e 49,cujas informações se referem a valores mensais, utilizamos também o quesito V9011 (numero de meses). Os valores são anualizados para depois se obter uma média mensal.
Para expandir, utilizamos o quesito "peso_final".
Posteriormente, o resultado é dividido por 12 para obter a estimativa mensal.
desp_individual <- subset(transform(despesa_individual, codigo = round(V9001/100) # [1]
), QUADRO == 24 | codigo == 41001 | codigo == 48018 | codigo == 49075 |
codigo == 49089) # [2]
desp_individual <- transform(desp_individual, valor_mensal = ifelse(QUADRO == 24 |
QUADRO == 41, (V8000_DEFLA * FATOR_ANUALIZACAO * PESO_FINAL)/12, (V8000_DEFLA *
V9011 * FATOR_ANUALIZACAO * PESO_FINAL)/12) # [3]
)
rm(despesa_individual)
[1] Junção dos registros CADERNETA COLETIVA e DESPESA INDIVIDUAL, quem englobam os itens de alimentação.
# As duas tabelas precisam ter o mesmo conjunto de variaveis Identificacao dos
# nomes das variaveis das tabelas a serem juntadas:
nomes_cad <- names(cad_coletiva)
nomes_desp <- names(desp_individual)
# Identificacao das variaveis exclusivas a serem incluidas na outra tabela:
incl_cad <- nomes_desp[!nomes_desp %in% nomes_cad]
incl_desp <- nomes_cad[!nomes_cad %in% nomes_desp]
# Criando uma tabela com NAs das variaveis ausentes em cada tabela
col_ad_cad <- data.frame(matrix(NA, nrow(cad_coletiva), length(incl_cad)))
names(col_ad_cad) <- incl_cad
col_ad_desp <- data.frame(matrix(NA, nrow(desp_individual), length(incl_desp)))
names(col_ad_desp) <- incl_desp
# Acrescentando as colunas ausentes em cada tabela:
cad_coletiva <- cbind(cad_coletiva, col_ad_cad)
desp_individual <- cbind(desp_individual, col_ad_desp)
# Juntando (empilhando) as tabelas com conjuntos de variaveis iguais
junta_ali <- rbind(cad_coletiva, desp_individual) # [1]
Leitura do REGISTRO - MORADOR, necessário para o cálculo do número de UC’s expandido. Vale ressaltar que este e o único registro dos microdados que engloba todas as UC’s.
Extraindo todas as UC’s do arquivo de morador.
morador_uc <- unique(readRDS("MORADOR.rds")[, c("UF", "ESTRATO_POF", "TIPO_SITUACAO_REG",
"COD_UPA", "NUM_DOM", "NUM_UC", "PESO_FINAL") # Apenas variaveis com informacoes das UC's no arquivo 'MORADOR.rds'
]) # Apenas um registro por UC
Calculando o número de UC’s expandido. A cada domicílio é associado um peso_final e este é também associado a cada uma de suas unidades de consumo . Portanto, o total de unidades de consumo (familias) expandido, é o resultado da soma dos pesos_finais a elas associados.
soma_familia <- sum(morador_uc$PESO_FINAL)
[1] Leitura do arquivo de tradutor da tabela de alimentação.
Este tradutor organiza os codigos de produtos pelos diferentes grupos da tabela de alimentação. Os arquivos necessários foram colocados na pasta do projeto.
#
tradutor_alimentacao <- readxl::read_excel("Tradutor_Alimentação.xls") # [1]
[1] Juntando a base de dados com o tradutor da tabela de alimentação por código.
[2] Deletando as linhas referentes aos códigos que nao tiveram frequência.
merge1 <- merge(junta_ali, tradutor_alimentacao, by.x = "codigo", by.y = "Codigo") # [1]
merge1 <- merge1[!is.na(merge1$valor_mensal), ] # [2]
Somando os valores mensais de cada grupo de códigos, segundo cada nivel, conforme consta no tradutor.
soma_final_0 <- aggregate(valor_mensal ~ Nivel_0, data = merge1, sum)
names(soma_final_0) <- c("nivel", "soma")
soma_final_1 <- aggregate(valor_mensal ~ Nivel_1, data = merge1, sum)
names(soma_final_1) <- c("nivel", "soma")
soma_final_2 <- aggregate(valor_mensal ~ Nivel_2, data = merge1, sum)
names(soma_final_2) <- c("nivel", "soma")
soma_final_3 <- aggregate(valor_mensal ~ Nivel_3, data = merge1, sum)
names(soma_final_3) <- c("nivel", "soma")
Empilhando as somas obtidas no passo anterior.
soma_final <- rbind(soma_final_0, soma_final_1, soma_final_2, soma_final_3) # [1]
Calculando a despesa média mensal de cada grupo de códigos, segundo cada nível, conforme consta no tradutor.
merge2 <- data.frame(soma_final, soma_familia = soma_familia)
merge2 <- transform(merge2, media_mensal = round(soma/soma_familia, 2))
Leitura do arquivo de índice que determina a posição que cada linha deve ficar na tabela final. O arquivo de índice é apenas um arquivo auxiliar, criado para associar os resultados gerados com a ordem de apresentação da tabela de resultados.
indice_alimentacao <- readxl::read_excel("indice_Alimentacao.xls")
# Juntando o arquivo das despesas medias mensais de cada grupo de codigos com o
# arquivo de indice, para organizar os itens da tabela
merge3 <- merge(merge2, indice_alimentacao)
merge3 <- merge3[order(merge3$Indice), c(5, 1, 6, 4)] # [2]
knitr::kable(merge3)
1 |
1 |
0 |
Alimentacao total |
658.23 |
2 |
2 |
1 |
Alimentação no domicílio |
442.27 |
4 |
3 |
101 |
Cereais, leguminosas e oleaginosas |
22.22 |
28 |
4 |
1011 |
Arroz |
12.79 |
29 |
5 |
1012 |
Feijão |
5.92 |
30 |
6 |
1013 |
Orgânicos |
0.03 |
31 |
7 |
1014 |
Outros |
3.48 |
5 |
8 |
102 |
Farinhas, féculas e massas |
15.91 |
32 |
9 |
1021 |
Macarrão |
4.45 |
33 |
10 |
1022 |
Farinha de trigo |
1.29 |
34 |
11 |
1023 |
Farinha de mandioca |
2.41 |
35 |
12 |
1024 |
Outras |
7.75 |
6 |
13 |
103 |
Tubérculos e raízes |
7.17 |
36 |
14 |
1031 |
Batata inglesa |
2.77 |
37 |
15 |
1032 |
Cenoura |
1.17 |
38 |
16 |
1033 |
Mandioca |
0.98 |
39 |
17 |
1034 |
Outros |
2.25 |
7 |
18 |
104 |
Açúcares e derivados |
19.93 |
40 |
19 |
1041 |
Açúcar refinado |
2.11 |
41 |
20 |
1042 |
Açúcar cristal |
2.84 |
42 |
21 |
1043 |
Light e Diet |
0.19 |
43 |
22 |
1044 |
Outros |
14.79 |
8 |
23 |
105 |
Legumes e verduras |
16.05 |
44 |
24 |
1051 |
Tomate |
4.97 |
45 |
25 |
1052 |
Cebola |
2.10 |
46 |
26 |
1053 |
Alface |
1.78 |
47 |
27 |
1054 |
Outros |
7.20 |
9 |
28 |
106 |
Frutas |
23.08 |
48 |
29 |
1061 |
Banana |
5.94 |
49 |
30 |
1062 |
Laranja |
2.37 |
50 |
31 |
1063 |
Maca |
2.35 |
51 |
32 |
1064 |
Outros |
12.42 |
10 |
33 |
107 |
Carnes, vísceras e pescados |
89.42 |
52 |
34 |
1071 |
Carne de boi de primeira |
24.46 |
53 |
35 |
1072 |
Carne de boi de segunda |
16.38 |
54 |
36 |
1073 |
Carne de suíno |
7.61 |
55 |
37 |
1074 |
Carnes e peixes industrializados |
19.35 |
56 |
38 |
1075 |
Pescados frescos |
7.12 |
57 |
39 |
1076 |
Outros |
14.50 |
11 |
40 |
108 |
Aves e ovos |
33.58 |
58 |
41 |
1081 |
Frango |
24.76 |
59 |
42 |
1082 |
Ovo de galinha |
7.18 |
60 |
43 |
1083 |
Orgânicos |
0.11 |
61 |
44 |
1084 |
Outros |
1.53 |
12 |
45 |
109 |
Leites e derivados |
46.93 |
62 |
46 |
1091 |
Leite de vaca |
14.46 |
63 |
47 |
1092 |
Leite em pó |
5.57 |
64 |
48 |
1093 |
Queijos |
12.82 |
65 |
49 |
1094 |
Light e Diet |
0.76 |
66 |
50 |
1095 |
Orgânicos |
0.13 |
67 |
51 |
1096 |
Outros |
13.18 |
13 |
52 |
110 |
Panificados |
45.34 |
68 |
53 |
1101 |
Pão francês |
18.54 |
69 |
54 |
1102 |
Biscoito |
11.89 |
70 |
55 |
1103 |
Light e diet |
0.21 |
71 |
56 |
1104 |
Outros panificados |
14.70 |
14 |
57 |
111 |
Óleos e gorduras |
7.40 |
72 |
58 |
1111 |
Óleo de soja |
4.38 |
73 |
59 |
1112 |
Azeite de oliva |
1.91 |
74 |
60 |
1113 |
Outros |
1.11 |
15 |
61 |
112 |
Bebidas e infusões |
47.02 |
75 |
62 |
1121 |
Café moído |
9.92 |
76 |
63 |
1122 |
Refrigerantes |
12.04 |
77 |
64 |
1123 |
Bebidas não alcoólicas light e diet |
0.37 |
78 |
65 |
1124 |
Cervejas e chopes |
10.04 |
79 |
66 |
1125 |
Outras bebidas alcoólicas |
3.74 |
80 |
67 |
1126 |
Outras |
10.91 |
16 |
68 |
113 |
Enlatados e conservas |
3.89 |
17 |
69 |
114 |
Sal e condimentos |
10.19 |
81 |
70 |
1141 |
Massa de tomate |
0.76 |
82 |
71 |
1142 |
Maionese |
1.02 |
83 |
72 |
1143 |
Sal refinado |
0.50 |
84 |
73 |
1144 |
Outros |
7.91 |
18 |
74 |
115 |
Alimentos preparados |
14.90 |
19 |
75 |
116 |
Outros |
39.24 |
3 |
76 |
2 |
Alimentação fora do domicílio |
215.96 |
20 |
77 |
201 |
Almoço e jantar |
145.97 |
21 |
78 |
202 |
Café, leite, café/leite e chocolate |
2.50 |
22 |
79 |
203 |
Sanduíches e salgados |
18.28 |
23 |
80 |
204 |
Refrigerantes e outras bebidas não alcoólicas |
7.25 |
24 |
81 |
205 |
Lanches |
15.82 |
25 |
82 |
206 |
Cervejas, chopes e outras bebidas alcoólicas |
10.03 |
26 |
83 |
207 |
Alimentação light e diet |
0.12 |
27 |
84 |
208 |
Outras |
16.01 |
# pronto, o objeto merge 3 tem as despesas de alimentacao por grupos!
O resultado pode ser comparado com a tabela do post de IBGE(2019), reproduzida abaixo, no que diz respeito à Despesa com alimentação total e no domicílio.
LS0tDQp0aXRsZTogJ01pY3JvZGFkb3MgY29tIFI6IERlc3Blc2EgY29tIGFsaW1lbnRhw6fDo28gY29uZm9ybWUgYSBQT0YgMjAxNy8yMDE4Jw0KYXV0aG9yOiAnQWRyaWFubyBNYXJjb3MgUm9kcmlndWVzIEZpZ3VlaXJlZG8sICplLW1haWw6IGFkcmlhbm8uZmlndWVpcmVkb0B1Zm1zLmJyKicNCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogbm8NCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQpsaW5rY29sb3I6IGJsdWUNCmFic3RyYWN0OiBUaGlzIGlzIGFuIHVuZGVyZ3JhZCBzdHVkZW50IGxldmVsIGluc3RydWN0aW9uIGZvciBjbGFzcyB1c2UuDQpncmFwaGljczogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQpzdGFydC50aW1lIDwtIFN5cy50aW1lKCkNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCg0KTGljZW7Dp2Egey0jTGljZW7Dp2F9DQo9PT09PT09PT09PT09PT09PT09DQoNClRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIFRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgbGljZW5zZSwgdmlzaXQgPGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8+IG9yIHNlbmQgYSBsZXR0ZXIgdG8gQ3JlYXRpdmUgQ29tbW9ucywgUE8gQm94IDE4NjYsIE1vdW50YWluIFZpZXcsIENBIDk0MDQyLCBVU0EuDQoNCiFbTGljZW5zZTogQ0MgQlktU0EgNC4wXShodHRwczovL21pcnJvcnMuY3JlYXRpdmVjb21tb25zLm9yZy9wcmVzc2tpdC9idXR0b25zLzg4eDMxL3BuZy9ieS1zYS5wbmcpeyB3aWR0aD0yNSUgfQ0KDQpDaXRhw6fDo28gey0jQ2l0YcOnw6NvfQ0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KU3VnZXN0w6NvIGRlIGNpdGHDp8OjbzoNCkZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gTWljcm9kYWRvcyBjb20gUjogRGVzcGVzYSBjb20gYWxpbWVudGHDp8OjbyBjb25mb3JtZSBhIFBPRiAyMDE3LzIwMTguIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMjEuIERpc3BvbsOtdmVsIGVtIDxodHRwOi8vcnB1YnMuY29tL2Ftcm9maS9taWNyb2RhZG9zX3BvZj4uIA0KDQpJbnRyb2R1w6fDo28NCj09PT09PT09PT09PT09PT09PT0NCg0KRXN0ZSDDqSB1bSBzY3JpcHQgcGFyYSBlc3RpbWFyIGFzIGRlc3Blc2FzIGRlIGFsaW1lbnRhw6fDo28gIHBhcmEgbyBCcmFzaWwsIGZlaXRvIGNvbmZvcm1lIG8gc2NyaXB0IGRhIDxUYWJlbGEgZGUgQWxpbWVudGFjYW8uUj4gZGlzcG9uaWJpbGl6YWRvIHBlbG8gSUJHRSAoMjAyMCkuIMOJIHByZWNpc28gZXhlY3V0YXIgYW50ZXMgbyBhcnF1aXZvICJMZWl0dXJhIGRvcyBNaWNyb2RhZG9zIC0gUi5SIiBxdWUgc2UgZW5jb250cmEgbm8gYXJxdWl2byBjb21wYWN0YWRvICJQcm9ncmFtYXNfZGVfTGVpdHVyYS56aXAiIChJQkdFLCAyMDIwKS4gRXN0ZSBwYXNzbyDDqSBuZWNlc3PDoXJpbyBwYXJhIGdlcmFyIG9zIGFycXVpdm9zIGNvbSBhIGV4dGVuc2FvIC5yZHMgY29ycmVzcG9uZGVudGVzIGFvcyBhcnF1aXZvcyBkb3MgbWljcm9kYWRvcyBkYSBQT0YgMjAxNy8yMDE4LiBFc3RhIHJvdGluYSBlc3TDoSBkaXNwb25pYmlsaXphZGEgZGlyZXRhbWVudGUgcGVsbyBJQkdFIGVtIG1pY3JvZGFkb3MgZGEgUE9GLg0KDQpEYWRvcyBkZSBkZXNwZXNhcyBjb20gYWxpbWVudGHDp8Ojbw0KPT09PT09PT09PT09PT09PT09PQ0KDQpgYGB7cn0NCiMgIExlaXR1cmEgZG8gUkVHSVNUUk8gLSBDQURFUk5FVEEgQ09MRVRJVkEgKFF1ZXN0aW9uYXJpbyBQT0YgMykNCmNhZGVybmV0YV9jb2xldGl2YSA8LSByZWFkUkRTKCJDQURFUk5FVEFfQ09MRVRJVkEucmRzIikNCmBgYA0KDQpbMV0gVHJhbnNmb3JtYcOnw6NvIGRvIGPDs2RpZ28gZG8gaXRlbSAodmFyacOhdmVsIFY5MDAxKSBlbSA1IG51bWVyb3MsIHBhcmEgZmljYXIgbm8gbWVzbW8gcGFkcsOjbyBkb3MgY8OzZGlnb3MgcXVlIGNvbnN0YW0gbm9zIGFycXVpdm9zIGRlIHRyYWR1dG9yZXMgZGFzIHRhYmVsYXMuIEVzc2VzIGPDs2RpZ29zIHPDo28gc2ltcGxpZmljYWRvcyBlbSA1IG7Dum1lcm9zLCBwb2lzIG9zIDIgw7psdGltb3MgbsO6bWVyb3MgY2FyYWN0ZXJpemFtIHNpbsO0bmltb3Mgb3UgdGVybW9zIHJlZ2lvbmFpcyBkbyBwcm9kdXRvLiBUb2RvcyBvcyByZXN1bHRhZG9zIGRhIHBlc3F1aXNhIHPDo28gdHJhYmFsaGFkb3MgY29tIG9zIGPDs2RpZ29zIGNvbnNpZGVyYW5kbyBvcyA1IHByaW1laXJvcyBuw7ptZXJvcy4gUG9yIGV4ZW1wbG8sIHRhbmdlcmluYSBlIG1leGlyaWNhIHTDqm0gY8OzZGlnb3MgZGlmZXJlbnRlcyBxdWFuZG8gc2UgY29uc2lkZXJhbSA3IG7Dum1lcm9zLCBwb3LDqW0gbyBtZXNtbyBjw7NkaWdvIHF1YW5kbyBzZSBjb25zaWRlcmFtIG9zIDUgcHJpbWVpcm9zIG7Dum1lcm9zLiANCiAgICANClsyXSBFeGNsdXPDo28gZG9zIGl0ZW5zIGRvIFJFR0lTVFJPIC0gQ0FERVJORVRBIENPTEVUSVZBIChQT0YgMykgcXVlIG7Do28gc2UgcmVmZXJlbSBhb3MgYWxpbWVudG9zIChncnVwb3MgODYgYSA4OSwgdmVyIGNhZGFzdHJvIGRlIHByb2R1dG9zKS4gDQogICAgIA0KWzNdIEFudWFsaXphw6fDo28gZSBleHBhbnPDo28gZG9zIHZhbG9yZXMgdXRpbGl6YWRvcyBwYXJhIGEgb2J0ZW7Dp8OjbyBkb3MgcmVzdWx0YWRvcyAodmFyacOhdmVsIFY4MDAwX2RlZmxhKS4gICAgIA0KDQphKSAgICAgUGFyYSBhbnVhbGl6YXIsIHV0aWxpemFtb3MgbyBxdWVzaXRvICJmYXRvcl9hbnVhbGl6YWNhbyIuIE9zIHZhbG9yZXMgc8OjbyBhbnVhbGl6YWRvcyBwYXJhIGRlcG9pcyBzZSBvYnRlciB1bWEgbcOpZGlhIG1lbnNhbC4gICAgIA0KDQpiKSAgICAgUGFyYSBleHBhbmRpciwgdXRpbGl6YW1vcyBvIHF1ZXNpdG8gInBlc29fZmluYWwiLiAgICAgICANCg0KYykgICAgIFBvc3Rlcmlvcm1lbnRlLCBvIHJlc3VsdGFkbyDDqSBkaXZpZGlkbyBwb3IgMTIgcGFyYSBvYnRlciBhIGVzdGltYXRpdmEgbWVuc2FsLg0KDQpgYGB7ciBjYWRlcm5ldGFzLGNhY2hlPVRSVUV9IA0KY2FkX2NvbGV0aXZhIDwtIA0KICB0cmFuc2Zvcm0oIHN1YnNldCggdHJhbnNmb3JtKCBjYWRlcm5ldGFfY29sZXRpdmEgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSByb3VuZChWOTAwMS8xMDApICMgWzFdDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksDQogICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPCA4NjAwMSB8IGNvZGlnbyA+IDg5OTk5DQogICAgICAgICAgICAgICAgICAgICApLA0KICAgICAgICAgICAgIHZhbG9yX21lbnNhbD0oVjgwMDBfREVGTEEqRkFUT1JfQU5VQUxJWkFDQU8qUEVTT19GSU5BTCkvMTIgIyBbM10gDQogICAgICAgICAgICAgKQ0Kcm0oY2FkZXJuZXRhX2NvbGV0aXZhKSAgIyBwYXJhIHJlZHV6aXIgbyB1c28gZGEgbWVtb3JpYQ0KDQoNCiMgTGVpdHVyYSBkbyBSRUdJU1RSTyAtIERFU1BFU0EgSU5ESVZJRFVBTCAoUXVlc3Rpb25hcmlvIFBPRiA0KQ0KDQpkZXNwZXNhX2luZGl2aWR1YWwgPC0gcmVhZFJEUygiREVTUEVTQV9JTkRJVklEVUFMLnJkcyIpDQpgYGANCg0KWzFdIFRyYW5zZm9ybWHDp8OjbyBkbyBjw7NkaWdvIGRvIGl0ZW0gKHZhcmnDoXZlbCBWOTAwMSkgZW0gNSBudW1lcm9zLCBwYXJhIGZpY2FyIG5vIG1lc21vIHBhZHLDo28gZG9zIGPDs2RpZ29zIHF1ZSBjb25zdGFtIG5vcyBhcnF1aXZvcyBkZSB0cmFkdXRvcmVzIGRhcyB0YWJlbGFzLiBFc3NlcyBjw7NkaWdvcyBzw6NvIHNpbXBsaWZpY2Fkb3MgZW0gNSBuw7ptZXJvcywgcG9pcyBvcyAyIMO6bHRpbW9zIG7Dum1lcm9zIGNhcmFjdGVyaXphbSBzaW7DtG5pbW9zIG91IHRlcm1vcyByZWdpb25haXMgZG8gcHJvZHV0by4gVG9kb3Mgb3MgcmVzdWx0YWRvcyBkYSBwZXNxdWlzYSBzw6NvIHRyYWJhbGhhZG9zIGNvbSBvcyBjw7NkaWdvcyBjb25zaWRlcmFuZG8gb3MgNSBwcmltZWlyb3MgbsO6bWVyb3MuIA0KICAgICANClsyXSBTZWxlY2FvIGRvcyBpdGVucyBkbyBSRUdJU1RSTyAtIERFU1BFU0EgSU5ESVZJRFVBTCAoUE9GIDQpIHF1ZSBlbnRyYW0gbmEgdGFiZWxhIGRlIGFsaW1lbnRhY2FvICh0b2RvcyBkbyBxdWFkcm8gMjQgZSBjb2RpZ29zIDQxMDAxLDQ4MDE4LDQ5MDc1LDQ5MDg5KS4gICANCiAgICAgDQpbM10gQW51YWxpemFjYW8gZSBleHBhbnNhbyBkb3MgdmFsb3JlcyB1dGlsaXphZG9zIHBhcmEgYSBvYnRlbsOnw6NvIGRvcyByZXN1bHRhZG9zICh2YXJpw6F2ZWwgVjgwMDBfZGVmbGEpLiAgICAgDQoNCmEpICAgICBQYXJhIGFudWFsaXphciwgdXRpbGl6YW1vcyBvIHF1ZXNpdG8gImZhdG9yX2FudWFsaXphY2FvIi4gTm8gY2FzbyBlc3BlY8OtZmljbyBkb3MgcXVhZHJvcyA0OCBlIDQ5LGN1amFzIGluZm9ybWHDp8O1ZXMgc2UgcmVmZXJlbSBhIHZhbG9yZXMgbWVuc2FpcywgdXRpbGl6YW1vcyB0YW1iw6ltIG8gcXVlc2l0byBWOTAxMSAobnVtZXJvIGRlIG1lc2VzKS4gT3MgdmFsb3JlcyBzw6NvIGFudWFsaXphZG9zIHBhcmEgZGVwb2lzIHNlIG9idGVyIHVtYSBtw6lkaWEgbWVuc2FsLg0KICAgICAgIA0KYikgICAgIFBhcmEgZXhwYW5kaXIsIHV0aWxpemFtb3MgbyBxdWVzaXRvICJwZXNvX2ZpbmFsIi4gICAgIA0KICAgICANCmMpICAgICBQb3N0ZXJpb3JtZW50ZSwgbyByZXN1bHRhZG8gw6kgZGl2aWRpZG8gcG9yIDEyIHBhcmEgb2J0ZXIgYSBlc3RpbWF0aXZhIG1lbnNhbC4gDQoNCmBgYHtyIGRlc3Blc2EsY2FjaGU9VFJVRX0gIA0KZGVzcF9pbmRpdmlkdWFsIDwtIA0KICBzdWJzZXQoIHRyYW5zZm9ybSggZGVzcGVzYV9pbmRpdmlkdWFsLA0KICAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gcm91bmQoVjkwMDEvMTAwKSAjIFsxXQ0KICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICBRVUFEUk89PTI0fGNvZGlnbz09NDEwMDF8Y29kaWdvPT00ODAxOHxjb2RpZ289PTQ5MDc1fGNvZGlnbz09NDkwODkNCiAgICAgICAgICApICMgWzJdDQoNCmRlc3BfaW5kaXZpZHVhbCA8LQ0KICB0cmFuc2Zvcm0oIGRlc3BfaW5kaXZpZHVhbCwNCiAgICAgICAgICAgICB2YWxvcl9tZW5zYWwgPSBpZmVsc2UoIFFVQURSTz09MjR8UVVBRFJPPT00MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWODAwMF9ERUZMQSpGQVRPUl9BTlVBTElaQUNBTypQRVNPX0ZJTkFMKS8xMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjgwMDBfREVGTEEqVjkwMTEqRkFUT1JfQU5VQUxJWkFDQU8qUEVTT19GSU5BTCkvMTINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgIyBbM10gDQogICAgICAgICAgICAgKQ0Kcm0oZGVzcGVzYV9pbmRpdmlkdWFsKQ0KYGBgDQoNClsxXSBKdW7Dp8OjbyBkb3MgcmVnaXN0cm9zIENBREVSTkVUQSBDT0xFVElWQSBlIERFU1BFU0EgSU5ESVZJRFVBTCwgcXVlbSBlbmdsb2JhbSBvcyBpdGVucyBkZSBhbGltZW50YcOnw6NvLiANCg0KYGBge3IganVuY2FvLGNhY2hlPVRSVUV9DQojIEFzIGR1YXMgdGFiZWxhcyBwcmVjaXNhbSB0ZXIgbyBtZXNtbyBjb25qdW50byBkZSB2YXJpYXZlaXMNCiMgSWRlbnRpZmljYWNhbyBkb3Mgbm9tZXMgZGFzIHZhcmlhdmVpcyBkYXMgdGFiZWxhcyBhIHNlcmVtIGp1bnRhZGFzOg0Kbm9tZXNfY2FkIDwtIG5hbWVzKGNhZF9jb2xldGl2YSkNCm5vbWVzX2Rlc3AgPC0gbmFtZXMoZGVzcF9pbmRpdmlkdWFsKQ0KDQojIElkZW50aWZpY2FjYW8gZGFzIHZhcmlhdmVpcyBleGNsdXNpdmFzIGEgc2VyZW0gaW5jbHVpZGFzIG5hIG91dHJhIHRhYmVsYToNCmluY2xfY2FkIDwtIG5vbWVzX2Rlc3BbIW5vbWVzX2Rlc3AgJWluJSBub21lc19jYWRdDQppbmNsX2Rlc3AgPC0gbm9tZXNfY2FkWyFub21lc19jYWQgJWluJSBub21lc19kZXNwXQ0KDQojIENyaWFuZG8gdW1hIHRhYmVsYSBjb20gTkFzIGRhcyB2YXJpYXZlaXMgYXVzZW50ZXMgZW0gY2FkYSB0YWJlbGENCmNvbF9hZF9jYWQgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coY2FkX2NvbGV0aXZhKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGluY2xfY2FkKSkpDQpuYW1lcyhjb2xfYWRfY2FkKSA8LSBpbmNsX2NhZA0KY29sX2FkX2Rlc3AgPC0gZGF0YS5mcmFtZShtYXRyaXgoTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3coZGVzcF9pbmRpdmlkdWFsKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKGluY2xfZGVzcCkpKQ0KbmFtZXMoY29sX2FkX2Rlc3ApIDwtIGluY2xfZGVzcA0KDQojIEFjcmVzY2VudGFuZG8gYXMgY29sdW5hcyBhdXNlbnRlcyBlbSBjYWRhIHRhYmVsYToNCmNhZF9jb2xldGl2YSA8LSBjYmluZChjYWRfY29sZXRpdmEgLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbF9hZF9jYWQpDQpkZXNwX2luZGl2aWR1YWwgPC0gY2JpbmQoIGRlc3BfaW5kaXZpZHVhbCAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfYWRfZGVzcCkNCg0KIyBKdW50YW5kbyAoZW1waWxoYW5kbykgYXMgdGFiZWxhcyBjb20gY29uanVudG9zIGRlIHZhcmlhdmVpcyBpZ3VhaXMNCmp1bnRhX2FsaSA8LSANCiAgcmJpbmQoIGNhZF9jb2xldGl2YSAsIGRlc3BfaW5kaXZpZHVhbCApICMgWzFdDQpgYGANCg0KTGVpdHVyYSBkbyBSRUdJU1RSTyAtIE1PUkFET1IsIG5lY2Vzc8OhcmlvIHBhcmEgbyBjw6FsY3VsbyBkbyBuw7ptZXJvIGRlIFVDJ3MgZXhwYW5kaWRvLiBWYWxlIHJlc3NhbHRhciBxdWUgZXN0ZSBlIG8gw7puaWNvIHJlZ2lzdHJvIGRvcyBtaWNyb2RhZG9zIHF1ZSBlbmdsb2JhIHRvZGFzIGFzIFVDJ3MuDQogICAgDQpFeHRyYWluZG8gdG9kYXMgYXMgVUMncyBkbyBhcnF1aXZvIGRlIG1vcmFkb3IuDQoNCmBgYHtyIHVjX21vcmFkb3IsY2FjaGU9VFJVRX0NCm1vcmFkb3JfdWMgPC0gDQogIHVuaXF1ZSggDQogICAgcmVhZFJEUyggDQogICAgICAiTU9SQURPUi5yZHMiIA0KICAgICkgWyAsDQogICAgICAgIGMoICJVRiIsIkVTVFJBVE9fUE9GIiwiVElQT19TSVRVQUNBT19SRUciLCJDT0RfVVBBIiwiTlVNX0RPTSIsIk5VTV9VQyIsDQogICAgICAgICAgICJQRVNPX0ZJTkFMIg0KICAgICAgICApICMgQXBlbmFzIHZhcmlhdmVpcyBjb20gaW5mb3JtYWNvZXMgZGFzIFVDJ3Mgbm8gYXJxdWl2byAiTU9SQURPUi5yZHMiDQogICAgICAgIF0gKSAjIEFwZW5hcyB1bSByZWdpc3RybyBwb3IgVUMNCmBgYA0KDQoNCkNhbGN1bGFuZG8gbyBuw7ptZXJvIGRlIFVDJ3MgZXhwYW5kaWRvLiBBIGNhZGEgZG9taWPDrWxpbyDDqSBhc3NvY2lhZG8gdW0gcGVzb19maW5hbCBlIGVzdGUgw6kgdGFtYsOpbSBhc3NvY2lhZG8gYSBjYWRhIHVtYSBkZSBzdWFzIHVuaWRhZGVzIGRlIGNvbnN1bW8gLiBQb3J0YW50bywgbyB0b3RhbCBkZSB1bmlkYWRlcyBkZSBjb25zdW1vIChmYW1pbGlhcykgZXhwYW5kaWRvLCDDqSBvIHJlc3VsdGFkbyBkYSBzb21hIGRvcyBwZXNvc19maW5haXMgYSBlbGFzIGFzc29jaWFkb3MuDQoNCmBgYHtyIHNvbWFfZmFtaWxpYSwgY2FjaGU9VFJVRX0NCnNvbWFfZmFtaWxpYSA8LSBzdW0oIG1vcmFkb3JfdWMkUEVTT19GSU5BTCApDQpgYGANCg0KWzFdIExlaXR1cmEgZG8gYXJxdWl2byBkZSB0cmFkdXRvciBkYSB0YWJlbGEgZGUgYWxpbWVudGHDp8Ojby4gDQoNCkVzdGUgdHJhZHV0b3Igb3JnYW5pemEgb3MgY29kaWdvcyBkZSBwcm9kdXRvcyBwZWxvcyBkaWZlcmVudGVzIGdydXBvcyBkYSB0YWJlbGEgZGUgYWxpbWVudGHDp8Ojby4gT3MgYXJxdWl2b3MgbmVjZXNzw6FyaW9zIGZvcmFtIGNvbG9jYWRvcyBuYSBwYXN0YSBkbyBwcm9qZXRvLg0KDQpgYGB7ciB0cmFkdXRvcixjYWNoZT1UUlVFfQ0KIyANCnRyYWR1dG9yX2FsaW1lbnRhY2FvIDwtDQogIHJlYWR4bDo6cmVhZF9leGNlbCgiVHJhZHV0b3JfQWxpbWVudGHDp8Ojby54bHMiKSAjIFsxXQ0KYGBgDQoNClsxXSBKdW50YW5kbyBhIGJhc2UgZGUgZGFkb3MgY29tIG8gdHJhZHV0b3IgZGEgdGFiZWxhIGRlIGFsaW1lbnRhw6fDo28gcG9yIGPDs2RpZ28uICAgIA0KDQpbMl0gRGVsZXRhbmRvIGFzIGxpbmhhcyByZWZlcmVudGVzIGFvcyBjw7NkaWdvcyBxdWUgbmFvIHRpdmVyYW0gZnJlcXXDqm5jaWEuDQoNCmBgYHtyIG1lcmdlMSxjYWNoZT1UUlVFfQ0KbWVyZ2UxIDwtIA0KICBtZXJnZSgganVudGFfYWxpICwNCiAgICAgICAgIHRyYWR1dG9yX2FsaW1lbnRhY2FvICwNCiAgICAgICAgIGJ5LnggPSAiY29kaWdvIiAsDQogICAgICAgICBieS55ID0gIkNvZGlnbyINCiAgICAgICAgICkgIyBbMV0NCg0KbWVyZ2UxIDwtIA0KICBtZXJnZTFbIWlzLm5hKG1lcmdlMSR2YWxvcl9tZW5zYWwpLCBdICMgWzJdDQpgYGANCg0KU29tYW5kbyBvcyB2YWxvcmVzIG1lbnNhaXMgZGUgY2FkYSBncnVwbyBkZSBjw7NkaWdvcywgc2VndW5kbyBjYWRhIG5pdmVsLCBjb25mb3JtZSBjb25zdGEgbm8gdHJhZHV0b3IuDQoNCmBgYHtyIHNvbWFtZXMsY2FjaGU9VFJVRX0NCnNvbWFfZmluYWxfMCA8LSBhZ2dyZWdhdGUodmFsb3JfbWVuc2Fsfk5pdmVsXzAsZGF0YT1tZXJnZTEsc3VtKQ0KbmFtZXMoc29tYV9maW5hbF8wKSA8LSBjKCJuaXZlbCIsICJzb21hIikNCg0Kc29tYV9maW5hbF8xIDwtIGFnZ3JlZ2F0ZSh2YWxvcl9tZW5zYWx+Tml2ZWxfMSxkYXRhPW1lcmdlMSxzdW0pDQpuYW1lcyhzb21hX2ZpbmFsXzEpIDwtIGMoIm5pdmVsIiwgInNvbWEiKQ0KDQpzb21hX2ZpbmFsXzIgPC0gYWdncmVnYXRlKHZhbG9yX21lbnNhbH5OaXZlbF8yLGRhdGE9bWVyZ2UxLHN1bSkNCm5hbWVzKHNvbWFfZmluYWxfMikgPC0gYygibml2ZWwiLCAic29tYSIpDQoNCnNvbWFfZmluYWxfMyA8LSBhZ2dyZWdhdGUodmFsb3JfbWVuc2Fsfk5pdmVsXzMsZGF0YT1tZXJnZTEsc3VtKQ0KbmFtZXMoc29tYV9maW5hbF8zKSA8LSBjKCJuaXZlbCIsICJzb21hIikNCmBgYA0KDQpFbXBpbGhhbmRvIGFzIHNvbWFzIG9idGlkYXMgbm8gcGFzc28gYW50ZXJpb3IuIA0KDQpgYGB7ciBlbXBpbGhhLCBjYWNoZT1UUlVFfQ0Kc29tYV9maW5hbCA8LSByYmluZCggc29tYV9maW5hbF8wICwNCiAgICAgICAgICAgICAgICAgICAgIHNvbWFfZmluYWxfMSAsDQogICAgICAgICAgICAgICAgICAgICBzb21hX2ZpbmFsXzIgLA0KICAgICAgICAgICAgICAgICAgICAgc29tYV9maW5hbF8zDQogICAgICAgICAgICAgICAgICAgICApICMgWzFdDQpgYGANCg0KQ2FsY3VsYW5kbyBhIGRlc3Blc2EgbcOpZGlhIG1lbnNhbCBkZSBjYWRhIGdydXBvIGRlIGPDs2RpZ29zLCBzZWd1bmRvIGNhZGEgbsOtdmVsLCBjb25mb3JtZSBjb25zdGEgbm8gdHJhZHV0b3IuDQoNCmBgYHtyIG1lcmdlMiwgY2FjaGU9VFJVRX0NCm1lcmdlMiA8LSBkYXRhLmZyYW1lKCBzb21hX2ZpbmFsICwgc29tYV9mYW1pbGlhPXNvbWFfZmFtaWxpYSApDQptZXJnZTIgPC0gDQogIHRyYW5zZm9ybSggbWVyZ2UyICwNCiAgICAgICAgICAgICBtZWRpYV9tZW5zYWwgPSByb3VuZCggc29tYSAvIHNvbWFfZmFtaWxpYSAsIDIgKSApDQpgYGANCg0KTGVpdHVyYSBkbyBhcnF1aXZvIGRlIMOtbmRpY2UgcXVlIGRldGVybWluYSBhIHBvc2nDp8OjbyBxdWUgY2FkYSBsaW5oYSBkZXZlIGZpY2FyIG5hIHRhYmVsYSBmaW5hbC4gTyBhcnF1aXZvIGRlIMOtbmRpY2Ugw6kgYXBlbmFzIHVtIGFycXVpdm8gYXV4aWxpYXIsIGNyaWFkbyBwYXJhIGFzc29jaWFyIG9zIHJlc3VsdGFkb3MgZ2VyYWRvcyBjb20gYSBvcmRlbSBkZSBhcHJlc2VudGHDp8OjbyBkYSB0YWJlbGEgZGUgcmVzdWx0YWRvcy4NCg0KYGBge3IgbWVyZ2UzLCBjYWNoZT1UUlVFfQ0KaW5kaWNlX2FsaW1lbnRhY2FvIDwtDQogIHJlYWR4bDo6cmVhZF9leGNlbCgiaW5kaWNlX0FsaW1lbnRhY2FvLnhscyIpDQoNCiMgSnVudGFuZG8gbyBhcnF1aXZvIGRhcyBkZXNwZXNhcyBtZWRpYXMgbWVuc2FpcyBkZSBjYWRhIGdydXBvDQojIGRlIGNvZGlnb3MgY29tIG8gYXJxdWl2byBkZSBpbmRpY2UsIHBhcmEgb3JnYW5pemFyIG9zIGl0ZW5zIGRhIHRhYmVsYQ0KDQptZXJnZTMgPC0gbWVyZ2UobWVyZ2UyLGluZGljZV9hbGltZW50YWNhbykNCm1lcmdlMyA8LSANCiAgbWVyZ2UzWyBvcmRlciggbWVyZ2UzJEluZGljZSApICwgYyg1LDEsNiw0KSBdICMgWzJdDQprbml0cjo6a2FibGUobWVyZ2UzKQ0KIyBwcm9udG8sIG8gb2JqZXRvIG1lcmdlIDMgdGVtIGFzIGRlc3Blc2FzIGRlIGFsaW1lbnRhY2FvIHBvciBncnVwb3MhDQoNCmBgYA0KDQpPIHJlc3VsdGFkbyBwb2RlIHNlciBjb21wYXJhZG8gY29tIGEgdGFiZWxhIGRvIHBvc3QgZGUgSUJHRSgyMDE5KSwgcmVwcm9kdXppZGEgYWJhaXhvLCBubyBxdWUgZGl6IHJlc3BlaXRvIMOgIERlc3Blc2EgY29tIGFsaW1lbnRhw6fDo28gdG90YWwgZSBubyBkb21pY8OtbGlvLg0KDQoNCiFbRGVzcGVzYSBjb20gYWxpbWVudGHDp8OjbywgQnJhc2lsLCBQT0YgMjAxNy8yMDE4LCBkZSBJQkdFICgyMDE5KV0odGFiZWxhX3Bvc3QuanBnKXsgd2lkdGg9MTAwJSB9DQoNClJlZmVyw6puY2lhcyB7LSNSZWZlcsOqbmNpYXN9DQo9PT09PT09PT09PT09PT09PT09PT09PT0NCg0KSUJHRSwgUE9GIDIwMTctMjAxODogRmFtw61saWFzIGNvbSBhdMOpIFIkIDEsOSBtaWwgZGVzdGluYW0gNjEsMiUgZGUgc2V1cyBnYXN0b3Mgw6AgYWxpbWVudGHDp8OjbyBlIGhhYml0YcOnw6NvLiBSaW8gZGUgSmFuZWlybywgMjAxOS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2FnZW5jaWFkZW5vdGljaWFzLmliZ2UuZ292LmJyL2FnZW5jaWEtc2FsYS1kZS1pbXByZW5zYS8yMDEzLWFnZW5jaWEtZGUtbm90aWNpYXMvcmVsZWFzZXMvMjU1OTgtcG9mLTIwMTctMjAxOC1mYW1pbGlhcy1jb20tYXRlLXItMS05LW1pbC1kZXN0aW5hbS02MS0yLWRlLXNldXMtZ2FzdG9zLWEtYWxpbWVudGFjYW8tZS1oYWJpdGFjYW8+Lg0KICAgICANCklCR0UuIFBlc3F1aXNhIGRlIE9yw6dhbWVudG9zIEZhbWlsaWFyZXMgLSBQT0YgLSBNaWNyb2RhZG9zLiBSaW8gZGUgSmFuZWlybywgMjAyMC4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL3d3dy5pYmdlLmdvdi5ici9lc3RhdGlzdGljYXMvc29jaWFpcy9oYWJpdGFjYW8vOTA1MC1wZXNxdWlzYS1kZS1vcmNhbWVudG9zLWZhbWlsaWFyZXMuaHRtbD89JnQ9bWljcm9kYWRvcz4uICAgIA0KICAgIA0KSkFDT0IsIEd1aWxoZXJtZTsgIFBFU1NPQSwgIERqYWxtYTsgREFNSUNPLCBBbnRob255LiBQb3ZlcnR5IGFuZCBJbmVxdWFsaXR5IHdpdGggQ29tcGxleCBTdXJ2ZXkgRGF0YS4gMjAyMS4gICAgDQogICAgDQpMVU1MRVksICBULiBTdXJ2ZXk6IGFuYWx5c2lzIG9mIGNvbXBsZXggc3VydmV5IHNhbXBsZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDMuMzUtMS4gMjAxOS4gICAgDQogICAgDQpMVU1MRVksICBULiBBbmFseXNpcyBvZiBjb21wbGV4IHN1cnZleSBzYW1wbGVzLiBKb3VybmFsIG9mIFN0YXRpc3RpY2FsIFNvZnR3YXJlLCA5KDEpOiAxLTE5LiAyMDA0LiAgICAgDQogICAgDQpQRVNTT0EsICBEamFsbWE7IERBTUlDTywgQW50aG9ueTsgSkFDT0IsIEd1aWxoZXJtZS4gY29udmV5OiBJbmNvbWUgQ29uY2VudHJhdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXggU3VydmV5IFNhbXBsZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDAuMi4zLiAyMDIxLiAgICANCg0KDQpgYGB7cn0NCmVuZC50aW1lIDwtIFN5cy50aW1lKCkNCnRpbWUudGFrZW4gPC0gZW5kLnRpbWUgLSBzdGFydC50aW1lDQp0aW1lLnRha2VuDQpgYGANCiAgIA==