Efetivo de PTTC por posto e graduação

dados1 %>% group_by(posto_grad) %>% summarise(Efetivo = sum(efetivo))

Efetivo de PTTC por Orgão em ordem decrescente de efetivo

dados1 %>% group_by(orgao) %>% summarise(Efetivo = sum(efetivo)) %>% arrange(desc(Efetivo))

Distribuição do Efetivo de PTTC por posto/graduação e Órgão enquadrante

dados1 <- dados1 %>% arrange(orgao) 
dados1
ggplot(aes(y = efetivo, x = orgao, fill=posto_grad), data = dados1) + 
  geom_col()+
  labs(title="Prestadores de Tarefa por Tempo Certo- Exército Brasileiro", subtitle="Distribuição do Efetivo de PTTC por posto/graduação e Órgão enquadrante", caption="Fonte: Almanaque do DGP")+  theme_pubclean() +  xlab("Órgão") + ylab("Efetivo")

Top 10 em contratação de PTTC por OM e posto onde presta a tarefa

dados_top <- dados2 %>% group_by(om_tarefa,posto_grad) %>% summarise(total = n()) %>% arrange(desc(total))  
dados_top <- dados_top[1:10,]  
dados_top <- arrange(dados_top,om_tarefa)
dados_top
ggplot(aes(y = total, x = om_tarefa, fill=posto_grad), data = dados_top) + 
  geom_col()+ labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro", subtitle="Top 10 em contratação de PTTC por OM e posto onde presta a tarefa", caption="Fonte: Almanaque do DGP")+  theme_pubclean() +  xlab("OM da Tarefa") + ylab("Efetivo") 

Efetivo de PTTC por OM onde presta a tarefa

dados2 %>% group_by(om_tarefa) %>% summarise(total = n()) %>% arrange(desc(total)) 

Sumário estatístico do tempo de permanência como PTTC (até a data do encerramento do contrato vigente) por OM onde presta a tarefa

Total (efetivo total da OM)
Estatísticas:  mínimo, máximo, média, mediana e desvio padrão
#dados2 %>% group_by(om_tarefa) %>% summarise(media = mean(tempo_anos)) %>% arrange(desc(media))
total <- dados2 %>% group_by(om_tarefa) %>% summarise(total = n())  
media <- dados2 %>% group_by(om_tarefa) %>% summarise(media = mean(tempo_anos)) 
dp <- dados2 %>% group_by(om_tarefa) %>% summarise(desv.pad = sd(tempo_anos)) 
min <- dados2 %>% group_by(om_tarefa) %>% summarise(minimo = min(tempo_anos)) 
max <- dados2 %>% group_by(om_tarefa) %>% summarise(maximo = max(tempo_anos)) 
mediana <- dados2 %>% group_by(om_tarefa) %>% summarise(mediana = median(tempo_anos))  
sumario <- data.frame(total,round(min[,2],1),round(max[,2],1),round(media[,2],1),round(mediana[,2],1),round(dp[,2],1))
sumario %>% arrange(desc(total))

Sumário estatístico do tempo de permanência como PTTC (até a data do encerramento do contrato vigente) por posto/graduação

Total (efetivo total da OM)
Estatísticas:  mínimo, máximo, média, mediana e desvio padrão
obs: na base de dados existe militar com igual data de entrada e saída, por isso há um Cel com tempo mínimo de contrato igual a zero.
#dados2 %>% group_by(om_tarefa) %>% summarise(media = mean(tempo_anos)) %>% arrange(desc(media))
total <- dados2 %>% group_by(posto_grad) %>% summarise(total = n())  
media <- dados2 %>% group_by(posto_grad) %>% summarise(media = mean(tempo_anos)) 
dp <- dados2 %>% group_by(posto_grad) %>% summarise(desv.pad = sd(tempo_anos)) 
min <- dados2 %>% group_by(posto_grad) %>% summarise(minimo = min(tempo_anos)) 
max <- dados2 %>% group_by(posto_grad) %>% summarise(maximo = max(tempo_anos)) 
mediana <- dados2 %>% group_by(posto_grad) %>% summarise(mediana = median(tempo_anos))  
sumario <- data.frame(total,round(min[,2],1),round(max[,2],1),round(media[,2],1),round(mediana[,2],1),round(dp[,2],1))
sumario %>% arrange(desc(total))

Sumário estatístico da idade do PTTC por OM onde presta a tarefa

Total (efetivo total da OM)
Estatísticas:  mínimo, máximo, média, mediana e desvio padrão
total <- dados2 %>% group_by(om_tarefa) %>% summarise(total = n())  
media <- dados2 %>% group_by(om_tarefa) %>% summarise(media = mean(idade)) 
dp <- dados2 %>% group_by(om_tarefa) %>% summarise(desv.pad = sd(idade)) 
min <- dados2 %>% group_by(om_tarefa) %>% summarise(minimo = min(idade)) 
max <- dados2 %>% group_by(om_tarefa) %>% summarise(maximo = max(idade)) 
mediana <- dados2 %>% group_by(om_tarefa) %>% summarise(mediana = median(idade))  
sumario <- data.frame(total,round(min[,2],1),round(max[,2],1),round(media[,2],1),round(mediana[,2],1),round(dp[,2],1))
sumario %>% arrange(desc(total))

