library(tidyverse)
library(canaryNGOs)
library(brms)
library(broom)
library(tidybayes)
library(sf)
library(scico)
library(scales)
library(patchwork)
library(ggtext)
library(here)
CHAINS <- 4
ITER <- 2000
WARMUP <- 1000
BAYES_SEED <- 1234
options(mc.cores = parallel::detectCores()) # Use all cores
canary <- read_rds(here("data", "derived_data", "canary_clean.rds"))
# https://www.naturalearthdata.com/downloads/110m-cultural-vectors/
country_borders <- read_sf(here("data", "raw_data", "Natural Earth",
"ne_110m_admin_0_countries",
"ne_110m_admin_0_countries.shp"))
Civil society restrictions over time
things_to_map <- canary %>%
filter(year %in% c(2000, 2014)) %>%
select(country, year, iso3, barriers_total, PTS_factor, v2csreprss) %>%
pivot_wider(names_from = year, values_from = c(barriers_total, PTS_factor, v2csreprss)) %>%
mutate(new_laws = barriers_total_2014 - barriers_total_2000,
new_laws = ifelse(new_laws <= 0, 0, new_laws),
new_laws = ceiling(new_laws)) %>%
mutate(diff_csrepress = v2csreprss_2014 - v2csreprss_2000,
diff_csrepress_trunc = case_when(
diff_csrepress >= 2 ~ 2,
diff_csrepress <= -2 ~ -2,
TRUE ~ diff_csrepress
)) %>%
mutate(pct_change_csrepress = diff_csrepress / v2csreprss_2000,
pct_change_csrepress_trunc = case_when(
pct_change_csrepress >= 5 ~ 5,
pct_change_csrepress <= -5 ~ -5,
TRUE ~ pct_change_csrepress
))
map_data <- country_borders %>%
left_join(things_to_map, by = c("ADM0_A3_IS" = "iso3")) %>%
filter(ISO_A3 != "ATA")
Legislation
map_ngo_laws <- ggplot() +
geom_sf(data = map_data, aes(fill = factor(new_laws)),
color = "black", size = 0.1) +
coord_sf(crs = 54030, datum = NA, expand = FALSE) +
scale_fill_manual(values = seq_gradient_pal("#FFFFFF", "#BF0404")(seq(0, 1, length.out = 7)),
na.value = "grey80", breaks = 0:6) +
# scale_fill_manual(values = scico(7, palette = "devon", direction = -1),
# na.value = "grey80", breaks = 0:6) +
guides(fill = guide_legend(nrow = 1, label.position = "bottom",
keywidth = unit(1, units = "lines"),
keyheight = unit(0.6, units = "lines"))) +
labs(fill = "Restrictive NGO laws passed between 2000 and 2014") +
theme_ngo() +
theme(panel.border = element_blank(),
legend.box.margin = margin(t = 5),
legend.spacing.x = unit(0, "pt"),
legend.title = element_textbox_simple(halign = 1,
lineheight = 1.3,
minwidth = unit(2, "lines"),
maxwidth = unit(10, "lines"),
padding = margin(r = 10)))
map_ngo_laws

Civil society repression
map_cs_repression <- ggplot() +
geom_sf(data = map_data, aes(fill = diff_csrepress_trunc),
color = "black", size = 0.1) +
coord_sf(crs = 54030, datum = NA, expand = FALSE) +
scale_fill_scico(palette = "vik", direction = -1,
limits = c(-1, 1) * max(abs(map_data$diff_csrepress_trunc), na.rm = TRUE),
breaks = seq(-4, 4, 1), na.value = "grey80") +
guides(fill = guide_colorbar(reverse = TRUE, ticks = FALSE,
barwidth = unit(7, units = "lines"),
barheight = unit(0.5, units = "lines"))) +
labs(fill = "Change in V-Dem civil society repression between 2000 and 2014") +
theme_ngo() +
theme(panel.border = element_blank(),
legend.box.margin = margin(t = 5),
legend.title = element_textbox_simple(halign = 1,
lineheight = 1.3,
minwidth = unit(2, "lines"),
maxwidth = unit(12, "lines"),
padding = margin(r = 10)))
map_cs_repression

Conflict and civil society restrictions
diff_cs_conflict <- brm(
bf(v2csreprss ~ 0 + armed_conflict, sigma ~ 0 + armed_conflict),
family = student,
data = select(canary, v2csreprss, armed_conflict),
prior = c(
# Set group mean prior
set_prior("normal(0, 1)", class = "b", lb = -4, ub = 4),
# Set group variance priors. We keep the less informative cauchy(0, 1).
set_prior("cauchy(0, 1)", class = "b", dpar = "sigma"),
set_prior("exponential(1.0/29)", class = "nu")
),
chains = CHAINS, iter = ITER, warmup = WARMUP, seed = BAYES_SEED,
file = here("analysis", "cache", "diff_cs_conflict")
)
diff_cs_conflict_summary <- diff_cs_conflict %>%
gather_draws(`b_armed.*`, regex = TRUE) %>%
median_hdci(.width = 0.95) %>%
to_broom_names()
diff_cs_conflict_draws <- diff_cs_conflict %>%
gather_draws(`b_armed.*`, regex = TRUE) %>%
ungroup() %>%
mutate(.variable = recode(.variable, `b_armed_conflictFALSE` = "No armed conflict",
`b_armed_conflictTRUE` = "Armed conflict"))
diff_cs_conflict_posterior <- canary %>%
filter(year == 2010) %>%
modelr::data_grid(armed_conflict) %>%
add_fitted_draws(diff_cs_conflict, seed = BAYES_SEED) %>%
ungroup() %>%
mutate(armed_conflict = factor(armed_conflict, labels = c("No armed conflict", "Armed conflict")))
ggplot(diff_cs_conflict_draws, aes(y = .variable, x = .value, fill = .variable)) +
geom_halfeyeh() +
scale_x_reverse() +
scale_fill_viridis_d(option = "inferno", begin = 0.2, end = 0.9, guide = FALSE) +
labs(x = "Civil society repression", y = "Armed conflict") +
theme_ngo()

