The following scripts can be used to replicate the data-set for the preregistered Experiments 1 and 2 of Dederichs et al. (2025). It may also be obtained by downloading: Download conjoint_liss.Rda


1 Getting started

To copy the code, click the button in the upper right corner of the code-chunks.

1.1 Clean up

rm(list = ls())
gc()


1.2 General custom functions

  • fpackage.check: Check if packages are installed (and install if not) in R
  • fsave: Function to save data with time stamp in correct directory
  • fload: Function to load R-objects under new names
  • fshowdf: Print objects (tibble / data.frame) nicely on screen in .Rmd
fpackage.check <- function(packages) {
    lapply(packages, FUN = function(x) {
        if (!require(x, character.only = TRUE)) {
            install.packages(x, dependencies = TRUE)
            library(x, character.only = TRUE)
        }
    })
}

fsave <- function(x, file, location = "./data/processed/", ...) {
    if (!dir.exists(location))
        dir.create(location)
    datename <- substr(gsub("[:-]", "", Sys.time()), 1, 8)
    totalname <- paste(location, datename, file, sep = "")
    print(paste("SAVED: ", totalname, sep = ""))
    save(x, file = totalname)
}

fload <- function(fileName) {
    load(fileName)
    get(ls()[ls() != "fileName"])
}

fshowdf <- function(x, ...) {
    knitr::kable(x, digits = 2, "html", ...) %>%
        kableExtra::kable_styling(bootstrap_options = c("striped", "hover")) %>%
        kableExtra::scroll_box(width = "100%", height = "300px")
}


1.3 Necessary packages

  • tidyverse: data wrangling
  • haven: read and write various data formats
  • sjlabelled: work with labelled (SPSS) data
packages = c("tidyverse", "haven", "sjlabelled")
fpackage.check(packages)
rm(packages)



2 Download data files

Download the data files from the LISS data archive. Note that you must join the LISS community and create an account to access the downloads.

Download the data-files, unzip them if needed, and put them in the ./data/ folder. But first, make a ./data/ folder:

ifelse(!dir.exists("data"), dir.create("data"), FALSE)

3 Import data

Now import the downloaded data:

# Main data survey module
liss <- read_sav("./data/xs23a_EN_1.0p.sav")

# Background data september 2023
bckgrnd <- read_sav("./data/avars_202309_EN_1.0p.sav")

# Latest religion and ethnicity module (information about people's identification with different
# minority groups)
releth <- read_sav("./data/cr23p_EN_1.0p.sav")
releth_previousyear <- read_sav("./data/cr22o_EN_1.0p.sav")

# public data about composition of 'buurten'
comp <- fload("./data/public_composition_data.Rda")

4 Wrangling data

4.1 Observational data

bckgrnd <- bckgrnd %>% select(c('nomem_encr', 'herkomstgroep', 'geslacht', 'leeftijd', 'gebjaar', 'oplmet', 'sted'))

releth <- releth %>% 
  mutate(orig_tur = if_else(cr23p166==1 | cr23p167==1, 1, 0), #Turks and Kurds
         orig_mor = if_else(cr23p168==1 | cr23p169==1, 1, 0), #Moroccans and Berbers
         lang_tur = if_else(cr23p085==1 | cr23p090==6, 1, 0), #person spoke turkish growing up or speaks it now
         lang_mor = if_else(cr23p080==1 | cr23p081==1 | cr23p090 %in% c(1, 2), 1, 0),  #person spoke berber or arab growing up or speaks it now
         rel_isl = if_else(cr23p135==12 | cr23p144==10, 1, 0)) #person grew up with Islam or is currently feels they belong to Islam

releth <- releth %>% select(c('nomem_encr'), starts_with('orig_'), starts_with('lang_'), starts_with('rel_isl')) 

#Year previous to our survey (2022)
releth_previousyear <- releth_previousyear %>% 
  mutate(orig_tur_prev = if_else(cr22o166==1 | cr22o167==1, 1, 0), #Turks and Kurds
         orig_mor_prev = if_else(cr22o168==1 | cr22o169==1, 1, 0), #Moroccans and Berbers
         lang_tur_prev = if_else(cr22o085==1 | cr22o090==6, 1, 0), #person spoke turkish growing up or speaks it now
         lang_mor_prev = if_else(cr22o080==1 | cr22o081==1 | cr22o090 %in% c(1, 2), 1, 0),  #person spoke berber or arab growing up or speaks it now
         rel_isl_prev = if_else(cr22o143==10 | cr22o135==12, 1, 0)) #person grew up with Islam or is currently feels they belong to Islam
releth_previousyear <- releth_previousyear %>% select(c('nomem_encr'), starts_with('orig_'), starts_with('lang_'), starts_with('rel_isl')) 

liss <- merge(liss, bckgrnd, by='nomem_encr', all.x = TRUE, all.y = FALSE)
liss <- merge(liss, releth, by='nomem_encr', all.x = TRUE, all.y = FALSE)
liss <- merge(liss, releth_previousyear, by='nomem_encr', all.x = TRUE, all.y = FALSE)

liss <- liss %>%
  mutate(eth_dtm = case_when(herkomstgroep==0 & (lang_tur!=1 | is.na(lang_tur)) & (lang_mor!=1 | is.na(lang_mor)) & (orig_tur!=1 | is.na(orig_tur)) & (orig_mor!=1 | is.na(orig_mor)) & (rel_isl!=1 | is.na(rel_isl)) &
                               (lang_tur_prev!=1 | is.na(lang_tur_prev)) & (lang_mor_prev!=1 | is.na(lang_mor_prev)) & (orig_tur_prev!=1 | is.na(orig_tur_prev)) & (orig_mor_prev!=1 | is.na(orig_mor_prev)) & (rel_isl_prev!=1 | is.na(rel_isl_prev))~ 'Dutch',
                             (lang_tur==1 | lang_mor==1 | orig_tur==1 | orig_mor==1 |
                                lang_tur_prev==1 | lang_mor_prev==1 | orig_tur_prev==1 | orig_mor_prev==1) ~ 'Turkish/Moroccan'))

liss <- liss %>%
  mutate(eth_dwnw = case_when(herkomstgroep==0 ~ 'Dutch',
                              herkomstgroep %in% c(101, 201) ~ 'Western',
                              herkomstgroep %in% c(102, 202) ~ 'Non-Western'),
         eth_dnw = case_when(herkomstgroep==0 ~ 'Dutch',
                             herkomstgroep %in% c(102, 202) ~ 'Non-Western'),
         eth_tm = if_else(orig_tur==1 | orig_mor==1, 1, 0),
         eth_dtmwnw = case_when(eth_tm==1 ~ 'Turkish/Moroccan',
                                herkomstgroep==0 ~ 'Dutch',
                                herkomstgroep %in% c(102, 202) ~ 'Other Non-Western',
                                herkomstgroep %in% c(101, 201) ~ 'Western'),
         eth_dtmo = case_when(eth_tm==1 ~ 'Turkish/Moroccan',
                              herkomstgroep==0 ~ 'Dutch',
                              herkomstgroep %in% c(101, 102, 201, 202) ~ 'Other'))

#here, add the simplified "buurten" composition data
names(comp)[2] <- "ethnbh_obj_TM"
names(comp)[3] <- "hinbh_obj_Educ"
names(comp)[4] <- "agenbh_obj_Age"
liss <- merge(liss,comp, by="nomem_encr")

#create variables with intuitive names from raw data (in same order as codebook)
#prefix explanation: o = observational data, e = experimental data, civ = civic organization, nbh = neighborhood

liss <- liss %>%
  mutate(#CIVIC ORGANIZATIONS#
         #Variables indicating whether respondent WAS involved in each type of org during SIL model 2023: 
         ociv_inv_was_sport = xs23a003, 
         ociv_inv_was_culture = xs23a004,
         ociv_inv_was_union = xs23a005,
         ociv_inv_was_prof = xs23a006,
         ociv_inv_was_consum = xs23a007,
         ociv_inv_was_humanit = xs23a008,
         ociv_inv_was_migrant = xs23a009,
         ociv_inv_was_envmnt = xs23a010,
         ociv_inv_was_relig = xs23a011,
         ociv_inv_was_polit = xs23a012,
         ociv_inv_was_educ = xs23a013,
         ociv_inv_was_social = xs23a014,
         ociv_inv_was_other = xs23a015,
         #Variables indicating whether respondent IS currently involved in each type of org: 
         ociv_inv_is_sport = xs23a148, 
         ociv_inv_is_culture = xs23a149,
         ociv_inv_is_union = xs23a150,
         ociv_inv_is_prof = xs23a151,
         ociv_inv_is_consum = xs23a152,
         ociv_inv_is_humanit = xs23a153,
         ociv_inv_is_migrant = xs23a154,
         ociv_inv_is_envmnt = xs23a155,
         ociv_inv_is_relig = xs23a156,
         ociv_inv_is_polit = xs23a157,
         ociv_inv_is_educ = xs23a158,
         ociv_inv_is_social = xs23a159,
         ociv_inv_is_other = xs23a160,
         ociv_inv_is_none = xs23a161,
         #Information on most important organization:
         ociv_mostimp_type = case_when(xs23a035==1 ~ 'Sports',
                                       xs23a035==2 ~ 'Cultural',
                                       xs23a035==3 ~ 'Union',
                                       xs23a035==4 ~ 'Professional',
                                       xs23a035==5 ~ 'Consumer',
                                       xs23a035==6 ~ 'Humanitarian',
                                       xs23a035==7 ~ 'Migrants',
                                       xs23a035==8 ~ 'Environmental',
                                       xs23a035==9 ~ 'Religious',
                                       xs23a035==10 ~ 'Political',
                                       xs23a035==11 ~ 'Educational',
                                       xs23a035==12 ~ 'Social',
                                       xs23a035==13 ~ 'Other'),
         ociv_mostimp_type = factor(ociv_mostimp_type, levels = c('Sports', 'Cultural', 'Union', 'Professional', 'Consumer', 'Humanitarian', 'Migrants', 'Environmental', 'Religious', 'Political', 'Educational', 'Social', 'Other')),
         ociv_fincontr = xs23a164,
         ociv_freqpart = case_when(xs23a170==1 ~ 'Less than once per month', xs23a170==2 ~ '1-3 times per month', xs23a170==3 ~ 'Once per week', xs23a170==4 ~ 'More than once per week'),
         ociv_freqpart = factor(ociv_freqpart, levels = c('Less than once per month', '1-3 times per month', 'Once per week', 'More than once per week')),
         ociv_freqpart_num = case_when(xs23a170==1 ~ 0.5, xs23a170==2 ~ 2, xs23a170==3 ~ 4, xs23a170==4 ~ 8),
         ociv_size = case_when(xs23a171==1 ~ 'Less than 20', xs23a171==2 ~ '20-49', xs23a171==3 ~ '50-99', xs23a171==4 ~ '100-199', xs23a171==5 ~ '200-499', xs23a171==6 ~ '500+'),
         ociv_size = factor(ociv_size, levels = c('Less than 20', '20-49', '50-99', '100-199', '200-499', '500+')),
         ociv_size_num = case_when(xs23a171==1 ~ 10, xs23a171==2 ~ 34.5, xs23a171==3 ~ 74.5, xs23a171==4 ~ 149.5, xs23a171==5 ~ 349.5, xs23a171==6 ~ 500),
         
         ociv_nrcontact = case_when(xs23a172==1 ~ 'None', xs23a172==2 ~ '1-4', xs23a172==3 ~ '5-9', xs23a172==4 ~ '10-19', xs23a172==5 ~ '20-49', xs23a172==6 ~ '50+'), 
         ociv_nrcontact = factor(ociv_nrcontact, levels = c('None', '1-4', '5-9', '10-19', '20-49', '50+')),
         ociv_nrcontact_num = case_when(xs23a172==1 ~ 0, xs23a172==2 ~ 2.5, xs23a172==3 ~ 7, xs23a172==4 ~ 14.5, xs23a172==5 ~ 34, xs23a172==6 ~ 50), 
         ociv_satisf = xs23a173,
         
         #Composition of civic orgs and respondents' contact within them:
         ociv_comp_gnd = xs23a174, ociv_comp_age = xs23a175,
         ociv_comp_eth = xs23a176, ociv_comp_edu = xs23a177,
         ociv_cont_gnd = xs23a182, ociv_cont_age = xs23a183,
         ociv_cont_eth = xs23a184, ociv_cont_edu = xs23a185,
         ociv_comp_gnd_dk = xs23a178, ociv_comp_age_dk = xs23a179,
         ociv_comp_eth_dk = xs23a180, ociv_comp_edu_dk = xs23a181,
         ociv_cont_gnd_dk = xs23a186, ociv_cont_age_dk = xs23a187,
         ociv_cont_eth_dk = xs23a188, ociv_cont_edu_dk = xs23a189,
         
         #Number of contacts with certain socio-demographic characteristics:
         ociv_cont_nrfemales = ociv_nrcontact_num * ociv_cont_gnd * 0.01,
         ociv_cont_nrmales = ociv_nrcontact_num * (100-ociv_cont_gnd) * 0.01,
         ociv_cont_nrold = ociv_nrcontact_num * ociv_cont_age * 0.01,
         ociv_cont_nryoung = ociv_nrcontact_num * (100-ociv_cont_age) * 0.01, 
         ociv_cont_nrturmor = ociv_nrcontact_num * ociv_cont_eth * 0.01,
         ociv_cont_nrdutch = ociv_nrcontact_num * (100-ociv_cont_eth) * 0.01,
         ociv_cont_nrcollege = ociv_nrcontact_num * ociv_cont_edu * 0.01,
         ociv_cont_nrnocollege = ociv_nrcontact_num * (100-ociv_cont_edu) * 0.01,
         
         #NEIGHBORHOODS#
         onbh_rent = xs23a190,
         onbh_satisf = xs23a197,
         #Composition of neighborhoods and respondents' contact within them:
         onbh_comp_gnd = xs23a198, onbh_comp_age = xs23a199,
         onbh_comp_eth = xs23a200, onbh_comp_edu = xs23a201,
         onbh_cont_gnd = xs23a206, onbh_cont_age = xs23a207,
         onbh_cont_eth = xs23a208, onbh_cont_edu = xs23a209,
         onbh_comp_gnd_dk = xs23a202, onbh_comp_age_dk = xs23a203,
         onbh_comp_eth_dk = xs23a204, onbh_comp_edu_dk = xs23a205,
         onbh_cont_gnd_dk = xs23a210, onbh_cont_age_dk = xs23a211,
         onbh_cont_eth_dk = xs23a212, onbh_cont_edu_dk = xs23a213,
         #Number of contacts with certain socio-demographic characteristics:
         onbh_nrcontact = case_when(xs23a196==1 ~ 'None', xs23a196==2 ~ '1-4', xs23a196==3 ~ '5-9', xs23a196==4 ~ '10-19', xs23a196==5 ~ '20-49', xs23a196==6 ~ '50+'),

         onbh_nrcontact = factor(onbh_nrcontact, levels = c('None', '1-4', '5-9', '10-19', '20-49', '50+')),
         onbh_nrcontact_num = case_when(xs23a196==1 ~ 0, xs23a196==2 ~ 2.5, xs23a196==3 ~ 7, xs23a196==4 ~ 14.5, xs23a196==5 ~ 34, xs23a196==6 ~ 50),
         onbh_cont_nrfemales = onbh_nrcontact_num * onbh_cont_gnd * 0.01,
         onbh_cont_nrmales = onbh_nrcontact_num * (100-onbh_cont_gnd) * 0.01,
         onbh_cont_nrold = onbh_nrcontact_num * onbh_cont_age * 0.01,
         onbh_cont_nryoung = onbh_nrcontact_num * (100-onbh_cont_age) * 0.01, 
         onbh_cont_nrturmor = onbh_nrcontact_num * onbh_cont_eth * 0.01,
         onbh_cont_nrdutch = onbh_nrcontact_num * (100-onbh_cont_eth) * 0.01,
         onbh_cont_nrcollege = onbh_nrcontact_num * onbh_cont_edu * 0.01,
         onbh_cont_nrnocollege = onbh_nrcontact_num * (100-onbh_cont_edu) * 0.01,

         #Evaluation questions:
         ev_difficult = xs23a214,
         ev_clear = xs23a215,
         ev_thinking = xs23a216,
         ev_interestingtopic = xs23a217,
         ev_fun = xs23a218,
         
         #other information
         surv_start_date = xs23a219,
         surv_start_time = xs23a220,
         surv_end_date = xs23a221,
         surv_end_time = xs23a222,
         surv_duration = xs23a223,
         
         #Socio-demographic variables:
         sex3 = case_when(geslacht==1 ~ 'male', geslacht==2 ~ 'female', geslacht==3 ~ 'diverse'),
         sex = case_when(geslacht==1 ~ 'male', geslacht==2 ~ 'female'),
         age = case_when(leeftijd<50 ~ 'under 50', leeftijd>=50 ~ '50 or older'),
         age_continuous = leeftijd,
         birthyear = gebjaar,
         edu = case_when(oplmet %in% c(5, 6) ~ 'college degree', oplmet %in% c(1, 2, 3, 4, 8, 9) ~ 'no college degree'), #level 7 is NA (label 'other'),
         edu_unihbo = case_when(oplmet == 6 ~ 'research university', oplmet == 5 ~ 'university of applied sciences')

         )

liss <- liss %>%
  select(-starts_with(c('surv', 'ev', 'oplmet', 'geslacht', 'leeftijd', 'gebjaar', 'herkomstgroep')))

