1. Quais bactérias e quantas bactérias estão presentes na UTI do hospital independente da área e da situação de sujo e limpo?
#
# bac %>% select(micro) %>%
# group_by(micro) %>% count() %>%
# ungroup %>%
# mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
# arrange(desc(n)) %>% kable()
bac %>% select(naDNA,id,local,super,micro,momento,gram,diluicao,naDNA) %>% distinct_all() %>%
group_by(micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange((desc(n))) %>% datatable(
.,
rownames = FALSE,
filter = "top",
extensions = c('Buttons', 'Scroller'),
options = list(
dom = 'Blfrtip',
buttons = c('csv', 'excel'),
deferRender = T,
#scrollY = '600px',
scroller = TRUE))
# bacz <- bac %>% select(micro) %>%
# group_by(micro) %>% count() %>%
# ungroup %>%
# mutate(total = sum(n), prop = paste0(round(n/total*100,1),"%")) %>%
# arrange(desc(n))
bacz <- bac %>% select(naDNA,id,local,super,micro,momento,gram,diluicao,naDNA) %>% distinct_all() %>%
group_by(micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,1),"%")) %>%
arrange(desc(n))
ggplot(bacz) +
aes(x=reorder(micro,+n),y=n, fill=micro, label=paste0(n," (",round(n/total*100,2),"%)")) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = cor) +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.y = element_text(face = "italic"),
axis.text.x = element_text(angle = 0,
hjust = 0.5,
size=9,
colour = "black")) +
labs(caption = paste0("Total = ", bacz$total[1]) ) +
geom_text(vjust=0.5,hjust=-0.01, size=3) +
xlab("") + ylab("Frequência") + coord_flip() #+ facet_wrap(~gram*momento, nrow = 2)

2. Qual a frequência de bactérias Gram positivas e Gram negativas na UTI comparando a situação de sujo e limpo?
bac %>% select(momento,gram,id) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>% kable()
| Antes da limpeza |
Gram positiva |
37 |
119 |
31.09% |
| Antes da limpeza |
Gram negativa |
29 |
119 |
24.37% |
| Após a limpeza |
Gram positiva |
28 |
119 |
23.53% |
| Após a limpeza |
Gram negativa |
25 |
119 |
21.01% |
bac %>% select(momento,gram,id) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>%
ggplot() +
ggtitle("Gram positiva") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
labs(caption = paste0("Total = ", bacz$total[1]) ) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + facet_grid(~momento)

bac %>% filter(gram=="Gram positiva") %>%
select(momento,gram,id) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>% kable()
| Antes da limpeza |
Gram positiva |
37 |
65 |
56.92% |
| Após a limpeza |
Gram positiva |
28 |
65 |
43.08% |
bacz <- bac %>% filter(gram=="Gram positiva") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n))
ggplot(bacz) +
ggtitle("Gram positiva") +
scale_fill_manual(values = cor) +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
labs(caption = paste0("Total = ", bacz$total[1]) ) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

bac %>% filter(gram=="Gram positiva" & momento=="Antes da limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>% kable()
| Antes da limpeza |
Gram positiva |
Bastonete Gram positivo |
17 |
37 |
45.95% |
| Antes da limpeza |
Gram positiva |
Enterococcus faecalis |
9 |
37 |
24.32% |
| Antes da limpeza |
Gram positiva |
Staphylococcus aureus |
2 |
37 |
5.41% |
| Antes da limpeza |
Gram positiva |
Staphylococcus epidermidis |
2 |
37 |
5.41% |
| Antes da limpeza |
Gram positiva |
Staphylococcus haemolyticus |
2 |
37 |
5.41% |
| Antes da limpeza |
Gram positiva |
Enterococcus faecium |
1 |
37 |
2.7% |
| Antes da limpeza |
Gram positiva |
Kocuria rhizophila |
1 |
37 |
2.7% |
| Antes da limpeza |
Gram positiva |
Staphylococcus cohnii |
1 |
37 |
2.7% |
| Antes da limpeza |
Gram positiva |
Staphylococcus saprophyticus |
1 |
37 |
2.7% |
| Antes da limpeza |
Gram positiva |
Staphylococcus sciuri |
1 |
37 |
2.7% |
bac %>% filter(gram=="Gram positiva" & momento=="Após a limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>% kable()
| Após a limpeza |
Gram positiva |
Staphylococcus haemolyticus (MRSA + MBL) |
4 |
28 |
14.29% |
| Após a limpeza |
Gram positiva |
Staphylococcus hominis |
3 |
28 |
10.71% |
| Após a limpeza |
Gram positiva |
Staphylococcus hominis (MRSA + MBL) |
3 |
28 |
10.71% |
| Após a limpeza |
Gram positiva |
Staphylococcus lentus |
3 |
28 |
10.71% |
| Após a limpeza |
Gram positiva |
Bastonete Gram positivo |
2 |
28 |
7.14% |
| Após a limpeza |
Gram positiva |
Enterococcus faecium |
2 |
28 |
7.14% |
| Após a limpeza |
Gram positiva |
Staphylococcus hominis (MBL) |
2 |
28 |
7.14% |
| Após a limpeza |
Gram positiva |
Aerococcus viridans |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Alloiococcus otitis |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Corynebacterium jeikeium |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Enterococcus columbae |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Enterococcus faecalis |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Staphylococcus caprae |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Staphylococcus epidermidis |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Staphylococcus haemolyticus |
1 |
28 |
3.57% |
| Após a limpeza |
Gram positiva |
Staphylococcus warneri (MRSA + MBL) |
1 |
28 |
3.57% |
a <- bac %>% filter(gram=="Gram positiva" & momento=="Antes da limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>% mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>%
ggplot() +
#ggtitle("Gram positiva") +
labs(subtitle = "Antes da limpeza") +
scale_fill_manual(values = cor) +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))
a

b <- bac %>% filter(gram=="Gram positiva" & momento=="Após a limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>% mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>%
ggplot() +
# ggtitle("Gram positiva") +
labs(subtitle = "Após a limpeza") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))
b

bac %>% filter(gram=="Gram negativa") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>% kable()
| Antes da limpeza |
Gram negativa |
Serratia marcescens |
12 |
54 |
22.22% |
| Antes da limpeza |
Gram negativa |
Klebsiella pneumoniae |
5 |
54 |
9.26% |
| Após a limpeza |
Gram negativa |
Pantoea spp |
5 |
54 |
9.26% |
| Antes da limpeza |
Gram negativa |
Acinetobacter baumannii complex |
4 |
54 |
7.41% |
| Após a limpeza |
Gram negativa |
Acinetobacter baumannii |
4 |
54 |
7.41% |
| Após a limpeza |
Gram negativa |
Klebsiella pneumoniae (ESBL) |
4 |
54 |
7.41% |
| Após a limpeza |
Gram negativa |
Acinetobacter baumannii complex |
3 |
54 |
5.56% |
| Após a limpeza |
Gram negativa |
Klebsiella pneumoniae |
3 |
54 |
5.56% |
| Antes da limpeza |
Gram negativa |
Enterobacter cloacae complex |
2 |
54 |
3.7% |
| Antes da limpeza |
Gram negativa |
Klebsiella pneumoniae (ESBL) |
2 |
54 |
3.7% |
| Após a limpeza |
Gram negativa |
Acinetobacter baumannii complex (KPC) |
2 |
54 |
3.7% |
| Antes da limpeza |
Gram negativa |
Aeromonas salmonicida |
1 |
54 |
1.85% |
| Antes da limpeza |
Gram negativa |
Burkholderia mallei |
1 |
54 |
1.85% |
| Antes da limpeza |
Gram negativa |
Escherichia coli |
1 |
54 |
1.85% |
| Antes da limpeza |
Gram negativa |
Pseudomonas stutzeri |
1 |
54 |
1.85% |
| Após a limpeza |
Gram negativa |
Acinetobacter baumannii complex (ESBL) |
1 |
54 |
1.85% |
| Após a limpeza |
Gram negativa |
Aeromonas salmonicida |
1 |
54 |
1.85% |
| Após a limpeza |
Gram negativa |
Enterobacter cloacae (ESBL) |
1 |
54 |
1.85% |
| Após a limpeza |
Gram negativa |
Enterobacter cloacae complex |
1 |
54 |
1.85% |
bacz <- bac %>% filter(gram=="Gram negativa") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n))
ggplot(bacz) +
ggtitle("Gram negativa") +
scale_fill_manual(values = cor) +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(caption = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

a <- bac %>% filter(gram=="Gram negativa" & momento=="Antes da limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>% mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>%
ggplot() +
scale_fill_manual(values = cor) +
ggtitle("Gram negativa") +
labs(subtitle = "Antes da limpeza") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))
a

b <- bac %>% filter(gram=="Gram negativa" & momento=="Após a limpeza") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram,micro) %>% count() %>%
ungroup %>% mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(n)) %>%
ggplot() +
ggtitle("Gram negativa") +
labs(subtitle = "Após a limpeza") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
xlab("") + ylab("Frequência") + theme(axis.text.x = element_text(face = "italic"))
b

3. Qual a frequência de bactérias Gram positivas e Gram negativas encontrada por área, comparando sujo e limpo?
LEITO 03
bac %>% filter(local =="Leito 03") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
4 |
9 |
44.44% |
| Após a limpeza |
Gram positiva |
4 |
9 |
44.44% |
| Após a limpeza |
Gram negativa |
1 |
9 |
11.11% |
bacz <- bac %>% filter(local =="Leito 03") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 03") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 04
bac %>% filter(local =="Leito 04") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
4 |
8 |
50% |
| Após a limpeza |
Gram positiva |
1 |
8 |
12.5% |
| Após a limpeza |
Gram negativa |
3 |
8 |
37.5% |
bacz <- bac %>% filter(local =="Leito 04") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 04") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 05
bac %>% filter(local =="Leito 05") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
4 |
12 |
33.33% |
| Após a limpeza |
Gram positiva |
4 |
12 |
33.33% |
| Após a limpeza |
Gram negativa |
4 |
12 |
33.33% |
bacz <- bac %>% filter(local =="Leito 05") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 05") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 06
bac %>% filter(local =="Leito 06") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
5 |
18 |
27.78% |
| Após a limpeza |
Gram positiva |
4 |
18 |
22.22% |
| Antes da limpeza |
Gram negativa |
6 |
18 |
33.33% |
| Após a limpeza |
Gram negativa |
3 |
18 |
16.67% |
bacz <- bac %>% filter(local =="Leito 06") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 06") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 08
bac %>% filter(local =="Leito 08") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
3 |
11 |
27.27% |
| Após a limpeza |
Gram positiva |
4 |
11 |
36.36% |
| Antes da limpeza |
Gram negativa |
1 |
11 |
9.09% |
| Após a limpeza |
Gram negativa |
3 |
11 |
27.27% |
bacz <- bac %>% filter(local =="Leito 08") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 08") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

LEITO 12
bac %>% filter(local =="Leito 12") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
5 |
10 |
50% |
| Após a limpeza |
Gram positiva |
1 |
10 |
10% |
| Após a limpeza |
Gram negativa |
4 |
10 |
40% |
bacz <- bac %>% filter(local =="Leito 12") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Leito 12") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Área administrativa
bac %>% filter(local =="Área administrativa") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Após a limpeza |
Gram positiva |
2 |
4 |
50% |
| Antes da limpeza |
Gram negativa |
2 |
4 |
50% |
bacz <- bac %>% filter(local =="Área administrativa") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Área administrativa") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Banheiro CTI
bac %>% filter(local =="Banheiro CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
2 |
7 |
28.57% |
| Após a limpeza |
Gram positiva |
1 |
7 |
14.29% |
| Antes da limpeza |
Gram negativa |
3 |
7 |
42.86% |
| Após a limpeza |
Gram negativa |
1 |
7 |
14.29% |
bacz <- bac %>% filter(local =="Banheiro CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Banheiro CTI") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Copa CTI
bac %>% filter(local =="Copa CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
7 |
21 |
33.33% |
| Após a limpeza |
Gram positiva |
2 |
21 |
9.52% |
| Antes da limpeza |
Gram negativa |
9 |
21 |
42.86% |
| Após a limpeza |
Gram negativa |
3 |
21 |
14.29% |
bacz <- bac %>% filter(local =="Copa CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Copa CTI") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

CTI
bac %>% filter(local =="Pia do CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Após a limpeza |
Gram positiva |
2 |
6 |
33.33% |
| Antes da limpeza |
Gram negativa |
3 |
6 |
50% |
| Após a limpeza |
Gram negativa |
1 |
6 |
16.67% |
bacz <- bac %>% filter(local =="Pia do CTI") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Pia do CTI") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

Farmácia
bac %>% filter(local =="Farmácia") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Antes da limpeza |
Gram positiva |
3 |
13 |
23.08% |
| Após a limpeza |
Gram positiva |
3 |
13 |
23.08% |
| Antes da limpeza |
Gram negativa |
5 |
13 |
38.46% |
| Após a limpeza |
Gram negativa |
2 |
13 |
15.38% |
bacz <- bac %>% filter(local =="Farmácia") %>%
select(momento,gram,id,micro) %>% distinct_all() %>%
group_by(momento,gram) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento))
ggplot(bacz) +
ggtitle("Farmácia") +
aes(x=reorder(gram,-n),y=n, fill=gram, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, ncol = 2)

4. Qual a frequência de cada bactéria encontrado por área, comparando sujo e limpo?
LEITO 03
bac %>% filter(local =="Leito 03") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Bastonete Gram positivo |
3 |
9 |
33.33% |
| Gram positiva |
Antes da limpeza |
Staphylococcus saprophyticus |
1 |
9 |
11.11% |
| Gram positiva |
Após a limpeza |
Enterococcus columbae |
1 |
9 |
11.11% |
| Gram positiva |
Após a limpeza |
Staphylococcus caprae |
1 |
9 |
11.11% |
| Gram positiva |
Após a limpeza |
Staphylococcus epidermidis |
1 |
9 |
11.11% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
9 |
11.11% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
9 |
11.11% |
bacz <- bac %>% filter(local =="Leito 03") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 03") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 04
bac %>% filter(local =="Leito 04") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Bastonete Gram positivo |
4 |
8 |
50% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus |
1 |
8 |
12.5% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
8 |
12.5% |
| Gram negativa |
Após a limpeza |
Pantoea spp |
2 |
8 |
25% |
bacz <- bac %>% filter(local =="Leito 04") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 04") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

LEITO 05
bac %>% filter(local =="Leito 05") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Bastonete Gram positivo |
4 |
12 |
33.33% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
12 |
8.33% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MBL) |
2 |
12 |
16.67% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
12 |
8.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex (ESBL) |
1 |
12 |
8.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex (KPC) |
2 |
12 |
16.67% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
12 |
8.33% |
bacz <- bac %>% filter(local =="Leito 05") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 05") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 06
bac %>% filter(local =="Leito 06") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Enterococcus faecalis |
3 |
18 |
16.67% |
| Gram positiva |
Antes da limpeza |
Staphylococcus aureus |
1 |
18 |
5.56% |
| Gram positiva |
Antes da limpeza |
Staphylococcus epidermidis |
1 |
18 |
5.56% |
| Gram positiva |
Após a limpeza |
Bastonete Gram positivo |
1 |
18 |
5.56% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
18 |
5.56% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
18 |
5.56% |
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
18 |
5.56% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
18 |
5.56% |
| Gram negativa |
Antes da limpeza |
Pseudomonas stutzeri |
1 |
18 |
5.56% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
4 |
18 |
22.22% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
18 |
5.56% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
18 |
5.56% |
| Gram negativa |
Após a limpeza |
Pantoea spp |
1 |
18 |
5.56% |
bacz <- bac %>% filter(local =="Leito 06") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 06") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

