Abstract

TBA

Setup

suppressWarnings(suppressMessages({
  library(knitr)
  library(kableExtra)
  library(htmltools)
  library(tidyverse)
  library(scales)
  library(ExPanDaR)
}))
knitr::opts_chunk$set(fig.align = 'center')

Create Sample

This step reads the raw data provided by ExPanD() and generates the sample for the analysis.

create_sample <- function(df, df_def) {
  # Set infinite numerical variables to NA
  df[, df_def$var_name[df_def$type == "numeric"]] <-
    lapply(df[, df_def$var_name[df_def$type == "numeric"]],
      function(x) ifelse(is.finite(x), x, NA))
 
  # Delete numerical variables that only contain NAs
  all_na_vars <- sapply(df, function (x) all(is.na(x)))
  df_def <- df_def[!all_na_vars,]
  df <- df[, df_def$var_name]
 
  # Drop observations that are NA in variables that are not allowed to
  df <- df[complete.cases(df[, df_def$var_name[which(df_def$can_be_na == FALSE)]]), ]
 
  df <- droplevels(df)
  return(list(df = df, df_def = df_def))
}
 
load("ExPanD_nb_data.Rdata")
 
smp_list <- create_sample(nb_df, nb_df_def)
smp <- smp_list$df
smp_def <- smp_list$df_def

Bar Chart

df <- smp
df$year <- as.factor(df$year)
df$hi1990 <- as.factor(df$hi1990)
p <- ggplot(df, aes(x = year)) +
  geom_bar(aes(fill = hi1990), position = "fill") +
  labs(x = "year", fill = "hi1990", y = "Percent") +
scale_y_continuous(labels = percent_format())
p <- p + scale_x_discrete(breaks = pretty(as.numeric(as.character(df$year)), n = 10))
p

Missing Values

df <- smp
prepare_missing_values_graph(df, "year")

Descriptive Statistics

df <- smp
t <- prepare_descriptive_table(smp)
t$kable_ret  %>%
  kable_styling("condensed", full_width = F, position = "center")
Descriptive Statistics
N Mean Std. dev. Min. 25 % Median 75 % Max.
Y 2,700 583,984.538 1,647,698.584 2,777.000 27,881.000 125,138.000 399,547.000 16,810,260.000
K 2,700 1,822,569.809 5,261,927.515 2,004.000 69,041.250 342,061.500 1,293,640.750 69,379,696.000
pop 2,700 53.207 163.005 1.316 5.891 14.126 40.377 1,369.436
L 2,700 23.456 81.801 0.565 2.475 5.045 14.792 798.368
s 2,700 7.678 3.030 0.893 5.224 8.021 10.273 14.996
alpha_it 2,250 0.456 0.112 0.134 0.381 0.453 0.527 0.836
GDPpc 2,700 13,515.155 14,012.510 313.981 2,453.331 8,046.677 20,912.062 81,879.516
lp 2,700 31,371.190 29,035.164 991.421 6,559.711 21,222.568 51,459.522 153,111.469
h 2,700 2.993 0.792 1.320 2.334 3.038 3.665 5.202
kl 2,700 102,388.866 109,835.164 725.042 15,844.668 59,226.441 166,845.258 552,395.188
kp 2,700 0.442 0.367 0.088 0.288 0.355 0.486 5.367
ky 2,700 2.910 1.254 0.186 2.059 2.817 3.476 11.308
TFP 2,700 949.055 774.396 70.087 361.980 753.693 1,311.020 5,388.233
log_GDPpc_raw 2,700 8.868 1.247 5.749 7.805 8.993 9.948 11.313
log_lp_raw 2,700 9.797 1.179 6.899 8.789 9.963 10.849 11.939
log_ky_raw 2,700 0.966 0.487 -1.680 0.722 1.036 1.246 2.425
log_h_raw 2,700 1.057 0.287 0.278 0.848 1.111 1.299 1.649
log_tfp_raw 2,700 6.537 0.831 4.250 5.892 6.625 7.179 8.592
log_GDPpc 2,700 8.868 1.241 6.134 7.808 8.992 9.953 11.368
log_lp 2,700 9.797 1.174 7.050 8.799 9.971 10.851 11.984
log_ky 2,700 0.966 0.467 -1.807 0.735 1.034 1.243 2.024
log_h 2,700 1.057 0.287 0.266 0.848 1.112 1.297 1.615
log_tfp 2,700 6.537 0.824 4.451 5.876 6.630 7.182 8.595
club_log_lp 2,600 3.760 2.372 1.000 2.000 3.000 5.000 10.000
finalclub_log_lp 2,600 1.298 0.618 1.000 1.000 1.000 1.000 4.000
re_log_lp 2,700 1.000 0.118 0.730 0.903 1.019 1.096 1.188
club_log_ky 2,700 1.000 0.000 1.000 1.000 1.000 1.000 1.000
finalclub_log_ky 2,700 1.000 0.000 1.000 1.000 1.000 1.000 1.000
re_log_ky 2,700 1.000 0.498 -2.441 0.766 1.066 1.274 2.175
club_log_h 2,700 1.463 0.552 1.000 1.000 1.000 2.000 3.000
finalclub_log_h 2,700 1.463 0.552 1.000 1.000 1.000 2.000 3.000
re_log_h 2,700 1.000 0.267 0.280 0.822 1.055 1.219 1.532
club_log_tfp 2,650 2.623 1.916 1.000 1.000 2.000 4.000 7.000
finalclub_log_tfp 2,650 1.566 0.869 1.000 1.000 1.000 2.000 4.000
re_log_tfp 2,700 1.000 0.125 0.661 0.897 1.009 1.096 1.310