Sumário estatístico da idade do PTTC por posto/graduação

Total (efetivo total da OM)
Estatísticas:  mínimo, máximo, média, mediana e desvio padrão
total <- dados2 %>% group_by(posto_grad) %>% summarise(total = n())  
media <- dados2 %>% group_by(posto_grad) %>% summarise(media = mean(idade)) 
dp <- dados2 %>% group_by(posto_grad) %>% summarise(desv.pad = sd(idade)) 
min <- dados2 %>% group_by(posto_grad) %>% summarise(minimo = min(idade)) 
max <- dados2 %>% group_by(posto_grad) %>% summarise(maximo = max(idade)) 
mediana <- dados2 %>% group_by(posto_grad) %>% summarise(mediana = median(idade))  
sumario <- data.frame(total,round(min[,2],1),round(max[,2],1),round(media[,2],1),round(mediana[,2],1),round(dp[,2],1))
sumario %>% arrange(desc(total))

Top 10 idade do PTTC por posto e OM onde presta a tarefa (mais idosos)

dados_top <- dados2 %>% group_by(posto_grad,om_tarefa) %>% summarise(maximo = max(idade)) %>%arrange(desc(maximo))
dados_top <- dados_top[1:10,]  
dados_top
ggplot(aes(y = maximo, x = om_tarefa, fill=posto_grad), data = dados_top) + 
  geom_col()+ labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro", subtitle="Top 10 idade do PTTC por posto e OM onde presta a tarefa (mais idosos)", caption="Fonte: Almanaque do DGP")+  theme_pubclean() +  xlab("OM da Tarefa") + ylab("Idade") 

Top 10 idade do PTTC por posto e OM onde presta a tarefa (mais jovens)

dados_top <- dados2 %>% group_by(posto_grad,om_tarefa) %>% summarise(minimo = min(idade)) %>%arrange((minimo))
dados_top <- dados_top[1:10,]  
dados_top
ggplot(aes(y = minimo, x = om_tarefa, fill=posto_grad), data = dados_top) + 
  geom_col()+ labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro", subtitle="Top 10 idade do PTTC por posto e OM onde presta a tarefa (mais jovens)", caption="Fonte: Almanaque do DGP")+  theme_pubclean() +  xlab("OM da Tarefa") + ylab("Idade") 

Distribuição da idade e tempo como prestador de tarefa na AMAN (idade decrescente)

dados2  %>% filter(om_tarefa=="AMAN")  %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(idade))

Distribuição da idade e tempo como prestador de tarefa na AMAN (tempo em anos decrescente)

dados2  %>% filter(om_tarefa=="AMAN")  %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))

Distribuição da idade e posto/graduação como prestador de tarefa na AMAN

data_graf <-dados2  %>% filter(om_tarefa=="AMAN")  %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))
ggplot(data_graf, x=idade, y=posto_grad) +  geom_dotplot(aes(fill = posto_grad,x=idade),binaxis='x',stackdir='center')+   theme(axis.text.y = element_blank()) + scale_y_continuous(breaks=seq(40,90,2)) +  scale_x_continuous(breaks=seq(40,90,2))+
  labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro - AMAN", subtitle="Distribuição por idade e posto/graduação como prestador de tarefa na AMAN", caption="Fonte: Almanaque do DGP")+  theme_pubclean() +  xlab("Idade") + ylab("") 

NA
NA
NA
NA

Distribuição do tempo de tarefa e posto como prestador de tarefa na AMAN

data_graf <-dados2  %>% filter(om_tarefa=="AMAN")  %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))
ggplot(data_graf, x=tempo_anos, y=posto_grad) +  geom_dotplot(aes(fill = posto_grad,x=tempo_anos),binaxis='x',stackdir='center')+
  theme(axis.text.y = element_blank()) + scale_y_continuous(breaks=seq(10,40,2)) + scale_x_continuous(breaks=seq(0,40,2))+
  labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro - AMAN", subtitle="Distribuição do tempo de tarefa e posto como prestador de tarefa na AMAN", caption="Fonte: Almanaque do DGP") + theme_pubclean() +  xlab("Tempo de Tarefa") + ylab("") 

Relação entre idade e tempo de tarefa na AMAN

data_graf <-dados2  %>% filter(om_tarefa=="AMAN")  %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))
b <- ggplot(data_graf, aes(x = idade, y = tempo_anos))
b+geom_point()+geom_smooth(method = "loess")+
  labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro - AMAN", subtitle="Relação entre idade e tempo de tarefa na AMAN", caption="Fonte: Almanaque do DGP") + theme_pubclean() +  xlab("Idade") + ylab("Tempo de tarefa")

Relação entre idade e tempo de tarefa dos oficiais na AMAN

