library(tidyverse) # for manipulating data
library(labelled) # for using labels
library(flextable) # for formatting output tables
library(readr) # for reading csv files
library(broom) # for dealing with annoying output chunks
library(scales) # for percentage labelling
library(countrycode) # for working with country names
SUPLEMENTARY MATERIALS
As accompanying material to “Multi-project assessments of sample quality in cross-national surveys: The role of weights in applying external and internal measures of sample bias”, this document presents details of data transformations, statistical procedures, and exact results of analyses performed in the paper’s main body. Code chunks are hidden by default but can be accessed by clicking the relevant buttons. All calculations rely on the publicly available integrated .csv data file.
ESM2e02 <- read_delim("ESM2e02.csv", ";",
escape_double = FALSE,
na = "Not applicable",
trim_ws = TRUE,
col_types = cols(
.default = col_character(),
T_SURVEY_YEAR = col_double(),
Q_PROP_FEM_POPULATION_18_74 = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_psweights = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_dweights_ESS = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_EXTERNAL_18_74_no_weights = col_double(),
Q_PROP_FEM_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_PROP_FEM_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_SUBSAMPLE_SIZE_INTERNAL_KOHLER_strict = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_EFFECT_SIZE_PROP_FEMALE_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_BIAS_INTERNAL_KOHLER_psweights_strict = col_double(),
Q_BIAS_INTERNAL_KOHLER_no_weights_strict = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_psweights = col_double(),
Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_psweights = col_double(),
Q_ABS_BIAS_INTERNAL_KOHLER_no_weights = col_double()
))
DISTRIBUTION OF THE TYPES OF WEIGHTS AVAILABLE ACROSS THE FOUR PROJECTS
Raw counts and row percentages of data represented in the paper on Figure 1.
ESM2e02 %>%
count(T_SURVEY_NAME, T_Weighting_factor2) %>%
pivot_wider(names_from = T_SURVEY_NAME, values_from = n, values_fill = 0) %>%
rename("Type of weight" = T_Weighting_factor2) %>%
qflextable() %>%
align(j = 2:5, align = "center") %>%
align_nottext_col(align = "center")
Type of weight | EB | EQLS | ESS | ISSP |
Post-stratification weights | 462 | 64 | 0 | 207 |
Post-stratification weights with design weights | 0 | 61 | 196 | 0 |
No weights | 0 | 0 | 3 | 132 |
ESM2e02 %>%
count(T_SURVEY_NAME, T_Weighting_factor2) %>%
group_by(T_SURVEY_NAME) %>%
mutate(Percent = percent(n/sum(n), accuracy = 0.1)) %>%
select(T_SURVEY_NAME, T_Weighting_factor2, Percent) %>%
ungroup() %>%
pivot_wider(names_from = T_SURVEY_NAME, values_from = Percent, values_fill = "0%") %>%
rename("Type of weight" = T_Weighting_factor2) %>%
qflextable() %>%
theme_booktabs() %>%
align(j = 1, align = "left")
Type of weight | EB | EQLS | ESS | ISSP |
Post-stratification weights | 100.0% | 51.2% | 0% | 61.1% |
Post-stratification weights with design weights | 0% | 48.8% | 98.5% | 0% |
No weights | 0% | 0% | 1.5% | 38.9% |
STRICT VS LENIENT APPROACH TO INTERNAL CRITERIA: SEE SECTION 4.3.
Pearson correlation coefficients between biases resulting internal criteria without weights according to the strict approach vs the lenient approach. Calculations performed for surveys within the two projects where data for implementing the strict approach was available.
ESM2e02 %>% filter(T_SURVEY_NAME %in% c("ESS", "EQLS")) %>%
group_by(T_SURVEY_NAME) %>%
summarize(`Perason correlation` = (cor(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, Q_ABS_BIAS_INTERNAL_KOHLER_no_weights_strict, method = 'pearson', use = "pairwise.complete.obs")), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(digits = 2, na_str = "N/A")
Project name | Perason correlation |
EQLS | 0.93 |
ESS | 0.96 |
DIFFERENCES IN THE VALUES OF BIAS ACCORDING TO INTERNAL AND EXTERNAL CRITERIA: NO WEIGHT VS DESIGN WEIGHT
Mean and median values for data represented on Figure 2.
ESM2e02 %>% filter(T_SURVEY_NAME == "ESS", T_DEFFp_ESS == "DEFF>1") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
group_by(T_SURVEY_EDITION) %>%
summarise(meanXdifference_external = mean(delta1),
medianXdifference_external = median(delta1),
meanXdifference_internal = mean(delta2),
medianXdifference_internal = median(delta2), .groups = 'drop') %>%
rename("ESS wave" = T_SURVEY_EDITION,
"Mean difference \n external" = meanXdifference_external,
"Median difference \n external" = medianXdifference_external,
"Mean difference \n internal" = meanXdifference_internal,
"Median difference \n internal" = medianXdifference_internal) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center", header = T) %>%
colformat_num(j = 2:5, digits = 1, na_str = "N/A")
ESS wave | Mean difference external | Median difference external | Mean difference internal | Median difference internal |
ESS2002 | -0.17 | 0.15 | 0.04 | 0.05 |
ESS2004 | -0.02 | -0.08 | -0.14 | -0.07 |
ESS2006 | -0.75 | -0.70 | 0.07 | -0.03 |
ESS2008 | -0.41 | -0.07 | 0.11 | 0.01 |
ESS2010 | -0.13 | -0.08 | 0.11 | 0.00 |
ESS2012 | -0.27 | -0.06 | -0.20 | 0.00 |
ESS2014 | -0.30 | -0.14 | 0.09 | 0.08 |
ESS2016 | -0.25 | -0.22 | 0.07 | 0.04 |
Mean and median differences as referenced in section 5.1.
ESM2e02 %>% filter(T_SURVEY_NAME == "ESS", T_DEFFp_ESS == "DEFF>1") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_dweights_ESS - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_dweights_ESS - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
summarise(meanXdifference_external = mean(delta1),
medianXdifference_external = median(delta1),
meanXdifference_internal = mean(delta2),
medianXdifference_internal = median(delta2), .groups = 'drop') %>%
pivot_longer(1:4, names_to = c("fun", "Difference"), values_to = "values", names_sep = "X") %>%
pivot_wider(names_from = fun, values_from = values) %>%
qflextable() %>%
theme_booktabs() %>%
colformat_num(j = 2:3, digits = 1, na_str = "N/A")
Difference | mean | median |
difference_external | -0.28 | -0.08 |
difference_internal | 0.02 | 0.00 |
WITHIN-PROJECT DIFFERENCES BETWEEN BIAS WITH AND WITHOUT POST-STRATIFICATION WEIGHTS
See Table 2 in the paper.
ESM2e02 %>% filter(T_Weighing_factor == "Total weights present in dataset") %>%
mutate(delta1 = Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_psweights - Q_ABS_BIAS_PROP_FEMALE_EXTERNAL_no_weights,
delta2 = Q_ABS_BIAS_INTERNAL_KOHLER_psweights - Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
group_by(T_SURVEY_NAME) %>%
summarise(mean_external = mean(delta1),
median_external = median(delta1),
mean_internal = mean(delta2, na.rm = T),
median_internal = median(delta2, na.rm = T), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME,
"Mean difference \n external" = mean_external,
"Median difference \n external" = median_external,
"Mean difference \n internal" = mean_internal,
"Median difference \n internal" = median_internal) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(j = 2:3, big.mark = ",", digits = 3, na_str = "N/A")
Project name | Mean difference external | Median difference external | Mean difference internal | Median difference internal |
EB | -2.02 | -1.58 | -0.70 | -0.47 |
EQLS | -3.49 | -3.58 | -0.33 | -0.26 |
ESS | -2.01 | -1.68 | -0.37 | -0.30 |
ISSP | -2.71 | -2.25 | -0.18 | -0.14 |
INTERNAL CRITERIA WITH NO WEIGHTS: THE OUTLIERS
Descriptive statistics of data referenced in section 6.
ESM2e02 %>%
group_by(T_SURVEY_NAME) %>%
summarise(Q1 = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.25, na.rm = T),
median = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.25, na.rm = T),
Q3 = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T),
IQR = IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T),
Outlier_threshold = quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T) + 1.5 * IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T), .groups = 'drop') %>%
rename("Project name" = T_SURVEY_NAME, "Outlier \n threshold" = Outlier_threshold) %>%
qflextable() %>%
theme_booktabs() %>%
align_nottext_col(align = "center") %>%
colformat_num(j = 2:3, digits = 2, na_str = "N/A") %>%
colformat_num(j = 4:6, digits = 3, na_str = "N/A")
Project name | Q1 | median | Q3 | IQR | Outlier threshold |
EB | 0.60 | 0.60 | 2.12 | 1.52 | 4.41 |
EQLS | 0.55 | 0.55 | 1.84 | 1.29 | 3.78 |
ESS | 0.49 | 0.49 | 1.69 | 1.20 | 3.49 |
ISSP | 0.51 | 0.51 | 1.98 | 1.47 | 4.18 |
A list of outliers as represented on Figure 4.
ESM2e02 %>%
group_by(T_SURVEY_NAME) %>%
filter(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights > quantile(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, probs = 0.75, na.rm = T) + 1.5 * IQR(Q_ABS_BIAS_INTERNAL_KOHLER_no_weights, na.rm = T)) %>%
select(T_SURVEY_NAME, T_SURVEY_YEAR, T_COUNTRY, Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
rename("Project name" = T_SURVEY_NAME, "Year" = T_SURVEY_YEAR, "Country code" = T_COUNTRY, "Internal bias" = Q_ABS_BIAS_INTERNAL_KOHLER_no_weights) %>%
ungroup() %>%
mutate(`Country name` = countrycode(`Country code`, origin = "iso2c", destination = "country.name")) %>%
relocate(`Project name`, `Year`, `Country code`, `Country name`, `Internal bias`) %>%
qflextable() %>%
theme_booktabs() %>%
align(j = 2:4, align = "center") %>%
align_nottext_col(align = "center", header = T) %>%
colformat_num(digits = 3, big.mark = "", na_str = "N/A")
Project name | Year | Country code | Country name | Internal bias |
EB | 2004 | MT | Malta | 4.55 |
EB | 2005 | IT | Italy | 4.88 |
EB | 2014 | SE | Sweden | 7.01 |
EB | 2015 | SE | Sweden | 6.38 |
EB | 2016 | HR | Croatia | 4.66 |
EB | 2016 | SE | Sweden | 6.98 |
EQLS | 2003 | GB | United Kingdom | 4.58 |
EQLS | 2007 | IT | Italy | 3.99 |
EQLS | 2011 | CY | Cyprus | 4.01 |
EQLS | 2016 | HR | Croatia | 3.97 |
ESS | 2008 | SK | Slovakia | 11.16 |
ESS | 2010 | DK | Denmark | 3.56 |
ESS | 2010 | SK | Slovakia | 11.52 |
ESS | 2012 | CZ | Czechia | 3.52 |
ESS | 2012 | SK | Slovakia | 10.15 |
ESS | 2016 | NO | Norway | 3.68 |
ISSP | 2003 | FR | France | 6.88 |
ISSP | 2003 | NL | Netherlands | 6.15 |
ISSP | 2004 | FR | France | 6.07 |
ISSP | 2004 | NL | Netherlands | 6.15 |
ISSP | 2005 | FR | France | 5.32 |
ISSP | 2006 | FR | France | 8.34 |
ISSP | 2006 | NL | Netherlands | 6.33 |
ISSP | 2008 | HU | Hungary | 4.62 |
ISSP | 2008 | IT | Italy | 5.00 |
ISSP | 2008 | NL | Netherlands | 4.78 |
ISSP | 2009 | FR | France | 6.28 |
ISSP | 2009 | HU | Hungary | 4.64 |
ISSP | 2010 | FR | France | 9.66 |
ISSP | 2013 | FR | France | 4.69 |
ISSP | 2013 | NL | Netherlands | 6.87 |
ISSP | 2014 | NL | Netherlands | 6.87 |
ISSP | 2015 | FR | France | 4.75 |
ISSP | 2015 | GE | Georgia | 5.82 |
LS0tCnRpdGxlOiAnTXVsdGktcHJvamVjdCBhc3Nlc3NtZW50IG9mIHNhbXBsZSBxdWFsaXR5IGluIGNyb3NzLW5hdGlvbmFsIHN1cnZleXMnCnN1YnRpdGxlOiAnUmVwbGljYXRpb24gbWF0ZXJpYWxzJwpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IgcGFja2FnZXMsIHdhcm5pbmdzID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpICMgZm9yIG1hbmlwdWxhdGluZyBkYXRhCmxpYnJhcnkobGFiZWxsZWQpICMgZm9yIHVzaW5nIGxhYmVscwpsaWJyYXJ5KGZsZXh0YWJsZSkgIyBmb3IgZm9ybWF0dGluZyBvdXRwdXQgdGFibGVzCmxpYnJhcnkocmVhZHIpICMgZm9yIHJlYWRpbmcgY3N2IGZpbGVzCmxpYnJhcnkoYnJvb20pICMgZm9yIGRlYWxpbmcgd2l0aCBhbm5veWluZyBvdXRwdXQgY2h1bmtzCmxpYnJhcnkoc2NhbGVzKSAjIGZvciBwZXJjZW50YWdlIGxhYmVsbGluZwpsaWJyYXJ5KGNvdW50cnljb2RlKSAjIGZvciB3b3JraW5nIHdpdGggY291bnRyeSBuYW1lcwpgYGAKCjxiPiBTVVBMRU1FTlRBUlkgTUFURVJJQUxTIDwvYj4KCkFzIGFjY29tcGFueWluZyBtYXRlcmlhbCB0byDigJxNdWx0aS1wcm9qZWN0IGFzc2Vzc21lbnRzIG9mIHNhbXBsZSBxdWFsaXR5IGluIGNyb3NzLW5hdGlvbmFsIHN1cnZleXM6IFRoZSByb2xlIG9mIHdlaWdodHMgaW4gYXBwbHlpbmcgZXh0ZXJuYWwgYW5kIGludGVybmFsIG1lYXN1cmVzIG9mIHNhbXBsZSBiaWFz4oCdLCB0aGlzIGRvY3VtZW50IHByZXNlbnRzICBkZXRhaWxzIG9mIGRhdGEgdHJhbnNmb3JtYXRpb25zLCBzdGF0aXN0aWNhbCBwcm9jZWR1cmVzLCBhbmQgZXhhY3QgcmVzdWx0cyBvZiBhbmFseXNlcyBwZXJmb3JtZWQgaW4gdGhlIHBhcGVyJ3MgbWFpbiBib2R5LiBDb2RlIGNodW5rcyBhcmUgaGlkZGVuIGJ5IGRlZmF1bHQgYnV0IGNhbiBiZSBhY2Nlc3NlZCBieSBjbGlja2luZyB0aGUgcmVsZXZhbnQgYnV0dG9ucy4gQWxsIGNhbGN1bGF0aW9ucyByZWx5IG9uIHRoZSBwdWJsaWNseSBhdmFpbGFibGUgaW50ZWdyYXRlZCAuY3N2IGRhdGEgZmlsZS4KCmBgYHtyfQpFU00yZTAyIDwtIHJlYWRfZGVsaW0oIkVTTTJlMDIuY3N2IiwgIjsiLAogICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgIG5hID0gIk5vdCBhcHBsaWNhYmxlIiwgCiAgICAgICAgICAgICAgICAgICAgICB0cmltX3dzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKAogIC5kZWZhdWx0ID0gY29sX2NoYXJhY3RlcigpLAogIFRfU1VSVkVZX1lFQVIgPSBjb2xfZG91YmxlKCksCiAgUV9QUk9QX0ZFTV9QT1BVTEFUSU9OXzE4Xzc0ID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfcHN3ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfZHdlaWdodHNfRVNTID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfRVhURVJOQUxfMThfNzRfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX1BST1BfRkVNX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfUFJPUF9GRU1fSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfU1VCU0FNUExFX1NJWkVfSU5URVJOQUxfS09ITEVSX3N0cmljdCA9IGNvbF9kb3VibGUoKSwKICBRX0VGRkVDVF9TSVpFX1BST1BfRkVNQUxFX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfRUZGRUNUX1NJWkVfUFJPUF9GRU1BTEVfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX3Bzd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHNfc3RyaWN0ID0gY29sX2RvdWJsZSgpLAogIFFfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0c19zdHJpY3QgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9kd2VpZ2h0c19FU1MgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9ub193ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX2R3ZWlnaHRzX0VTUyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfcHN3ZWlnaHRzID0gY29sX2RvdWJsZSgpLAogIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKSwKICBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9wc3dlaWdodHMgPSBjb2xfZG91YmxlKCksCiAgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cyA9IGNvbF9kb3VibGUoKQopKQpgYGAKPGI+IERJU1RSSUJVVElPTiBPRiBUSEUgVFlQRVMgT0YgV0VJR0hUUyBBVkFJTEFCTEUgQUNST1NTIFRIRSBGT1VSIFBST0pFQ1RTIDwvYj4KClJhdyBjb3VudHMgYW5kIHJvdyBwZXJjZW50YWdlcyBvZiBkYXRhIHJlcHJlc2VudGVkIGluIHRoZSBwYXBlciBvbiBGaWd1cmUgMS4KCmBgYHtyfQpFU00yZTAyICU+JQogIGNvdW50KFRfU1VSVkVZX05BTUUsIFRfV2VpZ2h0aW5nX2ZhY3RvcjIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBUX1NVUlZFWV9OQU1FLCB2YWx1ZXNfZnJvbSA9IG4sIHZhbHVlc19maWxsID0gMCkgJT4lCiAgcmVuYW1lKCJUeXBlIG9mIHdlaWdodCIgPSBUX1dlaWdodGluZ19mYWN0b3IyKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lCiAgYWxpZ24oaiA9IDI6NSwgYWxpZ24gPSAiY2VudGVyIikgJT4lCiAgYWxpZ25fbm90dGV4dF9jb2woYWxpZ24gPSAiY2VudGVyIikKYGBgCgpgYGB7cn0KRVNNMmUwMiAlPiUKICBjb3VudChUX1NVUlZFWV9OQU1FLCBUX1dlaWdodGluZ19mYWN0b3IyKSAlPiUKICBncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUKICBtdXRhdGUoUGVyY2VudCA9IHBlcmNlbnQobi9zdW0obiksIGFjY3VyYWN5ID0gMC4xKSkgJT4lIAogIHNlbGVjdChUX1NVUlZFWV9OQU1FLCBUX1dlaWdodGluZ19mYWN0b3IyLCBQZXJjZW50KSAlPiUgCiAgdW5ncm91cCgpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBUX1NVUlZFWV9OQU1FLCB2YWx1ZXNfZnJvbSA9IFBlcmNlbnQsIHZhbHVlc19maWxsID0gIjAlIikgJT4lIAogIHJlbmFtZSgiVHlwZSBvZiB3ZWlnaHQiID0gVF9XZWlnaHRpbmdfZmFjdG9yMikgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduKGogPSAxLCBhbGlnbiA9ICJsZWZ0IikKYGBgCjxicj4KPGI+IFNUUklDVCBWUyBMRU5JRU5UIEFQUFJPQUNIIFRPIElOVEVSTkFMIENSSVRFUklBOiBTRUUgU0VDVElPTiA0LjMuIDwvYj4KClBlYXJzb24gY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGJldHdlZW4gYmlhc2VzIHJlc3VsdGluZyBpbnRlcm5hbCBjcml0ZXJpYSB3aXRob3V0IHdlaWdodHMgYWNjb3JkaW5nIHRvIHRoZSBzdHJpY3QgYXBwcm9hY2ggdnMgdGhlIGxlbmllbnQgYXBwcm9hY2guIENhbGN1bGF0aW9ucyBwZXJmb3JtZWQgZm9yIHN1cnZleXMgd2l0aGluIHRoZSB0d28gcHJvamVjdHMgd2hlcmUgZGF0YSBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdHJpY3QgYXBwcm9hY2ggd2FzIGF2YWlsYWJsZS4KCmBgYHtyfQpFU00yZTAyICU+JSBmaWx0ZXIoVF9TVVJWRVlfTkFNRSAlaW4lIGMoIkVTUyIsICJFUUxTIikpICU+JQpncm91cF9ieShUX1NVUlZFWV9OQU1FKSAlPiUgCnN1bW1hcml6ZShgUGVyYXNvbiBjb3JyZWxhdGlvbmAgPSAoY29yKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHNfc3RyaWN0LCBtZXRob2QgPSAncGVhcnNvbicsIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSksIC5ncm91cHMgPSAnZHJvcCcpICU+JSAKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FKSAlPiUKcWZsZXh0YWJsZSgpICU+JSAKdGhlbWVfYm9va3RhYnMoKSAlPiUgCmFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIpICU+JSAKY29sZm9ybWF0X251bShkaWdpdHMgPSAyLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IERJRkZFUkVOQ0VTIElOIFRIRSBWQUxVRVMgT0YgQklBUyBBQ0NPUkRJTkcgVE8gSU5URVJOQUwgQU5EIEVYVEVSTkFMIENSSVRFUklBOiBOTyBXRUlHSFQgVlMgREVTSUdOIFdFSUdIVCA8L2I+CgpNZWFuIGFuZCBtZWRpYW4gdmFsdWVzIGZvciBkYXRhIHJlcHJlc2VudGVkIG9uIEZpZ3VyZSAyLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiLCBUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTICAtIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywKICAgICAgICAgZGVsdGEyID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTIC0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgZ3JvdXBfYnkoVF9TVVJWRVlfRURJVElPTikgJT4lCiAgc3VtbWFyaXNlKG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhblhkaWZmZXJlbmNlX2ludGVybmFsID0gbWVhbihkZWx0YTIpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCA9IG1lZGlhbihkZWx0YTIpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICByZW5hbWUoIkVTUyB3YXZlIiA9IFRfU1VSVkVZX0VESVRJT04sIAogICAgICAgICAiTWVhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiA9IG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCwKICAgICAgICAgIk1lZGlhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiAgPSBtZWRpYW5YZGlmZmVyZW5jZV9leHRlcm5hbCwKICAgICAgICAgIk1lYW4gZGlmZmVyZW5jZSBcbiBpbnRlcm5hbCIgPSBtZWFuWGRpZmZlcmVuY2VfaW50ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBpbnRlcm5hbCIgPSBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIsIGhlYWRlciA9IFQpICU+JQogIGNvbGZvcm1hdF9udW0oaiA9IDI6NSwgZGlnaXRzID0gMSwgbmFfc3RyID0gIk4vQSIpCmBgYAo8YnI+Ck1lYW4gYW5kIG1lZGlhbiBkaWZmZXJlbmNlcyBhcyByZWZlcmVuY2VkIGluIHNlY3Rpb24gNS4xLgoKYGBge3J9CkVTTTJlMDIgJT4lIGZpbHRlcihUX1NVUlZFWV9OQU1FID09ICJFU1MiLCBUX0RFRkZwX0VTUyA9PSAiREVGRj4xIikgJT4lCiAgbXV0YXRlKGRlbHRhMSA9IFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfZHdlaWdodHNfRVNTICAtIFFfQUJTX0JJQVNfUFJPUF9GRU1BTEVfRVhURVJOQUxfbm9fd2VpZ2h0cywKICAgICAgICAgZGVsdGEyID0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfZHdlaWdodHNfRVNTIC0gUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgc3VtbWFyaXNlKG1lYW5YZGlmZmVyZW5jZV9leHRlcm5hbCA9IG1lYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVkaWFuWGRpZmZlcmVuY2VfZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhblhkaWZmZXJlbmNlX2ludGVybmFsID0gbWVhbihkZWx0YTIpLAogICAgICAgICAgICBtZWRpYW5YZGlmZmVyZW5jZV9pbnRlcm5hbCA9IG1lZGlhbihkZWx0YTIpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBwaXZvdF9sb25nZXIoMTo0LCBuYW1lc190byA9IGMoImZ1biIsICJEaWZmZXJlbmNlIiksIHZhbHVlc190byA9ICJ2YWx1ZXMiLCBuYW1lc19zZXAgPSAiWCIpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmdW4sIHZhbHVlc19mcm9tID0gdmFsdWVzKSAlPiUKICBxZmxleHRhYmxlKCkgJT4lIAogIHRoZW1lX2Jvb2t0YWJzKCkgJT4lCiAgY29sZm9ybWF0X251bShqID0gMjozLCBkaWdpdHMgPSAxLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IFdJVEhJTi1QUk9KRUNUIERJRkZFUkVOQ0VTIEJFVFdFRU4gQklBUyBXSVRIIEFORCBXSVRIT1VUIFBPU1QtU1RSQVRJRklDQVRJT04gV0VJR0hUUyA8L2I+CgpTZWUgVGFibGUgMiBpbiB0aGUgcGFwZXIuCgpgYGB7cn0KRVNNMmUwMiAlPiUgZmlsdGVyKFRfV2VpZ2hpbmdfZmFjdG9yID09ICJUb3RhbCB3ZWlnaHRzIHByZXNlbnQgaW4gZGF0YXNldCIpICU+JSAKICBtdXRhdGUoZGVsdGExID0gUV9BQlNfQklBU19QUk9QX0ZFTUFMRV9FWFRFUk5BTF9wc3dlaWdodHMgLSBRX0FCU19CSUFTX1BST1BfRkVNQUxFX0VYVEVSTkFMX25vX3dlaWdodHMsCiAgICAgICAgIGRlbHRhMiA9IFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX3Bzd2VpZ2h0cyAtIFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMpICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQogIHN1bW1hcmlzZShtZWFuX2V4dGVybmFsID0gbWVhbihkZWx0YTEpLAogICAgICAgICAgICBtZWRpYW5fZXh0ZXJuYWwgPSBtZWRpYW4oZGVsdGExKSwKICAgICAgICAgICAgbWVhbl9pbnRlcm5hbCA9IG1lYW4oZGVsdGEyLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtZWRpYW5faW50ZXJuYWwgPSBtZWRpYW4oZGVsdGEyLCBuYS5ybSA9IFQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICByZW5hbWUoIlByb2plY3QgbmFtZSIgPSBUX1NVUlZFWV9OQU1FLAogICAgICAgICAiTWVhbiBkaWZmZXJlbmNlIFxuIGV4dGVybmFsIiA9IG1lYW5fZXh0ZXJuYWwsCiAgICAgICAgICJNZWRpYW4gZGlmZmVyZW5jZSBcbiBleHRlcm5hbCIgPSBtZWRpYW5fZXh0ZXJuYWwsCiAgICAgICAgICJNZWFuIGRpZmZlcmVuY2UgXG4gaW50ZXJuYWwiID0gbWVhbl9pbnRlcm5hbCwKICAgICAgICAgIk1lZGlhbiBkaWZmZXJlbmNlIFxuIGludGVybmFsIiA9IG1lZGlhbl9pbnRlcm5hbCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JSAKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSAyOjMsIGJpZy5tYXJrID0gIiwiLCBkaWdpdHMgPSAzLCBuYV9zdHIgPSAiTi9BIikKYGBgCjxicj4KPGI+IElOVEVSTkFMIENSSVRFUklBIFdJVEggTk8gV0VJR0hUUzogVEhFIE9VVExJRVJTIDwvYj4KCkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgZGF0YSByZWZlcmVuY2VkIGluIHNlY3Rpb24gNi4KCmBgYHtyfQpFU00yZTAyICU+JQogIGdyb3VwX2J5KFRfU1VSVkVZX05BTUUpICU+JQogIHN1bW1hcmlzZShRMSA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC4yNSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWVkaWFuID0gcXVhbnRpbGUoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgcHJvYnMgPSAwLjI1LCBuYS5ybSA9IFQpLAogICAgICAgICAgICBRMyA9IHF1YW50aWxlKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIHByb2JzID0gMC43NSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgSVFSID0gSVFSKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE91dGxpZXJfdGhyZXNob2xkID0gcXVhbnRpbGUoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgcHJvYnMgPSAwLjc1LCBuYS5ybSA9IFQpICsgMS41ICogSVFSKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMsIG5hLnJtID0gVCksIC5ncm91cHMgPSAnZHJvcCcpICU+JQogIHJlbmFtZSgiUHJvamVjdCBuYW1lIiA9IFRfU1VSVkVZX05BTUUsICJPdXRsaWVyIFxuIHRocmVzaG9sZCIgPSBPdXRsaWVyX3RocmVzaG9sZCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JSAKICBhbGlnbl9ub3R0ZXh0X2NvbChhbGlnbiA9ICJjZW50ZXIiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSAyOjMsIGRpZ2l0cyA9IDIsIG5hX3N0ciA9ICJOL0EiKSAlPiUKICBjb2xmb3JtYXRfbnVtKGogPSA0OjYsIGRpZ2l0cyA9IDMsIG5hX3N0ciA9ICJOL0EiKQpgYGAKPGJyPgpBIGxpc3Qgb2Ygb3V0bGllcnMgYXMgcmVwcmVzZW50ZWQgb24gRmlndXJlIDQuCgpgYGB7cn0KRVNNMmUwMiAlPiUgCiAgZ3JvdXBfYnkoVF9TVVJWRVlfTkFNRSkgJT4lCiAgZmlsdGVyKFFfQUJTX0JJQVNfSU5URVJOQUxfS09ITEVSX25vX3dlaWdodHMgPiBxdWFudGlsZShRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzLCBwcm9icyA9IDAuNzUsIG5hLnJtID0gVCkgKyAxLjUgKiBJUVIoUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cywgbmEucm0gPSBUKSkgJT4lCiAgc2VsZWN0KFRfU1VSVkVZX05BTUUsIFRfU1VSVkVZX1lFQVIsIFRfQ09VTlRSWSwgUV9BQlNfQklBU19JTlRFUk5BTF9LT0hMRVJfbm9fd2VpZ2h0cykgJT4lCiAgcmVuYW1lKCJQcm9qZWN0IG5hbWUiID0gVF9TVVJWRVlfTkFNRSwgIlllYXIiID0gVF9TVVJWRVlfWUVBUiwgIkNvdW50cnkgY29kZSIgPSBUX0NPVU5UUlksICAiSW50ZXJuYWwgYmlhcyIgPSBRX0FCU19CSUFTX0lOVEVSTkFMX0tPSExFUl9ub193ZWlnaHRzKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGBDb3VudHJ5IG5hbWVgID0gY291bnRyeWNvZGUoYENvdW50cnkgY29kZWAsIG9yaWdpbiA9ICJpc28yYyIsIGRlc3RpbmF0aW9uID0gImNvdW50cnkubmFtZSIpKSAlPiUKICByZWxvY2F0ZShgUHJvamVjdCBuYW1lYCwgYFllYXJgLCBgQ291bnRyeSBjb2RlYCwgYENvdW50cnkgbmFtZWAsIGBJbnRlcm5hbCBiaWFzYCkgJT4lCiAgcWZsZXh0YWJsZSgpICU+JSAKICB0aGVtZV9ib29rdGFicygpICU+JQogIGFsaWduKGogPSAyOjQsIGFsaWduID0gImNlbnRlciIpICU+JQogIGFsaWduX25vdHRleHRfY29sKGFsaWduID0gImNlbnRlciIsIGhlYWRlciA9IFQpICU+JQogIGNvbGZvcm1hdF9udW0oZGlnaXRzID0gMywgYmlnLm1hcmsgPSAiIiwgbmFfc3RyID0gIk4vQSIpCmBgYA==