Histogram

var <- as.numeric(smp$log_lp[smp$year == "1990"])
hist(var, main="", xlab = "log_lp", col="red", right = FALSE, breaks= 25)

Extreme Observations

df <- smp
vars <- c("country", "year", "GDPpc", "year")
df <- df[df$year == "1990", ]
df <- df[, vars]
df <- droplevels(df[complete.cases(df), ])
if (nrow(df) <= 10) {
  cat("Not enough data to generate table")
} else {
  tab <- prepare_ext_obs_table(df, var = "GDPpc")
  tab$kable_ret %>%
    kable_styling()
}
country year year.1 GDPpc
Switzerland 1990 1990 37,503.441
United States 1990 1990 36,621.109
Norway 1990 1990 30,351.324
Canada 1990 1990 30,233.379
Australia 1990 1990 27,215.979
... ... ... ...
Uganda 1990 1990 805.954
Myanmar 1990 1990 799.932
Mali 1990 1990 727.063
Yemen 1990 1990 694.167
Mozambique 1990 1990 526.026

By Group Bar Graph

df <- smp
df <- df[df$year == "1990", ]
prepare_by_group_bar_graph(df, "hi1990", "lp", mean, TRUE)$plot +
  ylab("mean lp")

By Group Violin Graph

df <- smp
prepare_by_group_violin_graph(df, "region", "log_lp", TRUE)

Trend Graph

df <- smp
prepare_trend_graph(df, "year", c("lp"))$plot

Quantile Trend Graph

df <- smp
prepare_quantile_trend_graph(df, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "lp")$plot

lp

log_lp_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_lp_raw")$plot
log_lp_raw <- log_lp_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Labor Productivity")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("quintiles_all_log_lp_raw.pdf", width = 6, height = 4)
Qre_log_lp_World <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "re_log_lp")$plot
Qre_log_lp_World +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Relative (log) labor productivity")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("Qre_log_lp_World.pdf", width = 6, height = 4)

ky

log_ky_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_ky_raw")$plot
log_ky_raw <- log_ky_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Capital-Output Ratio")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("quintiles_all_log_ky_raw.pdf", width = 6, height = 4)

h

log_h_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_h_raw")$plot
log_h_raw <- log_h_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Human Capital")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("quintiles_all_log_h_raw.pdf", width = 6, height = 4)

TFP

log_tfp_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_tfp_raw")$plot
log_tfp_raw <- log_tfp_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Aggregate Efficiency")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("quintiles_all_log_tfp_raw.pdf", width = 6, height = 4)

Correlation Graph