data_graf <-dados2  %>% filter(om_tarefa=="AMAN") %>% filter(posto_grad=="Coronel" | posto_grad=="Tenente-Coronel" | posto_grad=="Capitão"| posto_grad=="Primeiro - Tenente"| posto_grad=="Segundo - Tenente") %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))
c <- ggplot(data_graf, aes(x = idade, y = tempo_anos))
# gera roda de cor  
# wheel("3",num=6) 
c+geom_point(aes(color = posto_grad, shape = posto_grad), size=4)+
  scale_shape_manual(values = c(15:22)) +
  scale_color_manual(values = c("#FC4E07" ,"#E7B800" ,"#0000CD" ,"#CD00CD", "#CD0000" ,"#CDCD00"))+
   labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro - AMAN", subtitle="Relação entre idade e tempo de tarefa dos oficiais na AMAN", caption="Fonte: Almanaque do DGP") + theme_pubclean() +  xlab("Idade") + ylab("Tempo de tarefa")

Relação entre idade e tempo de tarefa dos graduados na AMAN

data_graf <-dados2  %>% filter(om_tarefa=="AMAN") %>% filter(posto_grad=="Terceiro - Sargento" | posto_grad=="Segundo - Sargento" | posto_grad=="Primeiro - Sargento" | posto_grad=="Subtenente") %>% select(posto_grad,idade,tempo_anos)  %>% arrange(desc(tempo_anos))
c <- ggplot(data_graf, aes(x = idade, y = tempo_anos))
# gera roda de cor  
# wheel("blue",num=8) 
c+geom_point(aes(color = posto_grad, shape = posto_grad), size=4)+
  scale_shape_manual(values = c(15, 16, 17)) +
  scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))+
   labs(title="Prestadores de Tarefa por Tempo Certo - Exército Brasileiro - AMAN", subtitle="Relação entre idade e tempo de tarefa dos graduados na AMAN", caption="Fonte: Almanaque do DGP") + theme_pubclean() +  xlab("Idade") + ylab("Tempo de tarefa")