#Additional preparation: composition and contact across different dimensions and settings:
liss <- liss %>%
  mutate(ociv_comp_same_gnd = case_when(sex=='female' ~ ociv_comp_gnd, sex=='male' ~ 100-ociv_comp_gnd),
         ociv_comp_same_edu = case_when(edu=='college degree' ~ ociv_comp_edu, edu=='no college degree' ~ 100-ociv_comp_edu),
         ociv_comp_same_age = case_when(age=='50 or older' ~ ociv_comp_age, age=='under 50' ~ 100-ociv_comp_age),
         ociv_comp_same_eth = case_when(eth_dtm=='Turkish/Moroccan' ~ ociv_comp_eth, eth_dtm=='Dutch' ~ 100-ociv_comp_eth),
         ociv_comp_same_gnd_50 = case_when(ociv_comp_same_gnd>=50 ~ 1, ociv_comp_same_gnd<50 ~ 0),
         ociv_comp_same_edu_50 = case_when(ociv_comp_same_edu>=50 ~ 1, ociv_comp_same_edu<50 ~ 0),
         ociv_comp_same_age_50 = case_when(ociv_comp_same_age>=50 ~ 1, ociv_comp_same_age<50 ~ 0),
         ociv_comp_same_eth_50 = case_when(ociv_comp_same_eth>=50 ~ 1, ociv_comp_same_eth<50 ~ 0),
         ociv_comp_same_dimensions4_50 = ociv_comp_same_gnd_50 + ociv_comp_same_edu_50 + ociv_comp_same_age_50 + ociv_comp_same_eth_50,
         ociv_comp_same_dimensions3_50 = ociv_comp_same_gnd_50 + ociv_comp_same_edu_50 + ociv_comp_same_age_50,
         
         ociv_cont_same_gnd = case_when(sex=='female' ~ ociv_cont_gnd, sex=='male' ~ 100-ociv_cont_gnd),
         ociv_cont_same_edu = case_when(edu=='college degree' ~ ociv_cont_edu, edu=='no college degree' ~ 100-ociv_cont_edu),
         ociv_cont_same_age = case_when(age=='50 or older' ~ ociv_cont_age, age=='under 50' ~ 100-ociv_cont_age),
         ociv_cont_same_eth = case_when(eth_dtm=='Turkish/Moroccan' ~ ociv_cont_eth, eth_dtm=='Dutch' ~ 100-ociv_cont_eth),
         ociv_cont_same_gnd_50 = case_when(ociv_cont_same_gnd>=50 ~ 1, ociv_cont_same_gnd<50 ~ 0),
         ociv_cont_same_edu_50 = case_when(ociv_cont_same_edu>=50 ~ 1, ociv_cont_same_edu<50 ~ 0),
         ociv_cont_same_age_50 = case_when(ociv_cont_same_age>=50 ~ 1, ociv_cont_same_age<50 ~ 0),
         ociv_cont_same_eth_50 = case_when(ociv_cont_same_eth>=50 ~ 1, ociv_cont_same_eth<50 ~ 0),
         ociv_cont_same_dimensions4_50 = ociv_cont_same_gnd_50 + ociv_cont_same_edu_50 + ociv_cont_same_age_50 + ociv_cont_same_eth_50,
         ociv_cont_same_dimensions3_50 = ociv_cont_same_gnd_50 + ociv_cont_same_edu_50 + ociv_cont_same_age_50)

liss <- liss %>%
  mutate(onbh_comp_same_gnd = case_when(sex=='female' ~ onbh_comp_gnd, sex=='male' ~ 100-onbh_comp_gnd),
         onbh_comp_same_edu = case_when(edu=='college degree' ~ onbh_comp_edu, edu=='no college degree' ~ 100-onbh_comp_edu),
         onbh_comp_same_age = case_when(age=='50 or older' ~ onbh_comp_age, age=='under 50' ~ 100-onbh_comp_age),
         onbh_comp_same_eth = case_when(eth_dtm=='Turkish/Moroccan' ~ onbh_comp_eth, eth_dtm=='Dutch' ~ 100-onbh_comp_eth),
         onbh_comp_same_gnd_50 = case_when(onbh_comp_same_gnd>=50 ~ 1, onbh_comp_same_gnd<50 ~ 0),
         onbh_comp_same_edu_50 = case_when(onbh_comp_same_edu>=50 ~ 1, onbh_comp_same_edu<50 ~ 0),
         onbh_comp_same_age_50 = case_when(onbh_comp_same_age>=50 ~ 1, onbh_comp_same_age<50 ~ 0),
         onbh_comp_same_eth_50 = case_when(onbh_comp_same_eth>=50 ~ 1, onbh_comp_same_eth<50 ~ 0),
         onbh_comp_same_dimensions4_50 = onbh_comp_same_gnd_50 + onbh_comp_same_edu_50 + onbh_comp_same_age_50 + onbh_comp_same_eth_50,
         onbh_comp_same_dimensions3_50 = onbh_comp_same_gnd_50 + onbh_comp_same_edu_50 + onbh_comp_same_age_50,
         
         onbh_cont_same_gnd = case_when(sex=='female' ~ onbh_cont_gnd, sex=='male' ~ 100-onbh_cont_gnd),
         onbh_cont_same_edu = case_when(edu=='college degree' ~ onbh_cont_edu, edu=='no college degree' ~ 100-onbh_cont_edu),
         onbh_cont_same_age = case_when(age=='50 or older' ~ onbh_cont_age, age=='under 50' ~ 100-onbh_cont_age),
         onbh_cont_same_eth = case_when(eth_dtm=='Turkish/Moroccan' ~ onbh_cont_eth, eth_dtm=='Dutch' ~ 100-onbh_cont_eth),
         onbh_cont_same_gnd_50 = case_when(onbh_cont_same_gnd>=50 ~ 1, onbh_cont_same_gnd<50 ~ 0),
         onbh_cont_same_edu_50 = case_when(onbh_cont_same_edu>=50 ~ 1, onbh_cont_same_edu<50 ~ 0),
         onbh_cont_same_age_50 = case_when(onbh_cont_same_age>=50 ~ 1, onbh_cont_same_age<50 ~ 0),
         onbh_cont_same_eth_50 = case_when(onbh_cont_same_eth>=50 ~ 1, onbh_cont_same_eth<50 ~ 0),
         onbh_cont_same_dimensions4_50 = onbh_cont_same_gnd_50 + onbh_cont_same_edu_50 + onbh_cont_same_age_50 + onbh_cont_same_eth_50,
         onbh_cont_same_dimensions3_50 = onbh_cont_same_gnd_50 + onbh_cont_same_edu_50 + onbh_cont_same_age_50)

#store dataframe in df
df <- liss


4.2 Experimental data

#1. organization choice experiment
#2. neighborhood choice experiment

#to long format
#make respondent id 
df$id <- 1:nrow(df)

#each list element contains the choices for each set:
#thus, reistijd.list1[[3]][2] is the level of the travel time attribute of option 2 in choice-set 3 of the civ org experiment.

{
  reistijd.list1 <- list(
    c("xs23a036", "xs23a037"),
    c("xs23a050", "xs23a051"),
    c("xs23a064", "xs23a065"),
    c("xs23a078", "xs23a079")
  )
  
  kosten.list1 <- list(
    c("xs23a038", "xs23a039"),
    c("xs23a052", "xs23a053"),
    c("xs23a066", "xs23a067"),
    c("xs23a080", "xs23a081")
  )
  
  cohesie.list1 <- list(
    c("xs23a040", "xs23a041"),
    c("xs23a054", "xs23a055"),
    c("xs23a068", "xs23a069"),
    c("xs23a082", "xs23a083")
  )
  
  bekenden.list1 <- list(
    c("xs23a042", "xs23a043"),
    c("xs23a056", "xs23a057"),
    c("xs23a070", "xs23a071"),
    c("xs23a084", "xs23a085")
  )
  
  opleiding.list1  <- list(
    c("xs23a044", "xs23a045"),
    c("xs23a058", "xs23a059"),
    c("xs23a072", "xs23a073"),
    c("xs23a086", "xs23a087")
  )
  
  leeftijd.list1 <- list(
    c("xs23a046", "xs23a047"),
    c("xs23a060", "xs23a061"),
    c("xs23a074", "xs23a075"),
    c("xs23a088", "xs23a089")
  )
  
  migratie.list1 <- list(
    c("xs23a048", "xs23a049"),
    c("xs23a062", "xs23a063"),
    c("xs23a076", "xs23a077"),
    c("xs23a090", "xs23a091")
  )
  
  chosen1 <- c("xs23a165","xs23a166","xs23a167","xs23a168")

  
  reistijd.list2 <- list(
    c("xs23a092", "xs23a093"),
    c("xs23a106", "xs23a107"),
    c("xs23a120", "xs23a121"),
    c("xs23a134", "xs23a135")
  )
  
  kosten.list2 <- list(
    c("xs23a094", "xs23a095"),
    c("xs23a108", "xs23a109"),
    c("xs23a122", "xs23a123"),
    c("xs23a136", "xs23a137")
  )
  
  cohesie.list2 <- list(
    c("xs23a096", "xs23a097"),
    c("xs23a110", "xs23a111"),
    c("xs23a124", "xs23a125"),
    c("xs23a138", "xs23a139")
  )
  
  bekenden.list2 <- list(
    c("xs23a098", "xs23a099"),
    c("xs23a112", "xs23a113"),
    c("xs23a126", "xs23a127"),
    c("xs23a140", "xs23a141")
  )
  
  opleiding.list2  <- list(
    c("xs23a100", "xs23a101"),
    c("xs23a114", "xs23a115"),
    c("xs23a128", "xs23a129"),
    c("xs23a142", "xs23a143")
  )
  
  leeftijd.list2 <- list(
    c("xs23a102", "xs23a103"),
    c("xs23a116", "xs23a117"),
    c("xs23a130", "xs23a131"),
    c("xs23a144", "xs23a145")
  )
  
  migratie.list2 <- list(
    c("xs23a104", "xs23a105"),
    c("xs23a118", "xs23a119"),
    c("xs23a132", "xs23a133"),
    c("xs23a146", "xs23a147")
  )
  
  chosen2 <- c("xs23a191","xs23a192","xs23a193","xs23a194")
}

for (set in 1:4) {
  for (choice in 1:2) {
    data <- as.data.frame(df)
    
    #civ
    data$eciv_set <- set
    data$eciv_options <- choice
    data$eciv_time <- data[, names(data) == reistijd.list1[[set]][choice]]
    data$eciv_cost <- data[, names(data) == kosten.list1[[set]][choice]]
    data$eciv_cohesion <- data[, names(data) == cohesie.list1[[set]][choice]]
    data$eciv_acquaintances <- data[, names(data) == bekenden.list1[[set]][choice]]
    data$eciv_comp_educ <- data[, names(data) == opleiding.list1[[set]][choice]]
    data$eciv_comp_age <- data[, names(data) == leeftijd.list1[[set]][choice]]
    data$eciv_comp_eth <- data[, names(data) == migratie.list1[[set]][choice]]
    data$eciv_chosen <- data[, names(data) == chosen1[set]]
    
    #nbh
    data$enbh_set <- set
    data$enbh_options <- choice
    data$enbh_time <- data[, names(data) == reistijd.list2[[set]][choice]]
    data$enbh_cost <- data[, names(data) == kosten.list2[[set]][choice]]
    data$enbh_cohesion <- data[, names(data) == cohesie.list2[[set]][choice]]
    data$enbh_acquaintances <- data[, names(data) == bekenden.list2[[set]][choice]]
    data$enbh_comp_educ <- data[, names(data) == opleiding.list2[[set]][choice]]
    data$enbh_comp_age <- data[, names(data) == leeftijd.list2[[set]][choice]]
    data$enbh_comp_eth <- data[, names(data) == migratie.list2[[set]][choice]]
    data$enbh_chosen <- data[, names(data) == chosen2[set]]
    
    if(set == 1 & choice == 1) {
      df_long <- data
    } else {
      df_long <- rbind(df_long, data)
    }
  }
}

# reorder
df_long <- df_long[order(df_long$id, df_long$eciv_set, df_long$eciv_options, df_long$enbh_set, df_long$enbh_options), ]
row.names(df_long) <- 1:nrow(df_long)

# define the choices
df_long$eciv_choice <- (df_long$eciv_chosen == c(1, 2)[df_long$eciv_options])
df_long$enbh_choice <- (df_long$enbh_chosen == c(1, 2)[df_long$enbh_options])

# recode levels
df_long <- df_long %>% mutate(
  
  eciv_time = case_when(
    eciv_time == 1 ~ "travel time: 10 minutes",
    eciv_time == 2 ~ "travel time: 15 minutes",
    eciv_time == 3 ~ "travel time: 20 minutes"),
  
  enbh_time = case_when(
    enbh_time == 1 ~ "travel time to facilities: 10 minutes",
    enbh_time == 2 ~ "travel time to facilities: 15 minutes",
    enbh_time == 3 ~ "travel time to facilities: 20 minutes"),
  
  eciv_cost = case_when(
    eciv_cost == 1 ~ "costs: 70% of current contribution",
    eciv_cost == 2 ~ "costs: 90% of current contribution",
    eciv_cost == 3 ~ "costs: 100% of current contribution",
    eciv_cost == 4 ~ "costs: 110% of current contribution",
    eciv_cost == 5 ~ "costs: 130% of current contribution"),
  
  enbh_cost = case_when(
    enbh_cost == 1 ~ "costs: 90% of current housing expenses",
    enbh_cost == 2 ~ "costs: 95% of current housing expenses",
    enbh_cost == 3 ~ "costs: 100% of current housing expenses",
    enbh_cost == 4 ~ "costs: 105% of current housing expenses",
    enbh_cost == 5 ~ "costs: 110% of current housing expenses"),
  
  eciv_cohesion = case_when(
    eciv_cohesion == 1 ~ "cohesion: people know each other well",
    eciv_cohesion == 2 ~ "cohesion: some know each other well, others only by sight",
    eciv_cohesion == 3 ~ "cohesion: people know each other only by sight"),
  
  enbh_cohesion = case_when(
    enbh_cohesion == 1 ~ "cohesion: neighbors know each other well",
    enbh_cohesion == 2 ~ "cohesion: neighbors know each other only by sight",
    enbh_cohesion == 3 ~ "cohesion: some know each other well, others only by sight"),
  
  eciv_acquaintances = case_when(
    eciv_acquaintances == 1 ~ "acquaintances: no one",
    eciv_acquaintances == 2 ~ "acquaintances: one person",   
    eciv_acquaintances == 3 ~ "acquaintances: multiple"),
   
  enbh_acquaintances = case_when(
    enbh_acquaintances == 1 ~ "acquaintances: multiple",
    enbh_acquaintances == 2 ~ "acquaintances: one person",   
    enbh_acquaintances == 3 ~ "acquaintances: no one"),
  
  eciv_comp_educ = case_when(
    eciv_comp_educ == 1 ~ "education: a quarter (25%)",
    eciv_comp_educ == 2 ~ "education: half (50%)",
    eciv_comp_educ == 3 ~ "education: three quarters (75%)"),
    
  enbh_comp_educ = case_when(
    enbh_comp_educ == 1 ~ "education: a quarter (25%)",
    enbh_comp_educ == 2 ~ "education: half (50%)",
    enbh_comp_educ == 3 ~ "education: three quarters (75%)"),
  
  eciv_comp_age = case_when(
    eciv_comp_age == 1 ~ "age: a quarter (25%)",
    eciv_comp_age == 2 ~ "age: just under half (40%)",
    eciv_comp_age == 3 ~ "age: half (50%)"),
  
  enbh_comp_age = case_when(
    enbh_comp_age == 1 ~ "age: a quarter (25%)",
    enbh_comp_age == 2 ~ "age: just under half (40%)",
    enbh_comp_age == 3 ~ "age: half (50%)"),
  
  eciv_comp_eth = case_when(
    eciv_comp_eth == 1 ~ "migration: none (0%)",
    eciv_comp_eth == 2 ~ "migration: minority (10%)",
    eciv_comp_eth == 3 ~ "migration: a quarter (25%)"),
  
  enbh_comp_eth = case_when(
    enbh_comp_eth == 1 ~ "migration: none (0%)",
    enbh_comp_eth == 2 ~ "migration: minority (10%)",
    enbh_comp_eth == 3 ~ "migration: a quarter (25%)")
  )

#last, reorder attribute levels
{
  #civ
  df_long$eciv_time <- factor(df_long$eciv_time, levels = rev(c("travel time: 10 minutes", "travel time: 15 minutes", "travel time: 20 minutes")))
  df_long$eciv_cost <- factor(df_long$eciv_cost, levels = rev(c("costs: 70% of current contribution","costs: 90% of current contribution","costs: 100% of current contribution", "costs: 110% of current contribution","costs: 130% of current contribution")))
  df_long$eciv_cohesion <- factor(df_long$eciv_cohesion, levels = rev(c( "cohesion: people know each other well", "cohesion: some know each other well, others only by sight","cohesion: people know each other only by sight" )))
  df_long$eciv_acquaintances <- factor(df_long$eciv_acquaintances, levels = rev(c("acquaintances: no one", "acquaintances: one person", "acquaintances: multiple")))
  df_long$eciv_comp_educ <- factor(df_long$eciv_comp_educ, levels = rev(c("education: a quarter (25%)", "education: half (50%)","education: three quarters (75%)")))
  df_long$eciv_comp_age <- factor(df_long$eciv_comp_age, levels = rev(c("age: a quarter (25%)","age: just under half (40%)","age: half (50%)")))
  df_long$eciv_comp_eth <- factor(df_long$eciv_comp_eth, levels = rev(c("migration: none (0%)", "migration: minority (10%)", "migration: a quarter (25%)")))
  #nbh
  df_long$enbh_time <- factor(df_long$enbh_time, levels = rev(c("travel time to facilities: 10 minutes", "travel time to facilities: 15 minutes", "travel time to facilities: 20 minutes")))
  df_long$enbh_cost <- factor(df_long$enbh_cost, levels = rev(c("costs: 90% of current housing expenses","costs: 95% of current housing expenses","costs: 100% of current housing expenses", "costs: 105% of current housing expenses","costs: 110% of current housing expenses")))
  df_long$enbh_cohesion <- factor(df_long$enbh_cohesion, levels = rev(c( "cohesion: neighbors know each other well", "cohesion: some know each other well, others only by sight","cohesion: neighbors know each other only by sight" )))
  df_long$enbh_acquaintances <- factor(df_long$enbh_acquaintances, levels = rev(c("acquaintances: no one", "acquaintances: one person", "acquaintances: multiple")))
  df_long$enbh_comp_educ <- factor(df_long$enbh_comp_educ, levels = rev(c("education: a quarter (25%)", "education: half (50%)","education: three quarters (75%)")))
  df_long$enbh_comp_age <- factor(df_long$enbh_comp_age, levels = rev(c("age: a quarter (25%)","age: just under half (40%)","age: half (50%)")))
  df_long$enbh_comp_eth <- factor(df_long$enbh_comp_eth, levels = rev(c("migration: none (0%)", "migration: minority (10%)", "migration: a quarter (25%)")))
}