df <- smp
ret <- prepare_correlation_graph(df[, c(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29, 30, 31, 34, 35, 36, 37, 38, 39, 40)])

Scatter Plot

df <- smp
df <- df[, c("country", "year", "log_lp", "log_GDPpc", "region", "pop")]
df <- df[complete.cases(df), ]
df$region <- as.factor(df$region)
set.seed(42)
df <- sample_n(df, 1000)
prepare_scatter_plot(df, "log_lp", "log_GDPpc", color = "region", size = "pop", loess = 1)

Regresssion Table

df <- smp
df <- df[, c("log_lp", "log_ky", "log_h", "log_tfp", "country", "year", "hi1990")]
df <- df[complete.cases(df), ]
df$hi1990 <- as.factor(df$hi1990)
df <- droplevels(df)
t <- prepare_regression_table(df, dvs = "log_lp", idvs = c("log_ky", "log_h", "log_tfp"), feffects = c("country", "year"), clusters = c("country", "year"), byvar = "hi1990", models = "ols")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
HTML(t$table)
Dependent variable:
log_lp
Full Samplenoyes
(1)(2)(3)
log_ky0.472***0.483***0.469***
(0.031)(0.032)(0.060)
log_h0.226*0.1830.435***
(0.132)(0.168)(0.135)
log_tfp1.447***1.503***1.180***
(0.042)(0.048)(0.064)
Estimatorolsolsols
Fixed effectscountry, yearcountry, yearcountry, year
Std. errors clusteredcountry, yearcountry, yearcountry, year
Observations2,7002,050650
R20.9980.9970.988
Adjusted R20.9980.9970.987
Note:*p<0.1; **p<0.05; ***p<0.01

Note

This Notebook has been automatically generated using the ExPanDaR package.

