variances
d2011 <- read.table("../data-raw/popyt-2011", header = F, sep = ";", dec = ",", stringsAsFactors = F) %>%
select(sekcja = V1, prec = V3) %>%
mutate(rok = 2011)
d2013 <- read_excel("../data-raw/PW_popyt_na_prace_w_2013.xls", col_names = F, skip = 31) %>%
na.omit() %>%
mutate(sekcja = d2011$sekcja) %>%
select(sekcja, prec = 3)%>%
mutate(rok = 2013)
d2014 <- read_excel("../data-raw/popyt_na_prace_2014.xls", col_names = F, skip = 31) %>%
na.omit() %>%
mutate(sekcja = d2011$sekcja) %>%
select(sekcja, prec = 3) %>%
mutate(rok = 2014)
precs <- bind_rows(d2011,d2013, d2014)
precs %>%
spread(rok, prec) %>%
add_row(sekcja = "overall", `2011` = 3.40, `2013` = 4.01, `2014` = 3.98, .before = 1) %>%
xtable(caption = "Estimates on relative standard erros of estimators for vacancies of the demand for labour in IV quarter 2011, 2013 and 2014",
label = "tab-rel-var") %>%
print.xtable(include.rownames = F,
caption.placement = "top")
Read the data
res_cmcgreg1 <- readRDS(file = "../results/res_glm_kod2.rds")
Error: vector memory exhausted (limit reached?)
totals %>%
count(b, rok, wt= hat_wolne) %>%
group_by(rok) %>%
summarise(m = round(mean(n))) %>%
spread(rok, m) %>%
xtable(digits = 0, caption = "Estimated total number of vacancies at the end of 1Q based on the DL survey") %>%
print.xtable(include.rownames = F, caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Sat Jul 27 09:19:44 2019
\begin{table}[ht]
\centering
\caption{Estimated total number of vacancies at the end of 1Q based on the DL survey}
\begin{tabular}{rrr}
\hline
2011 & 2013 & 2014 \\
\hline
71775 & 42889 & 52725 \\
\hline
\end{tabular}
\end{table}
totals %>%
count(b, rok, kod2, wt = hat_wolne) %>%
add_count(b, rok, wt = n, name = "total") %>%
mutate(p = n / total*100) %>%
group_by(kod2) %>%
summarise(pop = mean(p)) %>%
left_join(
final_data %>%
count(rok, kod2) %>%
add_count(rok, wt = n, name = "total") %>%
mutate(p = n / total*100) %>%
group_by(kod2) %>%
summarise(bkl = mean(p))
) %>%
xtable(digits = 2,
caption = "Distribution of occupancy (2 digit codes) in Population and BKL data (average over 2011, 2013 and 2014)") %>%
print.xtable(caption.placement = "top", include.rownames = F)
Joining, by = "kod2"
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 23:42:04 2019
\begin{table}[ht]
\centering
\caption{Distribution of occupancy (2 digit codes) in Population and BKL data (average over 2011, 2013 and 2014)}
\begin{tabular}{lrr}
\hline
kod2 & pop & bkl \\
\hline
11 & 0.49 & 1.68 \\
12 & 1.70 & 2.22 \\
13 & 1.27 & 2.02 \\
14 & 0.29 & 2.78 \\
21 & 4.45 & 4.09 \\
22 & 3.33 & 1.47 \\
23 & 0.91 & 2.00 \\
24 & 6.73 & 14.65 \\
25 & 3.94 & 8.17 \\
26 & 0.71 & 0.91 \\
31 & 1.51 & 1.50 \\
32 & 0.79 & 0.58 \\
33 & 4.37 & 19.33 \\
34 & 0.97 & 0.53 \\
35 & 1.73 & 0.78 \\
41 & 1.41 & 1.82 \\
42 & 5.20 & 2.53 \\
43 & 1.28 & 1.46 \\
44 & 2.52 & 0.51 \\
51 & 2.41 & 3.10 \\
52 & 8.79 & 16.49 \\
54 & 1.28 & 1.16 \\
71 & 9.53 & 1.71 \\
72 & 7.09 & 2.36 \\
73 & 0.72 & 0.25 \\
74 & 2.09 & 1.23 \\
75 & 5.64 & 1.18 \\
81 & 2.71 & 0.35 \\
82 & 2.72 & 0.21 \\
83 & 7.99 & 1.67 \\
91 & 1.35 & 0.19 \\
93 & 2.20 & 0.49 \\
94 & 1.26 & 0.26 \\
96 & 0.60 & 0.31 \\
\hline
\end{tabular}
\end{table}
totals %>%
group_by(rok, b, kod2) %>%
summarise(N = sum(p*hat_wolne)) %>%
group_by(rok, kod2) %>%
summarise(cv = sd(N)/mean(N)*100,
m = mean(N)) %>%
group_by(kod2) %>%
summarise(cv = mean(cv)) %>%
xtable()
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:52:13 2019
\begin{table}[ht]
\centering
\begin{tabular}{rlr}
\hline
& kod2 & cv \\
\hline
1 & 11 & 4.50 \\
2 & 12 & 4.53 \\
3 & 13 & 9.56 \\
4 & 14 & 11.84 \\
5 & 21 & 4.64 \\
6 & 22 & 6.45 \\
7 & 23 & 10.75 \\
8 & 24 & 3.74 \\
9 & 25 & 8.10 \\
10 & 26 & 5.54 \\
11 & 31 & 6.03 \\
12 & 32 & 6.31 \\
13 & 33 & 3.67 \\
14 & 34 & 5.66 \\
15 & 35 & 6.73 \\
16 & 41 & 2.90 \\
17 & 42 & 6.70 \\
18 & 43 & 6.63 \\
19 & 44 & 4.09 \\
20 & 51 & 16.14 \\
21 & 52 & 15.35 \\
22 & 54 & 13.77 \\
23 & 71 & 17.09 \\
24 & 72 & 5.27 \\
25 & 73 & 5.76 \\
26 & 74 & 13.99 \\
27 & 75 & 5.35 \\
28 & 81 & 5.19 \\
29 & 82 & 6.27 \\
30 & 83 & 9.23 \\
31 & 91 & 10.09 \\
32 & 93 & 8.52 \\
33 & 94 & 19.34 \\
34 & 96 & 5.41 \\
\hline
\end{tabular}
\end{table}
Change format of the data
res_calib_t <- transpose(res_calib)
res_lasso1_t <- transpose(res_lasso1)
res_lasso2_t <- transpose(res_lasso2)
res_alasso1_t <- transpose(res_alasso1)
res_cmcgreg1_t <- transpose(res_cmcgreg1)
res_cmcgreg1_t <- readRDS("../results/res_cmcgreg1_wynik_est.rds")
results <- bind_rows(wyn_naive,
wyn_calib_kod2,
wyn_lasso1_kod2,
wyn_lasso2_kod2,
wyn_alasso1_kod2,
wyn_ecmc_kod2) %>%
mutate(komp = case_when(komp == "komp_kulturalne" ~ "Artistic",
komp == "komp_dyspozycyjne"~ "Availability",
komp == "komp_kognitywne" ~ "Cognitive",
komp == "komp_komputerowe" ~ "Computer",
komp == "komp_interpersonalne" ~ "Interpersonal",
komp == "komp_kierownicze" ~ "Managerial",
komp == "komp_matematyczne" ~ "Mathematical",
komp == "komp_biurowe" ~ "Office",
komp == "komp_fizyczne" ~ "Physical",
komp == "komp_indywidualne" ~ "Self-organization",
komp == "komp_techniczne" ~ "Technical"))
results %>%
group_by(komp, estim) %>%
summarise(m = mean(m)*100) %>%
spread(estim, m) %>%
select(comp = komp, naive, greg, ecmc, lasso1, lasso2, alasso1) %>%
xtable(digits = 1,
caption = "Point estimates of fraction of skills for the pooled sample for 2011, 2013 and 2014",
label = "tab-results-pool") %>%
print.xtable(include.rownames = F,
caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:11:46 2019
\begin{table}[ht]
\centering
\caption{Point estimates of fraction of skills for the pooled sample for 2011, 2013 and 2014}
\label{tab-results-pool}
\begin{tabular}{lrrrrrr}
\hline
comp & naive & greg & ecmc & lasso1 & lasso2 & alasso1 \\
\hline
Artistic & 15.8 & 12.3 & 12.4 & 12.5 & 13.0 & 12.5 \\
Availability & 20.9 & 19.8 & 19.7 & 19.6 & 21.5 & 19.5 \\
Cognitive & 20.9 & 14.3 & 14.3 & 14.6 & 14.0 & 14.6 \\
Computer & 33.0 & 22.2 & 22.0 & 22.3 & 23.0 & 22.6 \\
Interpersonal & 53.8 & 34.5 & 34.5 & 35.1 & 35.0 & 34.9 \\
Managerial & 26.2 & 16.7 & 16.5 & 16.8 & 17.7 & 16.8 \\
Mathematical & 0.4 & 0.4 & 0.4 & 0.4 & 0.4 & 0.4 \\
Office & 3.9 & 3.1 & 3.1 & 3.2 & 3.4 & 3.2 \\
Physical & 5.4 & 7.4 & 7.6 & 7.5 & 8.2 & 7.6 \\
Self-organization & 58.6 & 43.8 & 43.5 & 43.9 & 46.2 & 43.8 \\
Technical & 4.3 & 7.5 & 7.7 & 7.7 & 8.3 & 7.7 \\
\hline
\end{tabular}
\end{table}
results %>%
group_by(komp, estim) %>%
summarise(m = sd(m)/mean(m)*100) %>%
spread(estim, m) %>%
select(comp = komp, greg, ecmc, lasso1, lasso2, alasso1) %>%
xtable(digits = 1,
caption = "Average estimates of relative standard errors for skills for over 2011, 2013 and 2014",
label = "tab-results-pool") %>%
print.xtable(include.rownames = F,
caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:12:57 2019
\begin{table}[ht]
\centering
\caption{Average estimates of relative standard errors for skills for over 2011, 2013 and 2014}
\label{tab-results-pool}
\begin{tabular}{lrrrrr}
\hline
comp & greg & ecmc & lasso1 & lasso2 & alasso1 \\
\hline
Artistic & 11.1 & 3.5 & 3.4 & 3.4 & 3.4 \\
Availability & 22.0 & 1.0 & 0.9 & 1.5 & 1.0 \\
Cognitive & 25.4 & 8.5 & 8.1 & 9.3 & 8.2 \\
Computer & 24.9 & 12.9 & 12.4 & 12.7 & 12.4 \\
Interpersonal & 17.6 & 6.6 & 6.3 & 6.6 & 6.4 \\
Managerial & 15.3 & 5.6 & 5.3 & 5.5 & 5.4 \\
Mathematical & 15.6 & 4.1 & 4.0 & 3.2 & 4.1 \\
Office & 33.5 & 4.7 & 4.4 & 4.4 & 4.6 \\
Physical & 32.6 & 4.1 & 4.2 & 4.7 & 4.3 \\
Self-organization & 16.7 & 3.8 & 3.6 & 3.5 & 3.6 \\
Technical & 25.1 & 5.3 & 5.2 & 7.8 & 5.2 \\
\hline
\end{tabular}
\end{table}
ggsave(plot = p, file = "../results/fig-estims.png", width = 13)
Saving 13 x 7 in image
results %>%
group_by(komp, estim) %>%
summarise(m = mean(m)) %>%
group_by(estim) %>%
mutate(r = 12- rank(m, ties.method = "average")) %>%
select(-m) %>%
spread(estim, r) %>%
arrange(naive) %>%
select(komp, naive, greg:lasso2)
AUC
data.frame(lasso1 = do.call('cbind',auc_lasso1) %>% apply(., 2, mean),
lasso2 = do.call('cbind',auc_lasso2) %>% apply(., 2, mean),
alasso1 = do.call('cbind',auc_alasso1) %>% apply(., 2, mean),
komp = komps)%>%
mutate(komp = case_when(komp == "komp_kulturalne" ~ "Artistic",
komp == "komp_dyspozycyjne"~ "Availability",
komp == "komp_kognitywne" ~ "Cognitive",
komp == "komp_komputerowe" ~ "Computer",
komp == "komp_interpersonalne" ~ "Interpersonal",
komp == "komp_kierownicze" ~ "Managerial",
komp == "komp_matematyczne" ~ "Mathematical",
komp == "komp_biurowe" ~ "Office",
komp == "komp_fizyczne" ~ "Physical",
komp == "komp_indywidualne" ~ "Self-organization",
komp == "komp_techniczne" ~ "Technical")) %>%
select(komp, lasso1, lasso2,alasso1) %>%
xtable(digits = 3,
caption = "Quality of the model measured by Area Under Curve (AUC; average over 500 boostrap replicated)",
label = "tab-estim-auc") %>%
print.xtable(include.rownames = F,
caption.placement = "top")
% latex table generated in R 3.5.1 by xtable 1.8-4 package
% Fri Jul 26 22:27:48 2019
\begin{table}[ht]
\centering
\caption{Quality of the model measured by Area Under Curve (AUC; average over 500 boostrap replicated)}
\label{tab-estim-auc}
\begin{tabular}{lrrr}
\hline
komp & lasso1 & lasso2 & alasso1 \\
\hline
Technical & 0.829 & 0.846 & 0.829 \\
Mathematical & 0.784 & 0.818 & 0.784 \\
Artistic & 0.665 & 0.672 & 0.665 \\
Computer & 0.748 & 0.755 & 0.748 \\
Cognitive & 0.644 & 0.654 & 0.644 \\
Managerial & 0.722 & 0.731 & 0.722 \\
Interpersonal & 0.731 & 0.750 & 0.731 \\
Self-organization & 0.695 & 0.708 & 0.695 \\
Physical & 0.687 & 0.713 & 0.687 \\
Availability & 0.605 & 0.635 & 0.604 \\
Office & 0.671 & 0.681 & 0.670 \\
\hline
\end{tabular}
\end{table}
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh4dGFibGUpCmxpYnJhcnkocmVhZHhsKQpgYGAKCgojIHZhcmlhbmNlcwoKYGBge3J9CmQyMDExIDwtIHJlYWQudGFibGUoIi4uL2RhdGEtcmF3L3BvcHl0LTIwMTEiLCBoZWFkZXIgPSBGLCBzZXAgID0gIjsiLCBkZWMgPSAiLCIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKSAlPiUKICBzZWxlY3Qoc2VrY2phID0gVjEsIHByZWMgPSBWMykgJT4lCiAgbXV0YXRlKHJvayA9IDIwMTEpCgpkMjAxMyA8LSByZWFkX2V4Y2VsKCIuLi9kYXRhLXJhdy9QV19wb3B5dF9uYV9wcmFjZV93XzIwMTMueGxzIiwgY29sX25hbWVzID0gRiwgc2tpcCA9IDMxKSAlPiUKICBuYS5vbWl0KCkgJT4lCiAgbXV0YXRlKHNla2NqYSA9IGQyMDExJHNla2NqYSkgJT4lCiAgc2VsZWN0KHNla2NqYSwgcHJlYyA9IDMpJT4lCiAgbXV0YXRlKHJvayA9IDIwMTMpCiAgCmQyMDE0IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEtcmF3L3BvcHl0X25hX3ByYWNlXzIwMTQueGxzIiwgY29sX25hbWVzID0gRiwgc2tpcCA9IDMxKSAlPiUKICBuYS5vbWl0KCkgJT4lCiAgbXV0YXRlKHNla2NqYSA9IGQyMDExJHNla2NqYSkgJT4lCiAgc2VsZWN0KHNla2NqYSwgcHJlYyA9IDMpICU+JQogIG11dGF0ZShyb2sgPSAyMDE0KQoKcHJlY3MgPC0gYmluZF9yb3dzKGQyMDExLGQyMDEzLCBkMjAxNCkKCnByZWNzICU+JSAKICBzcHJlYWQocm9rLCBwcmVjKSAlPiUKICBhZGRfcm93KHNla2NqYSA9ICJvdmVyYWxsIiwgYDIwMTFgID0gMy40MCwgYDIwMTNgID0gNC4wMSwgYDIwMTRgID0gMy45OCwgLmJlZm9yZSA9IDEpICU+JQogIHh0YWJsZShjYXB0aW9uID0gIkVzdGltYXRlcyBvbiByZWxhdGl2ZSBzdGFuZGFyZCBlcnJvcyBvZiBlc3RpbWF0b3JzIGZvciB2YWNhbmNpZXMgb2YgdGhlIGRlbWFuZCBmb3IgbGFib3VyIGluIElWIHF1YXJ0ZXIgMjAxMSwgMjAxMyBhbmQgMjAxNCIsCiAgICAgICAgIGxhYmVsID0gInRhYi1yZWwtdmFyIikgJT4lCiAgcHJpbnQueHRhYmxlKGluY2x1ZGUucm93bmFtZXMgPSBGLAogICAgICAgICAgICAgICBjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiKQpgYGAKClJlYWQgdGhlIGRhdGEKCmBgYHtyfQpyZXNfY2FsaWIgPC0gcmVhZFJEUyhmaWxlID0gIi4uL3Jlc3VsdHMvcmVzX2NhbGliLnJkcyIpCnJlc19sYXNzbzEgPC0gcmVhZFJEUyhmaWxlID0gIi4uL3Jlc3VsdHMvcmVzX2xhc3NvX2tvZDIucmRzIikKcmVzX2xhc3NvMiA8LSByZWFkUkRTKGZpbGUgPSAiLi4vcmVzdWx0cy9yZXNfbGFzc29fa29kMl9uYWNlLnJkcyIpCnJlc19hbGFzc28xIDwtIHJlYWRSRFMoZmlsZSA9ICIuLi9yZXN1bHRzL3Jlc19hbGFzc29fa29kMi5yZHMiKQojcmVzX2NtY2dyZWcxIDwtIHJlYWRSRFMoZmlsZSA9ICIuLi9yZXN1bHRzL3Jlc19nbG1fa29kMi5yZHMiKQpgYGAKCmBgYHtyfQoKCnRvdGFscyA8LSByZWFkUkRTKCIuLi9kYXRhL2d1cy13b2otc2VrLWJvb3QtdG90YWxzLnJkcyIpICU+JQogIGZpbHRlcihzdWJzdHIoa29kMiwxLDEpICE9IDYpICU+JQogIG11dGF0ZShrb2QyID0gaWZlbHNlKGtvZDIgPT0gOTUsIDk2LCBrb2QyKSwKICAgICAgICAga29kMiA9IGlmZWxzZShrb2QyID09IDkyLCA5MSwga29kMiksCiAgICAgICAgIGtvZDIgPSBpZmVsc2Uoa29kMiA9PSA1MywgNTQsIGtvZDIpLAogICAgICAgICAja29kMSA9IGFzLmNoYXJhY3Rlcihrb2QxKSwKICAgICAgICAga29kMiA9IGFzLmNoYXJhY3Rlcihrb2QyKSwKICAgICAgICAgcm9rID0gYXMuY2hhcmFjdGVyKHJvaykpIAoKZmluYWxfZGF0YSA8LSByZWFkUkRTKCIuLi9kYXRhL2JrbC1maW5hbC5yZHMiKSAlPiUKICBmaWx0ZXIoemF3b2QxICE9IDYsIHJvayE9MjAxMiwgbmFjZSAlaW4lIHVuaXF1ZSh0b3RhbHMkc2VrY2phKSkgJT4lCiAgbXV0YXRlKHphd29kMiA9IGlmZWxzZSh6YXdvZDIgPT0gOTUsIDk2LCB6YXdvZDIpLAogICAgICAgICB6YXdvZDIgPSBpZmVsc2UoemF3b2QyID09IDkyLCA5MSwgemF3b2QyKSwKICAgICAgICAgemF3b2QyID0gaWZlbHNlKHphd29kMiA9PSA5OSwgOTYsIHphd29kMiksCiAgICAgICAgIHphd29kMiA9IGlmZWxzZSh6YXdvZDIgPT0gNTMsIDU0LCB6YXdvZDIpLAogICAgICAgICB6ZXJvcyA9IHN0cl9leHRyYWN0KHphd29kNiwgIjArJCIpLAogICAgICAgICB6ZXJvcyA9IHN0cl9jb3VudCh6ZXJvcywgIjAiKSwKICAgICAgICAgemVyb3MgPSBpZmVsc2UoaXMubmEoemVyb3MpLCA2LCA2LXplcm9zKSwKICAgICAgICAgcm9rID0gYXMuY2hhcmFjdGVyKHJvaykpICU+JQogIHJlbmFtZShrb2QxID0gemF3b2QxLAogICAgICAgICBrb2QyID0gemF3b2QyLAogICAgICAgICBrb2Q2ID0gemF3b2Q2LAogICAgICAgICBzZWtjamEgPSBuYWNlKSAgJT4lCiAgZmlsdGVyKHplcm9zID4gMSkgICMjIDEzOCByZWNvcmRzCgpgYGAKCmBgYHtyfQpmaW5hbF9kYXRhICU+JQogIGNvdW50KHplcm9zKQpgYGAKCmBgYHtyfQp0b3RhbHMgJT4lCiAgY291bnQoYiwgcm9rLCB3dD0gaGF0X3dvbG5lKSAlPiUKICBncm91cF9ieShyb2spICU+JQogIHN1bW1hcmlzZShtID0gcm91bmQobWVhbihuKSkpICU+JQogIHNwcmVhZChyb2ssIG0pICU+JQogIHh0YWJsZShkaWdpdHMgPSAwLCBjYXB0aW9uID0gIkVzdGltYXRlZCB0b3RhbCBudW1iZXIgb2YgdmFjYW5jaWVzIGF0IHRoZSBlbmQgb2YgMVEgYmFzZWQgb24gdGhlIERMIHN1cnZleSIpICU+JQogIHByaW50Lnh0YWJsZShpbmNsdWRlLnJvd25hbWVzID0gRiwgY2FwdGlvbi5wbGFjZW1lbnQgPSAidG9wIikKYGBgCgpgYGB7cn0KdG90YWxzICU+JQogIGNvdW50KGIsIHJvaywga29kMiwgd3QgPSBoYXRfd29sbmUpICU+JQogIGFkZF9jb3VudChiLCByb2ssIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogIG11dGF0ZShwID0gbiAvIHRvdGFsKjEwMCkgJT4lCiAgZ3JvdXBfYnkoa29kMikgJT4lCiAgc3VtbWFyaXNlKHBvcCA9IG1lYW4ocCkpICU+JQogIGxlZnRfam9pbigKICAgIGZpbmFsX2RhdGEgJT4lCiAgICAgIGNvdW50KHJvaywga29kMikgJT4lCiAgICAgIGFkZF9jb3VudChyb2ssIHd0ID0gbiwgbmFtZSA9ICJ0b3RhbCIpICU+JQogICAgICBtdXRhdGUocCA9IG4gLyB0b3RhbCoxMDApICU+JQogICAgICBncm91cF9ieShrb2QyKSAlPiUKICAgICAgc3VtbWFyaXNlKGJrbCA9IG1lYW4ocCkpCiAgKSAgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDIsCiAgICAgICAgIGNhcHRpb24gPSAiRGlzdHJpYnV0aW9uIG9mIG9jY3VwYW5jeSAoMiBkaWdpdCBjb2RlcykgaW4gUG9wdWxhdGlvbiBhbmQgQktMIGRhdGEgKGF2ZXJhZ2Ugb3ZlciAyMDExLCAyMDEzIGFuZCAyMDE0KSIpICU+JQogIHByaW50Lnh0YWJsZShjYXB0aW9uLnBsYWNlbWVudCA9ICJ0b3AiLCBpbmNsdWRlLnJvd25hbWVzID0gRikKYGBgCgoKYGBge3J9CnRvdGFscyAlPiUKICBncm91cF9ieShyb2ssIGIsIGtvZDIpICU+JQogIHN1bW1hcmlzZShOID0gc3VtKHAqaGF0X3dvbG5lKSkgJT4lCiAgZ3JvdXBfYnkocm9rLCBrb2QyKSAlPiUKICBzdW1tYXJpc2UoY3YgPSBzZChOKS9tZWFuKE4pKjEwMCwKICAgICAgICAgICAgbSA9IG1lYW4oTikpICU+JQogIGdyb3VwX2J5KHJvaykgJT4lCiAgZG8obSA9IGJyb29tOjp0aWR5KHN1bW1hcnkoLiRjdikpKSAlPiUKICB1bm5lc3QoKSAlPiUKICB4dGFibGUoY2FwdGlvbiA9ICJFc3RpbWF0ZXMgb24gcmVsYXRpdmUgc3RhbmRhcmQgZXJyb3Mgb2YgZXN0aW1hdG9ycyBmb3IgdmFjYW5jaWVzIGJ5IAogICAgICAgICBvY2N1cGF0aW9uICgyIGRpZ2l0IGNvZGUpIGluIElWIHF1YXJ0ZXIgMjAxMSwgMjAxMyBhbmQgMjAxNCIsIAogICAgICAgICBsYWJlbCA9ICJ0YWItb2NjdXAtdmFyIikgJT4lCiAgcHJpbnQueHRhYmxlKGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgICAgICAgICAgICAgIGluY2x1ZGUucm93bmFtZXMgPSBGKQoKdG90YWxzICU+JQogIGdyb3VwX2J5KHJvaywgYiwga29kMikgJT4lCiAgc3VtbWFyaXNlKE4gPSBzdW0ocCpoYXRfd29sbmUpKSAlPiUKICBncm91cF9ieShyb2ssIGtvZDIpICU+JQogIHN1bW1hcmlzZShjdiA9IHNkKE4pL21lYW4oTikqMTAwLAogICAgICAgICAgICBtID0gbWVhbihOKSkgJT4lCiAgZ3JvdXBfYnkoa29kMikgJT4lCiAgc3VtbWFyaXNlKGN2ID0gbWVhbihjdikpICU+JQogIHh0YWJsZSgpCmBgYAoKQ2hhbmdlIGZvcm1hdCBvZiB0aGUgZGF0YQoKYGBge3J9CnJlc19jYWxpYl90IDwtIHRyYW5zcG9zZShyZXNfY2FsaWIpCnJlc19sYXNzbzFfdCA8LSB0cmFuc3Bvc2UocmVzX2xhc3NvMSkKcmVzX2xhc3NvMl90IDwtIHRyYW5zcG9zZShyZXNfbGFzc28yKQpyZXNfYWxhc3NvMV90IDwtIHRyYW5zcG9zZShyZXNfYWxhc3NvMSkKcmVzX2NtY2dyZWcxX3QgPC0gdHJhbnNwb3NlKHJlc19jbWNncmVnMSkKCnJlc19jbWNncmVnMV90IDwtIHJlYWRSRFMoIi4uL3Jlc3VsdHMvcmVzX2NtY2dyZWcxX3d5bmlrX2VzdC5yZHMiKQpgYGAKCmBgYHtyfQpyZXNfY2FsaWJfdCRjYWxpYl9rb2QyICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJncmVnIikgLT4gd3luX2NhbGliX2tvZDIKCgpyZXNfbGFzc28xX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUgCiAgbXV0YXRlKHZhbHMgPSBhcy5udW1lcmljKHZhbHMpKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJsYXNzbzEiKSAtPiB3eW5fbGFzc28xX2tvZDIKCgpyZXNfbGFzc28yX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJsYXNzbzIiKSAtPiB3eW5fbGFzc28yX2tvZDIKCnJlc19hbGFzc28xX3Qkd3luaWtfZXN0ICU+JQogIGJpbmRfcm93cyguaWQgPSAiYm9vdCIpICU+JQogIHNlbGVjdChib290LCByb2ssIHN0YXJ0c193aXRoKCJrb21wIikpICU+JQogIGdhdGhlcihrb21wLCB2YWxzLCBrb21wX3RlY2huaWN6bmU6a29tcF9iaXVyb3dlKSAlPiUKICBhcnJhbmdlKGtvbXAsIGJvb3QpICU+JQogIGdyb3VwX2J5KGtvbXAsIHJvaykgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKHZhbHMpLAogICAgICAgICAgICBiaWFzID0gbWVhbih2YWxzIC0gbWVhbih2YWxzKSksCiAgICAgICAgICAgIHNkID0gc2QodmFscyksCiAgICAgICAgICAgIHJtc2UgPSBzZF4yICsgYmlhc14yLAogICAgICAgICAgICBjdiA9IHNxcnQocm1zZSkvbSoxMDAsCiAgICAgICAgICAgIHEwMjUgPSBxdWFudGlsZSh2YWxzLDAuMDI1KSwKICAgICAgICAgICAgcTk3NSA9IHF1YW50aWxlKHZhbHMsMC45NzUpLAogICAgICAgICAgICBlc3RpbSA9ICJhbGFzc28xIikgLT4gd3luX2FsYXNzbzFfa29kMgoKcmVzX2NtY2dyZWcxX3QgJT4lCiAgYmluZF9yb3dzKC5pZCA9ICJib290IikgJT4lCiAgc2VsZWN0KGJvb3QsIHJvaywgc3RhcnRzX3dpdGgoImtvbXAiKSkgJT4lCiAgZ2F0aGVyKGtvbXAsIHZhbHMsIGtvbXBfdGVjaG5pY3puZTprb21wX2JpdXJvd2UpICU+JQogIGFycmFuZ2Uoa29tcCwgYm9vdCkgJT4lCiAgZ3JvdXBfYnkoa29tcCwgcm9rKSAlPiUKICBzdW1tYXJpc2UobSA9IG1lYW4odmFscyksCiAgICAgICAgICAgIGJpYXMgPSBtZWFuKHZhbHMgLSBtZWFuKHZhbHMpKSwKICAgICAgICAgICAgc2QgPSBzZCh2YWxzKSwKICAgICAgICAgICAgcm1zZSA9IHNkXjIgKyBiaWFzXjIsCiAgICAgICAgICAgIGN2ID0gc3FydChybXNlKS9tKjEwMCwKICAgICAgICAgICAgcTAyNSA9IHF1YW50aWxlKHZhbHMsMC4wMjUpLAogICAgICAgICAgICBxOTc1ID0gcXVhbnRpbGUodmFscywwLjk3NSksCiAgICAgICAgICAgIGVzdGltID0gImVjbWMiKSAtPiB3eW5fZWNtY19rb2QyCgpmaW5hbF9kYXRhICU+JQogIHNlbGVjdChyb2ssIGtvbXBfdGVjaG5pY3puZTprb21wX2JpdXJvd2UpICU+JQogIGdhdGhlcihrb21wLCB2YWwsIC1yb2spICU+JQogIGdyb3VwX2J5KHJvayxrb21wKSAlPiUKICBzdW1tYXJpc2UobSA9IG1lYW4odmFsKSwKICAgICAgICAgICAgZXN0aW0gPSAibmFpdmUiKSAtPiB3eW5fbmFpdmUKYGBgCgoKYGBge3J9CnJlc3VsdHMgPC0gYmluZF9yb3dzKHd5bl9uYWl2ZSwKICAgICAgICAgICAgICAgICAgICAgd3luX2NhbGliX2tvZDIsIAogICAgICAgICAgICAgICAgICAgICB3eW5fbGFzc28xX2tvZDIsIAogICAgICAgICAgICAgICAgICAgICB3eW5fbGFzc28yX2tvZDIsCiAgICAgICAgICAgICAgICAgICAgIHd5bl9hbGFzc28xX2tvZDIsCiAgICAgICAgICAgICAgICAgICAgIHd5bl9lY21jX2tvZDIpICU+JQogIG11dGF0ZShrb21wID0gY2FzZV93aGVuKGtvbXAgPT0gImtvbXBfa3VsdHVyYWxuZSIgfiAiQXJ0aXN0aWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfZHlzcG96eWN5am5lIn4gIkF2YWlsYWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9rb2duaXR5d25lIiB+ICJDb2duaXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfa29tcHV0ZXJvd2UiIH4gIkNvbXB1dGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2ludGVycGVyc29uYWxuZSIgfiAiSW50ZXJwZXJzb25hbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9raWVyb3duaWN6ZSIgfiAiTWFuYWdlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9tYXRlbWF0eWN6bmUiIH4gIk1hdGhlbWF0aWNhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9iaXVyb3dlIiB+ICJPZmZpY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfZml6eWN6bmUiIH4gIlBoeXNpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2luZHl3aWR1YWxuZSIgfiAiU2VsZi1vcmdhbml6YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfdGVjaG5pY3puZSIgIH4gIlRlY2huaWNhbCIpKSAKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBncm91cF9ieShrb21wLCBlc3RpbSkgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKG0pKjEwMCkgJT4lCiAgc3ByZWFkKGVzdGltLCBtKSAlPiUKICBzZWxlY3QoY29tcCA9IGtvbXAsIG5haXZlLCBncmVnLCBlY21jLCBsYXNzbzEsIGxhc3NvMiwgYWxhc3NvMSkgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDEsIAogICAgICAgICBjYXB0aW9uID0gIlBvaW50IGVzdGltYXRlcyBvZiBmcmFjdGlvbiBvZiBza2lsbHMgZm9yIHRoZSBwb29sZWQgc2FtcGxlIGZvciAyMDExLCAyMDEzIGFuZCAyMDE0IiwKICAgICAgICAgbGFiZWwgPSAidGFiLXJlc3VsdHMtcG9vbCIpICAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCmBgYCAKCmBgYHtyfQpyZXN1bHRzICU+JQogIGdyb3VwX2J5KGtvbXAsIGVzdGltKSAlPiUKICBzdW1tYXJpc2UobSA9IHNkKG0pL21lYW4obSkqMTAwKSAlPiUKICBzcHJlYWQoZXN0aW0sIG0pICU+JQogIHNlbGVjdChjb21wID0ga29tcCwgZ3JlZywgZWNtYywgbGFzc28xLCBsYXNzbzIsIGFsYXNzbzEpICU+JQogIHh0YWJsZShkaWdpdHMgPSAxLCAKICAgICAgICAgY2FwdGlvbiA9ICJBdmVyYWdlIGVzdGltYXRlcyBvZiByZWxhdGl2ZSBzdGFuZGFyZCBlcnJvcnMgZm9yIHNraWxscyBmb3Igb3ZlciAyMDExLCAyMDEzIGFuZCAyMDE0IiwKICAgICAgICAgbGFiZWwgPSAidGFiLXJlc3VsdHMtcG9vbCIpICAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCmBgYAoKYGBge3J9CnJlc3VsdHMgJT4lCiAgbXV0YXRlKGVzdGltID0gdG91cHBlcihlc3RpbSksCiAgICAgICAgIGVzdGltID0gZmFjdG9yKGVzdGltLCBjKCJOQUlWRSIsICJHUkVHIiwiRUNNQyIsICJMQVNTTzEiLCJMQVNTTzIiLCJBTEFTU08xIiksCiAgICAgICAgICAgICAgICAgICAgICAgIGMoIkhUU1JTIiwiTUNHUkVHIiwiRUNNQyIsICJFQ0xBU1NPMSIsIkVDTEFTU08yIiwiRUNBTEFTU08xIikpKSAlPiUKICBnZ3Bsb3QoZGF0YSA9IC4sIGFlcyh4ID0gZXN0aW0sIHkgPSBtLCB5bWluID0gcTAyNSwgeW1heCA9IHE5NzUsIGNvbG9yID0gZXN0aW0sIGdyb3VwID0gZXN0aW0pKSArCiAgZ2VvbV9lcnJvcmJhcihwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIiwgbmFtZSA9ICJFc3RpbWF0b3JzIikgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArCiAgZmFjZXRfZ3JpZChyb2t+a29tcCkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQpICsKICBsYWJzKHggPSAiRXN0aW1hdG9ycyIsIHkgPSAiUG9pbnQgZXN0aW1hdGVzIikgICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9MSwgaGp1c3Q9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSAtPiBwCgoKZ2dzYXZlKHBsb3QgPSBwLCBmaWxlID0gIi4uL3Jlc3VsdHMvZmlnLWVzdGltcy5wbmciLCB3aWR0aCA9IDEzKQoKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBtdXRhdGUoZXN0aW0gPSB0b3VwcGVyKGVzdGltKSwKICAgICAgICAgZXN0aW0gPSBmYWN0b3IoZXN0aW0sIGMoIk5BSVZFIiwgIkdSRUciLCJFQ01DIiwgIkxBU1NPMSIsIkxBU1NPMiIsIkFMQVNTTzEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgYygiSFRTUlMiLCJNQ0dSRUciLCJFQ01DIiwgIkVDTEFTU08xIiwiRUNMQVNTTzIiLCJFQ0FMQVNTTzEiKSkpICU+JQogIGdncGxvdChkYXRhID0gLiwgYWVzKHggPSByb2ssIHkgPSBtLCB5bWluID0gcTAyNSwgeW1heCA9IHE5NzUsIGNvbG9yID0gZXN0aW0sIGdyb3VwID0gZXN0aW0pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSArIAogIGZhY2V0X3dyYXAofmtvbXApICsKICBzY2FsZV9jb2xvcl9icmV3ZXIodHlwZSA9ICJxdWFsIiwgcGFsZXR0ZSA9ICJTZXQxIiwgbmFtZSA9ICJFc3RpbWF0b3JzIikgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUG9pbnQgZXN0aW1hdGUiKSAtPiBwCgpnZ3NhdmUocGxvdCA9IHAsIGZpbGUgPSAiLi4vcmVzdWx0cy9maWctZGlzdHMucG5nIiwgaGVpZ2h0ID0gNSkKYGBgCgpgYGB7cn0KcmVzdWx0cyAlPiUKICBncm91cF9ieShrb21wLCBlc3RpbSkgJT4lCiAgc3VtbWFyaXNlKG0gPSBtZWFuKG0pKSAlPiUKICBncm91cF9ieShlc3RpbSkgJT4lCiAgbXV0YXRlKHIgPSAxMi0gcmFuayhtLCB0aWVzLm1ldGhvZCA9ICJhdmVyYWdlIikpICU+JQogIHNlbGVjdCgtbSkgJT4lCiAgc3ByZWFkKGVzdGltLCByKSAlPiUKICBhcnJhbmdlKG5haXZlKSAlPiUKICBzZWxlY3Qoa29tcCwgbmFpdmUsIGdyZWc6bGFzc28yKQpgYGAKCkFVQwpgYGB7cn0KCmtvbXBzIDwtIGMoImtvbXBfdGVjaG5pY3puZSIsICJrb21wX21hdGVtYXR5Y3puZSIsICJrb21wX2t1bHR1cmFsbmUiLCAia29tcF9rb21wdXRlcm93ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21wX2tvZ25pdHl3bmUiLCAia29tcF9raWVyb3duaWN6ZSIsICJrb21wX2ludGVycGVyc29uYWxuZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrb21wX2luZHl3aWR1YWxuZSIsICJrb21wX2Zpenljem5lIiwgImtvbXBfZHlzcG96eWN5am5lIiwgImtvbXBfYml1cm93ZSIpCgphdWNfbGFzc28xIDwtIGxpc3QoKQphdWNfbGFzc28yIDwtIGxpc3QoKQphdWNfYWxhc3NvMSA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTEpIHsKICBhdWNfbGFzc28xW1tpXV0gPC0gcmVzX2xhc3NvMV90JHd5bmlrX21vZGVsICU+JQogICAgbWFwX2RibCh+LltbaV1dJG1ldHJpY3NbLltbaV1dJGJlc3QubWV0cmljLmluZGV4LF0gJT4lIG1heCgpKQogIGF1Y19sYXNzbzJbW2ldXSA8LSByZXNfbGFzc28yX3Qkd3luaWtfbW9kZWwgJT4lCiAgICBtYXBfZGJsKH4uW1tpXV0kbWV0cmljc1suW1tpXV0kYmVzdC5tZXRyaWMuaW5kZXgsXSAlPiUgbWF4KCkpCiAgYXVjX2FsYXNzbzFbW2ldXSA8LSByZXNfYWxhc3NvMV90JHd5bmlrX21vZGVsICU+JQogICAgbWFwX2RibCh+LltbaV1dJG1ldHJpY3NbLltbaV1dJGJlc3QubWV0cmljLmluZGV4LF0gJT4lIG1heCgpKQp9IAoKCmRhdGEuZnJhbWUobGFzc28xID0gZG8uY2FsbCgnY2JpbmQnLGF1Y19sYXNzbzEpICU+JSBhcHBseSguLCAyLCBtZWFuKSwKICAgICAgICAgICBsYXNzbzIgPSBkby5jYWxsKCdjYmluZCcsYXVjX2xhc3NvMikgJT4lIGFwcGx5KC4sIDIsIG1lYW4pLAogICAgICAgICAgIGFsYXNzbzEgPSBkby5jYWxsKCdjYmluZCcsYXVjX2FsYXNzbzEpICU+JSBhcHBseSguLCAyLCBtZWFuKSwKICAgICAgICAgICBrb21wID0ga29tcHMpJT4lCiAgbXV0YXRlKGtvbXAgPSBjYXNlX3doZW4oa29tcCA9PSAia29tcF9rdWx0dXJhbG5lIiB+ICJBcnRpc3RpYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9keXNwb3p5Y3lqbmUifiAiQXZhaWxhYmlsaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2tvZ25pdHl3bmUiIH4gIkNvZ25pdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9rb21wdXRlcm93ZSIgfiAiQ29tcHV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfaW50ZXJwZXJzb25hbG5lIiB+ICJJbnRlcnBlcnNvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2tpZXJvd25pY3plIiB+ICJNYW5hZ2VyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX21hdGVtYXR5Y3puZSIgfiAiTWF0aGVtYXRpY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBrb21wID09ICJrb21wX2JpdXJvd2UiIH4gIk9mZmljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF9maXp5Y3puZSIgfiAiUGh5c2ljYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGtvbXAgPT0gImtvbXBfaW5keXdpZHVhbG5lIiB+ICJTZWxmLW9yZ2FuaXphdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAga29tcCA9PSAia29tcF90ZWNobmljem5lIiAgfiAiVGVjaG5pY2FsIikpICAlPiUKICBzZWxlY3Qoa29tcCwgbGFzc28xLCBsYXNzbzIsYWxhc3NvMSkgJT4lCiAgeHRhYmxlKGRpZ2l0cyA9IDMsIAogICAgICAgICBjYXB0aW9uID0gIlF1YWxpdHkgb2YgdGhlIG1vZGVsIG1lYXN1cmVkIGJ5IEFyZWEgVW5kZXIgQ3VydmUgKEFVQzsgYXZlcmFnZSBvdmVyIDUwMCBib29zdHJhcCByZXBsaWNhdGVkKSIsCiAgICAgICAgIGxhYmVsID0gInRhYi1lc3RpbS1hdWMiKSAlPiUKICBwcmludC54dGFibGUoaW5jbHVkZS5yb3duYW1lcyA9IEYsCiAgICAgICAgICAgICAgIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIpCiAgCgoKCmBgYAoKYGBge3J9CmZpbmFsX2RhdGEgJT4lCiAgZ3JvdXBfYnkocm9rKSAlPiUKICBzdW1tYXJpc2VfYXQodmFycyhjb250YWlucygia29tcCIpKSxzdW0pCmBgYAoK