NA
NA
LS0tDQp0aXRsZTogIlZhbW9zIGNvbnRhciBvcyBQVFRDIHF1ZSB0cmFiYWxoYW0gbm8gRXjDqXJjaXRvIEJyYXNpbGVpcm8gZW0gMjAxOD8iDQphdXRob3I6ICJSb2JlcnRvIENhbXBvcyBMZW9uaSINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGdncHVicikNCmxpYnJhcnkoY29sb3J0b29scykNCnRoZW1lX3NldCh0aGVtZV9wdWJyKCkpDQoNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBMZXIgb3MgZGFkb3MNCmRhZG9zMSA8LSByZWFkX2V4Y2VsKCJwdHRjLnhsc3giLCBzaGVldCA9ICJwMSIpDQpkYWRvczIgPC0gcmVhZF9leGNlbCgicHR0Yy54bHN4Iiwgc2hlZXQgPSAicDIiKQ0KYGBgDQojIEVmZXRpdm8gZGUgUFRUQyBwb3IgcG9zdG8gZSBncmFkdWHDp8Ojbw0KDQpgYGB7cn0NCmRhZG9zMSAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZShFZmV0aXZvID0gc3VtKGVmZXRpdm8pKQ0KYGBgDQoNCg0KIyBFZmV0aXZvIGRlIFBUVEMgcG9yIE9yZ8OjbyBlbSBvcmRlbSBkZWNyZXNjZW50ZSBkZSBlZmV0aXZvIA0KYGBge3J9DQpkYWRvczEgJT4lIGdyb3VwX2J5KG9yZ2FvKSAlPiUgc3VtbWFyaXNlKEVmZXRpdm8gPSBzdW0oZWZldGl2bykpICU+JSBhcnJhbmdlKGRlc2MoRWZldGl2bykpDQpgYGANCg0KDQojIERpc3RyaWJ1acOnw6NvIGRvIEVmZXRpdm8gZGUgUFRUQyBwb3IgcG9zdG8vZ3JhZHVhw6fDo28gZSDDk3Jnw6NvIGVucXVhZHJhbnRlDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMH0NCmRhZG9zMSA8LSBkYWRvczEgJT4lIGFycmFuZ2Uob3JnYW8pIA0KZGFkb3MxDQpnZ3Bsb3QoYWVzKHkgPSBlZmV0aXZvLCB4ID0gb3JnYW8sIGZpbGw9cG9zdG9fZ3JhZCksIGRhdGEgPSBkYWRvczEpICsgDQogIGdlb21fY29sKCkrDQogIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8tIEV4w6lyY2l0byBCcmFzaWxlaXJvIiwgc3VidGl0bGU9IkRpc3RyaWJ1acOnw6NvIGRvIEVmZXRpdm8gZGUgUFRUQyBwb3IgcG9zdG8vZ3JhZHVhw6fDo28gZSDDk3Jnw6NvIGVucXVhZHJhbnRlIiwgY2FwdGlvbj0iRm9udGU6IEFsbWFuYXF1ZSBkbyBER1AiKSsgIHRoZW1lX3B1YmNsZWFuKCkgKyAgeGxhYigiw5NyZ8OjbyIpICsgeWxhYigiRWZldGl2byIpDQoNCmBgYA0KDQoNCiMgVG9wIDEwIGVtIGNvbnRyYXRhw6fDo28gZGUgUFRUQyBwb3IgT00gZSBwb3N0byBvbmRlIHByZXN0YSBhIHRhcmVmYQ0KDQpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD0xMH0NCmRhZG9zX3RvcCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSxwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKHRvdGFsID0gbigpKSAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkgIA0KDQpkYWRvc190b3AgPC0gZGFkb3NfdG9wWzE6MTAsXSAgDQpkYWRvc190b3AgPC0gYXJyYW5nZShkYWRvc190b3Asb21fdGFyZWZhKQ0KZGFkb3NfdG9wDQoNCg0KZ2dwbG90KGFlcyh5ID0gdG90YWwsIHggPSBvbV90YXJlZmEsIGZpbGw9cG9zdG9fZ3JhZCksIGRhdGEgPSBkYWRvc190b3ApICsgDQogIGdlb21fY29sKCkrIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8gLSBFeMOpcmNpdG8gQnJhc2lsZWlybyIsIHN1YnRpdGxlPSJUb3AgMTAgZW0gY29udHJhdGHDp8OjbyBkZSBQVFRDIHBvciBPTSBlIHBvc3RvIG9uZGUgcHJlc3RhIGEgdGFyZWZhIiwgY2FwdGlvbj0iRm9udGU6IEFsbWFuYXF1ZSBkbyBER1AiKSsgIHRoZW1lX3B1YmNsZWFuKCkgKyAgeGxhYigiT00gZGEgVGFyZWZhIikgKyB5bGFiKCJFZmV0aXZvIikgDQoNCmBgYA0KDQoNCg0KIyBFZmV0aXZvIGRlIFBUVEMgcG9yIE9NIG9uZGUgcHJlc3RhIGEgdGFyZWZhDQpgYGB7cn0NCmRhZG9zMiAlPiUgZ3JvdXBfYnkob21fdGFyZWZhKSAlPiUgc3VtbWFyaXNlKHRvdGFsID0gbigpKSAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkgDQpgYGANCg0KDQojIFN1bcOhcmlvIGVzdGF0w61zdGljbyBkbyB0ZW1wbyBkZSBwZXJtYW7Dqm5jaWEgY29tbyBQVFRDIChhdMOpIGEgZGF0YSBkbyBlbmNlcnJhbWVudG8gZG8gY29udHJhdG8gdmlnZW50ZSkgcG9yIE9NIG9uZGUgcHJlc3RhIGEgdGFyZWZhDQoNCiAgICBUb3RhbCAoZWZldGl2byB0b3RhbCBkYSBPTSkNCiAgICBFc3RhdMOtc3RpY2FzOiAgbcOtbmltbywgbcOheGltbywgbcOpZGlhLCBtZWRpYW5hIGUgZGVzdmlvIHBhZHLDo28NCg0KYGBge3J9DQojZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWVkaWEgPSBtZWFuKHRlbXBvX2Fub3MpKSAlPiUgYXJyYW5nZShkZXNjKG1lZGlhKSkNCnRvdGFsIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkob21fdGFyZWZhKSAlPiUgc3VtbWFyaXNlKHRvdGFsID0gbigpKSAgDQptZWRpYSA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSkgJT4lIHN1bW1hcmlzZShtZWRpYSA9IG1lYW4odGVtcG9fYW5vcykpIA0KZHAgPC0gZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UoZGVzdi5wYWQgPSBzZCh0ZW1wb19hbm9zKSkgDQptaW4gPC0gZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWluaW1vID0gbWluKHRlbXBvX2Fub3MpKSANCm1heCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSkgJT4lIHN1bW1hcmlzZShtYXhpbW8gPSBtYXgodGVtcG9fYW5vcykpIA0KbWVkaWFuYSA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSkgJT4lIHN1bW1hcmlzZShtZWRpYW5hID0gbWVkaWFuKHRlbXBvX2Fub3MpKSAgDQoNCnN1bWFyaW8gPC0gZGF0YS5mcmFtZSh0b3RhbCxyb3VuZChtaW5bLDJdLDEpLHJvdW5kKG1heFssMl0sMSkscm91bmQobWVkaWFbLDJdLDEpLHJvdW5kKG1lZGlhbmFbLDJdLDEpLHJvdW5kKGRwWywyXSwxKSkNCg0Kc3VtYXJpbyAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkNCg0KDQpgYGANCg0KIyBTdW3DoXJpbyBlc3RhdMOtc3RpY28gZG8gdGVtcG8gZGUgcGVybWFuw6puY2lhIGNvbW8gUFRUQyAoYXTDqSBhIGRhdGEgZG8gZW5jZXJyYW1lbnRvIGRvIGNvbnRyYXRvIHZpZ2VudGUpIHBvciBwb3N0by9ncmFkdWHDp8Ojbw0KDQogICAgVG90YWwgKGVmZXRpdm8gdG90YWwgZGEgT00pDQogICAgRXN0YXTDrXN0aWNhczogIG3DrW5pbW8sIG3DoXhpbW8sIG3DqWRpYSwgbWVkaWFuYSBlIGRlc3ZpbyBwYWRyw6NvDQogICAgb2JzOiBuYSBiYXNlIGRlIGRhZG9zIGV4aXN0ZSBtaWxpdGFyIGNvbSBpZ3VhbCBkYXRhIGRlIGVudHJhZGEgZSBzYcOtZGEsIHBvciBpc3NvIGjDoSB1bSBDZWwgY29tIHRlbXBvIG3DrW5pbW8gZGUgY29udHJhdG8gaWd1YWwgYSB6ZXJvLg0KYGBge3J9DQojZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWVkaWEgPSBtZWFuKHRlbXBvX2Fub3MpKSAlPiUgYXJyYW5nZShkZXNjKG1lZGlhKSkNCnRvdGFsIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgIA0KbWVkaWEgPC0gZGFkb3MyICU+JSBncm91cF9ieShwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKG1lZGlhID0gbWVhbih0ZW1wb19hbm9zKSkgDQpkcCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KHBvc3RvX2dyYWQpICU+JSBzdW1tYXJpc2UoZGVzdi5wYWQgPSBzZCh0ZW1wb19hbm9zKSkgDQptaW4gPC0gZGFkb3MyICU+JSBncm91cF9ieShwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKG1pbmltbyA9IG1pbih0ZW1wb19hbm9zKSkgDQptYXggPC0gZGFkb3MyICU+JSBncm91cF9ieShwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKG1heGltbyA9IG1heCh0ZW1wb19hbm9zKSkgDQptZWRpYW5hIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZShtZWRpYW5hID0gbWVkaWFuKHRlbXBvX2Fub3MpKSAgDQoNCnN1bWFyaW8gPC0gZGF0YS5mcmFtZSh0b3RhbCxyb3VuZChtaW5bLDJdLDEpLHJvdW5kKG1heFssMl0sMSkscm91bmQobWVkaWFbLDJdLDEpLHJvdW5kKG1lZGlhbmFbLDJdLDEpLHJvdW5kKGRwWywyXSwxKSkNCg0Kc3VtYXJpbyAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkNCmBgYA0KDQoNCiMgU3Vtw6FyaW8gZXN0YXTDrXN0aWNvIGRhIGlkYWRlIGRvIFBUVEMgcG9yIE9NIG9uZGUgcHJlc3RhIGEgdGFyZWZhDQogICAgDQogICAgVG90YWwgKGVmZXRpdm8gdG90YWwgZGEgT00pDQogICAgRXN0YXTDrXN0aWNhczogIG3DrW5pbW8sIG3DoXhpbW8sIG3DqWRpYSwgbWVkaWFuYSBlIGRlc3ZpbyBwYWRyw6NvDQoNCmBgYHtyfQ0KDQp0b3RhbCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSkgJT4lIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgIA0KbWVkaWEgPC0gZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWVkaWEgPSBtZWFuKGlkYWRlKSkgDQpkcCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KG9tX3RhcmVmYSkgJT4lIHN1bW1hcmlzZShkZXN2LnBhZCA9IHNkKGlkYWRlKSkgDQptaW4gPC0gZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWluaW1vID0gbWluKGlkYWRlKSkgDQptYXggPC0gZGFkb3MyICU+JSBncm91cF9ieShvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWF4aW1vID0gbWF4KGlkYWRlKSkgDQptZWRpYW5hIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkob21fdGFyZWZhKSAlPiUgc3VtbWFyaXNlKG1lZGlhbmEgPSBtZWRpYW4oaWRhZGUpKSAgDQoNCnN1bWFyaW8gPC0gZGF0YS5mcmFtZSh0b3RhbCxyb3VuZChtaW5bLDJdLDEpLHJvdW5kKG1heFssMl0sMSkscm91bmQobWVkaWFbLDJdLDEpLHJvdW5kKG1lZGlhbmFbLDJdLDEpLHJvdW5kKGRwWywyXSwxKSkNCg0Kc3VtYXJpbyAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkNCg0KDQpgYGANCg0KIyBTdW3DoXJpbyBlc3RhdMOtc3RpY28gZGEgaWRhZGUgZG8gUFRUQyBwb3IgcG9zdG8vZ3JhZHVhw6fDo28gDQogICAgDQogICAgVG90YWwgKGVmZXRpdm8gdG90YWwgZGEgT00pDQogICAgRXN0YXTDrXN0aWNhczogIG3DrW5pbW8sIG3DoXhpbW8sIG3DqWRpYSwgbWVkaWFuYSBlIGRlc3ZpbyBwYWRyw6NvDQoNCmBgYHtyfQ0KDQp0b3RhbCA8LSBkYWRvczIgJT4lIGdyb3VwX2J5KHBvc3RvX2dyYWQpICU+JSBzdW1tYXJpc2UodG90YWwgPSBuKCkpICANCm1lZGlhIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZShtZWRpYSA9IG1lYW4oaWRhZGUpKSANCmRwIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZShkZXN2LnBhZCA9IHNkKGlkYWRlKSkgDQptaW4gPC0gZGFkb3MyICU+JSBncm91cF9ieShwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKG1pbmltbyA9IG1pbihpZGFkZSkpIA0KbWF4IDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCkgJT4lIHN1bW1hcmlzZShtYXhpbW8gPSBtYXgoaWRhZGUpKSANCm1lZGlhbmEgPC0gZGFkb3MyICU+JSBncm91cF9ieShwb3N0b19ncmFkKSAlPiUgc3VtbWFyaXNlKG1lZGlhbmEgPSBtZWRpYW4oaWRhZGUpKSAgDQoNCnN1bWFyaW8gPC0gZGF0YS5mcmFtZSh0b3RhbCxyb3VuZChtaW5bLDJdLDEpLHJvdW5kKG1heFssMl0sMSkscm91bmQobWVkaWFbLDJdLDEpLHJvdW5kKG1lZGlhbmFbLDJdLDEpLHJvdW5kKGRwWywyXSwxKSkNCg0Kc3VtYXJpbyAlPiUgYXJyYW5nZShkZXNjKHRvdGFsKSkNCg0KDQpgYGANCg0KDQoNCg0KIyBUb3AgMTAgaWRhZGUgZG8gUFRUQyBwb3IgcG9zdG8gZSBPTSBvbmRlIHByZXN0YSBhIHRhcmVmYSAobWFpcyBpZG9zb3MpDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwfQ0KZGFkb3NfdG9wIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCxvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWF4aW1vID0gbWF4KGlkYWRlKSkgJT4lYXJyYW5nZShkZXNjKG1heGltbykpDQpkYWRvc190b3AgPC0gZGFkb3NfdG9wWzE6MTAsXSAgDQoNCmRhZG9zX3RvcA0KZ2dwbG90KGFlcyh5ID0gbWF4aW1vLCB4ID0gb21fdGFyZWZhLCBmaWxsPXBvc3RvX2dyYWQpLCBkYXRhID0gZGFkb3NfdG9wKSArIA0KICBnZW9tX2NvbCgpKyBsYWJzKHRpdGxlPSJQcmVzdGFkb3JlcyBkZSBUYXJlZmEgcG9yIFRlbXBvIENlcnRvIC0gRXjDqXJjaXRvIEJyYXNpbGVpcm8iLCBzdWJ0aXRsZT0iVG9wIDEwIGlkYWRlIGRvIFBUVEMgcG9yIHBvc3RvIGUgT00gb25kZSBwcmVzdGEgYSB0YXJlZmEgKG1haXMgaWRvc29zKSIsIGNhcHRpb249IkZvbnRlOiBBbG1hbmFxdWUgZG8gREdQIikrICB0aGVtZV9wdWJjbGVhbigpICsgIHhsYWIoIk9NIGRhIFRhcmVmYSIpICsgeWxhYigiSWRhZGUiKSANCg0KYGBgDQoNCg0KIyBUb3AgMTAgaWRhZGUgZG8gUFRUQyBwb3IgcG9zdG8gZSBPTSBvbmRlIHByZXN0YSBhIHRhcmVmYSAobWFpcyBqb3ZlbnMpDQoNCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEwfQ0KZGFkb3NfdG9wIDwtIGRhZG9zMiAlPiUgZ3JvdXBfYnkocG9zdG9fZ3JhZCxvbV90YXJlZmEpICU+JSBzdW1tYXJpc2UobWluaW1vID0gbWluKGlkYWRlKSkgJT4lYXJyYW5nZSgobWluaW1vKSkNCmRhZG9zX3RvcCA8LSBkYWRvc190b3BbMToxMCxdICANCmRhZG9zX3RvcA0KDQpnZ3Bsb3QoYWVzKHkgPSBtaW5pbW8sIHggPSBvbV90YXJlZmEsIGZpbGw9cG9zdG9fZ3JhZCksIGRhdGEgPSBkYWRvc190b3ApICsgDQogIGdlb21fY29sKCkrIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8gLSBFeMOpcmNpdG8gQnJhc2lsZWlybyIsIHN1YnRpdGxlPSJUb3AgMTAgaWRhZGUgZG8gUFRUQyBwb3IgcG9zdG8gZSBPTSBvbmRlIHByZXN0YSBhIHRhcmVmYSAobWFpcyBqb3ZlbnMpIiwgY2FwdGlvbj0iRm9udGU6IEFsbWFuYXF1ZSBkbyBER1AiKSsgIHRoZW1lX3B1YmNsZWFuKCkgKyAgeGxhYigiT00gZGEgVGFyZWZhIikgKyB5bGFiKCJJZGFkZSIpIA0KDQpgYGANCg0KDQojIERpc3RyaWJ1acOnw6NvIGRhIGlkYWRlIGUgdGVtcG8gY29tbyBwcmVzdGFkb3IgZGUgdGFyZWZhIG5hIEFNQU4gKGlkYWRlIGRlY3Jlc2NlbnRlKQ0KICAgICAgICANCmBgYHtyfQ0KZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKGlkYWRlKSkNCg0KYGBgDQoNCiMgRGlzdHJpYnVpw6fDo28gZGEgaWRhZGUgZSB0ZW1wbyBjb21vIHByZXN0YWRvciBkZSB0YXJlZmEgbmEgQU1BTiAodGVtcG8gZW0gYW5vcyBkZWNyZXNjZW50ZSkNCiAgICANCiAgICANCmBgYHtyfQ0KZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKHRlbXBvX2Fub3MpKQ0KDQpgYGANCg0KDQojRGlzdHJpYnVpw6fDo28gZGEgaWRhZGUgZSBwb3N0by9ncmFkdWHDp8OjbyBjb21vIHByZXN0YWRvciBkZSB0YXJlZmEgbmEgQU1BTiANCmBgYHtyfQ0KZGF0YV9ncmFmIDwtZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKHRlbXBvX2Fub3MpKQ0KDQpnZ3Bsb3QoZGF0YV9ncmFmLCB4PWlkYWRlLCB5PXBvc3RvX2dyYWQpICsgIGdlb21fZG90cGxvdChhZXMoZmlsbCA9IHBvc3RvX2dyYWQseD1pZGFkZSksYmluYXhpcz0neCcsc3RhY2tkaXI9J2NlbnRlcicpKyAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDQwLDkwLDIpKSArICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSg0MCw5MCwyKSkrDQogIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8gLSBFeMOpcmNpdG8gQnJhc2lsZWlybyAtIEFNQU4iLCBzdWJ0aXRsZT0iRGlzdHJpYnVpw6fDo28gcG9yIGlkYWRlIGUgcG9zdG8vZ3JhZHVhw6fDo28gY29tbyBwcmVzdGFkb3IgZGUgdGFyZWZhIG5hIEFNQU4iLCBjYXB0aW9uPSJGb250ZTogQWxtYW5hcXVlIGRvIERHUCIpKyAgdGhlbWVfcHViY2xlYW4oKSArICB4bGFiKCJJZGFkZSIpICsgeWxhYigiIikgDQogIA0KICANCiAgDQogIA0KYGBgDQoNCg0KDQoNCiNEaXN0cmlidWnDp8OjbyBkbyB0ZW1wbyBkZSB0YXJlZmEgZSBwb3N0byBjb21vIHByZXN0YWRvciBkZSB0YXJlZmEgbmEgQU1BTiANCmBgYHtyfQ0KZGF0YV9ncmFmIDwtZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKHRlbXBvX2Fub3MpKQ0KDQpnZ3Bsb3QoZGF0YV9ncmFmLCB4PXRlbXBvX2Fub3MsIHk9cG9zdG9fZ3JhZCkgKyAgZ2VvbV9kb3RwbG90KGFlcyhmaWxsID0gcG9zdG9fZ3JhZCx4PXRlbXBvX2Fub3MpLGJpbmF4aXM9J3gnLHN0YWNrZGlyPSdjZW50ZXInKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMTAsNDAsMikpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw0MCwyKSkrDQogIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8gLSBFeMOpcmNpdG8gQnJhc2lsZWlybyAtIEFNQU4iLCBzdWJ0aXRsZT0iRGlzdHJpYnVpw6fDo28gZG8gdGVtcG8gZGUgdGFyZWZhIGUgcG9zdG8gY29tbyBwcmVzdGFkb3IgZGUgdGFyZWZhIG5hIEFNQU4iLCBjYXB0aW9uPSJGb250ZTogQWxtYW5hcXVlIGRvIERHUCIpICsgdGhlbWVfcHViY2xlYW4oKSArICB4bGFiKCJUZW1wbyBkZSBUYXJlZmEiKSArIHlsYWIoIiIpIA0KDQpgYGANCg0KDQoNCg0KIyBSZWxhw6fDo28gZW50cmUgaWRhZGUgZSB0ZW1wbyBkZSB0YXJlZmEgbmEgQU1BTg0KYGBge3IgfQ0KZGF0YV9ncmFmIDwtZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKHRlbXBvX2Fub3MpKQ0KYiA8LSBnZ3Bsb3QoZGF0YV9ncmFmLCBhZXMoeCA9IGlkYWRlLCB5ID0gdGVtcG9fYW5vcykpDQpiK2dlb21fcG9pbnQoKStnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiKSsNCiAgbGFicyh0aXRsZT0iUHJlc3RhZG9yZXMgZGUgVGFyZWZhIHBvciBUZW1wbyBDZXJ0byAtIEV4w6lyY2l0byBCcmFzaWxlaXJvIC0gQU1BTiIsIHN1YnRpdGxlPSJSZWxhw6fDo28gZW50cmUgaWRhZGUgZSB0ZW1wbyBkZSB0YXJlZmEgbmEgQU1BTiIsIGNhcHRpb249IkZvbnRlOiBBbG1hbmFxdWUgZG8gREdQIikgKyB0aGVtZV9wdWJjbGVhbigpICsgIHhsYWIoIklkYWRlIikgKyB5bGFiKCJUZW1wbyBkZSB0YXJlZmEiKQ0KYGBgDQoNCiMgUmVsYcOnw6NvIGVudHJlIGlkYWRlIGUgdGVtcG8gZGUgdGFyZWZhIGRvcyBvZmljaWFpcyBuYSBBTUFOIA0KYGBge3IgfQ0KZGF0YV9ncmFmIDwtZGFkb3MyICAlPiUgZmlsdGVyKG9tX3RhcmVmYT09IkFNQU4iKSAlPiUgZmlsdGVyKHBvc3RvX2dyYWQ9PSJDb3JvbmVsIiB8IHBvc3RvX2dyYWQ9PSJUZW5lbnRlLUNvcm9uZWwiIHwgcG9zdG9fZ3JhZD09IkNhcGl0w6NvInwgcG9zdG9fZ3JhZD09IlByaW1laXJvIC0gVGVuZW50ZSJ8IHBvc3RvX2dyYWQ9PSJTZWd1bmRvIC0gVGVuZW50ZSIpICU+JSBzZWxlY3QocG9zdG9fZ3JhZCxpZGFkZSx0ZW1wb19hbm9zKSAgJT4lIGFycmFuZ2UoZGVzYyh0ZW1wb19hbm9zKSkNCmMgPC0gZ2dwbG90KGRhdGFfZ3JhZiwgYWVzKHggPSBpZGFkZSwgeSA9IHRlbXBvX2Fub3MpKQ0KDQojIGdlcmEgcm9kYSBkZSBjb3IgIA0KIyB3aGVlbCgiMyIsbnVtPTYpIA0KDQpjK2dlb21fcG9pbnQoYWVzKGNvbG9yID0gcG9zdG9fZ3JhZCwgc2hhcGUgPSBwb3N0b19ncmFkKSwgc2l6ZT00KSsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTU6MjIpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjRkM0RTA3IiAsIiNFN0I4MDAiICwiIzAwMDBDRCIgLCIjQ0QwMENEIiwgIiNDRDAwMDAiICwiI0NEQ0QwMCIpKSsNCiAgIGxhYnModGl0bGU9IlByZXN0YWRvcmVzIGRlIFRhcmVmYSBwb3IgVGVtcG8gQ2VydG8gLSBFeMOpcmNpdG8gQnJhc2lsZWlybyAtIEFNQU4iLCBzdWJ0aXRsZT0iUmVsYcOnw6NvIGVudHJlIGlkYWRlIGUgdGVtcG8gZGUgdGFyZWZhIGRvcyBvZmljaWFpcyBuYSBBTUFOIiwgY2FwdGlvbj0iRm9udGU6IEFsbWFuYXF1ZSBkbyBER1AiKSArIHRoZW1lX3B1YmNsZWFuKCkgKyAgeGxhYigiSWRhZGUiKSArIHlsYWIoIlRlbXBvIGRlIHRhcmVmYSIpDQpgYGANCiMgUmVsYcOnw6NvIGVudHJlIGlkYWRlIGUgdGVtcG8gZGUgdGFyZWZhIGRvcyBncmFkdWFkb3MgbmEgQU1BTiANCmBgYHtyIH0NCmRhdGFfZ3JhZiA8LWRhZG9zMiAgJT4lIGZpbHRlcihvbV90YXJlZmE9PSJBTUFOIikgJT4lIGZpbHRlcihwb3N0b19ncmFkPT0iVGVyY2Vpcm8gLSBTYXJnZW50byIgfCBwb3N0b19ncmFkPT0iU2VndW5kbyAtIFNhcmdlbnRvIiB8IHBvc3RvX2dyYWQ9PSJQcmltZWlybyAtIFNhcmdlbnRvIiB8IHBvc3RvX2dyYWQ9PSJTdWJ0ZW5lbnRlIikgJT4lIHNlbGVjdChwb3N0b19ncmFkLGlkYWRlLHRlbXBvX2Fub3MpICAlPiUgYXJyYW5nZShkZXNjKHRlbXBvX2Fub3MpKQ0KYyA8LSBnZ3Bsb3QoZGF0YV9ncmFmLCBhZXMoeCA9IGlkYWRlLCB5ID0gdGVtcG9fYW5vcykpDQoNCiMgZ2VyYSByb2RhIGRlIGNvciAgDQojIHdoZWVsKCJibHVlIixudW09OCkgDQoNCmMrZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwb3N0b19ncmFkLCBzaGFwZSA9IHBvc3RvX2dyYWQpLCBzaXplPTQpKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwgMTYsIDE3KSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSkrDQogICBsYWJzKHRpdGxlPSJQcmVzdGFkb3JlcyBkZSBUYXJlZmEgcG9yIFRlbXBvIENlcnRvIC0gRXjDqXJjaXRvIEJyYXNpbGVpcm8gLSBBTUFOIiwgc3VidGl0bGU9IlJlbGHDp8OjbyBlbnRyZSBpZGFkZSBlIHRlbXBvIGRlIHRhcmVmYSBkb3MgZ3JhZHVhZG9zIG5hIEFNQU4iLCBjYXB0aW9uPSJGb250ZTogQWxtYW5hcXVlIGRvIERHUCIpICsgdGhlbWVfcHViY2xlYW4oKSArICB4bGFiKCJJZGFkZSIpICsgeWxhYigiVGVtcG8gZGUgdGFyZWZhIikNCiAgICANCiANCg0KDQpgYGANCg0KDQo=