LS0tCnRpdGxlOiBkYXRfYWxsX2ZpbmFsCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIAogCiMjIyBBYnN0cmFjdApUQkEKIAogCiMjIyBTZXR1cAogCmBgYHtyIHNldHVwfQpzdXBwcmVzc1dhcm5pbmdzKHN1cHByZXNzTWVzc2FnZXMoewogIGxpYnJhcnkoa25pdHIpCiAgbGlicmFyeShrYWJsZUV4dHJhKQogIGxpYnJhcnkoaHRtbHRvb2xzKQogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoRXhQYW5EYVIpCn0pKQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduID0gJ2NlbnRlcicpCmBgYAogCiAKIyMjIENyZWF0ZSBTYW1wbGUKIApUaGlzIHN0ZXAgcmVhZHMgdGhlIHJhdyBkYXRhIHByb3ZpZGVkIGJ5IGBFeFBhbkQoKWAgYW5kIGdlbmVyYXRlcyB0aGUgc2FtcGxlIGZvciB0aGUgYW5hbHlzaXMuCiAKYGBge3IgY3JlYXRlX3NhbXBsZX0KY3JlYXRlX3NhbXBsZSA8LSBmdW5jdGlvbihkZiwgZGZfZGVmKSB7CiAgIyBTZXQgaW5maW5pdGUgbnVtZXJpY2FsIHZhcmlhYmxlcyB0byBOQQogIGRmWywgZGZfZGVmJHZhcl9uYW1lW2RmX2RlZiR0eXBlID09ICJudW1lcmljIl1dIDwtCiAgICBsYXBwbHkoZGZbLCBkZl9kZWYkdmFyX25hbWVbZGZfZGVmJHR5cGUgPT0gIm51bWVyaWMiXV0sCiAgICAgIGZ1bmN0aW9uKHgpIGlmZWxzZShpcy5maW5pdGUoeCksIHgsIE5BKSkKIAogICMgRGVsZXRlIG51bWVyaWNhbCB2YXJpYWJsZXMgdGhhdCBvbmx5IGNvbnRhaW4gTkFzCiAgYWxsX25hX3ZhcnMgPC0gc2FwcGx5KGRmLCBmdW5jdGlvbiAoeCkgYWxsKGlzLm5hKHgpKSkKICBkZl9kZWYgPC0gZGZfZGVmWyFhbGxfbmFfdmFycyxdCiAgZGYgPC0gZGZbLCBkZl9kZWYkdmFyX25hbWVdCiAKICAjIERyb3Agb2JzZXJ2YXRpb25zIHRoYXQgYXJlIE5BIGluIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0bwogIGRmIDwtIGRmW2NvbXBsZXRlLmNhc2VzKGRmWywgZGZfZGVmJHZhcl9uYW1lW3doaWNoKGRmX2RlZiRjYW5fYmVfbmEgPT0gRkFMU0UpXV0pLCBdCiAKICBkZiA8LSBkcm9wbGV2ZWxzKGRmKQogIHJldHVybihsaXN0KGRmID0gZGYsIGRmX2RlZiA9IGRmX2RlZikpCn0KIApsb2FkKCJFeFBhbkRfbmJfZGF0YS5SZGF0YSIpCiAKc21wX2xpc3QgPC0gY3JlYXRlX3NhbXBsZShuYl9kZiwgbmJfZGZfZGVmKQpzbXAgPC0gc21wX2xpc3QkZGYKc21wX2RlZiA8LSBzbXBfbGlzdCRkZl9kZWYKYGBgCiAKIAojIyMgQmFyIENoYXJ0CiAKYGBge3IgYmFyX2NoYXJ0fQpkZiA8LSBzbXAKZGYkeWVhciA8LSBhcy5mYWN0b3IoZGYkeWVhcikKZGYkaGkxOTkwIDwtIGFzLmZhY3RvcihkZiRoaTE5OTApCnAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHllYXIpKSArCiAgZ2VvbV9iYXIoYWVzKGZpbGwgPSBoaTE5OTApLCBwb3NpdGlvbiA9ICJmaWxsIikgKwogIGxhYnMoeCA9ICJ5ZWFyIiwgZmlsbCA9ICJoaTE5OTAiLCB5ID0gIlBlcmNlbnQiKSArCnNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdCgpKQpwIDwtIHAgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHByZXR0eShhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkZiR5ZWFyKSksIG4gPSAxMCkpCnAKYGBgCiAKIAojIyMgTWlzc2luZyBWYWx1ZXMKIApgYGB7ciBtaXNzaW5nX3ZhbHVlc30KZGYgPC0gc21wCnByZXBhcmVfbWlzc2luZ192YWx1ZXNfZ3JhcGgoZGYsICJ5ZWFyIikKYGBgCiAKIAojIyMgRGVzY3JpcHRpdmUgU3RhdGlzdGljcwogCmBgYHtyIGRlc2NyaXB0aXZlX3N0YXRpc3RpY3N9CmRmIDwtIHNtcAp0IDwtIHByZXBhcmVfZGVzY3JpcHRpdmVfdGFibGUoc21wKQp0JGthYmxlX3JldCAgJT4lCiAga2FibGVfc3R5bGluZygiY29uZGVuc2VkIiwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImNlbnRlciIpCmBgYAogCiAKIyMjIEhpc3RvZ3JhbQogCmBgYHtyIGhpc3RvZ3JhbX0KdmFyIDwtIGFzLm51bWVyaWMoc21wJGxvZ19scFtzbXAkeWVhciA9PSAiMTk5MCJdKQpoaXN0KHZhciwgbWFpbj0iIiwgeGxhYiA9ICJsb2dfbHAiLCBjb2w9InJlZCIsIHJpZ2h0ID0gRkFMU0UsIGJyZWFrcz0gMjUpCmBgYAogCiAKIyMjIEV4dHJlbWUgT2JzZXJ2YXRpb25zCiAKYGBge3IgZXh0cmVtZV9vYnN9CmRmIDwtIHNtcAp2YXJzIDwtIGMoImNvdW50cnkiLCAieWVhciIsICJHRFBwYyIsICJ5ZWFyIikKZGYgPC0gZGZbZGYkeWVhciA9PSAiMTk5MCIsIF0KZGYgPC0gZGZbLCB2YXJzXQpkZiA8LSBkcm9wbGV2ZWxzKGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgXSkKaWYgKG5yb3coZGYpIDw9IDEwKSB7CiAgY2F0KCJOb3QgZW5vdWdoIGRhdGEgdG8gZ2VuZXJhdGUgdGFibGUiKQp9IGVsc2UgewogIHRhYiA8LSBwcmVwYXJlX2V4dF9vYnNfdGFibGUoZGYsIHZhciA9ICJHRFBwYyIpCiAgdGFiJGthYmxlX3JldCAlPiUKICAgIGthYmxlX3N0eWxpbmcoKQp9CmBgYAogCiAKIyMjIEJ5IEdyb3VwIEJhciBHcmFwaAogCmBgYHtyIGJ5X2dyb3VwX2Jhcl9ncmFwaH0KZGYgPC0gc21wCmRmIDwtIGRmW2RmJHllYXIgPT0gIjE5OTAiLCBdCnByZXBhcmVfYnlfZ3JvdXBfYmFyX2dyYXBoKGRmLCAiaGkxOTkwIiwgImxwIiwgbWVhbiwgVFJVRSkkcGxvdCArCiAgeWxhYigibWVhbiBscCIpCmBgYAogCiAKIyMjIEJ5IEdyb3VwIFZpb2xpbiBHcmFwaAogCmBgYHtyIGJ5X2dyb3VwX3Zpb2xpbl9ncmFwaH0KZGYgPC0gc21wCnByZXBhcmVfYnlfZ3JvdXBfdmlvbGluX2dyYXBoKGRmLCAicmVnaW9uIiwgImxvZ19scCIsIFRSVUUpCmBgYAogCiAKIyMjIFRyZW5kIEdyYXBoCiAKYGBge3IgdHJlbmRfZ3JhcGh9CmRmIDwtIHNtcApwcmVwYXJlX3RyZW5kX2dyYXBoKGRmLCAieWVhciIsIGMoImxwIikpJHBsb3QKYGBgCiAKIAojIyMgUXVhbnRpbGUgVHJlbmQgR3JhcGgKIApgYGB7ciBxdWFudGlsZV90cmVuZF9ncmFwaH0KZGYgPC0gc21wCnByZXBhcmVfcXVhbnRpbGVfdHJlbmRfZ3JhcGgoZGYsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibHAiKSRwbG90CmBgYAogCiAKIyMjIyBscCAgCmBgYHtyfQpsb2dfbHBfcmF3IDwtIHByZXBhcmVfcXVhbnRpbGVfdHJlbmRfZ3JhcGgoc21wLCAieWVhciIsIGMoMC4wNSwgMC4yNSwgMC41LCAwLjc1LCAwLjk1KSwgImxvZ19scF9yYXciKSRwbG90CmBgYAoKCmBgYHtyfQpsb2dfbHBfcmF3IDwtIGxvZ19scF9yYXcgKwp0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlF1YW50aWxlIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJMb2cgb2YgTGFib3IgUHJvZHVjdGl2aXR5IikKZ2dzYXZlKCJxdWludGlsZXNfYWxsX2xvZ19scF9yYXcucGRmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA0KQpgYGAKCmBgYHtyfQpRcmVfbG9nX2xwX1dvcmxkIDwtIHByZXBhcmVfcXVhbnRpbGVfdHJlbmRfZ3JhcGgoc21wLCAieWVhciIsIGMoMC4wNSwgMC4yNSwgMC41LCAwLjc1LCAwLjk1KSwgInJlX2xvZ19scCIpJHBsb3QKYGBgCgoKYGBge3J9ClFyZV9sb2dfbHBfV29ybGQgKwp0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlF1YW50aWxlIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJSZWxhdGl2ZSAobG9nKSBsYWJvciBwcm9kdWN0aXZpdHkiKQpnZ3NhdmUoIlFyZV9sb2dfbHBfV29ybGQucGRmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA0KQpgYGAKCgoKCiMjIyMga3kgIAoKYGBge3J9CmxvZ19reV9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX2t5X3JhdyIpJHBsb3QKYGBgCgoKYGBge3J9CmxvZ19reV9yYXcgPC0gbG9nX2t5X3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBDYXBpdGFsLU91dHB1dCBSYXRpbyIpCmdnc2F2ZSgicXVpbnRpbGVzX2FsbF9sb2dfa3lfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgICAgCgoKIyMjIyBoICAKCmBgYHtyfQpsb2dfaF9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX2hfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX2hfcmF3IDwtIGxvZ19oX3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBIdW1hbiBDYXBpdGFsIikKZ2dzYXZlKCJxdWludGlsZXNfYWxsX2xvZ19oX3Jhdy5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDQpCmBgYCAgCgoKIyMjIyBURlAgIAoKYGBge3J9CmxvZ190ZnBfcmF3IDwtIHByZXBhcmVfcXVhbnRpbGVfdHJlbmRfZ3JhcGgoc21wLCAieWVhciIsIGMoMC4wNSwgMC4yNSwgMC41LCAwLjc1LCAwLjk1KSwgImxvZ190ZnBfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX3RmcF9yYXcgPC0gbG9nX3RmcF9yYXcgKwp0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlF1YW50aWxlIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJMb2cgb2YgQWdncmVnYXRlIEVmZmljaWVuY3kiKQpnZ3NhdmUoInF1aW50aWxlc19hbGxfbG9nX3RmcF9yYXcucGRmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA0KQpgYGAgICAKCiAKIyMjIENvcnJlbGF0aW9uIEdyYXBoCiAKYGBge3IgY29ycnBsb3R9CmRmIDwtIHNtcApyZXQgPC0gcHJlcGFyZV9jb3JyZWxhdGlvbl9ncmFwaChkZlssIGMoMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI5LCAzMCwgMzEsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwKV0pCmBgYAogCiAKIyMjIFNjYXR0ZXIgUGxvdAogCmBgYHtyIHNjYXR0ZXJfcGxvdH0KZGYgPC0gc21wCmRmIDwtIGRmWywgYygiY291bnRyeSIsICJ5ZWFyIiwgImxvZ19scCIsICJsb2dfR0RQcGMiLCAicmVnaW9uIiwgInBvcCIpXQpkZiA8LSBkZltjb21wbGV0ZS5jYXNlcyhkZiksIF0KZGYkcmVnaW9uIDwtIGFzLmZhY3RvcihkZiRyZWdpb24pCnNldC5zZWVkKDQyKQpkZiA8LSBzYW1wbGVfbihkZiwgMTAwMCkKcHJlcGFyZV9zY2F0dGVyX3Bsb3QoZGYsICJsb2dfbHAiLCAibG9nX0dEUHBjIiwgY29sb3IgPSAicmVnaW9uIiwgc2l6ZSA9ICJwb3AiLCBsb2VzcyA9IDEpCmBgYAogCiAKIyMjIFJlZ3Jlc3NzaW9uIFRhYmxlCiAKYGBge3IgcmVncmVzc2lvbn0KZGYgPC0gc21wCmRmIDwtIGRmWywgYygibG9nX2xwIiwgImxvZ19reSIsICJsb2dfaCIsICJsb2dfdGZwIiwgImNvdW50cnkiLCAieWVhciIsICJoaTE5OTAiKV0KZGYgPC0gZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdCmRmJGhpMTk5MCA8LSBhcy5mYWN0b3IoZGYkaGkxOTkwKQpkZiA8LSBkcm9wbGV2ZWxzKGRmKQp0IDwtIHByZXBhcmVfcmVncmVzc2lvbl90YWJsZShkZiwgZHZzID0gImxvZ19scCIsIGlkdnMgPSBjKCJsb2dfa3kiLCAibG9nX2giLCAibG9nX3RmcCIpLCBmZWZmZWN0cyA9IGMoImNvdW50cnkiLCAieWVhciIpLCBjbHVzdGVycyA9IGMoImNvdW50cnkiLCAieWVhciIpLCBieXZhciA9ICJoaTE5OTAiLCBtb2RlbHMgPSAib2xzIikKSFRNTCh0JHRhYmxlKQpgYGAKIAogCiMjIyBOb3RlCiAKVGhpcyBOb3RlYm9vayBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB1c2luZyB0aGUgW0V4UGFuRGFSXShodHRwczovL2pvYWNoaW0tZ2Fzc2VuLmdpdGh1Yi5pby9FeFBhbkRhUikgcGFja2FnZS4KIAo=