ggplot(diff_cs_conflict_posterior, aes(x = .value, y = fct_rev(armed_conflict), color = fct_rev(armed_conflict))) +
stat_dotsh(quantiles = 100, shape = 19) +
stat_pointintervalh(aes(point_colour = after_scale(colorspace::darken(color, 0.65)),
interval_colour = after_scale(colorspace::darken(color, 0.35)))) +
scale_x_reverse() +
scale_color_viridis_d(option = "inferno", begin = 0.2, end = 0.9, guide = FALSE) +
labs(x = "Civil society repression", y = "Armed conflict",
caption = "Each • represents an equally likely outcome from the posterior distribution") +
theme_ngo()

# ggsave("~/Desktop/plot1.pdf", device = cairo_pdf, width = 5, height = 3, units = "in")
# ggsave("~/Desktop/plot1.png", type = "cairo", dpi = 300, width = 6, height = 3.6, units = "in")
Civil society restrictions and other kinds of repression
library(GGally)
repression_only <- canary %>%
filter(year == 2014) %>%
select(barriers_total, PTS, gh_alljourn,
v2clacfree, v2csrlgrep, v2mecenefm, v2mecenefi, v2meharjrn, v2meslfcen,
v2x_clphy, v2x_clpol, v2x_clpriv, v2x_freexp, v2csreprss)
ggscatmat(repression_only, alpha = 0.4) +
theme_ngo(base_size = 6)

