Figure 3.1: Distribution of Post-Conflict States’ Revenue Sources in Comparison to Other Income Groups, 1989-2010
library(foreign)
library(dplyr)
library(tikzDevice)
library(readr)
library(rio)
library(tidyr)
library(ggplot2)
library(gridExtra)
library(countrycode)
library(forcats)
library(cowplot)
# Load data
load("./data/income_types_WDI.rdta") # this gives the "taxes" data frame
load("./data/diss_df.rda")
# intrastate ucdp country-year data set
# load two small helper function to determine pre- and post-conflict years
ag_seq <- function(x) {
runs <- cumsum(c(0, diff(x) != 1 ))
return(runs)
}
source("./functions/identifyPostConflictYears.R")
# load and wrangle ucdp data
ucdp_cy <- read_csv("./data/133280_onset2012csv.csv") %>%
filter(year > 1989) %>%
arrange(gwno, year) %>%
group_by(gwno) %>%
mutate(iso2c = countrycode(gwno, "cown", "iso2c"),
ucdp_dummy = ifelse(incidencev412 == 1, 1, 0),
pc = pcIdentifier(ucdp_dummy),
pc = ifelse(pc == 2, 1, 0),
conflict_ep_id = cumsum(c(ifelse(first(ucdp_dummy) == 1,
1, 0),
diff(ucdp_dummy) != 0)),
conflict_ep_id = as.numeric(ifelse(ucdp_dummy == 1,
conflict_ep_id,
NA)),
peace_ep_id = cumsum(c(ifelse(first(pc) == 2,
2, 1),
diff(pc) != 0)),
peace_ep_id = as.numeric(ifelse(pc == 1, peace_ep_id, NA)))%>%
group_by(gwno, conflict_ep_id) %>%
mutate(conflict_year = -1 * rev(cumsum(ucdp_dummy == 1))) %>%
group_by(gwno, peace_ep_id) %>%
mutate(peace_year = cumsum(pc == 1)) %>%
group_by(gwno) %>%
mutate(conf_and_peace_years = conflict_year + peace_year,
pc_dummy = pc)
# UN GDP estimates
un_gdp <- read_csv("./data/UNdata_Export_20150703_055055592.csv") %>%
mutate(iso2c = countrycode(`Country or Area`, "country.name", "iso2c"),
year = Year,
gdp = Value)
# Aid
aid <- read.dta("./data/aiddata_full.dta") %>%
dplyr::rename(wb_AidGNI = DT_ODA_ODAT_GN_ZS,
wb_AidPC = DT_ODA_ODAT_PC_ZS,
wb_AidGmentXP = DT_ODA_ODAT_XP_ZS,
oecd_Aid = aid_oecd_commitment2011USD,
oecd_Aid_mill = aid_oecd_commitment2011USD_mill,
aid = commitment_amount_usd_constant,
iso2c = iso2) %>%
select(-population)
# Merge & wrangle data for eventual plotting
taxes <- taxes %>%
rename(tax = GC.TAX.TOTL.GD.ZS,
natres = NY.GDP.TOTL.RT.ZS,
# gdp = NY.GDP.MKTP.CD,
population = SP.POP.TOTL) %>%
filter(region != "Aggregates") %>%
left_join(., ucdp_cy[, c("iso2c", "year", "ucdp_dummy", "pc_dummy")]) %>%
# left_join(., pc_dummy[, c("iso2c", "year", "pc_dummy")]) %>%
left_join(., un_gdp[, c("iso2c", "year", "gdp")]) %>%
left_join(., aid, by = c("iso2c", "year")) %>%
mutate(income = as.character(income),
aid = aid / (gdp * population),
aid = aid * 100) %>%
mutate(income = ifelse(!is.na(ucdp_dummy) & ucdp_dummy == 1, "Conflict-affected", income),
income = ifelse(!is.na(pc_dummy) & pc_dummy == 1, "Post-conflict", income),
income = ifelse(income == "High income: OECD" | income == "High income: nonOECD",
"High Income", income)) %>%
filter(country != "United States" & country != "United Kingdom" & country != "Spain") %>%
filter(population > 500000) %>%
mutate(income = ifelse(country == "Timor-Leste", "Conflict-affected", income),
income = ifelse(country == "Yemen, Rep.", "Conflict-affected", income),
income = ifelse(country == "West Bank and Gaza", "Conflict-affected", income)) %>%
ungroup()
# # take logs
# taxes <- taxes %>%
# mutate(tax = log(tax),
# natres = log(natres + 1),
# aid = log(aid + 1))
#
# this piece calculates means and medians for each distribution
plot_tax_data_median <- taxes %>%
group_by(income) %>%
summarise(median_tax = median(tax, na.rm = T),
median_natres = median(natres, na.rm = T),
median_aid = median(aid, na.rm = T),
mean_tax = mean(tax, na.rm = T),
mean_natres = mean(natres, na.rm = T),
mean_aid = mean(aid, na.rm = T)) %>%
filter(!is.na(median_tax)) %>%
gather(variable, value, 2:7) %>%
separate(variable, c("type", "variable")) %>%
mutate(variable = replace(variable, variable == "tax", values = "Tax Income / GDP"),
variable = replace(variable, variable == "aid", values = "Aid / GDP"),
variable = replace(variable, variable == "natres", values = "Resource Rents / GDP"))
taxes <- taxes %>% left_join(., plot_tax_data_median %>%
filter(type == "mean" & variable == "tax"), all.x = T) %>%
arrange(type, variable, value) %>%
filter(income != "Not classified")
# reorder factors for country group classification
taxes$income <- factor(taxes$income,
levels = c("Conflict-affected",
"Post-conflict",
"Low income",
"Lower middle income",
"Upper middle income",
"High Income"))
# get data in shape for plotting
taxes_gath <- taxes %>%
dplyr::select(iso2c, year, income, aid, natres, tax) %>%
rename(`Aid / GDP` = aid,
`Resource Rents / GDP` = natres,
`Tax Income / GDP` = tax) %>%
gather(variable, value, 4:6 ) %>%
arrange(iso2c, variable, year)
taxes_gath$income <- ordered(taxes_gath$income,
levels = c("Conflict-affected",
"Post-conflict",
"Low income",
"Lower middle income",
"Upper middle income",
"High Income"))
plot_tax_data_median$income <- factor(plot_tax_data_median$income,
levels = c("Conflict-affected",
"Post-conflict",
"Low income",
"Lower middle income",
"Upper middle income",
"High Income"))
# generate final plot
plot_tax <- ggplot(taxes_gath,
aes(x = value, fill = income)) +
geom_histogram(aes(y = ..density..), bins = 20, color = "black") +
facet_grid( income ~ variable, scales = "free") +
geom_vline(data = plot_tax_data_median %>% filter(type == "median"),
aes(xintercept = value),
size = 1, color = "black", linetype = "dashed") +
geom_vline(data = plot_tax_data_median %>% filter(type == "mean"),
aes(xintercept = value),
size = 1, color = "black") +
theme_bw() +
theme(legend.position = "none") +
scale_fill_manual(values = RColorBrewer::brewer.pal(6, "RdYlGn")) +
labs(x = "", y = "") +
theme(text = element_text(size = 13))
# output for manuscript
# library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[16pt]{article}" )
#
# tikz("../figures/taxes.tex", height = 7)
# print(plot_tax)
# dev.off()
# output for replication archive
print(plot_tax)

