In this script, I select, recode and create variables of motivaction
data.
rm(list = ls())
library(plyr)
library(dplyr)
library(foreign)
library(tidyverse)
library(labelled)
getwd()
Motivaction data
#Load in motivaction trend file from local folder
motivaction <- foreign::read.spss("C:/climate_data/motivaction.sav", use.value.labels = T, to.data.frame = T)
#Both years are in this dataset, so I make sub datasets. I only include group A, as they have filled out the questions that I am interested in.
table(motivaction$nGroep)
summary(motivaction$nKOP1)
mot2019 <- motivaction %>% filter(nGroep == "Groep A") %>%
filter (nKOP1 == "Meting 2019") %>%
select(nStedelijkheid, nHuishoudsamenstelling, nInkomencat, nGeslacht, xopleidvolt, nOplcatVolt, xlft, iQ20211_8, nQ40, nQ40Extra, iQ41_1:iQ41_5, iQ43, nQ46_1:nQ46_5, iQ50_1, iQ50_2, iQ51_1:iQ51_3, iQ52)
table(mot2019$iQ20211_8, useNA = "always") #only missings so don't include
table(mot2019$nQ40, useNA = "always")
mot2019$cchange_mot <- as.numeric(mot2019$nQ40)
mot2019$cchange_mot
mot2019$cchange_mot <- (as.numeric(mot2019$cchange_mot) - 1)* (6/3) + 1
table(mot2019$iQ41_1, useNA = "always")
mot2019$worried_mot <- as.numeric(mot2019$iQ41_1)
mot2019$worried_mot[mot2019$worried_mot == 6] <- NA
table(mot2019$iQ41_2, useNA = "always")
mot2019$futuregen <- as.numeric(mot2019$iQ41_2)
mot2019$futuregen[mot2019$futuregen == 6] <- NA
table(mot2019$iQ41_3, useNA = "always")
mot2019$nowor <- as.numeric(mot2019$iQ41_3)
mot2019 <- mot2019 %>%
mutate(across(c(nowor), ~recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5` = 1)))
table(mot2019$nowor, useNA = "always")
mot2019$nowor[mot2019$nowor == 6] <- NA
#Q41_4 is about Groningen, not really useful
table(mot2019$iQ41_5, useNA = "always")
mot2019$ontime <- as.numeric(mot2019$iQ41_5)
mot2019$ontime[mot2019$ontime == 6] <- NA
table(mot2019$iQ43, useNA = "always")
mot2019$gov <- as.numeric(mot2019$iQ43)
mot2019$gov[mot2019$gov == 6] <- NA
#The following statements are about the responsibility of different groups. There is one answer category that states that the respondent doesn't think measures should be taken. I will code that together with the group "is not responsible" because it both means that you don't think those parties have to act to tackle climate change.
table(mot2019$nQ46_1, useNA = "always")
mot2019$resp_gov <- as.numeric(mot2019$nQ46_1)
mot2019$resp_gov[mot2019$resp_gov == 5] <- NA
mot2019$resp_gov[mot2019$resp_gov == 4] <- 1
table(mot2019$resp_gov, useNA = "always")
mot2019$resp_gov <- (as.numeric(mot2019$resp_gov) - 1)* (6/3) + 1
table(mot2019$nQ46_2, useNA = "always")
mot2019$resp_comp <- as.numeric(mot2019$nQ46_2)
mot2019$resp_comp[mot2019$resp_comp == 5] <- NA
mot2019$resp_comp[mot2019$resp_comp == 4] <- 1
table(mot2019$resp_comp, useNA = "always")
mot2019$resp_comp <- (as.numeric(mot2019$resp_comp) - 1)* (6/3) + 1
table(mot2019$nQ46_3, useNA = "always")
mot2019$resp_mkb <- as.numeric(mot2019$nQ46_3)
mot2019$resp_mkb[mot2019$resp_mkb == 5] <- NA
mot2019$resp_mkb[mot2019$resp_mkb == 4] <- 1
table(mot2019$resp_mkb, useNA = "always")
mot2019$resp_mkb <- (as.numeric(mot2019$resp_mkb) - 1)* (6/3) + 1
table(mot2019$nQ46_4, useNA = "always")
mot2019$resp_citiz_mot <- as.numeric(mot2019$nQ46_4)
mot2019$resp_citiz_mot[mot2019$resp_citiz_mot == 5] <- NA
mot2019$resp_citiz_mot[mot2019$resp_citiz_mot == 4] <- 1
table(mot2019$resp_citiz_mot, useNA = "always")
mot2019$resp_citiz_mot <- (as.numeric(mot2019$resp_citiz_mot) - 1)* (6/3) + 1
table(mot2019$nQ46_5, useNA = "always")
mot2019$resp_you <- as.numeric(mot2019$nQ46_5)
mot2019$resp_you[mot2019$resp_you == 5] <- NA
mot2019$resp_you[mot2019$resp_you == 4] <- 1
table(mot2019$resp_you, useNA = "always")
mot2019$resp_you <- (as.numeric(mot2019$resp_you) - 1)* (6/3) + 1
table(mot2019$iQ50_1, useNA = "always")
mot2019$pers_resp_mot <- as.numeric(mot2019$iQ50_1)
mot2019$pers_resp_mot[mot2019$pers_resp_mot == 6] <- NA
table(mot2019$iQ50_2, useNA = "always")
mot2019$sust_choice <- as.numeric(mot2019$iQ50_2)
mot2019$sust_choice[mot2019$sust_choice == 6] <- NA
table(mot2019$iQ51_1, useNA = "always")
mot2019$contr <- as.numeric(mot2019$iQ51_1)
mot2019$contr[mot2019$contr == 6] <- NA
table(mot2019$iQ51_2, useNA = "always")
mot2019$energy <- as.numeric(mot2019$iQ51_2)
mot2019$energy[mot2019$energy == 6] <- NA
table(mot2019$iQ51_3, useNA = "always")
mot2019$noidea <- as.numeric(mot2019$iQ51_3)
mot2019$noidea[mot2019$noidea == 6] <- NA
table(mot2019$iQ52, useNA = "always")
mot2019$motiv <- as.numeric(mot2019$iQ52)
mot2019$motiv[mot2019$motiv == 6] <- NA
# Independent variables
# Gender, education, age, urbanity and marital status
table(mot2019$nGeslacht, useNA = "always")
mot2019$sex <- revalue(mot2019$nGeslacht, c("Man"="1", "Vrouw"="2"))
# 84 have a different marital status than single or living together. I don't want to throw them away, but as they're not living together at least (and have partner influence probably) I will code them in the category of single.
table(mot2019$nHuishoudsamenstelling, useNA = "always")
mot2019$nHuishoudsamenstelling <- as.numeric(mot2019$nHuishoudsamenstelling)
mot2019$marstat[mot2019$nHuishoudsamenstelling ==2 ] <- 1 #Living together
mot2019$marstat[mot2019$nHuishoudsamenstelling != 2] <- 2 #Not living together
mot2019$marstat <- as.factor(mot2019$marstat)
table(mot2019$marstat, useNA = "always")
table(mot2019$xopleidvolt, useNA = "always")
mot2019$educ <- as.numeric(mot2019$xopleidvolt)
table(mot2019$educ, useNA = "always")
mot2019$isced[mot2019$educ == 2 | mot2019$educ == 9] <- 5
mot2019$isced[mot2019$educ == 1] <- 6
mot2019$isced[mot2019$educ == 3 | mot2019$educ == 4] <- 3
mot2019$isced[mot2019$educ == 5 | mot2019$educ == 6] <- 2
mot2019$isced[mot2019$educ == 7] <- 1
mot2019$isced[mot2019$educ == 8] <- 0
mot2019$isced_cat[mot2019$isced <=2] <- "Basic"
mot2019$isced_cat[mot2019$isced == 3 | mot2019$isced == 4] <- "Intermediate"
mot2019$isced_cat[mot2019$isced >=5] <- "Advanced"
mot2019$isced_cat <- factor(mot2019$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(mot2019$isced_cat)
table(mot2019$nStedelijkheid, useNA = "always")
mot2019$urban <- revalue(mot2019$nStedelijkheid, c("Niet stedelijk"= "Low urbanity", "Weinig stedelijk"= "Low urbanity", "Matig stedelijk"="Medium urbanity", "Sterk stedelijk" = "High urbanity", "Zeer sterk stedelijk" = "High urbanity" ))
mot2019$urban <- factor(mot2019$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(mot2019$urban, useNA = "always") # Urbanity unknown is now a missing
table(mot2019$xlft, useNA = "always") # no missings on age
mot2019$age <- mot2019$xlft
#Let's first save the prepped data.
save(mot2019, file="./data/all_waves/mot2019.Rdata")
# Now exactly the same for 2021
mot2021 <- motivaction %>% filter(nGroep == "Groep A") %>%
filter (nKOP1 == "Meting 2021") %>%
select(nStedelijkheid, nHuishoudsamenstelling, nInkomencat, nGeslacht, xopleidvolt, nOplcatVolt, xlft, iQ20211_8, nQ40, nQ40Extra, iQ41_1:iQ41_5, iQ43, nQ46_1:nQ46_5, iQ50_1, iQ50_2, iQ51_1:iQ51_3, iQ52)
table(mot2021$iQ20211_8, useNA = "always") #only missings so don't include
table(mot2021$nQ40, useNA = "always")
mot2021$cchange_mot <- as.numeric(mot2021$nQ40)
mot2021$cchange_mot
mot2021$cchange_mot <- (as.numeric(mot2021$cchange_mot) - 1)* (6/3) + 1
table(mot2021$iQ41_1, useNA = "always")
mot2021$worried_mot <- as.numeric(mot2021$iQ41_1)
mot2021$worried_mot[mot2021$worried_mot == 6] <- NA
table(mot2021$iQ41_2, useNA = "always")
mot2021$futuregen <- as.numeric(mot2021$iQ41_2)
mot2021$futuregen[mot2021$futuregen == 6] <- NA
table(mot2021$iQ41_3, useNA = "always")
mot2021$nowor <- as.numeric(mot2021$iQ41_3)
mot2021 <- mot2021 %>%
mutate(across(c(nowor), ~recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5` = 1)))
table(mot2021$nowor, useNA = "always")
mot2021$nowor[mot2021$nowor == 6] <- NA
#Q41_4 is about Groningen, not really useful
table(mot2021$iQ41_5, useNA = "always")
mot2021$ontime <- as.numeric(mot2021$iQ41_5)
mot2021$ontime[mot2021$ontime == 6] <- NA
table(mot2021$iQ43, useNA = "always")
mot2021$gov <- as.numeric(mot2021$iQ43)
mot2021$gov[mot2021$gov == 6] <- NA
#The following statements are about the responsibility of different groups. There is one answer category that states that the respondent doesn't think measures should be taken. I will code that together with the group "is not responsible" because it both means that you don't think those parties have to act to tackle climate change.
table(mot2021$nQ46_1, useNA = "always")
mot2021$resp_gov <- as.numeric(mot2021$nQ46_1)
mot2021$resp_gov[mot2021$resp_gov == 5] <- NA
mot2021$resp_gov[mot2021$resp_gov == 4] <- 1
table(mot2021$resp_gov, useNA = "always")
mot2021$resp_gov <- (as.numeric(mot2021$resp_gov) - 1)* (6/3) + 1
table(mot2021$nQ46_2, useNA = "always")
mot2021$resp_comp <- as.numeric(mot2021$nQ46_2)
mot2021$resp_comp[mot2021$resp_comp == 5] <- NA
mot2021$resp_comp[mot2021$resp_comp == 4] <- 1
table(mot2021$resp_comp, useNA = "always")
mot2021$resp_comp <- (as.numeric(mot2021$resp_comp) - 1)* (6/3) + 1
table(mot2021$nQ46_3, useNA = "always")
mot2021$resp_mkb <- as.numeric(mot2021$nQ46_3)
mot2021$resp_mkb[mot2021$resp_mkb == 5] <- NA
mot2021$resp_mkb[mot2021$resp_mkb == 4] <- 1
table(mot2021$resp_mkb, useNA = "always")
mot2021$resp_mkb <- (as.numeric(mot2021$resp_mkb) - 1)* (6/3) + 1
table(mot2021$nQ46_4, useNA = "always")
mot2021$resp_citiz_mot <- as.numeric(mot2021$nQ46_4)
mot2021$resp_citiz_mot[mot2021$resp_citiz_mot == 5] <- NA
mot2021$resp_citiz_mot[mot2021$resp_citiz_mot == 4] <- 1
table(mot2021$resp_citiz_mot, useNA = "always")
mot2021$resp_citiz_mot <- (as.numeric(mot2021$resp_citiz_mot) - 1)* (6/3) + 1
table(mot2021$nQ46_5, useNA = "always")
mot2021$resp_you <- as.numeric(mot2021$nQ46_5)
mot2021$resp_you[mot2021$resp_you == 5] <- NA
mot2021$resp_you[mot2021$resp_you == 4] <- 1
table(mot2021$resp_you, useNA = "always")
mot2021$resp_you <- (as.numeric(mot2021$resp_you) - 1)* (6/3) + 1
table(mot2021$iQ50_1, useNA = "always")
mot2021$pers_resp_mot <- as.numeric(mot2021$iQ50_1)
mot2021$pers_resp_mot[mot2021$pers_resp_mot == 6] <- NA
table(mot2021$iQ50_2, useNA = "always")
mot2021$sust_choice <- as.numeric(mot2021$iQ50_2)
mot2021$sust_choice[mot2021$sust_choice == 6] <- NA
table(mot2021$iQ51_1, useNA = "always")
mot2021$contr <- as.numeric(mot2021$iQ51_1)
mot2021$contr[mot2021$contr == 6] <- NA
table(mot2021$iQ51_2, useNA = "always")
mot2021$energy <- as.numeric(mot2021$iQ51_2)
mot2021$energy[mot2021$energy == 6] <- NA
table(mot2021$iQ51_3, useNA = "always")
mot2021$noidea <- as.numeric(mot2021$iQ51_3)
mot2021$noidea[mot2021$noidea == 6] <- NA
table(mot2021$iQ52, useNA = "always")
mot2021$motiv <- as.numeric(mot2021$iQ52)
mot2021$motiv[mot2021$motiv == 6] <- NA
# Independent variables
# Gender, education, age, urbanity and marital status
table(mot2021$nGeslacht, useNA = "always")
mot2021$sex <- revalue(mot2021$nGeslacht, c("Man"="1", "Vrouw"="2"))
# 84 have a different marital status than single or living together. I don't want to throw them away, but as they're not living together at least (and have partner influence probably) I will code them in the category of single.
table(mot2021$nHuishoudsamenstelling, useNA = "always")
mot2021$nHuishoudsamenstelling <- as.numeric(mot2021$nHuishoudsamenstelling)
mot2021$marstat[mot2021$nHuishoudsamenstelling ==2 ] <- 1 #Living together
mot2021$marstat[mot2021$nHuishoudsamenstelling != 2] <- 2 #Not living together
mot2021$marstat <- as.factor(mot2021$marstat)
table(mot2021$marstat, useNA = "always")
table(mot2021$xopleidvolt, useNA = "always")
mot2021$educ <- as.numeric(mot2021$xopleidvolt)
table(mot2021$educ, useNA = "always")
mot2021$isced[mot2021$educ == 2 | mot2021$educ == 9] <- 5
mot2021$isced[mot2021$educ == 1] <- 6
mot2021$isced[mot2021$educ == 3 | mot2021$educ == 4] <- 3
mot2021$isced[mot2021$educ == 5 | mot2021$educ == 6] <- 2
mot2021$isced[mot2021$educ == 7] <- 1
mot2021$isced[mot2021$educ == 8] <- 0
mot2021$isced_cat[mot2021$isced <=2] <- "Basic"
mot2021$isced_cat[mot2021$isced == 3 | mot2021$isced == 4] <- "Intermediate"
mot2021$isced_cat[mot2021$isced >=5] <- "Advanced"
mot2021$isced_cat <- factor(mot2021$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(mot2021$isced_cat)
table(mot2021$nStedelijkheid, useNA = "always")
mot2021$urban <- revalue(mot2021$nStedelijkheid, c("Niet stedelijk"= "Low urbanity", "Weinig stedelijk"= "Low urbanity", "Matig stedelijk"="Medium urbanity", "Sterk stedelijk" = "High urbanity", "Zeer sterk stedelijk" = "High urbanity" ))
mot2021$urban <- factor(mot2021$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(mot2021$urban, useNA = "always") # Urbanity unknown is now a missing
table(mot2021$xlft, useNA = "always") # no missings on age
mot2021$age <- mot2021$xlft
#Let's first save the prepped data.
save(mot2021, file="./data/all_waves/mot2021.Rdata")
# Merge the 2 datasets
# This R has some problem with viewing datasets?
# First create the weight variables (done in other script)
utils::View(mot2019) #Like this it works
mot2019$surveyyear <- 2019
mot2021$surveyyear <- 2021
mot2019 <- mot2019 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, urban, age, cchange_mot, worried_mot, futuregen, nowor, ontime, gov, resp_gov, resp_comp, resp_mkb, resp_citiz_mot, resp_you, pers_resp_mot, sust_choice, contr, energy, noidea, motiv, age_cat, weightvec)
mot2021 <- mot2021 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, urban, age, cchange_mot, worried_mot, futuregen, nowor, ontime, gov, resp_gov, resp_comp, resp_mkb, resp_citiz_mot, resp_you, pers_resp_mot, sust_choice, contr, energy, noidea, motiv, age_cat, weightvec)
mottotal <- dplyr::bind_rows(mot2019, mot2021)
mottotal$sex <- mottotal$sex - 1
save(mottotal, file="./data/final_data/mottotal.Rdata")
LISS data
# The LISS dataset has one question that is asked in 4 waves. The background variables are not part of the dataset, but have to be merged separately.
#Load both dependent variable and background variables
liss2019 <- foreign::read.spss("C:/climate_data/liss/energy2019.sav", use.value.labels = T, to.data.frame = T)
liss_bg2019 <- foreign::read.spss("C:/climate_data/liss/background2019.sav", use.value.labels = T, to.data.frame = T)
# Select the variables that I want
liss2019 <- liss2019 %>% select (su19a304, nomem_encr)
liss_bg2019 <- liss_bg2019 %>% select(nomem_encr, geslacht, leeftijd, woonvorm, burgstat, sted, oplcat)
liss2019 <- merge(liss2019, liss_bg2019, by = "nomem_encr", all = FALSE)
# First check out the dependent variable
table(liss2019$su19a304, useNA = "always") # 178 missings ,ranges from 0 to 10
liss2019$lifestyle <- (as.numeric(liss2019$su19a304) - 1)* (4/10) + 1
table(liss2019$lifestyle, useNA = "always")
# Now the independent variables
# Gender, education, age, urbanity and marital status
table(liss2019$geslacht, useNA = "always")
liss2019$sex <- revalue(liss2019$geslacht, c("Male"="1", "Female"="2"))
table(liss2019$woonvorm, useNA = "always")
liss2019$woonvorm <- as.numeric(liss2019$woonvorm)
liss2019$marstat[liss2019$woonvorm ==2 | liss2019$woonvorm == 3] <- 1 #Living together
liss2019$marstat[liss2019$woonvorm == 1 | liss2019$woonvorm == 4 | liss2019$woonvorm == 5] <- 2 #Not living together
liss2019$marstat <- as.factor(liss2019$marstat)
table(liss2019$marstat, useNA = "always")
table(liss2019$oplcat, useNA = "always")
liss2019$educ <- as.numeric(liss2019$oplcat)
table(liss2019$educ, useNA = "always")
liss2019$isced[liss2019$educ == 1] <- 1
liss2019$isced[liss2019$educ == 2] <- 2
liss2019$isced[liss2019$educ == 3 | liss2019$educ == 4] <- 3
liss2019$isced[liss2019$educ == 5 | liss2019$educ == 6] <- 5
table(liss2019$isced, useNA = "always")
mean(liss2019$isced, na.rm=T)
liss2019$isced[is.na(liss2019$isced)] <- 3.44
liss2019$isced_cat[liss2019$isced <=2] <- "Basic"
liss2019$isced_cat[liss2019$isced >= 3 & liss2019$isced <= 4] <- "Intermediate"
liss2019$isced_cat[liss2019$isced >=5] <- "Advanced"
liss2019$isced_cat <- factor(liss2019$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(liss2019$isced_cat, useNA = "always") #4 missings
table(liss2019$sted, useNA = "always")
liss2019$urban <- revalue(liss2019$sted, c("Not urban"= "Low urbanity", "Slightly urban"= "Low urbanity", "Moderately urban"="Medium urbanity", "Very urban" = "High urbanity", "Extremely urban" = "High urbanity" ))
liss2019$urban <- factor(liss2019$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(liss2019$urban, useNA = "always") # 20 missings
table(liss2019$leeftijd, useNA = "always") # no missings on age
liss2019$age <- liss2019$leeftijd
# Save dataset
save(liss2019, file="./data/all_waves/liss2019.Rdata")
#2020 has 2 waves, one in july and one in october
liss2020a <- foreign::read.spss("C:/climate_data/liss/covid720.sav", use.value.labels = T, to.data.frame = T)
liss_bg2020a <- foreign::read.spss("C:/climate_data/liss/background720.sav", use.value.labels = T, to.data.frame = T)
# Select the variables that I want
liss2020a <- liss2020a %>% select (uc20a056, nomem_encr)
liss_bg2020a <- liss_bg2020a %>% select(nomem_encr, geslacht, leeftijd, woonvorm, burgstat, sted, oplcat)
liss2020a <- merge(liss2020a, liss_bg2020a, by = "nomem_encr", all = FALSE)
# First check out the dependent variable
table(liss2020a$uc20a056, useNA = "always") # 91 missings ,ranges from 1 to 10
liss2020a$lifestyle <- (as.numeric(liss2020a$uc20a056) - 1)* (4/9) + 1
table(liss2020a$lifestyle, useNA = "always")
# Now the independent variables
# Gender, education, age, urbanity and marital status
table(liss2020a$geslacht, useNA = "always")
liss2020a$sex <- revalue(liss2020a$geslacht, c("Male"="1", "Female"="2"))
table(liss2020a$woonvorm, useNA = "always")
liss2020a$woonvorm <- as.numeric(liss2020a$woonvorm)
liss2020a$marstat[liss2020a$woonvorm ==2 | liss2020a$woonvorm == 3] <- 1 #Living together
liss2020a$marstat[liss2020a$woonvorm == 1 | liss2020a$woonvorm == 4 | liss2020a$woonvorm == 5] <- 2 #Not living together
liss2020a$marstat <- as.factor(liss2020a$marstat)
table(liss2020a$marstat, useNA = "always")
table(liss2020a$oplcat, useNA = "always")
liss2020a$educ <- as.numeric(liss2020a$oplcat)
table(liss2020a$educ, useNA = "always")
liss2020a$isced[liss2020a$educ == 1] <- 1
liss2020a$isced[liss2020a$educ == 2] <- 2
liss2020a$isced[liss2020a$educ == 3 | liss2020a$educ == 4] <- 3
liss2020a$isced[liss2020a$educ == 5 | liss2020a$educ == 6] <- 5
table(liss2020a$isced, useNA = "always")
mean(liss2020a$isced, na.rm=T)
liss2020a$isced[is.na(liss2020a$isced)] <- 3.5
liss2020a$isced_cat[liss2020a$isced <=2] <- "Basic"
liss2020a$isced_cat[liss2020a$isced >= 3 & liss2020a$isced <= 4] <- "Intermediate"
liss2020a$isced_cat[liss2020a$isced >=5] <- "Advanced"
liss2020a$isced_cat <- factor(liss2020a$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(liss2020a$isced_cat, useNA = "always")
table(liss2020a$sted, useNA = "always")
liss2020a$urban <- revalue(liss2020a$sted, c("Not urban"= "Low urbanity", "Slightly urban"= "Low urbanity", "Moderately urban"="Medium urbanity", "Very urban" = "High urbanity", "Extremely urban" = "High urbanity" ))
liss2020a$urban <- factor(liss2020a$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(liss2020a$urban, useNA = "always") # 11 missings
table(liss2020a$leeftijd, useNA = "always") # no missings on age
liss2020a$age <- liss2020a$leeftijd
# Save dataset
save(liss2020a, file="./data/all_waves/liss2020a.Rdata")
# And for the second dataset of 2020
liss2020b <- foreign::read.spss("C:/climate_data/liss/covid1020.sav", use.value.labels = T, to.data.frame = T)
liss_bg2020b <- foreign::read.spss("C:/climate_data/liss/background1020.sav", use.value.labels = T, to.data.frame = T)
# Select the variables that I want
liss2020b <- liss2020b %>% select (uc20b056, nomem_encr)
liss_bg2020b <- liss_bg2020b %>% select(nomem_encr, geslacht, leeftijd, woonvorm, burgstat, sted, oplcat)
liss2020b <- merge(liss2020b, liss_bg2020b, by = "nomem_encr", all = FALSE)
# First check out the dependent variable
table(liss2020b$uc20b056, useNA = "always") # 111 missings ,ranges from 1 to 10
liss2020b$lifestyle <- (as.numeric(liss2020b$uc20b056) - 1)* (4/9) + 1
table(liss2020b$lifestyle, useNA = "always")
# Now the independent variables
# Gender, education, age, urbanity and marital status
table(liss2020b$geslacht, useNA = "always")
liss2020b$sex <- revalue(liss2020b$geslacht, c("Male"="1", "Female"="2"))
table(liss2020b$woonvorm, useNA = "always")
liss2020b$woonvorm <- as.numeric(liss2020b$woonvorm)
liss2020b$marstat[liss2020b$woonvorm ==2 | liss2020b$woonvorm == 3] <- 1 #Living together
liss2020b$marstat[liss2020b$woonvorm == 1 | liss2020b$woonvorm == 4 | liss2020b$woonvorm == 5] <- 2 #Not living together
liss2020b$marstat <- as.factor(liss2020b$marstat)
table(liss2020b$marstat, useNA = "always")
table(liss2020b$oplcat, useNA = "always")
liss2020b$educ <- as.numeric(liss2020b$oplcat)
table(liss2020b$educ, useNA = "always")
liss2020b$isced[liss2020b$educ == 1] <- 1
liss2020b$isced[liss2020b$educ == 2] <- 2
liss2020b$isced[liss2020b$educ == 3 | liss2020b$educ == 4] <- 3
liss2020b$isced[liss2020b$educ == 5 | liss2020b$educ == 6] <- 5
table(liss2020b$isced, useNA = "always")
mean(liss2020b$isced, na.rm=T)
liss2020b$isced[is.na(liss2020b$isced)] <- 3.49
liss2020b$isced_cat[liss2020b$isced <=2] <- "Basic"
liss2020b$isced_cat[liss2020b$isced >= 3 & liss2020b$isced <= 4] <- "Intermediate"
liss2020b$isced_cat[liss2020b$isced >=5] <- "Advanced"
liss2020b$isced_cat <- factor(liss2020b$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(liss2020b$isced_cat, useNA = "always") #4 missings
table(liss2020b$sted, useNA = "always")
liss2020b$urban <- revalue(liss2020b$sted, c("Not urban"= "Low urbanity", "Slightly urban"= "Low urbanity", "Moderately urban"="Medium urbanity", "Very urban" = "High urbanity", "Extremely urban" = "High urbanity" ))
liss2020b$urban <- factor(liss2020b$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(liss2020b$urban, useNA = "always") # 9 missings
table(liss2020b$leeftijd, useNA = "always") # no missings on age
liss2020b$age <- liss2020b$leeftijd
# Save dataset
save(liss2020b, file="./data/all_waves/liss2020b.Rdata")
# And the last wave in 2021
liss2021 <- foreign::read.spss("C:/climate_data/liss/covid721.sav", use.value.labels = T, to.data.frame = T)
liss_bg2021 <- foreign::read.spss("C:/climate_data/liss/background721.sav", use.value.labels = T, to.data.frame = T)
# Select the variables that I want
liss2021 <- liss2021 %>% select (uc21c056, nomem_encr)
liss_bg2021 <- liss_bg2021 %>% select(nomem_encr, geslacht, leeftijd, woonvorm, burgstat, sted, oplcat)
liss2021 <- merge(liss2021, liss_bg2021, by = "nomem_encr", all = FALSE)
# First check out the dependent variable
table(liss2021$uc21c056, useNA = "always") # 106 missings ,ranges from 1 to 10
liss2021$lifestyle <- (as.numeric(liss2021$uc21c056) - 1)* (4/9) + 1
table(liss2021$lifestyle, useNA = "always")
# Now the independent variables
# Gender, education, age, urbanity and marital status
table(liss2021$geslacht, useNA = "always")
liss2021$sex <- revalue(liss2021$geslacht, c("Male"="1", "Female"="2"))
table(liss2021$woonvorm, useNA = "always")
liss2021$woonvorm <- as.numeric(liss2021$woonvorm)
liss2021$marstat[liss2021$woonvorm ==2 | liss2021$woonvorm == 3] <- 1 #Living together
liss2021$marstat[liss2021$woonvorm == 1 | liss2021$woonvorm == 4 | liss2021$woonvorm == 5] <- 2 #Not living together
liss2021$marstat <- as.factor(liss2021$marstat)
table(liss2021$marstat, useNA = "always")
table(liss2021$oplcat, useNA = "always")
liss2021$educ <- as.numeric(liss2021$oplcat)
table(liss2021$educ, useNA = "always")
liss2021$isced[liss2021$educ == 1] <- 1
liss2021$isced[liss2021$educ == 2] <- 2
liss2021$isced[liss2021$educ == 3 | liss2021$educ == 4] <- 3
liss2021$isced[liss2021$educ == 5 | liss2021$educ == 6] <- 5
table(liss2021$isced, useNA = "always")
mean(liss2021$isced, na.rm=T)
liss2021$isced[is.na(liss2021$isced)] <- 3.49
liss2021$isced_cat[liss2021$isced <=2] <- "Basic"
liss2021$isced_cat[liss2021$isced >= 3 & liss2021$isced <= 4] <- "Intermediate"
liss2021$isced_cat[liss2021$isced >=5] <- "Advanced"
liss2021$isced_cat <- factor(liss2021$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(liss2021$isced_cat, useNA = "always") #4 missings
table(liss2021$sted, useNA = "always")
liss2021$urban <- revalue(liss2021$sted, c("Not urban"= "Low urbanity", "Slightly urban"= "Low urbanity", "Moderately urban"="Medium urbanity", "Very urban" = "High urbanity", "Extremely urban" = "High urbanity" ))
liss2021$urban <- factor(liss2021$urban, levels=c("Low urbanity", "Medium urbanity", "High urbanity"), ordered=TRUE)
table(liss2021$urban, useNA = "always") # 10 missings
table(liss2021$leeftijd, useNA = "always") # no missings on age
liss2021$age <- liss2021$leeftijd
# Save dataset
save(liss2021, file="./data/all_waves/liss2021.Rdata")
# Merge the four datasets, and first creating weights in other script
utils::View(liss2019)
liss2019$surveyyear <- 2019
liss2020a$surveyyear <- 2020.58
liss2020b$surveyyear <- 2020.83
liss2021$surveyyear <- 2021
liss2019 <- liss2019 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, urban, lifestyle, age_cat, weightvec)
liss2020a <- liss2020a %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, urban, lifestyle, age_cat, weightvec)
liss2020b <- liss2020b %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, urban, lifestyle, age_cat, weightvec)
liss2021 <- liss2021 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, urban, lifestyle, age_cat, weightvec)
lisstotal <- dplyr::bind_rows(liss2019, liss2020a, liss2020b, liss2021)
lisstotal$sex <- lisstotal$sex - 1
save(lisstotal, file="./data/final_data/lisstotal.Rdata")
SOCON data
rm(list=ls())
socon2020 <- foreign::read.spss("C:/climate_data/socon/socon2020.sav", use.value.labels = T, to.data.frame = T)
utils::View(socon2020)
socon2020 <- socon2020 %>% select(V0013, V0014, V0036, V0037, V0040, V7140)
# First dependent variable
table(socon2020$V7140, useNA = "always") # 113 missings, have to mirror the var
socon2020$fut_gen_socon <- as.numeric(socon2020$V7140)
socon2020 <- socon2020 %>%
mutate(across(c(fut_gen_socon), ~recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5` = 1)))
table(socon2020$fut_gen_socon, useNA = "always")
# Now the independent variable. Urbanity is not asked.
table(socon2020$V0013, useNA = "always") # 6 missings
socon2020$sex <- revalue(socon2020$V0013, c("male"="1", "female"="2"))
socon2020$age <- 2020 - socon2020$V0014
table(socon2020$age, useNA = "always") #6 missings
mean(socon2020$age, na.rm=T)
socon2020$age[is.na(socon2020$age)] <- 51.52
table(socon2020$V0036, useNA = "always") #72 missings
socon2020$marstat <- as.numeric(socon2020$V0036)
socon2020$marstat <- as.factor(socon2020$marstat)
table(socon2020$marstat, useNA = "always")
table(socon2020$V0040, useNA = "always")
socon2020$educ <- as.numeric(socon2020$V0040)
socon2020$isced[socon2020$educ == 1] <- 0
socon2020$isced[socon2020$educ == 2] <- 1
socon2020$isced[socon2020$educ == 3 | socon2020$educ == 4] <- 2
socon2020$isced[socon2020$educ == 5 | socon2020$educ == 6 | socon2020$educ ==7 | socon2020$educ ==8] <- 3
socon2020$isced[socon2020$educ == 9 | socon2020$educ == 10] <- 5
socon2020$isced[socon2020$educ == 11 | socon2020$educ == 12] <- 6
table(socon2020$isced, useNA = "always") #others now also missing
mean(socon2020$isced, na.rm=T)
socon2020$isced[is.na(socon2020$isced)] <- 3.5567
socon2020$isced_cat[socon2020$isced <=2] <- "Basic"
socon2020$isced_cat[socon2020$isced >= 3 & socon2020$isced <= 4] <- "Intermediate"
socon2020$isced_cat[socon2020$isced >=5] <- "Advanced"
socon2020$isced_cat <- factor(socon2020$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(socon2020$isced_cat, useNA = "always")
#Save dataset
save(socon2020, file="./data/all_waves/socon2020.Rdata")
# Socon 2021
socon2021 <- foreign::read.spss("C:/climate_data/socon/socon2021.sav", use.value.labels = T, to.data.frame = T)
table(socon2021$V0014, useNA = "always")
utils::View(socon2021)
socon2021 <- socon2021 %>% select(V0013, V0014, V0036, V0037, V0040, V7140)
# First dependent variable
table(socon2021$V7140, useNA = "always") # 96 missings, have to mirror the var
socon2021$fut_gen_socon <- as.numeric(socon2021$V7140)
socon2021 <- socon2021 %>%
mutate(across(c(fut_gen_socon), ~recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5` = 1)))
table(socon2021$fut_gen_socon, useNA = "always")
# Now the independent variable. Urbanity is not asked.
table(socon2021$V0013, useNA = "always") # 8 missings
socon2021$sex <- revalue(socon2021$V0013, c("male"="1", "female"="2"))
socon2021$age <- 2021 - socon2021$V0014
table(socon2021$age, useNA = "always") #7 missings
mean(socon2021$age, na.rm=T)
socon2021$age[is.na(socon2021$age)] <- 55.55
table(socon2021$V0036, useNA = "always") #61 missings
socon2021$marstat <- as.numeric(socon2021$V0036)
socon2021$marstat <- as.factor(socon2021$marstat)
table(socon2021$marstat, useNA = "always")
table(socon2021$V0040, useNA = "always")
socon2021$educ <- as.numeric(socon2021$V0040)
socon2021$isced[socon2021$educ == 1] <- 0
socon2021$isced[socon2021$educ == 2] <- 1
socon2021$isced[socon2021$educ == 3 | socon2021$educ == 4] <- 2
socon2021$isced[socon2021$educ == 5 | socon2021$educ == 6 | socon2021$educ ==7 | socon2021$educ ==8] <- 3
socon2021$isced[socon2021$educ == 9 | socon2021$educ == 10] <- 5
socon2021$isced[socon2021$educ == 11 | socon2021$educ == 12] <- 6
table(socon2021$isced, useNA = "always") #others now also missing
mean(socon2021$isced, na.rm=T)
socon2021$isced[is.na(socon2021$isced)] <- 3.6434
socon2021$isced_cat[socon2021$isced <=2] <- "Basic"
socon2021$isced_cat[socon2021$isced >= 3 | socon2021$isced <= 4] <- "Intermediate"
socon2021$isced_cat[socon2021$isced >=5] <- "Advanced"
socon2021$isced_cat <- factor(socon2021$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(socon2021$isced_cat, useNA = "always")
#Save dataset
save(socon2021, file="./data/all_waves/socon2021.Rdata")
# Socon 2022
socon2022 <- foreign::read.spss("C:/climate_data/socon/socon2022.sav", use.value.labels = T, to.data.frame = T)
utils::View(socon2022)
socon2022 <- socon2022 %>% select(V0013, V0014, V0036, V0037, V0040, V7140)
# First dependent variable
table(socon2022$V7140, useNA = "always") # 151 missings, have to mirror the var
socon2022$fut_gen_socon <- as.numeric(socon2022$V7140)
socon2022 <- socon2022 %>%
mutate(across(c(fut_gen_socon), ~recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5` = 1)))
table(socon2022$fut_gen_socon, useNA = "always")
# Now the independent variable. Urbanity is not asked.
table(socon2022$V0013, useNA = "always") # 3 missings, 6 other (also NA)
socon2022$sex <- revalue(socon2022$V0013, c("male"="1", "female"="2", "other" = NA))
table(socon2022$sex, useNA = "always")
socon2022$age <- 2022 - socon2022$V0014
table(socon2022$age, useNA = "always") #1 missing
mean(socon2022$age, na.rm=T)
socon2022$age[is.na(socon2022$age)] <- 51.17
table(socon2022$V0036, useNA = "always") #102 missings
socon2022$marstat <- as.numeric(socon2022$V0036)
socon2022$marstat <- as.factor(socon2022$marstat)
table(socon2022$marstat, useNA = "always")
table(socon2022$V0040, useNA = "always")
socon2022$educ <- as.numeric(socon2022$V0040)
socon2022$isced[socon2022$educ == 1] <- 0
socon2022$isced[socon2022$educ == 2] <- 1
socon2022$isced[socon2022$educ == 3 | socon2022$educ == 4] <- 2
socon2022$isced[socon2022$educ == 5 | socon2022$educ == 6 | socon2022$educ ==7 | socon2022$educ ==8] <- 3
socon2022$isced[socon2022$educ == 9 | socon2022$educ == 10] <- 5
socon2022$isced[socon2022$educ == 11 | socon2022$educ == 12] <- 6
table(socon2022$isced, useNA = "always") #others now also missing
mean(socon2022$isced, na.rm=T)
socon2022$isced[is.na(socon2022$isced)] <- 3.5922
socon2022$isced_cat[socon2022$isced <=2] <- "Basic"
socon2022$isced_cat[socon2022$isced >= 3 & socon2022$isced <= 4] <- "Intermediate"
socon2022$isced_cat[socon2022$isced >=5] <- "Advanced"
socon2022$isced_cat <- factor(socon2022$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(socon2022$isced_cat, useNA = "always")
#Save dataset
save(socon2022, file="./data/all_waves/socon2022.Rdata")
# Merge the datasets
utils::View(socon2020) #Like this it works
load("./data/all_waves/socon2020.Rdata")
socon2020$surveyyear <- 2020
socon2021$surveyyear <- 2021
socon2022$surveyyear <- 2022
socon2020 <- socon2020 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, fut_gen_socon, age_cat, weightvec)
socon2021 <- socon2021 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, fut_gen_socon, age_cat, weightvec)
socon2022 <- socon2022 %>% select(surveyyear, sex, marstat, educ, isced, isced_cat, age, fut_gen_socon, age_cat, weightvec)
#Fix the anesrake issue with age in 2021
socon2021$age_cat[socon2021$age >=15 & socon2021$age <= 30] <- 1
socon2021$age_cat[socon2021$age >=31 & socon2021$age <= 45] <- 2
socon2021$age_cat[socon2021$age >=46 & socon2021$age <= 60] <- 3
socon2021$age_cat[socon2021$age >=61] <- 4
socontotal <- dplyr::bind_rows(socon2020, socon2021, socon2022)
socontotal$sex <- socontotal$sex - 1
save(socontotal, file="./data/final_data/socontotal.Rdata")
LS0tDQp0aXRsZTogIkRhdGEgcHJlcGFyYXRpb24gTW90aXZhY3Rpb24sIExJU1MgYW5kIFNvY29uIGRhdGEiDQphdXRob3I6ICJBbnVzY2hrYSBQZWVsZW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChldmFsID0gRkFMU0UpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAxMDBweDsNCn0NCmBgYA0KDQpJbiB0aGlzIHNjcmlwdCwgSSBzZWxlY3QsIHJlY29kZSBhbmQgY3JlYXRlIHZhcmlhYmxlcyBvZiBtb3RpdmFjdGlvbiBkYXRhLg0KDQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZm9yZWlnbikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsYWJlbGxlZCkNCmdldHdkKCkNCmBgYA0KDQojIE1vdGl2YWN0aW9uIGRhdGEgey19DQpgYGB7cn0NCiNMb2FkIGluIG1vdGl2YWN0aW9uIHRyZW5kIGZpbGUgZnJvbSBsb2NhbCBmb2xkZXINCm1vdGl2YWN0aW9uIDwtIGZvcmVpZ246OnJlYWQuc3BzcygiQzovY2xpbWF0ZV9kYXRhL21vdGl2YWN0aW9uLnNhdiIsIHVzZS52YWx1ZS5sYWJlbHMgPSBULCAgdG8uZGF0YS5mcmFtZSA9IFQpDQoNCiNCb3RoIHllYXJzIGFyZSBpbiB0aGlzIGRhdGFzZXQsIHNvIEkgbWFrZSBzdWIgZGF0YXNldHMuIEkgb25seSBpbmNsdWRlIGdyb3VwIEEsIGFzIHRoZXkgaGF2ZSBmaWxsZWQgb3V0IHRoZSBxdWVzdGlvbnMgdGhhdCBJIGFtIGludGVyZXN0ZWQgaW4uIA0KDQp0YWJsZShtb3RpdmFjdGlvbiRuR3JvZXApDQoNCnN1bW1hcnkobW90aXZhY3Rpb24kbktPUDEpDQoNCm1vdDIwMTkgPC0gbW90aXZhY3Rpb24gJT4lIGZpbHRlcihuR3JvZXAgPT0gIkdyb2VwIEEiKSAgJT4lDQogICAgICAgICAgICAgICAgZmlsdGVyIChuS09QMSA9PSAiTWV0aW5nIDIwMTkiKSAlPiUNCiAgICAgICAgICAgIHNlbGVjdChuU3RlZGVsaWpraGVpZCwgbkh1aXNob3Vkc2FtZW5zdGVsbGluZywgbklua29tZW5jYXQsIG5HZXNsYWNodCwgeG9wbGVpZHZvbHQsIG5PcGxjYXRWb2x0LCB4bGZ0LCBpUTIwMjExXzgsIG5RNDAsIG5RNDBFeHRyYSwgaVE0MV8xOmlRNDFfNSwgaVE0MywgblE0Nl8xOm5RNDZfNSwgaVE1MF8xLCBpUTUwXzIsIGlRNTFfMTppUTUxXzMsIGlRNTIpDQoNCnRhYmxlKG1vdDIwMTkkaVEyMDIxMV84LCB1c2VOQSA9ICJhbHdheXMiKSAjb25seSBtaXNzaW5ncyBzbyBkb24ndCBpbmNsdWRlDQp0YWJsZShtb3QyMDE5JG5RNDAsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JGNjaGFuZ2VfbW90IDwtIGFzLm51bWVyaWMobW90MjAxOSRuUTQwKQ0KbW90MjAxOSRjY2hhbmdlX21vdA0KbW90MjAxOSRjY2hhbmdlX21vdCA8LSAoYXMubnVtZXJpYyhtb3QyMDE5JGNjaGFuZ2VfbW90KSAtIDEpKiAoNi8zKSArIDENCg0KdGFibGUobW90MjAxOSRpUTQxXzEsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHdvcnJpZWRfbW90IDwtIGFzLm51bWVyaWMobW90MjAxOSRpUTQxXzEpDQptb3QyMDE5JHdvcnJpZWRfbW90W21vdDIwMTkkd29ycmllZF9tb3QgPT0gNl0gPC0gTkENCg0KdGFibGUobW90MjAxOSRpUTQxXzIsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JGZ1dHVyZWdlbiA8LSBhcy5udW1lcmljKG1vdDIwMTkkaVE0MV8yKQ0KbW90MjAxOSRmdXR1cmVnZW5bbW90MjAxOSRmdXR1cmVnZW4gPT0gNl0gPC0gTkENCg0KdGFibGUobW90MjAxOSRpUTQxXzMsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JG5vd29yIDwtIGFzLm51bWVyaWMobW90MjAxOSRpUTQxXzMpDQptb3QyMDE5IDwtIG1vdDIwMTkgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhub3dvciksIH5yZWNvZGUoLiwgYDFgID0gNSwgYDJgID0gNCwgYDNgID0gMywgYDRgID0gMiwgYDVgID0gMSkpKQ0KdGFibGUobW90MjAxOSRub3dvciwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkbm93b3JbbW90MjAxOSRub3dvciA9PSA2XSA8LSBOQQ0KDQojUTQxXzQgaXMgYWJvdXQgR3JvbmluZ2VuLCBub3QgcmVhbGx5IHVzZWZ1bA0KdGFibGUobW90MjAxOSRpUTQxXzUsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JG9udGltZSA8LSBhcy5udW1lcmljKG1vdDIwMTkkaVE0MV81KQ0KbW90MjAxOSRvbnRpbWVbbW90MjAxOSRvbnRpbWUgPT0gNl0gPC0gTkENCg0KdGFibGUobW90MjAxOSRpUTQzLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRnb3YgPC0gYXMubnVtZXJpYyhtb3QyMDE5JGlRNDMpDQptb3QyMDE5JGdvdlttb3QyMDE5JGdvdiA9PSA2XSA8LSBOQQ0KDQoNCg0KI1RoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBhcmUgYWJvdXQgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGRpZmZlcmVudCBncm91cHMuIFRoZXJlIGlzIG9uZSBhbnN3ZXIgY2F0ZWdvcnkgdGhhdCBzdGF0ZXMgdGhhdCB0aGUgcmVzcG9uZGVudCBkb2Vzbid0IHRoaW5rIG1lYXN1cmVzIHNob3VsZCBiZSB0YWtlbi4gSSB3aWxsIGNvZGUgdGhhdCB0b2dldGhlciB3aXRoIHRoZSBncm91cCAiaXMgbm90IHJlc3BvbnNpYmxlIiBiZWNhdXNlIGl0IGJvdGggbWVhbnMgdGhhdCB5b3UgZG9uJ3QgdGhpbmsgdGhvc2UgcGFydGllcyBoYXZlIHRvIGFjdCB0byB0YWNrbGUgY2xpbWF0ZSBjaGFuZ2UuIA0KdGFibGUobW90MjAxOSRuUTQ2XzEsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHJlc3BfZ292IDwtIGFzLm51bWVyaWMobW90MjAxOSRuUTQ2XzEpDQptb3QyMDE5JHJlc3BfZ292W21vdDIwMTkkcmVzcF9nb3YgPT0gNV0gPC0gTkENCm1vdDIwMTkkcmVzcF9nb3ZbbW90MjAxOSRyZXNwX2dvdiA9PSA0XSA8LSAxDQp0YWJsZShtb3QyMDE5JHJlc3BfZ292LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRyZXNwX2dvdiA8LSAoYXMubnVtZXJpYyhtb3QyMDE5JHJlc3BfZ292KSAtIDEpKiAoNi8zKSArIDENCg0KdGFibGUobW90MjAxOSRuUTQ2XzIsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHJlc3BfY29tcCA8LSBhcy5udW1lcmljKG1vdDIwMTkkblE0Nl8yKQ0KbW90MjAxOSRyZXNwX2NvbXBbbW90MjAxOSRyZXNwX2NvbXAgPT0gNV0gPC0gTkENCm1vdDIwMTkkcmVzcF9jb21wW21vdDIwMTkkcmVzcF9jb21wID09IDRdIDwtIDENCnRhYmxlKG1vdDIwMTkkcmVzcF9jb21wLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRyZXNwX2NvbXAgPC0gKGFzLm51bWVyaWMobW90MjAxOSRyZXNwX2NvbXApIC0gMSkqICg2LzMpICsgMQ0KDQp0YWJsZShtb3QyMDE5JG5RNDZfMywgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkcmVzcF9ta2IgPC0gYXMubnVtZXJpYyhtb3QyMDE5JG5RNDZfMykNCm1vdDIwMTkkcmVzcF9ta2JbbW90MjAxOSRyZXNwX21rYiA9PSA1XSA8LSBOQQ0KbW90MjAxOSRyZXNwX21rYlttb3QyMDE5JHJlc3BfbWtiID09IDRdIDwtIDENCnRhYmxlKG1vdDIwMTkkcmVzcF9ta2IsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHJlc3BfbWtiIDwtIChhcy5udW1lcmljKG1vdDIwMTkkcmVzcF9ta2IpIC0gMSkqICg2LzMpICsgMQ0KDQp0YWJsZShtb3QyMDE5JG5RNDZfNCwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkcmVzcF9jaXRpel9tb3QgPC0gYXMubnVtZXJpYyhtb3QyMDE5JG5RNDZfNCkNCm1vdDIwMTkkcmVzcF9jaXRpel9tb3RbbW90MjAxOSRyZXNwX2NpdGl6X21vdCA9PSA1XSA8LSBOQQ0KbW90MjAxOSRyZXNwX2NpdGl6X21vdFttb3QyMDE5JHJlc3BfY2l0aXpfbW90ID09IDRdIDwtIDENCnRhYmxlKG1vdDIwMTkkcmVzcF9jaXRpel9tb3QsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHJlc3BfY2l0aXpfbW90IDwtIChhcy5udW1lcmljKG1vdDIwMTkkcmVzcF9jaXRpel9tb3QpIC0gMSkqICg2LzMpICsgMQ0KDQp0YWJsZShtb3QyMDE5JG5RNDZfNSwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkcmVzcF95b3UgPC0gYXMubnVtZXJpYyhtb3QyMDE5JG5RNDZfNSkNCm1vdDIwMTkkcmVzcF95b3VbbW90MjAxOSRyZXNwX3lvdSA9PSA1XSA8LSBOQQ0KbW90MjAxOSRyZXNwX3lvdVttb3QyMDE5JHJlc3BfeW91ID09IDRdIDwtIDENCnRhYmxlKG1vdDIwMTkkcmVzcF95b3UsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHJlc3BfeW91IDwtIChhcy5udW1lcmljKG1vdDIwMTkkcmVzcF95b3UpIC0gMSkqICg2LzMpICsgMQ0KDQoNCnRhYmxlKG1vdDIwMTkkaVE1MF8xLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRwZXJzX3Jlc3BfbW90IDwtIGFzLm51bWVyaWMobW90MjAxOSRpUTUwXzEpDQptb3QyMDE5JHBlcnNfcmVzcF9tb3RbbW90MjAxOSRwZXJzX3Jlc3BfbW90ID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMTkkaVE1MF8yLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRzdXN0X2Nob2ljZSA8LSBhcy5udW1lcmljKG1vdDIwMTkkaVE1MF8yKQ0KbW90MjAxOSRzdXN0X2Nob2ljZVttb3QyMDE5JHN1c3RfY2hvaWNlID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMTkkaVE1MV8xLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRjb250ciA8LSBhcy5udW1lcmljKG1vdDIwMTkkaVE1MV8xKQ0KbW90MjAxOSRjb250clttb3QyMDE5JGNvbnRyID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMTkkaVE1MV8yLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRlbmVyZ3kgPC0gYXMubnVtZXJpYyhtb3QyMDE5JGlRNTFfMikNCm1vdDIwMTkkZW5lcmd5W21vdDIwMTkkZW5lcmd5ID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMTkkaVE1MV8zLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRub2lkZWEgPC0gYXMubnVtZXJpYyhtb3QyMDE5JGlRNTFfMykNCm1vdDIwMTkkbm9pZGVhW21vdDIwMTkkbm9pZGVhID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMTkkaVE1MiwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkbW90aXYgPC0gYXMubnVtZXJpYyhtb3QyMDE5JGlRNTIpDQptb3QyMDE5JG1vdGl2W21vdDIwMTkkbW90aXYgPT0gNl0gPC0gTkENCg0KIyBJbmRlcGVuZGVudCB2YXJpYWJsZXMNCiMgR2VuZGVyLCBlZHVjYXRpb24sIGFnZSwgdXJiYW5pdHkgYW5kIG1hcml0YWwgc3RhdHVzIA0KdGFibGUobW90MjAxOSRuR2VzbGFjaHQsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JHNleCA8LSByZXZhbHVlKG1vdDIwMTkkbkdlc2xhY2h0LCBjKCJNYW4iPSIxIiwgIlZyb3V3Ij0iMiIpKQ0KDQojIDg0IGhhdmUgYSBkaWZmZXJlbnQgbWFyaXRhbCBzdGF0dXMgdGhhbiBzaW5nbGUgb3IgbGl2aW5nIHRvZ2V0aGVyLiBJIGRvbid0IHdhbnQgdG8gdGhyb3cgdGhlbSBhd2F5LCBidXQgYXMgdGhleSdyZSBub3QgbGl2aW5nIHRvZ2V0aGVyIGF0IGxlYXN0IChhbmQgaGF2ZSBwYXJ0bmVyIGluZmx1ZW5jZSBwcm9iYWJseSkgSSB3aWxsIGNvZGUgdGhlbSBpbiB0aGUgY2F0ZWdvcnkgb2Ygc2luZ2xlLg0KdGFibGUobW90MjAxOSRuSHVpc2hvdWRzYW1lbnN0ZWxsaW5nLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRuSHVpc2hvdWRzYW1lbnN0ZWxsaW5nIDwtIGFzLm51bWVyaWMobW90MjAxOSRuSHVpc2hvdWRzYW1lbnN0ZWxsaW5nKQ0KbW90MjAxOSRtYXJzdGF0W21vdDIwMTkkbkh1aXNob3Vkc2FtZW5zdGVsbGluZyA9PTIgXSA8LSAxICNMaXZpbmcgdG9nZXRoZXINCm1vdDIwMTkkbWFyc3RhdFttb3QyMDE5JG5IdWlzaG91ZHNhbWVuc3RlbGxpbmcgIT0gMl0gPC0gMiAjTm90IGxpdmluZyB0b2dldGhlcg0KbW90MjAxOSRtYXJzdGF0IDwtIGFzLmZhY3Rvcihtb3QyMDE5JG1hcnN0YXQpDQp0YWJsZShtb3QyMDE5JG1hcnN0YXQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnRhYmxlKG1vdDIwMTkkeG9wbGVpZHZvbHQsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDE5JGVkdWMgPC0gYXMubnVtZXJpYyhtb3QyMDE5JHhvcGxlaWR2b2x0KQ0KdGFibGUobW90MjAxOSRlZHVjLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAxOSRpc2NlZFttb3QyMDE5JGVkdWMgPT0gMiB8IG1vdDIwMTkkZWR1YyA9PSA5XSA8LSA1DQptb3QyMDE5JGlzY2VkW21vdDIwMTkkZWR1YyA9PSAxXSA8LSA2DQptb3QyMDE5JGlzY2VkW21vdDIwMTkkZWR1YyA9PSAzIHwgbW90MjAxOSRlZHVjID09IDRdIDwtIDMNCm1vdDIwMTkkaXNjZWRbbW90MjAxOSRlZHVjID09IDUgfCBtb3QyMDE5JGVkdWMgPT0gNl0gPC0gMg0KbW90MjAxOSRpc2NlZFttb3QyMDE5JGVkdWMgPT0gN10gPC0gMQ0KbW90MjAxOSRpc2NlZFttb3QyMDE5JGVkdWMgPT0gOF0gPC0gMA0KDQptb3QyMDE5JGlzY2VkX2NhdFttb3QyMDE5JGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0KbW90MjAxOSRpc2NlZF9jYXRbbW90MjAxOSRpc2NlZCA9PSAzIHwgbW90MjAxOSRpc2NlZCA9PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0KbW90MjAxOSRpc2NlZF9jYXRbbW90MjAxOSRpc2NlZCA+PTVdIDwtICJBZHZhbmNlZCINCm1vdDIwMTkkaXNjZWRfY2F0IDwtIGZhY3Rvcihtb3QyMDE5JGlzY2VkX2NhdCwgbGV2ZWxzPWMoIkJhc2ljIiwgIkludGVybWVkaWF0ZSIsICJBZHZhbmNlZCIpLCBvcmRlcmVkPVRSVUUpDQp0YWJsZShtb3QyMDE5JGlzY2VkX2NhdCkNCg0KdGFibGUobW90MjAxOSRuU3RlZGVsaWpraGVpZCwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMTkkdXJiYW4gPC0gcmV2YWx1ZShtb3QyMDE5JG5TdGVkZWxpamtoZWlkLCBjKCJOaWV0IHN0ZWRlbGlqayI9ICJMb3cgdXJiYW5pdHkiLCAiV2VpbmlnIHN0ZWRlbGlqayI9ICJMb3cgdXJiYW5pdHkiLCAiTWF0aWcgc3RlZGVsaWprIj0iTWVkaXVtIHVyYmFuaXR5IiwgIlN0ZXJrIHN0ZWRlbGlqayIgPSAiSGlnaCB1cmJhbml0eSIsICJaZWVyIHN0ZXJrIHN0ZWRlbGlqayIgPSAiSGlnaCB1cmJhbml0eSIgKSkNCm1vdDIwMTkkdXJiYW4gIDwtIGZhY3Rvcihtb3QyMDE5JHVyYmFuLCBsZXZlbHM9YygiTG93IHVyYmFuaXR5IiwgIk1lZGl1bSB1cmJhbml0eSIsICJIaWdoIHVyYmFuaXR5IiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKG1vdDIwMTkkdXJiYW4sIHVzZU5BID0gImFsd2F5cyIpICMgVXJiYW5pdHkgdW5rbm93biBpcyBub3cgYSBtaXNzaW5nDQoNCnRhYmxlKG1vdDIwMTkkeGxmdCwgdXNlTkEgPSAiYWx3YXlzIikgIyBubyBtaXNzaW5ncyBvbiBhZ2UNCm1vdDIwMTkkYWdlIDwtIG1vdDIwMTkkeGxmdA0KDQojTGV0J3MgZmlyc3Qgc2F2ZSB0aGUgcHJlcHBlZCBkYXRhLiANCnNhdmUobW90MjAxOSwgZmlsZT0iLi9kYXRhL2FsbF93YXZlcy9tb3QyMDE5LlJkYXRhIikNCg0KDQojIE5vdyBleGFjdGx5IHRoZSBzYW1lIGZvciAyMDIxDQptb3QyMDIxIDwtIG1vdGl2YWN0aW9uICU+JSBmaWx0ZXIobkdyb2VwID09ICJHcm9lcCBBIikgICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlciAobktPUDEgPT0gIk1ldGluZyAyMDIxIikgJT4lDQogICAgICAgICAgICBzZWxlY3QoblN0ZWRlbGlqa2hlaWQsIG5IdWlzaG91ZHNhbWVuc3RlbGxpbmcsIG5JbmtvbWVuY2F0LCBuR2VzbGFjaHQsIHhvcGxlaWR2b2x0LCBuT3BsY2F0Vm9sdCwgeGxmdCwgaVEyMDIxMV84LCBuUTQwLCBuUTQwRXh0cmEsIGlRNDFfMTppUTQxXzUsIGlRNDMsIG5RNDZfMTpuUTQ2XzUsIGlRNTBfMSwgaVE1MF8yLCBpUTUxXzE6aVE1MV8zLCBpUTUyKQ0KDQp0YWJsZShtb3QyMDIxJGlRMjAyMTFfOCwgdXNlTkEgPSAiYWx3YXlzIikgI29ubHkgbWlzc2luZ3Mgc28gZG9uJ3QgaW5jbHVkZQ0KdGFibGUobW90MjAyMSRuUTQwLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRjY2hhbmdlX21vdCA8LSBhcy5udW1lcmljKG1vdDIwMjEkblE0MCkNCm1vdDIwMjEkY2NoYW5nZV9tb3QNCm1vdDIwMjEkY2NoYW5nZV9tb3QgPC0gKGFzLm51bWVyaWMobW90MjAyMSRjY2hhbmdlX21vdCkgLSAxKSogKDYvMykgKyAxDQoNCnRhYmxlKG1vdDIwMjEkaVE0MV8xLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSR3b3JyaWVkX21vdCA8LSBhcy5udW1lcmljKG1vdDIwMjEkaVE0MV8xKQ0KbW90MjAyMSR3b3JyaWVkX21vdFttb3QyMDIxJHdvcnJpZWRfbW90ID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMjEkaVE0MV8yLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRmdXR1cmVnZW4gPC0gYXMubnVtZXJpYyhtb3QyMDIxJGlRNDFfMikNCm1vdDIwMjEkZnV0dXJlZ2VuW21vdDIwMjEkZnV0dXJlZ2VuID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMjEkaVE0MV8zLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRub3dvciA8LSBhcy5udW1lcmljKG1vdDIwMjEkaVE0MV8zKQ0KbW90MjAyMSA8LSBtb3QyMDIxICU+JQ0KICBtdXRhdGUoYWNyb3NzKGMobm93b3IpLCB+cmVjb2RlKC4sIGAxYCA9IDUsIGAyYCA9IDQsIGAzYCA9IDMsIGA0YCA9IDIsIGA1YCA9IDEpKSkNCnRhYmxlKG1vdDIwMjEkbm93b3IsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJG5vd29yW21vdDIwMjEkbm93b3IgPT0gNl0gPC0gTkENCg0KI1E0MV80IGlzIGFib3V0IEdyb25pbmdlbiwgbm90IHJlYWxseSB1c2VmdWwNCnRhYmxlKG1vdDIwMjEkaVE0MV81LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRvbnRpbWUgPC0gYXMubnVtZXJpYyhtb3QyMDIxJGlRNDFfNSkNCm1vdDIwMjEkb250aW1lW21vdDIwMjEkb250aW1lID09IDZdIDwtIE5BDQoNCnRhYmxlKG1vdDIwMjEkaVE0MywgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkZ292IDwtIGFzLm51bWVyaWMobW90MjAyMSRpUTQzKQ0KbW90MjAyMSRnb3ZbbW90MjAyMSRnb3YgPT0gNl0gPC0gTkENCg0KDQoNCiNUaGUgZm9sbG93aW5nIHN0YXRlbWVudHMgYXJlIGFib3V0IHRoZSByZXNwb25zaWJpbGl0eSBvZiBkaWZmZXJlbnQgZ3JvdXBzLiBUaGVyZSBpcyBvbmUgYW5zd2VyIGNhdGVnb3J5IHRoYXQgc3RhdGVzIHRoYXQgdGhlIHJlc3BvbmRlbnQgZG9lc24ndCB0aGluayBtZWFzdXJlcyBzaG91bGQgYmUgdGFrZW4uIEkgd2lsbCBjb2RlIHRoYXQgdG9nZXRoZXIgd2l0aCB0aGUgZ3JvdXAgImlzIG5vdCByZXNwb25zaWJsZSIgYmVjYXVzZSBpdCBib3RoIG1lYW5zIHRoYXQgeW91IGRvbid0IHRoaW5rIHRob3NlIHBhcnRpZXMgaGF2ZSB0byBhY3QgdG8gdGFja2xlIGNsaW1hdGUgY2hhbmdlLiANCnRhYmxlKG1vdDIwMjEkblE0Nl8xLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRyZXNwX2dvdiA8LSBhcy5udW1lcmljKG1vdDIwMjEkblE0Nl8xKQ0KbW90MjAyMSRyZXNwX2dvdlttb3QyMDIxJHJlc3BfZ292ID09IDVdIDwtIE5BDQptb3QyMDIxJHJlc3BfZ292W21vdDIwMjEkcmVzcF9nb3YgPT0gNF0gPC0gMQ0KdGFibGUobW90MjAyMSRyZXNwX2dvdiwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkcmVzcF9nb3YgPC0gKGFzLm51bWVyaWMobW90MjAyMSRyZXNwX2dvdikgLSAxKSogKDYvMykgKyAxDQoNCnRhYmxlKG1vdDIwMjEkblE0Nl8yLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRyZXNwX2NvbXAgPC0gYXMubnVtZXJpYyhtb3QyMDIxJG5RNDZfMikNCm1vdDIwMjEkcmVzcF9jb21wW21vdDIwMjEkcmVzcF9jb21wID09IDVdIDwtIE5BDQptb3QyMDIxJHJlc3BfY29tcFttb3QyMDIxJHJlc3BfY29tcCA9PSA0XSA8LSAxDQp0YWJsZShtb3QyMDIxJHJlc3BfY29tcCwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkcmVzcF9jb21wIDwtIChhcy5udW1lcmljKG1vdDIwMjEkcmVzcF9jb21wKSAtIDEpKiAoNi8zKSArIDENCg0KdGFibGUobW90MjAyMSRuUTQ2XzMsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJHJlc3BfbWtiIDwtIGFzLm51bWVyaWMobW90MjAyMSRuUTQ2XzMpDQptb3QyMDIxJHJlc3BfbWtiW21vdDIwMjEkcmVzcF9ta2IgPT0gNV0gPC0gTkENCm1vdDIwMjEkcmVzcF9ta2JbbW90MjAyMSRyZXNwX21rYiA9PSA0XSA8LSAxDQp0YWJsZShtb3QyMDIxJHJlc3BfbWtiLCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRyZXNwX21rYiA8LSAoYXMubnVtZXJpYyhtb3QyMDIxJHJlc3BfbWtiKSAtIDEpKiAoNi8zKSArIDENCg0KdGFibGUobW90MjAyMSRuUTQ2XzQsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJHJlc3BfY2l0aXpfbW90IDwtIGFzLm51bWVyaWMobW90MjAyMSRuUTQ2XzQpDQptb3QyMDIxJHJlc3BfY2l0aXpfbW90W21vdDIwMjEkcmVzcF9jaXRpel9tb3QgPT0gNV0gPC0gTkENCm1vdDIwMjEkcmVzcF9jaXRpel9tb3RbbW90MjAyMSRyZXNwX2NpdGl6X21vdCA9PSA0XSA8LSAxDQp0YWJsZShtb3QyMDIxJHJlc3BfY2l0aXpfbW90LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRyZXNwX2NpdGl6X21vdCA8LSAoYXMubnVtZXJpYyhtb3QyMDIxJHJlc3BfY2l0aXpfbW90KSAtIDEpKiAoNi8zKSArIDENCg0KdGFibGUobW90MjAyMSRuUTQ2XzUsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJHJlc3BfeW91IDwtIGFzLm51bWVyaWMobW90MjAyMSRuUTQ2XzUpDQptb3QyMDIxJHJlc3BfeW91W21vdDIwMjEkcmVzcF95b3UgPT0gNV0gPC0gTkENCm1vdDIwMjEkcmVzcF95b3VbbW90MjAyMSRyZXNwX3lvdSA9PSA0XSA8LSAxDQp0YWJsZShtb3QyMDIxJHJlc3BfeW91LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRyZXNwX3lvdSA8LSAoYXMubnVtZXJpYyhtb3QyMDIxJHJlc3BfeW91KSAtIDEpKiAoNi8zKSArIDENCg0KDQp0YWJsZShtb3QyMDIxJGlRNTBfMSwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkcGVyc19yZXNwX21vdCA8LSBhcy5udW1lcmljKG1vdDIwMjEkaVE1MF8xKQ0KbW90MjAyMSRwZXJzX3Jlc3BfbW90W21vdDIwMjEkcGVyc19yZXNwX21vdCA9PSA2XSA8LSBOQQ0KDQp0YWJsZShtb3QyMDIxJGlRNTBfMiwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkc3VzdF9jaG9pY2UgPC0gYXMubnVtZXJpYyhtb3QyMDIxJGlRNTBfMikNCm1vdDIwMjEkc3VzdF9jaG9pY2VbbW90MjAyMSRzdXN0X2Nob2ljZSA9PSA2XSA8LSBOQQ0KDQp0YWJsZShtb3QyMDIxJGlRNTFfMSwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkY29udHIgPC0gYXMubnVtZXJpYyhtb3QyMDIxJGlRNTFfMSkNCm1vdDIwMjEkY29udHJbbW90MjAyMSRjb250ciA9PSA2XSA8LSBOQQ0KDQp0YWJsZShtb3QyMDIxJGlRNTFfMiwgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkZW5lcmd5IDwtIGFzLm51bWVyaWMobW90MjAyMSRpUTUxXzIpDQptb3QyMDIxJGVuZXJneVttb3QyMDIxJGVuZXJneSA9PSA2XSA8LSBOQQ0KDQp0YWJsZShtb3QyMDIxJGlRNTFfMywgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkbm9pZGVhIDwtIGFzLm51bWVyaWMobW90MjAyMSRpUTUxXzMpDQptb3QyMDIxJG5vaWRlYVttb3QyMDIxJG5vaWRlYSA9PSA2XSA8LSBOQQ0KDQp0YWJsZShtb3QyMDIxJGlRNTIsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJG1vdGl2IDwtIGFzLm51bWVyaWMobW90MjAyMSRpUTUyKQ0KbW90MjAyMSRtb3Rpdlttb3QyMDIxJG1vdGl2ID09IDZdIDwtIE5BDQoNCiMgSW5kZXBlbmRlbnQgdmFyaWFibGVzDQojIEdlbmRlciwgZWR1Y2F0aW9uLCBhZ2UsIHVyYmFuaXR5IGFuZCBtYXJpdGFsIHN0YXR1cyANCnRhYmxlKG1vdDIwMjEkbkdlc2xhY2h0LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRzZXggPC0gcmV2YWx1ZShtb3QyMDIxJG5HZXNsYWNodCwgYygiTWFuIj0iMSIsICJWcm91dyI9IjIiKSkNCg0KIyA4NCBoYXZlIGEgZGlmZmVyZW50IG1hcml0YWwgc3RhdHVzIHRoYW4gc2luZ2xlIG9yIGxpdmluZyB0b2dldGhlci4gSSBkb24ndCB3YW50IHRvIHRocm93IHRoZW0gYXdheSwgYnV0IGFzIHRoZXkncmUgbm90IGxpdmluZyB0b2dldGhlciBhdCBsZWFzdCAoYW5kIGhhdmUgcGFydG5lciBpbmZsdWVuY2UgcHJvYmFibHkpIEkgd2lsbCBjb2RlIHRoZW0gaW4gdGhlIGNhdGVnb3J5IG9mIHNpbmdsZS4NCnRhYmxlKG1vdDIwMjEkbkh1aXNob3Vkc2FtZW5zdGVsbGluZywgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkbkh1aXNob3Vkc2FtZW5zdGVsbGluZyA8LSBhcy5udW1lcmljKG1vdDIwMjEkbkh1aXNob3Vkc2FtZW5zdGVsbGluZykNCm1vdDIwMjEkbWFyc3RhdFttb3QyMDIxJG5IdWlzaG91ZHNhbWVuc3RlbGxpbmcgPT0yIF0gPC0gMSAjTGl2aW5nIHRvZ2V0aGVyDQptb3QyMDIxJG1hcnN0YXRbbW90MjAyMSRuSHVpc2hvdWRzYW1lbnN0ZWxsaW5nICE9IDJdIDwtIDIgI05vdCBsaXZpbmcgdG9nZXRoZXINCm1vdDIwMjEkbWFyc3RhdCA8LSBhcy5mYWN0b3IobW90MjAyMSRtYXJzdGF0KQ0KdGFibGUobW90MjAyMSRtYXJzdGF0LCB1c2VOQSA9ICJhbHdheXMiKQ0KDQp0YWJsZShtb3QyMDIxJHhvcGxlaWR2b2x0LCB1c2VOQSA9ICJhbHdheXMiKQ0KbW90MjAyMSRlZHVjIDwtIGFzLm51bWVyaWMobW90MjAyMSR4b3BsZWlkdm9sdCkNCnRhYmxlKG1vdDIwMjEkZWR1YywgdXNlTkEgPSAiYWx3YXlzIikNCm1vdDIwMjEkaXNjZWRbbW90MjAyMSRlZHVjID09IDIgfCBtb3QyMDIxJGVkdWMgPT0gOV0gPC0gNQ0KbW90MjAyMSRpc2NlZFttb3QyMDIxJGVkdWMgPT0gMV0gPC0gNg0KbW90MjAyMSRpc2NlZFttb3QyMDIxJGVkdWMgPT0gMyB8IG1vdDIwMjEkZWR1YyA9PSA0XSA8LSAzDQptb3QyMDIxJGlzY2VkW21vdDIwMjEkZWR1YyA9PSA1IHwgbW90MjAyMSRlZHVjID09IDZdIDwtIDINCm1vdDIwMjEkaXNjZWRbbW90MjAyMSRlZHVjID09IDddIDwtIDENCm1vdDIwMjEkaXNjZWRbbW90MjAyMSRlZHVjID09IDhdIDwtIDANCg0KbW90MjAyMSRpc2NlZF9jYXRbbW90MjAyMSRpc2NlZCA8PTJdIDwtICJCYXNpYyINCm1vdDIwMjEkaXNjZWRfY2F0W21vdDIwMjEkaXNjZWQgPT0gMyB8IG1vdDIwMjEkaXNjZWQgPT0gNF0gPC0gIkludGVybWVkaWF0ZSINCm1vdDIwMjEkaXNjZWRfY2F0W21vdDIwMjEkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQptb3QyMDIxJGlzY2VkX2NhdCA8LSBmYWN0b3IobW90MjAyMSRpc2NlZF9jYXQsIGxldmVscz1jKCJCYXNpYyIsICJJbnRlcm1lZGlhdGUiLCAiQWR2YW5jZWQiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUobW90MjAyMSRpc2NlZF9jYXQpDQoNCnRhYmxlKG1vdDIwMjEkblN0ZWRlbGlqa2hlaWQsIHVzZU5BID0gImFsd2F5cyIpDQptb3QyMDIxJHVyYmFuIDwtIHJldmFsdWUobW90MjAyMSRuU3RlZGVsaWpraGVpZCwgYygiTmlldCBzdGVkZWxpamsiPSAiTG93IHVyYmFuaXR5IiwgIldlaW5pZyBzdGVkZWxpamsiPSAiTG93IHVyYmFuaXR5IiwgIk1hdGlnIHN0ZWRlbGlqayI9Ik1lZGl1bSB1cmJhbml0eSIsICJTdGVyayBzdGVkZWxpamsiID0gIkhpZ2ggdXJiYW5pdHkiLCAiWmVlciBzdGVyayBzdGVkZWxpamsiID0gIkhpZ2ggdXJiYW5pdHkiICkpDQptb3QyMDIxJHVyYmFuICA8LSBmYWN0b3IobW90MjAyMSR1cmJhbiwgbGV2ZWxzPWMoIkxvdyB1cmJhbml0eSIsICJNZWRpdW0gdXJiYW5pdHkiLCAiSGlnaCB1cmJhbml0eSIpLCBvcmRlcmVkPVRSVUUpDQp0YWJsZShtb3QyMDIxJHVyYmFuLCB1c2VOQSA9ICJhbHdheXMiKSAjIFVyYmFuaXR5IHVua25vd24gaXMgbm93IGEgbWlzc2luZw0KDQp0YWJsZShtb3QyMDIxJHhsZnQsIHVzZU5BID0gImFsd2F5cyIpICMgbm8gbWlzc2luZ3Mgb24gYWdlDQptb3QyMDIxJGFnZSA8LSBtb3QyMDIxJHhsZnQNCg0KI0xldCdzIGZpcnN0IHNhdmUgdGhlIHByZXBwZWQgZGF0YS4gDQpzYXZlKG1vdDIwMjEsIGZpbGU9Ii4vZGF0YS9hbGxfd2F2ZXMvbW90MjAyMS5SZGF0YSIpDQoNCiMgTWVyZ2UgdGhlIDIgZGF0YXNldHMNCiMgVGhpcyBSIGhhcyBzb21lIHByb2JsZW0gd2l0aCB2aWV3aW5nIGRhdGFzZXRzPw0KIyBGaXJzdCBjcmVhdGUgdGhlIHdlaWdodCB2YXJpYWJsZXMgKGRvbmUgaW4gb3RoZXIgc2NyaXB0KQ0KdXRpbHM6OlZpZXcobW90MjAxOSkgI0xpa2UgdGhpcyBpdCB3b3Jrcw0KbW90MjAxOSRzdXJ2ZXl5ZWFyIDwtIDIwMTkNCm1vdDIwMjEkc3VydmV5eWVhciA8LSAyMDIxDQoNCm1vdDIwMTkgPC0gbW90MjAxOSAlPiUgc2VsZWN0KHN1cnZleXllYXIsIHNleCwgbWFyc3RhdCwgZWR1YywgaXNjZWQsIGlzY2VkX2NhdCwgdXJiYW4sIGFnZSwgY2NoYW5nZV9tb3QsIHdvcnJpZWRfbW90LCBmdXR1cmVnZW4sIG5vd29yLCBvbnRpbWUsIGdvdiwgcmVzcF9nb3YsIHJlc3BfY29tcCwgcmVzcF9ta2IsIHJlc3BfY2l0aXpfbW90LCByZXNwX3lvdSwgcGVyc19yZXNwX21vdCwgc3VzdF9jaG9pY2UsIGNvbnRyLCBlbmVyZ3ksIG5vaWRlYSwgbW90aXYsIGFnZV9jYXQsIHdlaWdodHZlYykNCg0KbW90MjAyMSA8LSBtb3QyMDIxICU+JSBzZWxlY3Qoc3VydmV5eWVhciwgc2V4LCBtYXJzdGF0LCBlZHVjLCBpc2NlZCwgaXNjZWRfY2F0LCB1cmJhbiwgYWdlLCBjY2hhbmdlX21vdCwgd29ycmllZF9tb3QsIGZ1dHVyZWdlbiwgbm93b3IsIG9udGltZSwgZ292LCByZXNwX2dvdiwgcmVzcF9jb21wLCByZXNwX21rYiwgcmVzcF9jaXRpel9tb3QsIHJlc3BfeW91LCBwZXJzX3Jlc3BfbW90LCBzdXN0X2Nob2ljZSwgY29udHIsIGVuZXJneSwgbm9pZGVhLCBtb3RpdiwgYWdlX2NhdCwgd2VpZ2h0dmVjKQ0KDQptb3R0b3RhbCA8LSBkcGx5cjo6YmluZF9yb3dzKG1vdDIwMTksIG1vdDIwMjEpDQptb3R0b3RhbCRzZXggPC0gbW90dG90YWwkc2V4IC0gMQ0KDQpzYXZlKG1vdHRvdGFsLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9tb3R0b3RhbC5SZGF0YSIpDQoNCmBgYA0KDQoNCiMgTElTUyBkYXRhIHstfQ0KYGBge3J9DQojIFRoZSBMSVNTIGRhdGFzZXQgaGFzIG9uZSBxdWVzdGlvbiB0aGF0IGlzIGFza2VkIGluIDQgd2F2ZXMuIFRoZSBiYWNrZ3JvdW5kIHZhcmlhYmxlcyBhcmUgbm90IHBhcnQgb2YgdGhlIGRhdGFzZXQsIGJ1dCBoYXZlIHRvIGJlIG1lcmdlZCBzZXBhcmF0ZWx5LiANCg0KI0xvYWQgYm90aCBkZXBlbmRlbnQgdmFyaWFibGUgYW5kIGJhY2tncm91bmQgdmFyaWFibGVzDQpsaXNzMjAxOSA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIkM6L2NsaW1hdGVfZGF0YS9saXNzL2VuZXJneTIwMTkuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCmxpc3NfYmcyMDE5IDwtIGZvcmVpZ246OnJlYWQuc3BzcygiQzovY2xpbWF0ZV9kYXRhL2xpc3MvYmFja2dyb3VuZDIwMTkuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCg0KIyBTZWxlY3QgdGhlIHZhcmlhYmxlcyB0aGF0IEkgd2FudA0KbGlzczIwMTkgPC0gbGlzczIwMTkgJT4lIHNlbGVjdCAoc3UxOWEzMDQsIG5vbWVtX2VuY3IpDQpsaXNzX2JnMjAxOSA8LSBsaXNzX2JnMjAxOSAlPiUgc2VsZWN0KG5vbWVtX2VuY3IsIGdlc2xhY2h0LCBsZWVmdGlqZCwgd29vbnZvcm0sIGJ1cmdzdGF0LCBzdGVkLCBvcGxjYXQpICANCiAgDQpsaXNzMjAxOSA8LSBtZXJnZShsaXNzMjAxOSwgbGlzc19iZzIwMTksIGJ5ID0gIm5vbWVtX2VuY3IiLCBhbGwgPSBGQUxTRSkNCg0KIyBGaXJzdCBjaGVjayBvdXQgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KdGFibGUobGlzczIwMTkkc3UxOWEzMDQsIHVzZU5BID0gImFsd2F5cyIpICMgMTc4IG1pc3NpbmdzICxyYW5nZXMgZnJvbSAwIHRvIDEwDQpsaXNzMjAxOSRsaWZlc3R5bGUgPC0gKGFzLm51bWVyaWMobGlzczIwMTkkc3UxOWEzMDQpIC0gMSkqICg0LzEwKSArIDENCnRhYmxlKGxpc3MyMDE5JGxpZmVzdHlsZSwgdXNlTkEgPSAiYWx3YXlzIikNCg0KIyBOb3cgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcw0KIyBHZW5kZXIsIGVkdWNhdGlvbiwgYWdlLCB1cmJhbml0eSBhbmQgbWFyaXRhbCBzdGF0dXMgDQp0YWJsZShsaXNzMjAxOSRnZXNsYWNodCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDE5JHNleCA8LSByZXZhbHVlKGxpc3MyMDE5JGdlc2xhY2h0LCBjKCJNYWxlIj0iMSIsICJGZW1hbGUiPSIyIikpDQoNCnRhYmxlKGxpc3MyMDE5JHdvb252b3JtLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMTkkd29vbnZvcm0gPC0gYXMubnVtZXJpYyhsaXNzMjAxOSR3b29udm9ybSkNCmxpc3MyMDE5JG1hcnN0YXRbbGlzczIwMTkkd29vbnZvcm0gPT0yIHwgbGlzczIwMTkkd29vbnZvcm0gPT0gM10gPC0gMSAjTGl2aW5nIHRvZ2V0aGVyDQpsaXNzMjAxOSRtYXJzdGF0W2xpc3MyMDE5JHdvb252b3JtID09IDEgfCBsaXNzMjAxOSR3b29udm9ybSA9PSA0IHwgbGlzczIwMTkkd29vbnZvcm0gPT0gNV0gPC0gMiAjTm90IGxpdmluZyB0b2dldGhlcg0KbGlzczIwMTkkbWFyc3RhdCA8LSBhcy5mYWN0b3IobGlzczIwMTkkbWFyc3RhdCkNCnRhYmxlKGxpc3MyMDE5JG1hcnN0YXQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnRhYmxlKGxpc3MyMDE5JG9wbGNhdCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDE5JGVkdWMgPC0gYXMubnVtZXJpYyhsaXNzMjAxOSRvcGxjYXQpDQp0YWJsZShsaXNzMjAxOSRlZHVjLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMTkkaXNjZWRbbGlzczIwMTkkZWR1YyA9PSAxXSA8LSAxDQpsaXNzMjAxOSRpc2NlZFtsaXNzMjAxOSRlZHVjID09IDJdIDwtIDINCmxpc3MyMDE5JGlzY2VkW2xpc3MyMDE5JGVkdWMgPT0gMyB8IGxpc3MyMDE5JGVkdWMgPT0gNF0gPC0gMw0KbGlzczIwMTkkaXNjZWRbbGlzczIwMTkkZWR1YyA9PSA1IHwgbGlzczIwMTkkZWR1YyA9PSA2XSA8LSA1DQp0YWJsZShsaXNzMjAxOSRpc2NlZCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KbWVhbihsaXNzMjAxOSRpc2NlZCwgbmEucm09VCkNCmxpc3MyMDE5JGlzY2VkW2lzLm5hKGxpc3MyMDE5JGlzY2VkKV0gPC0gMy40NA0KDQpsaXNzMjAxOSRpc2NlZF9jYXRbbGlzczIwMTkkaXNjZWQgPD0yXSA8LSAiQmFzaWMiDQpsaXNzMjAxOSRpc2NlZF9jYXRbbGlzczIwMTkkaXNjZWQgPj0gMyAmIGxpc3MyMDE5JGlzY2VkIDw9IDRdIDwtICJJbnRlcm1lZGlhdGUiDQpsaXNzMjAxOSRpc2NlZF9jYXRbbGlzczIwMTkkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQpsaXNzMjAxOSRpc2NlZF9jYXQgPC0gZmFjdG9yKGxpc3MyMDE5JGlzY2VkX2NhdCwgbGV2ZWxzPWMoIkJhc2ljIiwgIkludGVybWVkaWF0ZSIsICJBZHZhbmNlZCIpLCBvcmRlcmVkPVRSVUUpDQp0YWJsZShsaXNzMjAxOSRpc2NlZF9jYXQsIHVzZU5BID0gImFsd2F5cyIpICM0IG1pc3NpbmdzIA0KDQp0YWJsZShsaXNzMjAxOSRzdGVkLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMTkkdXJiYW4gPC0gcmV2YWx1ZShsaXNzMjAxOSRzdGVkLCBjKCJOb3QgdXJiYW4iPSAiTG93IHVyYmFuaXR5IiwgIlNsaWdodGx5IHVyYmFuIj0gIkxvdyB1cmJhbml0eSIsICJNb2RlcmF0ZWx5IHVyYmFuIj0iTWVkaXVtIHVyYmFuaXR5IiwgIlZlcnkgdXJiYW4iID0gIkhpZ2ggdXJiYW5pdHkiLCAiRXh0cmVtZWx5IHVyYmFuIiA9ICJIaWdoIHVyYmFuaXR5IiApKQ0KbGlzczIwMTkkdXJiYW4gIDwtIGZhY3RvcihsaXNzMjAxOSR1cmJhbiwgbGV2ZWxzPWMoIkxvdyB1cmJhbml0eSIsICJNZWRpdW0gdXJiYW5pdHkiLCAiSGlnaCB1cmJhbml0eSIpLCBvcmRlcmVkPVRSVUUpDQp0YWJsZShsaXNzMjAxOSR1cmJhbiwgdXNlTkEgPSAiYWx3YXlzIikgIyAyMCBtaXNzaW5ncw0KDQp0YWJsZShsaXNzMjAxOSRsZWVmdGlqZCwgdXNlTkEgPSAiYWx3YXlzIikgIyBubyBtaXNzaW5ncyBvbiBhZ2UNCmxpc3MyMDE5JGFnZSA8LSBsaXNzMjAxOSRsZWVmdGlqZCANCg0KIyBTYXZlIGRhdGFzZXQgDQpzYXZlKGxpc3MyMDE5LCBmaWxlPSIuL2RhdGEvYWxsX3dhdmVzL2xpc3MyMDE5LlJkYXRhIikgIA0KDQojMjAyMCBoYXMgMiB3YXZlcywgb25lIGluIGp1bHkgYW5kIG9uZSBpbiBvY3RvYmVyDQpsaXNzMjAyMGEgPC0gZm9yZWlnbjo6cmVhZC5zcHNzKCJDOi9jbGltYXRlX2RhdGEvbGlzcy9jb3ZpZDcyMC5zYXYiLCB1c2UudmFsdWUubGFiZWxzID0gVCwgIHRvLmRhdGEuZnJhbWUgPSBUKQ0KbGlzc19iZzIwMjBhIDwtIGZvcmVpZ246OnJlYWQuc3BzcygiQzovY2xpbWF0ZV9kYXRhL2xpc3MvYmFja2dyb3VuZDcyMC5zYXYiLCB1c2UudmFsdWUubGFiZWxzID0gVCwgIHRvLmRhdGEuZnJhbWUgPSBUKQ0KDQojIFNlbGVjdCB0aGUgdmFyaWFibGVzIHRoYXQgSSB3YW50DQpsaXNzMjAyMGEgPC0gbGlzczIwMjBhICU+JSBzZWxlY3QgKHVjMjBhMDU2LCBub21lbV9lbmNyKQ0KbGlzc19iZzIwMjBhIDwtIGxpc3NfYmcyMDIwYSAlPiUgc2VsZWN0KG5vbWVtX2VuY3IsIGdlc2xhY2h0LCBsZWVmdGlqZCwgd29vbnZvcm0sIGJ1cmdzdGF0LCBzdGVkLCBvcGxjYXQpICANCiAgDQpsaXNzMjAyMGEgPC0gbWVyZ2UobGlzczIwMjBhLCBsaXNzX2JnMjAyMGEsIGJ5ID0gIm5vbWVtX2VuY3IiLCBhbGwgPSBGQUxTRSkNCg0KIyBGaXJzdCBjaGVjayBvdXQgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KdGFibGUobGlzczIwMjBhJHVjMjBhMDU2LCB1c2VOQSA9ICJhbHdheXMiKSAjIDkxIG1pc3NpbmdzICxyYW5nZXMgZnJvbSAxIHRvIDEwDQpsaXNzMjAyMGEkbGlmZXN0eWxlIDwtIChhcy5udW1lcmljKGxpc3MyMDIwYSR1YzIwYTA1NikgLSAxKSogKDQvOSkgKyAxDQp0YWJsZShsaXNzMjAyMGEkbGlmZXN0eWxlLCB1c2VOQSA9ICJhbHdheXMiKQ0KDQojIE5vdyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzDQojIEdlbmRlciwgZWR1Y2F0aW9uLCBhZ2UsIHVyYmFuaXR5IGFuZCBtYXJpdGFsIHN0YXR1cyANCnRhYmxlKGxpc3MyMDIwYSRnZXNsYWNodCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIwYSRzZXggPC0gcmV2YWx1ZShsaXNzMjAyMGEkZ2VzbGFjaHQsIGMoIk1hbGUiPSIxIiwgIkZlbWFsZSI9IjIiKSkNCg0KdGFibGUobGlzczIwMjBhJHdvb252b3JtLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMjBhJHdvb252b3JtIDwtIGFzLm51bWVyaWMobGlzczIwMjBhJHdvb252b3JtKQ0KbGlzczIwMjBhJG1hcnN0YXRbbGlzczIwMjBhJHdvb252b3JtID09MiB8IGxpc3MyMDIwYSR3b29udm9ybSA9PSAzXSA8LSAxICNMaXZpbmcgdG9nZXRoZXINCmxpc3MyMDIwYSRtYXJzdGF0W2xpc3MyMDIwYSR3b29udm9ybSA9PSAxIHwgbGlzczIwMjBhJHdvb252b3JtID09IDQgfCBsaXNzMjAyMGEkd29vbnZvcm0gPT0gNV0gPC0gMiAjTm90IGxpdmluZyB0b2dldGhlcg0KbGlzczIwMjBhJG1hcnN0YXQgPC0gYXMuZmFjdG9yKGxpc3MyMDIwYSRtYXJzdGF0KQ0KdGFibGUobGlzczIwMjBhJG1hcnN0YXQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnRhYmxlKGxpc3MyMDIwYSRvcGxjYXQsIHVzZU5BID0gImFsd2F5cyIpDQpsaXNzMjAyMGEkZWR1YyA8LSBhcy5udW1lcmljKGxpc3MyMDIwYSRvcGxjYXQpDQp0YWJsZShsaXNzMjAyMGEkZWR1YywgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIwYSRpc2NlZFtsaXNzMjAyMGEkZWR1YyA9PSAxXSA8LSAxDQpsaXNzMjAyMGEkaXNjZWRbbGlzczIwMjBhJGVkdWMgPT0gMl0gPC0gMg0KbGlzczIwMjBhJGlzY2VkW2xpc3MyMDIwYSRlZHVjID09IDMgfCBsaXNzMjAyMGEkZWR1YyA9PSA0XSA8LSAzDQpsaXNzMjAyMGEkaXNjZWRbbGlzczIwMjBhJGVkdWMgPT0gNSB8IGxpc3MyMDIwYSRlZHVjID09IDZdIDwtIDUNCnRhYmxlKGxpc3MyMDIwYSRpc2NlZCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KbWVhbihsaXNzMjAyMGEkaXNjZWQsIG5hLnJtPVQpDQpsaXNzMjAyMGEkaXNjZWRbaXMubmEobGlzczIwMjBhJGlzY2VkKV0gPC0gMy41DQoNCmxpc3MyMDIwYSRpc2NlZF9jYXRbbGlzczIwMjBhJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0KbGlzczIwMjBhJGlzY2VkX2NhdFtsaXNzMjAyMGEkaXNjZWQgPj0gMyAmIGxpc3MyMDIwYSRpc2NlZCA8PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0KbGlzczIwMjBhJGlzY2VkX2NhdFtsaXNzMjAyMGEkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQpsaXNzMjAyMGEkaXNjZWRfY2F0IDwtIGZhY3RvcihsaXNzMjAyMGEkaXNjZWRfY2F0LCBsZXZlbHM9YygiQmFzaWMiLCAiSW50ZXJtZWRpYXRlIiwgIkFkdmFuY2VkIiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKGxpc3MyMDIwYSRpc2NlZF9jYXQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnRhYmxlKGxpc3MyMDIwYSRzdGVkLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMjBhJHVyYmFuIDwtIHJldmFsdWUobGlzczIwMjBhJHN0ZWQsIGMoIk5vdCB1cmJhbiI9ICJMb3cgdXJiYW5pdHkiLCAiU2xpZ2h0bHkgdXJiYW4iPSAiTG93IHVyYmFuaXR5IiwgIk1vZGVyYXRlbHkgdXJiYW4iPSJNZWRpdW0gdXJiYW5pdHkiLCAiVmVyeSB1cmJhbiIgPSAiSGlnaCB1cmJhbml0eSIsICJFeHRyZW1lbHkgdXJiYW4iID0gIkhpZ2ggdXJiYW5pdHkiICkpDQpsaXNzMjAyMGEkdXJiYW4gIDwtIGZhY3RvcihsaXNzMjAyMGEkdXJiYW4sIGxldmVscz1jKCJMb3cgdXJiYW5pdHkiLCAiTWVkaXVtIHVyYmFuaXR5IiwgIkhpZ2ggdXJiYW5pdHkiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUobGlzczIwMjBhJHVyYmFuLCB1c2VOQSA9ICJhbHdheXMiKSAjIDExIG1pc3NpbmdzDQoNCnRhYmxlKGxpc3MyMDIwYSRsZWVmdGlqZCwgdXNlTkEgPSAiYWx3YXlzIikgIyBubyBtaXNzaW5ncyBvbiBhZ2UNCmxpc3MyMDIwYSRhZ2UgPC0gbGlzczIwMjBhJGxlZWZ0aWpkIA0KDQojIFNhdmUgZGF0YXNldCANCnNhdmUobGlzczIwMjBhLCBmaWxlPSIuL2RhdGEvYWxsX3dhdmVzL2xpc3MyMDIwYS5SZGF0YSIpICANCg0KIyBBbmQgZm9yIHRoZSBzZWNvbmQgZGF0YXNldCBvZiAyMDIwDQpsaXNzMjAyMGIgPC0gZm9yZWlnbjo6cmVhZC5zcHNzKCJDOi9jbGltYXRlX2RhdGEvbGlzcy9jb3ZpZDEwMjAuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCmxpc3NfYmcyMDIwYiA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIkM6L2NsaW1hdGVfZGF0YS9saXNzL2JhY2tncm91bmQxMDIwLnNhdiIsIHVzZS52YWx1ZS5sYWJlbHMgPSBULCAgdG8uZGF0YS5mcmFtZSA9IFQpDQoNCg0KIyBTZWxlY3QgdGhlIHZhcmlhYmxlcyB0aGF0IEkgd2FudA0KbGlzczIwMjBiIDwtIGxpc3MyMDIwYiAlPiUgc2VsZWN0ICh1YzIwYjA1Niwgbm9tZW1fZW5jcikNCmxpc3NfYmcyMDIwYiA8LSBsaXNzX2JnMjAyMGIgJT4lIHNlbGVjdChub21lbV9lbmNyLCBnZXNsYWNodCwgbGVlZnRpamQsIHdvb252b3JtLCBidXJnc3RhdCwgc3RlZCwgb3BsY2F0KSAgDQogIA0KbGlzczIwMjBiIDwtIG1lcmdlKGxpc3MyMDIwYiwgbGlzc19iZzIwMjBiLCBieSA9ICJub21lbV9lbmNyIiwgYWxsID0gRkFMU0UpDQoNCiMgRmlyc3QgY2hlY2sgb3V0IHRoZSBkZXBlbmRlbnQgdmFyaWFibGUNCnRhYmxlKGxpc3MyMDIwYiR1YzIwYjA1NiwgdXNlTkEgPSAiYWx3YXlzIikgIyAxMTEgbWlzc2luZ3MgLHJhbmdlcyBmcm9tIDEgdG8gMTANCmxpc3MyMDIwYiRsaWZlc3R5bGUgPC0gKGFzLm51bWVyaWMobGlzczIwMjBiJHVjMjBiMDU2KSAtIDEpKiAoNC85KSArIDENCnRhYmxlKGxpc3MyMDIwYiRsaWZlc3R5bGUsIHVzZU5BID0gImFsd2F5cyIpDQoNCiMgTm93IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMNCiMgR2VuZGVyLCBlZHVjYXRpb24sIGFnZSwgdXJiYW5pdHkgYW5kIG1hcml0YWwgc3RhdHVzIA0KdGFibGUobGlzczIwMjBiJGdlc2xhY2h0LCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMjBiJHNleCA8LSByZXZhbHVlKGxpc3MyMDIwYiRnZXNsYWNodCwgYygiTWFsZSI9IjEiLCAiRmVtYWxlIj0iMiIpKQ0KDQp0YWJsZShsaXNzMjAyMGIkd29vbnZvcm0sIHVzZU5BID0gImFsd2F5cyIpDQpsaXNzMjAyMGIkd29vbnZvcm0gPC0gYXMubnVtZXJpYyhsaXNzMjAyMGIkd29vbnZvcm0pDQpsaXNzMjAyMGIkbWFyc3RhdFtsaXNzMjAyMGIkd29vbnZvcm0gPT0yIHwgbGlzczIwMjBiJHdvb252b3JtID09IDNdIDwtIDEgI0xpdmluZyB0b2dldGhlcg0KbGlzczIwMjBiJG1hcnN0YXRbbGlzczIwMjBiJHdvb252b3JtID09IDEgfCBsaXNzMjAyMGIkd29vbnZvcm0gPT0gNCB8IGxpc3MyMDIwYiR3b29udm9ybSA9PSA1XSA8LSAyICNOb3QgbGl2aW5nIHRvZ2V0aGVyDQpsaXNzMjAyMGIkbWFyc3RhdCA8LSBhcy5mYWN0b3IobGlzczIwMjBiJG1hcnN0YXQpDQp0YWJsZShsaXNzMjAyMGIkbWFyc3RhdCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KdGFibGUobGlzczIwMjBiJG9wbGNhdCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIwYiRlZHVjIDwtIGFzLm51bWVyaWMobGlzczIwMjBiJG9wbGNhdCkNCnRhYmxlKGxpc3MyMDIwYiRlZHVjLCB1c2VOQSA9ICJhbHdheXMiKQ0KbGlzczIwMjBiJGlzY2VkW2xpc3MyMDIwYiRlZHVjID09IDFdIDwtIDENCmxpc3MyMDIwYiRpc2NlZFtsaXNzMjAyMGIkZWR1YyA9PSAyXSA8LSAyDQpsaXNzMjAyMGIkaXNjZWRbbGlzczIwMjBiJGVkdWMgPT0gMyB8IGxpc3MyMDIwYiRlZHVjID09IDRdIDwtIDMNCmxpc3MyMDIwYiRpc2NlZFtsaXNzMjAyMGIkZWR1YyA9PSA1IHwgbGlzczIwMjBiJGVkdWMgPT0gNl0gPC0gNQ0KdGFibGUobGlzczIwMjBiJGlzY2VkLCB1c2VOQSA9ICJhbHdheXMiKQ0KDQptZWFuKGxpc3MyMDIwYiRpc2NlZCwgbmEucm09VCkNCmxpc3MyMDIwYiRpc2NlZFtpcy5uYShsaXNzMjAyMGIkaXNjZWQpXSA8LSAzLjQ5DQoNCmxpc3MyMDIwYiRpc2NlZF9jYXRbbGlzczIwMjBiJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0KbGlzczIwMjBiJGlzY2VkX2NhdFtsaXNzMjAyMGIkaXNjZWQgPj0gMyAmIGxpc3MyMDIwYiRpc2NlZCA8PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0KbGlzczIwMjBiJGlzY2VkX2NhdFtsaXNzMjAyMGIkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQpsaXNzMjAyMGIkaXNjZWRfY2F0IDwtIGZhY3RvcihsaXNzMjAyMGIkaXNjZWRfY2F0LCBsZXZlbHM9YygiQmFzaWMiLCAiSW50ZXJtZWRpYXRlIiwgIkFkdmFuY2VkIiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKGxpc3MyMDIwYiRpc2NlZF9jYXQsIHVzZU5BID0gImFsd2F5cyIpICM0IG1pc3NpbmdzIA0KDQp0YWJsZShsaXNzMjAyMGIkc3RlZCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIwYiR1cmJhbiA8LSByZXZhbHVlKGxpc3MyMDIwYiRzdGVkLCBjKCJOb3QgdXJiYW4iPSAiTG93IHVyYmFuaXR5IiwgIlNsaWdodGx5IHVyYmFuIj0gIkxvdyB1cmJhbml0eSIsICJNb2RlcmF0ZWx5IHVyYmFuIj0iTWVkaXVtIHVyYmFuaXR5IiwgIlZlcnkgdXJiYW4iID0gIkhpZ2ggdXJiYW5pdHkiLCAiRXh0cmVtZWx5IHVyYmFuIiA9ICJIaWdoIHVyYmFuaXR5IiApKQ0KbGlzczIwMjBiJHVyYmFuICA8LSBmYWN0b3IobGlzczIwMjBiJHVyYmFuLCBsZXZlbHM9YygiTG93IHVyYmFuaXR5IiwgIk1lZGl1bSB1cmJhbml0eSIsICJIaWdoIHVyYmFuaXR5IiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKGxpc3MyMDIwYiR1cmJhbiwgdXNlTkEgPSAiYWx3YXlzIikgIyA5IG1pc3NpbmdzDQoNCnRhYmxlKGxpc3MyMDIwYiRsZWVmdGlqZCwgdXNlTkEgPSAiYWx3YXlzIikgIyBubyBtaXNzaW5ncyBvbiBhZ2UNCmxpc3MyMDIwYiRhZ2UgPC0gbGlzczIwMjBiJGxlZWZ0aWpkIA0KDQojIFNhdmUgZGF0YXNldCANCnNhdmUobGlzczIwMjBiLCBmaWxlPSIuL2RhdGEvYWxsX3dhdmVzL2xpc3MyMDIwYi5SZGF0YSIpICANCg0KIyBBbmQgdGhlIGxhc3Qgd2F2ZSBpbiAyMDIxDQpsaXNzMjAyMSA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIkM6L2NsaW1hdGVfZGF0YS9saXNzL2NvdmlkNzIxLnNhdiIsIHVzZS52YWx1ZS5sYWJlbHMgPSBULCAgdG8uZGF0YS5mcmFtZSA9IFQpDQpsaXNzX2JnMjAyMSA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIkM6L2NsaW1hdGVfZGF0YS9saXNzL2JhY2tncm91bmQ3MjEuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCg0KDQojIFNlbGVjdCB0aGUgdmFyaWFibGVzIHRoYXQgSSB3YW50DQpsaXNzMjAyMSA8LSBsaXNzMjAyMSAlPiUgc2VsZWN0ICh1YzIxYzA1Niwgbm9tZW1fZW5jcikNCmxpc3NfYmcyMDIxIDwtIGxpc3NfYmcyMDIxICU+JSBzZWxlY3Qobm9tZW1fZW5jciwgZ2VzbGFjaHQsIGxlZWZ0aWpkLCB3b29udm9ybSwgYnVyZ3N0YXQsIHN0ZWQsIG9wbGNhdCkgIA0KICANCmxpc3MyMDIxIDwtIG1lcmdlKGxpc3MyMDIxLCBsaXNzX2JnMjAyMSwgYnkgPSAibm9tZW1fZW5jciIsIGFsbCA9IEZBTFNFKQ0KDQojIEZpcnN0IGNoZWNrIG91dCB0aGUgZGVwZW5kZW50IHZhcmlhYmxlDQp0YWJsZShsaXNzMjAyMSR1YzIxYzA1NiwgdXNlTkEgPSAiYWx3YXlzIikgIyAxMDYgbWlzc2luZ3MgLHJhbmdlcyBmcm9tIDEgdG8gMTANCmxpc3MyMDIxJGxpZmVzdHlsZSA8LSAoYXMubnVtZXJpYyhsaXNzMjAyMSR1YzIxYzA1NikgLSAxKSogKDQvOSkgKyAxDQp0YWJsZShsaXNzMjAyMSRsaWZlc3R5bGUsIHVzZU5BID0gImFsd2F5cyIpDQoNCiMgTm93IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMNCiMgR2VuZGVyLCBlZHVjYXRpb24sIGFnZSwgdXJiYW5pdHkgYW5kIG1hcml0YWwgc3RhdHVzIA0KdGFibGUobGlzczIwMjEkZ2VzbGFjaHQsIHVzZU5BID0gImFsd2F5cyIpDQpsaXNzMjAyMSRzZXggPC0gcmV2YWx1ZShsaXNzMjAyMSRnZXNsYWNodCwgYygiTWFsZSI9IjEiLCAiRmVtYWxlIj0iMiIpKQ0KDQp0YWJsZShsaXNzMjAyMSR3b29udm9ybSwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIxJHdvb252b3JtIDwtIGFzLm51bWVyaWMobGlzczIwMjEkd29vbnZvcm0pDQpsaXNzMjAyMSRtYXJzdGF0W2xpc3MyMDIxJHdvb252b3JtID09MiB8IGxpc3MyMDIxJHdvb252b3JtID09IDNdIDwtIDEgI0xpdmluZyB0b2dldGhlcg0KbGlzczIwMjEkbWFyc3RhdFtsaXNzMjAyMSR3b29udm9ybSA9PSAxIHwgbGlzczIwMjEkd29vbnZvcm0gPT0gNCB8IGxpc3MyMDIxJHdvb252b3JtID09IDVdIDwtIDIgI05vdCBsaXZpbmcgdG9nZXRoZXINCmxpc3MyMDIxJG1hcnN0YXQgPC0gYXMuZmFjdG9yKGxpc3MyMDIxJG1hcnN0YXQpDQp0YWJsZShsaXNzMjAyMSRtYXJzdGF0LCB1c2VOQSA9ICJhbHdheXMiKQ0KDQp0YWJsZShsaXNzMjAyMSRvcGxjYXQsIHVzZU5BID0gImFsd2F5cyIpDQpsaXNzMjAyMSRlZHVjIDwtIGFzLm51bWVyaWMobGlzczIwMjEkb3BsY2F0KQ0KdGFibGUobGlzczIwMjEkZWR1YywgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIxJGlzY2VkW2xpc3MyMDIxJGVkdWMgPT0gMV0gPC0gMQ0KbGlzczIwMjEkaXNjZWRbbGlzczIwMjEkZWR1YyA9PSAyXSA8LSAyDQpsaXNzMjAyMSRpc2NlZFtsaXNzMjAyMSRlZHVjID09IDMgfCBsaXNzMjAyMSRlZHVjID09IDRdIDwtIDMNCmxpc3MyMDIxJGlzY2VkW2xpc3MyMDIxJGVkdWMgPT0gNSB8IGxpc3MyMDIxJGVkdWMgPT0gNl0gPC0gNQ0KdGFibGUobGlzczIwMjEkaXNjZWQsIHVzZU5BID0gImFsd2F5cyIpDQoNCm1lYW4obGlzczIwMjEkaXNjZWQsIG5hLnJtPVQpDQpsaXNzMjAyMSRpc2NlZFtpcy5uYShsaXNzMjAyMSRpc2NlZCldIDwtIDMuNDkNCg0KbGlzczIwMjEkaXNjZWRfY2F0W2xpc3MyMDIxJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0KbGlzczIwMjEkaXNjZWRfY2F0W2xpc3MyMDIxJGlzY2VkID49IDMgJiBsaXNzMjAyMSRpc2NlZCA8PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0KbGlzczIwMjEkaXNjZWRfY2F0W2xpc3MyMDIxJGlzY2VkID49NV0gPC0gIkFkdmFuY2VkIg0KbGlzczIwMjEkaXNjZWRfY2F0IDwtIGZhY3RvcihsaXNzMjAyMSRpc2NlZF9jYXQsIGxldmVscz1jKCJCYXNpYyIsICJJbnRlcm1lZGlhdGUiLCAiQWR2YW5jZWQiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUobGlzczIwMjEkaXNjZWRfY2F0LCB1c2VOQSA9ICJhbHdheXMiKSAjNCBtaXNzaW5ncyANCg0KdGFibGUobGlzczIwMjEkc3RlZCwgdXNlTkEgPSAiYWx3YXlzIikNCmxpc3MyMDIxJHVyYmFuIDwtIHJldmFsdWUobGlzczIwMjEkc3RlZCwgYygiTm90IHVyYmFuIj0gIkxvdyB1cmJhbml0eSIsICJTbGlnaHRseSB1cmJhbiI9ICJMb3cgdXJiYW5pdHkiLCAiTW9kZXJhdGVseSB1cmJhbiI9Ik1lZGl1bSB1cmJhbml0eSIsICJWZXJ5IHVyYmFuIiA9ICJIaWdoIHVyYmFuaXR5IiwgIkV4dHJlbWVseSB1cmJhbiIgPSAiSGlnaCB1cmJhbml0eSIgKSkNCmxpc3MyMDIxJHVyYmFuICA8LSBmYWN0b3IobGlzczIwMjEkdXJiYW4sIGxldmVscz1jKCJMb3cgdXJiYW5pdHkiLCAiTWVkaXVtIHVyYmFuaXR5IiwgIkhpZ2ggdXJiYW5pdHkiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUobGlzczIwMjEkdXJiYW4sIHVzZU5BID0gImFsd2F5cyIpICMgMTAgbWlzc2luZ3MNCg0KdGFibGUobGlzczIwMjEkbGVlZnRpamQsIHVzZU5BID0gImFsd2F5cyIpICMgbm8gbWlzc2luZ3Mgb24gYWdlDQpsaXNzMjAyMSRhZ2UgPC0gbGlzczIwMjEkbGVlZnRpamQgDQoNCiMgU2F2ZSBkYXRhc2V0IA0Kc2F2ZShsaXNzMjAyMSwgZmlsZT0iLi9kYXRhL2FsbF93YXZlcy9saXNzMjAyMS5SZGF0YSIpICANCg0KIyBNZXJnZSB0aGUgZm91ciBkYXRhc2V0cywgYW5kIGZpcnN0IGNyZWF0aW5nIHdlaWdodHMgaW4gb3RoZXIgc2NyaXB0DQp1dGlsczo6VmlldyhsaXNzMjAxOSkgDQpsaXNzMjAxOSRzdXJ2ZXl5ZWFyIDwtIDIwMTkNCmxpc3MyMDIwYSRzdXJ2ZXl5ZWFyIDwtIDIwMjAuNTgNCmxpc3MyMDIwYiRzdXJ2ZXl5ZWFyIDwtIDIwMjAuODMNCmxpc3MyMDIxJHN1cnZleXllYXIgPC0gMjAyMQ0KDQpsaXNzMjAxOSA8LSBsaXNzMjAxOSAlPiUgc2VsZWN0KHN1cnZleXllYXIsIHNleCwgbWFyc3RhdCwgZWR1YywgaXNjZWQsIGlzY2VkX2NhdCwgYWdlLCB1cmJhbiwgIGxpZmVzdHlsZSwgYWdlX2NhdCwgd2VpZ2h0dmVjKQ0KDQpsaXNzMjAyMGEgPC0gbGlzczIwMjBhICU+JSBzZWxlY3Qoc3VydmV5eWVhciwgc2V4LCBtYXJzdGF0LCBlZHVjLCBpc2NlZCwgaXNjZWRfY2F0LCBhZ2UsIHVyYmFuLCBsaWZlc3R5bGUsIGFnZV9jYXQsIHdlaWdodHZlYykNCg0KbGlzczIwMjBiIDwtIGxpc3MyMDIwYiAlPiUgc2VsZWN0KHN1cnZleXllYXIsIHNleCwgbWFyc3RhdCwgZWR1YywgaXNjZWQsIGlzY2VkX2NhdCwgYWdlLCB1cmJhbiwgIGxpZmVzdHlsZSwgYWdlX2NhdCwgd2VpZ2h0dmVjKQ0KDQpsaXNzMjAyMSA8LSBsaXNzMjAyMSAlPiUgc2VsZWN0KHN1cnZleXllYXIsIHNleCwgbWFyc3RhdCwgZWR1YywgaXNjZWQsIGlzY2VkX2NhdCwgYWdlLCB1cmJhbiwgIGxpZmVzdHlsZSwgYWdlX2NhdCwgd2VpZ2h0dmVjKQ0KDQpsaXNzdG90YWwgPC0gZHBseXI6OmJpbmRfcm93cyhsaXNzMjAxOSwgbGlzczIwMjBhLCBsaXNzMjAyMGIsIGxpc3MyMDIxKQ0KDQpsaXNzdG90YWwkc2V4IDwtIGxpc3N0b3RhbCRzZXggLSAxDQoNCnNhdmUobGlzc3RvdGFsLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9saXNzdG90YWwuUmRhdGEiKQ0KDQoNCmBgYA0KDQoNCiMgU09DT04gZGF0YSB7LX0NCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0Kc29jb24yMDIwIDwtIGZvcmVpZ246OnJlYWQuc3BzcygiQzovY2xpbWF0ZV9kYXRhL3NvY29uL3NvY29uMjAyMC5zYXYiLCB1c2UudmFsdWUubGFiZWxzID0gVCwgIHRvLmRhdGEuZnJhbWUgPSBUKQ0KDQp1dGlsczo6Vmlldyhzb2NvbjIwMjApDQoNCnNvY29uMjAyMCA8LSBzb2NvbjIwMjAgJT4lIHNlbGVjdChWMDAxMywgVjAwMTQsIFYwMDM2LCBWMDAzNywgVjAwNDAsIFY3MTQwKQ0KDQojIEZpcnN0IGRlcGVuZGVudCB2YXJpYWJsZQ0KdGFibGUoc29jb24yMDIwJFY3MTQwLCB1c2VOQSA9ICJhbHdheXMiKSAjIDExMyBtaXNzaW5ncywgaGF2ZSB0byBtaXJyb3IgdGhlIHZhcg0Kc29jb24yMDIwJGZ1dF9nZW5fc29jb24gPC0gYXMubnVtZXJpYyhzb2NvbjIwMjAkVjcxNDApDQpzb2NvbjIwMjAgPC0gc29jb24yMDIwICU+JQ0KICBtdXRhdGUoYWNyb3NzKGMoZnV0X2dlbl9zb2NvbiksIH5yZWNvZGUoLiwgYDFgID0gNSwgYDJgID0gNCwgYDNgID0gMywgYDRgID0gMiwgYDVgID0gMSkpKQ0KdGFibGUoc29jb24yMDIwJGZ1dF9nZW5fc29jb24sIHVzZU5BID0gImFsd2F5cyIpIA0KDQojIE5vdyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUuIFVyYmFuaXR5IGlzIG5vdCBhc2tlZC4gDQp0YWJsZShzb2NvbjIwMjAkVjAwMTMsIHVzZU5BID0gImFsd2F5cyIpICMgNiBtaXNzaW5ncw0Kc29jb24yMDIwJHNleCA8LSByZXZhbHVlKHNvY29uMjAyMCRWMDAxMywgYygibWFsZSI9IjEiLCAiZmVtYWxlIj0iMiIpKQ0KDQpzb2NvbjIwMjAkYWdlIDwtIDIwMjAgLSBzb2NvbjIwMjAkVjAwMTQNCnRhYmxlKHNvY29uMjAyMCRhZ2UsIHVzZU5BID0gImFsd2F5cyIpICM2IG1pc3NpbmdzDQptZWFuKHNvY29uMjAyMCRhZ2UsIG5hLnJtPVQpDQpzb2NvbjIwMjAkYWdlW2lzLm5hKHNvY29uMjAyMCRhZ2UpXSA8LSA1MS41Mg0KDQp0YWJsZShzb2NvbjIwMjAkVjAwMzYsIHVzZU5BID0gImFsd2F5cyIpICM3MiBtaXNzaW5ncw0Kc29jb24yMDIwJG1hcnN0YXQgPC0gYXMubnVtZXJpYyhzb2NvbjIwMjAkVjAwMzYpDQpzb2NvbjIwMjAkbWFyc3RhdCA8LSBhcy5mYWN0b3Ioc29jb24yMDIwJG1hcnN0YXQpDQp0YWJsZShzb2NvbjIwMjAkbWFyc3RhdCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KdGFibGUoc29jb24yMDIwJFYwMDQwLCB1c2VOQSA9ICJhbHdheXMiKQ0Kc29jb24yMDIwJGVkdWMgPC0gYXMubnVtZXJpYyhzb2NvbjIwMjAkVjAwNDApDQpzb2NvbjIwMjAkaXNjZWRbc29jb24yMDIwJGVkdWMgPT0gMV0gPC0gMA0Kc29jb24yMDIwJGlzY2VkW3NvY29uMjAyMCRlZHVjID09IDJdIDwtIDENCnNvY29uMjAyMCRpc2NlZFtzb2NvbjIwMjAkZWR1YyA9PSAzIHwgc29jb24yMDIwJGVkdWMgPT0gNF0gPC0gMg0Kc29jb24yMDIwJGlzY2VkW3NvY29uMjAyMCRlZHVjID09IDUgfCBzb2NvbjIwMjAkZWR1YyA9PSA2IHwgc29jb24yMDIwJGVkdWMgPT03IHwgc29jb24yMDIwJGVkdWMgPT04XSA8LSAzDQpzb2NvbjIwMjAkaXNjZWRbc29jb24yMDIwJGVkdWMgPT0gOSB8IHNvY29uMjAyMCRlZHVjID09IDEwXSA8LSA1DQpzb2NvbjIwMjAkaXNjZWRbc29jb24yMDIwJGVkdWMgPT0gMTEgfCBzb2NvbjIwMjAkZWR1YyA9PSAxMl0gPC0gNg0KdGFibGUoc29jb24yMDIwJGlzY2VkLCB1c2VOQSA9ICJhbHdheXMiKSAjb3RoZXJzIG5vdyBhbHNvIG1pc3NpbmcNCg0KbWVhbihzb2NvbjIwMjAkaXNjZWQsIG5hLnJtPVQpDQpzb2NvbjIwMjAkaXNjZWRbaXMubmEoc29jb24yMDIwJGlzY2VkKV0gPC0gMy41NTY3DQoNCnNvY29uMjAyMCRpc2NlZF9jYXRbc29jb24yMDIwJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0Kc29jb24yMDIwJGlzY2VkX2NhdFtzb2NvbjIwMjAkaXNjZWQgPj0gMyAmIHNvY29uMjAyMCRpc2NlZCA8PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0Kc29jb24yMDIwJGlzY2VkX2NhdFtzb2NvbjIwMjAkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQpzb2NvbjIwMjAkaXNjZWRfY2F0IDwtIGZhY3Rvcihzb2NvbjIwMjAkaXNjZWRfY2F0LCBsZXZlbHM9YygiQmFzaWMiLCAiSW50ZXJtZWRpYXRlIiwgIkFkdmFuY2VkIiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKHNvY29uMjAyMCRpc2NlZF9jYXQsIHVzZU5BID0gImFsd2F5cyIpIA0KDQoNCiNTYXZlIGRhdGFzZXQNCnNhdmUoc29jb24yMDIwLCBmaWxlPSIuL2RhdGEvYWxsX3dhdmVzL3NvY29uMjAyMC5SZGF0YSIpDQoNCiMgU29jb24gMjAyMQ0Kc29jb24yMDIxIDwtIGZvcmVpZ246OnJlYWQuc3BzcygiQzovY2xpbWF0ZV9kYXRhL3NvY29uL3NvY29uMjAyMS5zYXYiLCB1c2UudmFsdWUubGFiZWxzID0gVCwgIHRvLmRhdGEuZnJhbWUgPSBUKQ0KDQp0YWJsZShzb2NvbjIwMjEkVjAwMTQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnV0aWxzOjpWaWV3KHNvY29uMjAyMSkNCg0Kc29jb24yMDIxIDwtIHNvY29uMjAyMSAlPiUgc2VsZWN0KFYwMDEzLCBWMDAxNCwgVjAwMzYsIFYwMDM3LCBWMDA0MCwgVjcxNDApDQoNCiMgRmlyc3QgZGVwZW5kZW50IHZhcmlhYmxlDQp0YWJsZShzb2NvbjIwMjEkVjcxNDAsIHVzZU5BID0gImFsd2F5cyIpICMgOTYgbWlzc2luZ3MsIGhhdmUgdG8gbWlycm9yIHRoZSB2YXINCnNvY29uMjAyMSRmdXRfZ2VuX3NvY29uIDwtIGFzLm51bWVyaWMoc29jb24yMDIxJFY3MTQwKQ0Kc29jb24yMDIxIDwtIHNvY29uMjAyMSAlPiUNCiAgbXV0YXRlKGFjcm9zcyhjKGZ1dF9nZW5fc29jb24pLCB+cmVjb2RlKC4sIGAxYCA9IDUsIGAyYCA9IDQsIGAzYCA9IDMsIGA0YCA9IDIsIGA1YCA9IDEpKSkNCnRhYmxlKHNvY29uMjAyMSRmdXRfZ2VuX3NvY29uLCB1c2VOQSA9ICJhbHdheXMiKSANCg0KIyBOb3cgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlLiBVcmJhbml0eSBpcyBub3QgYXNrZWQuIA0KdGFibGUoc29jb24yMDIxJFYwMDEzLCB1c2VOQSA9ICJhbHdheXMiKSAjIDggbWlzc2luZ3MNCnNvY29uMjAyMSRzZXggPC0gcmV2YWx1ZShzb2NvbjIwMjEkVjAwMTMsIGMoIm1hbGUiPSIxIiwgImZlbWFsZSI9IjIiKSkNCg0Kc29jb24yMDIxJGFnZSA8LSAyMDIxIC0gc29jb24yMDIxJFYwMDE0DQp0YWJsZShzb2NvbjIwMjEkYWdlLCB1c2VOQSA9ICJhbHdheXMiKSAjNyBtaXNzaW5ncw0KbWVhbihzb2NvbjIwMjEkYWdlLCBuYS5ybT1UKQ0Kc29jb24yMDIxJGFnZVtpcy5uYShzb2NvbjIwMjEkYWdlKV0gPC0gNTUuNTUNCg0KdGFibGUoc29jb24yMDIxJFYwMDM2LCB1c2VOQSA9ICJhbHdheXMiKSAjNjEgbWlzc2luZ3MNCnNvY29uMjAyMSRtYXJzdGF0IDwtIGFzLm51bWVyaWMoc29jb24yMDIxJFYwMDM2KQ0Kc29jb24yMDIxJG1hcnN0YXQgPC0gYXMuZmFjdG9yKHNvY29uMjAyMSRtYXJzdGF0KQ0KdGFibGUoc29jb24yMDIxJG1hcnN0YXQsIHVzZU5BID0gImFsd2F5cyIpDQoNCnRhYmxlKHNvY29uMjAyMSRWMDA0MCwgdXNlTkEgPSAiYWx3YXlzIikNCnNvY29uMjAyMSRlZHVjIDwtIGFzLm51bWVyaWMoc29jb24yMDIxJFYwMDQwKQ0Kc29jb24yMDIxJGlzY2VkW3NvY29uMjAyMSRlZHVjID09IDFdIDwtIDANCnNvY29uMjAyMSRpc2NlZFtzb2NvbjIwMjEkZWR1YyA9PSAyXSA8LSAxDQpzb2NvbjIwMjEkaXNjZWRbc29jb24yMDIxJGVkdWMgPT0gMyB8IHNvY29uMjAyMSRlZHVjID09IDRdIDwtIDINCnNvY29uMjAyMSRpc2NlZFtzb2NvbjIwMjEkZWR1YyA9PSA1IHwgc29jb24yMDIxJGVkdWMgPT0gNiB8IHNvY29uMjAyMSRlZHVjID09NyB8IHNvY29uMjAyMSRlZHVjID09OF0gPC0gMw0Kc29jb24yMDIxJGlzY2VkW3NvY29uMjAyMSRlZHVjID09IDkgfCBzb2NvbjIwMjEkZWR1YyA9PSAxMF0gPC0gNQ0Kc29jb24yMDIxJGlzY2VkW3NvY29uMjAyMSRlZHVjID09IDExIHwgc29jb24yMDIxJGVkdWMgPT0gMTJdIDwtIDYNCnRhYmxlKHNvY29uMjAyMSRpc2NlZCwgdXNlTkEgPSAiYWx3YXlzIikgI290aGVycyBub3cgYWxzbyBtaXNzaW5nDQoNCm1lYW4oc29jb24yMDIxJGlzY2VkLCBuYS5ybT1UKQ0Kc29jb24yMDIxJGlzY2VkW2lzLm5hKHNvY29uMjAyMSRpc2NlZCldIDwtIDMuNjQzNA0Kc29jb24yMDIxJGlzY2VkX2NhdFtzb2NvbjIwMjEkaXNjZWQgPD0yXSA8LSAiQmFzaWMiDQpzb2NvbjIwMjEkaXNjZWRfY2F0W3NvY29uMjAyMSRpc2NlZCA+PSAzIHwgc29jb24yMDIxJGlzY2VkIDw9IDRdIDwtICJJbnRlcm1lZGlhdGUiDQpzb2NvbjIwMjEkaXNjZWRfY2F0W3NvY29uMjAyMSRpc2NlZCA+PTVdIDwtICJBZHZhbmNlZCINCnNvY29uMjAyMSRpc2NlZF9jYXQgPC0gZmFjdG9yKHNvY29uMjAyMSRpc2NlZF9jYXQsIGxldmVscz1jKCJCYXNpYyIsICJJbnRlcm1lZGlhdGUiLCAiQWR2YW5jZWQiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUoc29jb24yMDIxJGlzY2VkX2NhdCwgdXNlTkEgPSAiYWx3YXlzIikgDQoNCg0KDQojU2F2ZSBkYXRhc2V0DQpzYXZlKHNvY29uMjAyMSwgZmlsZT0iLi9kYXRhL2FsbF93YXZlcy9zb2NvbjIwMjEuUmRhdGEiKQ0KDQojIFNvY29uIDIwMjINCnNvY29uMjAyMiA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIkM6L2NsaW1hdGVfZGF0YS9zb2Nvbi9zb2NvbjIwMjIuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCg0KdXRpbHM6OlZpZXcoc29jb24yMDIyKQ0KDQpzb2NvbjIwMjIgPC0gc29jb24yMDIyICU+JSBzZWxlY3QoVjAwMTMsIFYwMDE0LCBWMDAzNiwgVjAwMzcsIFYwMDQwLCBWNzE0MCkNCg0KIyBGaXJzdCBkZXBlbmRlbnQgdmFyaWFibGUNCnRhYmxlKHNvY29uMjAyMiRWNzE0MCwgdXNlTkEgPSAiYWx3YXlzIikgIyAxNTEgbWlzc2luZ3MsIGhhdmUgdG8gbWlycm9yIHRoZSB2YXINCnNvY29uMjAyMiRmdXRfZ2VuX3NvY29uIDwtIGFzLm51bWVyaWMoc29jb24yMDIyJFY3MTQwKQ0Kc29jb24yMDIyIDwtIHNvY29uMjAyMiAlPiUNCiAgbXV0YXRlKGFjcm9zcyhjKGZ1dF9nZW5fc29jb24pLCB+cmVjb2RlKC4sIGAxYCA9IDUsIGAyYCA9IDQsIGAzYCA9IDMsIGA0YCA9IDIsIGA1YCA9IDEpKSkNCnRhYmxlKHNvY29uMjAyMiRmdXRfZ2VuX3NvY29uLCB1c2VOQSA9ICJhbHdheXMiKSANCg0KIyBOb3cgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlLiBVcmJhbml0eSBpcyBub3QgYXNrZWQuIA0KdGFibGUoc29jb24yMDIyJFYwMDEzLCB1c2VOQSA9ICJhbHdheXMiKSAjIDMgbWlzc2luZ3MsIDYgb3RoZXIgKGFsc28gTkEpDQpzb2NvbjIwMjIkc2V4IDwtIHJldmFsdWUoc29jb24yMDIyJFYwMDEzLCBjKCJtYWxlIj0iMSIsICJmZW1hbGUiPSIyIiwgIm90aGVyIiA9IE5BKSkNCnRhYmxlKHNvY29uMjAyMiRzZXgsIHVzZU5BID0gImFsd2F5cyIpDQoNCnNvY29uMjAyMiRhZ2UgPC0gMjAyMiAtIHNvY29uMjAyMiRWMDAxNA0KdGFibGUoc29jb24yMDIyJGFnZSwgdXNlTkEgPSAiYWx3YXlzIikgIzEgbWlzc2luZw0KbWVhbihzb2NvbjIwMjIkYWdlLCBuYS5ybT1UKQ0Kc29jb24yMDIyJGFnZVtpcy5uYShzb2NvbjIwMjIkYWdlKV0gPC0gNTEuMTcNCg0KdGFibGUoc29jb24yMDIyJFYwMDM2LCB1c2VOQSA9ICJhbHdheXMiKSAjMTAyIG1pc3NpbmdzDQpzb2NvbjIwMjIkbWFyc3RhdCA8LSBhcy5udW1lcmljKHNvY29uMjAyMiRWMDAzNikNCnNvY29uMjAyMiRtYXJzdGF0IDwtIGFzLmZhY3Rvcihzb2NvbjIwMjIkbWFyc3RhdCkNCnRhYmxlKHNvY29uMjAyMiRtYXJzdGF0LCB1c2VOQSA9ICJhbHdheXMiKQ0KDQp0YWJsZShzb2NvbjIwMjIkVjAwNDAsIHVzZU5BID0gImFsd2F5cyIpDQpzb2NvbjIwMjIkZWR1YyA8LSBhcy5udW1lcmljKHNvY29uMjAyMiRWMDA0MCkNCnNvY29uMjAyMiRpc2NlZFtzb2NvbjIwMjIkZWR1YyA9PSAxXSA8LSAwDQpzb2NvbjIwMjIkaXNjZWRbc29jb24yMDIyJGVkdWMgPT0gMl0gPC0gMQ0Kc29jb24yMDIyJGlzY2VkW3NvY29uMjAyMiRlZHVjID09IDMgfCBzb2NvbjIwMjIkZWR1YyA9PSA0XSA8LSAyDQpzb2NvbjIwMjIkaXNjZWRbc29jb24yMDIyJGVkdWMgPT0gNSB8IHNvY29uMjAyMiRlZHVjID09IDYgfCBzb2NvbjIwMjIkZWR1YyA9PTcgfCBzb2NvbjIwMjIkZWR1YyA9PThdIDwtIDMNCnNvY29uMjAyMiRpc2NlZFtzb2NvbjIwMjIkZWR1YyA9PSA5IHwgc29jb24yMDIyJGVkdWMgPT0gMTBdIDwtIDUNCnNvY29uMjAyMiRpc2NlZFtzb2NvbjIwMjIkZWR1YyA9PSAxMSB8IHNvY29uMjAyMiRlZHVjID09IDEyXSA8LSA2DQp0YWJsZShzb2NvbjIwMjIkaXNjZWQsIHVzZU5BID0gImFsd2F5cyIpICNvdGhlcnMgbm93IGFsc28gbWlzc2luZw0KDQptZWFuKHNvY29uMjAyMiRpc2NlZCwgbmEucm09VCkNCnNvY29uMjAyMiRpc2NlZFtpcy5uYShzb2NvbjIwMjIkaXNjZWQpXSA8LSAzLjU5MjINCnNvY29uMjAyMiRpc2NlZF9jYXRbc29jb24yMDIyJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0Kc29jb24yMDIyJGlzY2VkX2NhdFtzb2NvbjIwMjIkaXNjZWQgPj0gMyAmIHNvY29uMjAyMiRpc2NlZCA8PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0Kc29jb24yMDIyJGlzY2VkX2NhdFtzb2NvbjIwMjIkaXNjZWQgPj01XSA8LSAiQWR2YW5jZWQiDQpzb2NvbjIwMjIkaXNjZWRfY2F0IDwtIGZhY3Rvcihzb2NvbjIwMjIkaXNjZWRfY2F0LCBsZXZlbHM9YygiQmFzaWMiLCAiSW50ZXJtZWRpYXRlIiwgIkFkdmFuY2VkIiksIG9yZGVyZWQ9VFJVRSkNCnRhYmxlKHNvY29uMjAyMiRpc2NlZF9jYXQsIHVzZU5BID0gImFsd2F5cyIpIA0KDQojU2F2ZSBkYXRhc2V0DQpzYXZlKHNvY29uMjAyMiwgZmlsZT0iLi9kYXRhL2FsbF93YXZlcy9zb2NvbjIwMjIuUmRhdGEiKQ0KDQojIE1lcmdlIHRoZSBkYXRhc2V0cw0KdXRpbHM6OlZpZXcoc29jb24yMDIwKSAjTGlrZSB0aGlzIGl0IHdvcmtzDQpsb2FkKCIuL2RhdGEvYWxsX3dhdmVzL3NvY29uMjAyMC5SZGF0YSIpDQpzb2NvbjIwMjAkc3VydmV5eWVhciA8LSAyMDIwDQpzb2NvbjIwMjEkc3VydmV5eWVhciA8LSAyMDIxDQpzb2NvbjIwMjIkc3VydmV5eWVhciA8LSAyMDIyDQoNCnNvY29uMjAyMCA8LSBzb2NvbjIwMjAgJT4lIHNlbGVjdChzdXJ2ZXl5ZWFyLCBzZXgsIG1hcnN0YXQsIGVkdWMsIGlzY2VkLCBpc2NlZF9jYXQsIGFnZSwgIGZ1dF9nZW5fc29jb24sIGFnZV9jYXQsIHdlaWdodHZlYykNCg0Kc29jb24yMDIxIDwtIHNvY29uMjAyMSAlPiUgc2VsZWN0KHN1cnZleXllYXIsIHNleCwgbWFyc3RhdCwgZWR1YywgaXNjZWQsIGlzY2VkX2NhdCwgYWdlLCAgZnV0X2dlbl9zb2NvbiwgYWdlX2NhdCwgd2VpZ2h0dmVjKQ0KDQpzb2NvbjIwMjIgPC0gc29jb24yMDIyICU+JSBzZWxlY3Qoc3VydmV5eWVhciwgc2V4LCBtYXJzdGF0LCBlZHVjLCBpc2NlZCwgaXNjZWRfY2F0LCBhZ2UsICBmdXRfZ2VuX3NvY29uLCBhZ2VfY2F0LCB3ZWlnaHR2ZWMpDQoNCiNGaXggdGhlIGFuZXNyYWtlIGlzc3VlIHdpdGggYWdlIGluIDIwMjENCnNvY29uMjAyMSRhZ2VfY2F0W3NvY29uMjAyMSRhZ2UgPj0xNSAmIHNvY29uMjAyMSRhZ2UgPD0gMzBdIDwtIDENCnNvY29uMjAyMSRhZ2VfY2F0W3NvY29uMjAyMSRhZ2UgPj0zMSAmIHNvY29uMjAyMSRhZ2UgPD0gNDVdIDwtIDINCnNvY29uMjAyMSRhZ2VfY2F0W3NvY29uMjAyMSRhZ2UgPj00NiAmIHNvY29uMjAyMSRhZ2UgPD0gNjBdIDwtIDMNCnNvY29uMjAyMSRhZ2VfY2F0W3NvY29uMjAyMSRhZ2UgPj02MV0gPC0gNA0KDQpzb2NvbnRvdGFsIDwtIGRwbHlyOjpiaW5kX3Jvd3Moc29jb24yMDIwLCBzb2NvbjIwMjEsIHNvY29uMjAyMikNCnNvY29udG90YWwkc2V4IDwtIHNvY29udG90YWwkc2V4IC0gMQ0KDQpzYXZlKHNvY29udG90YWwsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3NvY29udG90YWwuUmRhdGEiKQ0KYGBgDQoNCg==