In this script, I write the code to make some plots and tables that I use to in the data and analysis section. You will find the code for the plot with datasets per year, the Table with individual regression analysis for one variable of ISSP and the Table with all the pooled effects.

library(dplyr)
library(ggplot2)
library(kableExtra)
library(modelsummary)
library(tidyverse)
library(writexl)
library(readxl)
library(gamlss)
library(metafor)
library(meta)
library(ggrepel)
rm(list=ls())

Ggplot that shows the years that each dataset covers

datayear <- read_excel("./data/descriptives/dataset_year.xlsx")
datayear <- as.data.frame(datayear)
color_scale <- c ("#E02023", "#1676E3", "#20C66B", "#1ABC9C", "#85C1E9" , "#EB984E", "#AF7AC5" , "#F1C40F")
datayear$dataset <- factor(datayear$dataset, levels = c("MOT", "SOCON", "LISS", "I&O", "ESS", "ISSP", "EVS", "EB"))
datayear$color[datayear$dataset == "I&O"] <- "#1ABC9C"
datayear$color[datayear$dataset == "ESS"] <- "#85C1E9"
datayear$color[datayear$dataset == "ISSP"] <- "#EB984E"
datayear$color[datayear$dataset == "EVS"] <- "#AF7AC5"
datayear$color[datayear$dataset == "EB"] <- "#F1C40F"
datayear$color[datayear$dataset == "MOT"] <- "#E02023"
datayear$color[datayear$dataset == "SOCON"] <- "#1676E3"
datayear$color[datayear$dataset == "LISS"] <- "#20C66B"

first_last_year <- datayear %>%
  group_by(dataset) %>%
  summarize(first_year = min(year),
            last_year = max(year))

yearplot <- ggplot(data = datayear, aes(x = year, y = dataset, color = color)) +
  geom_point(size = 2) +
  geom_line(aes(group = dataset), size = 1) +
  geom_text(data = first_last_year, aes(x = first_year, y = dataset, label = as.character(first_year)),
            vjust = -1, color = "darkgrey", size = 3, show.legend = FALSE) + 
    geom_text(data = first_last_year, aes(x = last_year, y = dataset, label = as.character(last_year)),
            vjust = -1, color = "darkgrey", size = 3, show.legend = FALSE) +
  scale_color_manual(values = color_scale) +
  labs(x = "Year", y = "Dataset") +
  theme_classic() + 
  theme(legend.position = "none")
print(yearplot)

ggsave("yearplot.png", width = 7, height = 5, path = "./output/yearplot_DEC.png")

Table of the GAMLSS regression output

# Run this piece of code so that in the Table beneath it will not show NAs
options(knitr.kable.NA = '')
# Illustrate the gamlss regressions by showing one from ISSP with kable extra
load("./data/final_data/regression_outputs/issp_list_empty_w.Rdata")
load("./data/final_data/regression_outputs/issp_list_preds_w_new.Rdata")
load("./data/final_data/regression_outputs/issp_list_interactions_w_new.Rdata"))

# Use first variable, which is "worry"
model_time_only <- summary(issp_list_empty[[1]])
model_time_only_df <- as.data.frame(model_time_only)
model_time_only_df$mu_sigma <- c("Mu", "", "Sigma", "")
model_time_only_df$variables <- c("Intercept", "Time", "Intercept", "Time")
model_time_only_df <- model_time_only_df %>% dplyr:: select(mu_sigma, variables, everything())
rownames(model_time_only_df) <- NULL

model_indep_df <- as.data.frame(summary(issp_list_preds[[1]]))
model_indep_df$mu_sigma <- c("Mu", "", "", "", "", "","Sigma", "", "", "", "", "")
model_indep_df$variables <- c("Intercept", "Time", "Gender",  "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Age", "Intercept", "Time", "Gender",  "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Age")
model_indep_df <- model_indep_df %>% dplyr::select(mu_sigma, variables, everything())
rownames(model_indep_df) <- NULL

model_interact_df <- as.data.frame(summary(issp_list_interactions[[1]]))
model_interact_df$mu_sigma <- c("Mu", "", "", "", "", "", "", "", "", "", "Sigma", "", "", "", "", "", "", "", "", "")
model_interact_df$variables <- c("Intercept", "Time", "Gender",  "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Age", "Age x time", "Gender x time", "Isced intermediate x time", "Isced advanced x time", "Intercept", "Time", "Gender",  "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Age", "Age x time", "Gender x time", "Isced intermediate x time", "Isced advanced x time")
model_interact_df <- model_interact_df %>% dplyr::select(mu_sigma, variables, everything())
rownames(model_interact_df) <- NULL

# Difficult to columnbind them, because they're of different lengths (logically), so use a function
df_list <- list(model_time_only_df, model_indep_df, model_interact_df)

bind_cols_fill <- function(df_list) {

  max_rows <- map_int(df_list, nrow) %>% max()
  
  map(df_list, function(df) {
    if(nrow(df) == max_rows) return(df)
    first <- names(df)[1] %>% sym()
    df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
  }) %>% bind_cols()
}

model_total <- bind_cols_fill(df_list)

model_total[is.na(model_total)] <- ""

# The dataframe is binded, the order is not totally how i want it. The data are now all centered at the top, but for the 
# previous models, I need the data to be centered around the mu/intercept and sigma/intercept (with a lot of blank spaces). # Furthermore, some variables have a name that has special signs in them, which causes R not to recognize them. To make it #easy, I quickly fix these things in Excel. I don't make any changes to the data
#write_xlsx(model_total, "./data/descriptives/kable_model_total_gamlss.xlsx" )
model_new <- read_excel("./data/descriptives/kable_model_total_gamlss.xlsx" )

# I Want to round the numeric variables to 3 decimals
model_new <- dplyr::mutate(model_new, across(.cols = c(-mu_sigma, -variables), .fns= as.numeric))
numeric_cols <- sapply(model_new, is.numeric)
model_new[, numeric_cols] <- round(model_new[, numeric_cols], digits = 3)

# There are some annoying variable names that R can't recognize because it has spacing, so rename the columns
colnames(model_new) <- (c("mu_sigma", "Variables", "est_time", "std_err_time", "p_time", "est_indep", "std_err_indep", "p_indep", "est_inter", "std_error_inter", "p_inter", "p_text_time_only", "p_text_indep", "p_text_inter"))

# Create a new variable to use stars instead of the full p-values in the table
model_new$p_text_time_only <- case_when(
  model_new$p_time >= 0.05 ~ "",
model_new$p_time < 0.001 ~ "***",
model_new$p_time < 0.01 ~ "**",
model_new$p_time < 0.05 ~ "*"
)

model_new$p_text_indep <- case_when(
  model_new$p_indep >= 0.05 ~ "",
model_new$p_indep < 0.001 ~ "***",
model_new$p_indep < 0.01 ~ "**",
model_new$p_indep < 0.05 ~ "*"
)

model_new$p_text_inter <- case_when(
  model_new$p_inter >= 0.05 ~ "",
model_new$p_inter < 0.001 ~ "***",
model_new$p_inter < 0.01 ~ "**",
model_new$p_inter < 0.05 ~ "*"
)

# Now only select the variables that I want to show in the table
model_new <- dplyr::select(model_new, mu_sigma, Variables, est_time, std_err_time, p_text_time_only, est_indep, std_err_indep, p_text_indep, est_inter, std_error_inter, p_text_inter)

# Make and save the table 
kable(model_new, digits = 3, caption = "Table 2. GAMLSS model on worry ISSP (1993 - 2010)", 
      col.names = c( "", "Variables", "Estimate", "Std. Error", "", "Estimate", "Std. Error", "", "Estimate", "Std. Error", ""), align = "l") %>%
  kable_classic_2(html_font = "Times", fixed_thead = T, full_width = F) %>%
  add_header_above(c(" " = 2, "Time-only model" = 3, "Indepent var model" = 3, "Interaction model" = 3), align = "l") %>%
   footnote(
    general_title = "Note.",
    general = "*** = p < 0.001, ** = p < 0.01, * = p < 0.05",
    threeparttable = TRUE,
    footnote_as_chunk = TRUE
    ) 
Table 2. GAMLSS model on worry ISSP (1993 - 2010)
Time-only model
Indepent var model
Interaction model
Variables Estimate Std. Error Estimate Std. Error Estimate Std. Error
Mu Intercept 3.358 0.029 *** 3.453 0.086 *** 3.602 0.120 ***
Time -0.005 0.003 -0.011 0.003 *** -0.045 0.015 **
Gender 0.183 0.038 *** 0.173 0.055 **
Isced intermediate (ref=basic) 0.468 0.040 *** 0.397 0.055 ***
Isced advanced (ref=basic) 0.002 0.031 0.004 0.045
Age -0.008 0.001 *** -0.011 0.002 ***
Age x time 0.000 0.000
Gender x time 0.002 0.005
Isced intermediate x time 0.009 0.008
Isced advanced x time 0.016 0.008
Sigma Intercept 1.065 0.020 *** 1.109 0.061 *** 1.038 0.085 ***
Time 0.001 0.002 0.003 0.002 0.008 0.011
Gender -0.087 0.027 ** -0.070 0.039
Isced intermediate (ref=basic) -0.093 0.028 ** -0.122 0.039 **
Isced advanced (ref=basic) -0.028 0.022 -0.023 0.032
Age 0.000 0.001 0.002 0.001
Age x time 0.000 0.000
Gender x time -0.002 0.004
Isced intermediate x time 0.006 0.006
Isced advanced x time 0.006 0.006
Note. *** = p < 0.001, ** = p < 0.01, * = p < 0.05
#%>%
    #save_kable("/Users/anuschka/Documents/climatechange/climatechange/output/gamlss_table.pdf")

Table all pooled effects

rm(list=ls())
# I want to repeat the above Table, but instead of regressions I now want to put all the pooled effects in there
# Starting with the time only model
# You may notice that I use the rma function and metagen. The estimate TE.random of metagen (pooled effect) is the same as the beta in the rma model
set.seed(1) #(as I am performing analyses with a random aspect)

load("./data/meta_analysis/total_reg_results_gam_w_new.RData")

# Extract the pooled effects, first mean attitudes
model_step_1_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              method = "ML",
              test = "knha")

one <- summary(model_step_1_att)
one_df <- data.frame(matrix(ncol = 5, nrow = 1))
colnames(one_df) <- c("mu_sigma", "Variable", "Estimate", "SE", "p")

one_df$mu_sigma <- c("Mean attitudes")
one_df$Variable <- "Time"
one_df$Estimate <- as.numeric(one$b)
one_df$SE <- one$se
one_df$p <- one$pval

# And now variance
model_step_1_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_reg_results,
              method = "ML",
              test = "knha")

two <- summary(model_step_1_var)
two_df <- data.frame(matrix(ncol = 5, nrow = 1))
colnames(two_df) <- c("mu_sigma", "Variable", "Estimate", "SE", "p")

two_df$mu_sigma <- c("Polarization attitudes")
two_df$Variable <- "Time"
two_df$Estimate <- as.numeric(two$b)
two_df$SE <- two$se
two_df$p <- two$pval

# Rowbind them, these are all the pooled effects of the time-only model
empty_df <- rbind(one_df, two_df)

# Now continue with the independent variable model, first the mean attitudes 
load("./data/meta_analysis/total_indep_var_results_new.RData")

m2_att <- rma(yi = mu_time_pred,
              sei = mu_time_sd_pred,
              data = total_reg_results,
              method = "ML",
              test = "knha")