Figure 3.2: Foreign Aid, Conditionality, and Armed Conflict
# Libraries ---------------------------------------------------------------
library(readxl)
library(dplyr)
library(countrycode)
library(tidyr)
library(ggplot2)
library(foreign)
library(readr)
# Load data
aid <- read.dta("./data/aiddata_full.dta")
# WB and IMF structural adjustment programs -------------------------------
wb_adj <- read_excel("./data/dreherWB_IMF.xls", sheet = "WB adjustment agreed")
imf_adj <- read_excel("./data/dreherWB_IMF.xls", sheet = "IMF PRGF")
# data cleaning
wb_adj <- wb_adj %>% gather(year, WB_adj, `1970.000000`:`2004.000000`) %>%
mutate(year = as.numeric(as.character(year))) %>%
arrange(`Country Name`, year)
imf_adj <- imf_adj %>% gather(year, IMF_adj,`1970.000000`:`2011.000000`) %>%
mutate(year = as.numeric(as.character(year)),
IMF_adj = as.numeric(as.character(IMF_adj))) %>%
arrange(`Country Name`, year)
all_countries <- left_join(wb_adj, imf_adj)
# create data frame with WB Structural Adjustment Dummies
test <- left_join(diss_df, imf_adj, by = c("iso3c" = "Country Code", "year"))
plot_IMF <- test %>%
group_by(Location) %>%
summarise(IMF = ifelse(sum(IMF_adj, na.rm = T) > 0, 1, 0))
# create data frame with IMF SAP dummies
test2 <- left_join(diss_df, wb_adj, by = c("iso3c" = "Country Code", "year"))
plot_WB <- test2 %>%
group_by(Location) %>%
summarise(WB = ifelse(sum(WB_adj, na.rm = T) > 0, 1, 0))
# combine information of IMF and WB adjustment programs
plot_adj_df <- left_join(test, test2 %>%
ungroup() %>%
dplyr::select(year, iso3c, WB_adj)) %>%
mutate(pcsampledummy = 1)
all_countries <- left_join(all_countries,
plot_adj_df[, c("iso3c", "year", "pcsampledummy")],
by = c("Country Code" = "iso3c", "year")) %>%
replace_na(list(pcsampledummy = 0))
# prepare data for plots
all_countries <- all_countries %>%
group_by(year, pcsampledummy) %>%
dplyr::summarise(WB_adj_year = sum(WB_adj, na.rm = T) / n(),
IMF_adj_year = sum(IMF_adj, na.rm = T) / n()) %>%
gather(key = adj_donor, value, -year, -pcsampledummy) %>%
filter(year <= 2004 & year >= 1990)
# generate plot
plot_adj <- ggplot(all_countries %>% filter(adj_donor == "WB_adj_year"),
aes(x = year,
y = value,
color = factor(pcsampledummy))) +
geom_point(size = 2) +
geom_line(size = 0.8) +
scale_color_manual("Sample:",
values = c("#b3cde3", "#e41a1c"),
labels = c("All countries", "Post-Conflict Countries")) +
labs(x = "", y = "Share of \n Structural Adjustment \nPrograms \n per year") +
theme(legend.position = "bottom")
# Democracy Aid -----------------------------------------------------------
dga_plot_df <- diss_df %>%
group_by(year) %>%
summarise(dga_year = sum(dga, na.rm = T),
all_aid = sum(aiddata_Aid, na.rm = T))
dga_plot <- ggplot(dga_plot_df,
aes(x = year,
y = dga_year / 1000000)) +
geom_line(size =0.8) +
geom_point(size = 2) +
labs(x = "", y = "Democracy and Governance Aid \n(in 2011 USD Millions)")
# Aid after conflict ------------------------------------------------------
ag_seq <- function(x) {
runs <- cumsum(c(0, diff(x) != 1 ))
return(runs)
}
source("./functions/identifyPostConflictYears.R")
ucdp_cy <- read_csv("./data/133280_onset2012csv.csv") %>%
arrange(gwno, year) %>%
group_by(gwno) %>%
mutate(iso2c = countrycode(gwno, "cown", "iso2c"),
ucdp_dummy = ifelse(incidencev412 == 1, 1, 0),
pc = pcIdentifier(ucdp_dummy),
pc = ifelse(pc == 2, 1, 0),
conflict_ep_id = cumsum(c(ifelse(first(ucdp_dummy) == 1,
1, 0),
diff(ucdp_dummy) != 0)),
conflict_ep_id = as.numeric(ifelse(ucdp_dummy == 1,
conflict_ep_id,
NA)),
peace_ep_id = cumsum(c(ifelse(first(pc) == 2,
2, 1),
diff(pc) != 0)),
peace_ep_id = as.numeric(ifelse(pc == 1, peace_ep_id, NA)))%>%
group_by(gwno, conflict_ep_id) %>%
mutate(conflict_year = -1 * rev(cumsum(ucdp_dummy == 1))) %>%
group_by(gwno, peace_ep_id) %>%
mutate(peace_year = cumsum(pc == 1)) %>%
group_by(gwno) %>%
mutate(conf_and_peace_years = conflict_year + peace_year)
# add aiddata
ucdp_cy <- left_join(ucdp_cy,
aid,
by = c("iso2c" = "iso2", "year")) %>%
filter(year >= 1989)
ucdp_cy_df <- ucdp_cy %>%
filter(conf_and_peace_years >= -10 &
conf_and_peace_years <= 10 &
conf_and_peace_years != 0) %>%
group_by(conf_and_peace_years)
conf_pc_aid_plot <- ggplot(ucdp_cy_df,
aes(x = conf_and_peace_years,
y = log( commitment_amount_usd_constant / population),
color = factor(pc))) +
# geom_jitter(data = ucdp_cy_df %>%
# filter(log(aiddata_Aid / population) > 0 ),
# width = 0.2,
# alpha = 0.5) +
geom_smooth(data = ucdp_cy_df %>%
filter(pc == 1),
inherit.aes = T,
method = "loess") +
geom_smooth(data = ucdp_cy_df %>%
filter(pc == 0),
method = "loess") +
scale_x_continuous(breaks = -10:10) +
scale_color_manual(values = c( "#fc8d59", "#4575b4")) +
geom_vline(aes(xintercept = 0), color = "#e41a1c") +
theme(legend.position = "none") +
labs(x = "Years before / after end of internal armed conflict",
y = "Aid per capita (log)")
# # aid / GDP
# conf_pc_aidgdp_plot <- ggplot(ucdp_cy_df,
# aes(x = conf_and_peace_years,
# y = log(aiddata_Aid / GDP),
# color = factor(pc))) +
# geom_smooth(data = ucdp_cy_df %>%
# filter(pc == 1),
# inherit.aes = T,
# method = "loess") +
# geom_smooth(data = ucdp_cy_df %>%
# filter(pc == 0),
# method = "loess") +
# scale_x_continuous(breaks = -10:10) +
# scale_color_manual(values = c( "#fc8d59", "#4575b4")) +
# geom_vline(aes(xintercept = 0), color = "#e41a1c") +
# theme(legend.position = "none") +
# labs(x = "Years before / after end of internal armed conflict",
# y = "Aid / GDP (log)")
# Plot --------------------------------------------------------------------
# Output plot for manuscript
# library(tikzDevice)
# library(cowplot)
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
#
# tikz("../figures/WB_IMF.tex", height = 6)
#
#
# plot_grid(plot_adj,
# dga_plot,
# # conf_pc_aid_plot,
# align = "v", nrow = 2)
#
#
# dev.off()
# Output plot for replication archive
library(cowplot)
plot_grid(plot_adj,
dga_plot,
# conf_pc_aid_plot,
align = "v", nrow = 2)