LEITO 08
bac %>% filter(local =="Leito 08") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Bastonete Gram positivo |
3 |
11 |
27.27% |
| Gram positiva |
Após a limpeza |
Aerococcus viridans |
1 |
11 |
9.09% |
| Gram positiva |
Após a limpeza |
Enterococcus faecium |
2 |
11 |
18.18% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
11 |
9.09% |
| Gram negativa |
Antes da limpeza |
Enterobacter cloacae complex |
1 |
11 |
9.09% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
1 |
11 |
9.09% |
| Gram negativa |
Após a limpeza |
Pantoea spp |
2 |
11 |
18.18% |
bacz <- bac %>% filter(local =="Leito 08") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 08") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 12
bac %>% filter(local =="Leito 12") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Bastonete Gram positivo |
3 |
10 |
30% |
| Gram positiva |
Antes da limpeza |
Staphylococcus haemolyticus |
2 |
10 |
20% |
| Gram positiva |
Após a limpeza |
Bastonete Gram positivo |
1 |
10 |
10% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
2 |
10 |
20% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
10 |
10% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
10 |
10% |
bacz <- bac %>% filter(local =="Leito 12") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 12") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Área administrativa
bac %>% filter(local =="Área administrativa") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Alloiococcus otitis |
1 |
4 |
25% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
4 |
25% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
4 |
25% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
1 |
4 |
25% |
bacz <- bac %>% filter(local =="Área administrativa") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Área administrativa") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Banheiro CTI
bac %>% filter(local =="Banheiro CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Enterococcus faecalis |
1 |
7 |
14.29% |
| Gram positiva |
Antes da limpeza |
Staphylococcus aureus |
1 |
7 |
14.29% |
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
7 |
14.29% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
3 |
7 |
42.86% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
7 |
14.29% |
bacz <- bac %>% filter(local =="Banheiro CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Banheiro CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Copa CTI
bac %>% filter(local =="Copa CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Enterococcus faecalis |
2 |
21 |
9.52% |
| Gram positiva |
Antes da limpeza |
Enterococcus faecium |
1 |
21 |
4.76% |
| Gram positiva |
Antes da limpeza |
Kocuria rhizophila |
1 |
21 |
4.76% |
| Gram positiva |
Antes da limpeza |
Staphylococcus cohnii |
1 |
21 |
4.76% |
| Gram positiva |
Antes da limpeza |
Staphylococcus epidermidis |
1 |
21 |
4.76% |
| Gram positiva |
Antes da limpeza |
Staphylococcus sciuri |
1 |
21 |
4.76% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
21 |
4.76% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
21 |
4.76% |
| Gram negativa |
Antes da limpeza |
Aeromonas salmonicida |
1 |
21 |
4.76% |
| Gram negativa |
Antes da limpeza |
Burkholderia mallei |
1 |
21 |
4.76% |
| Gram negativa |
Antes da limpeza |
Escherichia coli |
1 |
21 |
4.76% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
2 |
21 |
9.52% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
21 |
4.76% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
3 |
21 |
14.29% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
1 |
21 |
4.76% |
| Gram negativa |
Após a limpeza |
Enterobacter cloacae (ESBL) |
1 |
21 |
4.76% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
21 |
4.76% |
bacz <- bac %>% filter(local =="Copa CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Copa CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

CTI
bac %>% filter(local =="Pia do CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Corynebacterium jeikeium |
1 |
6 |
16.67% |
| Gram positiva |
Após a limpeza |
Enterococcus faecalis |
1 |
6 |
16.67% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
6 |
16.67% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
2 |
6 |
33.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
6 |
16.67% |
bacz <- bac %>% filter(local =="Pia do CTI") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Pia do CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Farmácia
bac %>% filter(local =="Farmácia") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Enterococcus faecalis |
3 |
13 |
23.08% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
13 |
7.69% |
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
13 |
7.69% |
| Gram positiva |
Após a limpeza |
Staphylococcus warneri (MRSA + MBL) |
1 |
13 |
7.69% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
13 |
7.69% |
| Gram negativa |
Antes da limpeza |
Enterobacter cloacae complex |
1 |
13 |
7.69% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
2 |
13 |
15.38% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
13 |
7.69% |
| Gram negativa |
Após a limpeza |
Aeromonas salmonicida |
1 |
13 |
7.69% |
| Gram negativa |
Após a limpeza |
Enterobacter cloacae complex |
1 |
13 |
7.69% |
bacz <- bac %>% filter(local =="Farmácia") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Farmácia") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

5. Qual a frequência de bactérias resistentes por área, comparando sujo e limpo?
LEITO 03
bac %>% filter(local =="Leito 03", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Staphylococcus saprophyticus |
1 |
4 |
25% |
| Gram positiva |
Após a limpeza |
Staphylococcus epidermidis |
1 |
4 |
25% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
4 |
25% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
4 |
25% |
bacz <- bac %>% filter(local =="Leito 03", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 03") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 04
bac %>% filter(local =="Leito 04", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus |
1 |
2 |
50% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
2 |
50% |
bacz <- bac %>% filter(local =="Leito 04", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 04") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 05
bac %>% filter(local =="Leito 05", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
8 |
12.5% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MBL) |
2 |
8 |
25% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
8 |
12.5% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex (ESBL) |
1 |
8 |
12.5% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex (KPC) |
2 |
8 |
25% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
8 |
12.5% |
bacz <- bac %>% filter(local =="Leito 05", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 05") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 06
bac %>% filter(local =="Leito 06", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Staphylococcus epidermidis |
1 |
12 |
8.33% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
12 |
8.33% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
12 |
8.33% |
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
12 |
8.33% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
12 |
8.33% |
| Gram negativa |
Antes da limpeza |
Pseudomonas stutzeri |
1 |
12 |
8.33% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
4 |
12 |
33.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
12 |
8.33% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
12 |
8.33% |
bacz <- bac %>% filter(local =="Leito 06", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 06") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 08
bac %>% filter(local =="Leito 08", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Enterococcus faecium |
2 |
5 |
40% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
5 |
20% |
| Gram negativa |
Antes da limpeza |
Enterobacter cloacae complex |
1 |
5 |
20% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
1 |
5 |
20% |
bacz <- bac %>% filter(local =="Leito 08", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 08") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

LEITO 12
bac %>% filter(local =="Leito 12", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Staphylococcus haemolyticus |
2 |
6 |
33.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
2 |
6 |
33.33% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
6 |
16.67% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
6 |
16.67% |
bacz <- bac %>% filter(local =="Leito 12", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Leito 12") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)

Área administrativa
bac %>% filter(local =="Área administrativa", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
3 |
33.33% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
3 |
33.33% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
1 |
3 |
33.33% |
bacz <- bac %>% filter(local =="Área administrativa", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Área administrativa") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

Banheiro CTI
bac %>% filter(local =="Banheiro CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
5 |
20% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
3 |
5 |
60% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
5 |
20% |
bacz <- bac %>% filter(local =="Banheiro CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Banheiro CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

Copa CTI
bac %>% filter(local =="Copa CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Staphylococcus cohnii |
1 |
13 |
7.69% |
| Gram positiva |
Antes da limpeza |
Staphylococcus epidermidis |
1 |
13 |
7.69% |
| Gram positiva |
Após a limpeza |
Staphylococcus haemolyticus (MRSA + MBL) |
1 |
13 |
7.69% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis |
1 |
13 |
7.69% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
2 |
13 |
15.38% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
13 |
7.69% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
3 |
13 |
23.08% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii |
1 |
13 |
7.69% |
| Gram negativa |
Após a limpeza |
Enterobacter cloacae (ESBL) |
1 |
13 |
7.69% |
| Gram negativa |
Após a limpeza |
Klebsiella pneumoniae |
1 |
13 |
7.69% |
bacz <- bac %>% filter(local =="Copa CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Copa CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

CTI
bac %>% filter(local =="Pia do CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Após a limpeza |
Enterococcus faecalis |
1 |
5 |
20% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
5 |
20% |
| Gram negativa |
Antes da limpeza |
Serratia marcescens |
2 |
5 |
40% |
| Gram negativa |
Após a limpeza |
Acinetobacter baumannii complex |
1 |
5 |
20% |
bacz <- bac %>% filter(local =="Pia do CTI", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Pia do CTI") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2)+ theme(axis.text.x = element_text(face = "italic"))

Farmácia
bac %>% filter(local =="Farmácia", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(gram,momento)) %>% kable()
| Gram positiva |
Antes da limpeza |
Enterococcus faecalis |
2 |
11 |
18.18% |
| Gram positiva |
Após a limpeza |
Staphylococcus hominis (MRSA + MBL) |
1 |
11 |
9.09% |
| Gram positiva |
Após a limpeza |
Staphylococcus lentus |
1 |
11 |
9.09% |
| Gram positiva |
Após a limpeza |
Staphylococcus warneri (MRSA + MBL) |
1 |
11 |
9.09% |
| Gram negativa |
Antes da limpeza |
Acinetobacter baumannii complex |
1 |
11 |
9.09% |
| Gram negativa |
Antes da limpeza |
Enterobacter cloacae complex |
1 |
11 |
9.09% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae |
2 |
11 |
18.18% |
| Gram negativa |
Antes da limpeza |
Klebsiella pneumoniae (ESBL) |
1 |
11 |
9.09% |
| Gram negativa |
Após a limpeza |
Enterobacter cloacae complex |
1 |
11 |
9.09% |
bacz <- bac %>% filter(local =="Farmácia", inter=="R") %>%
select(gram, momento,micro,id) %>% distinct_all() %>%
group_by(gram, momento,micro) %>% count() %>%
ungroup %>%
mutate(total = sum(n), prop = paste0(round(n/total*100,2),"%")) %>%
arrange(desc(micro, gram,momento))
ggplot(bacz) +
ggtitle("Farmácia") +
aes(x=reorder(micro,-n),y=n, fill=micro, label=paste0(n," \n ",round(n/total*100,2),"%")) +
geom_bar(stat = "identity", position = "dodge") +
theme_pubr() +
theme(legend.key = element_blank(),
legend.position = "none",
axis.text.x = element_text(angle = 90,
hjust = 1,
colour = "black")) +
geom_text(vjust=-0.2, size=3) +
labs(subtitle = paste0("Total = ", bacz$total[1]) ) +
xlab("") + ylab("Frequência") + facet_wrap(~momento, nrow = 2) + theme(axis.text.x = element_text(face = "italic"))

11. Quais os padrões de susceptibilidade antimicrobiana de cepas de bactérias isoladas (Microrganismos x medicamentos x suceptibilidade de antimicrobianos S (%) I (%) R (%))
Resposta
library(summarytools)
library(tidyr)
# bac %>% mutate(id = factor(id), inter = factor(inter)) %>%
# # filter(inter=="R") %>%
# select(anti,id,inter) %>%
# group_by(anti,inter) %>% count() %>%
# descr(., stats = c("common"), transpose = T) %>%
# tb() %>% arrange(desc(mean)) %>% as.data.frame() #%>% summarise(sum(mean))
bac2 <- bac
bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>%
select(anti,inter,micro, id, inter) %>%
group_by(anti,inter) %>% count() %>% arrange(anti,desc(n)) %>%
ungroup %>%
as.data.frame() %>% pivot_wider(names_from = inter, values_from = n, values_fill = 0) %>%
mutate(TS = sum(S), PS = paste0(round(S/TS*100,2),"%"),
TI = sum(I), PI = paste0(round(I/TI*100,2),"%"),
TR = sum(R), PR = paste0(round(R/TR*100,2),"%"),
TNEG = sum(NEG), PNEG = paste0(round(NEG/TR*100,2),"%"),
TPOS = sum(POS), PPOS = paste0(round(POS/TR*100,2),"%"),
TNA = sum(`NA`), PNA = paste0(round(`NA`/TR*100,2),"%")) %>% as.data.frame() %>% kable("pandoc")
| Ácido Nalidíxico |
8 |
0 |
0 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Amicacina |
40 |
2 |
0 |
0 |
0 |
0 |
845 |
4.73% |
35 |
5.71% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Amoxicilina/Ácido clavulânico |
2 |
0 |
6 |
0 |
0 |
0 |
845 |
0.24% |
35 |
0% |
334 |
1.8% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ampicilina |
13 |
1 |
23 |
0 |
0 |
0 |
845 |
1.54% |
35 |
2.86% |
334 |
6.89% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ampicilina/Sulbactam |
16 |
0 |
7 |
0 |
0 |
0 |
845 |
1.89% |
35 |
0% |
334 |
2.1% |
37 |
0% |
19 |
0% |
47 |
0% |
| Benzilpenicilina |
8 |
0 |
18 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
5.39% |
37 |
0% |
19 |
0% |
47 |
0% |
| BLSE |
0 |
0 |
0 |
8 |
4 |
1 |
845 |
0% |
35 |
0% |
334 |
0% |
37 |
2.4% |
19 |
1.2% |
47 |
0.3% |
| Cefalotina |
2 |
0 |
2 |
0 |
0 |
0 |
845 |
0.24% |
35 |
0% |
334 |
0.6% |
37 |
0% |
19 |
0% |
47 |
0% |
| Cefepima |
31 |
1 |
14 |
0 |
0 |
0 |
845 |
3.67% |
35 |
2.86% |
334 |
4.19% |
37 |
0% |
19 |
0% |
47 |
0% |
| Cefoxitina |
14 |
1 |
23 |
0 |
0 |
0 |
845 |
1.66% |
35 |
2.86% |
334 |
6.89% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ceftarolina |
7 |
0 |
0 |
0 |
0 |
2 |
845 |
0.83% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0.6% |
| Ceftazidima |
23 |
1 |
14 |
0 |
0 |
0 |
845 |
2.72% |
35 |
2.86% |
334 |
4.19% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ceftriaxona |
24 |
6 |
16 |
0 |
0 |
0 |
845 |
2.84% |
35 |
17.14% |
334 |
4.79% |
37 |
0% |
19 |
0% |
47 |
0% |
| Cefuroxima |
8 |
0 |
33 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
9.88% |
37 |
0% |
19 |
0% |
47 |
0% |
| Cefuroxima Axetil |
8 |
0 |
38 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
11.38% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ciprofloxacina |
39 |
0 |
7 |
0 |
0 |
0 |
845 |
4.62% |
35 |
0% |
334 |
2.1% |
37 |
0% |
19 |
0% |
47 |
0% |
| Clindamicina |
8 |
0 |
21 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
6.29% |
37 |
0% |
19 |
0% |
47 |
0% |
| Colistina |
28 |
0 |
11 |
0 |
0 |
0 |
845 |
3.31% |
35 |
0% |
334 |
3.29% |
37 |
0% |
19 |
0% |
47 |
0% |
| Daptomicina |
32 |
0 |
1 |
0 |
0 |
4 |
845 |
3.79% |
35 |
0% |
334 |
0.3% |
37 |
0% |
19 |
0% |
47 |
1.2% |
| Eritromicina |
9 |
9 |
22 |
0 |
0 |
0 |
845 |
1.07% |
35 |
25.71% |
334 |
6.59% |
37 |
0% |
19 |
0% |
47 |
0% |
| Ertapenem |
25 |
1 |
5 |
0 |
0 |
0 |
845 |
2.96% |
35 |
2.86% |
334 |
1.5% |
37 |
0% |
19 |
0% |
47 |
0% |
| Estreptomicina Alto Nível (Sinergia) |
13 |
0 |
0 |
0 |
0 |
0 |
845 |
1.54% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Gentamicina |
62 |
4 |
7 |
0 |
0 |
0 |
845 |
7.34% |
35 |
11.43% |
334 |
2.1% |
37 |
0% |
19 |
0% |
47 |
0% |
| Gentamicina Alto Nível (Sinergia) |
13 |
0 |
0 |
0 |
0 |
0 |
845 |
1.54% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Imipenem |
25 |
0 |
2 |
0 |
0 |
0 |
845 |
2.96% |
35 |
0% |
334 |
0.6% |
37 |
0% |
19 |
0% |
47 |
0% |
| Levofloxacina |
29 |
1 |
10 |
0 |
0 |
0 |
845 |
3.43% |
35 |
2.86% |
334 |
2.99% |
37 |
0% |
19 |
0% |
47 |
0% |
| Linezolid |
37 |
0 |
2 |
0 |
0 |
0 |
845 |
4.38% |
35 |
0% |
334 |
0.6% |
37 |
0% |
19 |
0% |
47 |
0% |
| Meropenem |
40 |
0 |
6 |
0 |
0 |
0 |
845 |
4.73% |
35 |
0% |
334 |
1.8% |
37 |
0% |
19 |
0% |
47 |
0% |
| Nitrofurantoína |
41 |
2 |
5 |
0 |
0 |
0 |
845 |
4.85% |
35 |
5.71% |
334 |
1.5% |
37 |
0% |
19 |
0% |
47 |
0% |
| Norfloxacina |
8 |
0 |
0 |
0 |
0 |
0 |
845 |
0.95% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Oxacilina |
12 |
0 |
16 |
0 |
0 |
0 |
845 |
1.42% |
35 |
0% |
334 |
4.79% |
37 |
0% |
19 |
0% |
47 |
0% |
| Piperacilina/Tazobactam |
31 |
1 |
2 |
0 |
0 |
0 |
845 |
3.67% |
35 |
2.86% |
334 |
0.6% |
37 |
0% |
19 |
0% |
47 |
0% |
| Resistência Induzida a Clindamicina |
1 |
0 |
0 |
21 |
1 |
3 |
845 |
0.12% |
35 |
0% |
334 |
0% |
37 |
6.29% |
19 |
0.3% |
47 |
0.9% |
| Rifampicina |
21 |
1 |
4 |
0 |
0 |
0 |
845 |
2.49% |
35 |
2.86% |
334 |
1.2% |
37 |
0% |
19 |
0% |
47 |
0% |
| Sem dados |
0 |
0 |
0 |
0 |
0 |
33 |
845 |
0% |
35 |
0% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
9.88% |
| Teicoplanina |
36 |
0 |
3 |
0 |
0 |
0 |
845 |
4.26% |
35 |
0% |
334 |
0.9% |
37 |
0% |
19 |
0% |
47 |
0% |
| Teste de screening de cefoxitina |
0 |
0 |
0 |
8 |
14 |
4 |
845 |
0% |
35 |
0% |
334 |
0% |
37 |
2.4% |
19 |
4.19% |
47 |
1.2% |
| Tigeciclina |
71 |
3 |
0 |
0 |
0 |
0 |
845 |
8.4% |
35 |
8.57% |
334 |
0% |
37 |
0% |
19 |
0% |
47 |
0% |
| Trimetoprim/Sulfametoxazol |
25 |
0 |
13 |
0 |
0 |
0 |
845 |
2.96% |
35 |
0% |
334 |
3.89% |
37 |
0% |
19 |
0% |
47 |
0% |
| Vancomicina |
35 |
1 |
3 |
0 |
0 |
0 |
845 |
4.14% |
35 |
2.86% |
334 |
0.9% |
37 |
0% |
19 |
0% |
47 |
0% |
bac2$inter[is.na(bac2$inter)] <- "NAava"
bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>%
select(momento,anti,inter,micro, id, inter) %>%
group_by(momento,anti,inter,micro) %>% count() %>% arrange(anti,desc(n)) %>%
pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>% mutate(sum = rowSums(.[4:38])) %>% select(momento,anti,inter,sum) %>% arrange(desc(sum)) %>% pivot_wider(names_from = inter, values_from = sum, values_fill = 0) %>% as.data.frame() -> antitab
bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% #filter(inter!="NA") %>%
select(momento,anti,inter,micro, id, inter) %>%
group_by(momento,anti,inter,micro) %>% count() %>% arrange(anti,desc(n)) %>%
pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>% mutate(sum = rowSums(.[4:38])) %>% select(anti,momento,inter,sum) %>% arrange(desc(sum)) -> anti
levels(anti$inter) <- c("Intermediário","Não Avaliado","Negativo","Positivo","Resistente","Sensível")
anti %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>%
ggplot() +
# ggtitle("S, R, I, NEG, POS") +
aes(x=reorder(anti,-sum),y=sum, fill=inter) +
geom_bar(stat = "identity", position = "stack") +
theme_pubr() +
theme(legend.title = element_blank(),
legend.position = "right",
axis.text.x = element_text(angle = 90,
hjust = 1,
vjust = 0.3,
colour = "black")) +
xlab("") + ylab("Frequência")

anti %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>%
ggbarplot(., x = "anti",
y = "sum",
fill = "inter", palette = "lancet",
label = F,
lab.pos = c("in"),
facet.by = "momento",
xlab = "",
repel=T,
ylab= "Frequência",
lab.size = 3,
position = position_stack()
) +
theme_pubr(legend="right") +
theme(
legend.title = element_blank(),
text = element_text(size = 10),
axis.text.y = element_text(
angle = 0,
hjust = 0,
colour = "black"),
axis.text.x = element_text(
angle = 90,
hjust = 1,
vjust = 0.3,
colour = "black")) #+ coord_flip()

bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>% #filter(inter!="NA") %>%
select(anti,inter,micro, id, inter) %>%
group_by(anti,inter,micro) %>% count() %>% arrange(anti,desc(n)) %>%
pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>% mutate(sum = rowSums(.[4:37])) %>% select(anti,inter,sum) %>% arrange(desc(sum)) -> anti2
levels(anti2$inter) <- c("Intermediário","Não Avaliado","Negativo","Positivo","Resistente","Sensível")
bac2 %>% mutate(id = factor(id), inter = factor(inter)) %>%
select(anti,inter,micro, id, inter) %>%
group_by(anti,inter,micro) %>% count() %>% arrange(anti,desc(n)) %>%
pivot_wider(names_from = micro, values_from = n) %>% replace(is.na(.), 0) %>% as.data.frame() %>% mutate(sum = rowSums(.[4:37])) %>% select(anti,inter,sum) %>% arrange(desc(sum)) %>% pivot_wider(names_from = inter, values_from = sum, values_fill = 0) %>% as.data.frame() -> antitab2
anti2 %>% filter(inter %in% c("Intermediário", "Resistente","Sensível")) %>% ggbarplot(., x = "anti",
y = "sum",
fill = "inter", #palette = "lancet",
label = TRUE,
lab.pos = c("out"),
#facet.by = "momento",
xlab = "",
repel=T,
ylab= "Frequência",
lab.size = 3,
position = position_stack()
) +
theme_pubr(legend="right") +
theme(
legend.title = element_blank(),
text = element_text(size = 10),
axis.text.y = element_text(
angle = 0,
hjust = 1,
colour = "black"),
axis.text.x = element_text(
angle = 90,
hjust = 1,
colour = "black")) #+ coord_flip()

12. Comparação entre o numéro de R,S,I,NEG,POS,NA antes e depois da limpeza
Resposta
antitab %>%
group_by(momento) %>%
shapiro_test(S) %>% kable("pandoc")
| Antes da limpeza |
S |
0.9160134 |
0.0057829 |
| Após a limpeza |
S |
0.9121528 |
0.0044004 |
p <- ggboxplot(antitab, x = "momento", y = "S",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Sensível") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

antitab %>%
group_by(momento) %>%
shapiro_test(R) %>% kable("pandoc")
| Antes da limpeza |
R |
0.6545600 |
0.00e+00 |
| Após a limpeza |
R |
0.8175864 |
1.61e-05 |
p <- ggboxplot(antitab, x = "momento", y = "R",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Resistente") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

antitab %>%
group_by(momento) %>%
shapiro_test(I) %>% kable("pandoc")
| Antes da limpeza |
I |
0.4110345 |
0 |
| Após a limpeza |
I |
0.4899872 |
0 |
p <- ggboxplot(antitab, x = "momento", y = "I",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Intermediário") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

antitab %>%
group_by(momento) %>%
shapiro_test(NEG) %>% kable("pandoc")
| Antes da limpeza |
NEG |
0.3014146 |
0 |
| Após a limpeza |
NEG |
0.2096947 |
0 |
p <- ggboxplot(antitab, x = "momento", y = "NEG",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Negativo") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

antitab %>%
group_by(momento) %>%
shapiro_test(POS) %>% kable("pandoc")
| Antes da limpeza |
POS |
0.2910119 |
0 |
| Após a limpeza |
POS |
0.1822424 |
0 |
p <- ggboxplot(antitab, x = "momento", y = "POS",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Positivo") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

antitab %>%
group_by(momento) %>%
shapiro_test(NAava) %>% kable("pandoc")
| Antes da limpeza |
NAava |
0.1581813 |
0 |
| Após a limpeza |
NAava |
0.3319444 |
0 |
p <- ggboxplot(antitab, x = "momento", y = "NAava",
color = "momento", palette = "jco",
add = "jitter", xlab = "", ylab = "Não Avaliado") +
theme_pubr(legend="right") +
theme(legend.title = element_blank())
p + stat_compare_means(paired = T)

a<-compare_means(S ~ momento, data = antitab, paired = T)
b<-compare_means(R ~ momento, data = antitab, paired = T)
c<-compare_means(I ~ momento, data = antitab, paired = T)
d<-compare_means(NEG ~ momento, data = antitab, paired = T)
e<-compare_means(POS ~ momento, data = antitab, paired = T)
f<-compare_means(NAava ~ momento, data = antitab, paired = T)
rbind(a,b,c,d,e,f) %>% kable("pandoc")
| S |
Antes da limpeza |
Após a limpeza |
0.0920815 |
0.092 |
0.092 |
ns |
Wilcoxon |
| R |
Antes da limpeza |
Após a limpeza |
0.0752452 |
0.075 |
0.075 |
ns |
Wilcoxon |
| I |
Antes da limpeza |
Após a limpeza |
0.8595969 |
0.860 |
0.86 |
ns |
Wilcoxon |
| NEG |
Antes da limpeza |
Após a limpeza |
0.8330289 |
0.830 |
0.83 |
ns |
Wilcoxon |
| POS |
Antes da limpeza |
Após a limpeza |
1.0000000 |
1.000 |
1 |
ns |
Wilcoxon |
| NAava |
Antes da limpeza |
Após a limpeza |
0.2614461 |
0.260 |
0.26 |
ns |
Wilcoxon |
IycgLS0tDQojJyB0aXRsZTogIkFuw6FsaXNlIg0KIycgYXV0aG9yOiBDaWQgRWRzb24gUMOzdm9hcw0KIycgYmlibGlvZ3JhcGh5OiBScGFja2FnZXMuYmliDQojJyBvdXRwdXQ6DQojJyAgIGh0bWxfbm90ZWJvb2s6IA0KIycgICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KIycgICAgIHRvYzogdHJ1ZQ0KIycgICAgIHRvY19mbG9hdDogdHJ1ZQ0KIycgICAgIGNvbGxhcHNlZDogZmFsc2UNCiMnIC0tLQ0KIysgd2FybmluZz1GQUxTRSwgZWNobz1ULCBtZXNzYWdlPUZBTFNFDQojKyBzZXR1cCwgaW5jbHVkZT1GLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQprbml0cjo6b3B0c19jaHVuayRzZXQoY29sbGFwc2UgPSBUUlVFKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KbGlicmFyeShGYWN0b01pbmVSKQ0KbGlicmFyeSh2ZWdhbikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoTmJDbHVzdCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeSh4bHN4KQ0KDQpnZ2JpcGxvdDI9ZnVuY3Rpb24ocGNvYmosIGNob2ljZXMgPSAxOjIsIHNjYWxlID0gMSwgcGMuYmlwbG90ID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgb2JzLnNjYWxlID0gMSAtIHNjYWxlLCB2YXIuc2NhbGUgPSBzY2FsZSwgDQogICAgICAgICAgICAgICAgICAgZ3J1cG9zID0gTlVMTCwgZWxsaXBzZSA9IEZBTFNFLCBlbGxpcHNlLnByb2IgPSAwLjY4LCANCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBOVUxMLCBsYWJlbHMuc2l6ZSA9IDMsIGFscGhhID0gMSwgDQogICAgICAgICAgICAgICAgICAgdmFyLmF4ZXMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICBjaXJjbGUgPSBGQUxTRSwgY2lyY2xlLnByb2IgPSAwLjY5LCANCiAgICAgICAgICAgICAgICAgICB2YXJuYW1lLnNpemUgPSAzLCB2YXJuYW1lLmFkanVzdCA9IDEuNSwgDQogICAgICAgICAgICAgICAgICAgdmFybmFtZS5hYmJyZXYgPSBGQUxTRSwgLi4uKQ0Kew0KICBsaWJyYXJ5KGdncGxvdDIpDQogIGxpYnJhcnkocGx5cikNCiAgbGlicmFyeShzY2FsZXMpDQogIGxpYnJhcnkoZ3JpZCkNCiAgDQogIHN0b3BpZm5vdChsZW5ndGgoY2hvaWNlcykgPT0gMikNCiAgDQogICMgUmVjb3ZlciB0aGUgU1ZEDQogIGlmKGluaGVyaXRzKHBjb2JqLCAncHJjb21wJykpew0KICAgIG5vYnMuZmFjdG9yIDwtIHNxcnQobnJvdyhwY29iaiR4KSAtIDEpDQogICAgZCA8LSBwY29iaiRzZGV2DQogICAgdSA8LSBzd2VlcChwY29iaiR4LCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHBjb2JqJHJvdGF0aW9uDQogIH0gZWxzZSBpZihpbmhlcml0cyhwY29iaiwgJ3ByaW5jb21wJykpIHsNCiAgICBub2JzLmZhY3RvciA8LSBzcXJ0KHBjb2JqJG4ub2JzKQ0KICAgIGQgPC0gcGNvYmokc2Rldg0KICAgIHUgPC0gc3dlZXAocGNvYmokc2NvcmVzLCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHBjb2JqJGxvYWRpbmdzDQogIH0gZWxzZSBpZihpbmhlcml0cyhwY29iaiwgJ1BDQScpKSB7DQogICAgbm9icy5mYWN0b3IgPC0gc3FydChucm93KHBjb2JqJGNhbGwkWCkpDQogICAgZCA8LSB1bmxpc3Qoc3FydChwY29iaiRlaWcpWzFdKQ0KICAgIHUgPC0gc3dlZXAocGNvYmokaW5kJGNvb3JkLCAyLCAxIC8gKGQgKiBub2JzLmZhY3RvciksIEZVTiA9ICcqJykNCiAgICB2IDwtIHN3ZWVwKHBjb2JqJHZhciRjb29yZCwyLHNxcnQocGNvYmokZWlnWzE6bmNvbChwY29iaiR2YXIkY29vcmQpLDFdKSxGVU49Ii8iKQ0KICB9IGVsc2Ugew0KICAgIHN0b3AoJ0V4cGVjdGVkIGEgb2JqZWN0IG9mIGNsYXNzIHByY29tcCwgcHJpbmNvbXAgb3IgUENBJykNCiAgfQ0KICANCiAgIyBTY29yZXMNCiAgZGYudSA8LSBhcy5kYXRhLmZyYW1lKHN3ZWVwKHVbLGNob2ljZXNdLCAyLCBkW2Nob2ljZXNdXm9icy5zY2FsZSwgRlVOPScqJykpDQogIA0KICAjIERpcmVjdGlvbnMNCiAgdiA8LSBzd2VlcCh2LCAyLCBkXnZhci5zY2FsZSwgRlVOPScqJykNCiAgZGYudiA8LSBhcy5kYXRhLmZyYW1lKHZbLCBjaG9pY2VzXSkNCiAgDQogIG5hbWVzKGRmLnUpIDwtIGMoJ3h2YXInLCAneXZhcicpDQogIG5hbWVzKGRmLnYpIDwtIG5hbWVzKGRmLnUpDQogIA0KICBpZihwYy5iaXBsb3QpIHsNCiAgICBkZi51IDwtIGRmLnUgKiBub2JzLmZhY3Rvcg0KICB9DQogIA0KICAjIFNjYWxlIHRoZSByYWRpdXMgb2YgdGhlIGNvcnJlbGF0aW9uIGNpcmNsZSBzbyB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIA0KICAjIGEgZGF0YSBlbGxpcHNlIGZvciB0aGUgc3RhbmRhcmRpemVkIFBDIHNjb3Jlcw0KICByIDwtIDENCiAgDQogICMgU2NhbGUgZGlyZWN0aW9ucw0KICB2LnNjYWxlIDwtIHJvd1N1bXModl4yKQ0KICBkZi52IDwtIGRmLnYgLyBzcXJ0KG1heCh2LnNjYWxlKSkNCiAgDQogICMjIFNjYWxlIFNjb3Jlcw0KICByLnNjYWxlPXNxcnQobWF4KGRmLnVbLDFdXjIrZGYudVssMl1eMikpDQogIGRmLnU9Ljk5KmRmLnUvci5zY2FsZQ0KICANCiAgIyBDaGFuZ2UgdGhlIGxhYmVscyBmb3IgdGhlIGF4ZXMNCiAgaWYob2JzLnNjYWxlID09IDApIHsNCiAgICB1LmF4aXMubGFicyA8LSBwYXN0ZSgnc3RhbmRhcmRpemVkIFBDJywgY2hvaWNlcywgc2VwPScnKQ0KICB9IGVsc2Ugew0KICAgIHUuYXhpcy5sYWJzIDwtIHBhc3RlKCdDb21wb25lbnRlIFByaW5jaXBhbCAnLCBjaG9pY2VzLCBzZXA9JycpDQogIH0NCiAgDQogICMgQXBwZW5kIHRoZSBwcm9wb3J0aW9uIG9mIGV4cGxhaW5lZCB2YXJpYW5jZSB0byB0aGUgYXhpcyBsYWJlbHMNCiAgdS5heGlzLmxhYnMgPC0gcGFzdGUodS5heGlzLmxhYnMsIA0KICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCcoJTAuMWYlJSknLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgKiBwY29iaiRzZGV2W2Nob2ljZXNdXjIvc3VtKHBjb2JqJHNkZXZeMikpKQ0KICANCiAgIyBTY29yZSBMYWJlbHMNCiAgaWYoIWlzLm51bGwobGFiZWxzKSkgew0KICAgIGRmLnUkbGFiZWxzIDwtIGxhYmVscw0KICB9DQogIA0KICAjIEdyb3VwaW5nIHZhcmlhYmxlDQogIGlmKCFpcy5udWxsKGdydXBvcykpIHsNCiAgICBkZi51JGdydXBvcyA8LSBncnVwb3MNCiAgfQ0KICANCiAgIyBWYXJpYWJsZSBOYW1lcw0KICBpZih2YXJuYW1lLmFiYnJldikgew0KICAgIGRmLnYkdmFybmFtZSA8LSBhYmJyZXZpYXRlKHJvd25hbWVzKHYpKQ0KICB9IGVsc2Ugew0KICAgIGRmLnYkdmFybmFtZSA8LSByb3duYW1lcyh2KQ0KICB9DQogIA0KICAjIFZhcmlhYmxlcyBmb3IgdGV4dCBsYWJlbCBwbGFjZW1lbnQNCiAgZGYudiRhbmdsZSA8LSB3aXRoKGRmLnYsICgxODAvcGkpICogYXRhbih5dmFyIC8geHZhcikpDQogIGRmLnYkaGp1c3QgPSB3aXRoKGRmLnYsICgxIC0gdmFybmFtZS5hZGp1c3QgKiBzaWduKHh2YXIpKSAvIDIpDQogIA0KICAjIEJhc2UgcGxvdA0KICBnIDwtIGdncGxvdChkYXRhID0gZGYudSwgYWVzKHggPSB4dmFyLCB5ID0geXZhcikpICsgDQogICAgeGxhYih1LmF4aXMubGFic1sxXSkgKyB5bGFiKHUuYXhpcy5sYWJzWzJdKSArIGNvb3JkX2VxdWFsKCkNCiAgDQogIGlmKHZhci5heGVzKSB7DQogICAgIyBEcmF3IGNpcmNsZQ0KICAgIGlmKGNpcmNsZSkgDQogICAgew0KICAgICAgdGhldGEgPC0gYyhzZXEoLXBpLCBwaSwgbGVuZ3RoID0gNTApLCBzZXEocGksIC1waSwgbGVuZ3RoID0gNTApKQ0KICAgICAgY2lyY2xlIDwtIGRhdGEuZnJhbWUoeHZhciA9IHIgKiBjb3ModGhldGEpLCB5dmFyID0gciAqIHNpbih0aGV0YSkpDQogICAgICBnIDwtIGcgKyBnZW9tX3BhdGgoZGF0YSA9IGNpcmNsZSwgY29sb3IgPSBtdXRlZCgnd2hpdGUnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEvMiwgYWxwaGEgPSAxLzMpDQogICAgfQ0KICAgIA0KICAgICMgRHJhdyBkaXJlY3Rpb25zDQogICAgZyA8LSBnICsNCiAgICAgIGdlb21fc2VnbWVudChkYXRhID0gZGYudiwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IDAsIHkgPSAwLCB4ZW5kID0geHZhciwgeWVuZCA9IHl2YXIpLA0KICAgICAgICAgICAgICAgICAgIGFycm93ID0gYXJyb3cobGVuZ3RoID0gdW5pdCgxLzIsICdwaWNhcycpKSwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBtdXRlZCgncmVkJykpDQogIH0NCiAgDQogICMgRHJhdyBlaXRoZXIgbGFiZWxzIG9yIHBvaW50cw0KICBpZighaXMubnVsbChkZi51JGxhYmVscykpIHsNCiAgICBpZighaXMubnVsbChkZi51JGdydXBvcykpIHsNCiAgICAgIGcgPC0gZyArIGdlb21fdGV4dChhZXMobGFiZWwgPSBsYWJlbHMsIGNvbG9yID0gZ3J1cG9zKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGxhYmVscy5zaXplKQ0KICAgIH0gZWxzZSB7DQogICAgICBnIDwtIGcgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWxzKSwgc2l6ZSA9IGxhYmVscy5zaXplKSAgICAgIA0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBpZighaXMubnVsbChkZi51JGdydXBvcykpIHsNCiAgICAgIGcgPC0gZyArIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gZ3J1cG9zKSwgYWxwaGEgPSBhbHBoYSkNCiAgICB9IGVsc2Ugew0KICAgICAgZyA8LSBnICsgZ2VvbV9wb2ludChhbHBoYSA9IGFscGhhKSAgICAgIA0KICAgIH0NCiAgfQ0KICANCiAgIyBPdmVybGF5IGEgY29uY2VudHJhdGlvbiBlbGxpcHNlIGlmIHRoZXJlIGFyZSBncnVwb3MNCiAgaWYoIWlzLm51bGwoZGYudSRncnVwb3MpICYmIGVsbGlwc2UpIHsNCiAgICB0aGV0YSA8LSBjKHNlcSgtcGksIHBpLCBsZW5ndGggPSA1MCksIHNlcShwaSwgLXBpLCBsZW5ndGggPSA1MCkpDQogICAgY2lyY2xlIDwtIGNiaW5kKGNvcyh0aGV0YSksIHNpbih0aGV0YSkpDQogICAgDQogICAgZWxsIDwtIGRkcGx5KGRmLnUsICdncnVwb3MnLCBmdW5jdGlvbih4KSB7DQogICAgICBpZihucm93KHgpIDwgMikgew0KICAgICAgICByZXR1cm4oTlVMTCkNCiAgICAgIH0gZWxzZSBpZihucm93KHgpID09IDIpIHsNCiAgICAgICAgc2lnbWEgPC0gdmFyKGNiaW5kKHgkeHZhciwgeCR5dmFyKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHNpZ21hIDwtIGRpYWcoYyh2YXIoeCR4dmFyKSwgdmFyKHgkeXZhcikpKQ0KICAgICAgfQ0KICAgICAgbXUgPC0gYyhtZWFuKHgkeHZhciksIG1lYW4oeCR5dmFyKSkNCiAgICAgIGVkIDwtIHNxcnQocWNoaXNxKGVsbGlwc2UucHJvYiwgZGYgPSAyKSkNCiAgICAgIGRhdGEuZnJhbWUoc3dlZXAoY2lyY2xlICUqJSBjaG9sKHNpZ21hKSAqIGVkLCAyLCBtdSwgRlVOID0gJysnKSwgDQogICAgICAgICAgICAgICAgIGdydXBvcyA9IHgkZ3J1cG9zWzFdKQ0KICAgIH0pDQogICAgbmFtZXMoZWxsKVsxOjJdIDwtIGMoJ3h2YXInLCAneXZhcicpDQogICAgZyA8LSBnICsgZ2VvbV9wYXRoKGRhdGEgPSBlbGwsIGFlcyhjb2xvciA9IGdydXBvcywgZ3JvdXAgPSBncnVwb3MpKQ0KICB9DQogIA0KICAjIExhYmVsIHRoZSB2YXJpYWJsZSBheGVzDQogIGlmKHZhci5heGVzKSB7DQogICAgZyA8LSBnICsgDQogICAgICBnZW9tX3RleHQoZGF0YSA9IGRmLnYsIA0KICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IHZhcm5hbWUsIHggPSB4dmFyLCB5ID0geXZhciwgDQogICAgICAgICAgICAgICAgICAgIGFuZ2xlID0gYW5nbGUsIGhqdXN0ID0gaGp1c3QpLCANCiAgICAgICAgICAgICAgICBjb2xvciA9ICdkYXJrcmVkJywgc2l6ZSA9IHZhcm5hbWUuc2l6ZSkNCiAgfQ0KICAjIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbGVnZW5kIGZvciBncnVwb3MNCiAgIyBpZighaXMubnVsbChncnVwb3MpKSB7DQogICMgICBnIDwtIGcgKyBzY2FsZV9jb2xvcl9icmV3ZXIobmFtZSA9IGRlcGFyc2Uoc3Vic3RpdHV0ZShncnVwb3MpKSwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICdEYXJrMicpDQogICMgfQ0KICANCiAgIyBUT0RPOiBBZGQgYSBzZWNvbmQgc2V0IG9mIGF4ZXMNCiAgDQogIHJldHVybihnKQ0KfQ0KDQoNCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGtuaXRyKQ0KYmFjIDwtIHJlYWRfZXhjZWwoIlBsYW5pbGhhIENvbXBsZXRhIENUSS4gUGFsb21hLnhsc3giLCBzaGVldCA9ICJkYWRvcyIpDQpiYWMgPC0gYmFjWzE6MTFdDQpzdHIoYmFjKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmJhYyRtaWNybyA8LSBhcy5mYWN0b3IoYmFjJG1pY3JvKQ0KYmFjJGxvY2FsIDwtIGFzLmZhY3RvcihiYWMkbG9jYWwpDQpiYWMkbW9tZW50byA8LSBhcy5mYWN0b3IoYmFjJG1vbWVudG8pDQoNCg0KbGV2ZWxzKGJhYyRtb21lbnRvKSA8LSBjKCJBbnRlcyBkYSBsaW1wZXphIiwiQXDDs3MgYSBsaW1wZXphIikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShEVCkNCmJhYyRyZXN1bC5taWMgPC0gYXMuZmFjdG9yKGJhYyRyZXN1bC5taWMpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoY29sb3JSYW1wcykNCm9wdGlvbnMoRFQub3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWT0iMTAwdmgiKSkNCg0KDQojZ2V0UGFsZXR0ZSA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoMTIsICJTZXQzIikpDQoNCmdnX2NvbG9yX2h1ZSA8LSBmdW5jdGlvbihuKSB7DQogIGh1ZXMgPSBzZXEoMTUsIDM3NSwgbGVuZ3RoID0gbiArIDEpDQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dDQp9DQoNCiMgbGlicmFyeShzY2FsZXMpDQojIHNob3dfY29sKGh1ZV9wYWwoKSgzMCkpDQoNCmNvciA9IGdnX2NvbG9yX2h1ZShsZW5ndGgobGV2ZWxzKGJhYyRtaWNybykpKQ0KDQoNCiMgDQojIA0KIyBiYWMgJT4lIGZpbHRlcihtb21lbnRvPT0iQXDDs3MgYSBsaW1wZXphIikgJT4lIHNlbGVjdChsb2NhbCxzdXBlcixtaWNybyxtb21lbnRvLGdyYW0sZGlsdWljYW8sbmFETkEpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiMgICBncm91cF9ieShuYUROQSxncmFtLHN1cGVyLG1vbWVudG8sbG9jYWwsbWljcm8pICU+JSBjb3VudCgpICU+JSANCiMgICB1bmdyb3VwICU+JSANCiMgICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JSANCiMgICBhcnJhbmdlKChuYUROQSkpICU+JSBrYWJsZSgpDQoNCiMnICMjICoqUmVzdWx0YWRvcyAqKg0KIycNCg0KIycgDQojJyAjIyAqKjEqKi4JKlF1YWlzIGJhY3TDqXJpYXMgZSBxdWFudGFzIGJhY3TDqXJpYXMgZXN0w6NvIHByZXNlbnRlcyBuYSBVVEkgZG8gaG9zcGl0YWwgaW5kZXBlbmRlbnRlIGRhIMOhcmVhIGUgZGEgc2l0dWHDp8OjbyBkZSBzdWpvIGUgbGltcG8/Kg0KIycgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQojIA0KIyBiYWMgJT4lIHNlbGVjdChtaWNybykgJT4lIA0KIyAgIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQojICAgdW5ncm91cCAlPiUgDQojICAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUgDQojICAgYXJyYW5nZShkZXNjKG4pKSAlPiUga2FibGUoKQ0KDQpiYWMgICU+JSBzZWxlY3QobmFETkEsaWQsbG9jYWwsc3VwZXIsbWljcm8sbW9tZW50byxncmFtLGRpbHVpY2FvLG5hRE5BKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JSANCiAgYXJyYW5nZSgoZGVzYyhuKSkpICU+JSBkYXRhdGFibGUoDQogICAgLiwNCiAgICByb3duYW1lcyA9IEZBTFNFLA0KICAgIGZpbHRlciA9ICJ0b3AiLA0KICAgIGV4dGVuc2lvbnMgPSBjKCdCdXR0b25zJywgJ1Njcm9sbGVyJyksDQogICAgb3B0aW9ucyA9IGxpc3QoDQogICAgICBkb20gPSAnQmxmcnRpcCcsDQogICAgICBidXR0b25zID0gYygnY3N2JywgJ2V4Y2VsJyksDQogICAgICBkZWZlclJlbmRlciA9IFQsDQogICAgICAjc2Nyb2xsWSA9ICc2MDBweCcsDQogICAgICBzY3JvbGxlciA9IFRSVUUpKQ0KDQojIGJhY3ogPC0gYmFjICU+JSBzZWxlY3QobWljcm8pICU+JSANCiMgICBncm91cF9ieShtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KIyAgIHVuZ3JvdXAgJT4lIA0KIyAgIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMSksIiUiKSkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhuKSkNCg0KYmFjeiA8LSBiYWMgICU+JSBzZWxlY3QobmFETkEsaWQsbG9jYWwsc3VwZXIsbWljcm8sbW9tZW50byxncmFtLGRpbHVpY2FvLG5hRE5BKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDEpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpDQoNCg0KICBnZ3Bsb3QoYmFjeikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLCtuKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgKCIscm91bmQobi90b3RhbCoxMDAsMiksIiUpIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT05LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIGdlb21fdGV4dCh2anVzdD0wLjUsaGp1c3Q9LTAuMDEsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgY29vcmRfZmxpcCgpICMrIGZhY2V0X3dyYXAofmdyYW0qbW9tZW50bywgbnJvdyA9IDIpDQoNCiMnICMjICoqMioqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgR3JhbSBwb3NpdGl2YXMgZSBHcmFtIG5lZ2F0aXZhcyBuYSBVVEkgY29tcGFyYW5kbyBhIHNpdHVhw6fDo28gZGUgc3VqbyBlIGxpbXBvPyoNCiMnIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgICU+JSBzZWxlY3QobW9tZW50byxncmFtLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogICAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogICAgdW5ncm91cCAlPiUgDQogICAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhYyAgJT4lIHNlbGVjdChtb21lbnRvLGdyYW0saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lDQogIGdncGxvdCgpICsNCiAgZ2d0aXRsZSgiR3JhbSBwb3NpdGl2YSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGxhYnMoY2FwdGlvbiA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfZ3JpZCh+bW9tZW50bykNCg0KYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkdyYW0gcG9zaXRpdmEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpIA0KDQoNCg0KYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFudGVzIGRhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmJhYyAlPiUgZmlsdGVyKGdyYW09PSJHcmFtIHBvc2l0aXZhIiAmIG1vbWVudG89PSJBcMOzcyBhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCmEgPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFudGVzIGRhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogICNnZ3RpdGxlKCJHcmFtIHBvc2l0aXZhIikgKw0KICBsYWJzKHN1YnRpdGxlID0gIkFudGVzIGRhIGxpbXBlemEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQphDQoNCmIgPC0gYmFjICU+JSBmaWx0ZXIoZ3JhbT09IkdyYW0gcG9zaXRpdmEiICYgbW9tZW50bz09IkFww7NzIGEgbGltcGV6YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGdncGxvdCgpICsNCiAjIGdndGl0bGUoIkdyYW0gcG9zaXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQXDDs3MgYSBsaW1wZXphIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCmINCg0KDQpiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKGNhcHRpb24gPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KYSA8LSBiYWMgJT4lIGZpbHRlcihncmFtPT0iR3JhbSBuZWdhdGl2YSIgJiBtb21lbnRvPT0iQW50ZXMgZGEgbGltcGV6YSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGdncGxvdCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yKSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQW50ZXMgZGEgbGltcGV6YSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KYQ0KDQpiIDwtIGJhYyAlPiUgZmlsdGVyKGdyYW09PSJHcmFtIG5lZ2F0aXZhIiAmIG1vbWVudG89PSJBcMOzcyBhIGxpbXBlemEiKSAlPiUgDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdndGl0bGUoIkdyYW0gbmVnYXRpdmEiKSArDQogIGxhYnMoc3VidGl0bGUgPSAiQXDDs3MgYSBsaW1wZXphIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCmINCg0KDQoNCiMnICMjICoqMyoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgR3JhbSBwb3NpdGl2YXMgZSBHcmFtIG5lZ2F0aXZhcyBlbmNvbnRyYWRhIHBvciDDoXJlYSwgY29tcGFyYW5kbyBzdWpvIGUgbGltcG8/Kg0KIycgDQoNCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwMyIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQoNCg0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KIycgIyMjICoqTEVJVE8gMDQqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA0IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNCIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQojJyAjIyMgKipMRUlUTyAwNSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDUiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA1IikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCiMnICMjIyAqKkxFSVRPIDA2KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNiIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDYiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KIycgIyMjICoqTEVJVE8gMDgqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwOCIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwOCIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KDQojJyAjIyMgKipMRUlUTyAxMioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCg0KDQojJyAjIyMgKirDgXJlYSBhZG1pbmlzdHJhdGl2YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIsOBcmVhIGFkbWluaXN0cmF0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKGdyYW0sLW4pLHk9biwgZmlsbD1ncmFtLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbmNvbCA9IDIpDQoNCg0KIycgIyMjICoqQmFuaGVpcm8gQ1RJKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJCYW5oZWlybyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KDQoNCg0KIycgIyMjICoqQ29wYSBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJDb3BhIENUSSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KDQojJyAjIyMgKipDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiUGlhIGRvIENUSSIpICsNCiAgYWVzKHg9cmVvcmRlcihncmFtLC1uKSx5PW4sIGZpbGw9Z3JhbSwgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5jb2wgPSAyKQ0KDQoNCg0KIycgIyMjICoqRmFybcOhY2lhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJGYXJtw6FjaWEiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkZhcm3DoWNpYSIpICU+JQ0KICBzZWxlY3QobW9tZW50byxncmFtLGlkLG1pY3JvKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8sZ3JhbSkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJGYXJtw6FjaWEiKSArDQogIGFlcyh4PXJlb3JkZXIoZ3JhbSwtbikseT1uLCBmaWxsPWdyYW0sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikNCg0KDQoNCg0KDQoNCiMnICMjICoqNCoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGNhZGEgYmFjdMOpcmlhIGVuY29udHJhZG8gcG9yIMOhcmVhLCBjb21wYXJhbmRvIHN1am8gZSBsaW1wbz8qDQoNCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JQ0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA0KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA0IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA1KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgIyMjICoqTEVJVE8gMDYqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA2IikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA2IikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA2IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQojJyAjIyMgKipMRUlUTyAwOCoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDgiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDgiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDgiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMjICoqTEVJVE8gMTIqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDEyIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKirDgXJlYSBhZG1pbmlzdHJhdGl2YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iw4FyZWEgYWRtaW5pc3RyYXRpdmEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCLDgXJlYSBhZG1pbmlzdHJhdGl2YSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQojJyAjIyMgKipCYW5oZWlybyBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJCYW5oZWlybyBDVEkiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQoNCiMnICMjIyAqKkNvcGEgQ1RJKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJDb3BhIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQoNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkNvcGEgQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKipDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IlBpYSBkbyBDVEkiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iUGlhIGRvIENUSSIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJQaWEgZG8gQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KIycgIyMjICoqRmFybcOhY2lhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJGYXJtw6FjaWEiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iRmFybcOhY2lhIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkZhcm3DoWNpYSIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCiMnICMjCSoqNSoqLgkqUXVhbCBhIGZyZXF1w6puY2lhIGRlIGJhY3TDqXJpYXMgcmVzaXN0ZW50ZXMgcG9yIMOhcmVhLCBjb21wYXJhbmRvIHN1am8gZSBsaW1wbz8qDQojJyANCg0KIycgIyMjICoqTEVJVE8gMDMqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDAzIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCg0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDMiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCiMnICMjIyAqKkxFSVRPIDA0KiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJMZWl0byAwNCIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJMZWl0byAwNCIpICsNCiAgYWVzKHg9cmVvcmRlcihtaWNybywtbikseT1uLCBmaWxsPW1pY3JvLCBsYWJlbD1wYXN0ZTAobiwiIFxuICIscm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MykgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiYWN6JHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bywgbnJvdyA9IDIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgIyMjICoqTEVJVE8gMDUqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA1IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA1IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQojJyAjIyMgKipMRUlUTyAwNioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMDYiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMDYiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMjICoqTEVJVE8gMDgqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkxlaXRvIDA4IiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkxlaXRvIDA4IikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQojJyAjIyMgKipMRUlUTyAxMioqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGdyYW0sbW9tZW50bykpICU+JSBrYWJsZSgpDQoNCmJhY3ogPC0gYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iTGVpdG8gMTIiLCBpbnRlcj09IlIiKSAlPiUNCiAgc2VsZWN0KGdyYW0sIG1vbWVudG8sbWljcm8saWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkoZ3JhbSwgbW9tZW50byxtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG1pY3JvLCBncmFtLG1vbWVudG8pKQ0KZ2dwbG90KGJhY3opICsNCiAgZ2d0aXRsZSgiTGVpdG8gMTIiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKQ0KDQoNCg0KIycgIyMjICoqw4FyZWEgYWRtaW5pc3RyYXRpdmEqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IsOBcmVhIGFkbWluaXN0cmF0aXZhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIsOBcmVhIGFkbWluaXN0cmF0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCiMnICMjIyAqKkJhbmhlaXJvIENUSSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iQmFuaGVpcm8gQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkJhbmhlaXJvIENUSSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJCYW5oZWlybyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCg0KIycgIyMjICoqQ29wYSBDVEkqKiAgDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD05LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkNvcGEgQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIkNvcGEgQ1RJIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLC1uKSx5PW4sIGZpbGw9bWljcm8sIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHRoZW1lX3B1YnIoKSArDQogIHRoZW1lKGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQodmp1c3Q9LTAuMiwgc2l6ZT0zKSArIA0KICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJUb3RhbCA9ICIsIGJhY3okdG90YWxbMV0pICkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBucm93ID0gMikrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KDQoNCiMnICMjIyAqKkNUSSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iUGlhIGRvIENUSSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MoZ3JhbSxtb21lbnRvKSkgJT4lIGthYmxlKCkNCg0KYmFjeiA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCA9PSJQaWEgZG8gQ1RJIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhtaWNybywgZ3JhbSxtb21lbnRvKSkNCmdncGxvdChiYWN6KSArDQogIGdndGl0bGUoIlBpYSBkbyBDVEkiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KDQoNCiMnICMjIyAqKkZhcm3DoWNpYSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KYmFjICU+JSBmaWx0ZXIobG9jYWwgPT0iRmFybcOhY2lhIiwgaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChncmFtLCBtb21lbnRvLG1pY3JvLGlkKSAlPiUgZGlzdGluY3RfYWxsKCkgJT4lDQogIGdyb3VwX2J5KGdyYW0sIG1vbWVudG8sbWljcm8pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhncmFtLG1vbWVudG8pKSAlPiUga2FibGUoKQ0KDQpiYWN6IDwtIGJhYyAlPiUgZmlsdGVyKGxvY2FsID09IkZhcm3DoWNpYSIsIGludGVyPT0iUiIpICU+JQ0KICBzZWxlY3QoZ3JhbSwgbW9tZW50byxtaWNybyxpZCkgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShncmFtLCBtb21lbnRvLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobWljcm8sIGdyYW0sbW9tZW50bykpDQpnZ3Bsb3QoYmFjeikgKw0KICBnZ3RpdGxlKCJGYXJtw6FjaWEiKSArDQogIGFlcyh4PXJlb3JkZXIobWljcm8sLW4pLHk9biwgZmlsbD1taWNybywgbGFiZWw9cGFzdGUwKG4sIiBcbiAiLHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgdGhlbWUobGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIGdlb21fdGV4dCh2anVzdD0tMC4yLCBzaXplPTMpICsgDQogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlRvdGFsID0gIiwgYmFjeiR0b3RhbFsxXSkgKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSArIGZhY2V0X3dyYXAofm1vbWVudG8sIG5yb3cgPSAyKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIikpDQoNCg0KIycgIyMgKio2KiouCSpRdWFsIGEgY29ycmVsYcOnw6NvIGRhcyBiYWN0w6lyaWFzIEdyYW0gcG9zaXRpdmFzIGUgR3JhbSBuZWdhdGl2YXMgbWFpcyBlbmNvbnRyYWRhcyBlIGNvbSBwZXJmaWwgZGUgcmVzaXN0w6puY2lhIGVudHJlIGFzIGR1YXMgc2l0dWHDp8O1ZXMgKGxpbXBvIGUgc3Vqbyk/Kg0KDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KIycgIyMjICoqQ29ycmVsYcOnw6NvKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpkYWQgPC0gYmFjICU+JSBmaWx0ZXIoaW50ZXI9PSJSIikgJT4lDQogIHNlbGVjdChtaWNybywgZ3JhbSwgbW9tZW50bywgbG9jYWwsaWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobWljcm8sIGdyYW0sbW9tZW50byxsb2NhbCkgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKQ0KDQpkYWQyIDwtIGRjYXN0KGRhZCwgbG9jYWwrbW9tZW50byB+Z3JhbSkNCm5hbWVzKGRhZDIpIDwtIGMoImxvY2FsIiwibW9tZW50byIsImduZWdhdGl2YSIsImdwb3NpdGl2YSIpDQoNCmdnc2NhdHRlcihkYWQyLA0KICAgICAgICAgIHggPSAiZ25lZ2F0aXZhIiwNCiAgICAgICAgICB5ID0gImdwb3NpdGl2YSIsDQogICAgICAgICAgYWRkID0gInJlZy5saW5lIiwjYWRpY25pb25hciBsaW5oYSBkZSByZWdyZXNzYW8NCiAgICAgICAgICBjb25mLmludCA9IFRSVUUsDQogICAgICAgICAgY29yLmNvZWYgPSBUUlVFLA0KICAgICAgICAgIGNvci5tZXRob2QgPSAic3BlYXJtYW4iLA0KICAgICAgICAgIHhsYWIgPSAiR3JhbSBuZWdhdGl2YSIsDQogICAgICAgICAgeWxhYiA9ICJHcmFtIHBvc2l0aXZhIiwNCiAgICAgICAgICBmYWNldC5ieT1jKCJtb21lbnRvIiksDQogICAgICAgICAgZm9udC5sYWJlbCA9IGMoNSwgInBsYWluIikpKw0KICBsYWJzKHRhZyA9ICIiKQ0KDQoNCmRhZDIgJT4lIGthYmxlDQoNCiMnIEZvaSB1dGlsaXphZG8gbWV0b2RvIGRlIENvcnJlbGHDp8OjbyBkZSBTcGVhcm1hbiwgasOhIHF1ZSBvcyBkYWRvcyBuw6NvIHNlZ3VlbSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsDQojJw0KDQoNCg0KIycgIyMgKio3KiouICpRdWFsIGEgZnJlcXXDqm5jaWEgdG90YWwgZGUgYmFjdMOpcmlhcyBncmFtIHBvc2l0aXZhcyBlIGdyYW0gbmVnYXRpdmFzIGNvbSBwZXJmaWxkZSByZXNpc3TDqm5jaWEgcG9yIMOhcmVhIGUgY29uc2lkZXJhbmRvIHNpdHVhw6fDo28gZGUgc3Vqby9saW1wbyoNCiMnIA0KDQoNCiMnICMjIyAqKlJlc3Bvc3RhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCmJhYyAlPiUgZmlsdGVyKGludGVyID09ICJSIikgJT4lDQogIHNlbGVjdChtb21lbnRvLGxvY2FsLGdyYW0saWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxsb2NhbCxncmFtKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZQ0KDQoNCmIgPC0gYmFjICU+JSBmaWx0ZXIoaW50ZXIgPT0gIlIiKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sbG9jYWwsZ3JhbSxpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLGxvY2FsLGdyYW0pICU+JSBjb3VudCgpICU+JSANCiAgdW5ncm91cCAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShuKSwgIHByb3AgPSBwYXN0ZTAocm91bmQobi90b3RhbCoxMDAsMiksIiUiKSkgJT4lDQogIGFycmFuZ2UoZGVzYyhuKSkgDQogIA0KZ2dwbG90KGIpICsNCiAgZ2d0aXRsZSgiR3JhbSBOZWdhdGl2YSBlIFBvc2l0aXZhIikgKw0KICBhZXMoeD1yZW9yZGVyKGxvY2FsLC1uKSx5PW4sIGZpbGw9bG9jYWwsIGxhYmVsPXBhc3RlMChuLCIgXG4gIixyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSkgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikpICsNCiAgZ2VvbV90ZXh0KHZqdXN0PS0wLjIsIHNpemU9MywgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgxKSkgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBiJHRvdGFsWzFdKSApICsNCiAgeGxhYigiIikgKyB5bGFiKCJGcmVxdcOqbmNpYSIpICsgZmFjZXRfd3JhcCh+bW9tZW50bypncmFtLCBuY29sID0gMikNCg0KDQoNCg0KDQojJyAjIyAqKjEwKiouCSpRdWFsIGJhY3TDqXJpYSDDqSBtYWlzIGZyZXF1ZW50ZSBub3MgbGVpdG9zIGRhIFVUSSBwb3Igc3VwZXJmw61jaWU/Kg0KIycgDQoNCg0KIycgIyMjICoqTEVJVE9TKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCmJhYyAlPiUgZmlsdGVyKGxvY2FsICVpbiUgYygiTGVpdG8gMDMiLCJMZWl0byAwNCIsIkxlaXRvIDA1IiwiTGVpdG8gMDYiLCJMZWl0byAwOCIsIkxlaXRvIDEyIikpICU+JQ0KICBzZWxlY3QobW9tZW50byxzdXBlcixpZCxtaWNybykgJT4lIGRpc3RpbmN0X2FsbCgpICU+JQ0KICBncm91cF9ieShtb21lbnRvLHN1cGVyLG1pY3JvKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0obiksICBwcm9wID0gcGFzdGUwKHJvdW5kKG4vdG90YWwqMTAwLDIpLCIlIikpICU+JQ0KICBhcnJhbmdlKGRlc2MobikpICU+JSBrYWJsZSgpDQoNCg0KYSA8LSBiYWMgJT4lIGZpbHRlcihsb2NhbCAlaW4lIGMoIkxlaXRvIDAzIiwiTGVpdG8gMDQiLCJMZWl0byAwNSIsIkxlaXRvIDA2IiwiTGVpdG8gMDgiLCJMZWl0byAxMiIpKSAlPiUNCiAgc2VsZWN0KG1vbWVudG8sc3VwZXIsaWQsbWljcm8pICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobW9tZW50byxzdXBlcixtaWNybykgJT4lIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwICU+JSANCiAgbXV0YXRlKHRvdGFsID0gc3VtKG4pLCAgcHJvcCA9IHBhc3RlMChyb3VuZChuL3RvdGFsKjEwMCwyKSwiJSIpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG4pKSANCg0KZ2dwbG90KGEpICsNCiAgZ2d0aXRsZSgiTGVpdG9zIDAzLCAwNCwgMDUsIDA2LCAwOCBlIDEyIikgKw0KICBhZXMoeD1yZW9yZGVyKG1pY3JvLCtuKSx5PW4sIGZpbGw9c3VwZXIsIGxhYmVsPW4pICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJzdGFjayIpICsNCiAgdGhlbWVfcHVicigpICsNCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJTdXBlcmZpY2llIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSkgKw0KICBnZW9tX3RleHQoc2l6ZT0zLGhqdXN0PSsyLCB2anVzdD0wLjUsIHBvc2l0aW9uID0gInN0YWNrIikgKyANCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiVG90YWwgPSAiLCBhJHRvdGFsWzFdKSkgKw0KICB4bGFiKCIiKSArIHlsYWIoIkZyZXF1w6puY2lhIikgKyBmYWNldF93cmFwKH5tb21lbnRvLCBuY29sID0gMikgKyBjb29yZF9mbGlwKCkgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpKQ0KDQoNCg0KDQoNCiMnICMjICoqMTEqKi4JKlF1YWlzIG9zIHBhZHLDtWVzIGRlIHN1c2NlcHRpYmlsaWRhZGUgYW50aW1pY3JvYmlhbmEgZGUgY2VwYXMgZGUgYmFjdMOpcmlhcyBpc29sYWRhcyAoTWljcm9yZ2FuaXNtb3MgeCBtZWRpY2FtZW50b3MgeCBzdWNlcHRpYmlsaWRhZGUgZGUgYW50aW1pY3JvYmlhbm9zIFMgKCUpIEkgKCUpIFIgKCUpKSoNCiMnIA0KDQoNCiMnICMjIyAqKlJlc3Bvc3RhKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQpsaWJyYXJ5KHN1bW1hcnl0b29scykNCmxpYnJhcnkodGlkeXIpDQoNCg0KIyBiYWMgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lIA0KIyAgICMgIGZpbHRlcihpbnRlcj09IlIiKSAlPiUgDQojICAgc2VsZWN0KGFudGksaWQsaW50ZXIpICU+JSANCiMgICBncm91cF9ieShhbnRpLGludGVyKSAlPiUgIGNvdW50KCkgJT4lIA0KIyAgIGRlc2NyKC4sIHN0YXRzID0gYygiY29tbW9uIiksIHRyYW5zcG9zZSA9IFQpICU+JSANCiMgICB0YigpICU+JSBhcnJhbmdlKGRlc2MobWVhbikpICU+JSBhcy5kYXRhLmZyYW1lKCkgIyU+JSBzdW1tYXJpc2Uoc3VtKG1lYW4pKQ0KYmFjMiA8LSBiYWMNCg0KYmFjMiAlPiUgbXV0YXRlKGlkID0gZmFjdG9yKGlkKSwgaW50ZXIgPSBmYWN0b3IoaW50ZXIpKSAlPiUgDQogIHNlbGVjdChhbnRpLGludGVyLG1pY3JvLCBpZCwgaW50ZXIpICU+JSANCiAgZ3JvdXBfYnkoYW50aSxpbnRlcikgJT4lICBjb3VudCgpICU+JSBhcnJhbmdlKGFudGksZGVzYyhuKSkgJT4lIA0KICB1bmdyb3VwICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpbnRlciwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKFRTID0gc3VtKFMpLCAgUFMgPSBwYXN0ZTAocm91bmQoUy9UUyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFRJID0gc3VtKEkpLCAgUEkgPSBwYXN0ZTAocm91bmQoSS9USSoxMDAsMiksIiUiKSwNCiAgICAgICAgIFRSID0gc3VtKFIpLCAgUFIgPSBwYXN0ZTAocm91bmQoUi9UUioxMDAsMiksIiUiKSwNCiAgICAgICAgIFRORUcgPSBzdW0oTkVHKSwgIFBORUcgPSBwYXN0ZTAocm91bmQoTkVHL1RSKjEwMCwyKSwiJSIpLA0KICAgICAgICAgVFBPUyA9IHN1bShQT1MpLCAgUFBPUyA9IHBhc3RlMChyb3VuZChQT1MvVFIqMTAwLDIpLCIlIiksDQogICAgICAgICBUTkEgPSBzdW0oYE5BYCksICBQTkEgPSBwYXN0ZTAocm91bmQoYE5BYC9UUioxMDAsMiksIiUiKSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgIGthYmxlKCJwYW5kb2MiKQ0KDQpiYWMyJGludGVyW2lzLm5hKGJhYzIkaW50ZXIpXSA8LSAiTkFhdmEiDQoNCmJhYzIgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lIA0KICBzZWxlY3QobW9tZW50byxhbnRpLGludGVyLG1pY3JvLCBpZCwgaW50ZXIpICU+JSANCiAgZ3JvdXBfYnkobW9tZW50byxhbnRpLGludGVyLG1pY3JvKSAlPiUgIGNvdW50KCkgJT4lIGFycmFuZ2UoYW50aSxkZXNjKG4pKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtaWNybywgdmFsdWVzX2Zyb20gPSBuKSAlPiUgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgICBtdXRhdGUoc3VtID0gcm93U3VtcyguWzQ6MzhdKSkgJT4lIHNlbGVjdChtb21lbnRvLGFudGksaW50ZXIsc3VtKSAlPiUgYXJyYW5nZShkZXNjKHN1bSkpICU+JSBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW50ZXIsIHZhbHVlc19mcm9tID0gc3VtLCB2YWx1ZXNfZmlsbCA9IDApICU+JSBhcy5kYXRhLmZyYW1lKCkgLT4gYW50aXRhYg0KDQoNCmJhYzIgJT4lIG11dGF0ZShpZCA9IGZhY3RvcihpZCksIGludGVyID0gZmFjdG9yKGludGVyKSkgJT4lICNmaWx0ZXIoaW50ZXIhPSJOQSIpICU+JSANCiAgc2VsZWN0KG1vbWVudG8sYW50aSxpbnRlcixtaWNybywgaWQsIGludGVyKSAlPiUgDQogIGdyb3VwX2J5KG1vbWVudG8sYW50aSxpbnRlcixtaWNybykgJT4lICBjb3VudCgpICU+JSBhcnJhbmdlKGFudGksZGVzYyhuKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbWljcm8sIHZhbHVlc19mcm9tID0gbikgJT4lIHJlcGxhY2UoaXMubmEoLiksIDApICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lICAgbXV0YXRlKHN1bSA9IHJvd1N1bXMoLls0OjM4XSkpICU+JSBzZWxlY3QoYW50aSxtb21lbnRvLGludGVyLHN1bSkgJT4lIGFycmFuZ2UoZGVzYyhzdW0pKSAtPiBhbnRpDQoNCmxldmVscyhhbnRpJGludGVyKSA8LSBjKCJJbnRlcm1lZGnDoXJpbyIsIk7Do28gQXZhbGlhZG8iLCJOZWdhdGl2byIsIlBvc2l0aXZvIiwiUmVzaXN0ZW50ZSIsIlNlbnPDrXZlbCIpDQoNCmFudGkgJT4lIGZpbHRlcihpbnRlciAlaW4lIGMoIkludGVybWVkacOhcmlvIiwgIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKSkgJT4lIA0KICBnZ3Bsb3QoKSArDQogICMgZ2d0aXRsZSgiUywgUiwgSSwgTkVHLCBQT1MiKSArDQogIGFlcyh4PXJlb3JkZXIoYW50aSwtc3VtKSx5PXN1bSwgZmlsbD1pbnRlcikgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gInN0YWNrIikgKw0KICB0aGVtZV9wdWJyKCkgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmp1c3QgPSAwLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIpKSArDQogIHhsYWIoIiIpICsgeWxhYigiRnJlcXXDqm5jaWEiKSANCg0KDQphbnRpICU+JSBmaWx0ZXIoaW50ZXIgJWluJSBjKCJJbnRlcm1lZGnDoXJpbyIsICJSZXNpc3RlbnRlIiwiU2Vuc8OtdmVsIikpICU+JSANCmdnYmFycGxvdCguLCB4ID0gImFudGkiLCANCiAgICAgICAgICAgICAgICAgICB5ID0gInN1bSIsDQogICAgICAgICAgICAgICAgICAgZmlsbCA9ICJpbnRlciIsIHBhbGV0dGUgPSAibGFuY2V0IiwNCiAgICAgICAgICAgICAgICAgICBsYWJlbCA9IEYsDQogICAgICAgICAgICAgICAgICAgbGFiLnBvcyA9IGMoImluIiksDQogICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAibW9tZW50byIsDQogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIiLA0KICAgICAgICAgICAgICAgICAgIHJlcGVsPVQsDQogICAgICAgICAgICAgICAgICAgeWxhYj0gIkZyZXF1w6puY2lhIiwNCiAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjaygpDQopICsgDQogIHRoZW1lX3B1YnIobGVnZW5kPSJyaWdodCIpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGFuZ2xlID0gMCwNCiAgICAgIGhqdXN0ID0gMCwNCiAgICAgIGNvbG91ciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KA0KICAgICAgYW5nbGUgPSA5MCwNCiAgICAgIGhqdXN0ID0gMSwNCiAgICAgIHZqdXN0ID0gMC4zLA0KICAgICAgY29sb3VyID0gImJsYWNrIikpICMrIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KYmFjMiAlPiUgbXV0YXRlKGlkID0gZmFjdG9yKGlkKSwgaW50ZXIgPSBmYWN0b3IoaW50ZXIpKSAlPiUgI2ZpbHRlcihpbnRlciE9Ik5BIikgJT4lIA0KICBzZWxlY3QoYW50aSxpbnRlcixtaWNybywgaWQsIGludGVyKSAlPiUgDQogIGdyb3VwX2J5KGFudGksaW50ZXIsbWljcm8pICU+JSAgY291bnQoKSAlPiUgYXJyYW5nZShhbnRpLGRlc2MobikpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG1pY3JvLCB2YWx1ZXNfZnJvbSA9IG4pICU+JSByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAgIG11dGF0ZShzdW0gPSByb3dTdW1zKC5bNDozN10pKSAlPiUgc2VsZWN0KGFudGksaW50ZXIsc3VtKSAlPiUgYXJyYW5nZShkZXNjKHN1bSkpIC0+IGFudGkyDQoNCmxldmVscyhhbnRpMiRpbnRlcikgPC0gYygiSW50ZXJtZWRpw6FyaW8iLCJOw6NvIEF2YWxpYWRvIiwiTmVnYXRpdm8iLCJQb3NpdGl2byIsIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKQ0KDQpiYWMyICU+JSBtdXRhdGUoaWQgPSBmYWN0b3IoaWQpLCBpbnRlciA9IGZhY3RvcihpbnRlcikpICU+JSANCiAgc2VsZWN0KGFudGksaW50ZXIsbWljcm8sIGlkLCBpbnRlcikgJT4lIA0KICBncm91cF9ieShhbnRpLGludGVyLG1pY3JvKSAlPiUgIGNvdW50KCkgJT4lIGFycmFuZ2UoYW50aSxkZXNjKG4pKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtaWNybywgdmFsdWVzX2Zyb20gPSBuKSAlPiUgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgICBtdXRhdGUoc3VtID0gcm93U3VtcyguWzQ6MzddKSkgJT4lIHNlbGVjdChhbnRpLGludGVyLHN1bSkgJT4lIGFycmFuZ2UoZGVzYyhzdW0pKSAlPiUgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGludGVyLCB2YWx1ZXNfZnJvbSA9IHN1bSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+IGFudGl0YWIyDQoNCg0KYW50aTIgJT4lIGZpbHRlcihpbnRlciAlaW4lIGMoIkludGVybWVkacOhcmlvIiwgIlJlc2lzdGVudGUiLCJTZW5zw612ZWwiKSkgJT4lIGdnYmFycGxvdCguLCB4ID0gImFudGkiLCANCiAgICAgICAgICAgICAgICAgICAgeSA9ICJzdW0iLA0KICAgICAgICAgICAgICAgICAgICBmaWxsID0gImludGVyIiwgI3BhbGV0dGUgPSAibGFuY2V0IiwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICBsYWIucG9zID0gYygib3V0IiksDQogICAgICAgICAgICAgICAgICAgICNmYWNldC5ieSA9ICJtb21lbnRvIiwNCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICIiLA0KICAgICAgICAgICAgICAgICAgICByZXBlbD1ULA0KICAgICAgICAgICAgICAgICAgICB5bGFiPSAiRnJlcXXDqm5jaWEiLA0KICAgICAgICAgICAgICAgICAgICBsYWIuc2l6ZSA9IDMsDQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKQ0KKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBhbmdsZSA9IDAsDQogICAgICBoanVzdCA9IDEsDQogICAgICBjb2xvdXIgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGFuZ2xlID0gOTAsDQogICAgICBoanVzdCA9IDEsDQogICAgICBjb2xvdXIgPSAiYmxhY2siKSkgIysgY29vcmRfZmxpcCgpDQoNCg0KDQoNCg0KIycgIyMgKioxMioqLgkqQ29tcGFyYcOnw6NvIGVudHJlIG8gbnVtw6lybyBkZSBSLFMsSSxORUcsUE9TLE5BIGFudGVzIGUgZGVwb2lzIGRhIGxpbXBlemEqDQojJyANCg0KDQojJyAjIyMgKipSZXNwb3N0YSoqICANCiMrIGVjaG89VCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KDQphbnRpdGFiICU+JQ0KICBncm91cF9ieShtb21lbnRvKSAlPiUNCiAgc2hhcGlyb190ZXN0KFMpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KDQpwIDwtIGdnYm94cGxvdChhbnRpdGFiLCB4ID0gIm1vbWVudG8iLCB5ID0gIlMiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiU2Vuc8OtdmVsIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoUikgJT4lIGthYmxlKCJwYW5kb2MiKQ0KDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiUiIsDQogICAgICAgICAgICAgICBjb2xvciA9ICJtb21lbnRvIiwgcGFsZXR0ZSA9ICJqY28iLA0KICAgICAgICAgICAgICAgYWRkID0gImppdHRlciIsIHhsYWIgPSAiIiwgeWxhYiA9ICJSZXNpc3RlbnRlIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoSSkgJT4lIGthYmxlKCJwYW5kb2MiKQ0KDQpwIDwtIGdnYm94cGxvdChhbnRpdGFiLCB4ID0gIm1vbWVudG8iLCB5ID0gIkkiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiSW50ZXJtZWRpw6FyaW8iKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KcCArIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQgPSBUKQ0KDQoNCg0KYW50aXRhYiAlPiUNCiAgZ3JvdXBfYnkobW9tZW50bykgJT4lDQogIHNoYXBpcm9fdGVzdChORUcpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KcCA8LSBnZ2JveHBsb3QoYW50aXRhYiwgeCA9ICJtb21lbnRvIiwgeSA9ICJORUciLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiTmVnYXRpdm8iKSArIA0KICB0aGVtZV9wdWJyKGxlZ2VuZD0icmlnaHQiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCg0KcCArIHN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQgPSBUKQ0KDQoNCmFudGl0YWIgJT4lDQogIGdyb3VwX2J5KG1vbWVudG8pICU+JQ0KICBzaGFwaXJvX3Rlc3QoUE9TKSAlPiUga2FibGUoInBhbmRvYyIpDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiUE9TIiwNCiAgICAgICAgICAgICAgIGNvbG9yID0gIm1vbWVudG8iLCBwYWxldHRlID0gImpjbyIsDQogICAgICAgICAgICAgICBhZGQgPSAiaml0dGVyIiwgeGxhYiA9ICIiLCB5bGFiID0gIlBvc2l0aXZvIikgKyANCiAgdGhlbWVfcHVicihsZWdlbmQ9InJpZ2h0IikgKw0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQoNCnAgKyBzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVCkNCg0KDQphbnRpdGFiICU+JQ0KICBncm91cF9ieShtb21lbnRvKSAlPiUNCiAgc2hhcGlyb190ZXN0KE5BYXZhKSAlPiUga2FibGUoInBhbmRvYyIpDQoNCnAgPC0gZ2dib3hwbG90KGFudGl0YWIsIHggPSAibW9tZW50byIsIHkgPSAiTkFhdmEiLA0KICAgICAgICAgICAgICAgY29sb3IgPSAibW9tZW50byIsIHBhbGV0dGUgPSAiamNvIiwNCiAgICAgICAgICAgICAgIGFkZCA9ICJqaXR0ZXIiLCB4bGFiID0gIiIsIHlsYWIgPSAiTsOjbyBBdmFsaWFkbyIpICsgDQogIHRoZW1lX3B1YnIobGVnZW5kPSJyaWdodCIpICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KDQpwICsgc3RhdF9jb21wYXJlX21lYW5zKHBhaXJlZCA9IFQpDQoNCmE8LWNvbXBhcmVfbWVhbnMoUyB+IG1vbWVudG8sIGRhdGEgPSBhbnRpdGFiLCBwYWlyZWQgPSBUKQ0KYjwtY29tcGFyZV9tZWFucyhSIH4gbW9tZW50bywgZGF0YSA9IGFudGl0YWIsIHBhaXJlZCA9IFQpDQpjPC1jb21wYXJlX21lYW5zKEkgfiBtb21lbnRvLCBkYXRhID0gYW50aXRhYiwgcGFpcmVkID0gVCkNCmQ8LWNvbXBhcmVfbWVhbnMoTkVHIH4gbW9tZW50bywgZGF0YSA9IGFudGl0YWIsIHBhaXJlZCA9IFQpDQplPC1jb21wYXJlX21lYW5zKFBPUyB+IG1vbWVudG8sIGRhdGEgPSBhbnRpdGFiLCBwYWlyZWQgPSBUKQ0KZjwtY29tcGFyZV9tZWFucyhOQWF2YSAgfiBtb21lbnRvLCBkYXRhID0gYW50aXRhYiwgcGFpcmVkID0gVCkNCg0KcmJpbmQoYSxiLGMsZCxlLGYpICU+JSBrYWJsZSgicGFuZG9jIikNCg0KDQoNCg0KDQojJyAjIyAqKkVYVFJBKioNCiMnIA0KDQojJyAjIyMgKipLLW1lYW5zIGUgUENBKiogIA0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9OSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQoNCiMnIENhcnJlZ2FtZW50byBkb3MgZGFkb3MNCiMrIGVjaG89VCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGF0IDwtIGJhYyAlPiUgc2VsZWN0KG1pY3JvLCBsb2NhbCwgaWQpICU+JSBkaXN0aW5jdF9hbGwoKSAlPiUNCiAgZ3JvdXBfYnkobWljcm8sIGxvY2FsKSAlPiUgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAgDQoNCmRhdDIgPC0gZGNhc3QoZGF0LCBtaWNybyB+IGxvY2FsKQ0KZGF0Mltpcy5uYShkYXQyKV0gPC0gMA0KDQpyb3duYW1lcyhkYXQyKSA8LSBkYXQyJG1pY3JvDQoNCmRhdDIgPC0gZGF0MlstMV0NCg0KDQpkYXQyDQoNCg0KIycgRGltZW5zaW9uYW1lbnRvIGUgcGFkcm9uaXphw6fDo28NCiMrIGVjaG89VCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UNCg0KZGYgPC0gc2NhbGUoZGF0MikgDQoNCiMnIE7Dum1lcm8gw7N0aW1vIGRlIGNsdXN0ZXJzDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCiMgU2lsaHVldGEgbcOpZGlhIHBhcmEga21lYW5zDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gInNpbGhvdWV0dGUiKQ0KDQojIEVzdGF0w61zdGljYSBkZSBsYWN1bmFzDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gImdhcF9zdGF0IikNCg0KIyBNw6l0b2RvIEVsYm93IHBhcmEga21lYW5zDQpmdml6X25iY2x1c3QoZGYsIGttZWFucywgbWV0aG9kID0gIndzcyIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMywgbGluZXR5cGUgPSAyKQ0KDQoNCg0KbmJjbHVzdF9vdXQgPC0gTmJDbHVzdCgNCiAgZGF0YSA9IGRmLA0KICBkaXN0YW5jZSA9ICJldWNsaWRlYW4iLA0KICBtaW4ubmMgPSAyLA0KICBtYXgubmMgPSA1LA0KICBtZXRob2QgPSAia21lYW5zIg0KKQ0KDQojIGNyZWF0ZSBhIGRhdGFmcmFtZSBvZiB0aGUgb3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMNCm5iY2x1c3RfcGxvdCA8LSBkYXRhLmZyYW1lKGNsdXN0ZXJzID0gbmJjbHVzdF9vdXQkQmVzdC5uY1sxLCBdKQ0KIyBzZWxlY3Qgb25seSBpbmRpY2VzIHdoaWNoIHNlbGVjdCBiZXR3ZWVuIDIgYW5kIDUgY2x1c3RlcnMNCm5iY2x1c3RfcGxvdCA8LSBzdWJzZXQobmJjbHVzdF9wbG90LCBjbHVzdGVycyA+PSAyICYgY2x1c3RlcnMgPD0gNSkNCg0KIyBjcmVhdGUgcGxvdA0KZ2dwbG90KG5iY2x1c3RfcGxvdCkgKw0KICBhZXMoeCA9IGNsdXN0ZXJzKSArDQogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMEwsIGZpbGwgPSAiIzBjNGM4YSIpICsNCiAgbGFicyh4ID0gIk51bWJlciBvZiBjbHVzdGVycyIsIHkgPSAiRnJlcXVlbmN5IGFtb25nIGFsbCBpbmRpY2VzIiwgdGl0bGUgPSAiT3B0aW1hbCBudW1iZXIgb2YgY2x1c3RlcnMiKSArDQogIHRoZW1lX3B1YnIoKQ0KDQojJyBDbHVzdGVyaXphw6fDo28gay1tZWFucw0KIysgZWNobz1ULCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD0xMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRQ0KDQojc2V0LnNlZWQoMTIzKQ0Ka20ucmVzID0ga21lYW5zKGRmLCAzLCBuc3RhcnQ9MjUpDQoja20ucmVzIDwtIGhrbWVhbnMoZGYsIDMsaGMubWV0aG9kID0gIndhcmQuRCIpDQpwcmludChrbS5yZXMpDQoNCiMgZnZpel9jbHVzdGVyKGttLnJlcywgcGFsZXR0ZSA9ICJEYXJrMiIsIHJlcGVsID0gVFJVRSwNCiMgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9jbGFzc2ljKCkpDQojIA0KIyBmdml6X2RlbmQoa20ucmVzLCBjZXggPSAwLjYsIHBhbGV0dGUgPSAiRGFyazIiLCANCiMgICAgICAgICAgIHJlY3QgPSBUUlVFLCByZWN0X2JvcmRlciA9ICJEYXJrMiIsIHJlY3RfZmlsbCA9IFRSVUUpDQoNCiMnIENyaWFuZG8gbm92byBiYW5jbyBkZSBkYWRvcyBjb20gY2x1c3Rlcg0KDQphZ2dyZWdhdGUoZGF0MiwgYnk9bGlzdChjbHVzdGVyPWttLnJlcyRjbHVzdGVyKSwgbWVhbikNCg0KZGQgPC0gY2JpbmQoZGF0MiwgY2x1c3RlciA9IGttLnJlcyRjbHVzdGVyKQ0KDQoNCmttLnJlcyRjbHVzdGVyDQprbS5yZXMkc2l6ZQ0Ka20ucmVzJGNlbnRlcnMNCg0KIycgVml6dWFsaXphbmRvIG9zIGNsdXN0ZXJzDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCg0KZnZpel9jbHVzdGVyKGttLnJlcywgZGF0YT1kZiwNCiAgICAgICAgICAgICBnZW9tLmluZCA9IGMoInRleHQiKSwNCiAgICAgICAgICAgICBlbGxpcHNlLnR5cGU9ImV1Y2xpZCIsDQogICAgICAgICAgICAgc3Rhci5wbG90PVQsDQogICAgICAgICAgICAgcGFsZXR0ZSA9ICJEYXJrMiIsDQogICAgICAgICAgICAgcmVwZWw9VFJVRSwNCiAgICAgICAgICAgICBmb250LmZhbWlseSA9ICJpdGFsaWMiLA0KICAgICAgICAgICAgIGdndGhlbWU9dGhlbWVfcHVicigpKQ0KDQoNCiMnIERlbmRyb2dyYW1hDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmRpc3RhPWRpc3QoZGYsIG1ldGhvZCA9ICJldWNsaWQiKQ0KDQpkaXN0YS5oYz1oY2x1c3QoZD1kaXN0YSwgbWV0aG9kID0gIndhcmQuRCIpDQoNCmZ2aXpfZGVuZChkaXN0YS5oYyxjZXggPTAuNSwgayA9IDMsIGNvbG9yX2xhYmVsc19ieV9rID0gVFJVRSwgdHlwZSA9ICJyZWN0YW5nbGUiKQ0KZnZpel9kZW5kKGRpc3RhLmhjLGNleCA9MC44LCBrID0gMywgY29sb3JfbGFiZWxzX2J5X2sgPSBUUlVFLCB0eXBlID0gInBoeWxvZ2VuaWMiKQ0KZnZpel9kZW5kKGRpc3RhLmhjLGNleCA9MC41LCBrID0gMywgY29sb3JfbGFiZWxzX2J5X2sgPSBUUlVFLCB0eXBlID0gImNpcmN1bGFyIiwgbHdkID0gMSkNCg0KDQpmdml6X2Rpc3QoZGlzdGEsIGdyYWRpZW50ID0gbGlzdChsb3cgPSAiIzAwQUZCQiIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAiI0ZDNEUwNyIpKSsgDQp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLA0KICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSkNCg0KIycgUENBDQojKyBlY2hvPVQsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTEyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFDQoNCmttLnBjYSA8LSBQQ0EoDQogIGRmLA0KICBncmFwaCA9IEYsDQogIHNjYWxlLnVuaXQgPSBUUlVFKQ0KDQplaWcudmFsIDwtIGdldF9laWdlbnZhbHVlKGttLnBjYSkNCmVpZy52YWwNCg0KZnZpel9laWcoa20ucGNhLCBhZGRsYWJlbHM9VFJVRSkNCg0KdmFyIDwtIGdldF9wY2FfdmFyKGttLnBjYSkNCnZhcg0KDQoNCg0KIyAgQ29vcmRlbmFkYXMNCmhlYWQodmFyJGNvb3JkKQ0KIyBDb3MyOiBxdWFsaWRhZGUgbm8gbWFwYSBkbyBmYXRvcg0KaGVhZCh2YXIkY29zMikNCiMgQ29udHJpYnVpw6fDtWVzIHBhcmEgb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFpcw0KaGVhZCh2YXIkY29udHJpYikNCg0KZnZpel9jb3MyKGttLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxOjIpDQoNCmRmICU+JSBjb3IobWV0aG9kID0gInNwZWFybWFuIikgJT4lIGNvcnJwbG90KC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAibnVtYmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAidXBwZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGwucG9zID0gInRkIikNCg0KDQoNCg0Kc3VtbWFyeShrbS5wY2EpDQoNCg0KIyBDb250cmlidWnDp8O1ZXMgZGUgdmFyacOhdmVpcyBwYXJhIFBDMQ0KZnZpel9jb250cmliKGttLnBjYSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCiMgQ29udHJpYnVpw6fDtWVzIGRlIHZhcmnDoXZlaXMgcGFyYSBQQzINCmZ2aXpfY29udHJpYihrbS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMiwgdG9wID0gMTApDQoNCiMgY29udHJpYnVpw6fDo28gdG90YWwgcGFyYSBQQzEgZSBQQzIgDQoNCmZ2aXpfY29udHJpYihrbS5wY2EsIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMToyKQ0KDQoNCmZ2aXpfcGNhX2JpcGxvdCgNCiAga20ucGNhLA0KICBnZW9tLmluZCA9ICJ0ZXh0IiwNCiAgY29sLnZhciA9ICJjb250cmliIiwNCiAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksDQogIGxlZ2VuZC50aXRsZSA9ICJDb250cmlidWnDp8OjbyIsDQogIHBhbGV0dGUgPSAiRGFyazIiLA0KICByZXBlbCA9IEYNCikNCg0KDQpmdml6X3BjYV9pbmQoDQogIGttLnBjYSwNCiAgZ2VvbSA9ICJ0ZXh0IiwNCiAgaGFiaWxsYWdlID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICBhZGRFbGxpcHNlcyA9IFRSVUUsDQogIHJlcGVsID0gVCwNCiAgcGFsZXR0ZSA9ICJEYXJrMiINCikNCg0KZnZpel9wY2FfaW5kKGttLnBjYSwNCiAgICAgICAgICAgICBnZW9tLmluZCA9ICJ0ZXh0IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwgDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkdydXBvcyIsDQogICAgICAgICAgICAgcmVwZWwgPSBULA0KICAgICAgICAgICAgIHBhbGV0dGUgPSAiRGFyazIiDQopDQoNCg0KDQpkZiAlPiUgcGFpcnMucGFuZWxzKC4sIA0KICAgICAgICAgICAgICAgICAgICBzaG93LnBvaW50cz1UUlVFLCANCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInNwZWFybWFuIiwNCiAgICAgICAgICAgICAgICAgICAgZ2FwPTAsIA0KICAgICAgICAgICAgICAgICAgICBzdGFycz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICBjaT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgYWxwaGE9MC4wNSwNCiAgICAgICAgICAgICAgICAgICAgY2V4LmNvcj0xLA0KICAgICAgICAgICAgICAgICAgICBjZXg9MS4wLA0KICAgICAgICAgICAgICAgICAgICBicmVha3M9IlN0dXJnZXMiLA0KICAgICAgICAgICAgICAgICAgICBydWc9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgIGRlbnNpdHk9RiwNCiAgICAgICAgICAgICAgICAgICAgaGlzdC5jb2w9ImRhcmtncmVlbiIsDQogICAgICAgICAgICAgICAgICAgIGZhY3Rvcj01LA0KICAgICAgICAgICAgICAgICAgICBkaWdpdHM9MiwNCiAgICAgICAgICAgICAgICAgICAgZWxsaXBzZXM9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgIHNjYWxlPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBzbW9vdGg9VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgbG09VCwNCiAgICAgICAgICAgICAgICAgICAgY29yPVQNCikgDQoNCg0KZGQucGNhID0gcHJjb21wKGRmLCBzY2FsZSA9IFQpDQoNCg0KZ2diaXBsb3QyKA0KICBkZC5wY2EsDQogIG9icy5zY2FsZSA9IDEsDQogIHZhci5zY2FsZSA9IDEsDQogIGVsbGlwc2UgPSBULA0KICBjaXJjbGUgPSBULA0KICB2YXJuYW1lLmFiYnJldiA9IFQsDQogIGdydXBvcyA9IGFzLmZhY3RvcihkZCRjbHVzdGVyKQ0KKSArIHRoZW1lX3B1YnIoKSArIHNjYWxlX2NvbG9yX2JyZXdlciggcGFsZXR0ZSA9ICdEYXJrMicpDQoNCg0KaW5kIDwtIGdldF9wY2FfaW5kKGttLnBjYSkNCmluZA0KDQoNCiMgQ29vcmRlbmFkYXMgZGUgaW5kaXbDrWR1b3MNCmhlYWQoaW5kJGNvb3JkKQ0KIyBRdWFsaWRhZGUgZG9zIGluZGl2w61kdW9zDQpoZWFkKGluZCRjb3MyKQ0KIyBDb250cmlidWnDp8O1ZXMgZGUgaW5kaXbDrWR1b3MNCmhlYWQoaW5kJGNvbnRyaWIpDQoNCg0KDQpmdml6X3BjYV9pbmQoa20ucGNhLCBjb2wuaW5kID0gImNvczIiLCANCiAgICAgICAgICAgICBncmFkaWVudC5jb2xzID0gYygiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNGQzRFMDciKSwNCiAgICAgICAgICAgICByZXBlbCA9IFRSVUUNCikNCg0KZnZpel9jb250cmliKGttLnBjYSwgY2hvaWNlID0gImluZCIsIGF4ZXMgPSAxOjIpDQoNCg0Kc2V0LnNlZWQoMTIzKQ0KbXkuY29udC52YXIgPC0gcm5vcm0oMzUpDQoNCmZ2aXpfcGNhX2luZChrbS5wY2EsIGNvbC5pbmQgPSBteS5jb250LnZhciwNCiAgICAgICAgICAgICBncmFkaWVudC5jb2xzID0gYygiYmx1ZSIsICJ5ZWxsb3ciLCAicmVkIiksDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkNvbnQuVmFyIikNCg0KDQpmdml6X3BjYV9pbmQoa20ucGNhLA0KICAgICAgICAgICAgIGdlb20uaW5kID0gInBvaW50IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLA0KICAgICAgICAgICAgIHBhbGV0dGUgPSAiRGFyazIiLA0KICAgICAgICAgICAgIGFkZEVsbGlwc2VzID0gVFJVRSwgDQogICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gIkdydXBvcyINCikNCg0KDQpmdml6X3BjYV9iaXBsb3Qoa20ucGNhLCANCiAgICAgICAgICAgICAgICBnZW9tLmluZCA9IGMoInBvaW50IiwidGV4dCIpLA0KICAgICAgICAgICAgICAgIGZpbGwuaW5kID0gYXMuZmFjdG9yKGRkJGNsdXN0ZXIpLCANCiAgICAgICAgICAgICAgICBjb2wuaW5kID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICBwb2ludHNoYXBlID0gMjEsIA0KICAgICAgICAgICAgICAgIHBvaW50c2l6ZSA9IDIsDQogICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJEYXJrMiIsDQogICAgICAgICAgICAgICAgcmVwZWw9RiwNCiAgICAgICAgICAgICAgICBsYWJlbHNpemU9MywNCiAgICAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IEYsDQogICAgICAgICAgICAgICAgYWxwaGEudmFyID0iY29udHJpYiIsIA0KICAgICAgICAgICAgICAgIGNvbC52YXIgPSAiY29udHJpYiIsDQogICAgICAgICAgICAgICAgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksDQogICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gbGlzdChmaWxsID0gIkNsdXN0ZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiQ29udHJpYiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9ICJDb250cmliIikpDQoNCg0KDQoNCg0KIycgDQojJyAjIyAqKlJlZmVyw6puY2lhKioNCiMnIE9zIHByb2NlZGltZW50b3MgZXN0YXTDrXN0aWNvcyB1dGlsaXphZG9zIG5lc3RlIGVzdHVkbyBmb3JhbSByZWFsaXphZG9zIG5vIHByb2dyYW1hIFIgW0BSQ29yZVRlYW1dLiBQYWNvdGUgJ3N0YXRzJzogQ29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRlIFNwZWFybWFuIFtAUkNvcmVUZWFtXS4gUGFjb3RlICcqZ2dwb3QyKic6IGVsZW1lbnRvcyBncsOhZmljb3MgW0BHR1Bsb3QyXS4NCmFudGl0YWINCmFudGl0YWIyDQoNCg0KDQoNCndyaXRlLnhsc3goYW50aXRhYiwgImFudGkueGxzeCIpDQp3cml0ZS54bHN4KGFudGl0YWIyLCAiYW50aTIueGxzeCIpDQoNCg==