# Gender 
gender_gen <- metagen(TE = mu_sex_est,
                 seTE = mu_sex_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age 
age_gen <- metagen(TE = mu_age_est,
                 seTE = mu_age_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Educational level. This is now a dummy
edu_med_gen <- metagen(TE = mu_isced_med_est,
                 seTE = mu_isced_med_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_high_gen <- metagen(TE = mu_isced_high_est,
                 seTE = mu_isced_high_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Extract all the data from the models and put them in a dataframe that will later be the input of the kable table
three_df <- data.frame(matrix(ncol = 5, nrow = 5))
colnames(three_df) <- c("mu_sigma_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
three_df$mu_sigma_1 <- c("Mean attitudes", "", "", "", "")
three_df$Variable_1 <- c("Time", "Gender", "Age", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)")
three_df$Estimate_1 <- c(as.numeric(m2_att$b), gender_gen$TE.random, age_gen$TE.random, edu_med_gen$TE.random, edu_high_gen$TE.random)
three_df$SE_1 <- c(m2_att$se, gender_gen$seTE.random, age_gen$seTE.random, edu_med_gen$seTE.random, edu_high_gen$seTE.random)
three_df$p_1 <- c(m2_att$pval, gender_gen$pval.random, age_gen$pval.random, edu_med_gen$pval.random, edu_high_gen$pval.random)                       
                       
# The same for variance
m2_var <- rma(yi = sig_time_pred,
              sei = sig_time_sd_pred,
              data = total_reg_results,
              method = "ML",
              test = "knha")

# Gender
gender_var_gen <- metagen(TE = sig_sex_est,
                 seTE = sig_sex_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age
age_var_gen <- metagen(TE = sig_age_est,
                 seTE = sig_age_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Education
edu_var_med_gen <- metagen(TE = sig_isced_med_est,
                 seTE = sig_isced_med_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_var_high_gen <- metagen(TE = sig_isced_high_est,
                 seTE = sig_isced_high_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

four_df <- data.frame(matrix(ncol = 5, nrow = 5))
colnames(four_df) <- c("mu_sigma_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
four_df$mu_sigma_1 <- c("Polarization attitudes", "", "", "", "")
four_df$Variable_1 <- c("Time", "Gender", "Age", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)")
four_df$Estimate_1 <- c(as.numeric(m2_var$b), gender_var_gen$TE.random, age_var_gen$TE.random, edu_var_med_gen$TE.random, edu_var_high_gen$TE.random)
four_df$SE_1 <- c(m2_att$se, gender_var_gen$seTE.random, age_var_gen$seTE.random, edu_var_med_gen$seTE.random, edu_var_high_gen$seTE.random)
four_df$p_1 <- c(m2_att$pval, gender_var_gen$pval.random, age_var_gen$pval.random, edu_var_med_gen$pval.random, edu_var_high_gen$pval.random)


# Bind rows of these two, these are all the pooled effects of the independent variables model
indep_df <- rbind(three_df, four_df)

#Now i want the interaction model as well
load("./data/meta_analysis/total_inter_results_new.RData")

# First mean attitudes
m3_att <- rma(yi = mu_time_int,
              sei = mu_time_sd_int,
              data = total_reg_results,
              method = "ML",
              test = "knha")

# Gender 
gender_gen_int <- metagen(TE = mu_sex_est,
                 seTE = mu_sex_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age 
age_gen_int <- metagen(TE = mu_age_est,
                 seTE = mu_age_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Educational level
edu_med_gen_int <- metagen(TE = mu_isced_med_est,
                 seTE = mu_isced_med_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_high_gen_int <- metagen(TE = mu_isced_high_est,
                 seTE = mu_isced_high_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# And the interaction effects 
# Gender 
gender_int_eff <- metagen(TE = mu_sex_est_inter,
                 seTE = mu_sex_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age 
age_int_eff <- metagen(TE = mu_age_est_inter,
                 seTE = mu_age_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Educational level
edu_med_int_eff <- metagen(TE = mu_isced_med_est_inter,
                 seTE = mu_isced_med_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_high_int_eff <- metagen(TE = mu_isced_high_est_inter,
                 seTE = mu_isced_high_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Now extract the data for a table
five_df <- data.frame(matrix(ncol = 5, nrow = 9))
colnames(five_df) <- c("mu_sigma_2", "Variable_2", "Estimate_2", "SE_2", "p_2")
five_df$mu_sigma_2 <- c("Mean attitudes", "", "", "", "", "", "", "", "")
five_df$Variable_2 <- c("Time", "Gender", "Age", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Gender x time", "Age x time", "Isced intermediate x time", "Isced advanced x time")
five_df$Estimate_2 <- c(as.numeric(m3_att$b), gender_gen_int$TE.random, age_gen_int$TE.random, edu_med_gen_int$TE.random, edu_high_gen_int$TE.random, gender_int_eff$TE.random, age_int_eff$TE.random, edu_med_int_eff$TE.random, edu_high_int_eff$TE.random)
five_df$SE_2 <- c(m3_att$se, gender_gen_int$seTE.random, age_gen_int$seTE.random, edu_med_gen_int$seTE.random, edu_high_gen_int$seTE.random, gender_int_eff$seTE.random, age_int_eff$seTE.random, edu_med_int_eff$seTE.random, edu_high_int_eff$seTE.random)
five_df$p_2 <- c(m3_att$pval, gender_gen_int$pval.random, age_gen_int$pval.random, edu_med_gen_int$pval.random, edu_high_gen_int$pval.random, gender_int_eff$pval.random, age_int_eff$pval.random, edu_med_int_eff$pval.random, edu_high_int_eff$pval.random)

# Now the same procedure for the variance
m3_var <- rma(yi = sig_time_int,
              sei = sig_time_sd_int,
              data = total_reg_results,
              method = "ML",
              test = "knha")

# Gender 
gender_gen_int_var <- metagen(TE = sig_sex_est,
                 seTE = sig_sex_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age 
age_gen_int_var <- metagen(TE = sig_age_est,
                 seTE = sig_age_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Educational level
edu_med_gen_int_var <- metagen(TE = sig_isced_med_est,
                 seTE = sig_isced_med_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_high_gen_int_var <- metagen(TE = sig_isced_high_est,
                 seTE = sig_isced_high_sd,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# And the interaction effects 
# Gender 
gender_int_eff_var <- metagen(TE = sig_sex_est_inter,
                 seTE = sig_sex_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Age 
age_int_eff_var <- metagen(TE = sig_age_est_inter,
                 seTE = sig_age_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

# Educational level
edu_med_int_eff_var <- metagen(TE = sig_isced_med_est_inter,
                 seTE = sig_isced_med_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

edu_high_int_eff_var <- metagen(TE = sig_isced_high_est_inter,
                 seTE = sig_isced_high_sd_inter,
                 data = total_inter_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "ML",
                 hakn = TRUE)

six_df <- data.frame(matrix(ncol = 5, nrow = 9))
colnames(six_df) <- c("mu_sigma_2", "Variable_2", "Estimate_2", "SE_2", "p_2")
six_df$mu_sigma_2 <- c("Polarization attitudes", "", "", "", "", "", "", "", "")
six_df$Variable_2 <- c("Time", "Gender", "Age", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)", "Gender x time", "Age x time", "Isced intermediate x time", "Isced advanced x time")
six_df$Estimate_2 <- c(as.numeric(m3_var$b), gender_gen_int_var$TE.random, age_gen_int_var$TE.random, edu_med_gen_int_var$TE.random, edu_high_gen_int_var$TE.random, gender_int_eff_var$TE.random, age_int_eff_var$TE.random, edu_med_int_eff_var$TE.random, edu_high_int_eff_var$TE.random)
six_df$SE_2 <- c(m3_var$se, gender_gen_int_var$seTE.random, age_gen_int_var$seTE.random, edu_med_gen_int_var$seTE.random, edu_high_gen_int_var$seTE.random, gender_int_eff_var$seTE.random, age_int_eff_var$seTE.random, edu_med_int_eff_var$seTE.random, edu_high_int_eff_var$seTE.random)
six_df$p_2 <- c(m3_att$pval, gender_gen_int_var$pval.random, age_gen_int_var$pval.random, edu_med_gen_int_var$pval.random, edu_high_gen_int_var$pval.random, gender_int_eff_var$pval.random, age_int_eff_var$pval.random, edu_med_int_eff_var$pval.random, edu_high_int_eff_var$pval.random)

#Bind these two, this now has all the pooled effects of the interaction effects
inter_df <- rbind(five_df, six_df)
#Columnbind the three datasets
# Difficult to columnbind them, because they're of different lengths (logically)
df_list <- list(empty_df, indep_df, inter_df)

bind_cols_fill <- function(df_list) {

  max_rows <- map_int(df_list, nrow) %>% max()
  
  map(df_list, function(df) {
    if(nrow(df) == max_rows) return(df)
    first <- names(df)[1] %>% sym()
    df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
  }) %>% bind_cols()
}

total_df <- bind_cols_fill(df_list)

#Change the order a bit, just like in the previous table 
write_xlsx(total_df,  "./data/descriptives/kable_model_all_pooled_effects.xlsx" )
model_new <- read_excel("./data/descriptives/kable_model_all_pooled_effects.xlsx" )

# I Want to round the numeric variables to 3 decimals
model_new <- dplyr::mutate(model_new, across(.cols = c(-mu_sigma_2, -Variable_2), .fns = as.numeric))
numeric_cols <- sapply(model_new, is.numeric)
model_new[, numeric_cols] <- round(model_new[, numeric_cols], digits = 3)

# Create a new variable to use stars instead of the full p-values in the table
model_new$p_text <- case_when(
  model_new$p >= 0.05 ~ "",
model_new$p < 0.001 ~ "***",
model_new$p < 0.01 ~ "**",
model_new$p < 0.05 ~ "*"
)

model_new$p_text_1 <- case_when(
  model_new$p_1 >= 0.05 ~ "",
model_new$p_1 < 0.001 ~ "***",
model_new$p_1 < 0.01 ~ "**",
model_new$p_1 < 0.05 ~ "*"
)

model_new$p_text_2 <- case_when(
  model_new$p_2 >= 0.05 ~ "",
model_new$p_2 < 0.001 ~ "***",
model_new$p_2 < 0.01 ~ "**",
model_new$p_2 < 0.05 ~ "*"
)

# Now only select the variables that I want to show in the table
model_new <- dplyr::select(model_new, mu_sigma_2, Variable_2, Estimate, SE, p_text, Estimate_1, SE_1, p_text_1, Estimate_2, SE_2, p_text_2)

# Make and save the table as html file
kable(model_new, digits = 3, caption = "Table 3. All pooled effects mean attitudes and polarization", 
      col.names = c( "", "Variables", "Estimate", "Std. Error", "", "Estimate", "Std. Error", "", "Estimate", "Std. Error", "")) %>%
  kable_classic_2(html_font = "Times", fixed_thead = T, full_width = F) %>%
  add_header_above(c(" " = 2, "Time-only model" = 3, "Indepent var model" = 3, "Interaction model" = 3)) %>%
   footnote(
    general_title = "Note.",
    general = "*** = p < 0.001, ** = p < 0.01, * = p < 0.05",
    threeparttable = TRUE,
    footnote_as_chunk = TRUE
    ) #%>%
Table 3. All pooled effects mean attitudes and polarization
Time-only model
Indepent var model
Interaction model
Variables Estimate Std. Error Estimate Std. Error Estimate Std. Error
Mean attitudes Time 0.017 0.016 0.014 0.017 -0.025 0.019
Gender 0.128 0.016 *** 0.104 0.025 ***
Age 0.002 0.001 ** 0.000 0.001
Isced intermediate (ref=basic) 0.161 0.024 *** 0.117 0.033 **
Isced advanced (ref=basic) 0.035 0.009 *** 0.029 0.013
Gender x time 0.001 0.004
Age x time 0.001 0.000
Isced intermediate x time 0.008 0.002 **
Isced advanced x time 0.018 0.009
Polarization attitudes Time -0.009 0.004
-0.011 0.017 0.001 0.005
Gender -0.092 0.009 *** 0.008 0.002 **
Age 0.000 0.000 0.000 0.005
Isced intermediate (ref=basic) -0.041 0.008 *** 0.018 0.009
Isced advanced (ref=basic) -0.004 0.004 1.183 0.043 ***
Gender x time -0.001 0.001
Age x time 0.000 0.000
Isced intermediate x time 0.001 0.002
Isced advanced x time -0.001 0.003
Note. *** = p < 0.001, ** = p < 0.01, * = p < 0.05
    #save_kable("./output/pooled_effects_table_DECEMBER.html")

Appendix D. Pooled effects age-only vs gender and education-only model

rm(list=ls())
set.seed(1) #(as I am performing analyses with a random aspect)
load("./data/meta_analysis/total_indep_var_results_new_edugen.RData")

# The models in which I only included education and gender 
m2_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_indep_var_results,
              method = "REML",
              test = "knha")

# Gender 
gender_gen <- metagen(TE = mu_sex_est,
                 seTE = mu_sex_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

# Educational level. This is now a dummy
edu_med_gen <- metagen(TE = mu_isced_med_est,
                 seTE = mu_isced_med_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

edu_high_gen <- metagen(TE = mu_isced_high_est,
                 seTE = mu_isced_high_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

# Extract all the data from the models and put them in a dataframe that will later be the input of the kable table
three_df <- data.frame(matrix(ncol = 6, nrow = 4))
colnames(three_df) <- c("mu_sigma_1", "age_educ_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
three_df$mu_sigma_1 <- c("Mean attitudes", "", "", "")
three_df$age_educ_1 <- c("Gender and education", "", "", "")
three_df$Variable_1 <- c("Time", "Gender", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)")
three_df$Estimate_1 <- c(as.numeric(m2_att$b), gender_gen$TE.random,edu_med_gen$TE.random, edu_high_gen$TE.random)
three_df$SE_1 <- c(m2_att$se, gender_gen$seTE.random, edu_med_gen$seTE.random, edu_high_gen$seTE.random)
three_df$p_1 <- c(m2_att$pval, gender_gen$pval.random, edu_med_gen$pval.random, edu_high_gen$pval.random)                       
                       
# The same for variance
m2_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_indep_var_results,
              method = "REML",
              test = "knha")

# Gender
gender_var_gen <- metagen(TE = sig_sex_est,
                 seTE = sig_sex_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

# Education
edu_var_med_gen <- metagen(TE = sig_isced_med_est,
                 seTE = sig_isced_med_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

edu_var_high_gen <- metagen(TE = sig_isced_high_est,
                 seTE = sig_isced_high_sd,
                 data = total_indep_var_results,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

four_df <- data.frame(matrix(ncol = 6, nrow = 4))
colnames(four_df) <- c("mu_sigma_1", "age_educ_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
four_df$mu_sigma_1 <- c("Polarization attitudes", "", "", "")
four_df$age_educ_1 <- c("Gender and education", "", "", "")
four_df$Variable_1 <- c("Time", "Gender", "Isced intermediate (ref=basic)", "Isced advanced (ref=basic)")
four_df$Estimate_1 <- c(as.numeric(m2_var$b), gender_var_gen$TE.random, edu_var_med_gen$TE.random, edu_var_high_gen$TE.random)
four_df$SE_1 <- c(m2_att$se, gender_var_gen$seTE.random, edu_var_med_gen$seTE.random, edu_var_high_gen$seTE.random)
four_df$p_1 <- c(m2_att$pval, gender_var_gen$pval.random, edu_var_med_gen$pval.random, edu_var_high_gen$pval.random)
rm(total_indep_var_results)
# Do the same, but then for the models with only age included
load("./data/meta_analysis/total_indep_var_results_new_age.RData")
total_indep_var_results_age <- as.data.frame(total_indep_var_results)

# The models in which I only included education and gender 
m2_att_age <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_indep_var_results_age,
              method = "REML",
              test = "knha")

# Age
age_gen <- metagen(TE = mu_age_est,
                 seTE = mu_age_sd,
                 data = total_indep_var_results_age,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

# Extract all the data from the models and put them in a dataframe that will later be the input of the kable table
five_df <- data.frame(matrix(ncol = 6, nrow = 2))
colnames(five_df) <- c("mu_sigma_1", "age_educ_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
five_df$mu_sigma_1 <- c("", "")
five_df$age_educ_1 <- c("Age", "")
five_df$Variable_1 <- c("Time", "Age")
five_df$Estimate_1 <- c(as.numeric(m2_att_age$b), age_gen$TE.random)
five_df$SE_1 <- c(m2_att_age$se, age_gen$seTE.random)
five_df$p_1 <- c(m2_att_age$pval, age_gen$pval.random)                       
                       
# The same for variance
m2_var_age <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_indep_var_results_age,
              method = "REML",
              test = "knha")

# Gender
age_var_gen <- metagen(TE = sig_age_est,
                 seTE = sig_age_sd,
                 data = total_indep_var_results_age,
                 fixed = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 hakn = TRUE)

six_df <- data.frame(matrix(ncol = 6, nrow = 2))
colnames(six_df) <- c("mu_sigma_1", "age_educ_1", "Variable_1", "Estimate_1", "SE_1", "p_1")
six_df$mu_sigma_1 <- c("", "")
six_df$age_educ_1 <- c("Age", "")
six_df$Variable_1 <- c("Time", "Age")
six_df$Estimate_1 <- c(as.numeric(m2_var_age$b), age_var_gen$TE.random)
six_df$SE_1 <- c(m2_var_age$se, age_var_gen$seTE.random)
six_df$p_1 <- c(m2_var_age$pval, age_var_gen$pval.random)

# The order I want in the tables is three -> five -> four -> six
total_df <- rbind(three_df, five_df, four_df, six_df)

# I Want to round the numeric variables to 3 decimals
total_df <- dplyr::mutate(total_df, across(.cols = c(-mu_sigma_1, -Variable_1, -age_educ_1), .fns = as.numeric))
numeric_cols <- sapply(total_df, is.numeric)
total_df[, numeric_cols] <- round(total_df[, numeric_cols], digits = 3)

# Create a new variable to use stars instead of the full p-values in the table
total_df$p_text_1 <- case_when(
  total_df$p_1 >= 0.05 ~ "",
total_df$p_1 < 0.001 ~ "***",
total_df$p_1 < 0.01 ~ "**",
total_df$p_1 < 0.05 ~ "*"
)

# Now only select the variables that I want to show in the table
total_df <- dplyr::select(total_df, mu_sigma_1, age_educ_1, Variable_1, Estimate_1, SE_1, p_text_1)

# Make and save the table as html file
kable(total_df, digits = 3, caption = "Appendix D. Pooled effects mean attitudes and polarization age, education and gender.", 
      col.names = c( "", "", "Variables", "Estimate", "Std. Error", "")) %>%
  kable_classic_2(html_font = "Times", fixed_thead = T, full_width = F) %>%
  add_header_above(c(" " = 3, "Indepent var model" = 3)) %>%
   footnote(
    general_title = "Note.",
    general = "*** = p < 0.001, ** = p < 0.01, * = p < 0.05",
    threeparttable = TRUE,
    footnote_as_chunk = TRUE
    )#%>%
Appendix D. Pooled effects mean attitudes and polarization age, education and gender.
Indepent var model
Variables Estimate Std. Error
Mean attitudes Gender and education Time 0.020 0.017
Gender 0.134 0.016 ***
Isced intermediate (ref=basic) 0.167 0.025 ***
Isced advanced (ref=basic) 0.034 0.009 ***
Age Time 0.016 0.016
Age 0.000 0.001
Polarization attitudes Gender and education Time -0.019 0.017
Gender -0.105 0.010 ***
Isced intermediate (ref=basic) -0.071 0.009 ***
Isced advanced (ref=basic) -0.003 0.004
Age Time -0.009 0.004
Age 0.001 0.000
Note. *** = p < 0.001, ** = p < 0.01, * = p < 0.05
 #save_kable("./output/appendix/pooled_effects_edugenage_DECEMBER.html")

0.1 Repeat main analyses without outlier(s)

# Load the data
load("./data/meta_analysis/total_reg_results_gam_w_new.RData")

# Run the first model and check for outliers
model_step_1_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              method = "ML",
              test = "knha")

model_step_1_att
## 
## Random-Effects Model (k = 71; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of total heterogeneity): 0.0155 (SE = 0.0027)
## tau (square root of estimated tau^2 value):      0.1247
## I^2 (total heterogeneity / total variability):   99.82%
## H^2 (total variability / sampling variability):  557.16
## 
## Test for Heterogeneity:
## Q(df = 70) = 4216.1447, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval    ci.lb   ci.ub    
##   0.0165  0.0160  1.0296  70  0.3067  -0.0155  0.0485    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
inf <- influence(model_step_1_att) # There is one outlier

# Delete outlier
total_reg_results <- subset(total_reg_results, subset = dep_var != "cc_unstop")

# Run the same analyses
model_step_1_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              method = "ML",
              test = "knha")

model_step_1_att
## 
## Random-Effects Model (k = 70; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of total heterogeneity): 0.0044 (SE = 0.0008)
## tau (square root of estimated tau^2 value):      0.0660
## I^2 (total heterogeneity / total variability):   99.37%
## H^2 (total variability / sampling variability):  159.19
## 
## Test for Heterogeneity:
## Q(df = 69) = 3896.6240, p-val < .0001
## 
## Model Results:
## 
## estimate      se    tval  df    pval   ci.lb   ci.ub     
##   0.0265  0.0086  3.0758  69  0.0030  0.0093  0.0437  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_1_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_reg_results,
              method = "ML",
              test = "knha")

model_step_1_var
## 
## Random-Effects Model (k = 70; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of total heterogeneity): 0.0009 (SE = 0.0002)
## tau (square root of estimated tau^2 value):      0.0300
## I^2 (total heterogeneity / total variability):   98.50%
## H^2 (total variability / sampling variability):  66.55
## 
## Test for Heterogeneity:
## Q(df = 69) = 1444.9153, p-val < .0001
## 
## Model Results:
## 
## estimate      se     tval  df    pval    ci.lb    ci.ub    
##  -0.0096  0.0039  -2.4697  69  0.0160  -0.0173  -0.0018  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_2_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              mods = ~ attitude_cat,
              method = "ML",
              test = "knha")

summary(model_step_2_att)
## 
## Mixed-Effects Model (k = 70; tau^2 estimator: ML)
## 
##    logLik   deviance        AIC        BIC       AICc   
##   85.6804   348.9783  -163.3608  -154.3668  -162.7454   
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0042 (SE = 0.0008)
## tau (square root of estimated tau^2 value):             0.0649
## I^2 (residual heterogeneity / unaccounted variability): 99.33%
## H^2 (unaccounted variability / sampling variability):   149.30
## R^2 (amount of heterogeneity accounted for):            3.41%
## 
## Test for Residual Heterogeneity:
## QE(df = 67) = 2852.9376, p-val < .0001
## 
## Test of Moderators (coefficients 2:3):
## F(df1 = 2, df2 = 67) = 0.6171, p-val = 0.5425
## 
## Model Results:
## 
##                        estimate      se    tval  df    pval    ci.lb   ci.ub    
## intrcpt                  0.0153  0.0208  0.7334  67  0.4659  -0.0263  0.0568    
## attitude_cataffective    0.0312  0.0297  1.0534  67  0.2959  -0.0280  0.0904    
## attitude_catcognitive    0.0089  0.0234  0.3827  67  0.7032  -0.0377  0.0556    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_2_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_reg_results,
              mods = ~ attitude_cat, # cogn as ref cat, sig
              method = "ML",
              test = "knha")

model_step_2_var
## 
## Mixed-Effects Model (k = 70; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0008 (SE = 0.0002)
## tau (square root of estimated tau^2 value):             0.0285
## I^2 (residual heterogeneity / unaccounted variability): 98.28%
## H^2 (unaccounted variability / sampling variability):   58.29
## R^2 (amount of heterogeneity accounted for):            9.95%
## 
## Test for Residual Heterogeneity:
## QE(df = 67) = 1247.9526, p-val < .0001
## 
## Test of Moderators (coefficients 2:3):
## F(df1 = 2, df2 = 67) = 3.4755, p-val = 0.0366
## 
## Model Results:
## 
##                        estimate      se     tval  df    pval    ci.lb    ci.ub    
## intrcpt                  0.0102  0.0089   1.1423  67  0.2574  -0.0076   0.0280    
## attitude_cataffective   -0.0156  0.0129  -1.2095  67  0.2307  -0.0414   0.0102    
## attitude_catcognitive   -0.0260  0.0100  -2.5912  67  0.0117  -0.0460  -0.0060  * 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_3_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              mods = ~ attitude_cat + mean_year_centered,
              method = "ML",
              test = "knha")

model_step_3_att
## 
## Mixed-Effects Model (k = 70; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0042 (SE = 0.0008)
## tau (square root of estimated tau^2 value):             0.0646
## I^2 (residual heterogeneity / unaccounted variability): 99.32%
## H^2 (unaccounted variability / sampling variability):   146.29
## R^2 (amount of heterogeneity accounted for):            4.19%
## 
## Test for Residual Heterogeneity:
## QE(df = 66) = 2660.4810, p-val < .0001
## 
## Test of Moderators (coefficients 2:4):
## F(df1 = 3, df2 = 66) = 0.4952, p-val = 0.6869
## 
## Model Results:
## 
##                        estimate      se    tval  df    pval    ci.lb   ci.ub    
## intrcpt                  0.0182  0.0217  0.8382  66  0.4049  -0.0252  0.0616    
## attitude_cataffective    0.0239  0.0332  0.7186  66  0.4749  -0.0424  0.0901    
## attitude_catcognitive    0.0064  0.0240  0.2678  66  0.7897  -0.0415  0.0544    
## mean_year_centered       0.0006  0.0012  0.5099  66  0.6118  -0.0018  0.0031    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_4_att <- rma(yi = mu_time,
              sei = mu_time_sd,
              data = total_reg_results,
              mods = ~ attitude_cat + mean_year_centered + ambiguous + national + or_scale + pec_miss + data + nr_waves,
              method = "ML",
              test = "knha")
## Warning: 9 studies with NAs omitted from model fitting.
## Warning: Redundant predictors dropped from the model.
model_step_4_att
## 
## Mixed-Effects Model (k = 61; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0032 (SE = 0.0006)
## tau (square root of estimated tau^2 value):             0.0565
## I^2 (residual heterogeneity / unaccounted variability): 99.13%
## H^2 (unaccounted variability / sampling variability):   114.47
## R^2 (amount of heterogeneity accounted for):            32.49%
## 
## Test for Residual Heterogeneity:
## QE(df = 47) = 1960.4389, p-val < .0001
## 
## Test of Moderators (coefficients 2:14):
## F(df1 = 13, df2 = 47) = 1.6737, p-val = 0.0988
## 
## Model Results:
## 
##                        estimate      se     tval  df    pval    ci.lb    ci.ub     
## intrcpt                  0.1583  0.0631   2.5093  47  0.0156   0.0314   0.2852   * 
## attitude_cataffective   -0.0115  0.0425  -0.2699  47  0.7884  -0.0970   0.0740     
## attitude_catcognitive   -0.0067  0.0256  -0.2622  47  0.7943  -0.0583   0.0449     
## mean_year_centered       0.0014  0.0024   0.5861  47  0.5606  -0.0035   0.0063     
## ambiguousYes            -0.0219  0.0253  -0.8629  47  0.3926  -0.0728   0.0291     
## national                -0.0130  0.0841  -0.1540  47  0.8783  -0.1822   0.1563     
## or_scale                 0.0175  0.0074   2.3749  47  0.0217   0.0027   0.0324   * 
## pec_miss                -0.8852  0.6657  -1.3298  47  0.1900  -2.2244   0.4540     
## dataESS                 -0.1184  0.0641  -1.8466  47  0.0711  -0.2474   0.0106   . 
## dataEVS                 -0.1154  0.0755  -1.5286  47  0.1331  -0.2673   0.0365     
## dataISSP                -0.0852  0.0304  -2.8001  47  0.0074  -0.1464  -0.0240  ** 
## dataLISS                -0.0739  0.1160  -0.6375  47  0.5269  -0.3072   0.1594     
## dataMOT                 -0.0889  0.0783  -1.1346  47  0.2623  -0.2465   0.0687     
## nr_waves                -0.0426  0.0127  -3.3547  47  0.0016  -0.0681  -0.0171  ** 
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_3_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_reg_results,
              mods = ~  attitude_cat + mean_year_centered,
              method = "ML",
              test = "knha")

model_step_3_var
## 
## Mixed-Effects Model (k = 70; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0008 (SE = 0.0002)
## tau (square root of estimated tau^2 value):             0.0285
## I^2 (residual heterogeneity / unaccounted variability): 98.26%
## H^2 (unaccounted variability / sampling variability):   57.43
## R^2 (amount of heterogeneity accounted for):            10.19%
## 
## Test for Residual Heterogeneity:
## QE(df = 66) = 1233.5279, p-val < .0001
## 
## Test of Moderators (coefficients 2:4):
## F(df1 = 3, df2 = 66) = 2.3349, p-val = 0.0818
## 
## Model Results:
## 
##                        estimate      se     tval  df    pval    ci.lb    ci.ub    
## intrcpt                  0.0092  0.0094   0.9754  66  0.3329  -0.0096   0.0279    
## attitude_cataffective   -0.0132  0.0145  -0.9080  66  0.3672  -0.0422   0.0158    
## attitude_catcognitive   -0.0252  0.0103  -2.4363  66  0.0175  -0.0458  -0.0045  * 
## mean_year_centered      -0.0002  0.0005  -0.3786  66  0.7062  -0.0013   0.0009    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
model_step_4_var <- rma(yi = sig_time,
              sei = sig_time_sd,
              data = total_reg_results,
              mods = ~  attitude_cat +  mean_year_centered + ambiguous + national + or_scale + pec_miss + data + nr_waves,
              method = "ML",
              test = "knha")
## Warning: 9 studies with NAs omitted from model fitting.

## Warning: Redundant predictors dropped from the model.
model_step_4_var
## 
## Mixed-Effects Model (k = 61; tau^2 estimator: ML)
## 
## tau^2 (estimated amount of residual heterogeneity):     0.0006 (SE = 0.0001)
## tau (square root of estimated tau^2 value):             0.0236
## I^2 (residual heterogeneity / unaccounted variability): 97.53%
## H^2 (unaccounted variability / sampling variability):   40.44
## R^2 (amount of heterogeneity accounted for):            30.37%
## 
## Test for Residual Heterogeneity:
## QE(df = 47) = 792.3181, p-val < .0001
## 
## Test of Moderators (coefficients 2:14):
## F(df1 = 13, df2 = 47) = 1.2166, p-val = 0.2980
## 
## Model Results:
## 
##                        estimate      se     tval  df    pval    ci.lb   ci.ub    
## intrcpt                 -0.0179  0.0282  -0.6324  47  0.5302  -0.0747  0.0389    
## attitude_cataffective   -0.0050  0.0194  -0.2580  47  0.7975  -0.0440  0.0340    
## attitude_catcognitive   -0.0195  0.0111  -1.7538  47  0.0860  -0.0420  0.0029  . 
## mean_year_centered       0.0006  0.0010   0.5695  47  0.5718  -0.0015  0.0026    
## ambiguousYes             0.0100  0.0109   0.9240  47  0.3602  -0.0118  0.0319    
## national                -0.0487  0.0384  -1.2675  47  0.2112  -0.1260  0.0286    
## or_scale                -0.0023  0.0031  -0.7254  47  0.4718  -0.0085  0.0040    
## pec_miss                -0.0677  0.2920  -0.2320  47  0.8175  -0.6552  0.5197    
## dataESS                  0.0162  0.0281   0.5784  47  0.5658  -0.0402  0.0727    
## dataEVS                  0.0120  0.0316   0.3796  47  0.7059  -0.0516  0.0756    
## dataISSP                 0.0278  0.0131   2.1236  47  0.0390   0.0015  0.0540  * 
## dataLISS                 0.0658  0.0515   1.2790  47  0.2072  -0.0377  0.1694    
## dataMOT                  0.0630  0.0361   1.7458  47  0.0874  -0.0096  0.1356  . 
## nr_waves                 0.0080  0.0056   1.4323  47  0.1587  -0.0032  0.0193    
## 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Put them in a table
models <- list("M1" = model_step_1_att, "M2" = model_step_2_att, "M3" = model_step_3_att, "M4" = model_step_4_att, "M1" =  model_step_1_var, "M2"= model_step_2_var, "M3"=  model_step_3_var, "M4" = model_step_4_var)

modelsummary(models, output = "kableExtra", statistic = 'std.error', stars = TRUE, shape = term ~ model + statistic, title = "Appendix X. Meta-regression excluding outlier", fmt = fmt_statistic(estimate = 3, std.error =3), coef_rename = c("overall" ="Intercept", 
           "intercept" = "Intercept", 
           "attitude_cataffective" = "Affective attitude (ref = beh)",
           "attitude_catcognitive" = "Cognitive attitude", 
           "mean_year_centered" =   "Mean year centered", 
           "ambiguousYes" = "Ambiguous (ref = no)",
           "national" = "National (ref = no)", 
           "or_scale" = "Original scale", 
            "pec_miss" = "Perc. missings", 
           "dataESS"= "ESS (ref = EB)", 
           "dataEVS"= "EVS", 
           "dataISSP" = "ISSP", 
           "dataLISS"= "LISS", 
           "dataMOT" = "MOT", 
           "nr_waves" = "Nr. of waves"), gof_map = NA) %>%
  kable_classic_2(html_font = "Times", fixed_thead = T, full_width = F) %>%
   add_header_above(c(" " = 1, "Mu" = 8, "Sigma" = 8))#%>%
Appendix X. Meta-regression excluding outlier
Mu
Sigma
M1
M2
M3
M4
M1
M2
M3
M4
Est. S.E. Est. S.E. Est. S.E. Est. S.E. Est. S.E. Est. S.E. Est. S.E. Est. S.E.
Intercept 0.026** 0.009 0.015 0.021 0.018 0.022 0.158* 0.063 -0.010* 0.004 0.010 0.009 0.009 0.009 -0.018 0.028
Affective attitude (ref = beh) 0.031 0.030 0.024 0.033 -0.011 0.042 -0.016 0.013 -0.013 0.015 -0.005 0.019
Cognitive attitude 0.009 0.023 0.006 0.024 -0.007 0.026 -0.026* 0.010 -0.025* 0.010 -0.020+ 0.011
Mean year centered 0.001 0.001 0.001 0.002 0.000 0.001 0.001 0.001
Ambiguous (ref = no) -0.022 0.025 0.010 0.011
National (ref = no) -0.013 0.084 -0.049 0.038
Original scale 0.018* 0.007 -0.002 0.003
Perc. missings -0.885 0.666 -0.068 0.292
ESS (ref = EB) -0.118+ 0.064 0.016 0.028
EVS -0.115 0.076 0.012 0.032
ISSP -0.085** 0.030 0.028* 0.013
LISS -0.074 0.116 0.066 0.051
MOT -0.089 0.078 0.063+ 0.036
Nr. of waves -0.043** 0.013 0.008 0.006
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
    #save_kable("./output/appendix/meta_regression_table_excluding_outlier.html")
LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIHN0YXRpc3RpY3MiDQphdXRob3I6ICJBbnVzY2hrYSBQZWVsZW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiNrbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbCA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG51bWJlcl9zZWN0aW9ucyA9IEZBTFNFKQ0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQpgYGANCg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAxMDBweDsNCn0NCmBgYA0KDQpJbiB0aGlzIHNjcmlwdCwgSSB3cml0ZSB0aGUgY29kZSB0byBtYWtlIHNvbWUgcGxvdHMgYW5kIHRhYmxlcyB0aGF0IEkgdXNlIHRvIGluIHRoZSBkYXRhIGFuZCBhbmFseXNpcyBzZWN0aW9uLiBZb3Ugd2lsbCBmaW5kIHRoZSBjb2RlIGZvciB0aGUgcGxvdCB3aXRoIGRhdGFzZXRzIHBlciB5ZWFyLCB0aGUgVGFibGUgd2l0aCBpbmRpdmlkdWFsIHJlZ3Jlc3Npb24gYW5hbHlzaXMgZm9yIG9uZSB2YXJpYWJsZSBvZiBJU1NQIGFuZCB0aGUgVGFibGUgd2l0aCBhbGwgdGhlIHBvb2xlZCBlZmZlY3RzLiANCg0KYGBge3IscmVzdWx0cz0naGlkZScsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShtb2RlbHN1bW1hcnkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkod3JpdGV4bCkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnYW1sc3MpDQpsaWJyYXJ5KG1ldGFmb3IpDQpsaWJyYXJ5KG1ldGEpDQpsaWJyYXJ5KGdncmVwZWwpDQpybShsaXN0PWxzKCkpDQpgYGANCg0KIyMgR2dwbG90IHRoYXQgc2hvd3MgdGhlIHllYXJzIHRoYXQgZWFjaCBkYXRhc2V0IGNvdmVycyB7LX0NCg0KYGBge3J9DQpkYXRheWVhciA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZGVzY3JpcHRpdmVzL2RhdGFzZXRfeWVhci54bHN4IikNCmRhdGF5ZWFyIDwtIGFzLmRhdGEuZnJhbWUoZGF0YXllYXIpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdhc2lzJ30NCmNvbG9yX3NjYWxlIDwtIGMgKCIjRTAyMDIzIiwgIiMxNjc2RTMiLCAiIzIwQzY2QiIsICIjMUFCQzlDIiwgIiM4NUMxRTkiICwgIiNFQjk4NEUiLCAiI0FGN0FDNSIgLCAiI0YxQzQwRiIpDQpkYXRheWVhciRkYXRhc2V0IDwtIGZhY3RvcihkYXRheWVhciRkYXRhc2V0LCBsZXZlbHMgPSBjKCJNT1QiLCAiU09DT04iLCAiTElTUyIsICJJJk8iLCAiRVNTIiwgIklTU1AiLCAiRVZTIiwgIkVCIikpDQpkYXRheWVhciRjb2xvcltkYXRheWVhciRkYXRhc2V0ID09ICJJJk8iXSA8LSAiIzFBQkM5QyINCmRhdGF5ZWFyJGNvbG9yW2RhdGF5ZWFyJGRhdGFzZXQgPT0gIkVTUyJdIDwtICIjODVDMUU5Ig0KZGF0YXllYXIkY29sb3JbZGF0YXllYXIkZGF0YXNldCA9PSAiSVNTUCJdIDwtICIjRUI5ODRFIg0KZGF0YXllYXIkY29sb3JbZGF0YXllYXIkZGF0YXNldCA9PSAiRVZTIl0gPC0gIiNBRjdBQzUiDQpkYXRheWVhciRjb2xvcltkYXRheWVhciRkYXRhc2V0ID09ICJFQiJdIDwtICIjRjFDNDBGIg0KZGF0YXllYXIkY29sb3JbZGF0YXllYXIkZGF0YXNldCA9PSAiTU9UIl0gPC0gIiNFMDIwMjMiDQpkYXRheWVhciRjb2xvcltkYXRheWVhciRkYXRhc2V0ID09ICJTT0NPTiJdIDwtICIjMTY3NkUzIg0KZGF0YXllYXIkY29sb3JbZGF0YXllYXIkZGF0YXNldCA9PSAiTElTUyJdIDwtICIjMjBDNjZCIg0KDQpmaXJzdF9sYXN0X3llYXIgPC0gZGF0YXllYXIgJT4lDQogIGdyb3VwX2J5KGRhdGFzZXQpICU+JQ0KICBzdW1tYXJpemUoZmlyc3RfeWVhciA9IG1pbih5ZWFyKSwNCiAgICAgICAgICAgIGxhc3RfeWVhciA9IG1heCh5ZWFyKSkNCg0KeWVhcnBsb3QgPC0gZ2dwbG90KGRhdGEgPSBkYXRheWVhciwgYWVzKHggPSB5ZWFyLCB5ID0gZGF0YXNldCwgY29sb3IgPSBjb2xvcikpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gZGF0YXNldCksIHNpemUgPSAxKSArDQogIGdlb21fdGV4dChkYXRhID0gZmlyc3RfbGFzdF95ZWFyLCBhZXMoeCA9IGZpcnN0X3llYXIsIHkgPSBkYXRhc2V0LCBsYWJlbCA9IGFzLmNoYXJhY3RlcihmaXJzdF95ZWFyKSksDQogICAgICAgICAgICB2anVzdCA9IC0xLCBjb2xvciA9ICJkYXJrZ3JleSIsIHNpemUgPSAzLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIA0KICAgIGdlb21fdGV4dChkYXRhID0gZmlyc3RfbGFzdF95ZWFyLCBhZXMoeCA9IGxhc3RfeWVhciwgeSA9IGRhdGFzZXQsIGxhYmVsID0gYXMuY2hhcmFjdGVyKGxhc3RfeWVhcikpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMSwgY29sb3IgPSAiZGFya2dyZXkiLCBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3Jfc2NhbGUpICsNCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIkRhdGFzZXQiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpwcmludCh5ZWFycGxvdCkNCg0KZ2dzYXZlKCJ5ZWFycGxvdC5wbmciLCB3aWR0aCA9IDcsIGhlaWdodCA9IDUsIHBhdGggPSAiLi9vdXRwdXQveWVhcnBsb3RfREVDLnBuZyIpDQoNCg0KYGBgDQoNCiMjIFRhYmxlIG9mIHRoZSBHQU1MU1MgcmVncmVzc2lvbiBvdXRwdXQgey19DQoNCmBgYHtyfQ0KIyBSdW4gdGhpcyBwaWVjZSBvZiBjb2RlIHNvIHRoYXQgaW4gdGhlIFRhYmxlIGJlbmVhdGggaXQgd2lsbCBub3Qgc2hvdyBOQXMNCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnJykNCg0KYGBgDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyBJbGx1c3RyYXRlIHRoZSBnYW1sc3MgcmVncmVzc2lvbnMgYnkgc2hvd2luZyBvbmUgZnJvbSBJU1NQIHdpdGgga2FibGUgZXh0cmENCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pc3NwX2xpc3RfZW1wdHlfdy5SZGF0YSIpDQpsb2FkKCIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvaXNzcF9saXN0X3ByZWRzX3dfbmV3LlJkYXRhIikNCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pc3NwX2xpc3RfaW50ZXJhY3Rpb25zX3dfbmV3LlJkYXRhIikpDQoNCiMgVXNlIGZpcnN0IHZhcmlhYmxlLCB3aGljaCBpcyAid29ycnkiDQptb2RlbF90aW1lX29ubHkgPC0gc3VtbWFyeShpc3NwX2xpc3RfZW1wdHlbWzFdXSkNCm1vZGVsX3RpbWVfb25seV9kZiA8LSBhcy5kYXRhLmZyYW1lKG1vZGVsX3RpbWVfb25seSkNCm1vZGVsX3RpbWVfb25seV9kZiRtdV9zaWdtYSA8LSBjKCJNdSIsICIiLCAiU2lnbWEiLCAiIikNCm1vZGVsX3RpbWVfb25seV9kZiR2YXJpYWJsZXMgPC0gYygiSW50ZXJjZXB0IiwgIlRpbWUiLCAiSW50ZXJjZXB0IiwgIlRpbWUiKQ0KbW9kZWxfdGltZV9vbmx5X2RmIDwtIG1vZGVsX3RpbWVfb25seV9kZiAlPiUgZHBseXI6OiBzZWxlY3QobXVfc2lnbWEsIHZhcmlhYmxlcywgZXZlcnl0aGluZygpKQ0Kcm93bmFtZXMobW9kZWxfdGltZV9vbmx5X2RmKSA8LSBOVUxMDQoNCm1vZGVsX2luZGVwX2RmIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShpc3NwX2xpc3RfcHJlZHNbWzFdXSkpDQptb2RlbF9pbmRlcF9kZiRtdV9zaWdtYSA8LSBjKCJNdSIsICIiLCAiIiwgIiIsICIiLCAiIiwiU2lnbWEiLCAiIiwgIiIsICIiLCAiIiwgIiIpDQptb2RlbF9pbmRlcF9kZiR2YXJpYWJsZXMgPC0gYygiSW50ZXJjZXB0IiwgIlRpbWUiLCAiR2VuZGVyIiwgICJJc2NlZCBpbnRlcm1lZGlhdGUgKHJlZj1iYXNpYykiLCAiSXNjZWQgYWR2YW5jZWQgKHJlZj1iYXNpYykiLCAiQWdlIiwgIkludGVyY2VwdCIsICJUaW1lIiwgIkdlbmRlciIsICAiSXNjZWQgaW50ZXJtZWRpYXRlIChyZWY9YmFzaWMpIiwgIklzY2VkIGFkdmFuY2VkIChyZWY9YmFzaWMpIiwgIkFnZSIpDQptb2RlbF9pbmRlcF9kZiA8LSBtb2RlbF9pbmRlcF9kZiAlPiUgZHBseXI6OnNlbGVjdChtdV9zaWdtYSwgdmFyaWFibGVzLCBldmVyeXRoaW5nKCkpDQpyb3duYW1lcyhtb2RlbF9pbmRlcF9kZikgPC0gTlVMTA0KDQptb2RlbF9pbnRlcmFjdF9kZiA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkoaXNzcF9saXN0X2ludGVyYWN0aW9uc1tbMV1dKSkNCm1vZGVsX2ludGVyYWN0X2RmJG11X3NpZ21hIDwtIGMoIk11IiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIlNpZ21hIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikNCm1vZGVsX2ludGVyYWN0X2RmJHZhcmlhYmxlcyA8LSBjKCJJbnRlcmNlcHQiLCAiVGltZSIsICJHZW5kZXIiLCAgIklzY2VkIGludGVybWVkaWF0ZSAocmVmPWJhc2ljKSIsICJJc2NlZCBhZHZhbmNlZCAocmVmPWJhc2ljKSIsICJBZ2UiLCAiQWdlIHggdGltZSIsICJHZW5kZXIgeCB0aW1lIiwgIklzY2VkIGludGVybWVkaWF0ZSB4IHRpbWUiLCAiSXNjZWQgYWR2YW5jZWQgeCB0aW1lIiwgIkludGVyY2VwdCIsICJUaW1lIiwgIkdlbmRlciIsICAiSXNjZWQgaW50ZXJtZWRpYXRlIChyZWY9YmFzaWMpIiwgIklzY2VkIGFkdmFuY2VkIChyZWY9YmFzaWMpIiwgIkFnZSIsICJBZ2UgeCB0aW1lIiwgIkdlbmRlciB4IHRpbWUiLCAiSXNjZWQgaW50ZXJtZWRpYXRlIHggdGltZSIsICJJc2NlZCBhZHZhbmNlZCB4IHRpbWUiKQ0KbW9kZWxfaW50ZXJhY3RfZGYgPC0gbW9kZWxfaW50ZXJhY3RfZGYgJT4lIGRwbHlyOjpzZWxlY3QobXVfc2lnbWEsIHZhcmlhYmxlcywgZXZlcnl0aGluZygpKQ0Kcm93bmFtZXMobW9kZWxfaW50ZXJhY3RfZGYpIDwtIE5VTEwNCg0KIyBEaWZmaWN1bHQgdG8gY29sdW1uYmluZCB0aGVtLCBiZWNhdXNlIHRoZXkncmUgb2YgZGlmZmVyZW50IGxlbmd0aHMgKGxvZ2ljYWxseSksIHNvIHVzZSBhIGZ1bmN0aW9uDQpkZl9saXN0IDwtIGxpc3QobW9kZWxfdGltZV9vbmx5X2RmLCBtb2RlbF9pbmRlcF9kZiwgbW9kZWxfaW50ZXJhY3RfZGYpDQoNCmJpbmRfY29sc19maWxsIDwtIGZ1bmN0aW9uKGRmX2xpc3QpIHsNCg0KICBtYXhfcm93cyA8LSBtYXBfaW50KGRmX2xpc3QsIG5yb3cpICU+JSBtYXgoKQ0KICANCiAgbWFwKGRmX2xpc3QsIGZ1bmN0aW9uKGRmKSB7DQogICAgaWYobnJvdyhkZikgPT0gbWF4X3Jvd3MpIHJldHVybihkZikNCiAgICBmaXJzdCA8LSBuYW1lcyhkZilbMV0gJT4lIHN5bSgpDQogICAgZGYgJT4lIGFkZF9yb3coISFmaXJzdCA6PSByZXAoTkEsIG1heF9yb3dzIC0gbnJvdyhkZikpKQ0KICB9KSAlPiUgYmluZF9jb2xzKCkNCn0NCg0KbW9kZWxfdG90YWwgPC0gYmluZF9jb2xzX2ZpbGwoZGZfbGlzdCkNCg0KbW9kZWxfdG90YWxbaXMubmEobW9kZWxfdG90YWwpXSA8LSAiIg0KDQojIFRoZSBkYXRhZnJhbWUgaXMgYmluZGVkLCB0aGUgb3JkZXIgaXMgbm90IHRvdGFsbHkgaG93IGkgd2FudCBpdC4gVGhlIGRhdGEgYXJlIG5vdyBhbGwgY2VudGVyZWQgYXQgdGhlIHRvcCwgYnV0IGZvciB0aGUgDQojIHByZXZpb3VzIG1vZGVscywgSSBuZWVkIHRoZSBkYXRhIHRvIGJlIGNlbnRlcmVkIGFyb3VuZCB0aGUgbXUvaW50ZXJjZXB0IGFuZCBzaWdtYS9pbnRlcmNlcHQgKHdpdGggYSBsb3Qgb2YgYmxhbmsgc3BhY2VzKS4gIyBGdXJ0aGVybW9yZSwgc29tZSB2YXJpYWJsZXMgaGF2ZSBhIG5hbWUgdGhhdCBoYXMgc3BlY2lhbCBzaWducyBpbiB0aGVtLCB3aGljaCBjYXVzZXMgUiBub3QgdG8gcmVjb2duaXplIHRoZW0uIFRvIG1ha2UgaXQgI2Vhc3ksIEkgcXVpY2tseSBmaXggdGhlc2UgdGhpbmdzIGluIEV4Y2VsLiBJIGRvbid0IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhlIGRhdGENCiN3cml0ZV94bHN4KG1vZGVsX3RvdGFsLCAiLi9kYXRhL2Rlc2NyaXB0aXZlcy9rYWJsZV9tb2RlbF90b3RhbF9nYW1sc3MueGxzeCIgKQ0KYGBgDQoNCg0KYGBge3J9DQptb2RlbF9uZXcgPC0gcmVhZF9leGNlbCgiLi9kYXRhL2Rlc2NyaXB0aXZlcy9rYWJsZV9tb2RlbF90b3RhbF9nYW1sc3MueGxzeCIgKQ0KDQojIEkgV2FudCB0byByb3VuZCB0aGUgbnVtZXJpYyB2YXJpYWJsZXMgdG8gMyBkZWNpbWFscw0KbW9kZWxfbmV3IDwtIGRwbHlyOjptdXRhdGUobW9kZWxfbmV3LCBhY3Jvc3MoLmNvbHMgPSBjKC1tdV9zaWdtYSwgLXZhcmlhYmxlcyksIC5mbnM9IGFzLm51bWVyaWMpKQ0KbnVtZXJpY19jb2xzIDwtIHNhcHBseShtb2RlbF9uZXcsIGlzLm51bWVyaWMpDQptb2RlbF9uZXdbLCBudW1lcmljX2NvbHNdIDwtIHJvdW5kKG1vZGVsX25ld1ssIG51bWVyaWNfY29sc10sIGRpZ2l0cyA9IDMpDQoNCiMgVGhlcmUgYXJlIHNvbWUgYW5ub3lpbmcgdmFyaWFibGUgbmFtZXMgdGhhdCBSIGNhbid0IHJlY29nbml6ZSBiZWNhdXNlIGl0IGhhcyBzcGFjaW5nLCBzbyByZW5hbWUgdGhlIGNvbHVtbnMNCmNvbG5hbWVzKG1vZGVsX25ldykgPC0gKGMoIm11X3NpZ21hIiwgIlZhcmlhYmxlcyIsICJlc3RfdGltZSIsICJzdGRfZXJyX3RpbWUiLCAicF90aW1lIiwgImVzdF9pbmRlcCIsICJzdGRfZXJyX2luZGVwIiwgInBfaW5kZXAiLCAiZXN0X2ludGVyIiwgInN0ZF9lcnJvcl9pbnRlciIsICJwX2ludGVyIiwgInBfdGV4dF90aW1lX29ubHkiLCAicF90ZXh0X2luZGVwIiwgInBfdGV4dF9pbnRlciIpKQ0KDQojIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0byB1c2Ugc3RhcnMgaW5zdGVhZCBvZiB0aGUgZnVsbCBwLXZhbHVlcyBpbiB0aGUgdGFibGUNCm1vZGVsX25ldyRwX3RleHRfdGltZV9vbmx5IDwtIGNhc2Vfd2hlbigNCiAgbW9kZWxfbmV3JHBfdGltZSA+PSAwLjA1IH4gIiIsDQptb2RlbF9uZXckcF90aW1lIDwgMC4wMDEgfiAiKioqIiwNCm1vZGVsX25ldyRwX3RpbWUgPCAwLjAxIH4gIioqIiwNCm1vZGVsX25ldyRwX3RpbWUgPCAwLjA1IH4gIioiDQopDQoNCm1vZGVsX25ldyRwX3RleHRfaW5kZXAgPC0gY2FzZV93aGVuKA0KICBtb2RlbF9uZXckcF9pbmRlcCA+PSAwLjA1IH4gIiIsDQptb2RlbF9uZXckcF9pbmRlcCA8IDAuMDAxIH4gIioqKiIsDQptb2RlbF9uZXckcF9pbmRlcCA8IDAuMDEgfiAiKioiLA0KbW9kZWxfbmV3JHBfaW5kZXAgPCAwLjA1IH4gIioiDQopDQoNCm1vZGVsX25ldyRwX3RleHRfaW50ZXIgPC0gY2FzZV93aGVuKA0KICBtb2RlbF9uZXckcF9pbnRlciA+PSAwLjA1IH4gIiIsDQptb2RlbF9uZXckcF9pbnRlciA8IDAuMDAxIH4gIioqKiIsDQptb2RlbF9uZXckcF9pbnRlciA8IDAuMDEgfiAiKioiLA0KbW9kZWxfbmV3JHBfaW50ZXIgPCAwLjA1IH4gIioiDQopDQoNCiMgTm93IG9ubHkgc2VsZWN0IHRoZSB2YXJpYWJsZXMgdGhhdCBJIHdhbnQgdG8gc2hvdyBpbiB0aGUgdGFibGUNCm1vZGVsX25ldyA8LSBkcGx5cjo6c2VsZWN0KG1vZGVsX25ldywgbXVfc2lnbWEsIFZhcmlhYmxlcywgZXN0X3RpbWUsIHN0ZF9lcnJfdGltZSwgcF90ZXh0X3RpbWVfb25seSwgZXN0X2luZGVwLCBzdGRfZXJyX2luZGVwLCBwX3RleHRfaW5kZXAsIGVzdF9pbnRlciwgc3RkX2Vycm9yX2ludGVyLCBwX3RleHRfaW50ZXIpDQoNCiMgTWFrZSBhbmQgc2F2ZSB0aGUgdGFibGUgDQprYWJsZShtb2RlbF9uZXcsIGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiVGFibGUgMi4gR0FNTFNTIG1vZGVsIG9uIHdvcnJ5IElTU1AgKDE5OTMgLSAyMDEwKSIsIA0KICAgICAgY29sLm5hbWVzID0gYyggIiIsICJWYXJpYWJsZXMiLCAiRXN0aW1hdGUiLCAiU3RkLiBFcnJvciIsICIiLCAiRXN0aW1hdGUiLCAiU3RkLiBFcnJvciIsICIiLCAiRXN0aW1hdGUiLCAiU3RkLiBFcnJvciIsICIiKSwgYWxpZ24gPSAibCIpICU+JQ0KICBrYWJsZV9jbGFzc2ljXzIoaHRtbF9mb250ID0gIlRpbWVzIiwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRikgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAyLCAiVGltZS1vbmx5IG1vZGVsIiA9IDMsICJJbmRlcGVudCB2YXIgbW9kZWwiID0gMywgIkludGVyYWN0aW9uIG1vZGVsIiA9IDMpLCBhbGlnbiA9ICJsIikgJT4lDQogICBmb290bm90ZSgNCiAgICBnZW5lcmFsX3RpdGxlID0gIk5vdGUuIiwNCiAgICBnZW5lcmFsID0gIioqKiA9IHAgPCAwLjAwMSwgKiogPSBwIDwgMC4wMSwgKiA9IHAgPCAwLjA1IiwNCiAgICB0aHJlZXBhcnR0YWJsZSA9IFRSVUUsDQogICAgZm9vdG5vdGVfYXNfY2h1bmsgPSBUUlVFDQogICAgKSANCiMlPiUNCiAgICAjc2F2ZV9rYWJsZSgiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9jbGltYXRlY2hhbmdlL2NsaW1hdGVjaGFuZ2Uvb3V0cHV0L2dhbWxzc190YWJsZS5wZGYiKQ0KICANCmBgYA0KDQojIyBUYWJsZSBhbGwgcG9vbGVkIGVmZmVjdHMgey19DQoNCmBgYHtyLCBldmFsPUZBTFNFIH0NCnJtKGxpc3Q9bHMoKSkNCiMgSSB3YW50IHRvIHJlcGVhdCB0aGUgYWJvdmUgVGFibGUsIGJ1dCBpbnN0ZWFkIG9mIHJlZ3Jlc3Npb25zIEkgbm93IHdhbnQgdG8gcHV0IGFsbCB0aGUgcG9vbGVkIGVmZmVjdHMgaW4gdGhlcmUNCiMgU3RhcnRpbmcgd2l0aCB0aGUgdGltZSBvbmx5IG1vZGVsDQojIFlvdSBtYXkgbm90aWNlIHRoYXQgSSB1c2UgdGhlIHJtYSBmdW5jdGlvbiBhbmQgbWV0YWdlbi4gVGhlIGVzdGltYXRlIFRFLnJhbmRvbSBvZiBtZXRhZ2VuIChwb29sZWQgZWZmZWN0KSBpcyB0aGUgc2FtZSBhcyB0aGUgYmV0YSBpbiB0aGUgcm1hIG1vZGVsDQpzZXQuc2VlZCgxKSAjKGFzIEkgYW0gcGVyZm9ybWluZyBhbmFseXNlcyB3aXRoIGEgcmFuZG9tIGFzcGVjdCkNCg0KbG9hZCgiLi9kYXRhL21ldGFfYW5hbHlzaXMvdG90YWxfcmVnX3Jlc3VsdHNfZ2FtX3dfbmV3LlJEYXRhIikNCg0KIyBFeHRyYWN0IHRoZSBwb29sZWQgZWZmZWN0cywgZmlyc3QgbWVhbiBhdHRpdHVkZXMNCm1vZGVsX3N0ZXBfMV9hdHQgPC0gcm1hKHlpID0gbXVfdGltZSwNCiAgICAgICAgICAgICAgc2VpID0gbXVfdGltZV9zZCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX3JlZ19yZXN1bHRzLA0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQpvbmUgPC0gc3VtbWFyeShtb2RlbF9zdGVwXzFfYXR0KQ0Kb25lX2RmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA1LCBucm93ID0gMSkpDQpjb2xuYW1lcyhvbmVfZGYpIDwtIGMoIm11X3NpZ21hIiwgIlZhcmlhYmxlIiwgIkVzdGltYXRlIiwgIlNFIiwgInAiKQ0KDQpvbmVfZGYkbXVfc2lnbWEgPC0gYygiTWVhbiBhdHRpdHVkZXMiKQ0Kb25lX2RmJFZhcmlhYmxlIDwtICJUaW1lIg0Kb25lX2RmJEVzdGltYXRlIDwtIGFzLm51bWVyaWMob25lJGIpDQpvbmVfZGYkU0UgPC0gb25lJHNlDQpvbmVfZGYkcCA8LSBvbmUkcHZhbA0KDQojIEFuZCBub3cgdmFyaWFuY2UNCm1vZGVsX3N0ZXBfMV92YXIgPC0gcm1hKHlpID0gc2lnX3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IHNpZ190aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsDQogICAgICAgICAgICAgIHRlc3QgPSAia25oYSIpDQoNCnR3byA8LSBzdW1tYXJ5KG1vZGVsX3N0ZXBfMV92YXIpDQp0d29fZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDUsIG5yb3cgPSAxKSkNCmNvbG5hbWVzKHR3b19kZikgPC0gYygibXVfc2lnbWEiLCAiVmFyaWFibGUiLCAiRXN0aW1hdGUiLCAiU0UiLCAicCIpDQoNCnR3b19kZiRtdV9zaWdtYSA8LSBjKCJQb2xhcml6YXRpb24gYXR0aXR1ZGVzIikNCnR3b19kZiRWYXJpYWJsZSA8LSAiVGltZSINCnR3b19kZiRFc3RpbWF0ZSA8LSBhcy5udW1lcmljKHR3byRiKQ0KdHdvX2RmJFNFIDwtIHR3byRzZQ0KdHdvX2RmJHAgPC0gdHdvJHB2YWwNCg0KIyBSb3diaW5kIHRoZW0sIHRoZXNlIGFyZSBhbGwgdGhlIHBvb2xlZCBlZmZlY3RzIG9mIHRoZSB0aW1lLW9ubHkgbW9kZWwNCmVtcHR5X2RmIDwtIHJiaW5kKG9uZV9kZiwgdHdvX2RmKQ0KDQojIE5vdyBjb250aW51ZSB3aXRoIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBtb2RlbCwgZmlyc3QgdGhlIG1lYW4gYXR0aXR1ZGVzIA0KbG9hZCgiLi9kYXRhL21ldGFfYW5hbHlzaXMvdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHNfbmV3LlJEYXRhIikNCg0KbTJfYXR0IDwtIHJtYSh5aSA9IG11X3RpbWVfcHJlZCwNCiAgICAgICAgICAgICAgc2VpID0gbXVfdGltZV9zZF9wcmVkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsDQogICAgICAgICAgICAgIHRlc3QgPSAia25oYSIpDQoNCiMgR2VuZGVyIA0KZ2VuZGVyX2dlbiA8LSBtZXRhZ2VuKFRFID0gbXVfc2V4X2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X3NleF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgQWdlIA0KYWdlX2dlbiA8LSBtZXRhZ2VuKFRFID0gbXVfYWdlX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X2FnZV9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRWR1Y2F0aW9uYWwgbGV2ZWwuIFRoaXMgaXMgbm93IGEgZHVtbXkNCmVkdV9tZWRfZ2VuIDwtIG1ldGFnZW4oVEUgPSBtdV9pc2NlZF9tZWRfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfaXNjZWRfbWVkX3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZWR1X2hpZ2hfZ2VuIDwtIG1ldGFnZW4oVEUgPSBtdV9pc2NlZF9oaWdoX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X2lzY2VkX2hpZ2hfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbmRlcF92YXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEV4dHJhY3QgYWxsIHRoZSBkYXRhIGZyb20gdGhlIG1vZGVscyBhbmQgcHV0IHRoZW0gaW4gYSBkYXRhZnJhbWUgdGhhdCB3aWxsIGxhdGVyIGJlIHRoZSBpbnB1dCBvZiB0aGUga2FibGUgdGFibGUNCnRocmVlX2RmIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA1LCBucm93ID0gNSkpDQpjb2xuYW1lcyh0aHJlZV9kZikgPC0gYygibXVfc2lnbWFfMSIsICJWYXJpYWJsZV8xIiwgIkVzdGltYXRlXzEiLCAiU0VfMSIsICJwXzEiKQ0KdGhyZWVfZGYkbXVfc2lnbWFfMSA8LSBjKCJNZWFuIGF0dGl0dWRlcyIsICIiLCAiIiwgIiIsICIiKQ0KdGhyZWVfZGYkVmFyaWFibGVfMSA8LSBjKCJUaW1lIiwgIkdlbmRlciIsICJBZ2UiLCAiSXNjZWQgaW50ZXJtZWRpYXRlIChyZWY9YmFzaWMpIiwgIklzY2VkIGFkdmFuY2VkIChyZWY9YmFzaWMpIikNCnRocmVlX2RmJEVzdGltYXRlXzEgPC0gYyhhcy5udW1lcmljKG0yX2F0dCRiKSwgZ2VuZGVyX2dlbiRURS5yYW5kb20sIGFnZV9nZW4kVEUucmFuZG9tLCBlZHVfbWVkX2dlbiRURS5yYW5kb20sIGVkdV9oaWdoX2dlbiRURS5yYW5kb20pDQp0aHJlZV9kZiRTRV8xIDwtIGMobTJfYXR0JHNlLCBnZW5kZXJfZ2VuJHNlVEUucmFuZG9tLCBhZ2VfZ2VuJHNlVEUucmFuZG9tLCBlZHVfbWVkX2dlbiRzZVRFLnJhbmRvbSwgZWR1X2hpZ2hfZ2VuJHNlVEUucmFuZG9tKQ0KdGhyZWVfZGYkcF8xIDwtIGMobTJfYXR0JHB2YWwsIGdlbmRlcl9nZW4kcHZhbC5yYW5kb20sIGFnZV9nZW4kcHZhbC5yYW5kb20sIGVkdV9tZWRfZ2VuJHB2YWwucmFuZG9tLCBlZHVfaGlnaF9nZW4kcHZhbC5yYW5kb20pICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgDQojIFRoZSBzYW1lIGZvciB2YXJpYW5jZQ0KbTJfdmFyIDwtIHJtYSh5aSA9IHNpZ190aW1lX3ByZWQsDQogICAgICAgICAgICAgIHNlaSA9IHNpZ190aW1lX3NkX3ByZWQsDQogICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9yZWdfcmVzdWx0cywNCiAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KIyBHZW5kZXINCmdlbmRlcl92YXJfZ2VuIDwtIG1ldGFnZW4oVEUgPSBzaWdfc2V4X2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19zZXhfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbmRlcF92YXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEFnZQ0KYWdlX3Zhcl9nZW4gPC0gbWV0YWdlbihURSA9IHNpZ19hZ2VfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2FnZV9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRWR1Y2F0aW9uDQplZHVfdmFyX21lZF9nZW4gPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9tZWRfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2lzY2VkX21lZF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCmVkdV92YXJfaGlnaF9nZW4gPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9oaWdoX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19pc2NlZF9oaWdoX3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZm91cl9kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNSwgbnJvdyA9IDUpKQ0KY29sbmFtZXMoZm91cl9kZikgPC0gYygibXVfc2lnbWFfMSIsICJWYXJpYWJsZV8xIiwgIkVzdGltYXRlXzEiLCAiU0VfMSIsICJwXzEiKQ0KZm91cl9kZiRtdV9zaWdtYV8xIDwtIGMoIlBvbGFyaXphdGlvbiBhdHRpdHVkZXMiLCAiIiwgIiIsICIiLCAiIikNCmZvdXJfZGYkVmFyaWFibGVfMSA8LSBjKCJUaW1lIiwgIkdlbmRlciIsICJBZ2UiLCAiSXNjZWQgaW50ZXJtZWRpYXRlIChyZWY9YmFzaWMpIiwgIklzY2VkIGFkdmFuY2VkIChyZWY9YmFzaWMpIikNCmZvdXJfZGYkRXN0aW1hdGVfMSA8LSBjKGFzLm51bWVyaWMobTJfdmFyJGIpLCBnZW5kZXJfdmFyX2dlbiRURS5yYW5kb20sIGFnZV92YXJfZ2VuJFRFLnJhbmRvbSwgZWR1X3Zhcl9tZWRfZ2VuJFRFLnJhbmRvbSwgZWR1X3Zhcl9oaWdoX2dlbiRURS5yYW5kb20pDQpmb3VyX2RmJFNFXzEgPC0gYyhtMl9hdHQkc2UsIGdlbmRlcl92YXJfZ2VuJHNlVEUucmFuZG9tLCBhZ2VfdmFyX2dlbiRzZVRFLnJhbmRvbSwgZWR1X3Zhcl9tZWRfZ2VuJHNlVEUucmFuZG9tLCBlZHVfdmFyX2hpZ2hfZ2VuJHNlVEUucmFuZG9tKQ0KZm91cl9kZiRwXzEgPC0gYyhtMl9hdHQkcHZhbCwgZ2VuZGVyX3Zhcl9nZW4kcHZhbC5yYW5kb20sIGFnZV92YXJfZ2VuJHB2YWwucmFuZG9tLCBlZHVfdmFyX21lZF9nZW4kcHZhbC5yYW5kb20sIGVkdV92YXJfaGlnaF9nZW4kcHZhbC5yYW5kb20pDQoNCg0KIyBCaW5kIHJvd3Mgb2YgdGhlc2UgdHdvLCB0aGVzZSBhcmUgYWxsIHRoZSBwb29sZWQgZWZmZWN0cyBvZiB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIG1vZGVsDQppbmRlcF9kZiA8LSByYmluZCh0aHJlZV9kZiwgZm91cl9kZikNCg0KI05vdyBpIHdhbnQgdGhlIGludGVyYWN0aW9uIG1vZGVsIGFzIHdlbGwNCmxvYWQoIi4vZGF0YS9tZXRhX2FuYWx5c2lzL3RvdGFsX2ludGVyX3Jlc3VsdHNfbmV3LlJEYXRhIikNCg0KIyBGaXJzdCBtZWFuIGF0dGl0dWRlcw0KbTNfYXR0IDwtIHJtYSh5aSA9IG11X3RpbWVfaW50LA0KICAgICAgICAgICAgICBzZWkgPSBtdV90aW1lX3NkX2ludCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX3JlZ19yZXN1bHRzLA0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQojIEdlbmRlciANCmdlbmRlcl9nZW5faW50IDwtIG1ldGFnZW4oVEUgPSBtdV9zZXhfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfc2V4X3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEFnZSANCmFnZV9nZW5faW50IDwtIG1ldGFnZW4oVEUgPSBtdV9hZ2VfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfYWdlX3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEVkdWNhdGlvbmFsIGxldmVsDQplZHVfbWVkX2dlbl9pbnQgPC0gbWV0YWdlbihURSA9IG11X2lzY2VkX21lZF9lc3QsDQogICAgICAgICAgICAgICAgIHNlVEUgPSBtdV9pc2NlZF9tZWRfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCmVkdV9oaWdoX2dlbl9pbnQgPC0gbWV0YWdlbihURSA9IG11X2lzY2VkX2hpZ2hfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfaXNjZWRfaGlnaF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2ludGVyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KIyBBbmQgdGhlIGludGVyYWN0aW9uIGVmZmVjdHMgDQojIEdlbmRlciANCmdlbmRlcl9pbnRfZWZmIDwtIG1ldGFnZW4oVEUgPSBtdV9zZXhfZXN0X2ludGVyLA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfc2V4X3NkX2ludGVyLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEFnZSANCmFnZV9pbnRfZWZmIDwtIG1ldGFnZW4oVEUgPSBtdV9hZ2VfZXN0X2ludGVyLA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfYWdlX3NkX2ludGVyLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEVkdWNhdGlvbmFsIGxldmVsDQplZHVfbWVkX2ludF9lZmYgPC0gbWV0YWdlbihURSA9IG11X2lzY2VkX21lZF9lc3RfaW50ZXIsDQogICAgICAgICAgICAgICAgIHNlVEUgPSBtdV9pc2NlZF9tZWRfc2RfaW50ZXIsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCmVkdV9oaWdoX2ludF9lZmYgPC0gbWV0YWdlbihURSA9IG11X2lzY2VkX2hpZ2hfZXN0X2ludGVyLA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfaXNjZWRfaGlnaF9zZF9pbnRlciwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2ludGVyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KIyBOb3cgZXh0cmFjdCB0aGUgZGF0YSBmb3IgYSB0YWJsZQ0KZml2ZV9kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNSwgbnJvdyA9IDkpKQ0KY29sbmFtZXMoZml2ZV9kZikgPC0gYygibXVfc2lnbWFfMiIsICJWYXJpYWJsZV8yIiwgIkVzdGltYXRlXzIiLCAiU0VfMiIsICJwXzIiKQ0KZml2ZV9kZiRtdV9zaWdtYV8yIDwtIGMoIk1lYW4gYXR0aXR1ZGVzIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiKQ0KZml2ZV9kZiRWYXJpYWJsZV8yIDwtIGMoIlRpbWUiLCAiR2VuZGVyIiwgIkFnZSIsICJJc2NlZCBpbnRlcm1lZGlhdGUgKHJlZj1iYXNpYykiLCAiSXNjZWQgYWR2YW5jZWQgKHJlZj1iYXNpYykiLCAiR2VuZGVyIHggdGltZSIsICJBZ2UgeCB0aW1lIiwgIklzY2VkIGludGVybWVkaWF0ZSB4IHRpbWUiLCAiSXNjZWQgYWR2YW5jZWQgeCB0aW1lIikNCmZpdmVfZGYkRXN0aW1hdGVfMiA8LSBjKGFzLm51bWVyaWMobTNfYXR0JGIpLCBnZW5kZXJfZ2VuX2ludCRURS5yYW5kb20sIGFnZV9nZW5faW50JFRFLnJhbmRvbSwgZWR1X21lZF9nZW5faW50JFRFLnJhbmRvbSwgZWR1X2hpZ2hfZ2VuX2ludCRURS5yYW5kb20sIGdlbmRlcl9pbnRfZWZmJFRFLnJhbmRvbSwgYWdlX2ludF9lZmYkVEUucmFuZG9tLCBlZHVfbWVkX2ludF9lZmYkVEUucmFuZG9tLCBlZHVfaGlnaF9pbnRfZWZmJFRFLnJhbmRvbSkNCmZpdmVfZGYkU0VfMiA8LSBjKG0zX2F0dCRzZSwgZ2VuZGVyX2dlbl9pbnQkc2VURS5yYW5kb20sIGFnZV9nZW5faW50JHNlVEUucmFuZG9tLCBlZHVfbWVkX2dlbl9pbnQkc2VURS5yYW5kb20sIGVkdV9oaWdoX2dlbl9pbnQkc2VURS5yYW5kb20sIGdlbmRlcl9pbnRfZWZmJHNlVEUucmFuZG9tLCBhZ2VfaW50X2VmZiRzZVRFLnJhbmRvbSwgZWR1X21lZF9pbnRfZWZmJHNlVEUucmFuZG9tLCBlZHVfaGlnaF9pbnRfZWZmJHNlVEUucmFuZG9tKQ0KZml2ZV9kZiRwXzIgPC0gYyhtM19hdHQkcHZhbCwgZ2VuZGVyX2dlbl9pbnQkcHZhbC5yYW5kb20sIGFnZV9nZW5faW50JHB2YWwucmFuZG9tLCBlZHVfbWVkX2dlbl9pbnQkcHZhbC5yYW5kb20sIGVkdV9oaWdoX2dlbl9pbnQkcHZhbC5yYW5kb20sIGdlbmRlcl9pbnRfZWZmJHB2YWwucmFuZG9tLCBhZ2VfaW50X2VmZiRwdmFsLnJhbmRvbSwgZWR1X21lZF9pbnRfZWZmJHB2YWwucmFuZG9tLCBlZHVfaGlnaF9pbnRfZWZmJHB2YWwucmFuZG9tKQ0KDQojIE5vdyB0aGUgc2FtZSBwcm9jZWR1cmUgZm9yIHRoZSB2YXJpYW5jZQ0KbTNfdmFyIDwtIHJtYSh5aSA9IHNpZ190aW1lX2ludCwNCiAgICAgICAgICAgICAgc2VpID0gc2lnX3RpbWVfc2RfaW50LA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsDQogICAgICAgICAgICAgIHRlc3QgPSAia25oYSIpDQoNCiMgR2VuZGVyIA0KZ2VuZGVyX2dlbl9pbnRfdmFyIDwtIG1ldGFnZW4oVEUgPSBzaWdfc2V4X2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19zZXhfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgQWdlIA0KYWdlX2dlbl9pbnRfdmFyIDwtIG1ldGFnZW4oVEUgPSBzaWdfYWdlX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19hZ2Vfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRWR1Y2F0aW9uYWwgbGV2ZWwNCmVkdV9tZWRfZ2VuX2ludF92YXIgPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9tZWRfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2lzY2VkX21lZF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2ludGVyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZWR1X2hpZ2hfZ2VuX2ludF92YXIgPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9oaWdoX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19pc2NlZF9oaWdoX3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEFuZCB0aGUgaW50ZXJhY3Rpb24gZWZmZWN0cyANCiMgR2VuZGVyIA0KZ2VuZGVyX2ludF9lZmZfdmFyIDwtIG1ldGFnZW4oVEUgPSBzaWdfc2V4X2VzdF9pbnRlciwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19zZXhfc2RfaW50ZXIsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgQWdlIA0KYWdlX2ludF9lZmZfdmFyIDwtIG1ldGFnZW4oVEUgPSBzaWdfYWdlX2VzdF9pbnRlciwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19hZ2Vfc2RfaW50ZXIsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbnRlcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRWR1Y2F0aW9uYWwgbGV2ZWwNCmVkdV9tZWRfaW50X2VmZl92YXIgPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9tZWRfZXN0X2ludGVyLA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2lzY2VkX21lZF9zZF9pbnRlciwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2ludGVyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZWR1X2hpZ2hfaW50X2VmZl92YXIgPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9oaWdoX2VzdF9pbnRlciwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19pc2NlZF9oaWdoX3NkX2ludGVyLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW50ZXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQpzaXhfZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDUsIG5yb3cgPSA5KSkNCmNvbG5hbWVzKHNpeF9kZikgPC0gYygibXVfc2lnbWFfMiIsICJWYXJpYWJsZV8yIiwgIkVzdGltYXRlXzIiLCAiU0VfMiIsICJwXzIiKQ0Kc2l4X2RmJG11X3NpZ21hXzIgPC0gYygiUG9sYXJpemF0aW9uIGF0dGl0dWRlcyIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIikNCnNpeF9kZiRWYXJpYWJsZV8yIDwtIGMoIlRpbWUiLCAiR2VuZGVyIiwgIkFnZSIsICJJc2NlZCBpbnRlcm1lZGlhdGUgKHJlZj1iYXNpYykiLCAiSXNjZWQgYWR2YW5jZWQgKHJlZj1iYXNpYykiLCAiR2VuZGVyIHggdGltZSIsICJBZ2UgeCB0aW1lIiwgIklzY2VkIGludGVybWVkaWF0ZSB4IHRpbWUiLCAiSXNjZWQgYWR2YW5jZWQgeCB0aW1lIikNCnNpeF9kZiRFc3RpbWF0ZV8yIDwtIGMoYXMubnVtZXJpYyhtM192YXIkYiksIGdlbmRlcl9nZW5faW50X3ZhciRURS5yYW5kb20sIGFnZV9nZW5faW50X3ZhciRURS5yYW5kb20sIGVkdV9tZWRfZ2VuX2ludF92YXIkVEUucmFuZG9tLCBlZHVfaGlnaF9nZW5faW50X3ZhciRURS5yYW5kb20sIGdlbmRlcl9pbnRfZWZmX3ZhciRURS5yYW5kb20sIGFnZV9pbnRfZWZmX3ZhciRURS5yYW5kb20sIGVkdV9tZWRfaW50X2VmZl92YXIkVEUucmFuZG9tLCBlZHVfaGlnaF9pbnRfZWZmX3ZhciRURS5yYW5kb20pDQpzaXhfZGYkU0VfMiA8LSBjKG0zX3ZhciRzZSwgZ2VuZGVyX2dlbl9pbnRfdmFyJHNlVEUucmFuZG9tLCBhZ2VfZ2VuX2ludF92YXIkc2VURS5yYW5kb20sIGVkdV9tZWRfZ2VuX2ludF92YXIkc2VURS5yYW5kb20sIGVkdV9oaWdoX2dlbl9pbnRfdmFyJHNlVEUucmFuZG9tLCBnZW5kZXJfaW50X2VmZl92YXIkc2VURS5yYW5kb20sIGFnZV9pbnRfZWZmX3ZhciRzZVRFLnJhbmRvbSwgZWR1X21lZF9pbnRfZWZmX3ZhciRzZVRFLnJhbmRvbSwgZWR1X2hpZ2hfaW50X2VmZl92YXIkc2VURS5yYW5kb20pDQpzaXhfZGYkcF8yIDwtIGMobTNfYXR0JHB2YWwsIGdlbmRlcl9nZW5faW50X3ZhciRwdmFsLnJhbmRvbSwgYWdlX2dlbl9pbnRfdmFyJHB2YWwucmFuZG9tLCBlZHVfbWVkX2dlbl9pbnRfdmFyJHB2YWwucmFuZG9tLCBlZHVfaGlnaF9nZW5faW50X3ZhciRwdmFsLnJhbmRvbSwgZ2VuZGVyX2ludF9lZmZfdmFyJHB2YWwucmFuZG9tLCBhZ2VfaW50X2VmZl92YXIkcHZhbC5yYW5kb20sIGVkdV9tZWRfaW50X2VmZl92YXIkcHZhbC5yYW5kb20sIGVkdV9oaWdoX2ludF9lZmZfdmFyJHB2YWwucmFuZG9tKQ0KDQojQmluZCB0aGVzZSB0d28sIHRoaXMgbm93IGhhcyBhbGwgdGhlIHBvb2xlZCBlZmZlY3RzIG9mIHRoZSBpbnRlcmFjdGlvbiBlZmZlY3RzDQppbnRlcl9kZiA8LSByYmluZChmaXZlX2RmLCBzaXhfZGYpDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojQ29sdW1uYmluZCB0aGUgdGhyZWUgZGF0YXNldHMNCiMgRGlmZmljdWx0IHRvIGNvbHVtbmJpbmQgdGhlbSwgYmVjYXVzZSB0aGV5J3JlIG9mIGRpZmZlcmVudCBsZW5ndGhzIChsb2dpY2FsbHkpDQpkZl9saXN0IDwtIGxpc3QoZW1wdHlfZGYsIGluZGVwX2RmLCBpbnRlcl9kZikNCg0KYmluZF9jb2xzX2ZpbGwgPC0gZnVuY3Rpb24oZGZfbGlzdCkgew0KDQogIG1heF9yb3dzIDwtIG1hcF9pbnQoZGZfbGlzdCwgbnJvdykgJT4lIG1heCgpDQogIA0KICBtYXAoZGZfbGlzdCwgZnVuY3Rpb24oZGYpIHsNCiAgICBpZihucm93KGRmKSA9PSBtYXhfcm93cykgcmV0dXJuKGRmKQ0KICAgIGZpcnN0IDwtIG5hbWVzKGRmKVsxXSAlPiUgc3ltKCkNCiAgICBkZiAlPiUgYWRkX3JvdyghIWZpcnN0IDo9IHJlcChOQSwgbWF4X3Jvd3MgLSBucm93KGRmKSkpDQogIH0pICU+JSBiaW5kX2NvbHMoKQ0KfQ0KDQp0b3RhbF9kZiA8LSBiaW5kX2NvbHNfZmlsbChkZl9saXN0KQ0KDQojQ2hhbmdlIHRoZSBvcmRlciBhIGJpdCwganVzdCBsaWtlIGluIHRoZSBwcmV2aW91cyB0YWJsZSANCndyaXRlX3hsc3godG90YWxfZGYsICAiLi9kYXRhL2Rlc2NyaXB0aXZlcy9rYWJsZV9tb2RlbF9hbGxfcG9vbGVkX2VmZmVjdHMueGxzeCIgKQ0KYGBgDQoNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQptb2RlbF9uZXcgPC0gcmVhZF9leGNlbCgiLi9kYXRhL2Rlc2NyaXB0aXZlcy9rYWJsZV9tb2RlbF9hbGxfcG9vbGVkX2VmZmVjdHMueGxzeCIgKQ0KDQojIEkgV2FudCB0byByb3VuZCB0aGUgbnVtZXJpYyB2YXJpYWJsZXMgdG8gMyBkZWNpbWFscw0KbW9kZWxfbmV3IDwtIGRwbHlyOjptdXRhdGUobW9kZWxfbmV3LCBhY3Jvc3MoLmNvbHMgPSBjKC1tdV9zaWdtYV8yLCAtVmFyaWFibGVfMiksIC5mbnMgPSBhcy5udW1lcmljKSkNCm51bWVyaWNfY29scyA8LSBzYXBwbHkobW9kZWxfbmV3LCBpcy5udW1lcmljKQ0KbW9kZWxfbmV3WywgbnVtZXJpY19jb2xzXSA8LSByb3VuZChtb2RlbF9uZXdbLCBudW1lcmljX2NvbHNdLCBkaWdpdHMgPSAzKQ0KDQojIENyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0byB1c2Ugc3RhcnMgaW5zdGVhZCBvZiB0aGUgZnVsbCBwLXZhbHVlcyBpbiB0aGUgdGFibGUNCm1vZGVsX25ldyRwX3RleHQgPC0gY2FzZV93aGVuKA0KICBtb2RlbF9uZXckcCA+PSAwLjA1IH4gIiIsDQptb2RlbF9uZXckcCA8IDAuMDAxIH4gIioqKiIsDQptb2RlbF9uZXckcCA8IDAuMDEgfiAiKioiLA0KbW9kZWxfbmV3JHAgPCAwLjA1IH4gIioiDQopDQoNCm1vZGVsX25ldyRwX3RleHRfMSA8LSBjYXNlX3doZW4oDQogIG1vZGVsX25ldyRwXzEgPj0gMC4wNSB+ICIiLA0KbW9kZWxfbmV3JHBfMSA8IDAuMDAxIH4gIioqKiIsDQptb2RlbF9uZXckcF8xIDwgMC4wMSB+ICIqKiIsDQptb2RlbF9uZXckcF8xIDwgMC4wNSB+ICIqIg0KKQ0KDQptb2RlbF9uZXckcF90ZXh0XzIgPC0gY2FzZV93aGVuKA0KICBtb2RlbF9uZXckcF8yID49IDAuMDUgfiAiIiwNCm1vZGVsX25ldyRwXzIgPCAwLjAwMSB+ICIqKioiLA0KbW9kZWxfbmV3JHBfMiA8IDAuMDEgfiAiKioiLA0KbW9kZWxfbmV3JHBfMiA8IDAuMDUgfiAiKiINCikNCg0KIyBOb3cgb25seSBzZWxlY3QgdGhlIHZhcmlhYmxlcyB0aGF0IEkgd2FudCB0byBzaG93IGluIHRoZSB0YWJsZQ0KbW9kZWxfbmV3IDwtIGRwbHlyOjpzZWxlY3QobW9kZWxfbmV3LCBtdV9zaWdtYV8yLCBWYXJpYWJsZV8yLCBFc3RpbWF0ZSwgU0UsIHBfdGV4dCwgRXN0aW1hdGVfMSwgU0VfMSwgcF90ZXh0XzEsIEVzdGltYXRlXzIsIFNFXzIsIHBfdGV4dF8yKQ0KDQojIE1ha2UgYW5kIHNhdmUgdGhlIHRhYmxlIGFzIGh0bWwgZmlsZQ0Ka2FibGUobW9kZWxfbmV3LCBkaWdpdHMgPSAzLCBjYXB0aW9uID0gIlRhYmxlIDMuIEFsbCBwb29sZWQgZWZmZWN0cyBtZWFuIGF0dGl0dWRlcyBhbmQgcG9sYXJpemF0aW9uIiwgDQogICAgICBjb2wubmFtZXMgPSBjKCAiIiwgIlZhcmlhYmxlcyIsICJFc3RpbWF0ZSIsICJTdGQuIEVycm9yIiwgIiIsICJFc3RpbWF0ZSIsICJTdGQuIEVycm9yIiwgIiIsICJFc3RpbWF0ZSIsICJTdGQuIEVycm9yIiwgIiIpKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGh0bWxfZm9udCA9ICJUaW1lcyIsIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgIlRpbWUtb25seSBtb2RlbCIgPSAzLCAiSW5kZXBlbnQgdmFyIG1vZGVsIiA9IDMsICJJbnRlcmFjdGlvbiBtb2RlbCIgPSAzKSkgJT4lDQogICBmb290bm90ZSgNCiAgICBnZW5lcmFsX3RpdGxlID0gIk5vdGUuIiwNCiAgICBnZW5lcmFsID0gIioqKiA9IHAgPCAwLjAwMSwgKiogPSBwIDwgMC4wMSwgKiA9IHAgPCAwLjA1IiwNCiAgICB0aHJlZXBhcnR0YWJsZSA9IFRSVUUsDQogICAgZm9vdG5vdGVfYXNfY2h1bmsgPSBUUlVFDQogICAgKSAjJT4lDQogICAgI3NhdmVfa2FibGUoIi4vb3V0cHV0L3Bvb2xlZF9lZmZlY3RzX3RhYmxlX0RFQ0VNQkVSLmh0bWwiKQ0KYGBgDQoNCiMjIEFwcGVuZGl4IEQuIFBvb2xlZCBlZmZlY3RzIGFnZS1vbmx5IHZzIGdlbmRlciBhbmQgZWR1Y2F0aW9uLW9ubHkgbW9kZWwgey19DQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0Kcm0obGlzdD1scygpKQ0Kc2V0LnNlZWQoMSkgIyhhcyBJIGFtIHBlcmZvcm1pbmcgYW5hbHlzZXMgd2l0aCBhIHJhbmRvbSBhc3BlY3QpDQpsb2FkKCIuL2RhdGEvbWV0YV9hbmFseXNpcy90b3RhbF9pbmRlcF92YXJfcmVzdWx0c19uZXdfZWR1Z2VuLlJEYXRhIikNCg0KIyBUaGUgbW9kZWxzIGluIHdoaWNoIEkgb25seSBpbmNsdWRlZCBlZHVjYXRpb24gYW5kIGdlbmRlciANCm0yX2F0dCA8LSBybWEoeWkgPSBtdV90aW1lLA0KICAgICAgICAgICAgICBzZWkgPSBtdV90aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KIyBHZW5kZXIgDQpnZW5kZXJfZ2VuIDwtIG1ldGFnZW4oVEUgPSBtdV9zZXhfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gbXVfc2V4X3NkLA0KICAgICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHMsDQogICAgICAgICAgICAgICAgIGZpeGVkID0gRkFMU0UsDQogICAgICAgICAgICAgICAgIHJhbmRvbSA9IFRSVUUsDQogICAgICAgICAgICAgICAgIG1ldGhvZC50YXUgPSAiUkVNTCIsDQogICAgICAgICAgICAgICAgIGhha24gPSBUUlVFKQ0KDQojIEVkdWNhdGlvbmFsIGxldmVsLiBUaGlzIGlzIG5vdyBhIGR1bW15DQplZHVfbWVkX2dlbiA8LSBtZXRhZ2VuKFRFID0gbXVfaXNjZWRfbWVkX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X2lzY2VkX21lZF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZWR1X2hpZ2hfZ2VuIDwtIG1ldGFnZW4oVEUgPSBtdV9pc2NlZF9oaWdoX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X2lzY2VkX2hpZ2hfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbmRlcF92YXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRXh0cmFjdCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgbW9kZWxzIGFuZCBwdXQgdGhlbSBpbiBhIGRhdGFmcmFtZSB0aGF0IHdpbGwgbGF0ZXIgYmUgdGhlIGlucHV0IG9mIHRoZSBrYWJsZSB0YWJsZQ0KdGhyZWVfZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDYsIG5yb3cgPSA0KSkNCmNvbG5hbWVzKHRocmVlX2RmKSA8LSBjKCJtdV9zaWdtYV8xIiwgImFnZV9lZHVjXzEiLCAiVmFyaWFibGVfMSIsICJFc3RpbWF0ZV8xIiwgIlNFXzEiLCAicF8xIikNCnRocmVlX2RmJG11X3NpZ21hXzEgPC0gYygiTWVhbiBhdHRpdHVkZXMiLCAiIiwgIiIsICIiKQ0KdGhyZWVfZGYkYWdlX2VkdWNfMSA8LSBjKCJHZW5kZXIgYW5kIGVkdWNhdGlvbiIsICIiLCAiIiwgIiIpDQp0aHJlZV9kZiRWYXJpYWJsZV8xIDwtIGMoIlRpbWUiLCAiR2VuZGVyIiwgIklzY2VkIGludGVybWVkaWF0ZSAocmVmPWJhc2ljKSIsICJJc2NlZCBhZHZhbmNlZCAocmVmPWJhc2ljKSIpDQp0aHJlZV9kZiRFc3RpbWF0ZV8xIDwtIGMoYXMubnVtZXJpYyhtMl9hdHQkYiksIGdlbmRlcl9nZW4kVEUucmFuZG9tLGVkdV9tZWRfZ2VuJFRFLnJhbmRvbSwgZWR1X2hpZ2hfZ2VuJFRFLnJhbmRvbSkNCnRocmVlX2RmJFNFXzEgPC0gYyhtMl9hdHQkc2UsIGdlbmRlcl9nZW4kc2VURS5yYW5kb20sIGVkdV9tZWRfZ2VuJHNlVEUucmFuZG9tLCBlZHVfaGlnaF9nZW4kc2VURS5yYW5kb20pDQp0aHJlZV9kZiRwXzEgPC0gYyhtMl9hdHQkcHZhbCwgZ2VuZGVyX2dlbiRwdmFsLnJhbmRvbSwgZWR1X21lZF9nZW4kcHZhbC5yYW5kb20sIGVkdV9oaWdoX2dlbiRwdmFsLnJhbmRvbSkgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCiMgVGhlIHNhbWUgZm9yIHZhcmlhbmNlDQptMl92YXIgPC0gcm1hKHlpID0gc2lnX3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IHNpZ190aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KIyBHZW5kZXINCmdlbmRlcl92YXJfZ2VuIDwtIG1ldGFnZW4oVEUgPSBzaWdfc2V4X2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IHNpZ19zZXhfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbmRlcF92YXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRWR1Y2F0aW9uDQplZHVfdmFyX21lZF9nZW4gPC0gbWV0YWdlbihURSA9IHNpZ19pc2NlZF9tZWRfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2lzY2VkX21lZF9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzLA0KICAgICAgICAgICAgICAgICBmaXhlZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICByYW5kb20gPSBUUlVFLA0KICAgICAgICAgICAgICAgICBtZXRob2QudGF1ID0gIlJFTUwiLA0KICAgICAgICAgICAgICAgICBoYWtuID0gVFJVRSkNCg0KZWR1X3Zhcl9oaWdoX2dlbiA8LSBtZXRhZ2VuKFRFID0gc2lnX2lzY2VkX2hpZ2hfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2lzY2VkX2hpZ2hfc2QsDQogICAgICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9pbmRlcF92YXJfcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCmZvdXJfZGYgPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IDYsIG5yb3cgPSA0KSkNCmNvbG5hbWVzKGZvdXJfZGYpIDwtIGMoIm11X3NpZ21hXzEiLCAiYWdlX2VkdWNfMSIsICJWYXJpYWJsZV8xIiwgIkVzdGltYXRlXzEiLCAiU0VfMSIsICJwXzEiKQ0KZm91cl9kZiRtdV9zaWdtYV8xIDwtIGMoIlBvbGFyaXphdGlvbiBhdHRpdHVkZXMiLCAiIiwgIiIsICIiKQ0KZm91cl9kZiRhZ2VfZWR1Y18xIDwtIGMoIkdlbmRlciBhbmQgZWR1Y2F0aW9uIiwgIiIsICIiLCAiIikNCmZvdXJfZGYkVmFyaWFibGVfMSA8LSBjKCJUaW1lIiwgIkdlbmRlciIsICJJc2NlZCBpbnRlcm1lZGlhdGUgKHJlZj1iYXNpYykiLCAiSXNjZWQgYWR2YW5jZWQgKHJlZj1iYXNpYykiKQ0KZm91cl9kZiRFc3RpbWF0ZV8xIDwtIGMoYXMubnVtZXJpYyhtMl92YXIkYiksIGdlbmRlcl92YXJfZ2VuJFRFLnJhbmRvbSwgZWR1X3Zhcl9tZWRfZ2VuJFRFLnJhbmRvbSwgZWR1X3Zhcl9oaWdoX2dlbiRURS5yYW5kb20pDQpmb3VyX2RmJFNFXzEgPC0gYyhtMl9hdHQkc2UsIGdlbmRlcl92YXJfZ2VuJHNlVEUucmFuZG9tLCBlZHVfdmFyX21lZF9nZW4kc2VURS5yYW5kb20sIGVkdV92YXJfaGlnaF9nZW4kc2VURS5yYW5kb20pDQpmb3VyX2RmJHBfMSA8LSBjKG0yX2F0dCRwdmFsLCBnZW5kZXJfdmFyX2dlbiRwdmFsLnJhbmRvbSwgZWR1X3Zhcl9tZWRfZ2VuJHB2YWwucmFuZG9tLCBlZHVfdmFyX2hpZ2hfZ2VuJHB2YWwucmFuZG9tKQ0KDQpgYGANCg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCnJtKHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzKQ0KIyBEbyB0aGUgc2FtZSwgYnV0IHRoZW4gZm9yIHRoZSBtb2RlbHMgd2l0aCBvbmx5IGFnZSBpbmNsdWRlZA0KbG9hZCgiLi9kYXRhL21ldGFfYW5hbHlzaXMvdG90YWxfaW5kZXBfdmFyX3Jlc3VsdHNfbmV3X2FnZS5SRGF0YSIpDQp0b3RhbF9pbmRlcF92YXJfcmVzdWx0c19hZ2UgPC0gYXMuZGF0YS5mcmFtZSh0b3RhbF9pbmRlcF92YXJfcmVzdWx0cykNCg0KIyBUaGUgbW9kZWxzIGluIHdoaWNoIEkgb25seSBpbmNsdWRlZCBlZHVjYXRpb24gYW5kIGdlbmRlciANCm0yX2F0dF9hZ2UgPC0gcm1hKHlpID0gbXVfdGltZSwNCiAgICAgICAgICAgICAgc2VpID0gbXVfdGltZV9zZCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzX2FnZSwNCiAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQojIEFnZQ0KYWdlX2dlbiA8LSBtZXRhZ2VuKFRFID0gbXVfYWdlX2VzdCwNCiAgICAgICAgICAgICAgICAgc2VURSA9IG11X2FnZV9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzX2FnZSwNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCiMgRXh0cmFjdCBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgbW9kZWxzIGFuZCBwdXQgdGhlbSBpbiBhIGRhdGFmcmFtZSB0aGF0IHdpbGwgbGF0ZXIgYmUgdGhlIGlucHV0IG9mIHRoZSBrYWJsZSB0YWJsZQ0KZml2ZV9kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNiwgbnJvdyA9IDIpKQ0KY29sbmFtZXMoZml2ZV9kZikgPC0gYygibXVfc2lnbWFfMSIsICJhZ2VfZWR1Y18xIiwgIlZhcmlhYmxlXzEiLCAiRXN0aW1hdGVfMSIsICJTRV8xIiwgInBfMSIpDQpmaXZlX2RmJG11X3NpZ21hXzEgPC0gYygiIiwgIiIpDQpmaXZlX2RmJGFnZV9lZHVjXzEgPC0gYygiQWdlIiwgIiIpDQpmaXZlX2RmJFZhcmlhYmxlXzEgPC0gYygiVGltZSIsICJBZ2UiKQ0KZml2ZV9kZiRFc3RpbWF0ZV8xIDwtIGMoYXMubnVtZXJpYyhtMl9hdHRfYWdlJGIpLCBhZ2VfZ2VuJFRFLnJhbmRvbSkNCmZpdmVfZGYkU0VfMSA8LSBjKG0yX2F0dF9hZ2Ukc2UsIGFnZV9nZW4kc2VURS5yYW5kb20pDQpmaXZlX2RmJHBfMSA8LSBjKG0yX2F0dF9hZ2UkcHZhbCwgYWdlX2dlbiRwdmFsLnJhbmRvbSkgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICANCiMgVGhlIHNhbWUgZm9yIHZhcmlhbmNlDQptMl92YXJfYWdlIDwtIHJtYSh5aSA9IHNpZ190aW1lLA0KICAgICAgICAgICAgICBzZWkgPSBzaWdfdGltZV9zZCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzX2FnZSwNCiAgICAgICAgICAgICAgbWV0aG9kID0gIlJFTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQojIEdlbmRlcg0KYWdlX3Zhcl9nZW4gPC0gbWV0YWdlbihURSA9IHNpZ19hZ2VfZXN0LA0KICAgICAgICAgICAgICAgICBzZVRFID0gc2lnX2FnZV9zZCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX2luZGVwX3Zhcl9yZXN1bHRzX2FnZSwNCiAgICAgICAgICAgICAgICAgZml4ZWQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgcmFuZG9tID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgbWV0aG9kLnRhdSA9ICJSRU1MIiwNCiAgICAgICAgICAgICAgICAgaGFrbiA9IFRSVUUpDQoNCnNpeF9kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNiwgbnJvdyA9IDIpKQ0KY29sbmFtZXMoc2l4X2RmKSA8LSBjKCJtdV9zaWdtYV8xIiwgImFnZV9lZHVjXzEiLCAiVmFyaWFibGVfMSIsICJFc3RpbWF0ZV8xIiwgIlNFXzEiLCAicF8xIikNCnNpeF9kZiRtdV9zaWdtYV8xIDwtIGMoIiIsICIiKQ0Kc2l4X2RmJGFnZV9lZHVjXzEgPC0gYygiQWdlIiwgIiIpDQpzaXhfZGYkVmFyaWFibGVfMSA8LSBjKCJUaW1lIiwgIkFnZSIpDQpzaXhfZGYkRXN0aW1hdGVfMSA8LSBjKGFzLm51bWVyaWMobTJfdmFyX2FnZSRiKSwgYWdlX3Zhcl9nZW4kVEUucmFuZG9tKQ0Kc2l4X2RmJFNFXzEgPC0gYyhtMl92YXJfYWdlJHNlLCBhZ2VfdmFyX2dlbiRzZVRFLnJhbmRvbSkNCnNpeF9kZiRwXzEgPC0gYyhtMl92YXJfYWdlJHB2YWwsIGFnZV92YXJfZ2VuJHB2YWwucmFuZG9tKQ0KDQojIFRoZSBvcmRlciBJIHdhbnQgaW4gdGhlIHRhYmxlcyBpcyB0aHJlZSAtPiBmaXZlIC0+IGZvdXIgLT4gc2l4DQp0b3RhbF9kZiA8LSByYmluZCh0aHJlZV9kZiwgZml2ZV9kZiwgZm91cl9kZiwgc2l4X2RmKQ0KDQojIEkgV2FudCB0byByb3VuZCB0aGUgbnVtZXJpYyB2YXJpYWJsZXMgdG8gMyBkZWNpbWFscw0KdG90YWxfZGYgPC0gZHBseXI6Om11dGF0ZSh0b3RhbF9kZiwgYWNyb3NzKC5jb2xzID0gYygtbXVfc2lnbWFfMSwgLVZhcmlhYmxlXzEsIC1hZ2VfZWR1Y18xKSwgLmZucyA9IGFzLm51bWVyaWMpKQ0KbnVtZXJpY19jb2xzIDwtIHNhcHBseSh0b3RhbF9kZiwgaXMubnVtZXJpYykNCnRvdGFsX2RmWywgbnVtZXJpY19jb2xzXSA8LSByb3VuZCh0b3RhbF9kZlssIG51bWVyaWNfY29sc10sIGRpZ2l0cyA9IDMpDQoNCiMgQ3JlYXRlIGEgbmV3IHZhcmlhYmxlIHRvIHVzZSBzdGFycyBpbnN0ZWFkIG9mIHRoZSBmdWxsIHAtdmFsdWVzIGluIHRoZSB0YWJsZQ0KdG90YWxfZGYkcF90ZXh0XzEgPC0gY2FzZV93aGVuKA0KICB0b3RhbF9kZiRwXzEgPj0gMC4wNSB+ICIiLA0KdG90YWxfZGYkcF8xIDwgMC4wMDEgfiAiKioqIiwNCnRvdGFsX2RmJHBfMSA8IDAuMDEgfiAiKioiLA0KdG90YWxfZGYkcF8xIDwgMC4wNSB+ICIqIg0KKQ0KDQojIE5vdyBvbmx5IHNlbGVjdCB0aGUgdmFyaWFibGVzIHRoYXQgSSB3YW50IHRvIHNob3cgaW4gdGhlIHRhYmxlDQp0b3RhbF9kZiA8LSBkcGx5cjo6c2VsZWN0KHRvdGFsX2RmLCBtdV9zaWdtYV8xLCBhZ2VfZWR1Y18xLCBWYXJpYWJsZV8xLCBFc3RpbWF0ZV8xLCBTRV8xLCBwX3RleHRfMSkNCg0KIyBNYWtlIGFuZCBzYXZlIHRoZSB0YWJsZSBhcyBodG1sIGZpbGUNCmthYmxlKHRvdGFsX2RmLCBkaWdpdHMgPSAzLCBjYXB0aW9uID0gIkFwcGVuZGl4IEQuIFBvb2xlZCBlZmZlY3RzIG1lYW4gYXR0aXR1ZGVzIGFuZCBwb2xhcml6YXRpb24gYWdlLCBlZHVjYXRpb24gYW5kIGdlbmRlci4iLCANCiAgICAgIGNvbC5uYW1lcyA9IGMoICIiLCAiIiwgIlZhcmlhYmxlcyIsICJFc3RpbWF0ZSIsICJTdGQuIEVycm9yIiwgIiIpKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGh0bWxfZm9udCA9ICJUaW1lcyIsIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMywgIkluZGVwZW50IHZhciBtb2RlbCIgPSAzKSkgJT4lDQogICBmb290bm90ZSgNCiAgICBnZW5lcmFsX3RpdGxlID0gIk5vdGUuIiwNCiAgICBnZW5lcmFsID0gIioqKiA9IHAgPCAwLjAwMSwgKiogPSBwIDwgMC4wMSwgKiA9IHAgPCAwLjA1IiwNCiAgICB0aHJlZXBhcnR0YWJsZSA9IFRSVUUsDQogICAgZm9vdG5vdGVfYXNfY2h1bmsgPSBUUlVFDQogICAgKSMlPiUNCiAjc2F2ZV9rYWJsZSgiLi9vdXRwdXQvYXBwZW5kaXgvcG9vbGVkX2VmZmVjdHNfZWR1Z2VuYWdlX0RFQ0VNQkVSLmh0bWwiKQ0KDQoNCmBgYA0KDQojIyBSZXBlYXQgbWFpbiBhbmFseXNlcyB3aXRob3V0IG91dGxpZXIocykNCg0KYGBge3J9DQojIExvYWQgdGhlIGRhdGENCmxvYWQoIi4vZGF0YS9tZXRhX2FuYWx5c2lzL3RvdGFsX3JlZ19yZXN1bHRzX2dhbV93X25ldy5SRGF0YSIpDQoNCiMgUnVuIHRoZSBmaXJzdCBtb2RlbCBhbmQgY2hlY2sgZm9yIG91dGxpZXJzDQptb2RlbF9zdGVwXzFfYXR0IDwtIHJtYSh5aSA9IG11X3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IG11X3RpbWVfc2QsDQogICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9yZWdfcmVzdWx0cywNCiAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KbW9kZWxfc3RlcF8xX2F0dA0KDQppbmYgPC0gaW5mbHVlbmNlKG1vZGVsX3N0ZXBfMV9hdHQpICMgVGhlcmUgaXMgb25lIG91dGxpZXINCg0KIyBEZWxldGUgb3V0bGllcg0KdG90YWxfcmVnX3Jlc3VsdHMgPC0gc3Vic2V0KHRvdGFsX3JlZ19yZXN1bHRzLCBzdWJzZXQgPSBkZXBfdmFyICE9ICJjY191bnN0b3AiKQ0KDQojIFJ1biB0aGUgc2FtZSBhbmFseXNlcw0KbW9kZWxfc3RlcF8xX2F0dCA8LSBybWEoeWkgPSBtdV90aW1lLA0KICAgICAgICAgICAgICBzZWkgPSBtdV90aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsDQogICAgICAgICAgICAgIHRlc3QgPSAia25oYSIpDQoNCm1vZGVsX3N0ZXBfMV9hdHQNCg0KbW9kZWxfc3RlcF8xX3ZhciA8LSBybWEoeWkgPSBzaWdfdGltZSwNCiAgICAgICAgICAgICAgc2VpID0gc2lnX3RpbWVfc2QsDQogICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9yZWdfcmVzdWx0cywNCiAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KbW9kZWxfc3RlcF8xX3Zhcg0KDQptb2RlbF9zdGVwXzJfYXR0IDwtIHJtYSh5aSA9IG11X3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IG11X3RpbWVfc2QsDQogICAgICAgICAgICAgIGRhdGEgPSB0b3RhbF9yZWdfcmVzdWx0cywNCiAgICAgICAgICAgICAgbW9kcyA9IH4gYXR0aXR1ZGVfY2F0LA0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQpzdW1tYXJ5KG1vZGVsX3N0ZXBfMl9hdHQpDQoNCm1vZGVsX3N0ZXBfMl92YXIgPC0gcm1hKHlpID0gc2lnX3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IHNpZ190aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1vZHMgPSB+IGF0dGl0dWRlX2NhdCwgIyBjb2duIGFzIHJlZiBjYXQsIHNpZw0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQptb2RlbF9zdGVwXzJfdmFyDQoNCm1vZGVsX3N0ZXBfM19hdHQgPC0gcm1hKHlpID0gbXVfdGltZSwNCiAgICAgICAgICAgICAgc2VpID0gbXVfdGltZV9zZCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX3JlZ19yZXN1bHRzLA0KICAgICAgICAgICAgICBtb2RzID0gfiBhdHRpdHVkZV9jYXQgKyBtZWFuX3llYXJfY2VudGVyZWQsDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsDQogICAgICAgICAgICAgIHRlc3QgPSAia25oYSIpDQoNCm1vZGVsX3N0ZXBfM19hdHQNCg0KbW9kZWxfc3RlcF80X2F0dCA8LSBybWEoeWkgPSBtdV90aW1lLA0KICAgICAgICAgICAgICBzZWkgPSBtdV90aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1vZHMgPSB+IGF0dGl0dWRlX2NhdCArIG1lYW5feWVhcl9jZW50ZXJlZCArIGFtYmlndW91cyArIG5hdGlvbmFsICsgb3Jfc2NhbGUgKyBwZWNfbWlzcyArIGRhdGEgKyBucl93YXZlcywNCiAgICAgICAgICAgICAgbWV0aG9kID0gIk1MIiwNCiAgICAgICAgICAgICAgdGVzdCA9ICJrbmhhIikNCg0KbW9kZWxfc3RlcF80X2F0dA0KDQptb2RlbF9zdGVwXzNfdmFyIDwtIHJtYSh5aSA9IHNpZ190aW1lLA0KICAgICAgICAgICAgICBzZWkgPSBzaWdfdGltZV9zZCwNCiAgICAgICAgICAgICAgZGF0YSA9IHRvdGFsX3JlZ19yZXN1bHRzLA0KICAgICAgICAgICAgICBtb2RzID0gfiAgYXR0aXR1ZGVfY2F0ICsgbWVhbl95ZWFyX2NlbnRlcmVkLA0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQptb2RlbF9zdGVwXzNfdmFyDQoNCm1vZGVsX3N0ZXBfNF92YXIgPC0gcm1hKHlpID0gc2lnX3RpbWUsDQogICAgICAgICAgICAgIHNlaSA9IHNpZ190aW1lX3NkLA0KICAgICAgICAgICAgICBkYXRhID0gdG90YWxfcmVnX3Jlc3VsdHMsDQogICAgICAgICAgICAgIG1vZHMgPSB+ICBhdHRpdHVkZV9jYXQgKyAgbWVhbl95ZWFyX2NlbnRlcmVkICsgYW1iaWd1b3VzICsgbmF0aW9uYWwgKyBvcl9zY2FsZSArIHBlY19taXNzICsgZGF0YSArIG5yX3dhdmVzLA0KICAgICAgICAgICAgICBtZXRob2QgPSAiTUwiLA0KICAgICAgICAgICAgICB0ZXN0ID0gImtuaGEiKQ0KDQptb2RlbF9zdGVwXzRfdmFyDQoNCiMgUHV0IHRoZW0gaW4gYSB0YWJsZQ0KbW9kZWxzIDwtIGxpc3QoIk0xIiA9IG1vZGVsX3N0ZXBfMV9hdHQsICJNMiIgPSBtb2RlbF9zdGVwXzJfYXR0LCAiTTMiID0gbW9kZWxfc3RlcF8zX2F0dCwgIk00IiA9IG1vZGVsX3N0ZXBfNF9hdHQsICJNMSIgPSAgbW9kZWxfc3RlcF8xX3ZhciwgIk0yIj0gbW9kZWxfc3RlcF8yX3ZhciwgIk0zIj0gIG1vZGVsX3N0ZXBfM192YXIsICJNNCIgPSBtb2RlbF9zdGVwXzRfdmFyKQ0KDQptb2RlbHN1bW1hcnkobW9kZWxzLCBvdXRwdXQgPSAia2FibGVFeHRyYSIsIHN0YXRpc3RpYyA9ICdzdGQuZXJyb3InLCBzdGFycyA9IFRSVUUsIHNoYXBlID0gdGVybSB+IG1vZGVsICsgc3RhdGlzdGljLCB0aXRsZSA9ICJBcHBlbmRpeCBYLiBNZXRhLXJlZ3Jlc3Npb24gZXhjbHVkaW5nIG91dGxpZXIiLCBmbXQgPSBmbXRfc3RhdGlzdGljKGVzdGltYXRlID0gMywgc3RkLmVycm9yID0zKSwgY29lZl9yZW5hbWUgPSBjKCJvdmVyYWxsIiA9IkludGVyY2VwdCIsIA0KICAgICAgICAgICAiaW50ZXJjZXB0IiA9ICJJbnRlcmNlcHQiLCANCiAgICAgICAgICAgImF0dGl0dWRlX2NhdGFmZmVjdGl2ZSIgPSAiQWZmZWN0aXZlIGF0dGl0dWRlIChyZWYgPSBiZWgpIiwNCiAgICAgICAgICAgImF0dGl0dWRlX2NhdGNvZ25pdGl2ZSIgPSAiQ29nbml0aXZlIGF0dGl0dWRlIiwgDQogICAgICAgICAgICJtZWFuX3llYXJfY2VudGVyZWQiID0JIk1lYW4geWVhciBjZW50ZXJlZCIsIA0KICAgICAgICAgICAiYW1iaWd1b3VzWWVzIiA9ICJBbWJpZ3VvdXMgKHJlZiA9IG5vKSIsDQogICAgICAgICAgICJuYXRpb25hbCIgPSAiTmF0aW9uYWwgKHJlZiA9IG5vKSIsIA0KICAgICAgICAgICAib3Jfc2NhbGUiID0gIk9yaWdpbmFsIHNjYWxlIiwgDQogICAgICAgICAgICAicGVjX21pc3MiID0gIlBlcmMuIG1pc3NpbmdzIiwgDQogICAgICAgICAgICJkYXRhRVNTIj0gIkVTUyAocmVmID0gRUIpIiwgDQogICAgICAgICAgICJkYXRhRVZTIj0gIkVWUyIsIA0KICAgICAgICAgICAiZGF0YUlTU1AiID0gIklTU1AiLCANCiAgICAgICAgICAgImRhdGFMSVNTIj0gIkxJU1MiLCANCiAgICAgICAgICAgImRhdGFNT1QiID0gIk1PVCIsIA0KICAgICAgICAgICAibnJfd2F2ZXMiID0gIk5yLiBvZiB3YXZlcyIpLCBnb2ZfbWFwID0gTkEpICU+JQ0KICBrYWJsZV9jbGFzc2ljXzIoaHRtbF9mb250ID0gIlRpbWVzIiwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRikgJT4lDQogICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIk11IiA9IDgsICJTaWdtYSIgPSA4KSkjJT4lDQogICAgI3NhdmVfa2FibGUoIi4vb3V0cHV0L2FwcGVuZGl4L21ldGFfcmVncmVzc2lvbl90YWJsZV9leGNsdWRpbmdfb3V0bGllci5odG1sIikNCiAgICANCmBgYA0KDQo=