LS0tDQp0aXRsZTogIkNoYXB0ZXIgMzogVGhlb3J5Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KLS0tDQoNCg0KIyBGaWd1cmUgMy4xOiBEaXN0cmlidXRpb24gb2YgUG9zdC1Db25mbGljdCBTdGF0ZXPigJkgUmV2ZW51ZSBTb3VyY2VzIGluIENvbXBhcmlzb24gdG8gT3RoZXIgSW5jb21lIEdyb3VwcywgMTk4OS0yMDEwDQoNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGZpZy5oZWlnaHQ9IDEwfQ0KDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocmlvKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoY293cGxvdCkNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9pbmNvbWVfdHlwZXNfV0RJLnJkdGEiKSAjIHRoaXMgZ2l2ZXMgdGhlICJ0YXhlcyIgZGF0YSBmcmFtZQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBpbnRyYXN0YXRlIHVjZHAgY291bnRyeS15ZWFyIGRhdGEgc2V0DQoNCiMgbG9hZCB0d28gc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBwcmUtIGFuZCBwb3N0LWNvbmZsaWN0IHllYXJzDQphZ19zZXEgPC0gZnVuY3Rpb24oeCkgew0KICBydW5zIDwtIGN1bXN1bShjKDAsIGRpZmYoeCkgIT0gMSApKQ0KICByZXR1cm4ocnVucykNCn0NCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9pZGVudGlmeVBvc3RDb25mbGljdFllYXJzLlIiKQ0KDQoNCiMgbG9hZCBhbmQgd3JhbmdsZSB1Y2RwIGRhdGENCnVjZHBfY3kgPC0gcmVhZF9jc3YoIi4vZGF0YS8xMzMyODBfb25zZXQyMDEyY3N2LmNzdiIpICU+JSANCiAgZmlsdGVyKHllYXIgPiAxOTg5KSAlPiUgDQogIGFycmFuZ2UoZ3dubywgeWVhcikgJT4lIA0KICBncm91cF9ieShnd25vKSAlPiUgDQogIG11dGF0ZShpc28yYyA9IGNvdW50cnljb2RlKGd3bm8sICJjb3duIiwgImlzbzJjIiksDQogICAgICAgICB1Y2RwX2R1bW15ID0gaWZlbHNlKGluY2lkZW5jZXY0MTIgPT0gMSwgMSwgMCksDQogICAgICAgICBwYyA9IHBjSWRlbnRpZmllcih1Y2RwX2R1bW15KSwNCiAgICAgICAgIHBjID0gaWZlbHNlKHBjID09IDIsIDEsIDApLA0KICAgICAgICAgY29uZmxpY3RfZXBfaWQgPSBjdW1zdW0oYyhpZmVsc2UoZmlyc3QodWNkcF9kdW1teSkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmKHVjZHBfZHVtbXkpICE9IDApKSwgDQogICAgICAgICBjb25mbGljdF9lcF9pZCA9IGFzLm51bWVyaWMoaWZlbHNlKHVjZHBfZHVtbXkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2VwX2lkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSwNCiAgICAgICAgIHBlYWNlX2VwX2lkID0gY3Vtc3VtKGMoaWZlbHNlKGZpcnN0KHBjKSA9PSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZihwYykgIT0gMCkpLA0KICAgICAgICAgcGVhY2VfZXBfaWQgPSBhcy5udW1lcmljKGlmZWxzZShwYyA9PSAxLCBwZWFjZV9lcF9pZCwgTkEpKSklPiUgDQogIGdyb3VwX2J5KGd3bm8sIGNvbmZsaWN0X2VwX2lkKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF95ZWFyID0gLTEgKiByZXYoY3Vtc3VtKHVjZHBfZHVtbXkgPT0gMSkpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8sIHBlYWNlX2VwX2lkKSAlPiUgDQogIG11dGF0ZShwZWFjZV95ZWFyID0gY3Vtc3VtKHBjID09IDEpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8pICU+JSANCiAgbXV0YXRlKGNvbmZfYW5kX3BlYWNlX3llYXJzID0gY29uZmxpY3RfeWVhciArIHBlYWNlX3llYXIsIA0KICAgICAgICAgcGNfZHVtbXkgPSBwYykNCg0KDQoNCiMgVU4gR0RQIGVzdGltYXRlcw0KdW5fZ2RwIDwtIHJlYWRfY3N2KCIuL2RhdGEvVU5kYXRhX0V4cG9ydF8yMDE1MDcwM18wNTUwNTU1OTIuY3N2IikgJT4lIA0KICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShgQ291bnRyeSBvciBBcmVhYCwgImNvdW50cnkubmFtZSIsICJpc28yYyIpLA0KICAgICAgICAgeWVhciA9IFllYXIsDQogICAgICAgICBnZHAgPSBWYWx1ZSkNCg0KIyBBaWQNCmFpZCA8LSByZWFkLmR0YSgiLi9kYXRhL2FpZGRhdGFfZnVsbC5kdGEiKSAlPiUgDQogIGRwbHlyOjpyZW5hbWUod2JfQWlkR05JID0gRFRfT0RBX09EQVRfR05fWlMsDQogICAgICAgICAgICAgICAgd2JfQWlkUEMgPSBEVF9PREFfT0RBVF9QQ19aUywNCiAgICAgICAgICAgICAgICB3Yl9BaWRHbWVudFhQID0gRFRfT0RBX09EQVRfWFBfWlMsDQogICAgICAgICAgICAgICAgb2VjZF9BaWQgPSBhaWRfb2VjZF9jb21taXRtZW50MjAxMVVTRCwNCiAgICAgICAgICAgICAgICBvZWNkX0FpZF9taWxsID0gYWlkX29lY2RfY29tbWl0bWVudDIwMTFVU0RfbWlsbCwNCiAgICAgICAgICAgICAgICBhaWQgPSBjb21taXRtZW50X2Ftb3VudF91c2RfY29uc3RhbnQsIA0KICAgICAgICAgICAgICAgIGlzbzJjID0gaXNvMikgJT4lIA0KICBzZWxlY3QoLXBvcHVsYXRpb24pDQoNCiMgTWVyZ2UgJiB3cmFuZ2xlIGRhdGEgZm9yIGV2ZW50dWFsIHBsb3R0aW5nDQp0YXhlcyA8LSB0YXhlcyAlPiUgDQogIHJlbmFtZSh0YXggPSBHQy5UQVguVE9UTC5HRC5aUywNCiAgICAgICAgIG5hdHJlcyA9IE5ZLkdEUC5UT1RMLlJULlpTLA0KIyAgICAgICAgIGdkcCA9IE5ZLkdEUC5NS1RQLkNELA0KICAgICAgICAgcG9wdWxhdGlvbiA9IFNQLlBPUC5UT1RMKSAlPiUgDQogIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUgDQogIGxlZnRfam9pbiguLCB1Y2RwX2N5WywgYygiaXNvMmMiLCAieWVhciIsICJ1Y2RwX2R1bW15IiwgInBjX2R1bW15IildKSAlPiUgDQogICMgbGVmdF9qb2luKC4sIHBjX2R1bW15WywgYygiaXNvMmMiLCAieWVhciIsICJwY19kdW1teSIpXSkgJT4lIA0KICBsZWZ0X2pvaW4oLiwgdW5fZ2RwWywgYygiaXNvMmMiLCAieWVhciIsICJnZHAiKV0pICU+JSANCiAgbGVmdF9qb2luKC4sIGFpZCwgYnkgPSBjKCJpc28yYyIsICJ5ZWFyIikpICU+JSANCiAgbXV0YXRlKGluY29tZSA9IGFzLmNoYXJhY3RlcihpbmNvbWUpLA0KICAgICAgICAgYWlkID0gYWlkIC8gKGdkcCAqIHBvcHVsYXRpb24pLCANCiAgICAgICAgIGFpZCA9IGFpZCAqIDEwMCkgJT4lIA0KICBtdXRhdGUoaW5jb21lID0gaWZlbHNlKCFpcy5uYSh1Y2RwX2R1bW15KSAmIHVjZHBfZHVtbXkgPT0gMSwgIkNvbmZsaWN0LWFmZmVjdGVkIiwgaW5jb21lKSwNCiAgICAgICAgIGluY29tZSA9IGlmZWxzZSghaXMubmEocGNfZHVtbXkpICYgcGNfZHVtbXkgPT0gMSwgIlBvc3QtY29uZmxpY3QiLCBpbmNvbWUpLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSAiSGlnaCBpbmNvbWU6IE9FQ0QiIHwgaW5jb21lID09ICJIaWdoIGluY29tZTogbm9uT0VDRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggSW5jb21lIiwgaW5jb21lKSkgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiVW5pdGVkIFN0YXRlcyIgJiBjb3VudHJ5ICE9ICJVbml0ZWQgS2luZ2RvbSIgJiBjb3VudHJ5ICE9ICJTcGFpbiIpICU+JSANCiAgZmlsdGVyKHBvcHVsYXRpb24gPiA1MDAwMDApICU+JSANCiAgbXV0YXRlKGluY29tZSA9IGlmZWxzZShjb3VudHJ5ID09ICJUaW1vci1MZXN0ZSIsICJDb25mbGljdC1hZmZlY3RlZCIsIGluY29tZSksDQogICAgICAgICBpbmNvbWUgPSBpZmVsc2UoY291bnRyeSA9PSAiWWVtZW4sIFJlcC4iLCAiQ29uZmxpY3QtYWZmZWN0ZWQiLCBpbmNvbWUpLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGNvdW50cnkgPT0gIldlc3QgQmFuayBhbmQgR2F6YSIsICJDb25mbGljdC1hZmZlY3RlZCIsIGluY29tZSkpICU+JSANCiAgdW5ncm91cCgpIA0KDQojICMgdGFrZSBsb2dzDQojIHRheGVzIDwtIHRheGVzICU+JSANCiMgICBtdXRhdGUodGF4ID0gbG9nKHRheCksIA0KIyAgICAgICAgICBuYXRyZXMgPSBsb2cobmF0cmVzICsgMSksIA0KIyAgICAgICAgICBhaWQgPSBsb2coYWlkICsgMSkpDQoNCg0KIyANCg0KIyB0aGlzIHBpZWNlIGNhbGN1bGF0ZXMgbWVhbnMgYW5kIG1lZGlhbnMgZm9yIGVhY2ggZGlzdHJpYnV0aW9uDQpwbG90X3RheF9kYXRhX21lZGlhbiA8LSB0YXhlcyAlPiUgDQogIGdyb3VwX2J5KGluY29tZSkgJT4lIA0KICBzdW1tYXJpc2UobWVkaWFuX3RheCA9IG1lZGlhbih0YXgsIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWRpYW5fbmF0cmVzID0gbWVkaWFuKG5hdHJlcywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG1lZGlhbl9haWQgPSBtZWRpYW4oYWlkLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgbWVhbl90YXggPSBtZWFuKHRheCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG1lYW5fbmF0cmVzID0gbWVhbihuYXRyZXMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWFuX2FpZCA9IG1lYW4oYWlkLCBuYS5ybSA9IFQpKSAlPiUgDQogIGZpbHRlcighaXMubmEobWVkaWFuX3RheCkpICU+JSANCiAgZ2F0aGVyKHZhcmlhYmxlLCB2YWx1ZSwgMjo3KSAlPiUgDQogIHNlcGFyYXRlKHZhcmlhYmxlLCBjKCJ0eXBlIiwgInZhcmlhYmxlIikpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gcmVwbGFjZSh2YXJpYWJsZSwgdmFyaWFibGUgPT0gInRheCIsIHZhbHVlcyA9ICJUYXggSW5jb21lIC8gR0RQIiksDQogICAgICAgICB2YXJpYWJsZSA9IHJlcGxhY2UodmFyaWFibGUsIHZhcmlhYmxlID09ICJhaWQiLCB2YWx1ZXMgPSAiQWlkIC8gR0RQIiksDQogICAgICAgICB2YXJpYWJsZSA9IHJlcGxhY2UodmFyaWFibGUsIHZhcmlhYmxlID09ICJuYXRyZXMiLCB2YWx1ZXMgPSAiUmVzb3VyY2UgUmVudHMgLyBHRFAiKSkNCg0KdGF4ZXMgPC0gdGF4ZXMgJT4lIGxlZnRfam9pbiguLCBwbG90X3RheF9kYXRhX21lZGlhbiAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHR5cGUgPT0gIm1lYW4iICYgdmFyaWFibGUgPT0gInRheCIpLCBhbGwueCA9IFQpICU+JSANCiAgYXJyYW5nZSh0eXBlLCB2YXJpYWJsZSwgdmFsdWUpICU+JSANCiAgZmlsdGVyKGluY29tZSAhPSAiTm90IGNsYXNzaWZpZWQiKQ0KDQojIHJlb3JkZXIgZmFjdG9ycyBmb3IgY291bnRyeSBncm91cCBjbGFzc2lmaWNhdGlvbg0KdGF4ZXMkaW5jb21lIDwtIGZhY3Rvcih0YXhlcyRpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJDb25mbGljdC1hZmZlY3RlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0LWNvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvdyBpbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG93ZXIgbWlkZGxlIGluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBJbmNvbWUiKSkNCg0KIyBnZXQgZGF0YSBpbiBzaGFwZSBmb3IgcGxvdHRpbmcNCnRheGVzX2dhdGggPC0gdGF4ZXMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGlzbzJjLCB5ZWFyLCBpbmNvbWUsIGFpZCwgbmF0cmVzLCB0YXgpICU+JSANCiAgcmVuYW1lKGBBaWQgLyBHRFBgID0gYWlkLA0KICAgICAgICAgYFJlc291cmNlIFJlbnRzIC8gR0RQYCA9IG5hdHJlcywNCiAgICAgICAgYFRheCBJbmNvbWUgLyBHRFBgID0gdGF4KSAlPiUgDQogIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIDQ6NiApICU+JSANCiAgYXJyYW5nZShpc28yYywgdmFyaWFibGUsIHllYXIpIA0KDQoNCnRheGVzX2dhdGgkaW5jb21lIDwtIG9yZGVyZWQodGF4ZXNfZ2F0aCRpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkNvbmZsaWN0LWFmZmVjdGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1jb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvdyBpbmNvbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWdoIEluY29tZSIpKQ0KDQoNCnBsb3RfdGF4X2RhdGFfbWVkaWFuJGluY29tZSA8LSBmYWN0b3IocGxvdF90YXhfZGF0YV9tZWRpYW4kaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ29uZmxpY3QtYWZmZWN0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1jb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3cgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG93ZXIgbWlkZGxlIGluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBJbmNvbWUiKSkNCiMgZ2VuZXJhdGUgZmluYWwgcGxvdA0KDQpwbG90X3RheCA8LSBnZ3Bsb3QodGF4ZXNfZ2F0aCwgDQogICAgICAgICAgICAgICAgICAgYWVzKHggPSB2YWx1ZSwgZmlsbCA9IGluY29tZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW5zID0gMjAsIGNvbG9yID0gImJsYWNrIikgKyANCiAgZmFjZXRfZ3JpZCggaW5jb21lIH4gdmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIikgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBwbG90X3RheF9kYXRhX21lZGlhbiAlPiUgZmlsdGVyKHR5cGUgPT0gIm1lZGlhbiIpLCANCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZhbHVlKSwNCiAgICAgICAgICAgICBzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21fdmxpbmUoZGF0YSA9IHBsb3RfdGF4X2RhdGFfbWVkaWFuICU+JSBmaWx0ZXIodHlwZSA9PSAibWVhbiIpLCANCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZhbHVlKSwNCiAgICAgICAgICAgICBzaXplID0gMSwgY29sb3IgPSAiYmxhY2siKSArDQogIA0KICB0aGVtZV9idygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg2LCAiUmRZbEduIikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpDQoNCiMgb3V0cHV0IGZvciBtYW51c2NyaXB0DQojIGxpYnJhcnkodGlrekRldmljZSkNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzE2cHRde2FydGljbGV9IiApDQojIA0KIyB0aWt6KCIuLi9maWd1cmVzL3RheGVzLnRleCIsIGhlaWdodCA9IDcpDQojIHByaW50KHBsb3RfdGF4KQ0KIyBkZXYub2ZmKCkNCg0KIyBvdXRwdXQgZm9yIHJlcGxpY2F0aW9uIGFyY2hpdmUNCnByaW50KHBsb3RfdGF4KQ0KDQpgYGANCg0KDQoNCjwhLS0gKk5vdGUgZnJvbSB0aGUgbWFudXNjcmlwdDoqIFRoZSBoaXN0b2dyYW1zIHJlZmxlY3QgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgeCB2YWx1ZXMgKGkuZS4gVGF4ZXMsIE5hdHVyYWwgUmVzb3VyY2UgUmVudHMgcGVyIEdEUCwgYW5kIEFpZCAvIEdEUCkuIFRoZSB5LWF4aXMgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbnMgaW4gdGhlIGNhdGVnb3J5LiBTaW5jZSB0aGUgbWF4aW11bSBwZXJjZW50YWdlIHNjb3JlIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHJlc3BlY3RpdmUgZGlzdHJpYnV0aW9uLCB0aGUgeS1heGVzIGhhdmUgZGlmZmVyZW50IHNjYWxlcyBpbiB0aGUgcmVzcGVjdGl2ZSBjb3VudHJ5IGNhdGVnb3JpZXMuIFRoZSBzb2xpZCB2ZXJ0aWNhbCBsaW5lIGluZGljYXRlcyB0aGUgbWVhbiBvZiBlYWNoIGRpc3RyaWJ1dGlvbjsgdGhlIGRhc2hlZCBsaW5lIGluZGljYXRlcyB0aGUgbWVkaWFuLiAtLT4NCg0KPCEtLSAqSW50ZXJwcmV0YXRpb246KiBNYW55IHZhbHVlcyB0byB0aGUgbGVmdCBpbmRpY2F0ZSBsaXR0bGUgaW5jb21lIGZyb20gdGhlIHJlc3BlY3RpdmUgcmVzb3VyY2UgdHlwZSBpbiBhIGdpdmVuIGNvdW50cnkgY2F0ZWdvcnkgKGkuZS4gdGhlIHN0cm9uZ2x5IHJpZ2h0LXNrZXdlZCBkaXN0cmlidXRpb24gb2YgcmVzb3VyY2UgcmVudHMgaW4gaGlnaC1pbmNvbWUgY291bnRyaWVzIChtaWRkbGUgY29sdW1uLCBib3R0b20gcm93KSBpbmRpY2F0ZXMgdGhhdCBvbmx5IHZlcnkgZmV3IGhpZ2gtaW5jb21lIGNvdW50cmllcyByZWNlaXZlIGluY29tZSBmcm9tIG5hdHVyYWwgcmVzb3VyY2VzKSwgYW5kIHZpY2UgdmVyc2EuICAtLT4NCg0KDQojIEZpZ3VyZSAzLjI6IEZvcmVpZ24gQWlkLCBDb25kaXRpb25hbGl0eSwgYW5kIEFybWVkIENvbmZsaWN0DQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcuaGVpZ2h0PSA2fQ0KDQojIExpYnJhcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KHJlYWRyKQ0KDQojIExvYWQgZGF0YQ0KDQphaWQgPC0gcmVhZC5kdGEoIi4vZGF0YS9haWRkYXRhX2Z1bGwuZHRhIikNCg0KIyBXQiBhbmQgSU1GIHN0cnVjdHVyYWwgYWRqdXN0bWVudCBwcm9ncmFtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCndiX2FkaiA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZHJlaGVyV0JfSU1GLnhscyIsIHNoZWV0ID0gIldCIGFkanVzdG1lbnQgYWdyZWVkIikNCg0KaW1mX2FkaiA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZHJlaGVyV0JfSU1GLnhscyIsIHNoZWV0ID0gIklNRiBQUkdGIikNCg0KIyBkYXRhIGNsZWFuaW5nDQp3Yl9hZGogPC0gd2JfYWRqICU+JSBnYXRoZXIoeWVhciwgV0JfYWRqLCAgYDE5NzAuMDAwMDAwYDpgMjAwNC4wMDAwMDBgKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeWVhcikpKSAlPiUgDQogIGFycmFuZ2UoYENvdW50cnkgTmFtZWAsIHllYXIpDQogIA0KaW1mX2FkaiA8LSBpbWZfYWRqICU+JSBnYXRoZXIoeWVhciwgSU1GX2FkaixgMTk3MC4wMDAwMDBgOmAyMDExLjAwMDAwMGApICU+JSANCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih5ZWFyKSksDQogICAgICAgICBJTUZfYWRqID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoSU1GX2FkaikpKSAlPiUgDQogIGFycmFuZ2UoYENvdW50cnkgTmFtZWAsIHllYXIpDQoNCmFsbF9jb3VudHJpZXMgPC0gbGVmdF9qb2luKHdiX2FkaiwgaW1mX2FkaikNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIFdCIFN0cnVjdHVyYWwgQWRqdXN0bWVudCBEdW1taWVzDQp0ZXN0IDwtIGxlZnRfam9pbihkaXNzX2RmLCBpbWZfYWRqLCBieSA9IGMoImlzbzNjIiA9ICJDb3VudHJ5IENvZGUiLCAieWVhciIpKQ0KcGxvdF9JTUYgPC0gdGVzdCAlPiUgDQogIGdyb3VwX2J5KExvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShJTUYgPSBpZmVsc2Uoc3VtKElNRl9hZGosIG5hLnJtID0gVCkgPiAwLCAxLCAwKSkNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIElNRiBTQVAgZHVtbWllcw0KdGVzdDIgPC0gbGVmdF9qb2luKGRpc3NfZGYsIHdiX2FkaiwgYnkgPSBjKCJpc28zYyIgPSAiQ291bnRyeSBDb2RlIiwgInllYXIiKSkNCnBsb3RfV0IgPC0gdGVzdDIgJT4lIA0KICBncm91cF9ieShMb2NhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoV0IgPSBpZmVsc2Uoc3VtKFdCX2FkaiwgbmEucm0gPSBUKSA+IDAsIDEsIDApKQ0KDQoNCiMgY29tYmluZSBpbmZvcm1hdGlvbiBvZiBJTUYgYW5kIFdCIGFkanVzdG1lbnQgcHJvZ3JhbXMNCnBsb3RfYWRqX2RmIDwtIGxlZnRfam9pbih0ZXN0LCB0ZXN0MiAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lICANCiAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoeWVhciwgaXNvM2MsIFdCX2FkaikpICU+JSANCiAgbXV0YXRlKHBjc2FtcGxlZHVtbXkgPSAxKQ0KDQphbGxfY291bnRyaWVzIDwtIGxlZnRfam9pbihhbGxfY291bnRyaWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfYWRqX2RmWywgYygiaXNvM2MiLCAieWVhciIsICJwY3NhbXBsZWR1bW15IildLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiQ291bnRyeSBDb2RlIiA9ICJpc28zYyIsICJ5ZWFyIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHBjc2FtcGxlZHVtbXkgPSAwKSkNCg0KIyBwcmVwYXJlIGRhdGEgZm9yIHBsb3RzDQphbGxfY291bnRyaWVzIDwtIGFsbF9jb3VudHJpZXMgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBwY3NhbXBsZWR1bW15KSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpc2UoV0JfYWRqX3llYXIgPSBzdW0oV0JfYWRqLCBuYS5ybSA9IFQpIC8gbigpLA0KICAgICAgICAgICAgSU1GX2Fkal95ZWFyID0gc3VtKElNRl9hZGosIG5hLnJtID0gVCkgLyBuKCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFkal9kb25vciwgdmFsdWUsIC15ZWFyLCAtcGNzYW1wbGVkdW1teSkgJT4lIA0KICBmaWx0ZXIoeWVhciA8PSAyMDA0ICYgeWVhciA+PSAxOTkwKQ0KDQoNCiMgZ2VuZXJhdGUgcGxvdA0KcGxvdF9hZGogPC0gZ2dwbG90KGFsbF9jb3VudHJpZXMgJT4lIGZpbHRlcihhZGpfZG9ub3IgPT0gIldCX2Fkal95ZWFyIiksIA0KICAgICAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSB2YWx1ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZmFjdG9yKHBjc2FtcGxlZHVtbXkpKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIlNhbXBsZToiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWxsIGNvdW50cmllcyIsICJQb3N0LUNvbmZsaWN0IENvdW50cmllcyIpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIlNoYXJlIG9mIFxuIFN0cnVjdHVyYWwgQWRqdXN0bWVudCBcblByb2dyYW1zIFxuIHBlciB5ZWFyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgDQoNCg0KIyBEZW1vY3JhY3kgQWlkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmRnYV9wbG90X2RmIDwtIGRpc3NfZGYgJT4lIA0KICBncm91cF9ieSh5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShkZ2FfeWVhciA9IHN1bShkZ2EsIG5hLnJtID0gVCksDQogICAgICAgICAgICBhbGxfYWlkID0gc3VtKGFpZGRhdGFfQWlkLCBuYS5ybSA9IFQpKQ0KDQpkZ2FfcGxvdCA8LSBnZ3Bsb3QoZGdhX3Bsb3RfZGYsIA0KICAgICAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSBkZ2FfeWVhciAvIDEwMDAwMDApKSArDQogIGdlb21fbGluZShzaXplID0wLjgpICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRGVtb2NyYWN5IGFuZCBHb3Zlcm5hbmNlIEFpZCBcbihpbiAyMDExIFVTRCBNaWxsaW9ucykiKQ0KDQoNCg0KDQojIEFpZCBhZnRlciBjb25mbGljdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYWdfc2VxIDwtIGZ1bmN0aW9uKHgpIHsNCiAgcnVucyA8LSBjdW1zdW0oYygwLCBkaWZmKHgpICE9IDEgKSkNCiAgcmV0dXJuKHJ1bnMpDQp9DQoNCnNvdXJjZSgiLi9mdW5jdGlvbnMvaWRlbnRpZnlQb3N0Q29uZmxpY3RZZWFycy5SIikNCg0KdWNkcF9jeSA8LSByZWFkX2NzdigiLi9kYXRhLzEzMzI4MF9vbnNldDIwMTJjc3YuY3N2IikgJT4lIA0KICBhcnJhbmdlKGd3bm8sIHllYXIpICU+JSANCiAgZ3JvdXBfYnkoZ3dubykgJT4lIA0KICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShnd25vLCAiY293biIsICJpc28yYyIpLA0KICAgICAgICAgdWNkcF9kdW1teSA9IGlmZWxzZShpbmNpZGVuY2V2NDEyID09IDEsIDEsIDApLA0KICAgICAgICAgcGMgPSBwY0lkZW50aWZpZXIodWNkcF9kdW1teSksDQogICAgICAgICBwYyA9IGlmZWxzZShwYyA9PSAyLCAxLCAwKSwNCiAgICAgICAgIGNvbmZsaWN0X2VwX2lkID0gY3Vtc3VtKGMoaWZlbHNlKGZpcnN0KHVjZHBfZHVtbXkpID09IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZih1Y2RwX2R1bW15KSAhPSAwKSksIA0KICAgICAgICAgY29uZmxpY3RfZXBfaWQgPSBhcy5udW1lcmljKGlmZWxzZSh1Y2RwX2R1bW15ID09IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9lcF9pZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSksDQogICAgICAgICBwZWFjZV9lcF9pZCA9IGN1bXN1bShjKGlmZWxzZShmaXJzdChwYykgPT0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYocGMpICE9IDApKSwNCiAgICAgICAgIHBlYWNlX2VwX2lkID0gYXMubnVtZXJpYyhpZmVsc2UocGMgPT0gMSwgcGVhY2VfZXBfaWQsIE5BKSkpJT4lIA0KICBncm91cF9ieShnd25vLCBjb25mbGljdF9lcF9pZCkgJT4lIA0KICBtdXRhdGUoY29uZmxpY3RfeWVhciA9IC0xICogcmV2KGN1bXN1bSh1Y2RwX2R1bW15ID09IDEpKSkgJT4lIA0KICBncm91cF9ieShnd25vLCBwZWFjZV9lcF9pZCkgJT4lIA0KICBtdXRhdGUocGVhY2VfeWVhciA9IGN1bXN1bShwYyA9PSAxKSkgJT4lIA0KICBncm91cF9ieShnd25vKSAlPiUgDQogIG11dGF0ZShjb25mX2FuZF9wZWFjZV95ZWFycyA9IGNvbmZsaWN0X3llYXIgKyBwZWFjZV95ZWFyKQ0KDQojIGFkZCBhaWRkYXRhDQoNCg0KdWNkcF9jeSA8LSBsZWZ0X2pvaW4odWNkcF9jeSwgDQogICAgICAgICAgICAgICAgICAgICBhaWQsIA0KICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJpc28yYyIgPSAiaXNvMiIsICJ5ZWFyIikpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMTk4OSkNCg0KdWNkcF9jeV9kZiA8LSB1Y2RwX2N5ICU+JSANCiAgZmlsdGVyKGNvbmZfYW5kX3BlYWNlX3llYXJzID49IC0xMCAmDQogICAgICAgICAgIGNvbmZfYW5kX3BlYWNlX3llYXJzIDw9IDEwICYNCiAgICAgICAgICAgY29uZl9hbmRfcGVhY2VfeWVhcnMgIT0gMCkgJT4lIA0KICBncm91cF9ieShjb25mX2FuZF9wZWFjZV95ZWFycykgDQoNCg0KY29uZl9wY19haWRfcGxvdCA8LSBnZ3Bsb3QodWNkcF9jeV9kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNvbmZfYW5kX3BlYWNlX3llYXJzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nKCBjb21taXRtZW50X2Ftb3VudF91c2RfY29uc3RhbnQgLyBwb3B1bGF0aW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGZhY3RvcihwYykpKSArICANCiAgIyBnZW9tX2ppdHRlcihkYXRhID0gdWNkcF9jeV9kZiAlPiUgDQogICMgICAgICAgICAgICAgICBmaWx0ZXIobG9nKGFpZGRhdGFfQWlkIC8gcG9wdWxhdGlvbikgPiAwICksDQogICMgICAgICAgICAgICAgd2lkdGggPSAwLjIsDQogICMgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgIA0KICBnZW9tX3Ntb290aChkYXRhID0gdWNkcF9jeV9kZiAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHBjID09IDEpLCANCiAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBULCANCiAgICAgICAgICAgICAgbWV0aG9kID0gImxvZXNzIikgKyAgDQogIGdlb21fc21vb3RoKGRhdGEgPSB1Y2RwX2N5X2RmICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocGMgPT0gMCksDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IC0xMDoxMCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyggIiNmYzhkNTkiLCAiIzQ1NzViNCIpKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAwKSwgY29sb3IgPSAiI2U0MWExYyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9ICJZZWFycyBiZWZvcmUgLyBhZnRlciBlbmQgb2YgaW50ZXJuYWwgYXJtZWQgY29uZmxpY3QiLA0KICAgICAgIHkgPSAiQWlkIHBlciBjYXBpdGEgKGxvZykiKQ0KDQojICMgYWlkIC8gR0RQDQojIGNvbmZfcGNfYWlkZ2RwX3Bsb3QgPC0gZ2dwbG90KHVjZHBfY3lfZGYsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNvbmZfYW5kX3BlYWNlX3llYXJzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2coYWlkZGF0YV9BaWQgLyBHRFApLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBmYWN0b3IocGMpKSkgKyAgDQojICAgZ2VvbV9zbW9vdGgoZGF0YSA9IHVjZHBfY3lfZGYgJT4lIA0KIyAgICAgICAgICAgICAgICAgZmlsdGVyKHBjID09IDEpLCANCiMgICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IFQsIA0KIyAgICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIpICsgIA0KIyAgIGdlb21fc21vb3RoKGRhdGEgPSB1Y2RwX2N5X2RmICU+JSANCiMgICAgICAgICAgICAgICAgIGZpbHRlcihwYyA9PSAwKSwNCiMgICAgICAgICAgICAgICBtZXRob2QgPSAibG9lc3MiKSArDQojICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IC0xMDoxMCkgKw0KIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCAiI2ZjOGQ1OSIsICIjNDU3NWI0IikpICsNCiMgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gMCksIGNvbG9yID0gIiNlNDFhMWMiKSArDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQojICAgbGFicyh4ID0gIlllYXJzIGJlZm9yZSAvIGFmdGVyIGVuZCBvZiBpbnRlcm5hbCBhcm1lZCBjb25mbGljdCIsDQojICAgICAgICB5ID0gIkFpZCAvIEdEUCAobG9nKSIpDQoNCg0KIyBQbG90IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgT3V0cHV0IHBsb3QgZm9yIG1hbnVzY3JpcHQNCiMgbGlicmFyeSh0aWt6RGV2aWNlKQ0KIyBsaWJyYXJ5KGNvd3Bsb3QpDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyANCiMgdGlreigiLi4vZmlndXJlcy9XQl9JTUYudGV4IiwgaGVpZ2h0ID0gNikNCiMgDQojIA0KIyBwbG90X2dyaWQocGxvdF9hZGosIA0KIyAgICAgICAgICAgZGdhX3Bsb3QsIA0KIyAgICAgICAgICAgIyBjb25mX3BjX2FpZF9wbG90LA0KIyAgICAgICAgICAgYWxpZ24gPSAidiIsIG5yb3cgPSAyKQ0KIyANCiMgDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBwbG90IGZvciByZXBsaWNhdGlvbiBhcmNoaXZlDQpsaWJyYXJ5KGNvd3Bsb3QpDQoNCnBsb3RfZ3JpZChwbG90X2FkaiwgDQogICAgICAgICAgZGdhX3Bsb3QsIA0KICAgICAgICAgICMgY29uZl9wY19haWRfcGxvdCwNCiAgICAgICAgICBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIpDQoNCg0KYGBgDQoNCg==