df_long <- df_long %>%
  select(
    everything(),
    # remove redundant columns,
    # retain only the repeated choice tasks needed for bias correction
    # and the block_order
    -which(startsWith(names(.), "xs") & !(names(.) %in% c("xs23a165", "xs23a169", "xs23a191", "xs23a195", "xs23a026")))
  ) %>%
  rename(
    first_org_choice = xs23a165,
    rep_org_choice = xs23a169,
    first_nbh_choice = xs23a191,
    rep_nbh_choice = xs23a195,
    block_order = xs23a026
  )

5 Save data

fsave(df_long, "conjoint_liss.Rda")

References

Dederichs, Kasimir, Rob Franken, Dingeman Wiertz, and Jochem Tolsma. 2025. Ingroup Preferences, Segregation, and Intergroup Contact in Neighborhoods and Civic Organizations.” PNAS Nexus.
LS0tDQp0aXRsZTogIkRhdGEgcHJlcGFyYXRpb24iDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiB0d2Vha3MuY3NzDQogICAgdG9jOiAgdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCmBgYHtyLCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpvcHRzX2NodW5rJHNldCh0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9MTAwKSx0aWR5PVRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLGNvbW1lbnQgPSAiIz4iLCBjYWNoZT1UUlVFLCBjbGFzcy5zb3VyY2U9YygidGVzdCIpLCBjbGFzcy5vdXRwdXQ9YygidGVzdDMiKSkNCm9wdGlvbnMod2lkdGggPSAxMDApDQpyZ2w6OnNldHVwS25pdHIoKQ0KDQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikge3NwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgeCkgfQ0KYGBgDQoNCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0Ka2xpcHB5OjprbGlwcHkocG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkNCiNrbGlwcHk6OmtsaXBweShjb2xvciA9ICdkYXJrcmVkJykNCiNrbGlwcHk6OmtsaXBweSh0b29sdGlwX21lc3NhZ2UgPSAnQ2xpY2sgdG8gY29weScsIHRvb2x0aXBfc3VjY2VzcyA9ICdEb25lJykNCmBgYA0KDQotLS0gIA0KDQpUaGUgZm9sbG93aW5nIHNjcmlwdHMgY2FuIGJlIHVzZWQgdG8gcmVwbGljYXRlIHRoZSBkYXRhLXNldCBmb3IgdGhlIFtwcmVyZWdpc3RlcmVkXShodHRwczovL29zZi5pby8zNmU4cS8pIEV4cGVyaW1lbnRzIDEgYW5kIDIgb2YgQGF1dGhvcnMyMDI1LiBJdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSBkb3dubG9hZGluZzogYHIgeGZ1bjo6ZW1iZWRfZmlsZSgiLi9kYXRhX3NoYXJlZC9jb25qb2ludF9saXNzLlJkYSIpYA0KDQotLS0gDQoNCiMgR2V0dGluZyBzdGFydGVkDQoNClRvIGNvcHkgdGhlIGNvZGUsIGNsaWNrIHRoZSBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZS1jaHVua3MuDQoNCiMjIENsZWFuIHVwDQoNCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30NCnJtKGxpc3Q9bHMoKSkNCmdjKCkNCmBgYA0KDQo8YnI+DQoNCiMjIEdlbmVyYWwgY3VzdG9tIGZ1bmN0aW9ucw0KDQotIGBmcGFja2FnZS5jaGVja2A6IENoZWNrIGlmIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQgKGFuZCBpbnN0YWxsIGlmIG5vdCkgaW4gUg0KLSBgZnNhdmVgOiBGdW5jdGlvbiB0byBzYXZlIGRhdGEgd2l0aCB0aW1lIHN0YW1wIGluIGNvcnJlY3QgZGlyZWN0b3J5DQotIGBmbG9hZGA6IEZ1bmN0aW9uIHRvIGxvYWQgUi1vYmplY3RzIHVuZGVyIG5ldyBuYW1lcw0KLSBgZnNob3dkZmA6IFByaW50IG9iamVjdHMgKGB0aWJibGVgIC8gYGRhdGEuZnJhbWVgKSBuaWNlbHkgb24gc2NyZWVuIGluIGAuUm1kYA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmZwYWNrYWdlLmNoZWNrIDwtIGZ1bmN0aW9uKHBhY2thZ2VzKSB7DQogICAgbGFwcGx5KHBhY2thZ2VzLCBGVU4gPSBmdW5jdGlvbih4KSB7DQogICAgICAgIGlmICghcmVxdWlyZSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpKSB7DQogICAgICAgICAgICBpbnN0YWxsLnBhY2thZ2VzKHgsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQogICAgICAgICAgICBsaWJyYXJ5KHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgICAgICAgfQ0KICAgIH0pDQp9DQoNCmZzYXZlIDwtIGZ1bmN0aW9uKHgsIGZpbGUsIGxvY2F0aW9uID0gIi4vZGF0YS9wcm9jZXNzZWQvIiwgLi4uKSB7DQogICAgaWYgKCFkaXIuZXhpc3RzKGxvY2F0aW9uKSkNCiAgICAgICAgZGlyLmNyZWF0ZShsb2NhdGlvbikNCiAgICBkYXRlbmFtZSA8LSBzdWJzdHIoZ3N1YigiWzotXSIsICIiLCBTeXMudGltZSgpKSwgMSwgOCkNCiAgICB0b3RhbG5hbWUgPC0gcGFzdGUobG9jYXRpb24sIGRhdGVuYW1lLCBmaWxlLCBzZXAgPSAiIikNCiAgICBwcmludChwYXN0ZSgiU0FWRUQ6ICIsIHRvdGFsbmFtZSwgc2VwID0gIiIpKQ0KICAgIHNhdmUoeCwgZmlsZSA9IHRvdGFsbmFtZSkNCn0NCg0KZmxvYWQgIDwtIGZ1bmN0aW9uKGZpbGVOYW1lKXsNCiAgbG9hZChmaWxlTmFtZSkNCiAgZ2V0KGxzKClbbHMoKSAhPSAiZmlsZU5hbWUiXSkNCn0NCg0KZnNob3dkZiA8LSBmdW5jdGlvbih4LCAuLi4pIHsNCiAgICBrbml0cjo6a2FibGUoeCwgZGlnaXRzID0gMiwgImh0bWwiLCAuLi4pICU+JQ0KICAgICAgICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6c2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjMwMHB4IikNCn0NCmBgYA0KDQo8YnI+DQoNCiMjIE5lY2Vzc2FyeSBwYWNrYWdlcw0KDQotIGB0aWR5dmVyc2VgOiBkYXRhIHdyYW5nbGluZw0KLSBgaGF2ZW5gOiByZWFkIGFuZCB3cml0ZSB2YXJpb3VzIGRhdGEgZm9ybWF0cw0KLSBgc2psYWJlbGxlZGA6IHdvcmsgd2l0aCBsYWJlbGxlZCAoU1BTUykgZGF0YQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCnBhY2thZ2VzID0gYygidGlkeXZlcnNlIiwgImhhdmVuIiwgInNqbGFiZWxsZWQiKQ0KZnBhY2thZ2UuY2hlY2socGFja2FnZXMpDQpybShwYWNrYWdlcykNCmBgYA0KDQo8YnI+DQoNCi0tLQ0KDQojIERvd25sb2FkIGRhdGEgZmlsZXMNCg0KRG93bmxvYWQgdGhlIGRhdGEgZmlsZXMgZnJvbSB0aGUgW0xJU1MgZGF0YSBhcmNoaXZlXShodHRwczovL3d3dy5kYXRhYXJjaGl2ZS5saXNzZGF0YS5ubC9zdHVkeS11bml0cy92aWV3LzEpLiBOb3RlIHRoYXQgeW91IG11c3Qgam9pbiB0aGUgTElTUyBjb21tdW5pdHkgYW5kIGNyZWF0ZSBhbiBhY2NvdW50IHRvIGFjY2VzcyB0aGUgZG93bmxvYWRzLg0KDQotIFRoZSBwcmltYXJ5IGRhdGEgb2YgdGhlIHN1cnZleSBtb2R1bGUgWyoqIlRoZSBCcmlkZ2luZyBQb3dlciBvZiBDaXZpYyBPcmdhbml6YXRpb25zIGFuZCBOZWlnaGJvcmhvb2RzIioqXShodHRwczovL3d3dy5kYXRhYXJjaGl2ZS5saXNzZGF0YS5ubC9ob3N0ZWQtZmlsZXMvZG93bmxvYWQvOTExNikuDQoNCi0gQmFja2dyb3VuZCBkYXRhIG9mIHRoZSBMSVNTIENvcmUgU3R1ZHk6DQogICsgQmFja2dyb3VuZCBWYXJpYWJsZXM6IFsqKlNlcHRlbWJlciAyMDIzKipdKGh0dHBzOi8vd3d3LmRhdGFhcmNoaXZlLmxpc3NkYXRhLm5sL2hvc3RlZC1maWxlcy9kb3dubG9hZC84MzkzKQ0KICArIFJlbGlnaW9uIGFuZCBFdGhuaWNpdHk6IFsqKldhdmUgMTUqKl0oaHR0cHM6Ly93d3cuZGF0YWFyY2hpdmUubGlzc2RhdGEubmwvaG9zdGVkLWZpbGVzL2Rvd25sb2FkLzc3NDcpIGFuZCBbKipXYXZlIDE2KipdKGh0dHBzOi8vd3d3LmRhdGFhcmNoaXZlLmxpc3NkYXRhLm5sL2hvc3RlZC1maWxlcy9kb3dubG9hZC84NDI0KS4NCiAgDQotIFdlIHVzZWQgb2JqZWN0aXZlIGRhdGEgYWJvdXQgdGhlIGNvbXBvc2l0aW9uIG9mIG5laWdoYm9yaG9vZHMsIHJldHJpZXZlZCBmcm9tIENCUy4gQWx0aG91Z2ggdGhlc2UgZGF0YSBhcmUgbm90IHB1YmxpY2x5IGF2YWlsYWJsZSwgb3VyIGNvbnN0cnVjdGVkIGRhdGEtc2V0IChpbmRpY2F0aW5nIHRoZSBsZXZlbHMgb2YgbmVpZ2hib3Job29kIGV4cG9zdXJlIHRvIGhpZ2gvbG93LWluY29tZSBob3VzZWhvbGRzLCB5b3VuZy9vbGQgaW5kaXZpZHVhbHMsIGFuZCByZXNpZGVudHMgd2l0aCBUdXJraXNoL01vcm9jY2FuIGJhY2tncm91bmRzOyBmb3Igc3BlY2lmaWMgc3ViZ3JvdXBzKSBjYW4gYmUgcmV0cmlldmVkIGJ5IGRvd25sb2FkaW5nOiAqKmByIHhmdW46OmVtYmVkX2ZpbGUoIi4vZGF0YV9zaGFyZWQvcHVibGljX2NvbXBvc2l0aW9uX2RhdGEuUmRhIilgKiouDQoNCkRvd25sb2FkIHRoZSBkYXRhLWZpbGVzLCB1bnppcCB0aGVtIGlmIG5lZWRlZCwgYW5kIHB1dCB0aGVtIGluIHRoZSBgLi9kYXRhL2AgZm9sZGVyLiBCdXQgZmlyc3QsIG1ha2UgYSBgLi9kYXRhL2AgZm9sZGVyOg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCmlmZWxzZSghZGlyLmV4aXN0cygiZGF0YSIpLCBkaXIuY3JlYXRlKCJkYXRhIiksIEZBTFNFKQ0KYGBgIA0KDQotLS0tIA0KDQojIEltcG9ydCBkYXRhDQoNCk5vdyBpbXBvcnQgdGhlIGRvd25sb2FkZWQgZGF0YToNCg0KYGBge3IsIGltcG9ydCwgZXZhbD1GQUxTRX0NCiNNYWluIGRhdGEgc3VydmV5IG1vZHVsZQ0KbGlzcyA8LSByZWFkX3NhdigiLi9kYXRhL3hzMjNhX0VOXzEuMHAuc2F2IikNCg0KI0JhY2tncm91bmQgZGF0YSBzZXB0ZW1iZXIgMjAyMw0KYmNrZ3JuZCA8LSByZWFkX3NhdigiLi9kYXRhL2F2YXJzXzIwMjMwOV9FTl8xLjBwLnNhdiIpDQoNCiNMYXRlc3QgcmVsaWdpb24gYW5kIGV0aG5pY2l0eSBtb2R1bGUgKGluZm9ybWF0aW9uIGFib3V0IHBlb3BsZSdzIGlkZW50aWZpY2F0aW9uIHdpdGggZGlmZmVyZW50IG1pbm9yaXR5IGdyb3VwcykNCnJlbGV0aCA8LSByZWFkX3NhdigiLi9kYXRhL2NyMjNwX0VOXzEuMHAuc2F2IikNCnJlbGV0aF9wcmV2aW91c3llYXIgPC0gcmVhZF9zYXYoIi4vZGF0YS9jcjIyb19FTl8xLjBwLnNhdiIpDQoNCiNwdWJsaWMgZGF0YSBhYm91dCBjb21wb3NpdGlvbiBvZiAiYnV1cnRlbiINCmNvbXAgPC0gZmxvYWQoIi4vZGF0YS9wdWJsaWNfY29tcG9zaXRpb25fZGF0YS5SZGEiKQ0KYGBgIA0KDQotLS0tDQoNCiMgV3JhbmdsaW5nIGRhdGENCg0KDQojIyBPYnNlcnZhdGlvbmFsIGRhdGENCg0KYGBge3IsIHdyYW5nbGluZywgZXZhbD1GQUxTRX0NCmJja2dybmQgPC0gYmNrZ3JuZCAlPiUgc2VsZWN0KGMoJ25vbWVtX2VuY3InLCAnaGVya29tc3Rncm9lcCcsICdnZXNsYWNodCcsICdsZWVmdGlqZCcsICdnZWJqYWFyJywgJ29wbG1ldCcsICdzdGVkJykpDQoNCnJlbGV0aCA8LSByZWxldGggJT4lIA0KICBtdXRhdGUob3JpZ190dXIgPSBpZl9lbHNlKGNyMjNwMTY2PT0xIHwgY3IyM3AxNjc9PTEsIDEsIDApLCAjVHVya3MgYW5kIEt1cmRzDQogICAgICAgICBvcmlnX21vciA9IGlmX2Vsc2UoY3IyM3AxNjg9PTEgfCBjcjIzcDE2OT09MSwgMSwgMCksICNNb3JvY2NhbnMgYW5kIEJlcmJlcnMNCiAgICAgICAgIGxhbmdfdHVyID0gaWZfZWxzZShjcjIzcDA4NT09MSB8IGNyMjNwMDkwPT02LCAxLCAwKSwgI3BlcnNvbiBzcG9rZSB0dXJraXNoIGdyb3dpbmcgdXAgb3Igc3BlYWtzIGl0IG5vdw0KICAgICAgICAgbGFuZ19tb3IgPSBpZl9lbHNlKGNyMjNwMDgwPT0xIHwgY3IyM3AwODE9PTEgfCBjcjIzcDA5MCAlaW4lIGMoMSwgMiksIDEsIDApLCAgI3BlcnNvbiBzcG9rZSBiZXJiZXIgb3IgYXJhYiBncm93aW5nIHVwIG9yIHNwZWFrcyBpdCBub3cNCiAgICAgICAgIHJlbF9pc2wgPSBpZl9lbHNlKGNyMjNwMTM1PT0xMiB8IGNyMjNwMTQ0PT0xMCwgMSwgMCkpICNwZXJzb24gZ3JldyB1cCB3aXRoIElzbGFtIG9yIGlzIGN1cnJlbnRseSBmZWVscyB0aGV5IGJlbG9uZyB0byBJc2xhbQ0KDQpyZWxldGggPC0gcmVsZXRoICU+JSBzZWxlY3QoYygnbm9tZW1fZW5jcicpLCBzdGFydHNfd2l0aCgnb3JpZ18nKSwgc3RhcnRzX3dpdGgoJ2xhbmdfJyksIHN0YXJ0c193aXRoKCdyZWxfaXNsJykpIA0KDQojWWVhciBwcmV2aW91cyB0byBvdXIgc3VydmV5ICgyMDIyKQ0KcmVsZXRoX3ByZXZpb3VzeWVhciA8LSByZWxldGhfcHJldmlvdXN5ZWFyICU+JSANCiAgbXV0YXRlKG9yaWdfdHVyX3ByZXYgPSBpZl9lbHNlKGNyMjJvMTY2PT0xIHwgY3IyMm8xNjc9PTEsIDEsIDApLCAjVHVya3MgYW5kIEt1cmRzDQogICAgICAgICBvcmlnX21vcl9wcmV2ID0gaWZfZWxzZShjcjIybzE2OD09MSB8IGNyMjJvMTY5PT0xLCAxLCAwKSwgI01vcm9jY2FucyBhbmQgQmVyYmVycw0KICAgICAgICAgbGFuZ190dXJfcHJldiA9IGlmX2Vsc2UoY3IyMm8wODU9PTEgfCBjcjIybzA5MD09NiwgMSwgMCksICNwZXJzb24gc3Bva2UgdHVya2lzaCBncm93aW5nIHVwIG9yIHNwZWFrcyBpdCBub3cNCiAgICAgICAgIGxhbmdfbW9yX3ByZXYgPSBpZl9lbHNlKGNyMjJvMDgwPT0xIHwgY3IyMm8wODE9PTEgfCBjcjIybzA5MCAlaW4lIGMoMSwgMiksIDEsIDApLCAgI3BlcnNvbiBzcG9rZSBiZXJiZXIgb3IgYXJhYiBncm93aW5nIHVwIG9yIHNwZWFrcyBpdCBub3cNCiAgICAgICAgIHJlbF9pc2xfcHJldiA9IGlmX2Vsc2UoY3IyMm8xNDM9PTEwIHwgY3IyMm8xMzU9PTEyLCAxLCAwKSkgI3BlcnNvbiBncmV3IHVwIHdpdGggSXNsYW0gb3IgaXMgY3VycmVudGx5IGZlZWxzIHRoZXkgYmVsb25nIHRvIElzbGFtDQpyZWxldGhfcHJldmlvdXN5ZWFyIDwtIHJlbGV0aF9wcmV2aW91c3llYXIgJT4lIHNlbGVjdChjKCdub21lbV9lbmNyJyksIHN0YXJ0c193aXRoKCdvcmlnXycpLCBzdGFydHNfd2l0aCgnbGFuZ18nKSwgc3RhcnRzX3dpdGgoJ3JlbF9pc2wnKSkgDQoNCmxpc3MgPC0gbWVyZ2UobGlzcywgYmNrZ3JuZCwgYnk9J25vbWVtX2VuY3InLCBhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpDQpsaXNzIDwtIG1lcmdlKGxpc3MsIHJlbGV0aCwgYnk9J25vbWVtX2VuY3InLCBhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpDQpsaXNzIDwtIG1lcmdlKGxpc3MsIHJlbGV0aF9wcmV2aW91c3llYXIsIGJ5PSdub21lbV9lbmNyJywgYWxsLnggPSBUUlVFLCBhbGwueSA9IEZBTFNFKQ0KDQpsaXNzIDwtIGxpc3MgJT4lDQogIG11dGF0ZShldGhfZHRtID0gY2FzZV93aGVuKGhlcmtvbXN0Z3JvZXA9PTAgJiAobGFuZ190dXIhPTEgfCBpcy5uYShsYW5nX3R1cikpICYgKGxhbmdfbW9yIT0xIHwgaXMubmEobGFuZ19tb3IpKSAmIChvcmlnX3R1ciE9MSB8IGlzLm5hKG9yaWdfdHVyKSkgJiAob3JpZ19tb3IhPTEgfCBpcy5uYShvcmlnX21vcikpICYgKHJlbF9pc2whPTEgfCBpcy5uYShyZWxfaXNsKSkgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW5nX3R1cl9wcmV2IT0xIHwgaXMubmEobGFuZ190dXJfcHJldikpICYgKGxhbmdfbW9yX3ByZXYhPTEgfCBpcy5uYShsYW5nX21vcl9wcmV2KSkgJiAob3JpZ190dXJfcHJldiE9MSB8IGlzLm5hKG9yaWdfdHVyX3ByZXYpKSAmIChvcmlnX21vcl9wcmV2IT0xIHwgaXMubmEob3JpZ19tb3JfcHJldikpICYgKHJlbF9pc2xfcHJldiE9MSB8IGlzLm5hKHJlbF9pc2xfcHJldikpfiAnRHV0Y2gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFuZ190dXI9PTEgfCBsYW5nX21vcj09MSB8IG9yaWdfdHVyPT0xIHwgb3JpZ19tb3I9PTEgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nX3R1cl9wcmV2PT0xIHwgbGFuZ19tb3JfcHJldj09MSB8IG9yaWdfdHVyX3ByZXY9PTEgfCBvcmlnX21vcl9wcmV2PT0xKSB+ICdUdXJraXNoL01vcm9jY2FuJykpDQoNCmxpc3MgPC0gbGlzcyAlPiUNCiAgbXV0YXRlKGV0aF9kd253ID0gY2FzZV93aGVuKGhlcmtvbXN0Z3JvZXA9PTAgfiAnRHV0Y2gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVya29tc3Rncm9lcCAlaW4lIGMoMTAxLCAyMDEpIH4gJ1dlc3Rlcm4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVya29tc3Rncm9lcCAlaW4lIGMoMTAyLCAyMDIpIH4gJ05vbi1XZXN0ZXJuJyksDQogICAgICAgICBldGhfZG53ID0gY2FzZV93aGVuKGhlcmtvbXN0Z3JvZXA9PTAgfiAnRHV0Y2gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJrb21zdGdyb2VwICVpbiUgYygxMDIsIDIwMikgfiAnTm9uLVdlc3Rlcm4nKSwNCiAgICAgICAgIGV0aF90bSA9IGlmX2Vsc2Uob3JpZ190dXI9PTEgfCBvcmlnX21vcj09MSwgMSwgMCksDQogICAgICAgICBldGhfZHRtd253ID0gY2FzZV93aGVuKGV0aF90bT09MSB+ICdUdXJraXNoL01vcm9jY2FuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVya29tc3Rncm9lcD09MCB+ICdEdXRjaCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmtvbXN0Z3JvZXAgJWluJSBjKDEwMiwgMjAyKSB+ICdPdGhlciBOb24tV2VzdGVybicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmtvbXN0Z3JvZXAgJWluJSBjKDEwMSwgMjAxKSB+ICdXZXN0ZXJuJyksDQogICAgICAgICBldGhfZHRtbyA9IGNhc2Vfd2hlbihldGhfdG09PTEgfiAnVHVya2lzaC9Nb3JvY2NhbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJrb21zdGdyb2VwPT0wIH4gJ0R1dGNoJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmtvbXN0Z3JvZXAgJWluJSBjKDEwMSwgMTAyLCAyMDEsIDIwMikgfiAnT3RoZXInKSkNCg0KI2hlcmUsIGFkZCB0aGUgc2ltcGxpZmllZCAiYnV1cnRlbiIgY29tcG9zaXRpb24gZGF0YQ0KbmFtZXMoY29tcClbMl0gPC0gImV0aG5iaF9vYmpfVE0iDQpuYW1lcyhjb21wKVszXSA8LSAiaGluYmhfb2JqX0VkdWMiDQpuYW1lcyhjb21wKVs0XSA8LSAiYWdlbmJoX29ial9BZ2UiDQpsaXNzIDwtIG1lcmdlKGxpc3MsY29tcCwgYnk9Im5vbWVtX2VuY3IiKQ0KDQojY3JlYXRlIHZhcmlhYmxlcyB3aXRoIGludHVpdGl2ZSBuYW1lcyBmcm9tIHJhdyBkYXRhIChpbiBzYW1lIG9yZGVyIGFzIGNvZGVib29rKQ0KI3ByZWZpeCBleHBsYW5hdGlvbjogbyA9IG9ic2VydmF0aW9uYWwgZGF0YSwgZSA9IGV4cGVyaW1lbnRhbCBkYXRhLCBjaXYgPSBjaXZpYyBvcmdhbml6YXRpb24sIG5iaCA9IG5laWdoYm9yaG9vZA0KDQpsaXNzIDwtIGxpc3MgJT4lDQogIG11dGF0ZSgjQ0lWSUMgT1JHQU5JWkFUSU9OUyMNCiAgICAgICAgICNWYXJpYWJsZXMgaW5kaWNhdGluZyB3aGV0aGVyIHJlc3BvbmRlbnQgV0FTIGludm9sdmVkIGluIGVhY2ggdHlwZSBvZiBvcmcgZHVyaW5nIFNJTCBtb2RlbCAyMDIzOiANCiAgICAgICAgIG9jaXZfaW52X3dhc19zcG9ydCA9IHhzMjNhMDAzLCANCiAgICAgICAgIG9jaXZfaW52X3dhc19jdWx0dXJlID0geHMyM2EwMDQsDQogICAgICAgICBvY2l2X2ludl93YXNfdW5pb24gPSB4czIzYTAwNSwNCiAgICAgICAgIG9jaXZfaW52X3dhc19wcm9mID0geHMyM2EwMDYsDQogICAgICAgICBvY2l2X2ludl93YXNfY29uc3VtID0geHMyM2EwMDcsDQogICAgICAgICBvY2l2X2ludl93YXNfaHVtYW5pdCA9IHhzMjNhMDA4LA0KICAgICAgICAgb2Npdl9pbnZfd2FzX21pZ3JhbnQgPSB4czIzYTAwOSwNCiAgICAgICAgIG9jaXZfaW52X3dhc19lbnZtbnQgPSB4czIzYTAxMCwNCiAgICAgICAgIG9jaXZfaW52X3dhc19yZWxpZyA9IHhzMjNhMDExLA0KICAgICAgICAgb2Npdl9pbnZfd2FzX3BvbGl0ID0geHMyM2EwMTIsDQogICAgICAgICBvY2l2X2ludl93YXNfZWR1YyA9IHhzMjNhMDEzLA0KICAgICAgICAgb2Npdl9pbnZfd2FzX3NvY2lhbCA9IHhzMjNhMDE0LA0KICAgICAgICAgb2Npdl9pbnZfd2FzX290aGVyID0geHMyM2EwMTUsDQogICAgICAgICAjVmFyaWFibGVzIGluZGljYXRpbmcgd2hldGhlciByZXNwb25kZW50IElTIGN1cnJlbnRseSBpbnZvbHZlZCBpbiBlYWNoIHR5cGUgb2Ygb3JnOiANCiAgICAgICAgIG9jaXZfaW52X2lzX3Nwb3J0ID0geHMyM2ExNDgsIA0KICAgICAgICAgb2Npdl9pbnZfaXNfY3VsdHVyZSA9IHhzMjNhMTQ5LA0KICAgICAgICAgb2Npdl9pbnZfaXNfdW5pb24gPSB4czIzYTE1MCwNCiAgICAgICAgIG9jaXZfaW52X2lzX3Byb2YgPSB4czIzYTE1MSwNCiAgICAgICAgIG9jaXZfaW52X2lzX2NvbnN1bSA9IHhzMjNhMTUyLA0KICAgICAgICAgb2Npdl9pbnZfaXNfaHVtYW5pdCA9IHhzMjNhMTUzLA0KICAgICAgICAgb2Npdl9pbnZfaXNfbWlncmFudCA9IHhzMjNhMTU0LA0KICAgICAgICAgb2Npdl9pbnZfaXNfZW52bW50ID0geHMyM2ExNTUsDQogICAgICAgICBvY2l2X2ludl9pc19yZWxpZyA9IHhzMjNhMTU2LA0KICAgICAgICAgb2Npdl9pbnZfaXNfcG9saXQgPSB4czIzYTE1NywNCiAgICAgICAgIG9jaXZfaW52X2lzX2VkdWMgPSB4czIzYTE1OCwNCiAgICAgICAgIG9jaXZfaW52X2lzX3NvY2lhbCA9IHhzMjNhMTU5LA0KICAgICAgICAgb2Npdl9pbnZfaXNfb3RoZXIgPSB4czIzYTE2MCwNCiAgICAgICAgIG9jaXZfaW52X2lzX25vbmUgPSB4czIzYTE2MSwNCiAgICAgICAgICNJbmZvcm1hdGlvbiBvbiBtb3N0IGltcG9ydGFudCBvcmdhbml6YXRpb246DQogICAgICAgICBvY2l2X21vc3RpbXBfdHlwZSA9IGNhc2Vfd2hlbih4czIzYTAzNT09MSB+ICdTcG9ydHMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHMyM2EwMzU9PTIgfiAnQ3VsdHVyYWwnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHMyM2EwMzU9PTMgfiAnVW5pb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHMyM2EwMzU9PTQgfiAnUHJvZmVzc2lvbmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzMjNhMDM1PT01IH4gJ0NvbnN1bWVyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzMjNhMDM1PT02IH4gJ0h1bWFuaXRhcmlhbicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czIzYTAzNT09NyB+ICdNaWdyYW50cycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czIzYTAzNT09OCB+ICdFbnZpcm9ubWVudGFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzMjNhMDM1PT05IH4gJ1JlbGlnaW91cycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czIzYTAzNT09MTAgfiAnUG9saXRpY2FsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzMjNhMDM1PT0xMSB+ICdFZHVjYXRpb25hbCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czIzYTAzNT09MTIgfiAnU29jaWFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzMjNhMDM1PT0xMyB+ICdPdGhlcicpLA0KICAgICAgICAgb2Npdl9tb3N0aW1wX3R5cGUgPSBmYWN0b3Iob2Npdl9tb3N0aW1wX3R5cGUsIGxldmVscyA9IGMoJ1Nwb3J0cycsICdDdWx0dXJhbCcsICdVbmlvbicsICdQcm9mZXNzaW9uYWwnLCAnQ29uc3VtZXInLCAnSHVtYW5pdGFyaWFuJywgJ01pZ3JhbnRzJywgJ0Vudmlyb25tZW50YWwnLCAnUmVsaWdpb3VzJywgJ1BvbGl0aWNhbCcsICdFZHVjYXRpb25hbCcsICdTb2NpYWwnLCAnT3RoZXInKSksDQogICAgICAgICBvY2l2X2ZpbmNvbnRyID0geHMyM2ExNjQsDQogICAgICAgICBvY2l2X2ZyZXFwYXJ0ID0gY2FzZV93aGVuKHhzMjNhMTcwPT0xIH4gJ0xlc3MgdGhhbiBvbmNlIHBlciBtb250aCcsIHhzMjNhMTcwPT0yIH4gJzEtMyB0aW1lcyBwZXIgbW9udGgnLCB4czIzYTE3MD09MyB+ICdPbmNlIHBlciB3ZWVrJywgeHMyM2ExNzA9PTQgfiAnTW9yZSB0aGFuIG9uY2UgcGVyIHdlZWsnKSwNCiAgICAgICAgIG9jaXZfZnJlcXBhcnQgPSBmYWN0b3Iob2Npdl9mcmVxcGFydCwgbGV2ZWxzID0gYygnTGVzcyB0aGFuIG9uY2UgcGVyIG1vbnRoJywgJzEtMyB0aW1lcyBwZXIgbW9udGgnLCAnT25jZSBwZXIgd2VlaycsICdNb3JlIHRoYW4gb25jZSBwZXIgd2VlaycpKSwNCiAgICAgICAgIG9jaXZfZnJlcXBhcnRfbnVtID0gY2FzZV93aGVuKHhzMjNhMTcwPT0xIH4gMC41LCB4czIzYTE3MD09MiB+IDIsIHhzMjNhMTcwPT0zIH4gNCwgeHMyM2ExNzA9PTQgfiA4KSwNCiAgICAgICAgIG9jaXZfc2l6ZSA9IGNhc2Vfd2hlbih4czIzYTE3MT09MSB+ICdMZXNzIHRoYW4gMjAnLCB4czIzYTE3MT09MiB+ICcyMC00OScsIHhzMjNhMTcxPT0zIH4gJzUwLTk5JywgeHMyM2ExNzE9PTQgfiAnMTAwLTE5OScsIHhzMjNhMTcxPT01IH4gJzIwMC00OTknLCB4czIzYTE3MT09NiB+ICc1MDArJyksDQogICAgICAgICBvY2l2X3NpemUgPSBmYWN0b3Iob2Npdl9zaXplLCBsZXZlbHMgPSBjKCdMZXNzIHRoYW4gMjAnLCAnMjAtNDknLCAnNTAtOTknLCAnMTAwLTE5OScsICcyMDAtNDk5JywgJzUwMCsnKSksDQogICAgICAgICBvY2l2X3NpemVfbnVtID0gY2FzZV93aGVuKHhzMjNhMTcxPT0xIH4gMTAsIHhzMjNhMTcxPT0yIH4gMzQuNSwgeHMyM2ExNzE9PTMgfiA3NC41LCB4czIzYTE3MT09NCB+IDE0OS41LCB4czIzYTE3MT09NSB+IDM0OS41LCB4czIzYTE3MT09NiB+IDUwMCksDQogICAgICAgICANCiAgICAgICAgIG9jaXZfbnJjb250YWN0ID0gY2FzZV93aGVuKHhzMjNhMTcyPT0xIH4gJ05vbmUnLCB4czIzYTE3Mj09MiB+ICcxLTQnLCB4czIzYTE3Mj09MyB+ICc1LTknLCB4czIzYTE3Mj09NCB+ICcxMC0xOScsIHhzMjNhMTcyPT01IH4gJzIwLTQ5JywgeHMyM2ExNzI9PTYgfiAnNTArJyksIA0KICAgICAgICAgb2Npdl9ucmNvbnRhY3QgPSBmYWN0b3Iob2Npdl9ucmNvbnRhY3QsIGxldmVscyA9IGMoJ05vbmUnLCAnMS00JywgJzUtOScsICcxMC0xOScsICcyMC00OScsICc1MCsnKSksDQogICAgICAgICBvY2l2X25yY29udGFjdF9udW0gPSBjYXNlX3doZW4oeHMyM2ExNzI9PTEgfiAwLCB4czIzYTE3Mj09MiB+IDIuNSwgeHMyM2ExNzI9PTMgfiA3LCB4czIzYTE3Mj09NCB+IDE0LjUsIHhzMjNhMTcyPT01IH4gMzQsIHhzMjNhMTcyPT02IH4gNTApLCANCiAgICAgICAgIG9jaXZfc2F0aXNmID0geHMyM2ExNzMsDQogICAgICAgICANCiAgICAgICAgICNDb21wb3NpdGlvbiBvZiBjaXZpYyBvcmdzIGFuZCByZXNwb25kZW50cycgY29udGFjdCB3aXRoaW4gdGhlbToNCiAgICAgICAgIG9jaXZfY29tcF9nbmQgPSB4czIzYTE3NCwgb2Npdl9jb21wX2FnZSA9IHhzMjNhMTc1LA0KICAgICAgICAgb2Npdl9jb21wX2V0aCA9IHhzMjNhMTc2LCBvY2l2X2NvbXBfZWR1ID0geHMyM2ExNzcsDQogICAgICAgICBvY2l2X2NvbnRfZ25kID0geHMyM2ExODIsIG9jaXZfY29udF9hZ2UgPSB4czIzYTE4MywNCiAgICAgICAgIG9jaXZfY29udF9ldGggPSB4czIzYTE4NCwgb2Npdl9jb250X2VkdSA9IHhzMjNhMTg1LA0KICAgICAgICAgb2Npdl9jb21wX2duZF9kayA9IHhzMjNhMTc4LCBvY2l2X2NvbXBfYWdlX2RrID0geHMyM2ExNzksDQogICAgICAgICBvY2l2X2NvbXBfZXRoX2RrID0geHMyM2ExODAsIG9jaXZfY29tcF9lZHVfZGsgPSB4czIzYTE4MSwNCiAgICAgICAgIG9jaXZfY29udF9nbmRfZGsgPSB4czIzYTE4Niwgb2Npdl9jb250X2FnZV9kayA9IHhzMjNhMTg3LA0KICAgICAgICAgb2Npdl9jb250X2V0aF9kayA9IHhzMjNhMTg4LCBvY2l2X2NvbnRfZWR1X2RrID0geHMyM2ExODksDQogICAgICAgICANCiAgICAgICAgICNOdW1iZXIgb2YgY29udGFjdHMgd2l0aCBjZXJ0YWluIHNvY2lvLWRlbW9ncmFwaGljIGNoYXJhY3RlcmlzdGljczoNCiAgICAgICAgIG9jaXZfY29udF9ucmZlbWFsZXMgPSBvY2l2X25yY29udGFjdF9udW0gKiBvY2l2X2NvbnRfZ25kICogMC4wMSwNCiAgICAgICAgIG9jaXZfY29udF9ucm1hbGVzID0gb2Npdl9ucmNvbnRhY3RfbnVtICogKDEwMC1vY2l2X2NvbnRfZ25kKSAqIDAuMDEsDQogICAgICAgICBvY2l2X2NvbnRfbnJvbGQgPSBvY2l2X25yY29udGFjdF9udW0gKiBvY2l2X2NvbnRfYWdlICogMC4wMSwNCiAgICAgICAgIG9jaXZfY29udF9ucnlvdW5nID0gb2Npdl9ucmNvbnRhY3RfbnVtICogKDEwMC1vY2l2X2NvbnRfYWdlKSAqIDAuMDEsIA0KICAgICAgICAgb2Npdl9jb250X25ydHVybW9yID0gb2Npdl9ucmNvbnRhY3RfbnVtICogb2Npdl9jb250X2V0aCAqIDAuMDEsDQogICAgICAgICBvY2l2X2NvbnRfbnJkdXRjaCA9IG9jaXZfbnJjb250YWN0X251bSAqICgxMDAtb2Npdl9jb250X2V0aCkgKiAwLjAxLA0KICAgICAgICAgb2Npdl9jb250X25yY29sbGVnZSA9IG9jaXZfbnJjb250YWN0X251bSAqIG9jaXZfY29udF9lZHUgKiAwLjAxLA0KICAgICAgICAgb2Npdl9jb250X25ybm9jb2xsZWdlID0gb2Npdl9ucmNvbnRhY3RfbnVtICogKDEwMC1vY2l2X2NvbnRfZWR1KSAqIDAuMDEsDQogICAgICAgICANCiAgICAgICAgICNORUlHSEJPUkhPT0RTIw0KICAgICAgICAgb25iaF9yZW50ID0geHMyM2ExOTAsDQogICAgICAgICBvbmJoX3NhdGlzZiA9IHhzMjNhMTk3LA0KICAgICAgICAgI0NvbXBvc2l0aW9uIG9mIG5laWdoYm9yaG9vZHMgYW5kIHJlc3BvbmRlbnRzJyBjb250YWN0IHdpdGhpbiB0aGVtOg0KICAgICAgICAgb25iaF9jb21wX2duZCA9IHhzMjNhMTk4LCBvbmJoX2NvbXBfYWdlID0geHMyM2ExOTksDQogICAgICAgICBvbmJoX2NvbXBfZXRoID0geHMyM2EyMDAsIG9uYmhfY29tcF9lZHUgPSB4czIzYTIwMSwNCiAgICAgICAgIG9uYmhfY29udF9nbmQgPSB4czIzYTIwNiwgb25iaF9jb250X2FnZSA9IHhzMjNhMjA3LA0KICAgICAgICAgb25iaF9jb250X2V0aCA9IHhzMjNhMjA4LCBvbmJoX2NvbnRfZWR1ID0geHMyM2EyMDksDQogICAgICAgICBvbmJoX2NvbXBfZ25kX2RrID0geHMyM2EyMDIsIG9uYmhfY29tcF9hZ2VfZGsgPSB4czIzYTIwMywNCiAgICAgICAgIG9uYmhfY29tcF9ldGhfZGsgPSB4czIzYTIwNCwgb25iaF9jb21wX2VkdV9kayA9IHhzMjNhMjA1LA0KICAgICAgICAgb25iaF9jb250X2duZF9kayA9IHhzMjNhMjEwLCBvbmJoX2NvbnRfYWdlX2RrID0geHMyM2EyMTEsDQogICAgICAgICBvbmJoX2NvbnRfZXRoX2RrID0geHMyM2EyMTIsIG9uYmhfY29udF9lZHVfZGsgPSB4czIzYTIxMywNCiAgICAgICAgICNOdW1iZXIgb2YgY29udGFjdHMgd2l0aCBjZXJ0YWluIHNvY2lvLWRlbW9ncmFwaGljIGNoYXJhY3RlcmlzdGljczoNCiAgICAgICAgIG9uYmhfbnJjb250YWN0ID0gY2FzZV93aGVuKHhzMjNhMTk2PT0xIH4gJ05vbmUnLCB4czIzYTE5Nj09MiB+ICcxLTQnLCB4czIzYTE5Nj09MyB+ICc1LTknLCB4czIzYTE5Nj09NCB+ICcxMC0xOScsIHhzMjNhMTk2PT01IH4gJzIwLTQ5JywgeHMyM2ExOTY9PTYgfiAnNTArJyksDQoNCiAgICAgICAgIG9uYmhfbnJjb250YWN0ID0gZmFjdG9yKG9uYmhfbnJjb250YWN0LCBsZXZlbHMgPSBjKCdOb25lJywgJzEtNCcsICc1LTknLCAnMTAtMTknLCAnMjAtNDknLCAnNTArJykpLA0KICAgICAgICAgb25iaF9ucmNvbnRhY3RfbnVtID0gY2FzZV93aGVuKHhzMjNhMTk2PT0xIH4gMCwgeHMyM2ExOTY9PTIgfiAyLjUsIHhzMjNhMTk2PT0zIH4gNywgeHMyM2ExOTY9PTQgfiAxNC41LCB4czIzYTE5Nj09NSB+IDM0LCB4czIzYTE5Nj09NiB+IDUwKSwNCiAgICAgICAgIG9uYmhfY29udF9ucmZlbWFsZXMgPSBvbmJoX25yY29udGFjdF9udW0gKiBvbmJoX2NvbnRfZ25kICogMC4wMSwNCiAgICAgICAgIG9uYmhfY29udF9ucm1hbGVzID0gb25iaF9ucmNvbnRhY3RfbnVtICogKDEwMC1vbmJoX2NvbnRfZ25kKSAqIDAuMDEsDQogICAgICAgICBvbmJoX2NvbnRfbnJvbGQgPSBvbmJoX25yY29udGFjdF9udW0gKiBvbmJoX2NvbnRfYWdlICogMC4wMSwNCiAgICAgICAgIG9uYmhfY29udF9ucnlvdW5nID0gb25iaF9ucmNvbnRhY3RfbnVtICogKDEwMC1vbmJoX2NvbnRfYWdlKSAqIDAuMDEsIA0KICAgICAgICAgb25iaF9jb250X25ydHVybW9yID0gb25iaF9ucmNvbnRhY3RfbnVtICogb25iaF9jb250X2V0aCAqIDAuMDEsDQogICAgICAgICBvbmJoX2NvbnRfbnJkdXRjaCA9IG9uYmhfbnJjb250YWN0X251bSAqICgxMDAtb25iaF9jb250X2V0aCkgKiAwLjAxLA0KICAgICAgICAgb25iaF9jb250X25yY29sbGVnZSA9IG9uYmhfbnJjb250YWN0X251bSAqIG9uYmhfY29udF9lZHUgKiAwLjAxLA0KICAgICAgICAgb25iaF9jb250X25ybm9jb2xsZWdlID0gb25iaF9ucmNvbnRhY3RfbnVtICogKDEwMC1vbmJoX2NvbnRfZWR1KSAqIDAuMDEsDQoNCiAgICAgICAgICNFdmFsdWF0aW9uIHF1ZXN0aW9uczoNCiAgICAgICAgIGV2X2RpZmZpY3VsdCA9IHhzMjNhMjE0LA0KICAgICAgICAgZXZfY2xlYXIgPSB4czIzYTIxNSwNCiAgICAgICAgIGV2X3RoaW5raW5nID0geHMyM2EyMTYsDQogICAgICAgICBldl9pbnRlcmVzdGluZ3RvcGljID0geHMyM2EyMTcsDQogICAgICAgICBldl9mdW4gPSB4czIzYTIxOCwNCiAgICAgICAgIA0KICAgICAgICAgI290aGVyIGluZm9ybWF0aW9uDQogICAgICAgICBzdXJ2X3N0YXJ0X2RhdGUgPSB4czIzYTIxOSwNCiAgICAgICAgIHN1cnZfc3RhcnRfdGltZSA9IHhzMjNhMjIwLA0KICAgICAgICAgc3Vydl9lbmRfZGF0ZSA9IHhzMjNhMjIxLA0KICAgICAgICAgc3Vydl9lbmRfdGltZSA9IHhzMjNhMjIyLA0KICAgICAgICAgc3Vydl9kdXJhdGlvbiA9IHhzMjNhMjIzLA0KICAgICAgICAgDQogICAgICAgICAjU29jaW8tZGVtb2dyYXBoaWMgdmFyaWFibGVzOg0KICAgICAgICAgc2V4MyA9IGNhc2Vfd2hlbihnZXNsYWNodD09MSB+ICdtYWxlJywgZ2VzbGFjaHQ9PTIgfiAnZmVtYWxlJywgZ2VzbGFjaHQ9PTMgfiAnZGl2ZXJzZScpLA0KICAgICAgICAgc2V4ID0gY2FzZV93aGVuKGdlc2xhY2h0PT0xIH4gJ21hbGUnLCBnZXNsYWNodD09MiB+ICdmZW1hbGUnKSwNCiAgICAgICAgIGFnZSA9IGNhc2Vfd2hlbihsZWVmdGlqZDw1MCB+ICd1bmRlciA1MCcsIGxlZWZ0aWpkPj01MCB+ICc1MCBvciBvbGRlcicpLA0KICAgICAgICAgYWdlX2NvbnRpbnVvdXMgPSBsZWVmdGlqZCwNCiAgICAgICAgIGJpcnRoeWVhciA9IGdlYmphYXIsDQogICAgICAgICBlZHUgPSBjYXNlX3doZW4ob3BsbWV0ICVpbiUgYyg1LCA2KSB+ICdjb2xsZWdlIGRlZ3JlZScsIG9wbG1ldCAlaW4lIGMoMSwgMiwgMywgNCwgOCwgOSkgfiAnbm8gY29sbGVnZSBkZWdyZWUnKSwgI2xldmVsIDcgaXMgTkEgKGxhYmVsICdvdGhlcicpLA0KICAgICAgICAgZWR1X3VuaWhibyA9IGNhc2Vfd2hlbihvcGxtZXQgPT0gNiB+ICdyZXNlYXJjaCB1bml2ZXJzaXR5Jywgb3BsbWV0ID09IDUgfiAndW5pdmVyc2l0eSBvZiBhcHBsaWVkIHNjaWVuY2VzJykNCg0KICAgICAgICAgKQ0KDQpsaXNzIDwtIGxpc3MgJT4lDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoYygnc3VydicsICdldicsICdvcGxtZXQnLCAnZ2VzbGFjaHQnLCAnbGVlZnRpamQnLCAnZ2ViamFhcicsICdoZXJrb21zdGdyb2VwJykpKQ0KDQojQWRkaXRpb25hbCBwcmVwYXJhdGlvbjogY29tcG9zaXRpb24gYW5kIGNvbnRhY3QgYWNyb3NzIGRpZmZlcmVudCBkaW1lbnNpb25zIGFuZCBzZXR0aW5nczoNCmxpc3MgPC0gbGlzcyAlPiUNCiAgbXV0YXRlKG9jaXZfY29tcF9zYW1lX2duZCA9IGNhc2Vfd2hlbihzZXg9PSdmZW1hbGUnIH4gb2Npdl9jb21wX2duZCwgc2V4PT0nbWFsZScgfiAxMDAtb2Npdl9jb21wX2duZCksDQogICAgICAgICBvY2l2X2NvbXBfc2FtZV9lZHUgPSBjYXNlX3doZW4oZWR1PT0nY29sbGVnZSBkZWdyZWUnIH4gb2Npdl9jb21wX2VkdSwgZWR1PT0nbm8gY29sbGVnZSBkZWdyZWUnIH4gMTAwLW9jaXZfY29tcF9lZHUpLA0KICAgICAgICAgb2Npdl9jb21wX3NhbWVfYWdlID0gY2FzZV93aGVuKGFnZT09JzUwIG9yIG9sZGVyJyB+IG9jaXZfY29tcF9hZ2UsIGFnZT09J3VuZGVyIDUwJyB+IDEwMC1vY2l2X2NvbXBfYWdlKSwNCiAgICAgICAgIG9jaXZfY29tcF9zYW1lX2V0aCA9IGNhc2Vfd2hlbihldGhfZHRtPT0nVHVya2lzaC9Nb3JvY2NhbicgfiBvY2l2X2NvbXBfZXRoLCBldGhfZHRtPT0nRHV0Y2gnIH4gMTAwLW9jaXZfY29tcF9ldGgpLA0KICAgICAgICAgb2Npdl9jb21wX3NhbWVfZ25kXzUwID0gY2FzZV93aGVuKG9jaXZfY29tcF9zYW1lX2duZD49NTAgfiAxLCBvY2l2X2NvbXBfc2FtZV9nbmQ8NTAgfiAwKSwNCiAgICAgICAgIG9jaXZfY29tcF9zYW1lX2VkdV81MCA9IGNhc2Vfd2hlbihvY2l2X2NvbXBfc2FtZV9lZHU+PTUwIH4gMSwgb2Npdl9jb21wX3NhbWVfZWR1PDUwIH4gMCksDQogICAgICAgICBvY2l2X2NvbXBfc2FtZV9hZ2VfNTAgPSBjYXNlX3doZW4ob2Npdl9jb21wX3NhbWVfYWdlPj01MCB+IDEsIG9jaXZfY29tcF9zYW1lX2FnZTw1MCB+IDApLA0KICAgICAgICAgb2Npdl9jb21wX3NhbWVfZXRoXzUwID0gY2FzZV93aGVuKG9jaXZfY29tcF9zYW1lX2V0aD49NTAgfiAxLCBvY2l2X2NvbXBfc2FtZV9ldGg8NTAgfiAwKSwNCiAgICAgICAgIG9jaXZfY29tcF9zYW1lX2RpbWVuc2lvbnM0XzUwID0gb2Npdl9jb21wX3NhbWVfZ25kXzUwICsgb2Npdl9jb21wX3NhbWVfZWR1XzUwICsgb2Npdl9jb21wX3NhbWVfYWdlXzUwICsgb2Npdl9jb21wX3NhbWVfZXRoXzUwLA0KICAgICAgICAgb2Npdl9jb21wX3NhbWVfZGltZW5zaW9uczNfNTAgPSBvY2l2X2NvbXBfc2FtZV9nbmRfNTAgKyBvY2l2X2NvbXBfc2FtZV9lZHVfNTAgKyBvY2l2X2NvbXBfc2FtZV9hZ2VfNTAsDQogICAgICAgICANCiAgICAgICAgIG9jaXZfY29udF9zYW1lX2duZCA9IGNhc2Vfd2hlbihzZXg9PSdmZW1hbGUnIH4gb2Npdl9jb250X2duZCwgc2V4PT0nbWFsZScgfiAxMDAtb2Npdl9jb250X2duZCksDQogICAgICAgICBvY2l2X2NvbnRfc2FtZV9lZHUgPSBjYXNlX3doZW4oZWR1PT0nY29sbGVnZSBkZWdyZWUnIH4gb2Npdl9jb250X2VkdSwgZWR1PT0nbm8gY29sbGVnZSBkZWdyZWUnIH4gMTAwLW9jaXZfY29udF9lZHUpLA0KICAgICAgICAgb2Npdl9jb250X3NhbWVfYWdlID0gY2FzZV93aGVuKGFnZT09JzUwIG9yIG9sZGVyJyB+IG9jaXZfY29udF9hZ2UsIGFnZT09J3VuZGVyIDUwJyB+IDEwMC1vY2l2X2NvbnRfYWdlKSwNCiAgICAgICAgIG9jaXZfY29udF9zYW1lX2V0aCA9IGNhc2Vfd2hlbihldGhfZHRtPT0nVHVya2lzaC9Nb3JvY2NhbicgfiBvY2l2X2NvbnRfZXRoLCBldGhfZHRtPT0nRHV0Y2gnIH4gMTAwLW9jaXZfY29udF9ldGgpLA0KICAgICAgICAgb2Npdl9jb250X3NhbWVfZ25kXzUwID0gY2FzZV93aGVuKG9jaXZfY29udF9zYW1lX2duZD49NTAgfiAxLCBvY2l2X2NvbnRfc2FtZV9nbmQ8NTAgfiAwKSwNCiAgICAgICAgIG9jaXZfY29udF9zYW1lX2VkdV81MCA9IGNhc2Vfd2hlbihvY2l2X2NvbnRfc2FtZV9lZHU+PTUwIH4gMSwgb2Npdl9jb250X3NhbWVfZWR1PDUwIH4gMCksDQogICAgICAgICBvY2l2X2NvbnRfc2FtZV9hZ2VfNTAgPSBjYXNlX3doZW4ob2Npdl9jb250X3NhbWVfYWdlPj01MCB+IDEsIG9jaXZfY29udF9zYW1lX2FnZTw1MCB+IDApLA0KICAgICAgICAgb2Npdl9jb250X3NhbWVfZXRoXzUwID0gY2FzZV93aGVuKG9jaXZfY29udF9zYW1lX2V0aD49NTAgfiAxLCBvY2l2X2NvbnRfc2FtZV9ldGg8NTAgfiAwKSwNCiAgICAgICAgIG9jaXZfY29udF9zYW1lX2RpbWVuc2lvbnM0XzUwID0gb2Npdl9jb250X3NhbWVfZ25kXzUwICsgb2Npdl9jb250X3NhbWVfZWR1XzUwICsgb2Npdl9jb250X3NhbWVfYWdlXzUwICsgb2Npdl9jb250X3NhbWVfZXRoXzUwLA0KICAgICAgICAgb2Npdl9jb250X3NhbWVfZGltZW5zaW9uczNfNTAgPSBvY2l2X2NvbnRfc2FtZV9nbmRfNTAgKyBvY2l2X2NvbnRfc2FtZV9lZHVfNTAgKyBvY2l2X2NvbnRfc2FtZV9hZ2VfNTApDQoNCmxpc3MgPC0gbGlzcyAlPiUNCiAgbXV0YXRlKG9uYmhfY29tcF9zYW1lX2duZCA9IGNhc2Vfd2hlbihzZXg9PSdmZW1hbGUnIH4gb25iaF9jb21wX2duZCwgc2V4PT0nbWFsZScgfiAxMDAtb25iaF9jb21wX2duZCksDQogICAgICAgICBvbmJoX2NvbXBfc2FtZV9lZHUgPSBjYXNlX3doZW4oZWR1PT0nY29sbGVnZSBkZWdyZWUnIH4gb25iaF9jb21wX2VkdSwgZWR1PT0nbm8gY29sbGVnZSBkZWdyZWUnIH4gMTAwLW9uYmhfY29tcF9lZHUpLA0KICAgICAgICAgb25iaF9jb21wX3NhbWVfYWdlID0gY2FzZV93aGVuKGFnZT09JzUwIG9yIG9sZGVyJyB+IG9uYmhfY29tcF9hZ2UsIGFnZT09J3VuZGVyIDUwJyB+IDEwMC1vbmJoX2NvbXBfYWdlKSwNCiAgICAgICAgIG9uYmhfY29tcF9zYW1lX2V0aCA9IGNhc2Vfd2hlbihldGhfZHRtPT0nVHVya2lzaC9Nb3JvY2NhbicgfiBvbmJoX2NvbXBfZXRoLCBldGhfZHRtPT0nRHV0Y2gnIH4gMTAwLW9uYmhfY29tcF9ldGgpLA0KICAgICAgICAgb25iaF9jb21wX3NhbWVfZ25kXzUwID0gY2FzZV93aGVuKG9uYmhfY29tcF9zYW1lX2duZD49NTAgfiAxLCBvbmJoX2NvbXBfc2FtZV9nbmQ8NTAgfiAwKSwNCiAgICAgICAgIG9uYmhfY29tcF9zYW1lX2VkdV81MCA9IGNhc2Vfd2hlbihvbmJoX2NvbXBfc2FtZV9lZHU+PTUwIH4gMSwgb25iaF9jb21wX3NhbWVfZWR1PDUwIH4gMCksDQogICAgICAgICBvbmJoX2NvbXBfc2FtZV9hZ2VfNTAgPSBjYXNlX3doZW4ob25iaF9jb21wX3NhbWVfYWdlPj01MCB+IDEsIG9uYmhfY29tcF9zYW1lX2FnZTw1MCB+IDApLA0KICAgICAgICAgb25iaF9jb21wX3NhbWVfZXRoXzUwID0gY2FzZV93aGVuKG9uYmhfY29tcF9zYW1lX2V0aD49NTAgfiAxLCBvbmJoX2NvbXBfc2FtZV9ldGg8NTAgfiAwKSwNCiAgICAgICAgIG9uYmhfY29tcF9zYW1lX2RpbWVuc2lvbnM0XzUwID0gb25iaF9jb21wX3NhbWVfZ25kXzUwICsgb25iaF9jb21wX3NhbWVfZWR1XzUwICsgb25iaF9jb21wX3NhbWVfYWdlXzUwICsgb25iaF9jb21wX3NhbWVfZXRoXzUwLA0KICAgICAgICAgb25iaF9jb21wX3NhbWVfZGltZW5zaW9uczNfNTAgPSBvbmJoX2NvbXBfc2FtZV9nbmRfNTAgKyBvbmJoX2NvbXBfc2FtZV9lZHVfNTAgKyBvbmJoX2NvbXBfc2FtZV9hZ2VfNTAsDQogICAgICAgICANCiAgICAgICAgIG9uYmhfY29udF9zYW1lX2duZCA9IGNhc2Vfd2hlbihzZXg9PSdmZW1hbGUnIH4gb25iaF9jb250X2duZCwgc2V4PT0nbWFsZScgfiAxMDAtb25iaF9jb250X2duZCksDQogICAgICAgICBvbmJoX2NvbnRfc2FtZV9lZHUgPSBjYXNlX3doZW4oZWR1PT0nY29sbGVnZSBkZWdyZWUnIH4gb25iaF9jb250X2VkdSwgZWR1PT0nbm8gY29sbGVnZSBkZWdyZWUnIH4gMTAwLW9uYmhfY29udF9lZHUpLA0KICAgICAgICAgb25iaF9jb250X3NhbWVfYWdlID0gY2FzZV93aGVuKGFnZT09JzUwIG9yIG9sZGVyJyB+IG9uYmhfY29udF9hZ2UsIGFnZT09J3VuZGVyIDUwJyB+IDEwMC1vbmJoX2NvbnRfYWdlKSwNCiAgICAgICAgIG9uYmhfY29udF9zYW1lX2V0aCA9IGNhc2Vfd2hlbihldGhfZHRtPT0nVHVya2lzaC9Nb3JvY2NhbicgfiBvbmJoX2NvbnRfZXRoLCBldGhfZHRtPT0nRHV0Y2gnIH4gMTAwLW9uYmhfY29udF9ldGgpLA0KICAgICAgICAgb25iaF9jb250X3NhbWVfZ25kXzUwID0gY2FzZV93aGVuKG9uYmhfY29udF9zYW1lX2duZD49NTAgfiAxLCBvbmJoX2NvbnRfc2FtZV9nbmQ8NTAgfiAwKSwNCiAgICAgICAgIG9uYmhfY29udF9zYW1lX2VkdV81MCA9IGNhc2Vfd2hlbihvbmJoX2NvbnRfc2FtZV9lZHU+PTUwIH4gMSwgb25iaF9jb250X3NhbWVfZWR1PDUwIH4gMCksDQogICAgICAgICBvbmJoX2NvbnRfc2FtZV9hZ2VfNTAgPSBjYXNlX3doZW4ob25iaF9jb250X3NhbWVfYWdlPj01MCB+IDEsIG9uYmhfY29udF9zYW1lX2FnZTw1MCB+IDApLA0KICAgICAgICAgb25iaF9jb250X3NhbWVfZXRoXzUwID0gY2FzZV93aGVuKG9uYmhfY29udF9zYW1lX2V0aD49NTAgfiAxLCBvbmJoX2NvbnRfc2FtZV9ldGg8NTAgfiAwKSwNCiAgICAgICAgIG9uYmhfY29udF9zYW1lX2RpbWVuc2lvbnM0XzUwID0gb25iaF9jb250X3NhbWVfZ25kXzUwICsgb25iaF9jb250X3NhbWVfZWR1XzUwICsgb25iaF9jb250X3NhbWVfYWdlXzUwICsgb25iaF9jb250X3NhbWVfZXRoXzUwLA0KICAgICAgICAgb25iaF9jb250X3NhbWVfZGltZW5zaW9uczNfNTAgPSBvbmJoX2NvbnRfc2FtZV9nbmRfNTAgKyBvbmJoX2NvbnRfc2FtZV9lZHVfNTAgKyBvbmJoX2NvbnRfc2FtZV9hZ2VfNTApDQoNCiNzdG9yZSBkYXRhZnJhbWUgaW4gZGYNCmRmIDwtIGxpc3MNCmBgYCANCg0KPCEtLS0tDQoNCiNhbHNvIGF0dGFjaCB0aGUgb2JqZWN0aXZlIGNvbXBvc2l0aW9uIG1lYXN1cmVzIG9mIHRoZSBidXVydGVuIGFuZCBnZW1lZW50ZW4gb2YgcmVzcG9uZGVudHMNCg0KI2xvYWQgaW4gcmF3IGRhdGE6DQpjb21wIDwtIHJlYWQuY3N2KCIuL3Jhd2RhdGEvbGlzc19jYnNfbmJoX2NvbXAuY3N2IikNCg0KI3NlbGVjdCB2YXJpYWJsZXMgZm9yIGFuYWx5c2VzOg0KY29tcCAlPiUNCiAgc2VsZWN0KGMoIm5vbWVtX2VuY3IiLCAicF9oaF9oaUIiLCAicF9oaF9oaUciLCAicF9ubEIiLCAicF9ubEciLCAicF90dXJtYXJva0IiLCAicF90dXJtYXJva0ciLCAicF80NV9vb0IiLCAicF80NV9vb0ciKSkgLT4gY29tcDINCg0KZGYgPC0gbWVyZ2UoZGYsIGNvbXAyLCBieSA9ICJub21lbV9lbmNyIikNCg0KIyBnZXQgdmFyaWFibGVzIG9mIGludGVyZXN0DQpkZnRlc3QgPC0gZGZbLGMoIm5vbWVtX2VuY3IiLCAiZWR1IiwgImV0aF9kdG0iLCAiYWdlIiwgDQogICAgICAgICAgICAgICAgInBfNDVfb29CIiwgInBfNDVfb29HIiwNCiAgICAgICAgICAgICAgICAicF90dXJtYXJva0IiLCAicF90dXJtYXJva0ciLA0KICAgICAgICAgICAgICAgICJwX2hoX2hpQiIsICJwX2hoX2hpRyIpXQ0KDQojc29tZSB2YWx1ZSBvZiAyMDA/IHNldCB0byAxMDAuDQpkZnRlc3QkcF80NV9vb0JbIWlzLm5hKGRmdGVzdCRwXzQ1X29vQikgJiBkZnRlc3QkcF80NV9vb0I+MTAwXSA8LSAxMDANCg0KaGlzdChkZnRlc3QkcF80NV9vb0IpICNwZXJjZW50YWdlIGFnZWQgNDUrDQpoaXN0KGRmdGVzdCRwX3R1cm1hcm9rQikjcGVyY2VudGFnZSBUTQ0KaGlzdChhcy5udW1lcmljKGRmdGVzdCRwX2hoX2hpQikpICNwZXJjZW50YWdlIGhpZ2ggaW5jb21lIGhvdXNlaG9sZHMNCg0KI2FnZQ0KI3NwbGl0IGJ5IGxvd2VyIGFuZCB1cHBlciBxdWFydGlsZSBpbiBkaXN0cmlidXRpb24NCmRmdGVzdCRhZ2VuYmggPC0gTkFfcmVhbF8NCg0KYWdlX3EyNSA8LSBxdWFudGlsZShkZnRlc3QkcF80NV9vb0JbZGZ0ZXN0JGFnZSA9PSAiNTAgb3Igb2xkZXIiXSwgMC4yNSwgbmEucm09VFJVRSkNCmFnZV9xNzUgPC0gcXVhbnRpbGUoZGZ0ZXN0JHBfNDVfb29CW2RmdGVzdCRhZ2UgPT0gIjUwIG9yIG9sZGVyIl0sIDAuNzUsIG5hLnJtPVRSVUUpDQpuYWdlX3EyNSA8LSBxdWFudGlsZShkZnRlc3QkcF80NV9vb0JbZGZ0ZXN0JGFnZSA9PSAidW5kZXIgNTAiXSwgMC4yNSwgbmEucm09VFJVRSkNCm5hZ2VfcTc1IDwtIHF1YW50aWxlKGRmdGVzdCRwXzQ1X29vQltkZnRlc3QkYWdlID09ICJ1bmRlciA1MCJdLCAwLjc1LCBuYS5ybT1UUlVFKQ0KDQojYXBwbHkgIGNvbmRpdGlvbnMgZm9yIHN1Ymdyb3Vwcw0KZGZ0ZXN0JGFnZW5iaCA8LSBpZmVsc2UoZGZ0ZXN0JGFnZSA9PSAiNTAgb3Igb2xkZXIiLCANCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkcF80NV9vb0IgPD0gYWdlX3EyNSwgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfNDVfb29CID49IGFnZV9xNzUsIDIsIE5BKSksDQogICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkYWdlID09ICJ1bmRlciA1MCIsDQogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfNDVfb29CIDw9IG5hZ2VfcTI1LCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkcF80NV9vb0IgPj0gbmFnZV9xNzUsIDIsIE5BKSksIE5BKSkNCg0KI21ha2UgY2F0ZWdvcmllcyAoY29tYmluYXRpb24gb2Ygc3ViZ3JvdXAgYW5kIGNvbXBvc2l0aW9uKQ0KZGZ0ZXN0JGFnZW5iaEFnZSA8LSBpZmVsc2UoZGZ0ZXN0JGFnZSA9PSAiNTAgb3Igb2xkZXIiICYgZGZ0ZXN0JGFnZW5iaCA9PSAxLCAiNTAgeWVhcnMgb3Igb2xkZXIsIGZldyA0NSB5ZWFycyBvciBvbGRlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JGFnZSA9PSAiNTAgb3Igb2xkZXIiICYgZGZ0ZXN0JGFnZW5iaCA9PSAyLCAiNTAgeWVhcnMgb3Igb2xkZXIsIG1hbnkgNDUgeWVhcnMgb3Igb2xkZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkYWdlID09ICJ1bmRlciA1MCIgJiBkZnRlc3QkYWdlbmJoID09IDEsICJVbmRlciA1MCB5ZWFycywgZmV3IDQ1IHllYXJzIG9yIG9sZGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmdGVzdCRhZ2UgPT0gInVuZGVyIDUwIiAmIGRmdGVzdCRhZ2VuYmggPT0gMiwgIlVuZGVyIDUwIHllYXJzLCBtYW55IDQ1IHllYXJzIG9yIG9sZGVyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkNCiNlZHVjYXRpb24geCBoaSBob3VzZWhvbGRzDQoNCiNzcGxpdCBieSBsb3dlciBhbmQgdXBwZXIgcXVhcnRpbGUgaW4gZGlzdHJpYnV0aW9uDQpkZnRlc3QkaGluYmggPC0gTkFfcmVhbF8NCmNvbGxlZ2VfcTI1IDwtIHF1YW50aWxlKGFzLm51bWVyaWMoZGZ0ZXN0JHBfaGhfaGlCW2RmdGVzdCRlZHUgPT0gImNvbGxlZ2UgZGVncmVlIl0pLCAwLjI1LCBuYS5ybT1UUlVFKQ0KY29sbGVnZV9xNzUgPC0gcXVhbnRpbGUoYXMubnVtZXJpYyhkZnRlc3QkcF9oaF9oaUJbZGZ0ZXN0JGVkdSA9PSAiY29sbGVnZSBkZWdyZWUiXSksIDAuNzUsIG5hLnJtPVRSVUUpDQpuY29sbGVnZV9xMjUgPC0gcXVhbnRpbGUoYXMubnVtZXJpYyhkZnRlc3QkcF9oaF9oaUJbZGZ0ZXN0JGVkdSA9PSAibm8gY29sbGVnZSBkZWdyZWUiXSksIDAuMjUsIG5hLnJtPVRSVUUpDQpuY29sbGVnZV9xNzUgPC0gcXVhbnRpbGUoYXMubnVtZXJpYyhkZnRlc3QkcF9oaF9oaUJbZGZ0ZXN0JGVkdSA9PSAibm8gY29sbGVnZSBkZWdyZWUiXSksIDAuNzUsIG5hLnJtPVRSVUUpDQoNCiNhcHBseSAgY29uZGl0aW9ucyBmb3Igc3ViZ3JvdXBzDQpkZnRlc3QkaGluYmggPC0gaWZlbHNlKGRmdGVzdCRlZHUgPT0gImNvbGxlZ2UgZGVncmVlIiwgDQogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfaGhfaGlCIDw9IGNvbGxlZ2VfcTI1LCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkcF9oaF9oaUIgPj0gY29sbGVnZV9xNzUsIDIsIE5BKSksDQogICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkZWR1ID09ICJubyBjb2xsZWdlIGRlZ3JlZSIsDQogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfaGhfaGlCIDw9IG5jb2xsZWdlX3EyNSwgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfaGhfaGlCID49IG5jb2xsZWdlX3E3NSwgMiwgTkEpKSwgTkEpKQ0KDQojbWFrZSBjYXRlZ29yaWVzIChjb21iaW5hdGlvbiBvZiBzdWJncm91cCBhbmQgY29tcG9zaXRpb24pDQpkZnRlc3QkaGluYmhFZHVjIDwtIGlmZWxzZShkZnRlc3QkZWR1ID09ICJjb2xsZWdlIGRlZ3JlZSIgJiBkZnRlc3QkaGluYmggPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiV2l0aCBjb2xsZWdlIGRlZ3JlZSwgZmV3IGhpZ2ggaW5jb21lIGhvdXNlaG9sZHMiLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JGVkdSA9PSAiY29sbGVnZSBkZWdyZWUiICYgZGZ0ZXN0JGhpbmJoID09IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpdGggY29sbGVnZSBkZWdyZWUsIG1hbnkgaGlnaCBpbmNvbWUgaG91c2Vob2xkcyIsDQogICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkZWR1ID09ICJubyBjb2xsZWdlIGRlZ3JlZSIgJiBkZnRlc3QkaGluYmggPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiV2l0aG91dCBjb2xsZWdlIGRlZ3JlZSwgZmV3IGhpZ2ggaW5jb21lIGhvdXNlaG9sZHMiLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JGVkdSA9PSAibm8gY29sbGVnZSBkZWdyZWUiICYgZGZ0ZXN0JGhpbmJoID09IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpdGhvdXQgY29sbGVnZSBkZWdyZWUsIG1hbnkgaGlnaCBpbmNvbWUgaG91c2Vob2xkcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSkpDQoNCiNldGhuaWNpdHkNCiNtZWFuIHNwbGl0DQpkZnRlc3QkVE1uYmggPC0gTkFfcmVhbF8NCm1fbVRNIDwtIG1lYW4oZGZ0ZXN0JHBfdHVybWFyb2tCW2RmdGVzdCRldGhfZHRtID09ICJUdXJraXNoL01vcm9jY2FuIl0sIG5hLnJtPVRSVUUpDQpubV9tVE0gPC0gbWVhbihkZnRlc3QkcF90dXJtYXJva0JbZGZ0ZXN0JGV0aF9kdG0gPT0gIkR1dGNoIl0sIG5hLnJtPVRSVUUpDQoNCiNhcHBseSAgY29uZGl0aW9ucyBmb3Igc3ViZ3JvdXBzDQpkZnRlc3QkVE1uYmggPC0gaWZlbHNlKGRmdGVzdCRldGhfZHRtID09ICJUdXJraXNoL01vcm9jY2FuIiwgDQogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfdHVybWFyb2tCIDwgbV9tVE0sIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmdGVzdCRwX3R1cm1hcm9rQiA+PSBtX21UTSwgMiwgTkEpKSwNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JGV0aF9kdG0gPT0gIkR1dGNoIiwgDQogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGZ0ZXN0JHBfdHVybWFyb2tCIDwgbm1fbVRNLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkcF90dXJtYXJva0IgPj0gbm1fbVRNLCAyLCBOQSkpLCBOQSkpDQoNCiNtYWtlIGNhdGVnb3JpZXMgKGNvbWJpbmF0aW9uIG9mIHN1Ymdyb3VwIGFuZCBjb21wb3NpdGlvbikNCmRmdGVzdCRldGhuYmhUTSA8LSBpZmVsc2UoZGZ0ZXN0JGV0aF9kdG0gPT0gIlR1cmtpc2gvTW9yb2NjYW4iICYgZGZ0ZXN0JFRNbmJoID09IDEsICJUdXJraXNoL01vcm9jY2FuIGJhY2tncm91bmQsIGZldyBUdXJraXNoL01vcm9jY2FuIGJhY2tncm91bmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkZXRoX2R0bSA9PSAiVHVya2lzaC9Nb3JvY2NhbiIgJiBkZnRlc3QkVE1uYmggPT0gMiwgIlR1cmtpc2gvTW9yb2NjYW4gYmFja2dyb3VuZCwgbWFueSBUdXJraXNoL01vcm9jY2FuIGJhY2tncm91bmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmdGVzdCRldGhfZHRtID09ICJEdXRjaCIgJiBkZnRlc3QkVE1uYmggPT0gMSwgIk5vIG1pZ3JhdGlvbiBiYWNrZ3JvdW5kLCBmZXcgVHVya2lzaC9Nb3JvY2NhbiBiYWNrZ3JvdW5kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkZnRlc3QkZXRoX2R0bSA9PSAiRHV0Y2giICAmIGRmdGVzdCRUTW5iaCA9PSAyLCAiTm8gbWlncmF0aW9uIGJhY2tncm91bmQsIG1hbnkgVHVya2lzaC9Nb3JvY2NhbiBiYWNrZ3JvdW5kIiwgTkEpKSkpDQoNCiNzZWxlY3QgdGhlIGRhdGEgdGhhdCBjYW4gYmUgc2hhcmVkIHB1YmxpY2x5DQpjb21wIDwtIGRmdGVzdFssYygibm9tZW1fZW5jciIsICJldGhuYmhUTSIsICJoaW5iaEVkdWMiLCAgImFnZW5iaEFnZSIpXQ0KI3NhdmUgdGhlIGNvbnN0cnVjdGVkIGRhdGFzZXQNCiNmc2F2ZShjb21wLCAicHVibGljX2NvbXBvc2l0aW9uX2RhdGEuUmRhIikNCg0KLS0+DQoNCjxicj4NCg0KIyMgRXhwZXJpbWVudGFsIGRhdGENCg0KYGBge3IsIG9yZywgZXZhbD1GQUxTRX0NCiMxLiBvcmdhbml6YXRpb24gY2hvaWNlIGV4cGVyaW1lbnQNCiMyLiBuZWlnaGJvcmhvb2QgY2hvaWNlIGV4cGVyaW1lbnQNCg0KI3RvIGxvbmcgZm9ybWF0DQojbWFrZSByZXNwb25kZW50IGlkIA0KZGYkaWQgPC0gMTpucm93KGRmKQ0KDQojZWFjaCBsaXN0IGVsZW1lbnQgY29udGFpbnMgdGhlIGNob2ljZXMgZm9yIGVhY2ggc2V0Og0KI3RodXMsIHJlaXN0aWpkLmxpc3QxW1szXV1bMl0gaXMgdGhlIGxldmVsIG9mIHRoZSB0cmF2ZWwgdGltZSBhdHRyaWJ1dGUgb2Ygb3B0aW9uIDIgaW4gY2hvaWNlLXNldCAzIG9mIHRoZSBjaXYgb3JnIGV4cGVyaW1lbnQuDQoNCnsNCiAgcmVpc3RpamQubGlzdDEgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTAzNiIsICJ4czIzYTAzNyIpLA0KICAgIGMoInhzMjNhMDUwIiwgInhzMjNhMDUxIiksDQogICAgYygieHMyM2EwNjQiLCAieHMyM2EwNjUiKSwNCiAgICBjKCJ4czIzYTA3OCIsICJ4czIzYTA3OSIpDQogICkNCiAgDQogIGtvc3Rlbi5saXN0MSA8LSBsaXN0KA0KICAgIGMoInhzMjNhMDM4IiwgInhzMjNhMDM5IiksDQogICAgYygieHMyM2EwNTIiLCAieHMyM2EwNTMiKSwNCiAgICBjKCJ4czIzYTA2NiIsICJ4czIzYTA2NyIpLA0KICAgIGMoInhzMjNhMDgwIiwgInhzMjNhMDgxIikNCiAgKQ0KICANCiAgY29oZXNpZS5saXN0MSA8LSBsaXN0KA0KICAgIGMoInhzMjNhMDQwIiwgInhzMjNhMDQxIiksDQogICAgYygieHMyM2EwNTQiLCAieHMyM2EwNTUiKSwNCiAgICBjKCJ4czIzYTA2OCIsICJ4czIzYTA2OSIpLA0KICAgIGMoInhzMjNhMDgyIiwgInhzMjNhMDgzIikNCiAgKQ0KICANCiAgYmVrZW5kZW4ubGlzdDEgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTA0MiIsICJ4czIzYTA0MyIpLA0KICAgIGMoInhzMjNhMDU2IiwgInhzMjNhMDU3IiksDQogICAgYygieHMyM2EwNzAiLCAieHMyM2EwNzEiKSwNCiAgICBjKCJ4czIzYTA4NCIsICJ4czIzYTA4NSIpDQogICkNCiAgDQogIG9wbGVpZGluZy5saXN0MSAgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTA0NCIsICJ4czIzYTA0NSIpLA0KICAgIGMoInhzMjNhMDU4IiwgInhzMjNhMDU5IiksDQogICAgYygieHMyM2EwNzIiLCAieHMyM2EwNzMiKSwNCiAgICBjKCJ4czIzYTA4NiIsICJ4czIzYTA4NyIpDQogICkNCiAgDQogIGxlZWZ0aWpkLmxpc3QxIDwtIGxpc3QoDQogICAgYygieHMyM2EwNDYiLCAieHMyM2EwNDciKSwNCiAgICBjKCJ4czIzYTA2MCIsICJ4czIzYTA2MSIpLA0KICAgIGMoInhzMjNhMDc0IiwgInhzMjNhMDc1IiksDQogICAgYygieHMyM2EwODgiLCAieHMyM2EwODkiKQ0KICApDQogIA0KICBtaWdyYXRpZS5saXN0MSA8LSBsaXN0KA0KICAgIGMoInhzMjNhMDQ4IiwgInhzMjNhMDQ5IiksDQogICAgYygieHMyM2EwNjIiLCAieHMyM2EwNjMiKSwNCiAgICBjKCJ4czIzYTA3NiIsICJ4czIzYTA3NyIpLA0KICAgIGMoInhzMjNhMDkwIiwgInhzMjNhMDkxIikNCiAgKQ0KICANCiAgY2hvc2VuMSA8LSBjKCJ4czIzYTE2NSIsInhzMjNhMTY2IiwieHMyM2ExNjciLCJ4czIzYTE2OCIpDQoNCiAgDQogIHJlaXN0aWpkLmxpc3QyIDwtIGxpc3QoDQogICAgYygieHMyM2EwOTIiLCAieHMyM2EwOTMiKSwNCiAgICBjKCJ4czIzYTEwNiIsICJ4czIzYTEwNyIpLA0KICAgIGMoInhzMjNhMTIwIiwgInhzMjNhMTIxIiksDQogICAgYygieHMyM2ExMzQiLCAieHMyM2ExMzUiKQ0KICApDQogIA0KICBrb3N0ZW4ubGlzdDIgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTA5NCIsICJ4czIzYTA5NSIpLA0KICAgIGMoInhzMjNhMTA4IiwgInhzMjNhMTA5IiksDQogICAgYygieHMyM2ExMjIiLCAieHMyM2ExMjMiKSwNCiAgICBjKCJ4czIzYTEzNiIsICJ4czIzYTEzNyIpDQogICkNCiAgDQogIGNvaGVzaWUubGlzdDIgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTA5NiIsICJ4czIzYTA5NyIpLA0KICAgIGMoInhzMjNhMTEwIiwgInhzMjNhMTExIiksDQogICAgYygieHMyM2ExMjQiLCAieHMyM2ExMjUiKSwNCiAgICBjKCJ4czIzYTEzOCIsICJ4czIzYTEzOSIpDQogICkNCiAgDQogIGJla2VuZGVuLmxpc3QyIDwtIGxpc3QoDQogICAgYygieHMyM2EwOTgiLCAieHMyM2EwOTkiKSwNCiAgICBjKCJ4czIzYTExMiIsICJ4czIzYTExMyIpLA0KICAgIGMoInhzMjNhMTI2IiwgInhzMjNhMTI3IiksDQogICAgYygieHMyM2ExNDAiLCAieHMyM2ExNDEiKQ0KICApDQogIA0KICBvcGxlaWRpbmcubGlzdDIgIDwtIGxpc3QoDQogICAgYygieHMyM2ExMDAiLCAieHMyM2ExMDEiKSwNCiAgICBjKCJ4czIzYTExNCIsICJ4czIzYTExNSIpLA0KICAgIGMoInhzMjNhMTI4IiwgInhzMjNhMTI5IiksDQogICAgYygieHMyM2ExNDIiLCAieHMyM2ExNDMiKQ0KICApDQogIA0KICBsZWVmdGlqZC5saXN0MiA8LSBsaXN0KA0KICAgIGMoInhzMjNhMTAyIiwgInhzMjNhMTAzIiksDQogICAgYygieHMyM2ExMTYiLCAieHMyM2ExMTciKSwNCiAgICBjKCJ4czIzYTEzMCIsICJ4czIzYTEzMSIpLA0KICAgIGMoInhzMjNhMTQ0IiwgInhzMjNhMTQ1IikNCiAgKQ0KICANCiAgbWlncmF0aWUubGlzdDIgPC0gbGlzdCgNCiAgICBjKCJ4czIzYTEwNCIsICJ4czIzYTEwNSIpLA0KICAgIGMoInhzMjNhMTE4IiwgInhzMjNhMTE5IiksDQogICAgYygieHMyM2ExMzIiLCAieHMyM2ExMzMiKSwNCiAgICBjKCJ4czIzYTE0NiIsICJ4czIzYTE0NyIpDQogICkNCiAgDQogIGNob3NlbjIgPC0gYygieHMyM2ExOTEiLCJ4czIzYTE5MiIsInhzMjNhMTkzIiwieHMyM2ExOTQiKQ0KfQ0KDQpmb3IgKHNldCBpbiAxOjQpIHsNCiAgZm9yIChjaG9pY2UgaW4gMToyKSB7DQogICAgZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGRmKQ0KICAgIA0KICAgICNjaXYNCiAgICBkYXRhJGVjaXZfc2V0IDwtIHNldA0KICAgIGRhdGEkZWNpdl9vcHRpb25zIDwtIGNob2ljZQ0KICAgIGRhdGEkZWNpdl90aW1lIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSByZWlzdGlqZC5saXN0MVtbc2V0XV1bY2hvaWNlXV0NCiAgICBkYXRhJGVjaXZfY29zdCA8LSBkYXRhWywgbmFtZXMoZGF0YSkgPT0ga29zdGVuLmxpc3QxW1tzZXRdXVtjaG9pY2VdXQ0KICAgIGRhdGEkZWNpdl9jb2hlc2lvbiA8LSBkYXRhWywgbmFtZXMoZGF0YSkgPT0gY29oZXNpZS5saXN0MVtbc2V0XV1bY2hvaWNlXV0NCiAgICBkYXRhJGVjaXZfYWNxdWFpbnRhbmNlcyA8LSBkYXRhWywgbmFtZXMoZGF0YSkgPT0gYmVrZW5kZW4ubGlzdDFbW3NldF1dW2Nob2ljZV1dDQogICAgZGF0YSRlY2l2X2NvbXBfZWR1YyA8LSBkYXRhWywgbmFtZXMoZGF0YSkgPT0gb3BsZWlkaW5nLmxpc3QxW1tzZXRdXVtjaG9pY2VdXQ0KICAgIGRhdGEkZWNpdl9jb21wX2FnZSA8LSBkYXRhWywgbmFtZXMoZGF0YSkgPT0gbGVlZnRpamQubGlzdDFbW3NldF1dW2Nob2ljZV1dDQogICAgZGF0YSRlY2l2X2NvbXBfZXRoIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBtaWdyYXRpZS5saXN0MVtbc2V0XV1bY2hvaWNlXV0NCiAgICBkYXRhJGVjaXZfY2hvc2VuIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBjaG9zZW4xW3NldF1dDQogICAgDQogICAgI25iaA0KICAgIGRhdGEkZW5iaF9zZXQgPC0gc2V0DQogICAgZGF0YSRlbmJoX29wdGlvbnMgPC0gY2hvaWNlDQogICAgZGF0YSRlbmJoX3RpbWUgPC0gZGF0YVssIG5hbWVzKGRhdGEpID09IHJlaXN0aWpkLmxpc3QyW1tzZXRdXVtjaG9pY2VdXQ0KICAgIGRhdGEkZW5iaF9jb3N0IDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBrb3N0ZW4ubGlzdDJbW3NldF1dW2Nob2ljZV1dDQogICAgZGF0YSRlbmJoX2NvaGVzaW9uIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBjb2hlc2llLmxpc3QyW1tzZXRdXVtjaG9pY2VdXQ0KICAgIGRhdGEkZW5iaF9hY3F1YWludGFuY2VzIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBiZWtlbmRlbi5saXN0Mltbc2V0XV1bY2hvaWNlXV0NCiAgICBkYXRhJGVuYmhfY29tcF9lZHVjIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBvcGxlaWRpbmcubGlzdDJbW3NldF1dW2Nob2ljZV1dDQogICAgZGF0YSRlbmJoX2NvbXBfYWdlIDwtIGRhdGFbLCBuYW1lcyhkYXRhKSA9PSBsZWVmdGlqZC5saXN0Mltbc2V0XV1bY2hvaWNlXV0NCiAgICBkYXRhJGVuYmhfY29tcF9ldGggPC0gZGF0YVssIG5hbWVzKGRhdGEpID09IG1pZ3JhdGllLmxpc3QyW1tzZXRdXVtjaG9pY2VdXQ0KICAgIGRhdGEkZW5iaF9jaG9zZW4gPC0gZGF0YVssIG5hbWVzKGRhdGEpID09IGNob3NlbjJbc2V0XV0NCiAgICANCiAgICBpZihzZXQgPT0gMSAmIGNob2ljZSA9PSAxKSB7DQogICAgICBkZl9sb25nIDwtIGRhdGENCiAgICB9IGVsc2Ugew0KICAgICAgZGZfbG9uZyA8LSByYmluZChkZl9sb25nLCBkYXRhKQ0KICAgIH0NCiAgfQ0KfQ0KDQojIHJlb3JkZXINCmRmX2xvbmcgPC0gZGZfbG9uZ1tvcmRlcihkZl9sb25nJGlkLCBkZl9sb25nJGVjaXZfc2V0LCBkZl9sb25nJGVjaXZfb3B0aW9ucywgZGZfbG9uZyRlbmJoX3NldCwgZGZfbG9uZyRlbmJoX29wdGlvbnMpLCBdDQpyb3cubmFtZXMoZGZfbG9uZykgPC0gMTpucm93KGRmX2xvbmcpDQoNCiMgZGVmaW5lIHRoZSBjaG9pY2VzDQpkZl9sb25nJGVjaXZfY2hvaWNlIDwtIChkZl9sb25nJGVjaXZfY2hvc2VuID09IGMoMSwgMilbZGZfbG9uZyRlY2l2X29wdGlvbnNdKQ0KZGZfbG9uZyRlbmJoX2Nob2ljZSA8LSAoZGZfbG9uZyRlbmJoX2Nob3NlbiA9PSBjKDEsIDIpW2RmX2xvbmckZW5iaF9vcHRpb25zXSkNCg0KIyByZWNvZGUgbGV2ZWxzDQpkZl9sb25nIDwtIGRmX2xvbmcgJT4lIG11dGF0ZSgNCiAgDQogIGVjaXZfdGltZSA9IGNhc2Vfd2hlbigNCiAgICBlY2l2X3RpbWUgPT0gMSB+ICJ0cmF2ZWwgdGltZTogMTAgbWludXRlcyIsDQogICAgZWNpdl90aW1lID09IDIgfiAidHJhdmVsIHRpbWU6IDE1IG1pbnV0ZXMiLA0KICAgIGVjaXZfdGltZSA9PSAzIH4gInRyYXZlbCB0aW1lOiAyMCBtaW51dGVzIiksDQogIA0KICBlbmJoX3RpbWUgPSBjYXNlX3doZW4oDQogICAgZW5iaF90aW1lID09IDEgfiAidHJhdmVsIHRpbWUgdG8gZmFjaWxpdGllczogMTAgbWludXRlcyIsDQogICAgZW5iaF90aW1lID09IDIgfiAidHJhdmVsIHRpbWUgdG8gZmFjaWxpdGllczogMTUgbWludXRlcyIsDQogICAgZW5iaF90aW1lID09IDMgfiAidHJhdmVsIHRpbWUgdG8gZmFjaWxpdGllczogMjAgbWludXRlcyIpLA0KICANCiAgZWNpdl9jb3N0ID0gY2FzZV93aGVuKA0KICAgIGVjaXZfY29zdCA9PSAxIH4gImNvc3RzOiA3MCUgb2YgY3VycmVudCBjb250cmlidXRpb24iLA0KICAgIGVjaXZfY29zdCA9PSAyIH4gImNvc3RzOiA5MCUgb2YgY3VycmVudCBjb250cmlidXRpb24iLA0KICAgIGVjaXZfY29zdCA9PSAzIH4gImNvc3RzOiAxMDAlIG9mIGN1cnJlbnQgY29udHJpYnV0aW9uIiwNCiAgICBlY2l2X2Nvc3QgPT0gNCB+ICJjb3N0czogMTEwJSBvZiBjdXJyZW50IGNvbnRyaWJ1dGlvbiIsDQogICAgZWNpdl9jb3N0ID09IDUgfiAiY29zdHM6IDEzMCUgb2YgY3VycmVudCBjb250cmlidXRpb24iKSwNCiAgDQogIGVuYmhfY29zdCA9IGNhc2Vfd2hlbigNCiAgICBlbmJoX2Nvc3QgPT0gMSB+ICJjb3N0czogOTAlIG9mIGN1cnJlbnQgaG91c2luZyBleHBlbnNlcyIsDQogICAgZW5iaF9jb3N0ID09IDIgfiAiY29zdHM6IDk1JSBvZiBjdXJyZW50IGhvdXNpbmcgZXhwZW5zZXMiLA0KICAgIGVuYmhfY29zdCA9PSAzIH4gImNvc3RzOiAxMDAlIG9mIGN1cnJlbnQgaG91c2luZyBleHBlbnNlcyIsDQogICAgZW5iaF9jb3N0ID09IDQgfiAiY29zdHM6IDEwNSUgb2YgY3VycmVudCBob3VzaW5nIGV4cGVuc2VzIiwNCiAgICBlbmJoX2Nvc3QgPT0gNSB+ICJjb3N0czogMTEwJSBvZiBjdXJyZW50IGhvdXNpbmcgZXhwZW5zZXMiKSwNCiAgDQogIGVjaXZfY29oZXNpb24gPSBjYXNlX3doZW4oDQogICAgZWNpdl9jb2hlc2lvbiA9PSAxIH4gImNvaGVzaW9uOiBwZW9wbGUga25vdyBlYWNoIG90aGVyIHdlbGwiLA0KICAgIGVjaXZfY29oZXNpb24gPT0gMiB+ICJjb2hlc2lvbjogc29tZSBrbm93IGVhY2ggb3RoZXIgd2VsbCwgb3RoZXJzIG9ubHkgYnkgc2lnaHQiLA0KICAgIGVjaXZfY29oZXNpb24gPT0gMyB+ICJjb2hlc2lvbjogcGVvcGxlIGtub3cgZWFjaCBvdGhlciBvbmx5IGJ5IHNpZ2h0IiksDQogIA0KICBlbmJoX2NvaGVzaW9uID0gY2FzZV93aGVuKA0KICAgIGVuYmhfY29oZXNpb24gPT0gMSB+ICJjb2hlc2lvbjogbmVpZ2hib3JzIGtub3cgZWFjaCBvdGhlciB3ZWxsIiwNCiAgICBlbmJoX2NvaGVzaW9uID09IDIgfiAiY29oZXNpb246IG5laWdoYm9ycyBrbm93IGVhY2ggb3RoZXIgb25seSBieSBzaWdodCIsDQogICAgZW5iaF9jb2hlc2lvbiA9PSAzIH4gImNvaGVzaW9uOiBzb21lIGtub3cgZWFjaCBvdGhlciB3ZWxsLCBvdGhlcnMgb25seSBieSBzaWdodCIpLA0KICANCiAgZWNpdl9hY3F1YWludGFuY2VzID0gY2FzZV93aGVuKA0KICAgIGVjaXZfYWNxdWFpbnRhbmNlcyA9PSAxIH4gImFjcXVhaW50YW5jZXM6IG5vIG9uZSIsDQogICAgZWNpdl9hY3F1YWludGFuY2VzID09IDIgfiAiYWNxdWFpbnRhbmNlczogb25lIHBlcnNvbiIsICAgDQogICAgZWNpdl9hY3F1YWludGFuY2VzID09IDMgfiAiYWNxdWFpbnRhbmNlczogbXVsdGlwbGUiKSwNCiAgIA0KICBlbmJoX2FjcXVhaW50YW5jZXMgPSBjYXNlX3doZW4oDQogICAgZW5iaF9hY3F1YWludGFuY2VzID09IDEgfiAiYWNxdWFpbnRhbmNlczogbXVsdGlwbGUiLA0KICAgIGVuYmhfYWNxdWFpbnRhbmNlcyA9PSAyIH4gImFjcXVhaW50YW5jZXM6IG9uZSBwZXJzb24iLCAgIA0KICAgIGVuYmhfYWNxdWFpbnRhbmNlcyA9PSAzIH4gImFjcXVhaW50YW5jZXM6IG5vIG9uZSIpLA0KICANCiAgZWNpdl9jb21wX2VkdWMgPSBjYXNlX3doZW4oDQogICAgZWNpdl9jb21wX2VkdWMgPT0gMSB+ICJlZHVjYXRpb246IGEgcXVhcnRlciAoMjUlKSIsDQogICAgZWNpdl9jb21wX2VkdWMgPT0gMiB+ICJlZHVjYXRpb246IGhhbGYgKDUwJSkiLA0KICAgIGVjaXZfY29tcF9lZHVjID09IDMgfiAiZWR1Y2F0aW9uOiB0aHJlZSBxdWFydGVycyAoNzUlKSIpLA0KICAgIA0KICBlbmJoX2NvbXBfZWR1YyA9IGNhc2Vfd2hlbigNCiAgICBlbmJoX2NvbXBfZWR1YyA9PSAxIH4gImVkdWNhdGlvbjogYSBxdWFydGVyICgyNSUpIiwNCiAgICBlbmJoX2NvbXBfZWR1YyA9PSAyIH4gImVkdWNhdGlvbjogaGFsZiAoNTAlKSIsDQogICAgZW5iaF9jb21wX2VkdWMgPT0gMyB+ICJlZHVjYXRpb246IHRocmVlIHF1YXJ0ZXJzICg3NSUpIiksDQogIA0KICBlY2l2X2NvbXBfYWdlID0gY2FzZV93aGVuKA0KICAgIGVjaXZfY29tcF9hZ2UgPT0gMSB+ICJhZ2U6IGEgcXVhcnRlciAoMjUlKSIsDQogICAgZWNpdl9jb21wX2FnZSA9PSAyIH4gImFnZToganVzdCB1bmRlciBoYWxmICg0MCUpIiwNCiAgICBlY2l2X2NvbXBfYWdlID09IDMgfiAiYWdlOiBoYWxmICg1MCUpIiksDQogIA0KICBlbmJoX2NvbXBfYWdlID0gY2FzZV93aGVuKA0KICAgIGVuYmhfY29tcF9hZ2UgPT0gMSB+ICJhZ2U6IGEgcXVhcnRlciAoMjUlKSIsDQogICAgZW5iaF9jb21wX2FnZSA9PSAyIH4gImFnZToganVzdCB1bmRlciBoYWxmICg0MCUpIiwNCiAgICBlbmJoX2NvbXBfYWdlID09IDMgfiAiYWdlOiBoYWxmICg1MCUpIiksDQogIA0KICBlY2l2X2NvbXBfZXRoID0gY2FzZV93aGVuKA0KICAgIGVjaXZfY29tcF9ldGggPT0gMSB+ICJtaWdyYXRpb246IG5vbmUgKDAlKSIsDQogICAgZWNpdl9jb21wX2V0aCA9PSAyIH4gIm1pZ3JhdGlvbjogbWlub3JpdHkgKDEwJSkiLA0KICAgIGVjaXZfY29tcF9ldGggPT0gMyB+ICJtaWdyYXRpb246IGEgcXVhcnRlciAoMjUlKSIpLA0KICANCiAgZW5iaF9jb21wX2V0aCA9IGNhc2Vfd2hlbigNCiAgICBlbmJoX2NvbXBfZXRoID09IDEgfiAibWlncmF0aW9uOiBub25lICgwJSkiLA0KICAgIGVuYmhfY29tcF9ldGggPT0gMiB+ICJtaWdyYXRpb246IG1pbm9yaXR5ICgxMCUpIiwNCiAgICBlbmJoX2NvbXBfZXRoID09IDMgfiAibWlncmF0aW9uOiBhIHF1YXJ0ZXIgKDI1JSkiKQ0KICApDQoNCiNsYXN0LCByZW9yZGVyIGF0dHJpYnV0ZSBsZXZlbHMNCnsNCiAgI2Npdg0KICBkZl9sb25nJGVjaXZfdGltZSA8LSBmYWN0b3IoZGZfbG9uZyRlY2l2X3RpbWUsIGxldmVscyA9IHJldihjKCJ0cmF2ZWwgdGltZTogMTAgbWludXRlcyIsICJ0cmF2ZWwgdGltZTogMTUgbWludXRlcyIsICJ0cmF2ZWwgdGltZTogMjAgbWludXRlcyIpKSkNCiAgZGZfbG9uZyRlY2l2X2Nvc3QgPC0gZmFjdG9yKGRmX2xvbmckZWNpdl9jb3N0LCBsZXZlbHMgPSByZXYoYygiY29zdHM6IDcwJSBvZiBjdXJyZW50IGNvbnRyaWJ1dGlvbiIsImNvc3RzOiA5MCUgb2YgY3VycmVudCBjb250cmlidXRpb24iLCJjb3N0czogMTAwJSBvZiBjdXJyZW50IGNvbnRyaWJ1dGlvbiIsICJjb3N0czogMTEwJSBvZiBjdXJyZW50IGNvbnRyaWJ1dGlvbiIsImNvc3RzOiAxMzAlIG9mIGN1cnJlbnQgY29udHJpYnV0aW9uIikpKQ0KICBkZl9sb25nJGVjaXZfY29oZXNpb24gPC0gZmFjdG9yKGRmX2xvbmckZWNpdl9jb2hlc2lvbiwgbGV2ZWxzID0gcmV2KGMoICJjb2hlc2lvbjogcGVvcGxlIGtub3cgZWFjaCBvdGhlciB3ZWxsIiwgImNvaGVzaW9uOiBzb21lIGtub3cgZWFjaCBvdGhlciB3ZWxsLCBvdGhlcnMgb25seSBieSBzaWdodCIsImNvaGVzaW9uOiBwZW9wbGUga25vdyBlYWNoIG90aGVyIG9ubHkgYnkgc2lnaHQiICkpKQ0KICBkZl9sb25nJGVjaXZfYWNxdWFpbnRhbmNlcyA8LSBmYWN0b3IoZGZfbG9uZyRlY2l2X2FjcXVhaW50YW5jZXMsIGxldmVscyA9IHJldihjKCJhY3F1YWludGFuY2VzOiBubyBvbmUiLCAiYWNxdWFpbnRhbmNlczogb25lIHBlcnNvbiIsICJhY3F1YWludGFuY2VzOiBtdWx0aXBsZSIpKSkNCiAgZGZfbG9uZyRlY2l2X2NvbXBfZWR1YyA8LSBmYWN0b3IoZGZfbG9uZyRlY2l2X2NvbXBfZWR1YywgbGV2ZWxzID0gcmV2KGMoImVkdWNhdGlvbjogYSBxdWFydGVyICgyNSUpIiwgImVkdWNhdGlvbjogaGFsZiAoNTAlKSIsImVkdWNhdGlvbjogdGhyZWUgcXVhcnRlcnMgKDc1JSkiKSkpDQogIGRmX2xvbmckZWNpdl9jb21wX2FnZSA8LSBmYWN0b3IoZGZfbG9uZyRlY2l2X2NvbXBfYWdlLCBsZXZlbHMgPSByZXYoYygiYWdlOiBhIHF1YXJ0ZXIgKDI1JSkiLCJhZ2U6IGp1c3QgdW5kZXIgaGFsZiAoNDAlKSIsImFnZTogaGFsZiAoNTAlKSIpKSkNCiAgZGZfbG9uZyRlY2l2X2NvbXBfZXRoIDwtIGZhY3RvcihkZl9sb25nJGVjaXZfY29tcF9ldGgsIGxldmVscyA9IHJldihjKCJtaWdyYXRpb246IG5vbmUgKDAlKSIsICJtaWdyYXRpb246IG1pbm9yaXR5ICgxMCUpIiwgIm1pZ3JhdGlvbjogYSBxdWFydGVyICgyNSUpIikpKQ0KICAjbmJoDQogIGRmX2xvbmckZW5iaF90aW1lIDwtIGZhY3RvcihkZl9sb25nJGVuYmhfdGltZSwgbGV2ZWxzID0gcmV2KGMoInRyYXZlbCB0aW1lIHRvIGZhY2lsaXRpZXM6IDEwIG1pbnV0ZXMiLCAidHJhdmVsIHRpbWUgdG8gZmFjaWxpdGllczogMTUgbWludXRlcyIsICJ0cmF2ZWwgdGltZSB0byBmYWNpbGl0aWVzOiAyMCBtaW51dGVzIikpKQ0KICBkZl9sb25nJGVuYmhfY29zdCA8LSBmYWN0b3IoZGZfbG9uZyRlbmJoX2Nvc3QsIGxldmVscyA9IHJldihjKCJjb3N0czogOTAlIG9mIGN1cnJlbnQgaG91c2luZyBleHBlbnNlcyIsImNvc3RzOiA5NSUgb2YgY3VycmVudCBob3VzaW5nIGV4cGVuc2VzIiwiY29zdHM6IDEwMCUgb2YgY3VycmVudCBob3VzaW5nIGV4cGVuc2VzIiwgImNvc3RzOiAxMDUlIG9mIGN1cnJlbnQgaG91c2luZyBleHBlbnNlcyIsImNvc3RzOiAxMTAlIG9mIGN1cnJlbnQgaG91c2luZyBleHBlbnNlcyIpKSkNCiAgZGZfbG9uZyRlbmJoX2NvaGVzaW9uIDwtIGZhY3RvcihkZl9sb25nJGVuYmhfY29oZXNpb24sIGxldmVscyA9IHJldihjKCAiY29oZXNpb246IG5laWdoYm9ycyBrbm93IGVhY2ggb3RoZXIgd2VsbCIsICJjb2hlc2lvbjogc29tZSBrbm93IGVhY2ggb3RoZXIgd2VsbCwgb3RoZXJzIG9ubHkgYnkgc2lnaHQiLCJjb2hlc2lvbjogbmVpZ2hib3JzIGtub3cgZWFjaCBvdGhlciBvbmx5IGJ5IHNpZ2h0IiApKSkNCiAgZGZfbG9uZyRlbmJoX2FjcXVhaW50YW5jZXMgPC0gZmFjdG9yKGRmX2xvbmckZW5iaF9hY3F1YWludGFuY2VzLCBsZXZlbHMgPSByZXYoYygiYWNxdWFpbnRhbmNlczogbm8gb25lIiwgImFjcXVhaW50YW5jZXM6IG9uZSBwZXJzb24iLCAiYWNxdWFpbnRhbmNlczogbXVsdGlwbGUiKSkpDQogIGRmX2xvbmckZW5iaF9jb21wX2VkdWMgPC0gZmFjdG9yKGRmX2xvbmckZW5iaF9jb21wX2VkdWMsIGxldmVscyA9IHJldihjKCJlZHVjYXRpb246IGEgcXVhcnRlciAoMjUlKSIsICJlZHVjYXRpb246IGhhbGYgKDUwJSkiLCJlZHVjYXRpb246IHRocmVlIHF1YXJ0ZXJzICg3NSUpIikpKQ0KICBkZl9sb25nJGVuYmhfY29tcF9hZ2UgPC0gZmFjdG9yKGRmX2xvbmckZW5iaF9jb21wX2FnZSwgbGV2ZWxzID0gcmV2KGMoImFnZTogYSBxdWFydGVyICgyNSUpIiwiYWdlOiBqdXN0IHVuZGVyIGhhbGYgKDQwJSkiLCJhZ2U6IGhhbGYgKDUwJSkiKSkpDQogIGRmX2xvbmckZW5iaF9jb21wX2V0aCA8LSBmYWN0b3IoZGZfbG9uZyRlbmJoX2NvbXBfZXRoLCBsZXZlbHMgPSByZXYoYygibWlncmF0aW9uOiBub25lICgwJSkiLCAibWlncmF0aW9uOiBtaW5vcml0eSAoMTAlKSIsICJtaWdyYXRpb246IGEgcXVhcnRlciAoMjUlKSIpKSkNCn0NCg0KZGZfbG9uZyA8LSBkZl9sb25nICU+JQ0KICBzZWxlY3QoDQogICAgZXZlcnl0aGluZygpLA0KICAgICMgcmVtb3ZlIHJlZHVuZGFudCBjb2x1bW5zLA0KICAgICMgcmV0YWluIG9ubHkgdGhlIHJlcGVhdGVkIGNob2ljZSB0YXNrcyBuZWVkZWQgZm9yIGJpYXMgY29ycmVjdGlvbg0KICAgICMgYW5kIHRoZSBibG9ja19vcmRlcg0KICAgIC13aGljaChzdGFydHNXaXRoKG5hbWVzKC4pLCAieHMiKSAmICEobmFtZXMoLikgJWluJSBjKCJ4czIzYTE2NSIsICJ4czIzYTE2OSIsICJ4czIzYTE5MSIsICJ4czIzYTE5NSIsICJ4czIzYTAyNiIpKSkNCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIGZpcnN0X29yZ19jaG9pY2UgPSB4czIzYTE2NSwNCiAgICByZXBfb3JnX2Nob2ljZSA9IHhzMjNhMTY5LA0KICAgIGZpcnN0X25iaF9jaG9pY2UgPSB4czIzYTE5MSwNCiAgICByZXBfbmJoX2Nob2ljZSA9IHhzMjNhMTk1LA0KICAgIGJsb2NrX29yZGVyID0geHMyM2EwMjYNCiAgKQ0KYGBgIA0KDQotLS0tDQoNCiMgU2F2ZSBkYXRhDQoNCmBgYHtyLCBldmFsID0gRkFMU0V9DQpmc2F2ZShkZl9sb25nLCAiY29uam9pbnRfbGlzcy5SZGEiKQ0KYGBgIA0KDQotLS0NCg0KIyBSZWZlcmVuY2VzDQoNCg==


Copyright © Rob Franken / Kasimir Dederichs / Dingeman Wiertz / Jochem Tolsma