LS0tCnRpdGxlOiAiRGVzY3JpcHRpdmUgYW5hbHlzaXMiCmF1dGhvcjogIlN1cGFybmEgQ2hhdWRocnkgYW5kIEFuZHJldyBIZWlzcyIKZGF0ZTogIkxhc3QgcnVuOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVGJylgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKcGFyYW1zOgogIGZpZ193aWR0aDogNgogIGZpZ19oZWlnaHQ6IDMuNgogIGZpZ19oZWlnaHRfdGFsbGVyOiA1Ci0tLQoKYGBge3Igc2V0dXAsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNhbmFyeU5HT3MpCmxpYnJhcnkoYnJtcykKbGlicmFyeShicm9vbSkKbGlicmFyeSh0aWR5YmF5ZXMpCmxpYnJhcnkoc2YpCmxpYnJhcnkoc2NpY28pCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShnZ3RleHQpCmxpYnJhcnkoaGVyZSkKCkNIQUlOUyA8LSA0CklURVIgPC0gMjAwMApXQVJNVVAgPC0gMTAwMApCQVlFU19TRUVEIDwtIDEyMzQKb3B0aW9ucyhtYy5jb3JlcyA9IHBhcmFsbGVsOjpkZXRlY3RDb3JlcygpKSAgIyBVc2UgYWxsIGNvcmVzCgpjYW5hcnkgPC0gcmVhZF9yZHMoaGVyZSgiZGF0YSIsICJkZXJpdmVkX2RhdGEiLCAiY2FuYXJ5X2NsZWFuLnJkcyIpKQoKIyBodHRwczovL3d3dy5uYXR1cmFsZWFydGhkYXRhLmNvbS9kb3dubG9hZHMvMTEwbS1jdWx0dXJhbC12ZWN0b3JzLwpjb3VudHJ5X2JvcmRlcnMgPC0gcmVhZF9zZihoZXJlKCJkYXRhIiwgInJhd19kYXRhIiwgIk5hdHVyYWwgRWFydGgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVfMTEwbV9hZG1pbl8wX2NvdW50cmllcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZV8xMTBtX2FkbWluXzBfY291bnRyaWVzLnNocCIpKQpgYGAKCgojIENpdmlsIHNvY2lldHkgcmVzdHJpY3Rpb25zIG92ZXIgdGltZQoKYGBge3IgbWFrZS1tYXAtZGF0YX0KdGhpbmdzX3RvX21hcCA8LSBjYW5hcnkgJT4lIAogIGZpbHRlcih5ZWFyICVpbiUgYygyMDAwLCAyMDE0KSkgJT4lIAogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCBpc28zLCBiYXJyaWVyc190b3RhbCwgUFRTX2ZhY3RvciwgdjJjc3JlcHJzcykgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB5ZWFyLCB2YWx1ZXNfZnJvbSA9IGMoYmFycmllcnNfdG90YWwsIFBUU19mYWN0b3IsIHYyY3NyZXByc3MpKSAlPiUgCiAgbXV0YXRlKG5ld19sYXdzID0gYmFycmllcnNfdG90YWxfMjAxNCAtIGJhcnJpZXJzX3RvdGFsXzIwMDAsCiAgICAgICAgIG5ld19sYXdzID0gaWZlbHNlKG5ld19sYXdzIDw9IDAsIDAsIG5ld19sYXdzKSwKICAgICAgICAgbmV3X2xhd3MgPSBjZWlsaW5nKG5ld19sYXdzKSkgJT4lIAogIG11dGF0ZShkaWZmX2NzcmVwcmVzcyA9IHYyY3NyZXByc3NfMjAxNCAtIHYyY3NyZXByc3NfMjAwMCwKICAgICAgICAgZGlmZl9jc3JlcHJlc3NfdHJ1bmMgPSBjYXNlX3doZW4oCiAgICAgICAgICAgZGlmZl9jc3JlcHJlc3MgPj0gMiB+IDIsCiAgICAgICAgICAgZGlmZl9jc3JlcHJlc3MgPD0gLTIgfiAtMiwKICAgICAgICAgICBUUlVFIH4gZGlmZl9jc3JlcHJlc3MKICAgICAgICAgKSkgJT4lIAogIG11dGF0ZShwY3RfY2hhbmdlX2NzcmVwcmVzcyA9IGRpZmZfY3NyZXByZXNzIC8gdjJjc3JlcHJzc18yMDAwLAogICAgICAgICBwY3RfY2hhbmdlX2NzcmVwcmVzc190cnVuYyA9IGNhc2Vfd2hlbigKICAgICAgICAgICBwY3RfY2hhbmdlX2NzcmVwcmVzcyA+PSA1IH4gNSwKICAgICAgICAgICBwY3RfY2hhbmdlX2NzcmVwcmVzcyA8PSAtNSB+IC01LAogICAgICAgICAgIFRSVUUgfiBwY3RfY2hhbmdlX2NzcmVwcmVzcwogICAgICAgICApKQoKbWFwX2RhdGEgPC0gY291bnRyeV9ib3JkZXJzICU+JSAKICBsZWZ0X2pvaW4odGhpbmdzX3RvX21hcCwgYnkgPSBjKCJBRE0wX0EzX0lTIiA9ICJpc28zIikpICU+JSAKICBmaWx0ZXIoSVNPX0EzICE9ICJBVEEiKQpgYGAKCiMjIExlZ2lzbGF0aW9uCgpgYGB7ciBtYXAtbmdvLWxhd3MsIGZpZy53aWR0aD1wYXJhbXMkZmlnX3dpZHRoLCBmaWcuaGVpZ2h0PXBhcmFtcyRmaWdfaGVpZ2h0X3RhbGxlcn0KbWFwX25nb19sYXdzIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBtYXBfZGF0YSwgYWVzKGZpbGwgPSBmYWN0b3IobmV3X2xhd3MpKSwKICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgKwogIGNvb3JkX3NmKGNycyA9IDU0MDMwLCBkYXR1bSA9IE5BLCBleHBhbmQgPSBGQUxTRSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBzZXFfZ3JhZGllbnRfcGFsKCIjRkZGRkZGIiwgIiNCRjA0MDQiKShzZXEoMCwgMSwgbGVuZ3RoLm91dCA9IDcpKSwgCiAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgYnJlYWtzID0gMDo2KSArCiAgIyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBzY2ljbyg3LCBwYWxldHRlID0gImRldm9uIiwgZGlyZWN0aW9uID0gLTEpLCAKICAjICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIGJyZWFrcyA9IDA6NikgKwogIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAxLCBsYWJlbC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdpZHRoID0gdW5pdCgxLCB1bml0cyA9ICJsaW5lcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWhlaWdodCA9IHVuaXQoMC42LCB1bml0cyA9ICJsaW5lcyIpKSkgKwogIGxhYnMoZmlsbCA9ICJSZXN0cmljdGl2ZSBOR08gbGF3cyBwYXNzZWQgYmV0d2VlbiAyMDAwIGFuZCAyMDE0IikgKwogIHRoZW1lX25nbygpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4odCA9IDUpLAogICAgICAgIGxlZ2VuZC5zcGFjaW5nLnggPSB1bml0KDAsICJwdCIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dGJveF9zaW1wbGUoaGFsaWduID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSAxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW53aWR0aCA9IHVuaXQoMiwgImxpbmVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh3aWR0aCA9IHVuaXQoMTAsICJsaW5lcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9IG1hcmdpbihyID0gMTApKSkKbWFwX25nb19sYXdzCmBgYAoKIyMgQ2l2aWwgc29jaWV0eSByZXByZXNzaW9uCgpgYGB7ciBtYXAtY3MtcmVwcmVzc2lvbiwgZmlnLndpZHRoPXBhcmFtcyRmaWdfd2lkdGgsIGZpZy5oZWlnaHQ9cGFyYW1zJGZpZ19oZWlnaHRfdGFsbGVyfQptYXBfY3NfcmVwcmVzc2lvbiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gbWFwX2RhdGEsIGFlcyhmaWxsID0gZGlmZl9jc3JlcHJlc3NfdHJ1bmMpLAogICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC4xKSArCiAgY29vcmRfc2YoY3JzID0gNTQwMzAsIGRhdHVtID0gTkEsIGV4cGFuZCA9IEZBTFNFKSArIAogIHNjYWxlX2ZpbGxfc2NpY28ocGFsZXR0ZSA9ICJ2aWsiLCBkaXJlY3Rpb24gPSAtMSwKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsIDEpICogbWF4KGFicyhtYXBfZGF0YSRkaWZmX2NzcmVwcmVzc190cnVuYyksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoLTQsIDQsIDEpLCBuYS52YWx1ZSA9ICJncmV5ODAiKSArCiAgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSwgdGlja3MgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcndpZHRoID0gdW5pdCg3LCB1bml0cyA9ICJsaW5lcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gdW5pdCgwLjUsIHVuaXRzID0gImxpbmVzIikpKSArCiAgbGFicyhmaWxsID0gIkNoYW5nZSBpbiBWLURlbSBjaXZpbCBzb2NpZXR5IHJlcHJlc3Npb24gYmV0d2VlbiAyMDAwIGFuZCAyMDE0IikgKwogIHRoZW1lX25nbygpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4odCA9IDUpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dGJveF9zaW1wbGUoaGFsaWduID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSAxLjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW53aWR0aCA9IHVuaXQoMiwgImxpbmVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh3aWR0aCA9IHVuaXQoMTIsICJsaW5lcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9IG1hcmdpbihyID0gMTApKSkKbWFwX2NzX3JlcHJlc3Npb24KYGBgCgoKIyBQVFMgYW5kIGNpdmlsIHNvY2lldHkgcmVzdHJpY3Rpb25zCgojIyBWLURlbSBjaXZpbCBzb2NpZXR5IHJlcHJlc3Npb24gYW5kIHRoZSBQVFMKCmBgYHtyIG1vZGVsLXB0cy1jcywgY2FjaGU9VFJVRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9CmRpZmZfY3NfcHRzIDwtIGJybSgKICBiZih2MmNzcmVwcnNzIH4gMCArIFBUU19mYWN0b3IsIHNpZ21hIH4gMCArIFBUU19mYWN0b3IpLAogIGZhbWlseSA9IHN0dWRlbnQsCiAgZGF0YSA9IGZpbHRlcihjYW5hcnksIHllYXIgPT0gMjAxMCkgJT4lIHNlbGVjdCh2MmNzcmVwcnNzLCBQVFNfZmFjdG9yKSwKICBwcmlvciA9IGMoCiAgICAjIFNldCBncm91cCBtZWFuIHByaW9yCiAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAxKSIsIGNsYXNzID0gImIiLCBsYiA9IC00LCB1YiA9IDQpLAogICAgIyBTZXQgZ3JvdXAgdmFyaWFuY2UgcHJpb3JzLiBXZSBrZWVwIHRoZSBsZXNzIGluZm9ybWF0aXZlIGNhdWNoeSgwLCAxKS4KICAgIHNldF9wcmlvcigiY2F1Y2h5KDAsIDEpIiwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiKSwKICAgIHNldF9wcmlvcigiZXhwb25lbnRpYWwoMS4wLzI5KSIsIGNsYXNzID0gIm51IikKICApLAogIGNoYWlucyA9IENIQUlOUywgaXRlciA9IElURVIsIHdhcm11cCA9IFdBUk1VUCwgc2VlZCA9IEJBWUVTX1NFRUQsCiAgZmlsZSA9IGhlcmUoImFuYWx5c2lzIiwgImNhY2hlIiwgImRpZmZfY3NfcHRzIikKKQpgYGAKCmBgYHtyIGRyYXdzLXB0cy1jc30KZGlmZl9jc19wdHNfc3VtbWFyeSA8LSBkaWZmX2NzX3B0cyAlPiUKICBnYXRoZXJfZHJhd3MoYGJfUFRTLipgLCByZWdleCA9IFRSVUUpICU+JSAKICBtZWRpYW5faGRjaSgud2lkdGggPSAwLjk1KSAlPiUgCiAgdG9fYnJvb21fbmFtZXMoKQoKZGlmZl9jc19wdHNfZHJhd3MgPC0gZGlmZl9jc19wdHMgJT4lIAogIGdhdGhlcl9kcmF3cyhgYl9QVFMuKmAsIHJlZ2V4ID0gVFJVRSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKC52YXJpYWJsZSA9IHN0cl9yZXBsYWNlKC52YXJpYWJsZSwgImJfUFRTX2ZhY3RvckxldmVsIiwgIkxldmVsICIpKSAlPiUgCiAgbXV0YXRlKHB0c19sZXZlbCA9IGZjdF9yZXYoLnZhcmlhYmxlKSkKCmRpZmZfY3NfcHRzX3Bvc3RlcmlvciA8LSBjYW5hcnkgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTApICU+JSAKICBtb2RlbHI6OmRhdGFfZ3JpZChQVFNfZmFjdG9yKSAlPiUgCiAgYWRkX2ZpdHRlZF9kcmF3cyhkaWZmX2NzX3B0cywgc2VlZCA9IEJBWUVTX1NFRUQpCmBgYAoKYGBge3IgcGxvdC1kcmF3cy1wdHMtY3MsIGZpZy53aWR0aD1wYXJhbXMkZmlnX3dpZHRoLCBmaWcuaGVpZ2h0PXBhcmFtcyRmaWdfaGVpZ2h0fQpnZ3Bsb3QoZGlmZl9jc19wdHNfZHJhd3MsIGFlcyh5ID0gcHRzX2xldmVsLCB4ID0gLnZhbHVlLCBmaWxsID0gcHRzX2xldmVsKSkgKyAKICBnZW9tX2hhbGZleWVoKCkgKwogIHNjYWxlX3hfcmV2ZXJzZSgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gMC4yLCBlbmQgPSAwLjksIGd1aWRlID0gRkFMU0UpICsKICBsYWJzKHggPSAiQ2l2aWwgc29jaWV0eSByZXByZXNzaW9uIiwgeSA9ICJQb2xpdGljYWwgVGVycm9yIFNjYWxlIChQVFMpIikgKwogIHRoZW1lX25nbygpCmBgYAoKYGBge3IgcGxvdC1wb3N0ZXJpb3ItcHJlZHMtcHRzLWNzLCBmaWcud2lkdGg9cGFyYW1zJGZpZ193aWR0aCwgZmlnLmhlaWdodD1wYXJhbXMkZmlnX2hlaWdodCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZ2dwbG90KGRpZmZfY3NfcHRzX3Bvc3RlcmlvciwgYWVzKHggPSAudmFsdWUsIHkgPSBmY3RfcmV2KFBUU19mYWN0b3IpLCBjb2xvciA9IGZjdF9yZXYoUFRTX2ZhY3RvcikpKSArCiAgc3RhdF9kb3RzaChxdWFudGlsZXMgPSAxMDAsIHNoYXBlID0gMTkpICsKICBzdGF0X3BvaW50aW50ZXJ2YWxoKGFlcyhwb2ludF9jb2xvdXIgPSBhZnRlcl9zY2FsZShjb2xvcnNwYWNlOjpkYXJrZW4oY29sb3IsIDAuNjUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbF9jb2xvdXIgPSBhZnRlcl9zY2FsZShjb2xvcnNwYWNlOjpkYXJrZW4oY29sb3IsIDAuMzUpKSkpICsKICBzY2FsZV94X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAwLjIsIGVuZCA9IDAuOSwgZ3VpZGUgPSBGQUxTRSkgKwogIGxhYnMoeCA9ICJDaXZpbCBzb2NpZXR5IHJlcHJlc3Npb24iLCB5ID0gIlBvbGl0aWNhbCBUZXJyb3IgU2NhbGUgKFBUUykiLAogICAgICAgY2FwdGlvbiA9ICJFYWNoIOKAoiByZXByZXNlbnRzIGFuIGVxdWFsbHkgbGlrZWx5IG91dGNvbWUgZnJvbSB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZV9uZ28oKQoKIyBnZ3NhdmUoIn4vRGVza3RvcC9wbG90MS5wZGYiLCBkZXZpY2UgPSBjYWlyb19wZGYsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMywgdW5pdHMgPSAiaW4iKQojIGdnc2F2ZSgifi9EZXNrdG9wL3Bsb3QxLnBuZyIsIHR5cGUgPSAiY2Fpcm8iLCBkcGkgPSAzMDAsIHdpZHRoID0gNiwgaGVpZ2h0ID0gMy42LCB1bml0cyA9ICJpbiIpCmBgYAoKCiMjIENoYXVkaHJ5IE5HTyByZWd1bGF0aW9ucyBhbmQgVi1EZW0ncyBgdjJjc3JlcHJzc2AKCmBgYHtyIHZkZW0tc3VwYXJuYS1wbG90LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9cGFyYW1zJGZpZ193aWR0aCwgZmlnLmhlaWdodD1wYXJhbXMkZmlnX2hlaWdodF90YWxsZXJ9CmNhbmFyeV9iYXJyaWVycyA8LSBjYW5hcnkgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gYyhhZHZvY2FjeSwgZW50cnksIGZ1bmRpbmcsIGJhcnJpZXJzX3RvdGFsKSwgCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gImJhcnJpZXIiLCB2YWx1ZXNfdG8gPSAiY291bnQiKSAlPiUgCiAgbXV0YXRlKGJhcnJpZXIgPSByZWNvZGUoYmFycmllciwgYWR2b2NhY3kgPSAiQmFycmllcnMgdG8gYWR2b2NhY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gIkJhcnJpZXJzIHRvIGVudHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuZGluZyA9ICJCYXJyaWVycyB0byBmdW5kaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJyaWVyc190b3RhbCA9ICJUb3RhbCBOR08gYmFycmllcnMiKSkKCmdncGxvdChjYW5hcnlfYmFycmllcnMsIGFlcyh4ID0gY291bnQsIHkgPSB2MmNzcmVwcnNzKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiByZXN0cmljdGl2ZSBOR08gbGF3cyIsIAogICAgICAgeSA9ICJWLURlbSdzIGNpdmlsIHNvY2lldHkgcmVwcmVzc2lvbiBzY29yZSIpICsKICBmYWNldF93cmFwKHZhcnMoYmFycmllciksIHNjYWxlcyA9ICJmcmVlX3giKSArCiAgdGhlbWVfbmdvKCkKYGBgCgojIyBDaGF1ZGhyeSBOR08gcmVndWxhdGlvbnMgYW5kIHRoZSBQVFMKCmBgYHtyIG1vZGVsLXB0cy1yZXN0cmljdGlvbnMsIGNhY2hlPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQpkaWZmX25nb19wdHMgPC0gYnJtKAogIGJmKGJhcnJpZXJzX3RvdGFsIH4gMCArIFBUU19mYWN0b3IsIHNpZ21hIH4gMCArIFBUU19mYWN0b3IpLAogIGZhbWlseSA9IHN0dWRlbnQsCiAgZGF0YSA9IHNlbGVjdChjYW5hcnksIGJhcnJpZXJzX3RvdGFsLCBQVFNfZmFjdG9yKSwKICBwcmlvciA9IGMoCiAgICAjIFNldCBncm91cCBtZWFuIHByaW9yCiAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAxKSIsIGNsYXNzID0gImIiLCBsYiA9IC00LCB1YiA9IDQpLAogICAgIyBTZXQgZ3JvdXAgdmFyaWFuY2UgcHJpb3JzLiBXZSBrZWVwIHRoZSBsZXNzIGluZm9ybWF0aXZlIGNhdWNoeSgwLCAxKS4KICAgIHNldF9wcmlvcigiY2F1Y2h5KDAsIDEpIiwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiKSwKICAgIHNldF9wcmlvcigiZXhwb25lbnRpYWwoMS4wLzI5KSIsIGNsYXNzID0gIm51IikKICApLAogIGNoYWlucyA9IENIQUlOUywgaXRlciA9IElURVIsIHdhcm11cCA9IFdBUk1VUCwgc2VlZCA9IEJBWUVTX1NFRUQsCiAgZmlsZSA9IGhlcmUoImFuYWx5c2lzIiwgImNhY2hlIiwgImRpZmZfbmdvX3B0cyIpCikKYGBgCgpgYGB7ciBkcmF3cy1wdHMtbmdvfQpkaWZmX25nb19wdHNfc3VtbWFyeSA8LSBkaWZmX25nb19wdHMgJT4lCiAgZ2F0aGVyX2RyYXdzKGBiX1BUUy4qYCwgcmVnZXggPSBUUlVFKSAlPiUgCiAgbWVkaWFuX2hkY2koLndpZHRoID0gMC45NSkgJT4lIAogIHRvX2Jyb29tX25hbWVzKCkKCmRpZmZfbmdvX3B0c19kcmF3cyA8LSBkaWZmX25nb19wdHMgJT4lIAogIGdhdGhlcl9kcmF3cyhgYl9QVFMuKmAsIHJlZ2V4ID0gVFJVRSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKC52YXJpYWJsZSA9IHN0cl9yZXBsYWNlKC52YXJpYWJsZSwgImJfUFRTX2ZhY3RvckxldmVsIiwgIkxldmVsICIpKSAlPiUgCiAgbXV0YXRlKHB0c19sZXZlbCA9IGZjdF9yZXYoLnZhcmlhYmxlKSkKCmRpZmZfbmdvX3B0c19wb3N0ZXJpb3IgPC0gY2FuYXJ5ICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDEwKSAlPiUgCiAgbW9kZWxyOjpkYXRhX2dyaWQoUFRTX2ZhY3RvcikgJT4lIAogIGFkZF9maXR0ZWRfZHJhd3MoZGlmZl9uZ29fcHRzLCBzZWVkID0gQkFZRVNfU0VFRCkKYGBgCgpgYGB7ciBwbG90LWRyYXdzLXB0cy1uZ28sIGZpZy53aWR0aD1wYXJhbXMkZmlnX3dpZHRoLCBmaWcuaGVpZ2h0PXBhcmFtcyRmaWdfaGVpZ2h0fQpnZ3Bsb3QoZGlmZl9uZ29fcHRzX2RyYXdzLCBhZXMoeSA9IHB0c19sZXZlbCwgeCA9IC52YWx1ZSwgZmlsbCA9IHB0c19sZXZlbCkpICsgCiAgZ2VvbV9oYWxmZXllaCgpICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gMC4yLCBlbmQgPSAwLjksIGd1aWRlID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIHJlc3RyaWN0aXZlIE5HTyBsYXdzIiwgeSA9ICJQb2xpdGljYWwgVGVycm9yIFNjYWxlIChQVFMpIikgKwogIHRoZW1lX25nbygpCmBgYAoKYGBge3IgcGxvdC1wb3N0ZXJpb3ItcHJlZHMtcHRzLW5nbywgZmlnLndpZHRoPXBhcmFtcyRmaWdfd2lkdGgsIGZpZy5oZWlnaHQ9cGFyYW1zJGZpZ19oZWlnaHQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmdncGxvdChkaWZmX25nb19wdHNfcG9zdGVyaW9yLCBhZXMoeCA9IC52YWx1ZSwgeSA9IGZjdF9yZXYoUFRTX2ZhY3RvciksIGNvbG9yID0gZmN0X3JldihQVFNfZmFjdG9yKSkpICsKICBzdGF0X2RvdHNoKHF1YW50aWxlcyA9IDEwMCwgc2hhcGUgPSAxOSkgKwogIHN0YXRfcG9pbnRpbnRlcnZhbGgoYWVzKHBvaW50X2NvbG91ciA9IGFmdGVyX3NjYWxlKGNvbG9yc3BhY2U6OmRhcmtlbihjb2xvciwgMC42NSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsX2NvbG91ciA9IGFmdGVyX3NjYWxlKGNvbG9yc3BhY2U6OmRhcmtlbihjb2xvciwgMC4zNSkpKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAiaW5mZXJubyIsIGJlZ2luID0gMC4yLCBlbmQgPSAwLjksIGd1aWRlID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIHJlc3RyaWN0aXZlIE5HTyBsYXdzIiwgeSA9ICJQb2xpdGljYWwgVGVycm9yIFNjYWxlIChQVFMpIiwKICAgICAgIGNhcHRpb24gPSAiRWFjaCDigKIgcmVwcmVzZW50cyBhbiBlcXVhbGx5IGxpa2VseSBvdXRjb21lIGZyb20gdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24iKSArCiAgdGhlbWVfbmdvKCkKYGBgCgoKIyBDb25mbGljdCBhbmQgY2l2aWwgc29jaWV0eSByZXN0cmljdGlvbnMKCmBgYHtyIG1vZGVsLWNvbmZsaWN0LWNzLCBjYWNoZT1UUlVFLCBtZXNzYWdlPUZBTFNFLCByZXN1bHRzPSJoaWRlIn0KZGlmZl9jc19jb25mbGljdCA8LSBicm0oCiAgYmYodjJjc3JlcHJzcyB+IDAgKyBhcm1lZF9jb25mbGljdCwgc2lnbWEgfiAwICsgYXJtZWRfY29uZmxpY3QpLAogIGZhbWlseSA9IHN0dWRlbnQsCiAgZGF0YSA9IHNlbGVjdChjYW5hcnksIHYyY3NyZXByc3MsIGFybWVkX2NvbmZsaWN0KSwKICBwcmlvciA9IGMoCiAgICAjIFNldCBncm91cCBtZWFuIHByaW9yCiAgICBzZXRfcHJpb3IoIm5vcm1hbCgwLCAxKSIsIGNsYXNzID0gImIiLCBsYiA9IC00LCB1YiA9IDQpLAogICAgIyBTZXQgZ3JvdXAgdmFyaWFuY2UgcHJpb3JzLiBXZSBrZWVwIHRoZSBsZXNzIGluZm9ybWF0aXZlIGNhdWNoeSgwLCAxKS4KICAgIHNldF9wcmlvcigiY2F1Y2h5KDAsIDEpIiwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiKSwKICAgIHNldF9wcmlvcigiZXhwb25lbnRpYWwoMS4wLzI5KSIsIGNsYXNzID0gIm51IikKICApLAogIGNoYWlucyA9IENIQUlOUywgaXRlciA9IElURVIsIHdhcm11cCA9IFdBUk1VUCwgc2VlZCA9IEJBWUVTX1NFRUQsCiAgZmlsZSA9IGhlcmUoImFuYWx5c2lzIiwgImNhY2hlIiwgImRpZmZfY3NfY29uZmxpY3QiKQopCmBgYAoKYGBge3IgZHJhd3MtY29uZmxpY3QtY3N9CmRpZmZfY3NfY29uZmxpY3Rfc3VtbWFyeSA8LSBkaWZmX2NzX2NvbmZsaWN0ICU+JQogIGdhdGhlcl9kcmF3cyhgYl9hcm1lZC4qYCwgcmVnZXggPSBUUlVFKSAlPiUgCiAgbWVkaWFuX2hkY2koLndpZHRoID0gMC45NSkgJT4lIAogIHRvX2Jyb29tX25hbWVzKCkKCmRpZmZfY3NfY29uZmxpY3RfZHJhd3MgPC0gZGlmZl9jc19jb25mbGljdCAlPiUgCiAgZ2F0aGVyX2RyYXdzKGBiX2FybWVkLipgLCByZWdleCA9IFRSVUUpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZSgudmFyaWFibGUgPSByZWNvZGUoLnZhcmlhYmxlLCBgYl9hcm1lZF9jb25mbGljdEZBTFNFYCA9ICJObyBhcm1lZCBjb25mbGljdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYl9hcm1lZF9jb25mbGljdFRSVUVgID0gIkFybWVkIGNvbmZsaWN0IikpCgpkaWZmX2NzX2NvbmZsaWN0X3Bvc3RlcmlvciA8LSBjYW5hcnkgJT4lIAogIGZpbHRlcih5ZWFyID09IDIwMTApICU+JSAKICBtb2RlbHI6OmRhdGFfZ3JpZChhcm1lZF9jb25mbGljdCkgJT4lIAogIGFkZF9maXR0ZWRfZHJhd3MoZGlmZl9jc19jb25mbGljdCwgc2VlZCA9IEJBWUVTX1NFRUQpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShhcm1lZF9jb25mbGljdCA9IGZhY3Rvcihhcm1lZF9jb25mbGljdCwgbGFiZWxzID0gYygiTm8gYXJtZWQgY29uZmxpY3QiLCAiQXJtZWQgY29uZmxpY3QiKSkpCmBgYAoKYGBge3IgcGxvdC1kcmF3cy1jb25mbGljdC1jcywgZmlnLndpZHRoPXBhcmFtcyRmaWdfd2lkdGgsIGZpZy5oZWlnaHQ9cGFyYW1zJGZpZ19oZWlnaHR9CmdncGxvdChkaWZmX2NzX2NvbmZsaWN0X2RyYXdzLCBhZXMoeSA9IC52YXJpYWJsZSwgeCA9IC52YWx1ZSwgZmlsbCA9IC52YXJpYWJsZSkpICsgCiAgZ2VvbV9oYWxmZXllaCgpICsKICBzY2FsZV94X3JldmVyc2UoKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IDAuMiwgZW5kID0gMC45LCBndWlkZSA9IEZBTFNFKSArCiAgbGFicyh4ID0gIkNpdmlsIHNvY2lldHkgcmVwcmVzc2lvbiIsIHkgPSAiQXJtZWQgY29uZmxpY3QiKSArCiAgdGhlbWVfbmdvKCkKYGBgCgpgYGB7ciBwbG90LXBvc3Rlcmlvci1wcmVkcy1jb25mbGljdC1jcywgZmlnLndpZHRoPXBhcmFtcyRmaWdfd2lkdGgsIGZpZy5oZWlnaHQ9cGFyYW1zJGZpZ19oZWlnaHQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmdncGxvdChkaWZmX2NzX2NvbmZsaWN0X3Bvc3RlcmlvciwgYWVzKHggPSAudmFsdWUsIHkgPSBmY3RfcmV2KGFybWVkX2NvbmZsaWN0KSwgY29sb3IgPSBmY3RfcmV2KGFybWVkX2NvbmZsaWN0KSkpICsKICBzdGF0X2RvdHNoKHF1YW50aWxlcyA9IDEwMCwgc2hhcGUgPSAxOSkgKwogIHN0YXRfcG9pbnRpbnRlcnZhbGgoYWVzKHBvaW50X2NvbG91ciA9IGFmdGVyX3NjYWxlKGNvbG9yc3BhY2U6OmRhcmtlbihjb2xvciwgMC42NSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsX2NvbG91ciA9IGFmdGVyX3NjYWxlKGNvbG9yc3BhY2U6OmRhcmtlbihjb2xvciwgMC4zNSkpKSkgKwogIHNjYWxlX3hfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IDAuMiwgZW5kID0gMC45LCBndWlkZSA9IEZBTFNFKSArCiAgbGFicyh4ID0gIkNpdmlsIHNvY2lldHkgcmVwcmVzc2lvbiIsIHkgPSAiQXJtZWQgY29uZmxpY3QiLAogICAgICAgY2FwdGlvbiA9ICJFYWNoIOKAoiByZXByZXNlbnRzIGFuIGVxdWFsbHkgbGlrZWx5IG91dGNvbWUgZnJvbSB0aGUgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiIpICsKICB0aGVtZV9uZ28oKQoKIyBnZ3NhdmUoIn4vRGVza3RvcC9wbG90MS5wZGYiLCBkZXZpY2UgPSBjYWlyb19wZGYsIHdpZHRoID0gNSwgaGVpZ2h0ID0gMywgdW5pdHMgPSAiaW4iKQojIGdnc2F2ZSgifi9EZXNrdG9wL3Bsb3QxLnBuZyIsIHR5cGUgPSAiY2Fpcm8iLCBkcGkgPSAzMDAsIHdpZHRoID0gNiwgaGVpZ2h0ID0gMy42LCB1bml0cyA9ICJpbiIpCmBgYAoKCiMgQ2l2aWwgc29jaWV0eSByZXN0cmljdGlvbnMgYW5kIG90aGVyIGtpbmRzIG9mIHJlcHJlc3Npb24KCmBgYHtyIHJlcHJlc3Npb24tbWF0cml4LCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoR0dhbGx5KQpyZXByZXNzaW9uX29ubHkgPC0gY2FuYXJ5ICU+JSAKICBmaWx0ZXIoeWVhciA9PSAyMDE0KSAlPiUgCiAgc2VsZWN0KGJhcnJpZXJzX3RvdGFsLCBQVFMsIGdoX2FsbGpvdXJuLCAKICAgICAgICAgdjJjbGFjZnJlZSwgdjJjc3JsZ3JlcCwgdjJtZWNlbmVmbSwgdjJtZWNlbmVmaSwgdjJtZWhhcmpybiwgdjJtZXNsZmNlbiwKICAgICAgICAgdjJ4X2NscGh5LCB2MnhfY2xwb2wsIHYyeF9jbHByaXYsIHYyeF9mcmVleHAsIHYyY3NyZXByc3MpCgpnZ3NjYXRtYXQocmVwcmVzc2lvbl9vbmx5LCBhbHBoYSA9IDAuNCkgKyAKICB0aGVtZV9uZ28oYmFzZV9zaXplID0gNikKYGBgCgo=