4. Robusness checks
Here, we conduct a series of robustness checks (or multiverse
data analysis; see Steegen et al. 2016) for each
selected model by using alternative inclusion criteria, models with
additional or less covariates, outlier removal, etc. The following
packages and functions are used to optimize the analyses.
library(psych)
glmerAn
#' @title Generalized linear (mixed-effects) regression analysis
#' @param modelType = type of model: GLM, mixed-effects (GLMER), or cumulative link mixedm odel (CLMM)
#' @param data = data.frame of data
#' @param resp = name of the response variable (character)
#' @param fix.eff = character vector of names of the predictor(s)
#' @param REML = argument from the lme4::lmer() function, see ?lmer
#' @param ran.eff = character string indicating the random effect by using the lme4 syntax (defult: "(1|ID)")
#' @param family = character string indicating the name of the GLM(ER) family to be used in the models (default: "normal")
#' @param link =character string indicating the name of the GLM(ER) link function to be used in the models (default: "identity")
#' @param nAGQ = argument from the lme4::glmer() function, see ?glmer
#' @param mComp.baseline = character string indicating the name of the last predictor included in the baseline model to be compared with the subsequent models. If equal to NA (defult), the null model is used as the baseline model for comparison
#' @param p.adjust.method = argument from the stats::p.adjust() function (see ?p.adjust) indicating which method should be used to correct the p-values obtained from the likelihood ratio test (default: NA, for no adjustment)
#' @param key.model = character string indicating the name of the predictor(s) whose model(s) should be considered for the "key.res" output
#' @param key.predictor = character string indicating the name of the predictor to be considered by the "key.res" output
#' @param digits = number of digits for all numeric ouputs
#' @param messages = boolean indicating whether a message should be printed for each operation (defult: FALSE)
glmerAn <- function(data,modelType=c("GLMER"),resp,fix.eff,REML=TRUE,ran.eff="(1|ID)",family="normal",
link="identity",nAGQ=1,mComp.baseline=NA,p.adjust.method=NA,coeff.models=NA,transform=NULL,
plot.model=NA,plot.pred="all",key.model=NA,key.predictor=NA,digits=3,messages=FALSE){
if(messages==TRUE){ cat("Running",modelType,"analysis of",resp,"...") }
# modeling .......................................................................................
# creating model formulas
formulas <- character()
if(modelType=="GLM"){ ran.eff <- "1" }
null.f <- paste(resp,"~",ran.eff) # creating null model formula
for(i in 1:length(fix.eff)){ # creating other formulas
if(i==1){ formulas[i] <- paste(resp,"~",fix.eff[1]) } else { formulas[i] <- paste(formulas[i-1],"+",fix.eff[i]) }}
if(modelType%in%c("GLMER","CLMM")){ if(!is.na(ran.eff)){ formulas <- paste(formulas,"+",ran.eff)
if(substr(ran.eff,2,2)!="1"){ ranSlope <- paste(fix.eff[which(grepl(ran.eff,fix.eff))])[1]
null.f <- gsub(ranSlope,"1",null.f) # removing random slope from models without the related predictor
for(i in 1:length(formulas)){
if(!(grepl(ranSlope,gsub(paste(ranSlope,"[|]",sep=""),"",formulas[i])))){
formulas[i] <- gsub(paste(ranSlope,"[|]",sep=""),"1|",formulas[i]) }}}
} else { stop(message="Error: GLMER model type without ran.eff specification") }}
if(messages==TRUE){ cat("\n\nModel specification:\n - model M0 (null):",null.f)
for(i in 1:length(formulas)){ cat("\n - model M",i,": ",formulas[i],sep="")}}
# fitting models
models <- list()
if(modelType=="GLM"){ if(messages==TRUE){
cat("\n\nFitting GLM models of",resp,"on",nrow(data),"participants \n using the",
family,"family with the",link,"link function...") }
if(family=="normal" & link=="identity"){ null.m <- lm(as.formula(null.f),data=data) # normal family
for(i in 1:length(formulas)){ models[[i]] <- lm(formula=as.formula(formulas[i]),data=data) }
} else if (family=="gamma") { null.m <- glm(as.formula(null.f),data=data,family=Gamma(link=link),nAGQ=nAGQ) # gamma
for(i in 1:length(formulas)){ models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=Gamma(link=link)) }
} else if(family=="normal" & link!="identity"){
null.m <- glm(as.formula(null.f),data=data,family=gaussian(link=link)) # normal with other link functions
for(i in 1:length(formulas)){
models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=gaussian(link=link)) }
} else if(family=="binomial"){
null.m <- glm(as.formula(null.f),data=data,family=binomial(link=link)) # logistic regression
for(i in 1:length(formulas)){
models[[i]] <- glm(formula=as.formula(formulas[i]),data=data,family=binomial(link=link))}
} else { stop(message="Error: only normal, gamma, and binomial family are allowed,
with identity, inverse, and log link functions") }
} else if(modelType=="GLMER"){ suppressMessages(suppressWarnings(require(lme4)))
if(messages==TRUE){ cat("\n\nFitting",modelType,"models of",resp,"on",nrow(data),"observations from",
nlevels(as.factor(as.character(data$ID))),"participants \n using the",family,
"family with the",link,"link function using",ifelse(REML==FALSE,"ML","REML"),"estimator...") }
if(family=="normal" & link=="identity"){ null.m <- lmer(as.formula(null.f),data=data,REML=REML) # normal identity
for(i in 1:length(formulas)){ models[[i]] <- lmer(formula=as.formula(formulas[i]),data=data,REML=REML) }
} else if (family=="gamma") { null.m <- glmer(as.formula(null.f),data=data,family=Gamma(link=link),nAGQ=nAGQ) # gamma
for(i in 1:length(formulas)){
models[[i]]<-glmer(formula=as.formula(formulas[i]),data=data,family=Gamma(link=link),nAGQ=nAGQ) }
} else if(family=="normal" & link!="identity"){
null.m <- glmer(as.formula(null.f),data=data,family=gaussian(link=link),nAGQ=nAGQ) # normal with other links
for(i in 1:length(formulas)){ models[[i]] <- glmer(formula=as.formula(formulas[i]),data=data,
family=gaussian(link=link),nAGQ=nAGQ) }
} else if(family=="binomial"){
null.m <- glmer(as.formula(null.f),data=data,family=binomial(link=link),nAGQ=nAGQ) # logistic
for(i in 1:length(formulas)){ models[[i]] <- glmer(formula=as.formula(formulas[i]),data=data,
family=binomial(link=link),nAGQ=nAGQ)}
} else { stop(message="Error: only normal, logistic, and gamma family are allowed,
with identity, inverse, and log link functions") }
} else if(modelType=="CLMM"){ suppressMessages(suppressWarnings(require(ordinal))) # cumulative link mixed models
if(messages==TRUE){
cat("\n\nFitting",modelType,"models of",resp,"on",nrow(data),"observations from",
nlevels(as.factor(as.character(data$ID))),"participants \n using Cumulative Link Mixed Models") }
data[,resp] <- factor(data[,resp],ordered=TRUE) # response variable as ordered factor
null.m <- suppressWarnings(clmm(as.formula(gsub("~","~ 1 +",null.f)),data=data)) # suppress formula warning (bugged)
for(i in 1:length(formulas)){ models[[i]] <- suppressWarnings(clmm(formula=as.formula(formulas[i]),data=data,nAGQ=nAGQ)) }
} else { stop(message="Error: modelType can only be 'GLM', 'GLMER', or 'CLMM'") }
# outputs...............................................................................................................
if(messages==TRUE){ cat("\n\nGenerating models outputs...") }
# model comparison
# likelihood ratio test
if(messages==TRUE){ cat("\n\n - Running likelihood ratio test:") }
suppressMessages(suppressWarnings(require(knitr))); suppressMessages(suppressWarnings(require(MuMIn)))
m.num <- 1
if(is.na(mComp.baseline)){ bsl <- null.m # selecting baseline model
} else { m.num <- grep(mComp.baseline,fix.eff)[1] + 1
bsl <- models[[m.num - 1]] }
if(modelType!="CLMM"){ lrt <- as.data.frame(anova(bsl,models[[m.num]]))
if(length(models)>m.num){
for(i in m.num:(length(models)-1)){ lrt <- rbind(lrt,as.data.frame(anova(models[[i]],models[[i+1]]))[2,]) }}
} else { lrt <- as.data.frame(ordinal:::anova.clm(bsl,models[[m.num]])) # use anova.clm() to avoid env. issue
if(length(models)>m.num){
for(i in m.num:(length(models)-1)){
lrt <- rbind(lrt,as.data.frame(ordinal:::anova.clm(models[[i]],models[[i+1]]))[2,]) }}}
rownames(lrt) <- c(ifelse(is.na(mComp.baseline),"Null model","Baseline"),
fix.eff[m.num:length(fix.eff)])
if(!is.na(p.adjust.method)){ # p-value corrections for multiple comparison
if(messages==TRUE){ cat(" (applying",p.adjust.method,"p-values correction)")}
lrt[!is.na(lrt$`Pr(>Chisq)`),"Pr(>Chisq)"] <- p.adjust(lrt[!is.na(lrt$`Pr(>Chisq)`),"Pr(>Chisq)"],
method=p.adjust.method) }
# Akaike weights
AICs <- lrt[1:2,"AIC"] # Akaike weight
# updating key results
key <- lrt[which(grepl(key.predictor,row.names(lrt))),] # key results
if(nrow(key)>1){ key <- key[1,] }
key.results <- data.frame(sig.LRT=key[,ncol(key)]<0.05, # sig.LRT
higher.Aw=key$AIC==min(AICs[1:which(AICs==key$AIC)])) # higher.Aw
# estimated parameters from key.model
modSummary <- summary(models[[which(fix.eff==key.model)]])
modSummary <- modSummary$coefficients
if(modelType=="CLMM"){ modSummary <- modSummary[nlevels(data[,resp]):nrow(modSummary),] }
key <- round(modSummary[which(grepl(key.predictor,row.names(modSummary))),3][1],2) # taking only first coeff for key.results
key.results <- cbind(key.results,t.196=abs(key)>1.96,t=key)
# returning key results (sig. LRT, Aw higher than previous model, t > 1.96)
return(key.results) }
glmerMed
#' @title Generalized linear mixed-effects mediation analysis
#' @param data = data.frame of data
#' @param resp = name of the response variable (character)
#' @param treat = name of the treatment variable (character)
#' @param med = name of the mediator variable (character)
#' @param fix.eff = character vector of names of the predictor(s)
#' @param REML = argument from the lme4::lmer() function, see ?lmer
#' @param ran.eff = character string indicating the random effect by using the lme4 syntax (defult: "(1|ID)")
#' @param family = character string indicating the name of the GLM(ER) family to be used in the models (default: "normal")
#' @param link = character string indicating the name of the GLM(ER) link function to be used in the models (default: "identity")
#' @param sims = number of Monte Carlo draws for quasi-Bayesian CI and p-value (default: 1000)
#' @param alpha.level = significance level (default: 0.05)
#' @param noCov = boolean indicating wheter covariates should be considered in the mediation models or not
#' @param messages = boolean indicating whether a message should be printed for each operation (defult: FALSE)
glmerMed <- function(data,resp,treat,med,fix.eff,REML=TRUE,ran.eff="(1|ID)",family="normal",
link="identity",sims=1000,alpha.level=0.05,noCov=FALSE,messages=FALSE){
library(lme4); library(mediation)
if(messages==TRUE){ cat("Running",modelType,"analysis of",resp,"...") }
# modeling .......................................................................................
# creating model formulas
mMed.f <- paste(gsub(".mc","",med),"~",fix.eff[1])
if(length(fix.eff)>1){
for(i in 2:length(fix.eff)){ mMed.f <- paste(mMed.f,fix.eff[i],sep=" + ") }} # mediator model
mOut.f <- paste(gsub(gsub(".mc","",med),resp,mMed.f),med,sep=" + ") # outcome model
mMed.f <- paste(mMed.f,ran.eff,sep=" + ") # adding random effects
mOut.f <- paste(mOut.f,ran.eff,sep=" + ")
# fitting models
if(messages==TRUE){ cat("\n\nFitting GLMR models of",resp,"and",med,"on",nrow(data),"observations from",
nlevels(as.factor(as.character(data$ID))),"participants \n using the",family,
"family with the",link,"link function using",ifelse(REML==FALSE,"ML","REML"),"estimator...") }
if(family=="normal" & link=="identity"){
mMed <- lmer(as.formula(mMed.f),data=data,REML=REML)
mOut <- lmer(as.formula(mOut.f),data=data,REML=REML)
} else if(family=="normal" & link!="identity") {
mMed <- glmer(as.formula(mMed.f),data=data,REML=REML,family=gaussian(link=link))
mOut <- glmer(as.formula(mOut.f),data=data,REML=REML,family=gaussian(link=link))
} else if(family=="gamma"){
mMed <- glmer(as.formula(mMed.f),data=data,family=Gamma(link=link))
mOut <- glmer(as.formula(mOut.f),data=data,family=Gamma(link=link))
} else { stop(message="Error: only normal, logistic, and gamma family are allowed,
with identity, inverse, and log link functions") }
# mediation analysis
if(noCov==TRUE){
medM <- mediation::mediate(model.m=mMed,model.y=mOut,treat=treat,mediator=med, # mediation & output models, treatment & mediator
covariates=NULL,boot=FALSE,sims=sims) # quasi-Bayesian confidence intervals
} else {
medM <- mediation::mediate(model.m=mMed,model.y=mOut,treat=treat,mediator=med, # mediation & output models, treatment & mediator
covariates=data[,fix.eff[fix.eff!=treat]], # covariates
boot=FALSE,sims=sims) } # quasi-Bayesian confidence intervals
# returning estimated quasi-Bayesian p-value
key.results <- data.frame(indirect.p=medM$d.avg.p,ind.p.sig=medM$d.avg.p<alpha.level,
direct.p=medM$z.avg.p,ind.p.sig=medM$z.avg.p<alpha.level)
return(key.results) }
Moreover, since a further robustness check to be implemented for all
outcomes is reproducing the analyses with the full sample, we also
reprocess the full diary
dataset by
removing missing responses and mean-centering predictors.
Show code
# afternoon blood pressure
cleanBP_aft_full <- as.data.frame(na.omit(diary[,c("ID","SBP_aft","DBP_aft","gender","age","BMI","WHLSM")])) # listwise del
cleanBP_aft_full$ID <- as.factor(as.character(cleanBP_aft_full$ID)) # resetting participant identifier levels
cat(nrow(cleanBP_aft_full),"complete obs from",nlevels(as.factor(as.character(cleanBP_aft_full$ID))),"participants")
## 907 complete obs from 135 participants
for(Var in c("WHLSM")){ # person-mean-centering lv-1 continuous predictors
cleanBP_aft_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanBP_aft_full$ID),],
aggregate(cleanBP_aft_full[,Var],list(cleanBP_aft_full$ID),mean)[,2]) # individual means
colnames(cleanBP_aft_prelqs_full)[ncol(cleanBP_aft_prelqs_full)] <- paste0(Var,".cm")
cleanBP_aft_full <- join(cleanBP_aft_full,cleanBP_aft_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
cleanBP_aft_full[,paste0(Var,".mc")] <- cleanBP_aft_full[,Var] - cleanBP_aft_full[,paste0(Var,".cm")] } # mean-centered
for(Var in c("age","BMI","WHLSM.cm")){
cleanBP_aft_full[,paste0(Var,".gmc")] <- cleanBP_aft_full[,Var] - mean(cleanBP_aft_prelqs_full[,Var]) } # gmc
# evening blood pressure
cleanBP_eve_full <- as.data.frame(na.omit(diary[,c("ID","SBP_eve","DBP_eve","gender","age","BMI", # list-wise deletion
"WHLSM","PD")]))
cleanBP_eve_full$ID <- as.factor(as.character(cleanBP_eve_full$ID)) # resetting participant identifier levels
cat(nrow(cleanBP_eve_full),"complete obs from",nlevels(as.factor(as.character(cleanBP_eve_full$ID))),"participants")
## 825 complete obs from 134 participants
for(Var in c("WHLSM","PD")){ # person-mean-centering lv-1 continuous predictors
cleanBP_eve_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanBP_eve_full$ID),],
aggregate(cleanBP_eve_full[,Var],list(cleanBP_eve_full$ID),mean)[,2]) # individual means
colnames(cleanBP_eve_prelqs_full)[ncol(cleanBP_eve_prelqs_full)] <- paste0(Var,".cm")
cleanBP_eve_full <- join(cleanBP_eve_full,cleanBP_eve_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
cleanBP_eve_full[,paste0(Var,".mc")] <- cleanBP_eve_full[,Var] - cleanBP_eve_full[,paste0(Var,".cm")] } # mean-centered
for(Var in c("age","BMI","WHLSM.cm")){
cleanBP_eve_full[,paste0(Var,".gmc")] <- cleanBP_eve_full[,Var] - mean(cleanBP_eve[!duplicated(cleanBP_eve$ID),Var]) } # gmc
# afternoon-to-evening blood pressure
cleanBP_med_eve_full <- as.data.frame(na.omit(diary[,c("ID","SBP_aft","DBP_aft","SBP_eve","DBP_eve", # list-wise deletion
"gender","age","BMI","WHLSM","PD")]))
cleanBP_med_eve_full$ID <- as.factor(as.character(cleanBP_med_eve_full$ID))
wide <- cleanBP_med_eve_full[!duplicated(cleanBP_med_eve_full$ID),]
for(Var in c("WHLSM","PD","SBP_aft","DBP_aft")){
wide <- cbind(wide,aggregate(cleanBP_med_eve_full[,Var],list(cleanBP_med_eve_full$ID),mean)[,2])
colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
cleanBP_med_eve_full <- join(cleanBP_med_eve_full,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
cleanBP_med_eve_full[,paste0(Var,".mc")] <- cleanBP_med_eve_full[,Var] - cleanBP_med_eve_full[,paste0(Var,".cm")] }
for(Var in c("age","BMI","WHLSM.cm")){ cleanBP_med_eve_full[,paste0(Var,".gmc")] <-
cleanBP_med_eve_full[,Var] - mean(wide[,Var]) } # gmc
cat("Considering",nrow(cleanBP_med_eve_full),"complete obs from",
nlevels(as.factor(as.character(cleanBP_med_eve_full$ID))),"participants")
## Considering 820 complete obs from 134 participants
# emotional exhaustion
cleanEE_full <- as.data.frame(na.omit(diary[,c("ID","EE","gender","PD","WHLSM")])) # listwise deletion
cleanEE_full$ID <- as.factor(as.character(cleanEE_full$ID)) # resetting participant identifier levels
cat(nrow(cleanEE_full),"complete obs from",nlevels(as.factor(as.character(cleanEE_full$ID))),"participants")
## 827 complete obs from 134 participants
for(Var in c("PD","WHLSM")){ # person-mean-centering lv-1 continuous predictors
clean_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanEE_full$ID),],
aggregate(cleanEE_full[,Var],list(cleanEE_full$ID),mean)[,2]) # individual means
colnames(clean_prelqs_full)[ncol(clean_prelqs_full)] <- paste0(Var,".cm")
cleanEE_full <- join(cleanEE_full,clean_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
cleanEE_full[,paste0(Var,".mc")] <- cleanEE_full[,Var] - cleanEE_full[,paste0(Var,".cm")] } # mean-centered scores
for(Var in c("WHLSM.cm")){ cleanEE_full[,paste0(Var,".gmc")] <- cleanEE_full[,Var] - mean(cleanEE_full[,Var]) } # gmc
# sleep disturbances
cleanSD_full <- as.data.frame(na.omit(diary[,c("ID","SD","gender","dailyHassles_eve","PD","WHLSM")])) # listwise del
cleanSD_full$ID <- as.factor(as.character(cleanSD_full$ID)) # resetting participant identifier levels
cat(nrow(cleanSD_full),"complete obs from",nlevels(as.factor(as.character(cleanSD_full$ID))),"participants")
## 753 complete obs from 132 participants
for(Var in c("PD","WHLSM")){ # person-mean-centering lv-1 continuous predictors
clean_prelqs_full <- cbind(prelqs[prelqs$ID%in%levels(cleanSD_full$ID),],
aggregate(cleanSD_full[,Var],list(cleanSD_full$ID),mean)[,2]) # individual means
colnames(clean_prelqs_full)[ncol(clean_prelqs_full)] <- paste0(Var,".cm")
cleanSD_full <- join(cleanSD_full,clean_prelqs_full[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
cleanSD_full[,paste0(Var,".mc")] <- cleanSD_full[,Var] - cleanSD_full[,paste0(Var,".cm")] } # mean-centered scores
for(Var in c("WHLSM.cm")){ cleanSD_full[,paste0(Var,".gmc")] <- cleanSD_full[,Var] - mean(cleanSD_full[,Var]) } # gmc
As a further check, we include position
as an additional
covariate, which we recode into two levels, namely “Employee/Project”
vs. “Managers/Employers”.
cleanBP_aft$position <- as.factor(gsub("Employee","employee/project",
gsub("Project","employee/project",cleanBP_aft$position)))
cleanBP_eve$position <- as.factor(gsub("Employee","employee/project",
gsub("Project","employee/project",cleanBP_eve$position)))
cleanBP_med_eve$position <- as.factor(gsub("Employee","employee/project",
gsub("Project","employee/project",cleanBP_med_eve$position)))
cleanEE$position <- as.factor(gsub("Employee","employee/project",
gsub("Project","employee/project",cleanEE$position)))
cleanSD$position <- as.factor(gsub("Employee","employee/project",
gsub("Project","employee/project",cleanSD$position)))
Finally, we load the raw preliminary questionnaire item scores to
compute the composite score at the retrospective version of the DUWAS,
used for a robustness check.
# isolating raw item scores at the retrospective DUWAS scale
prelqs.retroWHLSM <- prelqs[,c("ID",paste0("duwas",1:10))]
prelqs.retroWHLSM <- prelqs.retroWHLSM[prelqs.retroWHLSM$ID %in% clean$ID,] # subsampling participants included in the clean dataset
prelqs.retroWHLSM$ID <- as.factor(as.character(prelqs.retroWHLSM$ID))
cat("Included participants =",nlevels(prelqs.retroWHLSM$ID))
## Included participants = 114
# computing Cronbach's alpha and 95% CI
psych::alpha(prelqs.retroWHLSM[,paste0("duwas",1:10)])$feldt
##
## 95% confidence boundaries (Feldt)
## lower alpha upper
## 0.74 0.8 0.85
# computing grand-mean-centered composite score and adding it to all datasets used below
prelqs.retroWHLSM$WHLSM.retro <- apply(prelqs.retroWHLSM[,paste0("duwas",1:10)],1,mean)
cleanBP_aft <- plyr::join(cleanBP_aft,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_aft$WHLSM.retro.gmc <- cleanBP_aft$WHLSM.retro - mean(cleanBP_aft$WHLSM.retro)
cleanBP_eve <- plyr::join(cleanBP_eve,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_eve$WHLSM.retro.gmc <- cleanBP_eve$WHLSM.retro - mean(cleanBP_eve$WHLSM.retro)
cleanBP_med_eve <- plyr::join(cleanBP_med_eve,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanBP_med_eve$WHLSM.retro.gmc <- cleanBP_med_eve$WHLSM.retro - mean(cleanBP_med_eve$WHLSM.retro)
cleanEE <- plyr::join(cleanEE,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanEE$WHLSM.retro.gmc <- cleanEE$WHLSM.retro - mean(cleanEE$WHLSM.retro)
cleanSD <- plyr::join(cleanSD,prelqs.retroWHLSM[,c("ID","WHLSM.retro")],by="ID",type="left")
cleanSD$WHLSM.retro.gmc <- cleanSD$WHLSM.retro - mean(cleanSD$WHLSM.retro)
4.1. Blood pressure
4.1.1. Afternoon BP
For afternoon blood pressure, we implement the following robustness
checks:
No Infl
: we remove influential participants
No dysf/drugs
: we remove all participants reporting
sleep dysfunctions, hormonal or psychoactive medications, in addition to
those meeting exclusion criteria for blood pressure
No Cov
: we remove all covariates, that is we only
include WHLSM.mc
and its interactions as model
predictors
All in
: we include all complete observations from
all participants, including those meeting the exclusion criteria for
compliance and blood pressure
ML
: we refit the models by using the Maximum
Likelihood estimator, rather than the Restricted Maximum
Likelihood
Rand slope
: we include the random slope for
WHLSM.mc
logTransf
: we log-transform the response variable
values before fitting the models
confounders_aft
: we include potentially confounding
factors for blood pressure (e.g., smoking, physical activity) reported
in the afternoon as an additional control variable
position
: we include job position (Employee/Project
vs. Manager/(Self-)Employer) as an additional control variable
children
: we include the number of children as an
additional control variable
No flagBP
: we exclude all observations that were
reprocessed due to extreme BP values (see Supplementary
Material S3)
No flagTime
: we exclude all observations that were
flagged due to their associated timing (e.g., morning BP recorded in the
afternoon) (see Supplementary
Material S3)
No careless
: we exclude one participant
S137
flagged as potentially careless (see Supplementary
Material S3).
WE
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WC
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WHLSM retro
: we replace the predictor term for trait
workaholism with the composite score at the retrospective version of the
DUWAS included in the preliminary questionnaire.
In all cases, the results are consistent with those
reported in the main analyses, showing substantial contribution and main
effect of state WHLSM.mc
.
SBP_aft
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
"confounders_aft","position","children","No flagBP","No flagTime","No careless","WE","WC","WHLSM retro")
# main effect of WHLSM.mc
predictors <- c("gender","age.gmc","BMI.gmc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_aft" # response variable
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[!cleanBP_aft$ID%in%c("S096","S082"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_aft$psy_drugs=="No" & cleanBP_aft$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft_full,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanBP_aft,resp="log(SBP_aft)",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-transf
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"confounders_aft", # adding confounders_aft
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"position", # adding position
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"children", # adding children
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$flagBP_aft==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$careless==FALSE,], # without careless participant
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excess
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM retro
mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc")))
kable(p)
Original |
TRUE |
TRUE |
TRUE |
3.90 |
No Infl |
TRUE |
TRUE |
TRUE |
3.08 |
No dysf/drugs |
TRUE |
TRUE |
TRUE |
3.33 |
No Cov |
TRUE |
TRUE |
TRUE |
3.90 |
All in |
TRUE |
TRUE |
TRUE |
3.43 |
ML |
TRUE |
TRUE |
TRUE |
3.90 |
Rand slope |
TRUE |
TRUE |
TRUE |
3.61 |
logTransf |
TRUE |
TRUE |
TRUE |
3.68 |
confounders_aft |
TRUE |
TRUE |
TRUE |
3.91 |
position |
TRUE |
TRUE |
TRUE |
3.90 |
children |
TRUE |
TRUE |
TRUE |
3.90 |
No flagBP |
TRUE |
TRUE |
TRUE |
3.80 |
No flagTime |
TRUE |
TRUE |
TRUE |
3.88 |
No careless |
TRUE |
TRUE |
TRUE |
3.93 |
WE |
TRUE |
TRUE |
TRUE |
3.75 |
WC |
TRUE |
TRUE |
TRUE |
3.26 |
WHLSM retro |
TRUE |
TRUE |
TRUE |
3.90 |
DBP_aft
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
"confounders_aft","position","children","No flagBP","No flagTime","No careless","WE","WC","WHLSM retro")
# main effect of WHLSM.mc
predictors <- c("gender","age.gmc","BMI.gmc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "DBP_aft" # response variable
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[!cleanBP_aft$ID%in%c("S082"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_aft$psy_drugs=="No" & cleanBP_aft$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft_full,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanBP_aft,resp="log(SBP_aft)",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-transf
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"confounders_aft", # adding confounders_aft
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"position", # adding position
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=c(predictors[1:3],"children", # adding children
predictors[4:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$flagBP_aft==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft[cleanBP_aft$careless==FALSE,], # without careless
resp=r,fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excess
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
glmerAn(data=cleanBP_aft,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc")))
kable(p)
Original |
TRUE |
TRUE |
TRUE |
3.74 |
No Infl |
TRUE |
TRUE |
TRUE |
3.45 |
No dysf/drugs |
TRUE |
TRUE |
TRUE |
3.96 |
No Cov |
TRUE |
TRUE |
TRUE |
3.74 |
All in |
TRUE |
TRUE |
TRUE |
3.17 |
ML |
TRUE |
TRUE |
TRUE |
3.74 |
Rand slope |
TRUE |
TRUE |
TRUE |
3.56 |
logTransf |
TRUE |
TRUE |
TRUE |
3.68 |
confounders_aft |
TRUE |
TRUE |
TRUE |
3.73 |
position |
TRUE |
TRUE |
TRUE |
3.74 |
children |
TRUE |
TRUE |
TRUE |
3.74 |
No flagBP |
TRUE |
TRUE |
TRUE |
3.20 |
No flagTime |
TRUE |
TRUE |
TRUE |
3.72 |
No careless |
TRUE |
TRUE |
TRUE |
3.79 |
WE |
TRUE |
TRUE |
TRUE |
3.45 |
WC |
TRUE |
TRUE |
TRUE |
3.27 |
WHLSM retro |
TRUE |
TRUE |
TRUE |
3.74 |
4.1.2. Evening BP
For evening blood pressure, we implement the following robustness
checks:
No Infl
: we remove influential participants
No dysf/drugs
: we remove all participants reporting
sleep dysfunctions, hormonal or psychoactive medications, in addition to
those meeting exclusion criteria for blood pressure
No Cov
: we remove all covariates, that is we only
include WHLSM.mc
and its interactions as model
predictors
All in
: we include all complete observations from
all participants, including those meeting the exclusion criteria for
compliance and blood pressure
ML
: we refit the models by using the Maximum
Likelihood estimator, rather than the Restricted Maximum
Likelihood
Rand slope
: we include the random slope for
WHLSM.mc
logTransf
: we log-transform the response variable
values before fitting the models
confounders_eve
: we include potentially confounding
factors for blood pressure (e.g., smoking, physical activity) reported
in the afternoon as an additional control variable
position
: we include job position (Employee/Project
vs. Manager/(Self-)Employer) as an additional control variable
children
: we include the number of children as an
additional control variable
No flagBP
: we exclude all observations that were
reprocessed due to extreme BP values (see Supplementary
Material S3)
No flagTime
: we exclude all observations that were
flagged due to their associated timing (e.g., morning BP recorded in the
afternoon) (see Supplementary
Material S3)
No careless
: we exclude one participant
S137
flagged as potentially careless (see Supplementary
Material S3)
day1
: we include recording day
as a
further covariate (i.e., 1 = first day, 2 = any other day). In all
cases, the results are consistent with those reported
in the main analyses, showing no substantial contribution and main
effect of state WHLSM.mc
.
WE
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WC
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WHLSM retro
: we replace the predictor term for trait
workaholism with the composite score at the retrospective version of the
DUWAS included in the preliminary questionnaire.
# setting robustness checks
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","logTransf",
"confounders_eve","position","children","No flagBP","No flagTime","No careless","day1",
"WE","WC","WHLSM retro")
# creating categorical variable day1 (i.e., first day vs. all other days)
cleanBP_eve$day1 <- 0
cleanBP_eve[cleanBP_eve$day==1,"day1"] <- 1
cleanBP_eve$day1 <- as.factor(cleanBP_eve$day1)
In all cases, the results are consistent with those
reported in the main analyses, showing no substantial contribution or
main effect of state WHLSM.mc
(only substantial in a few
cases for DBP_eve
) and no substantial interactions with
psychological detachment.
MAIN EFFECT
SBP_eve
predictors <- c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_eve" # response variable
key <- "WHLSM.mc" # key model and key predictor
bsl <- "WHLSM.cm.gmc" # baseline model
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S096"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("WHLSM.mc"), # without covariates
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
key.predictor=key,key.model=key,REML=FALSE),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope (SINGULAR FIT)
key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanBP_eve,resp="log(SBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # log-transf
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"confounders_eve", # adding confounders_eve
predictors[6:length(predictors)]),mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"position", # adding position
predictors[6:length(predictors)]),mComp.baseline="position",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"children", # adding children
predictors[6:length(predictors)]),mComp.baseline="children",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"day1",predictors[6:length(predictors)]), # adding day
mComp.baseline="day1",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
mComp.baseline=bsl,key.predictor="WE.mc",key.model="WE.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
mComp.baseline=bsl,key.predictor="WC.mc",key.model="WC.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM retro
mComp.baseline="WHLSM.retro.gmc",key.predictor=key,key.model=key)))
kable(p)
Original |
FALSE |
FALSE |
FALSE |
0.76 |
No Infl |
FALSE |
FALSE |
FALSE |
0.39 |
No dysf/drugs |
FALSE |
FALSE |
FALSE |
0.48 |
No Cov |
FALSE |
FALSE |
FALSE |
1.05 |
All in |
FALSE |
FALSE |
FALSE |
0.92 |
ML |
FALSE |
FALSE |
FALSE |
0.76 |
Rand slope |
FALSE |
FALSE |
FALSE |
0.81 |
logTransf |
FALSE |
FALSE |
FALSE |
0.51 |
confounders_eve |
FALSE |
FALSE |
FALSE |
0.76 |
position |
FALSE |
FALSE |
FALSE |
0.76 |
children |
FALSE |
FALSE |
FALSE |
0.76 |
No flagBP |
FALSE |
FALSE |
FALSE |
0.52 |
No flagTime |
FALSE |
FALSE |
FALSE |
0.65 |
No careless |
FALSE |
FALSE |
FALSE |
0.84 |
day1 |
FALSE |
FALSE |
FALSE |
1.04 |
WE |
FALSE |
FALSE |
FALSE |
0.37 |
WC |
FALSE |
FALSE |
FALSE |
1.02 |
WHLSM retro |
FALSE |
FALSE |
FALSE |
0.76 |
DBP_eve
r <- "DBP_eve" # response variable
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key), # original
glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S082","S080"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("WHLSM.mc"),key.predictor=key,key.model=key), # without covariates
glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
key.predictor=key,key.model=key,REML=FALSE),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp="log(DBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # Gamma log
key.predictor=key,key.model=key,family="gamma",link="log"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"confounders_eve", # adding confounders_eve
predictors[6:length(predictors)]),mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"position", # adding position
predictors[6:length(predictors)]),mComp.baseline="position",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"children", # adding children
predictors[6:length(predictors)]),mComp.baseline="children",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless participants
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:5],"day1",predictors[6:length(predictors)]), # adding day
mComp.baseline="day1",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
mComp.baseline=bsl,key.predictor="WE.mc",key.model="WE.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
mComp.baseline=bsl,key.predictor="WC.mc",key.model="WC.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.retro.gmc",key.predictor=key,key.model=key)))
kable(p)
Original |
FALSE |
TRUE |
FALSE |
1.95 |
No Infl |
TRUE |
TRUE |
TRUE |
2.06 |
No dysf/drugs |
FALSE |
TRUE |
FALSE |
1.44 |
No Cov |
TRUE |
TRUE |
TRUE |
2.04 |
All in |
FALSE |
TRUE |
FALSE |
1.64 |
ML |
FALSE |
TRUE |
FALSE |
1.96 |
Rand slope |
FALSE |
TRUE |
FALSE |
1.95 |
logTransf |
FALSE |
TRUE |
FALSE |
1.72 |
confounders_eve |
FALSE |
TRUE |
FALSE |
1.93 |
position |
FALSE |
TRUE |
FALSE |
1.95 |
children |
FALSE |
TRUE |
FALSE |
1.95 |
No flagBP |
TRUE |
TRUE |
TRUE |
2.04 |
No flagTime |
TRUE |
TRUE |
TRUE |
2.02 |
No careless |
FALSE |
TRUE |
FALSE |
1.93 |
day1 |
TRUE |
TRUE |
TRUE |
2.29 |
WE |
FALSE |
TRUE |
FALSE |
1.87 |
WC |
FALSE |
TRUE |
FALSE |
1.65 |
WHLSM retro |
FALSE |
TRUE |
FALSE |
1.95 |
INTERACTION
SBP_eve
# interaction with RDet.mc
r <- "SBP_eve"
predictors <- c(predictors,"PD.mc:WHLSM.mc") # predictors
key <- "PD.mc:WHLSM.mc" # key model and key predictor
bsl <- "WHLSM.mc" # baseline model
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S096","S082"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
key.predictor=key,key.model=key,REML=FALSE),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope (SINGULAR FIT)
key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanBP_eve,resp="log(SBP_eve)",fix.eff=predictors,mComp.baseline=bsl, # log-transf
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"confounders_eve", # adding confounders_eve
predictors[7:length(predictors)]),
mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"position", # adding position
predictors[7:length(predictors)]),
mComp.baseline="position",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"children", # adding children
predictors[7:length(predictors)]),
mComp.baseline="children",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless participant
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"day1",predictors[7:length(predictors)]), # adding day
mComp.baseline="day1",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM.retro
mComp.baseline=bsl,key.predictor=key,key.model=key)))
kable(p)
Original |
FALSE |
FALSE |
FALSE |
0.80 |
No Infl |
FALSE |
FALSE |
FALSE |
0.58 |
No dysf/drugs |
FALSE |
FALSE |
FALSE |
0.95 |
No Cov |
FALSE |
TRUE |
FALSE |
1.46 |
All in |
FALSE |
FALSE |
FALSE |
0.85 |
ML |
FALSE |
FALSE |
FALSE |
0.81 |
Rand slope |
FALSE |
FALSE |
FALSE |
0.69 |
logTransf |
FALSE |
FALSE |
FALSE |
0.91 |
confounders_eve |
FALSE |
FALSE |
FALSE |
0.79 |
position |
FALSE |
FALSE |
FALSE |
0.79 |
children |
FALSE |
FALSE |
FALSE |
0.80 |
No flagBP |
FALSE |
FALSE |
FALSE |
0.51 |
No flagTime |
FALSE |
FALSE |
FALSE |
1.04 |
No careless |
FALSE |
FALSE |
FALSE |
0.82 |
day1 |
FALSE |
FALSE |
FALSE |
0.72 |
WE |
FALSE |
FALSE |
FALSE |
1.05 |
WC |
FALSE |
FALSE |
FALSE |
0.38 |
WHLSM retro |
FALSE |
FALSE |
FALSE |
0.79 |
DBP_eve
r <- "DBP_eve"
p <- cbind(check=checks,
rbind(glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # original
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[!cleanBP_eve$ID%in%c("S096","S080"),], # without influential
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria (SINGULAR FIT)
cleanBP_eve$psy_drugs=="No" & cleanBP_eve$psy_drugs=="No",],
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve_full,resp=r,fix.eff=predictors,mComp.baseline=bsl, # full sample
key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # maximum likelihood
key.predictor=key,key.model=key,REML=FALSE),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=predictors,mComp.baseline=bsl, # random slope
key.predictor=key,key.model=key,ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanBP_eve,resp="DBP_eve",fix.eff=predictors,mComp.baseline=bsl, # Gamma log
key.predictor=key,key.model=key,family="gamma",link="log"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"confounders_eve", # adding confounders_eve
predictors[7:length(predictors)]),
mComp.baseline="confounders_eve",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"position", # adding position
predictors[7:length(predictors)]),
mComp.baseline="position",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"children", # adding children
predictors[7:length(predictors)]),
mComp.baseline="children",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagBP_eve==FALSE,], # without flagged BP
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$flagTime==FALSE,], # without flagged times
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve[cleanBP_eve$careless==FALSE,], # without careless
resp=r,fix.eff=predictors,mComp.baseline=bsl,key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=c(predictors[1:6],"day1",predictors[7:length(predictors)]), # adding day
mComp.baseline="day1",key.predictor=key,key.model=key),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WE.mc",predictors), # working excessively
mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.mc","WC.mc",predictors), # working compulsively
mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"),
glmerAn(data=cleanBP_eve,resp=r,fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors), # WHLSM.retro
mComp.baseline=bsl,key.predictor=key,key.model=key)))
kable(p)
Original |
FALSE |
FALSE |
FALSE |
0.01 |
No Infl |
FALSE |
FALSE |
FALSE |
-0.01 |
No dysf/drugs |
FALSE |
FALSE |
FALSE |
0.52 |
No Cov |
FALSE |
FALSE |
FALSE |
0.10 |
All in |
FALSE |
FALSE |
FALSE |
0.63 |
ML |
FALSE |
FALSE |
FALSE |
0.01 |
Rand slope |
FALSE |
FALSE |
FALSE |
-0.10 |
logTransf |
FALSE |
FALSE |
FALSE |
-0.09 |
confounders_eve |
FALSE |
FALSE |
FALSE |
-0.04 |
position |
FALSE |
FALSE |
FALSE |
-0.01 |
children |
FALSE |
FALSE |
FALSE |
0.02 |
No flagBP |
FALSE |
FALSE |
FALSE |
0.22 |
No flagTime |
FALSE |
FALSE |
FALSE |
0.05 |
No careless |
FALSE |
FALSE |
FALSE |
0.05 |
day1 |
FALSE |
FALSE |
FALSE |
-0.09 |
WE |
FALSE |
FALSE |
FALSE |
0.14 |
WC |
FALSE |
FALSE |
FALSE |
-0.13 |
WHLSM retro |
FALSE |
FALSE |
FALSE |
0.02 |
4.1.3. Mediations
For Afternoon-to-Evening mediations, we implement the following
robustness checks:
No Infl
: we remove all influential participants
found for afternoon and evening BP
No dysf/drugs
: we remove all participants reporting
sleep dysfunctions, hormonal or psychoactive medications, in addition to
those meeting exclusion criteria for blood pressure
No Cov
: we remove all covariates, that is we only
include WHLSM.mc
and its interactions as model
predictors
All in
: we include all complete observations from
all participants, including those meeting the exclusion criteria for
compliance and blood pressure
ML
: we refit the models by using the Maximum
Likelihood estimator, rather than the Restricted Maximum
Likelihood
Rand slope
: we include the random slope for
WHLSM.mc
log-transf
: we log-transform blood pressure before
fitting the models
confounders
: we include potentially confounding
factors for blood pressure (e.g., smoking, physical activity) reported
in the afternoon or in the evening as an additional control
variable
position
: we include job position (Employee/Project
vs. Manager/(Self-)Employer) as an additional control variable
children
: we include the number of children as an
additional control variable
No flagBP
: we exclude all observations that were
reprocessed due to extreme BP values either in the afternoon or in the
evening (see Supplementary
Material S3); morning flagged cases are not considered to avoid
loosing too many observations
No flagTime
: we exclude all observations that were
flagged due to their associated timing (e.g., morning BP recorded in the
afternoon) (see Supplementary
Material S3)
No careless
: we exclude one participant
S137
flagged as potentially careless (see Supplementary
Material S3)
day1
: we include recording day
as a
further covariate (i.e., 1 = first day, 2 = any other day). In all
cases, the results are consistent with those reported
in the main analyses, showing no substantial contribution and main
effect of state WHLSM.mc
.
WE
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WC
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WHLSM retro
: we replace the predictor term for trait
workaholism with the composite score at the retrospective version of the
DUWAS included in the preliminary questionnaire.
# setting robustness checks
checks <- c("Original","No Infl","No dysf/drugs","No Cov","All in","ML","Rand slope","log-transf",
"confounders","position","children","No flagBP","No flagTime","No careless","day1",
"WE","WC","WHLSM.retro")
# recoding variables
cleanBP_med_eve$conf <- FALSE # summary of afternoon and evening confounders
cleanBP_med_eve[cleanBP_med_eve$confounders_aft==TRUE | cleanBP_med_eve$confounders_eve==TRUE,"conf"] <- TRUE
summary(cleanBP_med_eve$conf)
## Mode FALSE TRUE
## logical 531 186
cleanBP_med_eve$flagBP <- FALSE # summary of afternoon and evening flagBP
cleanBP_med_eve[cleanBP_med_eve$flagBP_aft==TRUE | cleanBP_med_eve$flagBP_eve==TRUE,"flagBP"] <- TRUE
summary(cleanBP_med_eve$flagBP)
## Mode FALSE TRUE
## logical 701 16
cleanBP_med_eve$day1 <- 0 # creating categorical variable day1 (i.e., first day vs. all other days)
cleanBP_med_eve[cleanBP_med_eve$day==1,"day1"] <- 1
cleanBP_med_eve$day1 <- as.factor(cleanBP_med_eve$day1)
summary(cleanBP_med_eve$day1)
## 0 1
## 634 83
In all cases, the results for SBP
are
consistent with those reported in the main analyses, showing
significant indirect but not direct relationship between state
WHLSM.mc
and SBP_eve
. Most results for
DBP
are consistent as well, but the
indirect relationship is reduced in one case, i.e.,
with the removal of participants reporting sleep dysfunctions, hormonal,
or psychoactive medications. Similarly, the direct relationship becomes
significant with the inclusion of day1
as a covariate.
Whereas these findings question the generalizability of such
relationship, the high number of consistent robustness checks provides
some evidence that the relationship is observable in our sample.
SBP_eve
predictors <- c("gender","age.gmc","BMI.gmc","PD.mc","WHLSM.cm.gmc","WHLSM.mc") # predictors
r <- "SBP_eve" # response variable
t <- "WHLSM.mc" # key model and key predictor
m <- "SBP_aft.mc"
p <- cbind(check=checks,
rbind(glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors), # original
glmerMed(data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),], # without influential cases
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_med_eve$psy_drugs=="No" & cleanBP_med_eve$psy_drugs=="No",],
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c("WHLSM.mc"),noCov=TRUE), # w/o covariates
glmerMed(data=cleanBP_med_eve_full,resp=r,treat=t,med=m,fix.eff=predictors), # full sample
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors,REML=FALSE), # maximum likelihood
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors, # random slope (singular fit)
ran.eff="(WHLSM.mc|ID)"),
glmerMed(data=cleanBP_med_eve,resp="log(SBP_eve)",treat=t,med=m,fix.eff=predictors), # log transformation
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"conf", # adding confounders
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"position", # adding position
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"children", # adding children
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagBP==FALSE,], # without flagged BP cases
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagTime==FALSE,], # without flagged times
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$careless==FALSE,], # without careless participants
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"day1", # adding day
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat="WE.mc",med=m,
fix.eff=gsub("WHLSM.mc","WE.mc",predictors)), # working excessively
glmerMed(data=cleanBP_med_eve,resp=r,treat="WC.mc",med=m,
fix.eff=gsub("WHLSM.mc","WC.mc",predictors)), # working compulsively
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,
fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro",predictors)))) # WHLSM retro
kable(p)
Original |
0.002 |
TRUE |
0.748 |
FALSE |
No Infl |
0.026 |
TRUE |
0.966 |
FALSE |
No dysf/drugs |
0.010 |
TRUE |
0.926 |
FALSE |
No Cov |
0.002 |
TRUE |
0.634 |
FALSE |
All in |
0.000 |
TRUE |
0.630 |
FALSE |
ML |
0.000 |
TRUE |
0.762 |
FALSE |
Rand slope |
0.010 |
TRUE |
0.684 |
FALSE |
log-transf |
0.000 |
TRUE |
0.970 |
FALSE |
confounders |
0.000 |
TRUE |
0.762 |
FALSE |
position |
0.006 |
TRUE |
0.826 |
FALSE |
children |
0.000 |
TRUE |
0.784 |
FALSE |
No flagBP |
0.004 |
TRUE |
0.942 |
FALSE |
No flagTime |
0.002 |
TRUE |
0.910 |
FALSE |
No careless |
0.000 |
TRUE |
0.744 |
FALSE |
day1 |
0.002 |
TRUE |
0.598 |
FALSE |
WE |
0.006 |
TRUE |
0.922 |
FALSE |
WC |
0.012 |
TRUE |
0.534 |
FALSE |
WHLSM.retro |
0.002 |
TRUE |
0.796 |
FALSE |
DBP_eve
r <- "DBP_eve" # response variable
p <- cbind(check=checks,
rbind(glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors), # original
glmerMed(data=cleanBP_med_eve[!cleanBP_med_eve$ID%in%c("S082","S096"),], # without influential cases
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$sleep_dysf=="No" & # without participants meeting exclusion criteria
cleanBP_med_eve$psy_drugs=="No" & cleanBP_med_eve$psy_drugs=="No",],
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c("WHLSM.mc"),noCov=TRUE), # w/o covariates
glmerMed(data=cleanBP_med_eve_full,resp=r,treat=t,med=m,fix.eff=predictors), # full sample
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors,REML=FALSE), # maximum likelihood
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=predictors, # random slope (singular fit)
ran.eff="(WHLSM.mc|ID)"),
glmerMed(data=cleanBP_med_eve,resp="log(DBP_eve)",treat=t,med=m,fix.eff=predictors), # log-transformation
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"conf", # adding confounders
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"position", # adding position
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"children", # adding children
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagBP==FALSE,], # without flagged BP cases
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$flagTime==FALSE,], # without flagged times
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve[cleanBP_med_eve$careless==FALSE,], # without careless participants
resp=r,treat=t,med=m,fix.eff=predictors),
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,fix.eff=c(predictors[1:5],"day1", # adding day
predictors[6:length(predictors)])),
glmerMed(data=cleanBP_med_eve,resp=r,treat="WE.mc",med=m,
fix.eff=gsub("WHLSM.mc","WE.mc",predictors)), # working excessively
glmerMed(data=cleanBP_med_eve,resp=r,treat="WC.mc",med=m,
fix.eff=gsub("WHLSM.mc","WC.mc",predictors)), # working compulsively
glmerMed(data=cleanBP_med_eve,resp=r,treat=t,med=m,
fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors)))) # WHLSM retro
kable(p)
Original |
0.012 |
TRUE |
0.080 |
FALSE |
No Infl |
0.024 |
TRUE |
0.064 |
FALSE |
No dysf/drugs |
0.142 |
FALSE |
0.214 |
FALSE |
No Cov |
0.018 |
TRUE |
0.082 |
FALSE |
All in |
0.006 |
TRUE |
0.198 |
FALSE |
ML |
0.012 |
TRUE |
0.082 |
FALSE |
Rand slope |
0.034 |
TRUE |
0.112 |
FALSE |
log-transf |
0.020 |
TRUE |
0.138 |
FALSE |
confounders |
0.020 |
TRUE |
0.108 |
FALSE |
position |
0.016 |
TRUE |
0.070 |
FALSE |
children |
0.014 |
TRUE |
0.094 |
FALSE |
No flagBP |
0.034 |
TRUE |
0.068 |
FALSE |
No flagTime |
0.026 |
TRUE |
0.076 |
FALSE |
No careless |
0.016 |
TRUE |
0.082 |
FALSE |
day1 |
0.028 |
TRUE |
0.042 |
TRUE |
WE |
0.016 |
TRUE |
0.100 |
FALSE |
WC |
0.020 |
TRUE |
0.176 |
FALSE |
WHLSM.retro |
0.012 |
TRUE |
0.084 |
FALSE |
4.2. Emotional
Exhaustion
For emotional exhaustion, we implement the following robustness
checks:
No Infl
: we remove influential participants
No Cov
: we remove all covariates, that is we only
include WHLSM.mc
and its interactions as model
predictors
All in
: we include all complete observations from
all participants, including those meeting the exclusion criteria for
compliance and blood pressure
ML
: we refit the models by using the Maximum
Likelihood estimator, rather than the Restricted Maximum
Likelihood
Rand slope
: we include the random slope for
WHLSM.mc
Gamma-log
: we refit the models using the Gamma
family with the logarithmic link function
logNorm
: we refit the models with using log-normal
GLM
position
: we include job position (Employee/Project
vs. Manager/(Self-)Employer) as an additional control variable
children
: we include the number of children as an
additional control variable
No flagTime
: we exclude all observations that were
flagged due to their associated timing (e.g., morning BP recorded in the
afternoon) (see Supplementary
Material S3)
No careless
: we exclude one participant
S137
flagged as potentially careless (see Supplementary
Material S3).
day
: we include day
as a further
continuous covariate (i.e., 1 = first day, 2 = second day,
etc.)
WE
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WC
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WHLSM retro
: we replace the predictor term for trait
workaholism with the composite score at the retrospective version of the
DUWAS included in the preliminary questionnaire.
checks <- c("Original","No Infl","No Cov","All in","ML","Rand slope","Gamma-log","logNorm",
"position","children","No flagTime","No careless","day","WE","WC","WHLSM retro")
In all cases, the results are consistent with those
reported in the main analyses, showing substantial contribution and main
effect of state WHLSM.mc
, but with no substantial
interaction with PD.mc
(only significant when using the
log-normal distribution). Thus, we interpret these findings as a sign of
the consistency of the estimated relationship between
state WHLSM.mc
and EE
.
MAIN EFFECT
# main effect of WHLSM.mc
predictors <- c("gender","PD.mc","WHLSM.cm.gmc","WHLSM.mc")
p <- cbind(check=checks,
rbind(glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE[!cleanEE$ID%in%c("S049"),], # without influential
resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c("WHLSM.mc"), # without covariates
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE_full,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # Gamma-log family
key.predictor="WHLSM.mc",key.model="WHLSM.mc",family="gamma",link="log"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-normal family
key.predictor="WHLSM.mc",key.model="WHLSM.mc",link="log"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"position", # adding position
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"children", # adding children
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE[cleanEE$flagTime==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",
key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without flagged times
glmerAn(data=cleanEE[cleanEE$careless==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",
key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without careless participants
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1:3],"day",predictors[4:length(predictors)]),
mComp.baseline="day",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excessively
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"))) # WHLSM retro
kable(p)
Original |
TRUE |
TRUE |
TRUE |
4.67 |
No Infl |
TRUE |
TRUE |
TRUE |
4.67 |
No Cov |
TRUE |
TRUE |
TRUE |
4.88 |
All in |
TRUE |
TRUE |
TRUE |
4.68 |
ML |
TRUE |
TRUE |
TRUE |
4.68 |
Rand slope |
TRUE |
TRUE |
TRUE |
3.88 |
Gamma-log |
TRUE |
TRUE |
TRUE |
4.96 |
logNorm |
TRUE |
TRUE |
TRUE |
4.41 |
position |
TRUE |
TRUE |
TRUE |
4.67 |
children |
TRUE |
TRUE |
TRUE |
4.67 |
No flagTime |
TRUE |
TRUE |
TRUE |
4.60 |
No careless |
TRUE |
TRUE |
TRUE |
4.54 |
day |
TRUE |
TRUE |
TRUE |
4.45 |
WE |
TRUE |
TRUE |
TRUE |
4.37 |
WC |
TRUE |
TRUE |
TRUE |
4.04 |
WHLSM retro |
TRUE |
TRUE |
TRUE |
4.67 |
INTERACTION
predictors <- c(predictors,"PD.mc:WHLSM.mc")
p <- cbind(check=checks,
rbind(glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # original
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE[!cleanEE$ID%in%c("S049"),], # without influential cases
resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
mComp.baseline="WHLSM.mc", key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE_full,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # full sample
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # maximum likelihood
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",REML=FALSE),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # random slope
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # gamma-log family
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",family="gamma",link="log"),
glmerAn(data=cleanEE,resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc", # log-normal family
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",link="log"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"position", # adding position
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1],"children", # adding children
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanEE[cleanEE$flagTime==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # withoug flagged times
glmerAn(data=cleanEE[cleanEE$careless==FALSE,],resp="EE",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # without careless participant
glmerAn(data=cleanEE,resp="EE",fix.eff=c(predictors[1:3],"day",predictors[4:length(predictors)]),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # day as covariate
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"), # working excessively
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"), # working compulsively
glmerAn(data=cleanEE,resp="EE",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"))) # WHLSM retro
kable(p)
Original |
FALSE |
FALSE |
FALSE |
-1.27 |
No Infl |
FALSE |
FALSE |
FALSE |
-1.24 |
No Cov |
FALSE |
FALSE |
FALSE |
-1.35 |
All in |
FALSE |
FALSE |
FALSE |
-1.20 |
ML |
FALSE |
FALSE |
FALSE |
-1.27 |
Rand slope |
FALSE |
FALSE |
FALSE |
-1.34 |
Gamma-log |
FALSE |
FALSE |
FALSE |
-0.62 |
logNorm |
FALSE |
TRUE |
FALSE |
-1.51 |
position |
FALSE |
FALSE |
FALSE |
-1.28 |
children |
FALSE |
FALSE |
FALSE |
-1.25 |
No flagTime |
FALSE |
FALSE |
FALSE |
-1.19 |
No careless |
FALSE |
FALSE |
FALSE |
-1.31 |
day |
FALSE |
FALSE |
FALSE |
-1.24 |
WE |
FALSE |
FALSE |
FALSE |
-1.25 |
WC |
FALSE |
FALSE |
FALSE |
-1.05 |
WHLSM retro |
FALSE |
FALSE |
FALSE |
-1.23 |
4.3. Sleep disturbances
For sleep disturbances, we implement the following robustness
checks:
No Infl
: we remove influential participants
No sleepDysf
: we remove all participants reporting
sleep dysfunctions
No Cov
: we remove all covariates, that is we only
include WHLSM.mc
and its interactions as model
predictors
All in
: we include all complete observations from
all participants, including those meeting the exclusion criteria for
compliance and blood pressure
ML
: we refit the models by using the Maximum
Likelihood estimator, rather than the Restricted Maximum
Likelihood
Rand slope
: we include the random slope for
WHLSM.mc
logNorm
: we refit the models with using log-normal
GLM
position
: we include job position (Employee/Project
vs. Manager/(Self-)Employer) as an additional control variable
children
: we include the number of children as an
additional control variable
No flagTime
: we exclude all observations that were
flagged due to their associated timing (e.g., morning BP recorded in the
afternoon) (see Supplementary
Material S3)
No careless
: we exclude one participant
S137
flagged as potentially careless (see Supplementary
Material S3)
WE
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WC
: we replace the predictor term for state
workaholism with the composite score at the working excessively
dimension
WHLSM retro
: we replace the predictor term for trait
workaholism with the composite score at the retrospective version of the
DUWAS included in the preliminary questionnaire
checks <- c("Original","No Infl","No sleepDysf","No Cov","All in","ML","Rand slope","logNorm",
"position","children","No flagTime","No careless","WE","WC","WHLSM retro")
In all but two cases (i.e., only the interaction but not the main
effect of state workaholism is substantial when including the random
slope and when using the working compulsively dimension rather than the
total state workaholism score), the results are
consistent with those reported in the main analyses, showing
substantial main effect of state WHLSM.mc
and interaction.
We interpret these findings as a sign of the consistency of the
estimated interactions between WHLSM.mc
and
PD.mc
for SD
.
MAIN EFFECT
# main effect of WHLSM.mc
predictors <- c("gender","PD.mc","WHLSM.cm.gmc","WHLSM.mc")
p <- cbind(check=checks,
rbind(glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # original
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD[!cleanSD$ID%in%c("S132","S049","S079","S002"),], # without influential
resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD[clean$sleep_dysf!="Yes",], # without participants with sleep dysf
resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c("WHLSM.mc"), # without covariates
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD_full,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # full sample
key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # maximum likelihood
key.predictor="WHLSM.mc",key.model="WHLSM.mc",REML=FALSE),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # random slope
key.predictor="WHLSM.mc",key.model="WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc", # log-normal family
key.predictor="WHLSM.mc",key.model="WHLSM.mc",link="log"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"position", # adding position
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"children", # adding children
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD[cleanSD$flagTime==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.cm.gmc",
key.predictor="WHLSM.mc",key.model="WHLSM.mc"), # without flagged times
glmerAn(data=cleanSD[cleanSD$careless==FALSE,],resp="SD",fix.eff=predictors, # without careless
mComp.baseline="WHLSM.cm.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WE.mc",key.model="WE.mc"), # working excessively
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WHLSM.cm.gmc",key.predictor="WC.mc",key.model="WC.mc"), # working compulsively
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.retro.gmc",key.predictor="WHLSM.mc",key.model="WHLSM.mc"))) # WHLSM retro
kable(p)
Original |
TRUE |
TRUE |
TRUE |
2.62 |
No Infl |
TRUE |
TRUE |
TRUE |
2.87 |
No sleepDysf |
TRUE |
TRUE |
TRUE |
2.61 |
No Cov |
TRUE |
TRUE |
TRUE |
2.68 |
All in |
TRUE |
TRUE |
TRUE |
2.79 |
ML |
TRUE |
TRUE |
TRUE |
2.62 |
Rand slope |
TRUE |
TRUE |
FALSE |
1.21 |
logNorm |
TRUE |
TRUE |
TRUE |
3.32 |
position |
TRUE |
TRUE |
TRUE |
2.62 |
children |
TRUE |
TRUE |
TRUE |
2.62 |
No flagTime |
TRUE |
TRUE |
TRUE |
2.77 |
No careless |
TRUE |
TRUE |
TRUE |
2.65 |
WE |
TRUE |
TRUE |
TRUE |
2.77 |
WC |
FALSE |
TRUE |
FALSE |
1.94 |
WHLSM retro |
TRUE |
TRUE |
TRUE |
2.62 |
INTERACTION
predictors <- c(predictors,"PD.mc:WHLSM.mc")
p <- cbind(check=checks,
rbind(glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # original
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD[!cleanSD$ID%in%c("S132","S049","S079","S002"),], # without influential cases
resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD[clean$sleep_dysf!="Yes",], # without participants with sleep dysfunctions
resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c("PD.mc","WHLSM.mc","PD.mc:WHLSM.mc"), # without covariates
mComp.baseline="WHLSM.mc", key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD_full,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # full sample
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # maximum likelihood
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",REML=FALSE),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # random slope
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",ran.eff="(WHLSM.mc|ID)"),
glmerAn(data=cleanSD,resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc", # log-normal family
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc",link="log"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"position", # adding position
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD,resp="SD",fix.eff=c(predictors[1],"children", # adding children
predictors[2:length(predictors)]),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"),
glmerAn(data=cleanSD[cleanSD$flagTime==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # withoug flagged times
glmerAn(data=cleanSD[cleanSD$careless==FALSE,],resp="SD",fix.eff=predictors,mComp.baseline="WHLSM.mc",
key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"), # without careless participants
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WE.mc",predictors),
mComp.baseline="WE.mc",key.predictor="PD.mc:WE.mc",key.model="PD.mc:WE.mc"), # working excessively
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.mc","WC.mc",predictors),
mComp.baseline="WC.mc",key.predictor="PD.mc:WC.mc",key.model="PD.mc:WC.mc"), # working compulsively
glmerAn(data=cleanSD,resp="SD",fix.eff=gsub("WHLSM.cm.gmc","WHLSM.retro.gmc",predictors),
mComp.baseline="WHLSM.mc",key.predictor="PD.mc:WHLSM.mc",key.model="PD.mc:WHLSM.mc"))) # WHLSM retro
kable(p)
Original |
TRUE |
TRUE |
TRUE |
-2.31 |
No Infl |
TRUE |
TRUE |
TRUE |
-2.08 |
No sleepDysf |
TRUE |
TRUE |
TRUE |
-2.14 |
No Cov |
TRUE |
TRUE |
TRUE |
-2.44 |
All in |
TRUE |
TRUE |
TRUE |
-2.33 |
ML |
TRUE |
TRUE |
TRUE |
-2.31 |
Rand slope |
TRUE |
TRUE |
TRUE |
-2.76 |
logNorm |
TRUE |
TRUE |
TRUE |
-2.56 |
position |
TRUE |
TRUE |
TRUE |
-2.33 |
children |
TRUE |
TRUE |
TRUE |
-2.39 |
No flagTime |
TRUE |
TRUE |
TRUE |
-2.37 |
No careless |
TRUE |
TRUE |
TRUE |
-2.30 |
WE |
TRUE |
TRUE |
TRUE |
-1.99 |
WC |
TRUE |
TRUE |
TRUE |
-2.23 |
WHLSM retro |
TRUE |
TRUE |
TRUE |
-2.29 |
5. Outputs
Here, we generate and save the regression tables reporting the
results estimated by the selected models. For each model, we visualize
the unstandardized coefficients (b), the standard error (SE), and the
95% bootstrap confidence intervals computed with 10,000
iterations.
NSIM = 10000
# coefficients afternoon BP
tab_model(m1_SBP_aft,m2_SBP_aft,m1_DBP_aft,m2_DBP_aft,
dv.labels=paste0(rep(c("SBP_aft_","DBP_aft_"),each=2),c("baseline","WHLSM.mc")),
show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
|
SBP_aft_baseline
|
SBP_aft_WHLSM.mc
|
DBP_aft_baseline
|
DBP_aft_WHLSM.mc
|
Predictors
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
(Intercept)
|
118.25 (1.97)
|
114.38 – 122.12
|
118.25 (1.97)
|
114.38 – 122.12
|
77.32 (1.46)
|
74.45 – 80.20
|
77.32 (1.46)
|
74.45 – 80.19
|
gender [M]
|
5.39 (2.92)
|
-0.35 – 11.13
|
5.39 (2.92)
|
-0.35 – 11.13
|
-0.38 (2.17)
|
-4.65 – 3.88
|
-0.38 (2.17)
|
-4.65 – 3.88
|
age gmc
|
0.41 (0.12)
|
0.18 – 0.65
|
0.41 (0.12)
|
0.18 – 0.65
|
0.28 (0.09)
|
0.10 – 0.45
|
0.28 (0.09)
|
0.10 – 0.45
|
BMI gmc
|
1.10 (0.43)
|
0.25 – 1.95
|
1.10 (0.43)
|
0.25 – 1.95
|
0.96 (0.32)
|
0.33 – 1.59
|
0.96 (0.32)
|
0.33 – 1.59
|
WHLSM cm gmc
|
1.33 (1.14)
|
-0.91 – 3.57
|
1.33 (1.14)
|
-0.91 – 3.57
|
1.11 (0.85)
|
-0.55 – 2.77
|
1.11 (0.85)
|
-0.55 – 2.77
|
WHLSM mc
|
|
|
1.56 (0.40)
|
0.77 – 2.34
|
|
|
1.30 (0.35)
|
0.61 – 1.98
|
Random Effects
|
σ2
|
108.96
|
106.74
|
82.14
|
80.61
|
τ00
|
195.27 ID
|
195.55 ID
|
104.48 ID
|
104.66 ID
|
N
|
106 ID
|
106 ID
|
106 ID
|
106 ID
|
Observations
|
787
|
787
|
787
|
787
|
# bootstrap CI SBP_aft
confint.merMod(m1_SBP_aft,parm=3:(length(fixef(m1_SBP_aft))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## (Intercept) 114.4396311 121.9985679
## genderM -0.4483034 11.1027967
## age.gmc 0.1813017 0.6594479
## BMI.gmc 0.2431582 1.9373830
## WHLSM.cm.gmc -0.9433809 3.5699117
confint.merMod(m2_SBP_aft,parm=3:(length(fixef(m2_SBP_aft))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## (Intercept) 114.2751153 122.1679379
## genderM -0.3637160 11.0986313
## age.gmc 0.1788889 0.6521283
## BMI.gmc 0.2525861 1.9644597
## WHLSM.cm.gmc -0.8950650 3.5760164
## WHLSM.mc 0.7611169 2.3512745
# bootstrap CI DBP_aft
confint.merMod(m1_DBP_aft,parm=5:(length(fixef(m1_SBP_aft))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## age.gmc 0.09865134 0.4548729
## BMI.gmc 0.32664247 1.6065864
## WHLSM.cm.gmc -0.55033958 2.7842322
confint.merMod(m2_DBP_aft,parm=5:(length(fixef(m2_SBP_aft))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## age.gmc 0.09754627 0.4569716
## BMI.gmc 0.33492992 1.5929573
## WHLSM.cm.gmc -0.60166092 2.7686367
## WHLSM.mc 0.61872084 1.9673084
# coefficients evening BP
tab_model(m1_SBP_eve,m2_SBP_eve,m3_SBP_eve,m1_DBP_eve,m2_DBP_eve,m3_DBP_eve,
dv.labels=paste0(rep(c("SBP_eve_","DBP_eve_"),each=3),c("baseline","WHLSM.mc","interaction")),
show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
|
SBP_eve_baseline
|
SBP_eve_WHLSM.mc
|
SBP_eve_interaction
|
DBP_eve_baseline
|
DBP_eve_WHLSM.mc
|
DBP_eve_interaction
|
Predictors
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
(Intercept)
|
113.08 (1.87)
|
109.41 – 116.74
|
113.08 (1.87)
|
109.41 – 116.74
|
113.11 (1.86)
|
109.45 – 116.77
|
72.72 (1.45)
|
69.87 – 75.57
|
72.72 (1.45)
|
69.87 – 75.57
|
72.72 (1.45)
|
69.87 – 75.57
|
gender [M]
|
2.48 (2.76)
|
-2.94 – 7.91
|
2.48 (2.76)
|
-2.94 – 7.91
|
2.48 (2.76)
|
-2.94 – 7.90
|
-1.31 (2.15)
|
-5.53 – 2.90
|
-1.31 (2.15)
|
-5.53 – 2.90
|
-1.31 (2.15)
|
-5.53 – 2.90
|
age gmc
|
0.33 (0.11)
|
0.11 – 0.56
|
0.33 (0.11)
|
0.11 – 0.56
|
0.33 (0.11)
|
0.11 – 0.56
|
0.27 (0.09)
|
0.10 – 0.45
|
0.27 (0.09)
|
0.10 – 0.45
|
0.27 (0.09)
|
0.10 – 0.45
|
BMI gmc
|
1.40 (0.41)
|
0.60 – 2.20
|
1.40 (0.41)
|
0.60 – 2.20
|
1.40 (0.41)
|
0.60 – 2.20
|
1.16 (0.32)
|
0.54 – 1.78
|
1.16 (0.32)
|
0.54 – 1.78
|
1.16 (0.32)
|
0.54 – 1.78
|
PD mc
|
-0.82 (0.26)
|
-1.34 – -0.30
|
-0.81 (0.27)
|
-1.33 – -0.28
|
-0.80 (0.27)
|
-1.32 – -0.27
|
-0.23 (0.23)
|
-0.67 – 0.22
|
-0.18 (0.23)
|
-0.63 – 0.26
|
-0.18 (0.23)
|
-0.63 – 0.27
|
WHLSM cm gmc
|
1.34 (1.06)
|
-0.75 – 3.43
|
1.34 (1.06)
|
-0.75 – 3.43
|
1.35 (1.06)
|
-0.74 – 3.44
|
0.46 (0.83)
|
-1.17 – 2.08
|
0.46 (0.83)
|
-1.17 – 2.08
|
0.46 (0.83)
|
-1.17 – 2.08
|
WHLSM mc
|
|
|
0.31 (0.40)
|
-0.48 – 1.10
|
0.31 (0.40)
|
-0.48 – 1.10
|
|
|
0.67 (0.34)
|
-0.00 – 1.35
|
0.67 (0.35)
|
-0.00 – 1.35
|
PD mc × WHLSM mc
|
|
|
|
|
0.24 (0.30)
|
-0.35 – 0.84
|
|
|
|
|
0.00 (0.26)
|
-0.51 – 0.51
|
Random Effects
|
σ2
|
96.62
|
96.69
|
96.77
|
71.29
|
70.97
|
71.08
|
τ00
|
173.03 ID
|
173.02 ID
|
172.72 ID
|
102.38 ID
|
102.42 ID
|
102.43 ID
|
N
|
106 ID
|
106 ID
|
106 ID
|
106 ID
|
106 ID
|
106 ID
|
Observations
|
721
|
721
|
721
|
721
|
721
|
721
|
# bootstrap CI SBP_eve
confint.merMod(m1_SBP_eve,parm=3:(length(fixef(m1_SBP_eve))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## (Intercept) 109.3702872 116.7234842
## genderM -2.9454330 7.8981746
## age.gmc 0.1097913 0.5571745
## BMI.gmc 0.5999890 2.2064248
## PD.mc -1.3406626 -0.2902520
## WHLSM.cm.gmc -0.7206930 3.4018219
confint.merMod(m2_SBP_eve,parm=3:(length(fixef(m2_SBP_eve))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## (Intercept) 109.4134076 116.7476503
## genderM -3.0751138 7.8695452
## age.gmc 0.1075076 0.5581521
## BMI.gmc 0.6171424 2.2154539
## PD.mc -1.3317888 -0.2849928
## WHLSM.cm.gmc -0.7500476 3.4051204
## WHLSM.mc -0.4803054 1.1170363
confint.merMod(m3_SBP_eve,parm=3:(length(fixef(m3_SBP_eve))+2),method="boot",nsim=NSIM) # M3
## 2.5 % 97.5 %
## (Intercept) 109.4566260 116.7756009
## genderM -2.9553584 7.9669292
## age.gmc 0.1057149 0.5509935
## BMI.gmc 0.6006390 2.2148860
## PD.mc -1.3108674 -0.2817490
## WHLSM.cm.gmc -0.7116954 3.4393428
## WHLSM.mc -0.4875876 1.0955268
## PD.mc:WHLSM.mc -0.3694828 0.8242395
# bootstrap CI DBP_eve
confint.merMod(m1_DBP_eve,parm=3:(length(fixef(m1_DBP_eve))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## (Intercept) 69.91707201 75.5146361
## genderM -5.50157954 2.7837334
## age.gmc 0.09630789 0.4471138
## BMI.gmc 0.52973629 1.7700847
## PD.mc -0.67887995 0.2252417
## WHLSM.cm.gmc -1.14713308 2.1283198
confint.merMod(m2_DBP_eve,parm=3:(length(fixef(m2_DBP_eve))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## (Intercept) 69.899178002 75.5317279
## genderM -5.468736411 2.9722360
## age.gmc 0.093351817 0.4415851
## BMI.gmc 0.544397214 1.7757014
## PD.mc -0.629106630 0.2678128
## WHLSM.cm.gmc -1.144785651 2.0667171
## WHLSM.mc 0.005499441 1.3510498
confint.merMod(m3_DBP_eve,parm=3:(length(fixef(m3_DBP_eve))+2),method="boot",nsim=NSIM) # M3
## 2.5 % 97.5 %
## (Intercept) 69.920946995 75.5180192
## genderM -5.574241061 2.8625886
## age.gmc 0.091355526 0.4513621
## BMI.gmc 0.535751402 1.7784338
## PD.mc -0.635938890 0.2680905
## WHLSM.cm.gmc -1.160080851 2.1024836
## WHLSM.mc 0.004045224 1.3491670
## PD.mc:WHLSM.mc -0.501603579 0.5085815
# coefficients EE and SD
tab_model(m1_EE,m2_EE,m3_EE,m1_SD,m2_SD,m3_SD,
dv.labels=paste0(rep(c("EE_","SD_"),each=3),c("baseline","WHLSM.mc","interaction")),
show.icc=FALSE,show.p=FALSE,show.se=TRUE,show.r2=FALSE,collapse.se=TRUE,string.est="b (SE)")
|
EE_baseline
|
EE_WHLSM.mc
|
EE_interaction
|
SD_baseline
|
SD_WHLSM.mc
|
SD_interaction
|
Predictors
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
b (SE)
|
CI
|
(Intercept)
|
3.12 (0.14)
|
2.84 – 3.40
|
3.12 (0.14)
|
2.84 – 3.40
|
3.12 (0.14)
|
2.84 – 3.40
|
2.75 (0.12)
|
2.53 – 2.98
|
2.75 (0.12)
|
2.53 – 2.98
|
2.75 (0.12)
|
2.52 – 2.97
|
gender [M]
|
0.18 (0.21)
|
-0.22 – 0.58
|
0.18 (0.21)
|
-0.22 – 0.58
|
0.18 (0.21)
|
-0.22 – 0.59
|
-0.40 (0.17)
|
-0.72 – -0.07
|
-0.40 (0.17)
|
-0.72 – -0.07
|
-0.39 (0.17)
|
-0.72 – -0.06
|
PD mc
|
-0.08 (0.03)
|
-0.14 – -0.03
|
-0.07 (0.03)
|
-0.13 – -0.02
|
-0.07 (0.03)
|
-0.13 – -0.02
|
-0.03 (0.03)
|
-0.08 – 0.03
|
-0.02 (0.03)
|
-0.08 – 0.04
|
-0.02 (0.03)
|
-0.08 – 0.03
|
WHLSM cm gmc
|
0.47 (0.08)
|
0.31 – 0.62
|
0.47 (0.08)
|
0.31 – 0.62
|
0.47 (0.08)
|
0.31 – 0.62
|
0.34 (0.06)
|
0.22 – 0.47
|
0.34 (0.06)
|
0.22 – 0.47
|
0.34 (0.06)
|
0.21 – 0.47
|
WHLSM mc
|
|
|
0.19 (0.04)
|
0.11 – 0.27
|
0.19 (0.04)
|
0.11 – 0.27
|
|
|
0.11 (0.04)
|
0.03 – 0.20
|
0.11 (0.04)
|
0.03 – 0.20
|
PD mc × WHLSM mc
|
|
|
|
|
-0.04 (0.03)
|
-0.10 – 0.02
|
|
|
|
|
-0.07 (0.03)
|
-0.14 – -0.01
|
Random Effects
|
σ2
|
1.09
|
1.05
|
1.05
|
1.13
|
1.12
|
1.11
|
τ00
|
1.02 ID
|
1.03 ID
|
1.03 ID
|
0.60 ID
|
0.60 ID
|
0.61 ID
|
N
|
114 ID
|
114 ID
|
114 ID
|
114 ID
|
114 ID
|
114 ID
|
Observations
|
779
|
779
|
779
|
723
|
723
|
723
|
# bootstrap CI EE
confint.merMod(m1_EE,parm=3:(length(fixef(m1_EE))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## (Intercept) 2.8422610 3.39941438
## genderM -0.2250781 0.58615456
## PD.mc -0.1378132 -0.02884978
## WHLSM.cm.gmc 0.3184584 0.61927262
confint.merMod(m2_EE,parm=3:(length(fixef(m2_EE))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## (Intercept) 2.8507944 3.39588003
## genderM -0.2193533 0.57305636
## PD.mc -0.1266091 -0.02031197
## WHLSM.cm.gmc 0.3144118 0.62093079
## WHLSM.mc 0.1106096 0.27035420
confint.merMod(m3_EE,parm=3:(length(fixef(m3_EE))+2),method="boot",nsim=NSIM) # M3
## 2.5 % 97.5 %
## (Intercept) 2.8379755 3.39360531
## genderM -0.2182741 0.58687388
## PD.mc -0.1279269 -0.02116087
## WHLSM.cm.gmc 0.3112911 0.62112684
## WHLSM.mc 0.1107532 0.27214145
## PD.mc:WHLSM.mc -0.1006700 0.02035031
# boostrap CI SD
confint.merMod(m1_SD,parm=3:(length(fixef(m1_SD))+2),method="boot",nsim=NSIM) # M1
## 2.5 % 97.5 %
## (Intercept) 2.52810605 2.97864335
## genderM -0.71807474 -0.06310848
## PD.mc -0.08342478 0.03167821
## WHLSM.cm.gmc 0.21660335 0.47118734
confint.merMod(m2_SD,parm=3:(length(fixef(m2_SD))+2),method="boot",nsim=NSIM) # M2
## 2.5 % 97.5 %
## (Intercept) 2.52515465 2.98227089
## genderM -0.71688570 -0.06488114
## PD.mc -0.07701252 0.03833502
## WHLSM.cm.gmc 0.21358565 0.47199962
## WHLSM.mc 0.02946134 0.19999122
confint.merMod(m3_SD,parm=3:(length(fixef(m3_SD))+2),method="boot",nsim=NSIM) # M3
## 2.5 % 97.5 %
## (Intercept) 2.52022788 2.97743736
## genderM -0.71942205 -0.06867787
## PD.mc -0.07861727 0.03433758
## WHLSM.cm.gmc 0.21444106 0.46769987
## WHLSM.mc 0.02671827 0.19504759
## PD.mc:WHLSM.mc -0.13730658 -0.01152252
# plotting interaction
library(ggplot2); library(gridExtra)
sd(cleanSD$PD.mc) # RDet: 1 SD = 1.36
## [1] 1.362052
p <- plot_model(m3_SD,type="pred",terms=c("WHLSM.mc","PD.mc [-1.36,1.36]"),colors="bw",
alpha=0.4,legend.title="Psychological\ndetachment",axis.title=c("State workaholism","Sleep disturbances")) +
scale_color_manual(labels=c("-1 SD","+1 SD"),values=c("black","#666666")) +
scale_linetype_manual(labels=c("-1 SD","+1 SD"),values=c("solid","dashed")) +
scale_fill_manual(labels=c("-1 SD","+1 SD"),values=c("black","#666666")) + ggtitle("") +
theme(text=element_text(size=15))
p
ggsave("RESULTS/Figure3.tiff",plot=p,dpi=300,width=5,height=4)
LS0tDQp0aXRsZTogIlRoZSBkYWlseSBjb3N0cyBvZiB3b3JrYWhvbGlzbSINCnN1YnRpdGxlOiAiU3VwcGxlbWVudGFyeSBtYXRlcmlhbCBTNjogTXVsdGlsZXZlbCByZWdyZXNzaW9uIG1vZGVsaW5nIg0KYXV0aG9yOiAgIkx1Y2EgTWVuZ2hpbmksIFBoLkQuLCBDcmlzdGlhbiBCYWxkdWNjaSwgUGguRC4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpiaWJsaW9ncmFwaHk6IFtwYWNrYWdlc01vZC5iaWJdDQpub2NpdGU6ICdAKicNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDYNCiAgICBjc3M6IHN0eWxlcy5jc3MNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHRoZW1lOiB1bml0ZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8YnI+DQoNCiMgQWltcyBhbmQgY29udGVudA0KDQpUaGUgcHJlc2VudCBkb2N1bWVudCBpbmNsdWRlcyB0aGUgYW5hbHl0aWNhbCBzdGVwcyBpbXBsZW1lbnRlZCB0byBtb2RlbCB0aGUgd2l0aGluLWluZGl2aWR1YWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHdvcmthaG9saXNtIGBXSExTTWAgYW5kIHRoZSBmb2N1c2VkIHN0cmFpbiBvdXRjb21lcyAoaS5lLiwgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGJsb29kIHByZXNzdXJlIGBTQlBgIGFuZCBgREJQYCwgZW1vdGlvbmFsIGV4aGF1c3Rpb24gYEVFYCwgYW5kIHNsZWVwIGRpc3R1cmJhbmNlcyBgU0RgKSBhbmQgdGhlIHdpdGhpbi1pbmRpdmlkdWFsIGludGVyYWN0aW9ucyBiZXR3ZWVuIGBXSExTTWAgYW5kIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLiBUaGUgYW5hbHlzZXMgYXJlIGNvbmR1Y3RlZCBvbiB0aGUgZGFpbHkgZGlhcnkgZGF0YSBjb2xsZWN0ZWQgd2l0aCB0aGUgUXVhbHRyaWNzIHBsYXRmb3JtIChRdWFsdHJpY3MsIFNlYXR0bGUsIFdBLCBVU0EpIGZyb20gYW4gaGV0ZXJvZ2VuZW91cyBzYW1wbGVzIG9mIHdvcmtlcnMgb3ZlciB0d28gd2Vla3MsIHByZS1wcm9jZXNzZWQgYXMgc2hvd24gaW4gW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSwgYW5kIGFnZ3JlZ2F0ZWQgYXMgc2hvd24gaW4gW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzRdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M0X3BzeWNob21ldHJpY3MvUzRfcHN5Y2hvbWV0cmljcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkuDQoNCkhlcmUsIHdlIHJlbW92ZSBhbGwgb2JqZWN0cyBmcm9tIHRoZSBSIGdsb2JhbCBlbnZpcm9ubWVudC4NCmBgYHtyICB9DQojIHJlbW92aW5nIGFsbCBvYmpldHMgZnJvbSB0aGUgd29ya3NwYWNlDQpybShsaXN0PWxzKCkpDQpgYGANCg0KVGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzIGFyZSB1c2VkIGluIHRoaXMgZG9jdW1lbnQgKHNlZSBbUmVmZXJlbmNlc10oI3JlZikgc2VjdGlvbik6DQpgYGB7ciAgfQ0KIyByZXF1aXJlZCBwYWNrYWdlcw0KcGFja2FnZXMgPC0gYygibG1lNCIsIk11TUluIiwic2pQbG90IiwicGx5ciIsImNhciIsImZpdGRpc3RycGx1cyIsImdncGxvdDIiLCJncmlkRXh0cmEiLCJpbmZsdWVuY2UuTUUiLCJtZWRpYXRpb24iLCJwc3ljaCIsImtuaXRyIikNCg0KIyBnZW5lcmF0ZSBwYWNrYWdlcyByZWZlcmVuY2VzDQprbml0cjo6d3JpdGVfYmliKGMoLnBhY2thZ2VzKCksIHBhY2thZ2VzKSwicGFja2FnZXNNb2QuYmliIikNCg0KIyAjIHJ1biB0byBpbnN0YWxsIG1pc3NpbmcgcGFja2FnZXMNCiMgeGZ1bjo6cGtnX2F0dGFjaDIocGFja2FnZXMsIG1lc3NhZ2UgPSBGQUxTRSk7IHJtKGxpc3Q9bHMoKSkNCmBgYA0KDQo8YnI+DQoNCiMgMS4gRGF0YSByZWFkaW5nDQoNCkZpcnN0LCB3ZSByZWFkIGRhaWx5IGBkaWFyeWAgZXhwb3J0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM0XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNF9wc3ljaG9tZXRyaWNzL1M0X3BzeWNob21ldHJpY3MtY29kZS1hbmQtb3V0cHV0Lmh0bWwpLCBhbmQgdGhlIG1vZGVsIGZvcm11bGFzIHdpdGggdGhlIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZnJvbSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkuIE1vcmVvdmVyLCB3ZSBkZXJpdmUgdGhlIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlIGRhdGFzZXQgYHByZWxxc2AgZnJvbSB0aGUgYGRpYXJ5YCBkYXRhc2V0Lg0KYGBge3IgIH0NCiMgcmVhZGluZyBkYXRhDQpsb2FkKCJEQVRJL2RpYXJ5X2FnZ3JlZ2F0ZWQuUkRhdGEiKSAjIGRhaWx5IGRpYXJ5IGRhdGENCmxvYWQoIkRBVEkvbWZvcm11bGFzLlJEYXRhIikgIyBzZWxlY3RlZCBjb3ZhcmlhdGVzDQoNCiMgZGVyaXZpbmcgcHJlbHFzIGZyb20gZGlhcnkgZGF0YSAob25seSBpbmNsdWRpbmcgdmFyaWFibGVzIGZyb20gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUpDQpwcmVscXMgPC0gZGlhcnlbIWR1cGxpY2F0ZWQoZGlhcnkkSUQpLGMoMSx3aGljaChjb2xuYW1lcyhkaWFyeSk9PSJnZW5kZXIiKTpuY29sKGRpYXJ5KSldDQoNCiMgb3JpZ2luYWwgc2FtcGxlIHNpemVzDQpjYXQoImRpYXJ5OiIsbnJvdyhkaWFyeSksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGRpYXJ5JElEKSwicGFydGljaXBhbnRzIikNCmNhdCgicHJlbHFzOiIsbnJvdyhwcmVscXMpLCJyZXNwb25zZXMgZnJvbSIsbmxldmVscyhwcmVscXMkSUQpLCJwYXJ0aWNpcGFudHMiKQ0KYGBgDQoNCjxicj4NCg0KIyAyLiBEYXRhIGZpbHRlcmluZw0KDQpBcyB3ZSBbcHJlLXJlZ2lzdGVyZWQgaGVyZV0oaHR0cHM6Ly9vc2YuaW8vaDl6dnEpLCB3ZSBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24gcGFydGljaXBhbnQgY29tcGxpYW5jZSB3aXRoIHRoZSBwcm90b2NvbCwgdGhhdCBpcyB3ZSAqKmV4Y2x1ZGUgdGhlIHBhcnRpY2lwYW50cyB3aXRoIGxlc3MgdGhhbiAzIGZ1bGwgZGF5cyBvZiBwYXJ0aWNpcGF0aW9uKiogKGkuZS4sIHdpdGggbm9ubWlzc2luZyByZXNwb25zZSB0byB0aGUgYWZ0ZXJub29uLCBldmVuaW5nLCBhbmQgbW9ybmluZyBxdWVzdGlvbm5haXJlKS4NCmBgYHtyICB9DQojIGZpbHRlcmluZyBwYXJ0aWNpcGFudHMgd2l0aCBsZXNzIHRoYW4gMyBvYnNlcnZhdGlvbnMNCmNsZWFuIDwtIGRpYXJ5WzAsXQ0KZm9yKElEIGluIGxldmVscyhkaWFyeSRJRCkpeyANCiAgaWYobnJvdyhkaWFyeVtkaWFyeSRJRD09SUQgJiBkaWFyeSRhZnQ9PTEgJiBkaWFyeSRldmU9PTEgJiBkaWFyeSRtb3I9PTEsXSkgPj0gMyl7IA0KICAgIGNsZWFuIDwtIHJiaW5kKGNsZWFuLGRpYXJ5W2RpYXJ5JElEPT1JRCxdKSB9fQ0KY2xlYW4kSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbiRJRCkpICMgcmVzZXR0aW5nIElEIGxldmVscw0KY2xlYW5fcHJlbHFzIDwtIHByZWxxc1twcmVscXMkSUQgJWluJSBsZXZlbHMoY2xlYW4kSUQpLF0gIyBmaWx0ZXJpbmcgcHJlbHFzIGRhdGENCmNsZWFuX3ByZWxxcyRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuX3ByZWxxcyRJRCkpICMgcmVzZXR0aW5nIElEIGxldmVscw0KY2F0KCJkaWFyeTogRXhjbHVkZWQiLG5sZXZlbHMoZGlhcnkkSUQpLW5sZXZlbHMoY2xlYW4kSUQpLCJwYXJ0aWNpcGFudHMgYW5kIixucm93KGRpYXJ5KS1ucm93KGNsZWFuKSwib2JzZXJ2YXRpb25zIikNCg0KIyB1cGRhdGluZyBzYW1wbGUgc2l6ZXMNCmNhdCgiZGlhcnk6Iixucm93KGNsZWFuKSwicmVzcG9uc2VzIGZyb20iLG5sZXZlbHMoY2xlYW4kSUQpLCJwYXJ0aWNpcGFudHMiKQ0KY2F0KCJwcmVscXM6Iixucm93KGNsZWFuX3ByZWxxcyksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGNsZWFuX3ByZWxxcyRJRCksInBhcnRpY2lwYW50cyIpDQpgYGANCg0KPGJyPg0KDQojIyAyLjEuIEJQIGRhdGEgZmlsdGVyaW5nDQoNCkluIGFkZGl0aW9uIHRvIHBhcnRpY2lwYW50IGNvbXBsaWFuY2UsIHdlIHByZS1yZWdpc3RlcmVkIHRoZSAqKmV4Y2x1c2lvbiBvZiBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyB0YWtpbmcgYmxvb2QgcHJlc3N1cmUgbWVkaWNhdGlvbnMgYGJwX2RydWdzYCBvciBzdWZmZXJpbmcgZnJvbSBhIGNhcmRpb3Zhc2N1bGFyIGR5c2Z1bmN0aW9uIGBjdl9keXNmYCBmcm9tIHRoZSBhbmFseXNlcyBvZiBibG9vZCBwcmVzc3VyZSoqLiBIZXJlLCB3ZSBleGNsdWRlIHN1Y2ggcGFydGljaXBhbnRzIHNob3dpbmcgc3Vic3RhbnRpYWxseSBoaWdoZXIgYmxvb2QgcHJlc3N1cmUgKHNlZSBzZWN0aW9uIDMuNSBvZiBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLiBJbiBjb250cmFzdCwgZGV2aWF0aW5nIGZyb20gdGhlIHByZS1yZWdpc3RyYXRpb24gKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKSwgd2UgZG8gbm90IGV4Y2x1ZGUgdGhvc2UgdGFraW5nIHBzeWNob2FjdGl2ZSBgcHN5X2RydWdzYCBvciBob3Jtb25hbCBtZWRpY2F0aW9uIGBob3JtX2RydWdzYCwgb3IgdGhvc2UgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucyBgc2xlZXBfZHlzZmAsIGFzIHdlIGRpZCBub3QgZmluZCBzdWJzdGFudGlhbCBkaWZmZXJlbmNlcyBpbiB0aGVpciBibG9vZCBwcmVzc3VyZSB2YWx1ZXMgKHNlZSBzZWN0aW9uIDMuNSBvZiBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLiBJbnN0ZWFkLCB3ZSBleGNsdWRlIHRoZXNlIHBhcnRpY2lwYW50cyBhcyBhIHJvYnVzdG5lc3MgY2hlY2sgKHNlZSBzZWN0aW9uIDQpLg0KYGBge3IgIH0NCiMgZmlsdGVyaW5nIHBhcnRpY2lwYW50cyB3aXRoIGJwX2RydWdzIG9yIGN2X2R5c2YNCmNsZWFuQlAgPC0gY2xlYW5bY2xlYW4kYnBfZHJ1Z3M9PSJObyIgJiBjbGVhbiRjdl9keXNmPT0iTm8iLF0NCmNsZWFuQlAkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQJElEKSkgIyByZXNldHRpbmcgSUQgbGV2ZWxzDQpjbGVhbkJQX3ByZWxxcyA8LSBwcmVscXNbcHJlbHFzJElEICVpbiUgbGV2ZWxzKGNsZWFuQlAkSUQpLF0gIyBmaWx0ZXJpbmcgcHJlbHFzIGRhdGENCmNsZWFuQlBfcHJlbHFzJElEIDwtIGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5CUF9wcmVscXMkSUQpKSAjIHJlc2V0dGluZyBJRCBsZXZlbHMNCmNhdCgiZGlhcnk6IEV4Y2x1ZGVkIGZ1cnRoZXIiLG5sZXZlbHMoY2xlYW4kSUQpLW5sZXZlbHMoY2xlYW5CUCRJRCksInBhcnRpY2lwYW50cyBhbmQiLA0KICAgIG5yb3coY2xlYW4pLW5yb3coY2xlYW5CUCksIm9ic2VydmF0aW9ucyBmcm9tIEJQIGFuYWx5c2VzIikNCg0KIyB1cGRhdGluZyBzYW1wbGUgc2l6ZXMNCmNhdCgiZGlhcnkgKEJQKToiLG5yb3coY2xlYW5CUCksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGNsZWFuQlAkSUQpLCJwYXJ0aWNpcGFudHMiKQ0KY2F0KCJwcmVscXMgKEJQKToiLG5yb3coY2xlYW5CUF9wcmVscXMpLCJyZXNwb25zZXMgZnJvbSIsbmxldmVscyhjbGVhbkJQX3ByZWxxcyRJRCksInBhcnRpY2lwYW50cyIpDQpgYGANCg0KPGJyPg0KDQojIyAyLjIuIFNsZWVwIGRhdGEgZmlsdGVyaW5nDQoNCkZpbmFsbHksIHdlIGFsc28gcHJlLXJlZ2lzdGVyZWQgdGhlIGV4Y2x1c2lvbiBvZiBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMgZnJvbSB0aGUgYW5hbHlzZXMgb2Ygc2xlZXAgZGlzdHVyYmFuY2VzLiBIb3dldmVyLCB0aGUgbnVtYmVyIG9mIHN1Y2ggcGFydGljaXBhbnRzIGlzIHJlbGF0aXZlbHkgaGlnaCwgd2hlcmVhcyB0aGV5IGRvIG5vdCBzZWVtIHRvIHNob3cgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZXMgaW4gc2xlZXAgZGlzdHVyYmFuY2VzIGNvbXBhcmluZyB0byB0aGUgb3RoZXIgcGFydGljaXBhbnRzIChzZWUgc2VjdGlvbiAzLjUgb2YgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKS4gVGh1cywgZGV2aWF0aW5nIGZyb20gdGhlIHByZS1yZWdpc3RyYXRpb24gKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKSwgd2UgZG8gbm90IGV4Y2x1ZGUgc3VjaCBwYXJ0aWNpcGFudHMgZnJvbSB0aGUgbWFpbiBhbmFseXNlcy4gSW5zdGVhZCwgd2UgZXhjbHVkZSB0aGVtIGFzIGEgcm9idXN0bmVzcyBjaGVjayAoc2VlIHNlY3Rpb24gNC41KS4NCmBgYHtyICB9DQojIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucw0Kc3VtbWFyeShjbGVhblshZHVwbGljYXRlZChjbGVhbiRJRCksInNsZWVwX2R5c2YiXSkNCmBgYA0KDQo8YnI+DQoNCiMgMy4gTXVsdGlsZXZlbCBtb2RlbGluZw0KDQpIZXJlLCB3ZSBzcGVjaWZ5LCBjb21wYXJlLCBhbmQgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiBhIHNlcmllcyBvZiBtdWx0aWxldmVsIG1vZGVscyBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHByZS1yZWdpc3RlcmVkIHRpbWUtdmFyeWluZyBvdXRjb21lczoNCg0KLSBhZnRlcm5vb24gc3lzdG9saWMgYFNCUF9hZnRgIGFuZCBkeWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUF9hZnRgDQoNCi0gZXZlbmluZyBzeXN0b2xpYyBgU0JQX2V2ZWAgYW5kIGR5YXN0b2xpYyBibG9vZCBwcmVzc3VyZSBgREJQX2V2ZWANCg0KLSBlbW90aW9uYWwgZXhoYXVzdGlvbiBgRUVgDQoNCi0gc2xlZXAgZGlzdHVyYmFuY2VzIGBTRGANCg0KPGJyPg0KDQpGb3IgZWFjaCBvdXRjb21lLCB3ZSBpbXBsZW1lbnQgYSBoaWVyYXJjaGljYWwgcmVncmVzc2lvbiB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6DQoNCjEuIGBtMGA6ICoqbnVsbCBtb2RlbCoqIG9ubHkgaW5jbHVkaW5nIHRoZSBzYW1wbGUgaW50ZXJjZXB0LCB0aGUgbGV2ZWwtMiB2YXJpYWJpbGl0eSBhcm91bmQgdGhlIGludGVyY2VwdCwgYW5kIHRoZSByZXNpZHVhbCB0ZXJtDQoNCjIuIGBtMWA6IGluY2x1ZGluZyB0aGUgKipjb3ZhcmlhdGVzKiogc2VsZWN0ZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLCBpbiBhZGRpdGlvbiB0byBwc3ljaG9sb2dpY2FsIGRldGFjaG1lbnQgYFBEYCAoaS5lLiwgb25seSBmb3IgZXZlbmluZyBhbmQgbmV4dCBtb3JuaW5nIG91dGNvbWVzKSwgYW5kIHRoZSBsZXZlbC0yIGNvbXBvbmVudCBvZiB3b3JrYWhvbGlzbSBgV0hMU00uY21gDQoNCjMuIGBtMmA6IGluY2x1ZGluZyB0aGUgbGV2ZWwtMSBjb21wb25lbnQgb2YgKip3b3JrYWhvbGlzbSoqIGBXSExTTS5tY2ANCg0KNC4gYG0zYDogaW5jbHVkaW5nIHRoZSBsZXZlbC0xICoqaW50ZXJhY3Rpb25zKiogYmV0d2VlbiBgV0hMU00ubWNgIGFuZCBgUERgIChpLmUuLCBvbmx5IGZvciBvdXRjb21lcyBtZWFzdXJlZCBpbiB0aGUgZXZlbmluZyBvciB0aGUgZm9sbG93aW5nIG1vcm5pbmcpLg0KDQo8YnI+DQoNClRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2VzOg0KYGBge3IgIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkobG1lNCk7IGxpYnJhcnkoTXVNSW4pOyBsaWJyYXJ5KHNqUGxvdCk7IGxpYnJhcnkocGx5cik7IGxpYnJhcnkoY2FyKTsgbGlicmFyeShmaXRkaXN0cnBsdXMpDQpsaWJyYXJ5KGdyaWRFeHRyYSk7IGxpYnJhcnkoaW5mbHVlbmNlLk1FKQ0KYGBgDQoNCjxicj4NCg0KIyMgMy4xLiBCbG9vZCBwcmVzc3VyZQ0KDQpGaXJzdCwgd2UgYW5hbHlzZSBzeXN0b2xpYyBhbmQgZGlhc3RvbGljIGJsb29kIHByZXNzdXJlLiBBcyBhIG1haW4gY29uZmlybWF0b3J5IGFuYWx5c2lzLCB3ZSBldmFsdWF0ZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRhaWx5IGxldmVscyBvZiBzdGF0ZSB3b3JrYWhvbGlzbSBhbmQgKipkYWlseSBhdmVyYWdlcyoqIG9mIGJsb29kIHByZXNzdXJlIChpLmUuLCBhdmVyYWdlIG9mIGFmdGVybm9vbiwgZXZlbmluZywgYW5kIG5leHQgbW9ybmluZyBtZWFzdXJlbWVudHMpLiBNb3Jlb3ZlciwgYXMgYSBzdXBwbGVtZW50YXJ5IHByZS1yZWdpc3RlcmVkIGFuYWx5c2lzIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzddKGh0dHBzOi8vb3NmLmlvL2JwcnZnKSkgd2UgYXBwbHkgdGhlIHNhbWUgcHJvY2VkdXJlICoqZm9yIGVhY2ggdGltZSBwb2ludCoqLCB0aGF0IGlzIHdlIGFuYWx5emUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtb3JuaW5nIGJsb29kIHByZXNzdXJlIG1lYXN1cmVtZW50LCByZXNwZWN0aXZlbHkuIEZpbmFsbHksIGJhc2VkIG9uIHRoZSByZXN1bHRzLCB3ZSBjb25kdWN0IHByZS1yZWdpc3RlcmVkICoqZXhwbG9yYXRvcnkgbWVkaWF0aW9uIGFuYWx5c2VzKiogb24gdGltZS1zcGVjaWZpYyBibG9vZCBwcmVzc3VyZSBtZWFzdXJlbWVudHMuDQoNCkRhaWx5IGF2ZXJhZ2VzIG9mIHN5c3RvbGljIGBTQlBgIGFuZCBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUGAgYXJlIHByZWRpY3RlZCBieSBjb25jdXJyZW50IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGluIGFkZGl0aW9uIHRvIHRyYWl0IHdvcmthaG9saXNtIGBXSExTTS5jbWAsIGFuZCB0aHJlZSBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZyb20gdGhlIHByZXZpb3VzIHN0ZXAgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNV0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzVfZGVzY3JpcHRpdmVzL1M1X2Rlc2NyaXB0aXZlcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLCBuYW1lbHkgYGdlbmRlcmAsIGBhZ2VgLCBhbmQgYm9keSBtYXNzIGluZGV4IGBCTUlgLg0KYGBge3IgIH0NCm1mb3JtdWxhc1sxXSAjIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZm9yIFNCUA0KbWZvcm11bGFzWzJdICMgY292YXJpYXRlcyBzZWxlY3RlZCBmb3IgREJQDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xLjEuIEFmdGVybm9vbiBCUA0KDQojIyMjIDMuMS4xLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkJQX2FmdCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5CUFssYygiSUQiLCJTQlBfYWZ0IiwiREJQX2FmdCIsICMgZ3JvdXBpbmcgYW5kIGRlcGVuZGVudCB2YXJpYWJsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsICMgY29yZSBwcmVkaWN0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0UiLCJXQyIsInNsZWVwX2R5c2YiLCJwc3lfZHJ1Z3MiLCJob3JtX2RydWdzIiwgIyBmb3Igcm9idXN0bmVzcyBjaGVja3MNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mb3VuZGVyc19hZnQiLCJmbGFnQlBfYWZ0IiwiZmxhZ1RpbWUiLCJjYXJlbGVzcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24iLCJjaGlsZHJlbiIpXSkpIA0KY2xlYW5CUF9hZnQkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdCRJRCkpICMgcmVzZXR0aW5nIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgbGV2ZWxzDQpjYXQoIkNvbnNpZGVyaW5nIixucm93KGNsZWFuQlBfYWZ0KSwiY29tcGxldGUgb2JzIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdCRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCndpZGUgPC0gY2xlYW5CUF9hZnRbIWR1cGxpY2F0ZWQoY2xlYW5CUF9hZnQkSUQpLF0gIyB3aWRlLWZvcm0gZGF0YXNldA0KZm9yKFZhciBpbiBjKCJXSExTTSIsIldFIiwiV0MiKSl7DQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5CUF9hZnRbLFZhcl0sbGlzdChjbGVhbkJQX2FmdCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMod2lkZSlbbmNvbCh3aWRlKV0gPC0gcGFzdGUwKFZhciwiLmNtIikNCiAgY2xlYW5CUF9hZnQgPC0gam9pbihjbGVhbkJQX2FmdCx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgdG8gbG9uZy1mb3JtIGRmDQogIGNsZWFuQlBfYWZ0WyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUF9hZnRbLFZhcl0gLSBjbGVhbkJQX2FmdFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KDQojIGdyYW5kLW1lYW4tY2VudGVyaW5nIGx2LTIgY29udGludW91cyBwcmVkaWN0b3JzDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyBjbGVhbkJQX2FmdFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhbkJQX2FmdFssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfQ0KDQojIHNob3dpbmcgZGF0YQ0KY2xlYW5CUF9hZnRbMTozLF0gIyBmaXJzdCB0aHJlZSByb3dzDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjIuIE1vZGVsIGZpdCAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGZpdCB0aGUgbXVsdGlsZXZlbCBtb2RlbHMgdG8gdGhlIHNlbGVjdGVkIGRhdGEgdXNpbmcgdGhlIGRlZmF1bHQgcmVzdHJpY3RlZCBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdG9yIChSRU1MKS4NCmBgYHtyICB9DQojIG0wOiBudWxsIG1vZGVsDQptMF9TQlBfYWZ0IDwtIGxtZXIoU0JQX2FmdCB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX1NCUF9hZnQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQoNCiMgbTI6IHN0YXRlIHdvcmthaG9saXNtDQptMl9TQlBfYWZ0IDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2FmdCkNCmBgYA0KDQo8YnI+DQoNClRoZSBzYW1lIG1vZGVscyBhcmUgc3BlY2lmaWVkIGZvciBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfREJQX2FmdCA8LSBsbWVyKERCUF9hZnQgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfYWZ0KQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9EQlBfYWZ0IDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgV0hMU00uY20uZ21jICsgKDF8SUQpLCAjIGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfYWZ0KQ0KDQojIG0yOiBzdGF0ZSB3b3JrYWhvbGlzbQ0KbTJfREJQX2FmdCA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9hZnQpDQpgYGANCg0KRnJvbSB0aGUgcHJldmlvdXMgY2h1bmtzLCB3ZSBzZWUgdGhhdCBhbGwgbW9kZWxzIGNvbnZlcmdlZCB3aXRob3V0IHByb2JsZW1zLiBIZXJlLCB3ZSBpbnNwZWN0IHRoZSAqKmRpYWdub3N0aWNzKiogKGkuZS4sIG5vcm1hbGl0eSBvZiByZXNpZHVhbCBhbmQgcmFuZG9tIGVmZmVjdCBkaXN0cmlidXRpb25zLCBob21vc2NlZGFzdGljaXR5LCBhbmQgbXVsdGljb2xsaW5lYXJpdHkpIG9mIHRoZSBtb3N0IGNvbXBsZXggbW9kZWwgYG0yLmJpc2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQo8YnI+DQoNCiMjIyMjICBTQlBfYWZ0DQoNCk1vZGVsIGBtMi5iaXNgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBlc3BlY2lhbGx5IGluIHRoZSBsb3dlciB0YWlsIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzIGFuZCBib3RoIHRhaWxzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmFuZG9tIGVmZmVjdHMuIFBhcnRpY3VsYXJseSwgKipwYXJ0aWNpcGFudHMgYFMwODJgIGFuZCBgUzA5NmAqKiBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggcmFuZG9tIGVmZmVjdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0yX1NCUF9hZnQsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTJfU0JQX2FmdCkkSUQNCnJlW3JlJFdITFNNLm1jPT1tYXgocmUkV0hMU00ubWMpfHJlJGAoSW50ZXJjZXB0KWA9PW1heChyZSRgKEludGVyY2VwdClgKSxdDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkNCmZvcihWYXIgaW4gYygiZ2VuZGVyIikpeyBib3hwbG90KHJlc2lkKG0yX1NCUF9hZnQpIH4gY2xlYW5CUF9hZnRbLFZhcl0sbWFpbj1wYXN0ZSgiUmVzaWR1YWxzIGJ5IixWYXIpKSB9DQpiYXJwbG90KHZpZihtMl9TQlBfYWZ0KSxtYWluPSJWSUYgVmFsdWVzIix4bGltPWMoMCwxMCksbGFzPTIsaG9yaXo9VFJVRSkgIyB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykNCmFibGluZSh2ID0gNSwgbHdkID0gNSwgbHR5ID0gMikNCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGJldHRlciBpbnNwZWN0IHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIHRoZSBmaXQgb2YgbW9kZWxzIHNwZWNpZmllZCB3aXRoIGFsdGVybmF0aXZlIGZhbWlseSBkaXN0cmlidXRpb25zLiBXZSBjYW4gc2VlIHRoYXQgbm9uZSBvZiB0aGUgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgc3Vic3RhbnRpYWxseSBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqbG9nLXRyYW5zZm9ybWVkKiogc29sdXRpb24gKGkuZS4sIG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBsb2ctdHJhbnNmb3JtZWQgZGVwZW5kZW50IHZhcmlhYmxlKSBzaG93aW5nIHRoZSBiZXN0IGZpdC4gWWV0LCBpdCBpcyBub3Qgc28gYmV0dGVyIHRoYW4gdGhlIG9yaWdpbmFsIG1vZGVsLiBUaHVzLCB3ZSBpbml0aWFsbHkgKipyZWx5IG9uIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uKiogYW5kIHRoZW4gY29uc2lkZXIgdGhlICoqbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiogKHNlZSBzZWN0aW9uIDQuMSkuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTJfU0JQX2FmdCkpICMgdW5rbm93biBiZXN0LWZpdCBkaXN0cmlidXRpb24NCmBgYA0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgZml0dGluZyBtb2RlbCB3aXRoIGFsdGVybmF0aXZlIGZhbWlsaWVzDQptb2RlbHMgPC0gbGlzdCgNCiAgbTJfU0JQX2FmdCwNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX1NCUF9hZnQpLGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBnYW1tYSBsb2cgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtMl9TQlBfYWZ0KSxmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBnYW1tYSBpZCAoZG9lc24ndCBjb252ZXJnZSkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX1NCUF9hZnQpLGZhbWlseT1nYXVzc2lhbihsaW5rPSJsb2ciKSxkYXRhPWNsZWFuQlBfYWZ0KSwgIyBsb2ctbm9ybWFsIChzaW5ndWxhciBmaXQpDQogIGxtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKHBhc3RlKCJsb2coU0JQX2FmdCkgfiIsYXMuY2hhcmFjdGVyKGZvcm11bGEobTJfU0JQX2FmdCkpWzNdKSksZGF0YT1jbGVhbkJQX2FmdCkpICMgbG9nIHRyYW5zZg0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiR2FtbWEtaWQiLCJsb2ctbm9ybSIsImxvZy10cmFuc2YiKVtpXSk7IHFxbGluZShyZXNpZChtb2RlbHNbW2ldXSkpfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2FmdA0KDQpNb2RlbCBgbTIuYmlzYCBzaG93cyAqKnNvbWUgZGV2aWF0aW9uIGZyb20gbm9ybWFsaXR5KiogaW4gYm90aCB0YWlscyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc2lkdWFscyBhbmQgcmFuZG9tIGVmZmVjdHMuIFBhcnRpY3VsYXJseSwgKipwYXJ0aWNpcGFudCBgUzA4MmAqKiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGhpZ2hlc3QgZXh0cmVtZSBkZXZpYXRpb24gZnJvbSB0aGUgZGlzdHJpYnV0aW9ucyBvZiBib3RoIHJhbmRvbSBlZmZlY3RzLCBhbmQgd2lsbCBiZSByZW1vdmVkIGFzIGEgcm9idXN0bmVzcyBjaGVjayAoc2VlIHNlY3Rpb24gNC4xKS4gQmVzaWRlcyB0aGF0LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGhvbW9zY2Vkc3RpY2l0eSBhc3N1bXB0aW9uIGhvbGRzIGFuZCB0aGF0IG5vbmUgb2YgdGhlIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKSBzaG93cyBleHRyZW1lIHZhbHVlcywgcnVsaW5nIG91dCB0aGUgcmlzayBvZiBtdWx0aWNvbGxpbmVhcml0eS4NCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBub3JtYWxpdHkgYW5kIGhvbW9zY2VkYXN0aWNpdHkNCnAgPC0gcGxvdF9tb2RlbChtMl9EQlBfYWZ0LHR5cGU9ImRpYWciLGRvdC5zaXplPTEpDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQoNCiMgcGFydGljaXBhbnQgd2l0aCBoaWdoZXN0IHJhbmRvbSBlZmZlY3RzIChpLmUuLCBCTFVQUykNCnJlIDwtIHJhbmVmKG0yX0RCUF9hZnQpJElEDQpyZVtyZSRXSExTTS5tYz09bWF4KHJlJFdITFNNLm1jKXxyZSRgKEludGVyY2VwdClgPT1tYXgocmUkYChJbnRlcmNlcHQpYCksXQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbXVsdGljb2xsaW5lYXJpdHkNCnBhcihtZnJvdz1jKDEsMikpDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtMl9EQlBfYWZ0KSB+IGNsZWFuQlBfYWZ0WyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTJfREJQX2FmdCksbWFpbj0iVklGIFZhbHVlcyIseGxpbT1jKDAsMTApLGxhcz0yLGhvcml6PVRSVUUpICMgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpDQphYmxpbmUodiA9IDUsIGx3ZCA9IDUsIGx0eSA9IDIpDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBiZXR0ZXIgaW5zcGVjdCB0aGUgcmVzaWR1YWwgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZml0IG9mIG1vZGVscyBzcGVjaWZpZWQgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbHkgZGlzdHJpYnV0aW9ucy4gV2UgY2FuIHNlZSB0aGF0IHNvbWUgb2YgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgc2xpZ2h0bHkgYmV0dGVyIGFwcHJveGltYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kZWwgcmVzaWR1YWxzLCBhbHRob3VnaCBub3QgcmVhY2hpbmcgY29udmVyZ2VuY2UuIFRoZSAqKmxvZy10cmFuc2Zvcm1lZCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nLXRyYW5zZm9ybWVkIGRlcGVuZGVudCB2YXJpYWJsZSkgc2hvd3MgdGhlIGJlc3QgZml0IHdoaWxlIHJlYWNoaW5nIGNvbnZlcmdlbmNlLiBZZXQsIGl0IGlzIG5vdCBzbyBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGluaXRpYWxseSAqKnJlbHkgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24qKiBhbmQgdGhlbiBjb25zaWRlciB0aGUgKipsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiBhcyBhIHJvYnVzdG5lc3MgY2hlY2sqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIGluc3BlY3RpbmcgcmVzaWR1YWwgZGlzdHJpYnV0aW9uDQpkZXNjZGlzdChyZXNpZChtMl9EQlBfYWZ0KSkgIyB1bmtub3duIGJlc3QtZml0IGRpc3RyaWJ1dGlvbg0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtMl9EQlBfYWZ0LA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTJfREJQX2FmdCksZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGdhbW1hIGxvZyAoZG9lc24ndCBjb252ZXJnZSkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0yX0RCUF9hZnQpLGZhbWlseT1HYW1tYShsaW5rPSJpZGVudGl0eSIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGdhbW1hIGlkIChkb2Vzbid0IGNvbnZlcmdlKQ0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTJfREJQX2FmdCksZmFtaWx5PWdhdXNzaWFuKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9hZnQpLCAjIGxvZy1ub3JtYWwgKHNpbmd1bGFyIGZpdCkNCiAgbG1lcihmb3JtdWxhPWFzLmZvcm11bGEocGFzdGUoImxvZyhTQlBfYWZ0KSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtMl9EQlBfYWZ0KSlbM10pKSxkYXRhPWNsZWFuQlBfYWZ0KSkgIyBsb2cgdHJhbnNmDQoNCiMgbm9ybWFsIFEtUSBwbG90IG9mIG1vZGVsIHJlc2lkdWFscw0KcGFyKG1mcm93PWMoMSw1KSkNCmZvcihpIGluIDE6bGVuZ3RoKG1vZGVscykpeyANCiAgcXFub3JtKHJlc2lkKG1vZGVsc1tbaV1dKSxtYWluPWMoIk5vcm0iLCJHYW1tYS1sb2ciLCJHYW1tYS1pZCIsImxvZy1ub3JtIiwibG9nLXRyYW5zZiIpW2ldKTsgcXFsaW5lKHJlc2lkKG1vZGVsc1tbaV1dKSl9DQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjMuIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGNvbXBhcmUgdGhlIHNwZWNpZmllZCBtb2RlbHMgYmFzZWQgb24gdGhlIEFrYWlrZSB3ZWlnaHQgYW5kIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgKHdpdGggdHlwZS1JIGVycm9yIHNldCB0byAqcCogPCAuMDUpLCBhbmQgd2UgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwocykuIA0KDQojIyMjIyBTQlBfYWZ0DQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIGFuZCBzaWduaWZpY2FudGx5IGhpZ2hlciBsaWtlbGlob29kIHRoYW4gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDE1LjA3LCAqcCogPCAuMDAxKSwgd2l0aCAqKm1vZGVsIGBtMmAgYmVpbmcgc2VsZWN0ZWQgYXMgdGhlIGJlc3QgbW9kZWwqKi4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX1NCUF9hZnQsbTFfU0JQX2FmdCkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9TQlBfYWZ0LG0xX1NCUF9hZnQsbTJfU0JQX2FmdCkpICMgc3RhdGUgd29ya2Fob2xpc206IGJldHRlcg0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdA0KYW5vdmEobTFfU0JQX2FmdCxtMl9TQlBfYWZ0KSAjIGJlc3QgbW9kZWwgaXMgbTINCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIHNlbGVjdGVkIG1vZGVsIGBtMi5iaXNgIGFuZCB0aG9zZSBlc3RpbWF0ZWQgYnkgbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLiBXZSBjYW4gc2VlIHRoYXQgc3RhdGUgYFdITFNNLm1jYCBpcyBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gYEJQX2FmdGAsIHdoZXJlYXMgdHJhaXQgYFdITFNNLmNtLmdtY2AgaXMgbm90LiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYGdlbmRlcmAsIGBhZ2VgIGFuZCBgQk1JYCwgYnV0IG5vdCB0cmFpdCBgV0hMU00uY20uZ21jYCBwcmVkaWN0IGhpZ2hlciBgU0JQX2FmdGAuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfU0JQX2FmdCxtMl9TQlBfYWZ0LA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iKSwNCiAgICAgICAgICBzaG93LmljYz1GQUxTRSxzaG93LnA9RkFMU0Usc2hvdy5zZT1UUlVFLHNob3cucjI9RkFMU0Usc2hvdy5jaT1GQUxTRSwNCiAgICAgICAgICBjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KDQojIHBsb3R0aW5nIG1haW4gZWZmZWN0cyBmcm9tIHNlbGVjdGVkIG1vZGVsDQpncmlkLmFycmFuZ2UocGxvdF9tb2RlbChtMl9TQlBfYWZ0LHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTJfU0JQX2FmdCx0eXBlPSJwcmVkIix0ZXJtcz0iV0hMU00ubWMiKSxucm93PTEpICMgc3RhdGUgV0hMU00NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIERCUF9hZnQNCg0KUmVzdWx0cyBhcmUgKippbiBsaW5lIHdpdGggdGhvc2UgZm91bmQgZm9yIGBTQlBfYWZ0YCoqOiB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIGFuZCBzaWduaWZpY2FudGx5IGhpZ2hlciBsaWtlbGlob29kIHRoYW4gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDEzLjg0LCAqcCogPCAuMDAxKSwgd2l0aCAqKm1vZGVsIGBtMmAgYmVpbmcgc2VsZWN0ZWQgYXMgdGhlIGJlc3QgbW9kZWwqKi4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX0RCUF9hZnQsbTFfREJQX2FmdCkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9EQlBfYWZ0LG0xX0RCUF9hZnQsbTJfREJQX2FmdCkpICMgc3RhdGUgd29ya2Fob2xpc206IGJldHRlcg0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdA0KYW5vdmEobTFfREJQX2FmdCxtMl9EQlBfYWZ0KSAjIGJlc3QgbW9kZWwgaXMgbTINCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIHNlbGVjdGVkIG1vZGVsIGBtMmAgYW5kIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3RoZXIgbW9kZWxzLiAqKkluIGxpbmUgd2l0aCB0aGUgcmVzdWx0cyBmb3VuZCBmb3IgYFNCUF9hZnRgKiosIHdlIGNhbiBzZWUgdGhhdCBzdGF0ZSBgV0hMU00ubWNgIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgREJQX2FmdGAsIHdoZXJlYXMgdHJhaXQgYFdITFNNLmNtLmdtY2AgaXMgbm90LiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYm90aCBgYWdlYCBhbmQgYEJNSWAsIGJ1dCBub3QgYGdlbmRlcmAgcHJlZGljdCBoaWdoZXIgYERCUF9hZnRgLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX0RCUF9hZnQsbTJfREJQX2FmdCwNCiAgICAgICAgICBkdi5sYWJlbHM9YygiQ292YXJpYXRlcyIsIlN0YXRlIFdITFNNIiksDQogICAgICAgICAgc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSxzaG93LnIyPUZBTFNFLHNob3cuY2k9RkFMU0UsDQogICAgICAgICAgY29sbGFwc2Uuc2U9VFJVRSxzdHJpbmcuZXN0PSJiIChTRSkiLHNob3cuc3RhdD1UUlVFLHN0cmluZy5zdGF0PSJ0IikNCg0KIyBwbG90dGluZyBtYWluIGVmZmVjdHMgZnJvbSBzZWxlY3RlZCBtb2RlbA0KZ3JpZC5hcnJhbmdlKHBsb3RfbW9kZWwobTJfREJQX2FmdCx0eXBlPSJwcmVkIix0ZXJtcz0iV0hMU00uY20uZ21jIiksICMgdHJhaXQgV0hMU00NCiAgICAgICAgICAgICBwbG90X21vZGVsKG0yX0RCUF9hZnQsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4xLjQuIEluZmx1ZW50aWFsIGNhc2VzDQoNCkhlcmUsIHdlIGV2YWx1YXRlIHRoZSBwcmVzZW5jZSBvZiBpbmZsdWVudGlhbCBjYXNlcyBpbiB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yYC4gU3BlY2lmaWNhbGx5LCB0aGUgKipDb29r4oCZcyBkaXN0YW5jZSoqIGlzIGNvbnNpZGVyZWQgYXMgdGhlIG1haW4gbWVhc3VyZSBvZiBpbmRpdmlkdWFsLWxldmVsIChpLmUuLCBwYXJ0aWNpcGFudCkgaW5mbHVlbmNlIG9uIHRoZSBlc3RpbWF0ZWQgcGFyYW1ldGVycywgYW5kIGl0IGlzIHJlY29tcHV0ZWQgYnkgcHJvZ3Jlc3NpdmVseSBleGNsdWRpbmcgdGhlIG1vc3QgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzIChpLmUuLCBiYXNlZCBvbiB0aGUgcnVsZS1vZi10aHVtYiBvZiA0L04pIHVudGlsIGFsbCBleHRyZW1lIHZhbHVlcyBhcmUgcmVtb3ZlZC4NCg0KIyMjIyMgMy4xLjEuNC4xLiBDb29rJ3MgZGlzdGFuY2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfYWZ0DQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMwOTZgIGFuZCBgUzA4MmAgYXJlIHBvdGVudGlhbGx5IGluZmx1ZW50aWFsIGNhc2VzLiBOb3RlIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lIHBhcnRpY2lwYW50cyBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjEuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgY29vaydzIGRpc3RhbmNlIG9uIHRoZSB3aG9sZSBzYW1wbGUNCmluZmwgPC0gaW5mbHVlbmNlKG0yX1NCUF9hZnQsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkJQX2FmdCRJRCkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkNCg0KIyBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMNCmluZmwgPC0gbGlzdCgNCiAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0yX1NCUF9hZnQsIklEIiwiUzA4MiIpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfU0JQX2FmdCwiSUQiLGMoIlMwODIiLCJTMDk2IikpLCJJRCIpKQ0KZm9yKGkgaW4gMTpsZW5ndGgoaW5mbCkpeyANCiAgcGxvdChpbmZsW1tpXV0sd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuQlBfYWZ0JElEKS1pKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKSB9DQpgYGANCg0KPGJyPg0KDQojIyMjIyMgREJQX2FmdA0KDQpXZSBjYW4gc2VlIHRoYXQgcGFydGljaXBhbnQgYFMwODJgIGlzIGEgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZS4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcGFydGljaXBhbnRzIHNob3dpbmcgdGhlIG1vc3QgZXh0cmVtZSBkZXZpYXRpb25zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIGVmZmVjdHMgKHNlZSBzZWN0aW9uIDMuMS4yKS4NCmBgYHtyIGZpZy53aWR0aD0zLGZpZy5oZWlnaHQ9MTAsd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfREJQX2FmdCwiSUQiKQ0KcGxvdChpbmZsLHdoaWNoPSJjb29rIixjdXRvZmY9NC9ubGV2ZWxzKGNsZWFuQlBfYWZ0JElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KGluZmx1ZW5jZShleGNsdWRlLmluZmx1ZW5jZShtMl9EQlBfYWZ0LCJJRCIsIlMwODIiKSwiSUQiKSkNCmZvcihpIGluIDE6bGVuZ3RoKGluZmwpKXsgDQogIHBsb3QoaW5mbFtbaV1dLHdoaWNoPSJjb29rIixjdXRvZmY9NC8obmxldmVscyhjbGVhbkJQX2FmdCRJRCktaSkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkgfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgMy4xLjEuNC4yLiBDb2VmZmljaWVudCBjaGFuZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfYWZ0DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGRvIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBmcm9tIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9TQlBfYWZ0Lm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2FmdCxkYXRhPWNsZWFuQlBfYWZ0WyFjbGVhbkJQX2FmdCRJRCVpbiVjKCJTMDk2IiwiUzA4MiIpLF0pDQoNCiMgcGxvdHRpbmcgY29lZmZpY2llbnRzIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQpwbG90X21vZGVscyhtMl9TQlBfYWZ0LG0yX1NCUF9hZnQubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0yX1NCUF9hZnQsbTJfU0JQX2FmdC5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMjIERCUF9hZnQNCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgbWFnbml0dWRlIG9mIHRoZSBjaGFuZ2VzIGluIHRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnRzIGFmdGVyIHRoZSByZW1vdmFsIG9mIHBvdGVudGlhbGx5IGluZmx1ZW50aWFsIGNhc2VzLiBXZSBjYW4gc2VlIHRoYXQgdGhlIHJlbW92YWwgb2YgdGhlIGluZmx1ZW50aWFsIHBhcnRpY2lwYW50IG1haW5seSBhZmZlY3RzIHRoZSBwYXJhbWV0ZXIgZXN0aW1hdGVkIGZvciBgZ2VuZGVyYCwgd2l0aCBtZW4gc2hvd2luZyBzdWJzdGFudGlhbGx5IGhpZ2hlciBgREJQX2FmdGAgdGhhbiB3b21lbiBpbiB0aGUgdXBkYXRlZCBtb2RlbC4gVGh1cywgc2luY2UgYGdlbmRlcmAgaXMgbm90IG91ciBtYWluIGZvY3VzLCB3ZSAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9EQlBfYWZ0Lm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2FmdCxkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JElEIT0iUzA4MiIsXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0RCUF9hZnQsbTJfREJQX2FmdC5ub0luZmwpDQoNCiMgc2hvd2luZyByZWdyZXNzaW9uIHRhYmxlIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQp0YWJfbW9kZWwobTJfREJQX2FmdCxtMl9EQlBfYWZ0Lm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIyMgMy4xLjIuIEV2ZW5pbmcgQlANCg0KU3lzdG9saWMgYFNCUF9ldmVgIGFuZCBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUgYERCUF9ldmVgIHJlY29kZWQgaW4gdGhlIGV2ZW5pbmcgYXJlIHByZWRpY3RlZCBieSBjb25jdXJyZW50IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGJ5IHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLCB0cmFpdCB3b3JrYWhvbGlzbSBgV0hMU00uY21gLCBhbmQgdGhyZWUgY292YXJpYXRlcyBzZWxlY3RlZCBmcm9tIHRoZSBwcmV2aW91cyBzdGVwIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKSwgbmFtZWx5IGBnZW5kZXJgLCBgYWdlYCwgYW5kIGBCTUlgLiBBIGZ1cnRoZXIgcG90ZW50aWFsIGNvbmZvdW5kZXIgaGlnaGxpZ2h0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCwgbmFtZWx5IGBkYXlgIChpLmUuLCBleHByZXNzaW5nIHRoZSBsaW5lYXIgdGltZSB0cmVuZCBvdmVyIHRoZSBzdHVkeSBwcm90b2NvbCksIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGlzIHBvaW50IHRvIGdldCBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMgYW5kIG1vcmUgY29tcGFyYWJsZSByZXN1bHRzIGFjcm9zcyBCUCBtb2RlbHMsIGFsc28gY29uc2lkZXJpbmcgdGhlIGxhY2sgb2YgbGluZWFyIHRlbXBvcmFsIHRyZW5kcyBpbiBzdGF0ZSBgV0hMU01gIG1lYXN1cmVzIChzZWUgYmVsb3cpLiBQYXJ0aWN1bGFybHksIGFzIHNob3duIGluIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM1XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNV9kZXNjcmlwdGl2ZXMvUzVfZGVzY3JpcHRpdmVzLWNvZGUtYW5kLW91dHB1dC5odG1sKSwgc3VjaCBsaW5lYXIgdHJlbmQgaXMgcG9zc2libHkgZHVlIHRvIG1lYXN1cmVtZW50IHJlYWN0aXZpdHkgKGkuZS4sIGluY3JlYXNlZCBwaHlzaW9sb2dpY2FsIGFjdGl2YXRpb24gZHVyaW5nIHRoZSBmaXJzdCAtIGxlc3MgZmFtaWxpYXIgLSBibG9vZCBwcmVzc3VyZSByZWNvcmRpbmdzKSwgYW5kIGl0IHdpbGwgYmUgY29uc2lkZXJlZCBhcyBhIHJvYnVzdG5lc3MgY2hlY2sgaW4gc2VjdGlvbiA0LjIuDQpgYGB7ciBmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTJ9DQptZm9ybXVsYXNbM10gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBTQlBfYWZ0DQptZm9ybXVsYXNbNF0gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBEQlBfYWZ0DQoNCiMgcGxvdHRpbmcgV0hMU00gJiBTQlAgYnkgZGF5DQpwYXIobWZyb3c9YygxLDMpKTsgYm94cGxvdChTQlBfZXZlIH4gZGF5LGRhdGE9Y2xlYW4pOyBib3hwbG90KERCUF9ldmUgfiBkYXksZGF0YT1jbGVhbik7IGJveHBsb3QoV0hMU00gfiBkYXksZGF0YT1jbGVhbikNCg0KIyBtb2RlbCB3ZWlnaHQgYW5kIGVzdGltYXRlZCBwYXJhbWV0ZXIgZm9yIFdITFNNIGJ5IHRpbWUNCm0wIDwtIGxtZXIoV0hMU00gfiAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KbTEgPC0gbG1lcihXSExTTSB+IGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSkpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4yLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkJQX2V2ZSA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5CUFssYygiSUQiLCJTQlBfZXZlIiwiREJQX2V2ZSIsICMgZ3JvdXBpbmcgYW5kIGRlcGVuZGVudCB2YXJpYWJsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsIlBEIiwgIyBjb3JlIHByZWRpY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRSIsIldDIiwic2xlZXBfZHlzZiIsInBzeV9kcnVncyIsImhvcm1fZHJ1Z3MiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZvdW5kZXJzX2V2ZSIsImZsYWdCUF9ldmUiLCJmbGFnVGltZSIsImNhcmVsZXNzIiwiZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIildKSkgDQpjbGVhbkJQX2V2ZSRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5CUF9ldmUpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0Kd2lkZSA8LSBjbGVhbkJQX2V2ZVshZHVwbGljYXRlZChjbGVhbkJQX2V2ZSRJRCksXSAjIHdpZGUtZm9ybSBkYXRhc2V0DQpmb3IoVmFyIGluIGMoIldITFNNIiwiUEQiLCJXRSIsIldDIikpew0KICB3aWRlIDwtIGNiaW5kKHdpZGUsYWdncmVnYXRlKGNsZWFuQlBfZXZlWyxWYXJdLGxpc3QoY2xlYW5CUF9ldmUkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfZXZlIDwtIGpvaW4oY2xlYW5CUF9ldmUsd2lkZVssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikgIyBqb2luaW5nIHRvIGxvbmctZm9ybSBkZg0KICBjbGVhbkJQX2V2ZVsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfZXZlWyxWYXJdIC0gY2xlYW5CUF9ldmVbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgbWVhbi1jZW50ZXJlZCBzY29yZXMNCg0KIyBncmFuZC1tZWFuLWNlbnRlcmluZyBsdi0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KZm9yKFZhciBpbiBjKCJhZ2UiLCJCTUkiLCJXSExTTS5jbSIpKXsgY2xlYW5CUF9ldmVbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5CUF9ldmVbLFZhcl0gLSBtZWFuKHdpZGVbLFZhcl0pIH0NCg0KIyBzaG93aW5nIGRhdGENCmNsZWFuQlBfZXZlWzE6MyxdICMgZmlyc3QgdGhyZWUgcm93cw0KYGBgDQoNCjxicj4NCg0KIyMjIyAzLjEuMi4yLiBNb2RlbCBmaXQgIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfU0JQX2V2ZSA8LSBsbWVyKFNCUF9ldmUgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9TQlBfZXZlIDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0yOiBzdGF0ZSB3b3JrYWhvbGlzbQ0KbTJfU0JQX2V2ZSA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCg0KIyBtMzogaW50ZXJhY3Rpb24NCm0zX1NCUF9ldmUgPC0gbG1lcihTQlBfZXZlIH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgV0hMU00ubWM6UEQubWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCmBgYA0KDQo8YnI+DQoNClRoZSBzYW1lIG1vZGVscyBhcmUgc3BlY2lmaWVkIGZvciBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiAoMXxJRCksICMgb25seSBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCArIHJlc2lkdWFsIHRlcm0NCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KDQojIG0xOiBjb3ZhcmlhdGVzDQptMV9EQlBfZXZlIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyAoMXxJRCksDQogICAgICAgICAgICAgICAgICAgZGF0YT1jbGVhbkJQX2V2ZSkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX0RCUF9ldmUgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlLmdtYyArIEJNSS5nbWMgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICAgICAgIGRhdGE9Y2xlYW5CUF9ldmUpDQoNCiMgbTM6IGludGVyYWN0aW9ucw0KbTNfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBXSExTTS5tYzpQRC5tYyArICgxfElEKSwNCiAgICAgICAgICAgICAgICAgICBkYXRhPWNsZWFuQlBfZXZlKQ0KYGBgDQoNCkZyb20gdGhlIHByZXZpb3VzIGNodW5rcywgd2Ugc2VlIHRoYXQgYWxsIG1vZGVscyBjb252ZXJnZWQgd2l0aG91dCBwcm9ibGVtcy4gSGVyZSwgd2UgaW5zcGVjdCB0aGUgKipkaWFnbm9zdGljcyoqIChpLmUuLCBub3JtYWxpdHkgb2YgcmVzaWR1YWwgYW5kIHJhbmRvbSBlZmZlY3QgZGlzdHJpYnV0aW9ucywgaG9tb3NjZWRhc3RpY2l0eSwgYW5kIG11bHRpY29sbGluZWFyaXR5KSBvZiB0aGUgbW9zdCBjb21wbGV4IG1vZGVsIGBtM2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQojIyMjIyBTQlBfZXZlDQoNCk1vZGVsIGBtM19TQlBfZXZlYCBzaG93cyAqKnNvbWUgZGV2aWF0aW9uIGZyb20gbm9ybWFsaXR5KiogZXNwZWNpYWxseSBpbiB0aGUgdXBwZXIgdGFpbCBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJlc2lkdWFscyBhbmQgYm90aCB0YWlscyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIHJhbmRvbSBlZmZlY3RzLiBQYXJ0aWN1bGFybHksICoqcGFydGljaXBhbnQgYFMwODJgKiogaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IGV4dHJlbWUgZGV2aWF0aW9uIGZyb20gdGhlIGRpc3RyaWJ1dGlvbnMgb2YgcmFuZG9tIGludGVyY2VwdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0zX1NCUF9ldmUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTNfU0JQX2V2ZSkkSUQNCmFzLmNoYXJhY3RlcihjbGVhbkJQX3ByZWxxc1t3aGljaChyZSRgKEludGVyY2VwdClgPT1tYXgocmUkYChJbnRlcmNlcHQpYCkpLCJJRCJdKQ0KYGBgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9M30NCiMgaG9tb3NjZWRhc3RpY2l0eSBhbmQgbXVsdGljb2xsaW5lYXJpdHkNCnBhcihtZnJvdz1jKDEsMikpDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19TQlBfZXZlKSB+IGNsZWFuQlBfZXZlWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfU0JQX2V2ZSksbWFpbj0iVklGIFZhbHVlcyIseGxpbT1jKDAsMTApLGxhcz0yLGhvcml6PVRSVUUpICMgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpDQphYmxpbmUodiA9IDUsIGx3ZCA9IDUsIGx0eSA9IDIpDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBiZXR0ZXIgaW5zcGVjdCB0aGUgcmVzaWR1YWwgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZml0IG9mIG1vZGVscyBzcGVjaWZpZWQgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbHkgZGlzdHJpYnV0aW9ucy4gV2UgY2FuIHNlZSB0aGF0IG5vbmUgb2YgdGhlIGFsdGVybmF0aXZlIGZhbWlsaWVzIHN1YnN0YW50aWFsbHkgYmV0dGVyIGFwcHJveGltYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgbW9kZWwgcmVzaWR1YWxzLCB3aXRoIHRoZSAqKmxvZy10cmFuc2Zvcm1lZCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nLXRyYW5zZm9ybWVkIGRlcGVuZGVudCB2YXJpYWJsZSkgc2hvd2luZyB0aGUgYmVzdCBmaXQuIFlldCwgaXQgaXMgbm90IHNvIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbCBtb2RlbC4gVGh1cywgd2UgaW5pdGlhbGx5ICoqcmVseSBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbioqIGFuZCB0aGVuIGNvbnNpZGVyIHRoZSAqKmxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIGFzIGEgcm9idXN0bmVzcyBjaGVjayoqIChzZWUgc2VjdGlvbiA0LjEpLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgaW5zcGVjdGluZyByZXNpZHVhbCBkaXN0cmlidXRpb24NCmRlc2NkaXN0KHJlc2lkKG0zX1NCUF9ldmUpKSAjIHVua25vd24gYmVzdC1maXQgZGlzdHJpYnV0aW9uDQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTN9DQojIGZpdHRpbmcgbW9kZWwgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbGllcw0KbW9kZWxzIDwtIGxpc3QoDQogIG0zX1NCUF9ldmUsDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19TQlBfZXZlKSxmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgbG9nIChkb2Vzbid0IGNvbnZlcmdlKQ0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfU0JQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgaWQgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19TQlBfZXZlKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgbG9nLW5vcm1hbCAoc2luZ3VsYXIgZml0KQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNCUF9ldmUpIH4iLGFzLmNoYXJhY3Rlcihmb3JtdWxhKG0zX1NCUF9ldmUpKVszXSkpLGRhdGE9Y2xlYW5CUF9ldmUpKSAjIGxvZyB0cmFuc2YNCg0KIyBub3JtYWwgUS1RIHBsb3Qgb2YgbW9kZWwgcmVzaWR1YWxzDQpwYXIobWZyb3c9YygxLDUpKQ0KZm9yKGkgaW4gMTpsZW5ndGgobW9kZWxzKSl7IA0KICBxcW5vcm0ocmVzaWQobW9kZWxzW1tpXV0pLG1haW49YygiTm9ybSIsIkdhbW1hLWxvZyIsIkdhbW1hLWlkIiwibG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKX0NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIERCUF9ldmUNCg0KTW9kZWwgYG0zX0RCUF9ldmVgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBpbiBib3RoIHRhaWxzIG9mIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzIGFuZCByYW5kb20gZWZmZWN0cy4gUGFydGljdWxhcmx5LCAqKnBhcnRpY2lwYW50IGBTMDgyYCoqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGlnaGVzdCBleHRyZW1lIGRldmlhdGlvbiBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggcmFuZG9tIGVmZmVjdHMsIGFuZCB3aWxsIGJlIHJlbW92ZWQgYXMgYSByb2J1c3RuZXNzIGNoZWNrIChzZWUgc2VjdGlvbiA0LjEpLiBCZXNpZGVzIHRoYXQsIHdlIGNhbiBzZWUgdGhhdCB0aGUgaG9tb3NjZWRzdGljaXR5IGFzc3VtcHRpb24gaG9sZHMgYW5kIHRoYXQgbm9uZSBvZiB0aGUgdmFyaWFuY2UgaW5mbGF0aW9uIGZhY3RvcnMgKFZJRnMpIHNob3dzIGV4dHJlbWUgdmFsdWVzLCBydWxpbmcgb3V0IHRoZSByaXNrIG9mIG11bHRpY29sbGluZWFyaXR5Lg0KYGBge3IgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9DQojIG5vcm1hbGl0eSBhbmQgaG9tb3NjZWRhc3RpY2l0eQ0KcCA8LSBwbG90X21vZGVsKG0zX0RCUF9ldmUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkNCnBbWzJdXSA8LSBwW1syXV0kSUQNCnBsb3RfZ3JpZChwLHRhZ3M9VFJVRSxtYXJnaW49YygwLDAsMCwwKSkNCg0KIyBwYXJ0aWNpcGFudCB3aXRoIGhpZ2hlc3QgcmFuZG9tIGVmZmVjdHMgKGkuZS4sIEJMVVBTKQ0KcmUgPC0gcmFuZWYobTNfREJQX2V2ZSkkSUQNCnJlW3JlJFdITFNNLm1jPT1tYXgocmUkV0hMU00ubWMpfHJlJGAoSW50ZXJjZXB0KWA9PW1heChyZSRgKEludGVyY2VwdClgKSxdDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkNCmZvcihWYXIgaW4gYygiZ2VuZGVyIikpeyBib3hwbG90KHJlc2lkKG0zX0RCUF9ldmUpIH4gY2xlYW5CUF9ldmVbLFZhcl0sbWFpbj1wYXN0ZSgiUmVzaWR1YWxzIGJ5IixWYXIpKSB9DQpiYXJwbG90KHZpZihtM19EQlBfZXZlKSxtYWluPSJWSUYgVmFsdWVzIix4bGltPWMoMCwxMCksbGFzPTIsaG9yaXo9VFJVRSkgIyB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykNCmFibGluZSh2ID0gNSwgbHdkID0gNSwgbHR5ID0gMikNCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGJldHRlciBpbnNwZWN0IHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIHRoZSBmaXQgb2YgbW9kZWxzIHNwZWNpZmllZCB3aXRoIGFsdGVybmF0aXZlIGZhbWlseSBkaXN0cmlidXRpb25zLiBXZSBjYW4gc2VlIHRoYXQgbm9uZSBvZiB0aGUgYWx0ZXJuYXRpdmUgZmFtaWxpZXMgYmV0dGVyIGFwcHJveGltYXRlcyB0aGUgZGlzdHJpYnV0aW9uIG9mIG1vZGVsIHJlc2lkdWFscywgYW5kIG5vbmUgb2YgdGhlbSByZWFjaGVkIGNvbnZlcmdlbmNlLiBUaHVzLCB3ZSBpbml0aWFsbHkgKipyZWx5IG9uIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uKiogYW5kIHRoZW4gY29uc2lkZXIgdGhlICoqZ2FtbWEgbG9nIGFzIGEgcm9idXN0bmVzcyBjaGVjayoqIChpLmUuLCB0aGUgb25seSBzb2x1dGlvbiB0aGF0IGNvbnZlcmdlcykuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfREJQX2V2ZSkpICMgdW5rbm93biBiZXN0LWZpdCBkaXN0cmlidXRpb24gYnV0IGNsb3NlIHRvIG5vcm1hbA0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtM19EQlBfZXZlLA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfREJQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImxvZyIpLGRhdGE9Y2xlYW5CUF9ldmUpLCAjIGdhbW1hIGxvZw0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfREJQX2V2ZSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkJQX2V2ZSksICMgZ2FtbWEgaWQgKGRvZXNuJ3QgY29udmVyZ2UpDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19EQlBfZXZlKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkJQX2V2ZSksICMgbG9nLW5vcm1hbCAoc2luZ3VsYXIgZml0KQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNCUF9ldmUpIH4iLGFzLmNoYXJhY3Rlcihmb3JtdWxhKG0yX0RCUF9ldmUpKVszXSkpLGRhdGE9Y2xlYW5CUF9ldmUpKSAjIGxvZyB0ciAoc2luZ3VsYXIpDQoNCiMgbm9ybWFsIFEtUSBwbG90IG9mIG1vZGVsIHJlc2lkdWFscw0KcGFyKG1mcm93PWMoMSw1KSkNCmZvcihpIGluIDE6bGVuZ3RoKG1vZGVscykpeyANCiAgcXFub3JtKHJlc2lkKG1vZGVsc1tbaV1dKSxtYWluPWMoIk5vcm0iLCJHYW1tYS1sb2ciLCJHYW1tYS1pZCIsImxvZy1ub3JtIiwibG9nLXRyYW5zZiIpW2ldKTsgcXFsaW5lKHJlc2lkKG1vZGVsc1tbaV1dKSl9DQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMS4yLjMuIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkhlcmUsIHdlIGNvbXBhcmUgdGhlIHNwZWNpZmllZCBtb2RlbHMgYmFzZWQgb24gdGhlIEFrYWlrZSB3ZWlnaHQgYW5kIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgKHdpdGggdHlwZS1JIGVycm9yIHNldCB0byAqcCogPCAuMDUpLCBhbmQgd2UgaW5zcGVjdCB0aGUgcmVzdWx0cyBvZiB0aGUgc2VsZWN0ZWQgbW9kZWwocykuIA0KDQojIyMjIyBTQlBfZXZlDQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBzdHJvbmdlciBldmlkZW5jZSBvciBzaWduaWZpY2FudCBsaWtlbGlob29kIHJhdGlvIGNvbXBhcmVkIHRvIG1vZGVscyBpbmNsdWRpbmcgbGVzcyBwcmVkaWN0b3JzIChBdyA9IC4zMywgJFxjaGleMiQoMSkgPSAwLjU4LCAqcCogPSAuNDQpLiBTaW1pbGFyLCB0aGUgaW50ZXJhY3Rpb24gZG9lcyBub3QgaW1wbHkgc3Ryb25nZXIgZXZpZGVuY2Ugb3Igc2lnbmlmaWNhbnQgbGlrZWxpaG9vZCByYXRpbyAoQXcgPSAuMTEsICRcY2hpXjIkKDEpID0gMC42NSwgKnAqID0gLjQyKS4NCmBgYHtyIH0NCiMgQWthaWtlIHdlaWdodCBhZGRpbmcgb25lIG1vZGVsIGF0IHRpbWUNCldlaWdodHMoQUlDKG0wX1NCUF9ldmUsbTFfU0JQX2V2ZSkpICMgY292YXJpYXRlczogYmV0dGVyDQpXZWlnaHRzKEFJQyhtMF9TQlBfZXZlLG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSkpICMgc3RhdGUgd29ya2Fob2xpc206IHdvcnNlDQpXZWlnaHRzKEFJQyhtMF9TQlBfZXZlLG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSxtM19TQlBfZXZlKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMy5SRGV0DQphbm92YShtMV9TQlBfZXZlLG0yX1NCUF9ldmUsbTNfU0JQX2V2ZSkgIyBiZXN0IG1vZGVsIGlzIG0xDQpgYGANCg0KPGJyPg0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSBzZWxlY3RlZCBtb2RlbCBgbTEuYmlzYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IHRoZSB0YXJnZXQgbW9kZWxzLiBXZSBjYW4gc2VlIHRoYXQgc3RhdGUgYFdITFNNLm1jYCBpcyBub3Qgc3Vic3RhbnRpYWxseSByZWxhdGVkIHRvIGBCUF9ldmVgLCBzaW1pbGFyIHRvIHRyYWl0IGBXSExTTS5jbS5nbWNgIGlzIG5vdC4gQW1vbmcgdGhlIGluY2x1ZGVkIGNvdmFyaWF0ZXMsIGBhZ2VgLCBgQk1JYCwgYW5kIGxvdyBgUERgIHByZWRpY3QgaGlnaGVyIGBTQlBfZXZlYC4NCmBgYHtyIGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX1NCUF9ldmUsbTJfU0JQX2V2ZSxtM19TQlBfZXZlLA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gbW9kZWwgbTINCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0yX1NCUF9ldmUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLmNtLmdtYyIpLCAjIHRyYWl0IFdITFNNDQogICAgICAgICAgICAgcGxvdF9tb2RlbChtMl9TQlBfZXZlLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5tYyIpLG5yb3c9MSkgIyBzdGF0ZSBXSExTTQ0KDQojIHBsb3R0aW5nIGludGVyYWN0aW9ucw0Kc2QoY2xlYW5CUF9ldmUkUEQubWMpICMgUkRldDogMSBTRCA9IDEuMzgNCnBsb3RfbW9kZWwobTNfU0JQX2V2ZSx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zOCwxLjM4XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2V2ZQ0KDQpSZXN1bHRzIGFyZSAqKnNpbWlsYXIgdG8gdGhvc2UgZm91bmQgZm9yIGBTQlBfZXZlYCoqOiB0aGUgaW5jbHVzaW9uIG9mIHN0YXRlIGBXSExTTWAgaXMgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIChBdyA9IC42OCkgYnV0IG5vdCB3aXRoIHNpZ25pZmljYW50IGxpa2VsaWhvb2QgcmF0aW8gY29tcGFyZWQgdG8gbW9kZWxzIGluY2x1ZGluZyBsZXNzIHByZWRpY3RvcnMgKCRcY2hpXjIkKDEpID0gMy43MSwgKnAqID0gLjA1KS4gU2ltaWxhciwgdGhlIGludGVyYWN0aW9uIGRvZXMgbm90IGltcGx5IHN0cm9uZ2VyIGV2aWRlbmNlIG9yIHNpZ25pZmljYW50IGxpa2VsaWhvb2QgcmF0aW8gKEF3ID0gLjE0LCAkXGNoaV4yJCgxKSA9IDAuMDEsICpwKiA9IC45OSkuDQpgYGB7ciB9DQojIEFrYWlrZSB3ZWlnaHQgYWRkaW5nIG9uZSBtb2RlbCBhdCB0aW1lDQpXZWlnaHRzKEFJQyhtMF9EQlBfZXZlLG0xX0RCUF9ldmUpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfREJQX2V2ZSxtMV9EQlBfZXZlLG0yX0RCUF9ldmUpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX0RCUF9ldmUsbTFfREJQX2V2ZSxtMl9EQlBfZXZlLG0zX0RCUF9ldmUpKSAjIHN0YXRlIHdobHNtIGJ5IGRldGFjaG1lbnQ6IHdvcnNlDQoNCiMgTGlrZWxpaG9vZCByYXRpbyB0ZXN0IHdpdGggbTMNCmFub3ZhKG0xX0RCUF9ldmUsbTJfREJQX2V2ZSxtM19EQlBfZXZlKSAjIGJlc3QgbW9kZWwgaXMgbTENCmBgYA0KDQo8YnI+DQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIGNvZWZmaWNpZW50cyBlc3RpbWF0ZWQgYnkgdGhlIG1vZGVscyBzcGVjaWZpZWQgZm9yIGBEQlBfZXZlYC4gV2UgY2FuIHNlZSB0aGF0IHN0YXRlIGBXSExTTS5tY2AgaXMgbm90IHN1YnN0YW50aWFsbHkgcmVsYXRlZCB0byBgREJQX2V2ZWAuIEFtb25nIHRoZSBpbmNsdWRlZCBjb3ZhcmlhdGVzLCBgYWdlYCBhbmQgYEJNSWAgcHJlZGljdCBoaWdoZXIgYFNCUF9ldmVgLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVncmVzc2lvbiB0YWJsZQ0KdGFiX21vZGVsKG0xX0RCUF9ldmUsbTJfREJQX2V2ZSxtM19EQlBfZXZlLA0KICAgICAgICAgIGR2LmxhYmVscz1jKCJDb3ZhcmlhdGVzIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gbW9kZWwgbTINCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0yX1NCUF9ldmUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLmNtLmdtYyIpLCAjIHRyYWl0IFdITFNNDQogICAgICAgICAgICAgcGxvdF9tb2RlbChtMl9TQlBfZXZlLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5tYyIpLG5yb3c9MSkgIyBzdGF0ZSBXSExTTQ0KDQojIHBsb3R0aW5nIGludGVyYWN0aW9ucw0Kc2QoY2xlYW5CUF9ldmUkUEQubWMpICMgUkRldDogMSBTRCA9IDEuMzgNCnBsb3RfbW9kZWwobTNfREJQX2V2ZSx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zOCwxLjM4XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyAzLjEuMi40LiBJbmZsdWVudGlhbCBjYXNlcw0KDQpIZXJlLCB3ZSBldmFsdWF0ZSB0aGUgcHJlc2VuY2Ugb2YgaW5mbHVlbnRpYWwgY2FzZXMgaW4gdGhlIHRhcmdldCBtb2RlbCBgbTJgLiBTcGVjaWZpY2FsbHksIHRoZSAqKkNvb2vigJlzIGRpc3RhbmNlKiogaXMgY29uc2lkZXJlZCBhcyB0aGUgbWFpbiBtZWFzdXJlIG9mIGluZGl2aWR1YWwtbGV2ZWwgKGkuZS4sIHBhcnRpY2lwYW50KSBpbmZsdWVuY2Ugb24gdGhlIGVzdGltYXRlZCBwYXJhbWV0ZXJzLCBhbmQgaXQgaXMgcmVjb21wdXRlZCBieSBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyB0aGUgbW9zdCBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMgKGkuZS4sIGJhc2VkIG9uIHRoZSBydWxlLW9mLXRodW1iIG9mIDQvTikgdW50aWwgYWxsIGV4dHJlbWUgdmFsdWVzIGFyZSByZW1vdmVkLg0KDQojIyMjIyAzLjEuMi40LjEuIENvb2sncyBkaXN0YW5jZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMjIFNCUF9ldmUNCg0KV2UgY2FuIHNlZSB0aGF0IHBhcnRpY2lwYW50cyBgUzA4MmAgYW5kIGBTMDk2YCBhcmUgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIE5vdGUgdGhhdCB0aGUgbGF0dGVyIGlzIHRoZSBzYW1lIHBhcnRpY2lwYW50cyBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjMuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfU0JQX2V2ZSwiSUQiKQ0KcGxvdChpbmZsLHdoaWNoPSJjb29rIixjdXRvZmY9NC9ubGV2ZWxzKGNsZWFuQlBfZXZlJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfU0JQX2V2ZSwiSUQiLCJTMDgyIiksIklEIiksDQogIGluZmx1ZW5jZShleGNsdWRlLmluZmx1ZW5jZShtMl9TQlBfZXZlLCJJRCIsYygiUzA4MiIsIlMwOTYiKSksIklEIikpDQpmb3IoaSBpbiAxOmxlbmd0aChpbmZsKSl7IA0KICBwbG90KGluZmxbW2ldXSx3aGljaD0iY29vayIsY3V0b2ZmPTQvKG5sZXZlbHMoY2xlYW5CUF9ldmUkSUQpLWkpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpIH0NCmBgYA0KDQo8YnI+DQoNCiMjIyMjIyBEQlBfZXZlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMwODJgIGFuZCBgUzA4MGAgaXMgYSBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlLiBOb3RlIHRoYXQgdGhlIGZvcm1lciBpcyB0aGUgc2FtZSBwYXJ0aWNpcGFudCBzaG93aW5nIHRoZSBtb3N0IGV4dHJlbWUgZGV2aWF0aW9ucyBmcm9tIHRoZSBkaXN0cmlidXRpb25zIG9mIHJhbmRvbSBlZmZlY3RzIChzZWUgc2VjdGlvbiAzLjMuMikuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgY29vaydzIGRpc3RhbmNlIG9uIHRoZSB3aG9sZSBzYW1wbGUNCmluZmwgPC0gaW5mbHVlbmNlKG0yX0RCUF9ldmUsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkJQX2V2ZSRJRCkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkNCg0KIyBwcm9ncmVzc2l2ZWx5IGV4Y2x1ZGluZyBwYXJ0aWNpcGFudHMNCmluZmwgPC0gbGlzdChpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfREJQX2V2ZSwiSUQiLCJTMDgyIiksIklEIiksDQogICAgICAgICAgICAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0yX0RCUF9ldmUsIklEIixjKCJTMDgyIiwiUzA4MCIpKSwiSUQiKSkNCmZvcihpIGluIDE6bGVuZ3RoKGluZmwpKXsgDQogIHBsb3QoaW5mbFtbaV1dLHdoaWNoPSJjb29rIixjdXRvZmY9NC8obmxldmVscyhjbGVhbkJQX2V2ZSRJRCktaSkseGxhYj0iQ29vayBkaXN0YW5jZSIseWxhYj0iSUQiLHNvcnQ9VFJVRSkgfQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgMy4xLjIuNC4yLiBDb2VmZmljaWVudCBjaGFuZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIyBTQlBfZXZlDQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSBjb2VmZmljaWVudHMgZXN0aW1hdGVkIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGRvIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBmcm9tIHRob3NlIGVzdGltYXRlZCBieSB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9TQlBfZXZlLm5vSW5mbCA8LSB1cGRhdGUobTJfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLF0pDQoNCiMgcGxvdHRpbmcgY29lZmZpY2llbnRzIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQpwbG90X21vZGVscyhtMl9TQlBfZXZlLG0yX1NCUF9ldmUubm9JbmZsKQ0KDQojIHNhbWUgdGhpbmcgd2l0aCBpbnRlcmFjdGlvbnMNCm0zX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtM19TQlBfZXZlLGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCnBsb3RfbW9kZWxzKG0zX1NCUF9ldmUsbTNfREJQX2V2ZS5ub0luZmwpDQoNCiMgc2hvd2luZyByZWdyZXNzaW9uIHRhYmxlIG9yaWdpbmFsIHZzLiB1cGRhdGVkIG1vZGVsDQp0YWJfbW9kZWwobTJfU0JQX2V2ZSxtMl9TQlBfZXZlLm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIyMjIyMgREJQX2V2ZQ0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMgYWZ0ZXIgdGhlIHJlbW92YWwgb2YgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIFdlIGNhbiBzZWUgdGhhdCB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGVkIGZvciBzdGF0ZSBgV0hMU00ubWNgIGJ5IHRoZSB1cGRhdGVkIG1vZGVsIGlzIHN0cm9uZ2x5IHJlZHVjZWQuIFRodXMsIHRoZXNlIHJlc3VsdHMgKipxdWVzdGlvbiB0aGUgZ2VuZXJhbGl6YWJpbGl0eSBvZiB0aGUgZXN0aW1hdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGBXSExTTS5tY2AgYW5kIGBEQlBfZXZlYCoqLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVmaXR0aW5nIG1vZGVsIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm0yX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtMl9TQlBfZXZlLGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDgwIiksXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0RCUF9ldmUsbTJfREJQX2V2ZS5ub0luZmwpDQoNCiMgc2FtZSB0aGluZyB3aXRoIGludGVyYWN0aW9uDQptM19EQlBfZXZlLm5vSW5mbCA8LSB1cGRhdGUobTNfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQpwbG90X21vZGVscyhtM19EQlBfZXZlLG0zX0RCUF9ldmUubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0yX0RCUF9ldmUsbTJfREJQX2V2ZS5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMS4zLiBNZWRpYXRpb24gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkluIGxpZ2h0IG9mIHRoZSByZWxhdGlvbnNoaXBzIGZvdW5kIGJldHdlZW4gc3RhdGUgd29ya2Fob2xpc20gYW5kIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZSwgYW5kIHRoZSBzdWJzdGFudGlhbCBjb3JyZWxhdGlvbiBmb3VuZCBiZXR3ZWVuIGFmdGVybm9vbiBhbmQgZXZlbmluZyBibG9vZCBwcmVzc3VyZSwgaGVyZSB3ZSBleHBsb3JlIHRoZSBtZWRpYXRpbmcgcGF0aHMgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgbGF0ZXIgYmxvb2QgcHJlc3N1cmUgbWVhc3VyZW1lbnRzIGJ5IGV2YWx1YXRpbmcgdGhlIHBvdGVudGlhbCBtZWRpYXRpbmcgcm9sZSBvZiBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuIFRoaXMgaXMgZG9uZSBieSBjb25zaWRlcmluZyB0aGUgc2FtZSBjb3ZhcmlhdGVzIGluY2x1ZGVkIGFib3ZlLCBuYW1lbHkgYGdlbmRlcmAsIGBhZ2VgLCBgQk1JYCwgYFBEYCwgYW5kIHRyYWl0IGBXSExTTS5jbWAuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KG1lZGlhdGlvbikgIyBsb2RpbmcgbWVkaWF0aW9uIHBhY2thZ2UNCmBgYA0KDQpgYGB7ciB9DQojIGRhdGEgcHJlcGFyYXRpb24gKGxpc3Qtd2lzZSBkZWxldGlvbiBhbmQgbWVhbiBjZW50ZXJpbmcpDQpjbGVhbkJQX21lZF9ldmUgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGNsZWFuQlBbLGMoIklEIiwiU0JQX2FmdCIsIkRCUF9hZnQiLCJTQlBfZXZlIiwiREJQX2V2ZSIsICMgZ3JvdXBpbmcgYW5kIHJlc3BvbnNlIHZhcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIsIlBEIiwgIyBjb3JlIHByZWRpY3RvcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXRSIsIldDIiwic2xlZXBfZHlzZiIsInBzeV9kcnVncyIsImhvcm1fZHJ1Z3MiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ0JQX2FmdCIsImZsYWdCUF9ldmUiLCJmbGFnVGltZSIsImNhcmVsZXNzIiwiZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGlsZHJlbiIsInBvc2l0aW9uIildKSkgDQpjbGVhbkJQX21lZF9ldmUkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX21lZF9ldmUkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0Kd2lkZSA8LSBjbGVhbkJQX21lZF9ldmVbIWR1cGxpY2F0ZWQoY2xlYW5CUF9tZWRfZXZlJElEKSxdICMgd2lkZS1mb3JtIGRhdGFzZXQNCmZvcihWYXIgaW4gYygiV0hMU00iLCJQRCIsIlNCUF9hZnQiLCJEQlBfYWZ0IiwiV0UiLCJXQyIpKXsNCiAgd2lkZSA8LSBjYmluZCh3aWRlLGFnZ3JlZ2F0ZShjbGVhbkJQX21lZF9ldmVbLFZhcl0sbGlzdChjbGVhbkJQX21lZF9ldmUkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfbWVkX2V2ZSA8LSBqb2luKGNsZWFuQlBfbWVkX2V2ZSx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgdG8gbG9uZy1mb3JtIGRmDQogIGNsZWFuQlBfbWVkX2V2ZVsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfbWVkX2V2ZVssVmFyXSAtIGNsZWFuQlBfbWVkX2V2ZVsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KZm9yKFZhciBpbiBjKCJhZ2UiLCJCTUkiLCJXSExTTS5jbSIpKXsgY2xlYW5CUF9tZWRfZXZlWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuQlBfbWVkX2V2ZVssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfSAjIGdtYw0KY2F0KCJDb25zaWRlcmluZyIsbnJvdyhjbGVhbkJQX21lZF9ldmUpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfbWVkX2V2ZSRJRCkpKSwicGFydGljaXBhbnRzIikNCmBgYA0KDQo8YnI+DQoNCldlIGNhbiBzZWUgdGhhdCBhIHNpZ25pZmljYW50IGluZGlyZWN0IGVmZmVjdCBpcyBlc3RpbWF0ZWQgaW4gYm90aCBjYXNlcywgd2hlcmVhcyB0aGUgZGlyZWN0IGVmZmVjdCBpcyBub3Qgc2lnbmlmaWNhbnQgZm9yIGJvdGggc3lzdG9saWMgYW5kIGRpYXN0b2xpYyBibG9vZCBwcmVzc3VyZS4gUmVzdWx0cyBhcmUgY29uc2lzdGVudCBhZnRlciB0aGUgcmVtb3ZhbCBvZiBpbmZsdWVudGlhbCBjYXNlcy4NCg0KIyMjIyBTQlBfZXZlDQpgYGB7ciB9DQojIG91dHB1dCBhbmQgbWVkaWF0aW9uIG1vZGVscw0KbU91dF9TQlBfZXZlIDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIFNCUF9hZnQubWMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgKDF8SUQpLGRhdGE9Y2xlYW5CUF9tZWRfZXZlKQ0KbU1lZF9TQlBfZXZlIDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZS5nbWMgKyBCTUkuZ21jICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIA0KICAgICAgICAgICAgICAgICAgICAgICAoMXxJRCksZGF0YT1jbGVhbkJQX21lZF9ldmUpDQoNCiMgbWVkaWF0aW9uIHJlc3VsdHMNCk5TSU0gPC0gMTAwMDANCm1lZF9TQlBfZXZlIDwtIG1lZGlhdGlvbjo6bWVkaWF0ZShtb2RlbC5tPW1NZWRfU0JQX2V2ZSxtb2RlbC55PW1PdXRfU0JQX2V2ZSx0cmVhdD0iV0hMU00ubWMiLG1lZGlhdG9yPSJTQlBfYWZ0Lm1jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1jbGVhbkJQX21lZF9ldmVbLGMoImdlbmRlciIsImFnZS5nbWMiLCJCTUkuZ21jIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgIGJvb3Q9RkFMU0Usc2ltcz1OU0lNKSAjIHF1YXNpLUJheWVzaWFuIENJDQpzdW1tYXJ5KG1lZF9TQlBfZXZlKSAjIHNpZ25pZmljYW50IGluZGlyZWN0IGVmZmVjdA0KDQojIG1lZGlhdGlvbiByZXN1bHRzIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm1PdXRfU0JQX2V2ZS5ub0luZmwgPC0gdXBkYXRlKG1PdXRfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfbWVkX2V2ZVshY2xlYW5CUF9tZWRfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCm1NZWRfU0JQX2V2ZS5ub0luZmwgPC0gdXBkYXRlKG1NZWRfU0JQX2V2ZSxkYXRhPWNsZWFuQlBfbWVkX2V2ZVshY2xlYW5CUF9tZWRfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSkNCm1lZF9TQlBfZXZlLm5vSW5mbCA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkX1NCUF9ldmUubm9JbmZsLG1vZGVsLnk9bU91dF9TQlBfZXZlLm5vSW5mbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWF0PSJXSExTTS5tYyIsbWVkaWF0b3I9IlNCUF9hZnQubWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiZ2VuZGVyIiwiYWdlLmdtYyIsIkJNSS5nbWMiLCJQRC5tYyIsIldITFNNLmNtLmdtYyIpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3Q9RkFMU0Usc2ltcz1OU0lNKSAjIHF1YXNpLUJheWVzaWFuIENJDQpzdW1tYXJ5KG1lZF9TQlBfZXZlLm5vSW5mbCkgIyBpbmRpcmVjdCBlZmZlY3Qgc3RheXMgc2lnbmlmaWNhbnQNCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2V2ZQ0KYGBge3IgfQ0KIyBvdXRwdXQgYW5kIG1lZGlhdGlvbiBtb2RlbHMNCm1PdXRfREJQX2V2ZSA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBEQlBfYWZ0Lm1jICsgDQogICAgICAgICAgICAgICAgICAgICAgICgxfElEKSxkYXRhPWNsZWFuQlBfbWVkX2V2ZSkNCm1NZWRfREJQX2V2ZSA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UuZ21jICsgQk1JLmdtYyArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgKDF8SUQpLGRhdGE9Y2xlYW5CUF9tZWRfZXZlKQ0KDQojIG1lZGlhdGlvbiByZXN1bHRzDQptZWRfREJQX2V2ZSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkX0RCUF9ldmUsbW9kZWwueT1tT3V0X0RCUF9ldmUsdHJlYXQ9IldITFNNLm1jIixtZWRpYXRvcj0iREJQX2FmdC5tYyIsDQogICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXM9Y2xlYW5CUF9tZWRfZXZlWyxjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIildLA0KICAgICAgICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9TlNJTSkgIyBxdWFzaS1CYXllc2lhbiBDSQ0Kc3VtbWFyeShtZWRfREJQX2V2ZSkgIyBzaWduaWZpY2FudCBpbmRpcmVjdCBlZmZlY3QNCg0KIyBtZWRpYXRpb24gcmVzdWx0cyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptT3V0X0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtT3V0X0RCUF9ldmUsZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQptTWVkX0RCUF9ldmUubm9JbmZsIDwtIHVwZGF0ZShtTWVkX0RCUF9ldmUsZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0pDQptZWRfREJQX2V2ZS5ub0luZmwgPC0gbWVkaWF0aW9uOjptZWRpYXRlKG1vZGVsLm09bU1lZF9EQlBfZXZlLm5vSW5mbCxtb2RlbC55PW1PdXRfREJQX2V2ZS5ub0luZmwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVhdD0iV0hMU00ubWMiLG1lZGlhdG9yPSJEQlBfYWZ0Lm1jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmFyaWF0ZXM9Y2xlYW5CUF9tZWRfZXZlWyFjbGVhbkJQX21lZF9ldmUkSUQlaW4lYygiUzA4MiIsIlMwODAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoImdlbmRlciIsImFnZS5nbWMiLCJCTUkuZ21jIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9TlNJTSkgIyBxdWFzaS1CYXllc2lhbiBDSQ0Kc3VtbWFyeShtZWRfREJQX2V2ZS5ub0luZmwpICMgaW5kaXJlY3QgZWZmZWN0IHN0YXlzIHNpZ25pZmljYW50DQpgYGANCg0KPGJyPg0KDQojIyAzLjIuIEVtb3Rpb25hbCBFeGhhdXN0aW9uDQoNCkVtb3Rpb25hbCBleGhhdXN0aW9uIGBFRWAgcmF0ZWQgaW4gdGhlIGV2ZW5pbmcgaXMgcHJlZGljdGVkIGJ5IHN0YXRlIHdvcmthaG9saXNtIGBXSExTTS5tY2AsIGluIGFkZGl0aW9uIHRvIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudCBgUERgLCB0cmFpdCB3b3JrYWhvbGlzbSBgV0hMU00uY21gLCBhbmQgb25lIGNvdmFyaWF0ZSBzZWxlY3RlZCBmcm9tIHRoZSBwcmV2aW91cyBzdGVwIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzVdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M1X2Rlc2NyaXB0aXZlcy9TNV9kZXNjcmlwdGl2ZXMtY29kZS1hbmQtb3V0cHV0Lmh0bWwpKSwgbmFtZWx5IGBnZW5kZXJgLg0KYGBge3IgIH0NCm1mb3JtdWxhc1s1XSAjIGNvdmFyaWF0ZXMgc2VsZWN0ZWQgZm9yIEVFDQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjEuIERhdGEgcHJlcGFyYXRpb24NCg0KRmlyc3QsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcyBieSByZW1vdmluZyBhbGwgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSBvciBhbnkgcHJlZGljdG9yIG9yIGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKiksIGJ5IGNlbnRlcmluZyBsZXZlbC0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgZ3JhbmQgbWVhbiAoKipncmFuZC1tZWFuLWNlbnRlcmluZyoqKSwgYW5kIGJ5IGNlbnRlcmluZyBsZXZlbC0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkVFIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChjbGVhblssYygiSUQiLCJFRSIsImdlbmRlciIsIlBEIiwiV0hMU00iLCAjIGNvcmUgdmFyaWFibGVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0UiLCJXQyIsImZsYWdUaW1lIiwiY2FyZWxlc3MiLCJkYXkiLCAjIGZvciByb2J1c3RuZXNzIGNoZWNrcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uIiwiY2hpbGRyZW4iKV0pKSANCmNsZWFuRUUkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkVFJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5FRSksImNvbXBsZXRlIG9ic2VydmF0aW9ucyBmcm9tIixubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5FRSRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCndpZGUgPC0gY2xlYW5FRVshZHVwbGljYXRlZChjbGVhbkVFJElEKSxdICMgd2lkZS1mb3JtIGRhdGFzZXQNCmZvcihWYXIgaW4gYygiUEQiLCJXSExTTSIsIldFIiwiV0MiKSl7DQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5FRVssVmFyXSxsaXN0KGNsZWFuRUUkSUQpLG1lYW4pWywyXSkgIyBjb21wdXRpbmcgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyh3aWRlKVtuY29sKHdpZGUpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkVFIDwtIGpvaW4oY2xlYW5FRSx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgd2l0aCBsb25nLWZvcm0gZGF0YQ0KICBjbGVhbkVFWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5FRVssVmFyXSAtIGNsZWFuRUVbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgY29tcHV0aW5nIG1lYW4tY2VudGVyZWQgc2NvcmVzDQoNCiMgZ3JhbmQtbWVhbi1jZW50ZXJpbmcgbHYtMiBjb250aW51b3VzIHByZWRpY3RvcnMNCmZvcihWYXIgaW4gYygiV0hMU00uY20iKSl7IGNsZWFuRUVbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5FRVssVmFyXSAtIG1lYW4od2lkZVssVmFyXSkgfQ0KDQojIHNob3dpbmcgZGF0YQ0KY2xlYW5FRVsxOjMsXSAjIGZpcnN0IHRocmVlIHJvd3MNCmBgYA0KDQo8YnI+DQoNCiMjIyAzLjIuMi4gTW9kZWwgZml0IA0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfRUUgPC0gbG1lcihFRSB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICBkYXRhPWNsZWFuRUUpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX0VFIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArICgxfElEKSwgIyBjb3ZhcmlhdGVzICsgcmVjb3ZlcnkgZXhwDQogICAgICAgICAgICAgIGRhdGE9Y2xlYW5FRSkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX0VFIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuRUUpDQoNCiMgbTM6IGludGVyYWN0aW9ucw0KbTNfRUUgPC0gbG1lcihFRSB+IGdlbmRlciArIFBELm1jICsgV0hMU00uY20uZ21jICsgV0hMU00ubWMgKyBXSExTTS5tYyArIFdITFNNLm1jOlBELm1jICsgKDF8SUQpLCANCiAgICAgICAgICAgICAgZGF0YT1jbGVhbkVFKQ0KYGBgDQoNCkZyb20gdGhlIHByZXZpb3VzIGNodW5rLCB3ZSBzZWUgdGhhdCBhbGwgbW9kZWxzIGNvbnZlcmdlZCB3aXRob3V0IHByb2JsZW1zLiBIZXJlLCB3ZSBpbnNwZWN0IHRoZSAqKmRpYWdub3N0aWNzKiogKGkuZS4sIG5vcm1hbGl0eSBvZiByZXNpZHVhbCBhbmQgcmFuZG9tIGVmZmVjdCBkaXN0cmlidXRpb25zLCBob21vc2NlZGFzdGljaXR5LCBhbmQgbXVsdGljb2xsaW5lYXJpdHkpIG9mIHRoZSBtb3N0IGNvbXBsZXggbW9kZWwgYG0zYC4gSW5mbHVlbnRpYWwgY2FzZXMgYXJlIGFuYWx5emVkIGluIGEgZGVkaWNhdGVkIHNlY3Rpb24gYmVsb3cuDQoNCk1vZGVsIGBtM2Agc2hvd3MgKipzb21lIGRldmlhdGlvbiBmcm9tIG5vcm1hbGl0eSoqIGluIGJvdGggdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiByZXNpZHVhbHMgYW5kIGJvdGggcmFuZG9tIGVmZmVjdHMuIEJlc2lkZXMgdGhhdCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBob21vc2NlZHN0aWNpdHkgYXNzdW1wdGlvbiBob2xkcyBhbmQgdGhhdCBub25lIG9mIHRoZSB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykgc2hvd3MgZXh0cmVtZSB2YWx1ZXMsIHJ1bGluZyBvdXQgdGhlIHJpc2sgb2YgbXVsdGljb2xsaW5lYXJpdHkuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5DQpwIDwtIHBsb3RfbW9kZWwobTNfRUUsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkgDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkgDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19FRSkgfiBjbGVhbkVFWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfRUUpLG1haW49IlZJRiBWYWx1ZXMiLHhsaW09YygwLDEwKSxsYXM9Mixob3Jpej1UUlVFKSAjIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKQ0KYWJsaW5lKHYgPSA1LCBsd2QgPSA1LCBsdHkgPSAyKQ0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgYmV0dGVyIGluc3BlY3QgdGhlIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGZpdCBvZiBtb2RlbHMgc3BlY2lmaWVkIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWx5IGRpc3RyaWJ1dGlvbnMuIFdlIGNhbiBzZWUgdGhhdCBhbHRlcm5hdGl2ZSBmYW1pbGllcyBtaWdodCBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqR2FtbWEtbG9nKiogc29sdXRpb24gKGkuZS4sIEdhbW1hIGRpc3RyaWJ1dGlvbiB3aXRoIGxvZ2FyaXRobWljIGxpbmsgZnVuY3Rpb24pIHNob3dpbmcgdGhlIGJlc3QgZml0LiBZZXQsIGl0IGlzIG5vdCBzbyBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbW9kZWwuIFRodXMsIHdlIGluaXRpYWxseSAqKnJlbHkgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24qKiBhbmQgdGhlbiBjb25zaWRlciB0aGUgKipHYW1tYS1sb2cgc29sdXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiouDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfRUUpKSAjIGJlc3QgZml0IGZvciBsb2dub3JtYWw/DQpgYGANCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTN9DQojIGZpdHRpbmcgbW9kZWwgd2l0aCBhbHRlcm5hdGl2ZSBmYW1pbGllcw0KbW9kZWxzIDwtIGxpc3QoDQogIG0zX0VFLA0KICBnbG1lcihmb3JtdWxhPWZvcm11bGEobTNfRUUpLGZhbWlseT1HYW1tYShsaW5rPSJsb2ciKSxkYXRhPWNsZWFuRUUpLCAjIGdhbW1hIHdpdGggbG9nDQogIGdsbWVyKGZvcm11bGE9Zm9ybXVsYShtM19FRSksZmFtaWx5PUdhbW1hKGxpbms9ImlkZW50aXR5IiksZGF0YT1jbGVhbkVFKSwgIyBbRkFJTFMgVE8gQ09OViwgbWF4fGdyYWR8ID0gMC4wOV0NCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX0VFKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhbkVFKSwgIyBsb2ctbm9ybQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKEVFKSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtM19FRSkpWzNdKSksZGF0YT1jbGVhbkVFKSkgIyBub3JtIGxvZw0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiTG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKSB9DQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjMuIFJlc3VsdHMNCg0KSGVyZSwgd2UgY29tcGFyZSB0aGUgc3BlY2lmaWVkIG1vZGVscyBiYXNlZCBvbiB0aGUgQWthaWtlIHdlaWdodCBhbmQgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAod2l0aCB0eXBlLUkgZXJyb3Igc2V0IHRvICpwKiA8IC4wNSksIGFuZCB3ZSBpbnNwZWN0IHRoZSByZXN1bHRzIG9mIHRoZSBzZWxlY3RlZCBtb2RlbChzKS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBpbmNsdXNpb24gb2Ygc3RhdGUgYFdITFNNYCBpcyBhc3NvY2lhdGVkIHdpdGggc3Ryb25nZXIgZXZpZGVuY2UgYW5kIHNpZ25pZmljYW50bHkgaGlnaGVyIGxpa2VsaWhvb2QgdGhhbiB0aGUgYmFzZWxpbmUgbW9kZWwgKEF3ID0gLjk5LCAkXGNoaV4yJCgxKSA9IDIwLjQ2LCAqcCogPCAuMDAxKS4gSW4gY29udHJhc3QsIHRoZSBpbnRlcmFjdGl2ZSBtb2RlbCBpcyBub3QgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZXMgKEF3ID0gLjA2LCAkXGNoaV4yJCgxKSA9IDEuNjgsICpwKiA9IC4xOSkuIA0KYGBge3IgfQ0KIyBBa2Fpa2Ugd2VpZ2h0IGFkZGluZyBvbmUgbW9kZWwgYXQgdGltZQ0KV2VpZ2h0cyhBSUMobTBfRUUsbTFfRUUpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfRUUsbTFfRUUsbTJfRUUpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX0VFLG0xX0VFLG0yX0VFLG0zX0VFKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMw0KYW5vdmEobTFfRUUsbTJfRUUsbTNfRUUpICMgYmVzdCBtb2RlbCBpcyBtMg0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgY29lZmZpY2llbnRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IG90aGVyIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IHN0YXRlIGBXSExTTS5tY2AgaXMgc3Vic3RhbnRpYWxseSBhbmQgbmVnYXRpdmVseSByZWxhdGVkIHRvIGBFRWAsIHdoZXJlYXMgdGhlICoqaW50ZXJhY3Rpb24gaXMgbm90IHN1YnN0YW50aWFsKiouIEFtb25nIHRoZSBpbmNsdWRlZCBjb3ZhcmlhdGVzLCBsb3cgYFBEYCBhbmQgaGlnaCB0cmFpdCBgV0hMU00uZ21jYCBwcmVkaWN0IHN1YnN0YW50aWFsbHkgaGlnaGVyIGBFRWAuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfRUUsbTJfRUUsbTNfRUUsDQogICAgICAgICAgZHYubGFiZWxzPWMoIkJhc2VsaW5lIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gc2VsZWN0ZWQgbW9kZWwNCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0zX0VFLHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTNfRUUsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQoNCiMgcGxvdHRpbmcgaW50ZXJhY3Rpb25zDQpzZChjbGVhbkVFJFBELm1jKSAjIFJEZXQ6IDEgU0QgPSAxLjM2DQpwbG90X21vZGVsKG0zX0VFLHR5cGU9InByZWQiLHRlcm1zPWMoIldITFNNLm1jIiwiUEQubWMgWy0xLjM2LDEuMzZdIikpDQpgYGANCg0KPGJyPg0KDQojIyMgMy4yLjQuIEluZmx1ZW50aWFsIGNhc2VzDQoNCkhlcmUsIHdlIGV2YWx1YXRlIHRoZSBwcmVzZW5jZSBvZiBpbmZsdWVudGlhbCBjYXNlcyBpbiB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0yLmJpc2AuIFNwZWNpZmljYWxseSwgdGhlICoqQ29va+KAmXMgZGlzdGFuY2UqKiBpcyBjb25zaWRlcmVkIGFzIHRoZSBtYWluIG1lYXN1cmUgb2YgaW5kaXZpZHVhbC1sZXZlbCAoaS5lLiwgcGFydGljaXBhbnQpIGluZmx1ZW5jZSBvbiB0aGUgZXN0aW1hdGVkIHBhcmFtZXRlcnMsIGFuZCBpdCBpcyByZWNvbXB1dGVkIGJ5IHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHRoZSBtb3N0IGluZmx1ZW50aWFsIHBhcnRpY2lwYW50cyAoaS5lLiwgYmFzZWQgb24gdGhlIHJ1bGUtb2YtdGh1bWIgb2YgNC9OKSB1bnRpbCBhbGwgZXh0cmVtZSB2YWx1ZXMgYXJlIHJlbW92ZWQuDQoNCiMjIyMgMy4yLjQuMS4gQ29vaydzIGRpc3RhbmNlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudCBgUzA0OWAgaXMgYSBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlLg0KYGBge3IgZmlnLndpZHRoPTMsZmlnLmhlaWdodD0xMCx3YXJuaW5nPUZBTFNFfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTJfRUUsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhbkVFJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTJfRUUsIklEIiwiUzA0OSIpLCJJRCIpDQpwbG90KGluZmwsd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuRUUkSUQpLTEpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpDQpgYGANCg0KPGJyPg0KDQojIyMjIDMuMi40LjIuIENvZWZmaWNpZW50IGNoYW5nZQ0KDQpIZXJlLCB3ZSBpbnNwZWN0IHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMgYWZ0ZXIgdGhlIHJlbW92YWwgb2YgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuIFdlIGNhbiBzZWUgdGhhdCB0aGUgdXBkYXRlZCBtb2RlbHMgZG8gbm90IGltcGx5IHN1YnN0YW50aWFsIGNoYW5nZXMgaW4gdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMuIFRodXMsIHdlIGNob29zZSB0byAqKnJlbHkgb24gdGhlIHJlc3VsdHMgb2J0YWluZWQgd2l0aCB0aGUgZnVsbCBzYW1wbGUqKi4NCmBgYHtyIGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTR9DQojIHJlZml0dGluZyBtb2RlbCB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQptMl9FRS5ub0luZmwgPC0gdXBkYXRlKG0yX0VFLGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSkNCg0KIyBwbG90dGluZyBjb2VmZmljaWVudHMgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnBsb3RfbW9kZWxzKG0yX0VFLG0yX0VFLm5vSW5mbCkgIyBtYWluIGVmZmVjdA0KcGxvdF9tb2RlbHMobTNfRUUsdXBkYXRlKG0zX0VFLGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSkpICMgaW50ZXJhY3Rpb24NCg0KIyBzaG93aW5nIHJlZ3Jlc3Npb24gdGFibGUgb3JpZ2luYWwgdnMuIHVwZGF0ZWQgbW9kZWwNCnRhYl9tb2RlbChtMl9FRSxtMl9FRS5ub0luZmwsZHYubGFiZWxzPWMoIk9yaWdpbmFsIiwiVXBkYXRlZCIpLHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsDQogICAgICAgICAgc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIsc2hvdy5zdGF0PVRSVUUsc3RyaW5nLnN0YXQ9InQiKQ0KYGBgDQoNCjxicj4NCg0KIyMgMy4zLiBTbGVlcCBkaXN0dXJiYW5jZXMNCg0KU2xlZXAgZGlzdHVyYmFuY2VzIGBTRGAgcmF0ZWQgaW4gdGhlIG1vcm5pbmcgaXMgcHJlZGljdGVkIGJ5IHByZXZpb3VzIGRheSBzdGF0ZSB3b3JrYWhvbGlzbSBgV0hMU00ubWNgLCBpbiBhZGRpdGlvbiB0byBwc3ljaG9sb2dpY2FsIGRldGFjaG1lbnQgYFBEYCwgdHJhaXQgd29ya2Fob2xpc20gYFdITFNNLmNtYCwgYW5kIG9uZSBjb3ZhcmlhdGUgc2VsZWN0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM1XShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TNV9kZXNjcmlwdGl2ZXMvUzVfZGVzY3JpcHRpdmVzLWNvZGUtYW5kLW91dHB1dC5odG1sKSksIG5hbWVseSBgZ2VuZGVyYC4NCmBgYHtyICB9DQptZm9ybXVsYXNbNl0gIyBjb3ZhcmlhdGVzIHNlbGVjdGVkIGZvciBTRA0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy4xLiBEYXRhIHByZXBhcmF0aW9uDQoNCkZpcnN0LCB3ZSBwcmVwYXJlIHRoZSBkYXRhIGZvciB0aGUgYW5hbHlzZXMgYnkgcmVtb3ZpbmcgYWxsIGNhc2VzIG9mIG1pc3NpbmcgcmVzcG9uc2VzIGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb3IgYW55IHByZWRpY3RvciBvciBjb3ZhcmlhdGUgKCoqbGlzdC13aXNlIGRlbGV0aW9uKiopLCBieSBjZW50ZXJpbmcgbGV2ZWwtMiBjb250aW51b3VzIHByZWRpY3RvcnMgb24gdGhlIGdyYW5kIG1lYW4gKCoqZ3JhbmQtbWVhbi1jZW50ZXJpbmcqKiksIGFuZCBieSBjZW50ZXJpbmcgbGV2ZWwtMSBjb250aW51b3VzIHByZWRpY3RvcnMgb24gdGhlIGluZGl2aWR1YWwgbWVhbiAoKipwZXJzb24tbWVhbi1jZW50ZXJpbmcqKikuDQpgYGB7ciB9DQojIGxpc3Qtd2lzZSBkZWxldGlvbg0KY2xlYW5TRCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoY2xlYW5bLGMoIklEIiwiU0QiLCJnZW5kZXIiLCJQRCIsIldITFNNIiwgIyBjb3JlIHZhcmlhYmxlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldFIiwiV0MiLCJzbGVlcF9keXNmIiwiZmxhZ1RpbWUiLCJjYXJlbGVzcyIsICMgZm9yIHJvYnVzdG5lc3MgY2hlY2tzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24iLCJjaGlsZHJlbiIpXSkpIA0KY2xlYW5TRCRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuU0QkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0KY2F0KCJDb25zaWRlcmluZyIsbnJvdyhjbGVhblNEKSwiY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0Kd2lkZSA8LSBjbGVhblNEWyFkdXBsaWNhdGVkKGNsZWFuU0QkSUQpLF0gIyB3aWRlLWZvcm0gZGF0YXNldA0KZm9yKFZhciBpbiBjKCJQRCIsIldITFNNIiwiV0UiLCJXQyIpKXsNCiAgd2lkZSA8LSBjYmluZCh3aWRlLGFnZ3JlZ2F0ZShjbGVhblNEWyxWYXJdLGxpc3QoY2xlYW5TRCRJRCksbWVhbilbLDJdKSAjIGNvbXB1dGluZyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuU0QgPC0gam9pbihjbGVhblNELHdpZGVbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpICMgam9pbmluZyB3aXRoIGxvbmctZm9ybSBkYXRhDQogIGNsZWFuU0RbLHBhc3RlMChWYXIsIi5tYyIpXSA8LSBjbGVhblNEWyxWYXJdIC0gY2xlYW5TRFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBjb21wdXRpbmcgbWVhbi1jZW50ZXJlZCBzY29yZXMNCg0KIyBncmFuZC1tZWFuLWNlbnRlcmluZyBsdi0yIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KZm9yKFZhciBpbiBjKCJXSExTTS5jbSIpKXsgY2xlYW5TRFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhblNEWyxWYXJdIC0gbWVhbih3aWRlWyxWYXJdKSB9DQoNCiMgc2hvd2luZyBkYXRhDQpjbGVhblNEWzE6MyxdICMgZmlyc3QgdGhyZWUgcm93cw0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy4yLiBNb2RlbCBmaXQgIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpIZXJlLCB3ZSBmaXQgdGhlIG11bHRpbGV2ZWwgbW9kZWxzIHRvIHRoZSBzZWxlY3RlZCBkYXRhIHVzaW5nIHRoZSBkZWZhdWx0IHJlc3RyaWN0ZWQgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoUkVNTCkuDQpgYGB7ciAgfQ0KIyBtMDogbnVsbCBtb2RlbA0KbTBfU0QgPC0gbG1lcihTRCB+ICgxfElEKSwgIyBvbmx5IGZpeGVkIGFuZCByYW5kb20gaW50ZXJjZXB0ICsgcmVzaWR1YWwgdGVybQ0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQoNCiMgbTE6IGNvdmFyaWF0ZXMNCm0xX1NEIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArICgxfElEKSwgIyBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgIGRhdGE9Y2xlYW5TRCkNCg0KIyBtMjogc3RhdGUgd29ya2Fob2xpc20NCm0yX1NEIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBQRC5tYyArIFdITFNNLmNtLmdtYyArIFdITFNNLm1jICsgKDF8SUQpLA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQoNCiMgbTM6IGludGVyYWN0aW9uDQptM19TRCA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgUEQubWMgKyBXSExTTS5jbS5nbWMgKyBXSExTTS5tYyArIFdITFNNLm1jICsgV0hMU00ubWM6UEQubWMgKyAoMXxJRCksIA0KICAgICAgICAgICAgICBkYXRhPWNsZWFuU0QpDQpgYGANCg0KPGJyPg0KDQpGcm9tIHRoZSBwcmV2aW91cyBjaHVuaywgd2Ugc2VlIHRoYXQgYWxsIG1vZGVscyBjb252ZXJnZWQgd2l0aG91dCBwcm9ibGVtcy4gSGVyZSwgd2UgaW5zcGVjdCB0aGUgKipkaWFnbm9zdGljcyoqIChpLmUuLCBub3JtYWxpdHkgb2YgcmVzaWR1YWwgYW5kIHJhbmRvbSBlZmZlY3QgZGlzdHJpYnV0aW9ucywgaG9tb3NjZWRhc3RpY2l0eSwgYW5kIG11bHRpY29sbGluZWFyaXR5KSBvZiB0aGUgbW9zdCBjb21wbGV4IG1vZGVsIGBtM2AuIEluZmx1ZW50aWFsIGNhc2VzIGFyZSBhbmFseXplZCBpbiBhIGRlZGljYXRlZCBzZWN0aW9uIGJlbG93Lg0KDQpNb2RlbCBgbTNgIHNob3dzICoqc29tZSBkZXZpYXRpb24gZnJvbSBub3JtYWxpdHkqKiBlc3BlY2lhbGx5IGluIHRoZSBsb3dlciB0YWlsIG9mIHRoZSByZXNpZHVhbCBkaXN0cmlidXRpb24gYW5kIGJvdGggdGFpbHMgb2YgcmFuZG9tIGVmZmVjdHMsIGFsdGhvdWdoIGRldmlhdGlvbiBmcm9tIG5vcm1hbGl0eSBpcyBzbGlnaHRseSBsZXNzIG1hcmtlZCB0aGFuIGluIG1vZGVsIGBtMmAuIEJlc2lkZXMgdGhhdCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBob21vc2NlZHN0aWNpdHkgYXNzdW1wdGlvbiBob2xkcyBhbmQgdGhhdCBub25lIG9mIHRoZSB2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycyAoVklGcykgc2hvd3MgZXh0cmVtZSB2YWx1ZXMsIHJ1bGluZyBvdXQgdGhlIHJpc2sgb2YgbXVsdGljb2xsaW5lYXJpdHkuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9Nn0NCiMgbm9ybWFsaXR5IGFuZCBob21vc2NlZGFzdGljaXR5DQpwIDwtIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0iZGlhZyIsZG90LnNpemU9MSkgDQpwW1syXV0gPC0gcFtbMl1dJElEDQpwbG90X2dyaWQocCx0YWdzPVRSVUUsbWFyZ2luPWMoMCwwLDAsMCkpDQpgYGANCmBgYHtyIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBob21vc2NlZGFzdGljaXR5IGFuZCBtdWx0aWNvbGxpbmVhcml0eQ0KcGFyKG1mcm93PWMoMSwyKSkgDQpmb3IoVmFyIGluIGMoImdlbmRlciIpKXsgYm94cGxvdChyZXNpZChtM19TRCkgfiBjbGVhblNEWyxWYXJdLG1haW49cGFzdGUoIlJlc2lkdWFscyBieSIsVmFyKSkgfQ0KYmFycGxvdCh2aWYobTNfU0QpLG1haW49IlZJRiBWYWx1ZXMiLHhsaW09YygwLDEwKSxsYXM9Mixob3Jpej1UUlVFKSAjIHZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3JzIChWSUZzKQ0KYWJsaW5lKHYgPSA1LCBsd2QgPSA1LCBsdHkgPSAyKQ0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgYmV0dGVyIGluc3BlY3QgdGhlIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGZpdCBvZiBtb2RlbHMgc3BlY2lmaWVkIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWx5IGRpc3RyaWJ1dGlvbnMuIFdlIGNhbiBzZWUgdGhhdCBhbHRlcm5hdGl2ZSBmYW1pbGllcyBtaWdodCBiZXR0ZXIgYXBwcm94aW1hdGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBtb2RlbCByZXNpZHVhbHMsIHdpdGggdGhlICoqbG9nLW5vcm1hbCoqIHNvbHV0aW9uIChpLmUuLCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbG9nYXJpdGhtaWMgbGluayBmdW5jdGlvbikgc2hvd2luZyB0aGUgYmVzdCBmaXQuIFlldCwgaXQgaXMgbm90IHNvIGJldHRlciB0aGFuIHRoZSBvcmlnaW5hbCBtb2RlbC4gVGh1cywgd2UgaW5pdGlhbGx5ICoqcmVseSBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbioqIGFuZCB0aGVuIGNvbnNpZGVyIHRoZSAqKmxvZy1ub3JtYWwgc29sdXRpb24gYXMgYSByb2J1c3RuZXNzIGNoZWNrKiouDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD02fQ0KIyBpbnNwZWN0aW5nIHJlc2lkdWFsIGRpc3RyaWJ1dGlvbg0KZGVzY2Rpc3QocmVzaWQobTNfU0QpKSAjIGJlc3QgZml0IGZvciBHYW1tYQ0KYGBgDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD0zfQ0KIyBmaXR0aW5nIG1vZGVsIHdpdGggYWx0ZXJuYXRpdmUgZmFtaWxpZXMNCm1vZGVscyA8LSBsaXN0KA0KICBtM19TRCwNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9R2FtbWEobGluaz0ibG9nIiksZGF0YT1jbGVhblNEKSwgIyBHYW1tYSB3aXRoIGxvZyBbRkFJTFMgVE8gQ09OViwgbWF4fGdyYWR8ID0gMC4wNV0NCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9R2FtbWEobGluaz0iaWRlbnRpdHkiKSxkYXRhPWNsZWFuU0QpLCAjIEdhbW1hIHdpdGggaWRlbnRpdHkNCiAgZ2xtZXIoZm9ybXVsYT1mb3JtdWxhKG0zX1NEKSxmYW1pbHk9Z2F1c3NpYW4obGluaz0ibG9nIiksZGF0YT1jbGVhblNEKSwgIyBsb2ctbm9ybQ0KICBsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShwYXN0ZSgibG9nKFNEKSB+Iixhcy5jaGFyYWN0ZXIoZm9ybXVsYShtM19TRCkpWzNdKSksZGF0YT1jbGVhblNEKSkgIyBub3JtIGxvZw0KDQojIG5vcm1hbCBRLVEgcGxvdCBvZiBtb2RlbCByZXNpZHVhbHMNCnBhcihtZnJvdz1jKDEsNSkpDQpmb3IoaSBpbiAxOmxlbmd0aChtb2RlbHMpKXsgDQogIHFxbm9ybShyZXNpZChtb2RlbHNbW2ldXSksbWFpbj1jKCJOb3JtIiwiR2FtbWEtbG9nIiwiTG9nLW5vcm0iLCJsb2ctdHJhbnNmIilbaV0pOyBxcWxpbmUocmVzaWQobW9kZWxzW1tpXV0pKSB9DQpgYGANCg0KPGJyPg0KDQojIyMgMy4zLjMuIFJlc3VsdHMNCg0KSGVyZSwgd2UgY29tcGFyZSB0aGUgc3BlY2lmaWVkIG1vZGVscyBiYXNlZCBvbiB0aGUgQWthaWtlIHdlaWdodCBhbmQgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAod2l0aCB0eXBlLUkgZXJyb3Igc2V0IHRvICpwKiA8IC4wNSksIGFuZCB3ZSBpbnNwZWN0IHRoZSByZXN1bHRzIG9mIHRoZSBzZWxlY3RlZCBtb2RlbChzKS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgYm90aCBzdGF0ZSBgV0hMU01gIChBdyA9IC41MSwgJFxjaGleMiQoMSkgPSA1LjY3LCAqcCogPSAuMDEpLCBhbmQgaXRzIGludGVyYWN0aW9uIHdpdGggYFBEYCAoQXcgPSAuMjEsICRcY2hpXjIkKDEpID0gNS42OCwgKnAqID0gLjAyKSBhcmUgYXNzb2NpYXRlZCB3aXRoIHN0cm9uZ2VyIGV2aWRlbmNlIChub3QgdGhlIGludGVyYWN0aW9uKSBhbmQgc2lnbmlmaWNhbnRseSBoaWdoZXIgbGlrZWxpaG9vZCB0aGFuIHRoZSBiYXNlbGluZSBtb2RlbC4gKipNb2RlbCBgbTNgIGlzIHNlbGVjdGVkIGFzIHRoZSBiZXN0IG1vZGVsKiouIA0KYGBge3IgfQ0KIyBBa2Fpa2Ugd2VpZ2h0IGFkZGluZyBvbmUgbW9kZWwgYXQgdGltZQ0KV2VpZ2h0cyhBSUMobTBfU0QsbTFfU0QpKSAjIGNvdmFyaWF0ZXM6IGJldHRlcg0KV2VpZ2h0cyhBSUMobTBfU0QsbTFfU0QsbTJfU0QpKSAjIHN0YXRlIHdvcmthaG9saXNtOiBiZXR0ZXINCldlaWdodHMoQUlDKG0wX1NELG0xX1NELG0yX1NELG0zX1NEKSkgIyBpbnRlcmFjdGlvbjogd29yc2UNCg0KIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgd2l0aCBtMw0KYW5vdmEobTFfU0QsbTJfU0QsbTNfU0QpICMgYmVzdCBtb2RlbCBpcyBtMw0KYGBgDQoNCjxicj4NCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgY29lZmZpY2llbnRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWwgYG0zYCBhbmQgdGhvc2UgZXN0aW1hdGVkIGJ5IG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscy4gV2UgY2FuIHNlZSB0aGF0IGJvdGggdHJhaXQgYFdITFNNLmNtLmdtY2AgYW5kIHN0YXRlIGBXSExTTS5tY2AgYXJlIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgU0RgLiBJbiB0aGUgc2VsZWN0ZWQgbW9kZWwsIGEgKipzdWJzdGFudGlhbCBpbnRlcmFjdGlvbioqIGlzIHNob3duIHN1Y2ggdGhhdCBgV0hMU00ubWNgIGlzIHBvc2l0aXZlbHkgcmVsYXRlZCB0byBgU0RgIGluIHRob3NlIHdvcmtpbmcgZGF5cyB3aXRoIGxvd2VyIGBSRGV0YCBhbmQgYFJSZWxgLiBBbW9uZyB0aGUgaW5jbHVkZWQgY292YXJpYXRlcywgYGdlbmRlcmAgcHJlZGljdCBzdWJzdGFudGlhbCBkaWZmZXJlbmNlcyBpbiBgU0RgLCB3aXRoIGhpZ2hlciBzbGVlcCBkaXN0dXJiYW5jZXMgZm9yIGZlbWFsZXMuDQpgYGB7ciBmaWcud2lkdGg9MTAsZmlnLmhlaWdodD00fQ0KIyByZWdyZXNzaW9uIHRhYmxlDQp0YWJfbW9kZWwobTFfU0QsbTJfU0QsbTNfU0QsDQogICAgICAgICAgZHYubGFiZWxzPWMoIkJhc2VsaW5lIiwiU3RhdGUgV0hMU00iLCJJbnRlcmFjdGlvbiIpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxzaG93LmNpPUZBTFNFLA0KICAgICAgICAgIGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQoNCiMgcGxvdHRpbmcgbWFpbiBlZmZlY3RzIGZyb20gc2VsZWN0ZWQgbW9kZWwNCmdyaWQuYXJyYW5nZShwbG90X21vZGVsKG0zX1NELHR5cGU9InByZWQiLHRlcm1zPSJXSExTTS5jbS5nbWMiKSwgIyB0cmFpdCBXSExTTQ0KICAgICAgICAgICAgIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0icHJlZCIsdGVybXM9IldITFNNLm1jIiksbnJvdz0xKSAjIHN0YXRlIFdITFNNDQoNCiMgcGxvdHRpbmcgaW50ZXJhY3Rpb25zDQpzZChjbGVhblNEJFBELm1jKSAjIFBEOiAxIFNEID0gMS4zNg0KcGxvdF9tb2RlbChtM19TRCx0eXBlPSJwcmVkIix0ZXJtcz1jKCJXSExTTS5tYyIsIlBELm1jIFstMS4zNiwxLjM2XSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMy40LiBJbmZsdWVudGlhbCBjYXNlcw0KDQpIZXJlLCB3ZSBldmFsdWF0ZSB0aGUgcHJlc2VuY2Ugb2YgaW5mbHVlbnRpYWwgY2FzZXMgaW4gdGhlIHNlbGVjdGVkIG1vZGVsIGBtM2AuIFNwZWNpZmljYWxseSwgdGhlICoqQ29va+KAmXMgZGlzdGFuY2UqKiBpcyBjb25zaWRlcmVkIGFzIHRoZSBtYWluIG1lYXN1cmUgb2YgaW5kaXZpZHVhbC1sZXZlbCAoaS5lLiwgcGFydGljaXBhbnQpIGluZmx1ZW5jZSBvbiB0aGUgZXN0aW1hdGVkIHBhcmFtZXRlcnMsIGFuZCBpdCBpcyByZWNvbXB1dGVkIGJ5IHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHRoZSBtb3N0IGluZmx1ZW50aWFsIHBhcnRpY2lwYW50cyAoaS5lLiwgYmFzZWQgb24gdGhlIHJ1bGUtb2YtdGh1bWIgb2YgNC9OKSB1bnRpbCBhbGwgZXh0cmVtZSB2YWx1ZXMgYXJlIHJlbW92ZWQuDQoNCiMjIyMgMy4zLjQuMS4gQ29vaydzIGRpc3RhbmNlDQoNCldlIGNhbiBzZWUgdGhhdCBwYXJ0aWNpcGFudHMgYFMxMzJgLCBgUzA0OWAsIGBTMDc5YCwgYW5kIGBTMDAyYCBhcmUgcG90ZW50aWFsbHkgaW5mbHVlbnRpYWwgY2FzZXMuDQpgYGB7ciBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTEwfQ0KIyBjb29rJ3MgZGlzdGFuY2Ugb24gdGhlIHdob2xlIHNhbXBsZQ0KaW5mbCA8LSBpbmZsdWVuY2UobTNfU0QsIklEIikNCnBsb3QoaW5mbCx3aGljaD0iY29vayIsY3V0b2ZmPTQvbmxldmVscyhjbGVhblNEJElEKSx4bGFiPSJDb29rIGRpc3RhbmNlIix5bGFiPSJJRCIsc29ydD1UUlVFKQ0KDQojIHByb2dyZXNzaXZlbHkgZXhjbHVkaW5nIHBhcnRpY2lwYW50cw0KaW5mbCA8LSBsaXN0KA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIiwiUzEzMiIpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIixjKCJTMTMyIiwiUzA0OSIpKSwiSUQiKSwNCiAgaW5mbHVlbmNlKGV4Y2x1ZGUuaW5mbHVlbmNlKG0zX1NELCJJRCIsYygiUzEzMiIsIlMwNDkiLCJTMDc5IikpLCJJRCIpLA0KICBpbmZsdWVuY2UoZXhjbHVkZS5pbmZsdWVuY2UobTNfU0QsIklEIixjKCJTMTMyIiwiUzA0OSIsIlMwNzkiLCJTMDAyIikpLCJJRCIpKQ0KZm9yKGkgaW4gMTpsZW5ndGgoaW5mbCkpeyANCiAgcGxvdChpbmZsW1tpXV0sd2hpY2g9ImNvb2siLGN1dG9mZj00LyhubGV2ZWxzKGNsZWFuU0QkSUQpLWkpLHhsYWI9IkNvb2sgZGlzdGFuY2UiLHlsYWI9IklEIixzb3J0PVRSVUUpIH0NCmBgYA0KDQo8YnI+DQoNCiMjIyMgMy4zLjQuMi4gQ29lZmZpY2llbnQgY2hhbmdlDQoNCkhlcmUsIHdlIGluc3BlY3QgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgZXN0aW1hdGVkIGNvZWZmaWNpZW50cyBhZnRlciB0aGUgcmVtb3ZhbCBvZiBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBjYXNlcy4gV2UgY2FuIHNlZSB0aGF0IHRoZSB1cGRhdGVkIG1vZGVsIGltcGxpZXMgYW4gaW5jcmVhc2UgaW4gdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlZCBmb3IgdHJhaXQgYFdITFNNLmNtLmdtY2AgYW5kIGBnZW5kZXJgLCBhbmQgYSBkZWNyZWFzZSBpbiB0aG9zZSBlc3RpbWF0ZWQgZm9yIHRoZSBpbnRlcmFjdGlvbi4gSG93ZXZlciwgaXQgZG9lcyBub3QgZHJvcCBmYXIgYmVsb3cgdGhlIGN1dC1vZmYgb2YgfCp0Knw9Mi4gVGh1cywgd2UgY2hvb3NlIHRvICoqcmVseSBvbiB0aGUgcmVzdWx0cyBvYnRhaW5lZCB3aXRoIHRoZSBmdWxsIHNhbXBsZSoqLg0KYGBge3IgZmlnLndpZHRoPTEwLGZpZy5oZWlnaHQ9NH0NCiMgcmVmaXR0aW5nIG1vZGVsIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCm0zX1NELm5vSW5mbCA8LSB1cGRhdGUobTNfU0QsZGF0YT1jbGVhblNEWyFjbGVhblNEJElEJWluJWMoIlMxMzIiLCJTMDQ5IiwiUzA3OSIsIlMwMDIiKSxdKQ0KDQojIHBsb3R0aW5nIGNvZWZmaWNpZW50cyBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KcGxvdF9tb2RlbHMobTNfU0QsbTNfU0Qubm9JbmZsKQ0KDQojIHNob3dpbmcgcmVncmVzc2lvbiB0YWJsZSBvcmlnaW5hbCB2cy4gdXBkYXRlZCBtb2RlbA0KdGFiX21vZGVsKG0zX1NELG0zX1NELm5vSW5mbCxkdi5sYWJlbHM9YygiT3JpZ2luYWwiLCJVcGRhdGVkIiksc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSwNCiAgICAgICAgICBzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIixzaG93LnN0YXQ9VFJVRSxzdHJpbmcuc3RhdD0idCIpDQpgYGANCg0KPGJyPg0KDQojIDQuIFJvYnVzbmVzcyBjaGVja3MNCg0KSGVyZSwgd2UgY29uZHVjdCBhIHNlcmllcyBvZiByb2J1c3RuZXNzIGNoZWNrcyAob3IgKm11bHRpdmVyc2UgZGF0YSBhbmFseXNpcyo7IHNlZSBbU3RlZWdlbiBldCBhbC4gMjAxNl0oI3JlZikpIGZvciBlYWNoIHNlbGVjdGVkIG1vZGVsIGJ5IHVzaW5nIGFsdGVybmF0aXZlIGluY2x1c2lvbiBjcml0ZXJpYSwgbW9kZWxzIHdpdGggYWRkaXRpb25hbCBvciBsZXNzIGNvdmFyaWF0ZXMsIG91dGxpZXIgcmVtb3ZhbCwgZXRjLiBUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2VzLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHBzeWNoKQ0KYGBgDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PmBnbG1lckFuYDwvc3VtbWFyeT4NCjxwPg0KYGBge3IgfQ0KIycgQHRpdGxlIEdlbmVyYWxpemVkIGxpbmVhciAobWl4ZWQtZWZmZWN0cykgcmVncmVzc2lvbiBhbmFseXNpcw0KIycgQHBhcmFtIG1vZGVsVHlwZSA9IHR5cGUgb2YgbW9kZWw6IEdMTSwgbWl4ZWQtZWZmZWN0cyAoR0xNRVIpLCBvciBjdW11bGF0aXZlIGxpbmsgbWl4ZWRtIG9kZWwgKENMTU0pDQojJyBAcGFyYW0gZGF0YSA9IGRhdGEuZnJhbWUgb2YgZGF0YQ0KIycgQHBhcmFtIHJlc3AgPSBuYW1lIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSAoY2hhcmFjdGVyKQ0KIycgQHBhcmFtIGZpeC5lZmYgPSBjaGFyYWN0ZXIgdmVjdG9yIG9mIG5hbWVzIG9mIHRoZSBwcmVkaWN0b3IocykNCiMnIEBwYXJhbSBSRU1MID0gYXJndW1lbnQgZnJvbSB0aGUgbG1lNDo6bG1lcigpIGZ1bmN0aW9uLCBzZWUgP2xtZXINCiMnIEBwYXJhbSByYW4uZWZmID0gY2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSByYW5kb20gZWZmZWN0IGJ5IHVzaW5nIHRoZSBsbWU0IHN5bnRheCAoZGVmdWx0OiAiKDF8SUQpIikNCiMnIEBwYXJhbSBmYW1pbHkgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIEdMTShFUikgZmFtaWx5IHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogIm5vcm1hbCIpDQojJyBAcGFyYW0gbGluayA9Y2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBHTE0oRVIpIGxpbmsgZnVuY3Rpb24gdG8gYmUgdXNlZCBpbiB0aGUgbW9kZWxzIChkZWZhdWx0OiAiaWRlbnRpdHkiKQ0KIycgQHBhcmFtIG5BR1EgPSBhcmd1bWVudCBmcm9tIHRoZSBsbWU0OjpnbG1lcigpIGZ1bmN0aW9uLCBzZWUgP2dsbWVyDQojJyBAcGFyYW0gbUNvbXAuYmFzZWxpbmUgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGxhc3QgcHJlZGljdG9yIGluY2x1ZGVkIGluIHRoZSBiYXNlbGluZSBtb2RlbCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBzdWJzZXF1ZW50IG1vZGVscy4gSWYgZXF1YWwgdG8gTkEgKGRlZnVsdCksIHRoZSBudWxsIG1vZGVsIGlzIHVzZWQgYXMgdGhlIGJhc2VsaW5lIG1vZGVsIGZvciBjb21wYXJpc29uDQojJyBAcGFyYW0gcC5hZGp1c3QubWV0aG9kID0gYXJndW1lbnQgZnJvbSB0aGUgc3RhdHM6OnAuYWRqdXN0KCkgZnVuY3Rpb24gKHNlZSA/cC5hZGp1c3QpIGluZGljYXRpbmcgd2hpY2ggbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGNvcnJlY3QgdGhlIHAtdmFsdWVzIG9idGFpbmVkIGZyb20gdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCAoZGVmYXVsdDogTkEsIGZvciBubyBhZGp1c3RtZW50KQ0KIycgQHBhcmFtIGtleS5tb2RlbCA9IGNoYXJhY3RlciBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgcHJlZGljdG9yKHMpIHdob3NlIG1vZGVsKHMpIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciB0aGUgImtleS5yZXMiIG91dHB1dA0KIycgQHBhcmFtIGtleS5wcmVkaWN0b3IgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHByZWRpY3RvciB0byBiZSBjb25zaWRlcmVkIGJ5IHRoZSAia2V5LnJlcyIgb3V0cHV0DQojJyBAcGFyYW0gZGlnaXRzID0gbnVtYmVyIG9mIGRpZ2l0cyBmb3IgYWxsIG51bWVyaWMgb3VwdXRzDQojJyBAcGFyYW0gbWVzc2FnZXMgPSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQgZm9yIGVhY2ggb3BlcmF0aW9uIChkZWZ1bHQ6IEZBTFNFKQ0KZ2xtZXJBbiA8LSBmdW5jdGlvbihkYXRhLG1vZGVsVHlwZT1jKCJHTE1FUiIpLHJlc3AsZml4LmVmZixSRU1MPVRSVUUscmFuLmVmZj0iKDF8SUQpIixmYW1pbHk9Im5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgIGxpbms9ImlkZW50aXR5IixuQUdRPTEsbUNvbXAuYmFzZWxpbmU9TkEscC5hZGp1c3QubWV0aG9kPU5BLGNvZWZmLm1vZGVscz1OQSx0cmFuc2Zvcm09TlVMTCwNCiAgICAgICAgICAgICAgICAgICAgcGxvdC5tb2RlbD1OQSxwbG90LnByZWQ9ImFsbCIsa2V5Lm1vZGVsPU5BLGtleS5wcmVkaWN0b3I9TkEsZGlnaXRzPTMsbWVzc2FnZXM9RkFMU0UpeyANCiAgDQogIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJSdW5uaW5nIixtb2RlbFR5cGUsImFuYWx5c2lzIG9mIixyZXNwLCIuLi4iKSB9DQogIA0KICAjIG1vZGVsaW5nIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICANCiAgIyBjcmVhdGluZyBtb2RlbCBmb3JtdWxhcw0KICBmb3JtdWxhcyA8LSBjaGFyYWN0ZXIoKQ0KICBpZihtb2RlbFR5cGU9PSJHTE0iKXsgcmFuLmVmZiA8LSAiMSIgfQ0KICBudWxsLmYgPC0gcGFzdGUocmVzcCwifiIscmFuLmVmZikgIyBjcmVhdGluZyBudWxsIG1vZGVsIGZvcm11bGENCiAgZm9yKGkgaW4gMTpsZW5ndGgoZml4LmVmZikpeyAjIGNyZWF0aW5nIG90aGVyIGZvcm11bGFzDQogICAgaWYoaT09MSl7IGZvcm11bGFzW2ldIDwtIHBhc3RlKHJlc3AsIn4iLGZpeC5lZmZbMV0pIH0gZWxzZSB7IGZvcm11bGFzW2ldIDwtIHBhc3RlKGZvcm11bGFzW2ktMV0sIisiLGZpeC5lZmZbaV0pICB9fQ0KICBpZihtb2RlbFR5cGUlaW4lYygiR0xNRVIiLCJDTE1NIikpeyBpZighaXMubmEocmFuLmVmZikpeyBmb3JtdWxhcyA8LSBwYXN0ZShmb3JtdWxhcywiKyIscmFuLmVmZikNCiAgICAgIGlmKHN1YnN0cihyYW4uZWZmLDIsMikhPSIxIil7IHJhblNsb3BlIDwtIHBhc3RlKGZpeC5lZmZbd2hpY2goZ3JlcGwocmFuLmVmZixmaXguZWZmKSldKVsxXQ0KICAgICAgICBudWxsLmYgPC0gZ3N1YihyYW5TbG9wZSwiMSIsbnVsbC5mKSAgIyByZW1vdmluZyByYW5kb20gc2xvcGUgZnJvbSBtb2RlbHMgd2l0aG91dCB0aGUgcmVsYXRlZCBwcmVkaWN0b3INCiAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsgDQogICAgICAgICAgaWYoIShncmVwbChyYW5TbG9wZSxnc3ViKHBhc3RlKHJhblNsb3BlLCJbfF0iLHNlcD0iIiksIiIsZm9ybXVsYXNbaV0pKSkpeyANCiAgICAgICAgICAgIGZvcm11bGFzW2ldIDwtIGdzdWIocGFzdGUocmFuU2xvcGUsIlt8XSIsc2VwPSIiKSwiMXwiLGZvcm11bGFzW2ldKSB9fX0NCiAgICB9IGVsc2UgeyBzdG9wKG1lc3NhZ2U9IkVycm9yOiBHTE1FUiBtb2RlbCB0eXBlIHdpdGhvdXQgcmFuLmVmZiBzcGVjaWZpY2F0aW9uIikgfX0NCiAgaWYobWVzc2FnZXM9PVRSVUUpeyBjYXQoIlxuXG5Nb2RlbCBzcGVjaWZpY2F0aW9uOlxuIC0gbW9kZWwgTTAgKG51bGwpOiIsbnVsbC5mKQ0KICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IGNhdCgiXG4gLSBtb2RlbCBNIixpLCI6ICIsZm9ybXVsYXNbaV0sc2VwPSIiKX19DQogIA0KICAjIGZpdHRpbmcgbW9kZWxzDQogIG1vZGVscyA8LSBsaXN0KCkNCiAgaWYobW9kZWxUeXBlPT0iR0xNIil7IGlmKG1lc3NhZ2VzPT1UUlVFKXsgDQogICAgY2F0KCJcblxuRml0dGluZyBHTE0gbW9kZWxzIG9mIixyZXNwLCJvbiIsbnJvdyhkYXRhKSwicGFydGljaXBhbnRzIFxuICAgdXNpbmcgdGhlIiwNCiAgICAgICAgZmFtaWx5LCJmYW1pbHkgd2l0aCB0aGUiLGxpbmssImxpbmsgZnVuY3Rpb24uLi4iKSB9DQogICAgaWYoZmFtaWx5PT0ibm9ybWFsIiAmIGxpbms9PSJpZGVudGl0eSIpeyBudWxsLm0gPC0gbG0oYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSkgIyBub3JtYWwgZmFtaWx5DQogICAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBsbShmb3JtdWxhPWFzLmZvcm11bGEoZm9ybXVsYXNbaV0pLGRhdGE9ZGF0YSkgfQ0KICAgICAgfSBlbHNlIGlmIChmYW1pbHk9PSJnYW1tYSIpIHsgbnVsbC5tIDwtIGdsbShhcy5mb3JtdWxhKG51bGwuZiksZGF0YT1kYXRhLGZhbWlseT1HYW1tYShsaW5rPWxpbmspLG5BR1E9bkFHUSkgIyBnYW1tYQ0KICAgICAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBnbG0oZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluaykpIH0NCiAgICAgICAgfSBlbHNlIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rIT0iaWRlbnRpdHkiKXsgIA0KICAgICAgICAgIG51bGwubSA8LSBnbG0oYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSxmYW1pbHk9Z2F1c3NpYW4obGluaz1saW5rKSkgIyBub3JtYWwgd2l0aCBvdGhlciBsaW5rIGZ1bmN0aW9ucw0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IA0KICAgICAgICAgICAgbW9kZWxzW1tpXV0gPC0gZ2xtKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspKSB9DQogICAgICAgIH0gZWxzZSBpZihmYW1pbHk9PSJiaW5vbWlhbCIpeyANCiAgICAgICAgICBudWxsLm0gPC0gZ2xtKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsZmFtaWx5PWJpbm9taWFsKGxpbms9bGluaykpICMgbG9naXN0aWMgcmVncmVzc2lvbg0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IA0KICAgICAgICAgICAgbW9kZWxzW1tpXV0gPC0gZ2xtKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLGZhbWlseT1iaW5vbWlhbChsaW5rPWxpbmspKX0NCiAgICAgICAgfSBlbHNlIHsgc3RvcChtZXNzYWdlPSJFcnJvcjogb25seSBub3JtYWwsIGdhbW1hLCBhbmQgYmlub21pYWwgZmFtaWx5IGFyZSBhbGxvd2VkLCANCiAgICAgICAgICAgICAgICAgICAgICB3aXRoIGlkZW50aXR5LCBpbnZlcnNlLCBhbmQgbG9nIGxpbmsgZnVuY3Rpb25zIikgfQ0KICB9IGVsc2UgaWYobW9kZWxUeXBlPT0iR0xNRVIiKXsgc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHJlcXVpcmUobG1lNCkpKQ0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJcblxuRml0dGluZyIsbW9kZWxUeXBlLCJtb2RlbHMgb2YiLHJlc3AsIm9uIixucm93KGRhdGEpLCJvYnNlcnZhdGlvbnMgZnJvbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGRhdGEkSUQpKSksInBhcnRpY2lwYW50cyBcbiAgIHVzaW5nIHRoZSIsZmFtaWx5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYW1pbHkgd2l0aCB0aGUiLGxpbmssImxpbmsgZnVuY3Rpb24gdXNpbmciLGlmZWxzZShSRU1MPT1GQUxTRSwiTUwiLCJSRU1MIiksImVzdGltYXRvci4uLiIpIH0NCiAgICBpZihmYW1pbHk9PSJub3JtYWwiICYgbGluaz09ImlkZW50aXR5Iil7IG51bGwubSA8LSBsbWVyKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MKSAjIG5vcm1hbCAgaWRlbnRpdHkNCiAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IG1vZGVsc1tbaV1dIDwtIGxtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsUkVNTD1SRU1MKSB9DQogICAgICB9IGVsc2UgaWYgKGZhbWlseT09ImdhbW1hIikgeyBudWxsLm0gPC0gZ2xtZXIoYXMuZm9ybXVsYShudWxsLmYpLGRhdGE9ZGF0YSxmYW1pbHk9R2FtbWEobGluaz1saW5rKSxuQUdRPW5BR1EpICMgZ2FtbWENCiAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsNCiAgICAgICAgICBtb2RlbHNbW2ldXTwtZ2xtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluayksbkFHUT1uQUdRKSB9DQogICAgICAgIH0gZWxzZSBpZihmYW1pbHk9PSJub3JtYWwiICYgbGluayE9ImlkZW50aXR5Iil7IA0KICAgICAgICAgIG51bGwubSA8LSBnbG1lcihhcy5mb3JtdWxhKG51bGwuZiksZGF0YT1kYXRhLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspLG5BR1E9bkFHUSkgIyBub3JtYWwgd2l0aCBvdGhlciBsaW5rcw0KICAgICAgICAgIGZvcihpIGluIDE6bGVuZ3RoKGZvcm11bGFzKSl7IG1vZGVsc1tbaV1dIDwtIGdsbWVyKGZvcm11bGE9YXMuZm9ybXVsYShmb3JtdWxhc1tpXSksZGF0YT1kYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspLG5BR1E9bkFHUSkgfQ0KICAgICAgICB9IGVsc2UgaWYoZmFtaWx5PT0iYmlub21pYWwiKXsgDQogICAgICAgICAgbnVsbC5tIDwtIGdsbWVyKGFzLmZvcm11bGEobnVsbC5mKSxkYXRhPWRhdGEsZmFtaWx5PWJpbm9taWFsKGxpbms9bGluayksbkFHUT1uQUdRKSAjIGxvZ2lzdGljDQogICAgICAgICAgZm9yKGkgaW4gMTpsZW5ndGgoZm9ybXVsYXMpKXsgbW9kZWxzW1tpXV0gPC0gZ2xtZXIoZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5PWJpbm9taWFsKGxpbms9bGluayksbkFHUT1uQUdRKX0NCiAgICAgICAgfSBlbHNlIHsgc3RvcChtZXNzYWdlPSJFcnJvcjogb25seSBub3JtYWwsIGxvZ2lzdGljLCBhbmQgZ2FtbWEgZmFtaWx5IGFyZSBhbGxvd2VkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGlkZW50aXR5LCBpbnZlcnNlLCBhbmQgbG9nIGxpbmsgZnVuY3Rpb25zIikgfQ0KICB9IGVsc2UgaWYobW9kZWxUeXBlPT0iQ0xNTSIpeyBzdXBwcmVzc01lc3NhZ2VzKHN1cHByZXNzV2FybmluZ3MocmVxdWlyZShvcmRpbmFsKSkpICMgY3VtdWxhdGl2ZSBsaW5rIG1peGVkIG1vZGVscw0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgDQogICAgICBjYXQoIlxuXG5GaXR0aW5nIixtb2RlbFR5cGUsIm1vZGVscyBvZiIscmVzcCwib24iLG5yb3coZGF0YSksIm9ic2VydmF0aW9ucyBmcm9tIiwNCiAgICAgICAgICBubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoZGF0YSRJRCkpKSwicGFydGljaXBhbnRzIFxuICAgdXNpbmcgQ3VtdWxhdGl2ZSBMaW5rIE1peGVkIE1vZGVscyIpIH0NCiAgICBkYXRhWyxyZXNwXSA8LSBmYWN0b3IoZGF0YVsscmVzcF0sb3JkZXJlZD1UUlVFKSAjIHJlc3BvbnNlIHZhcmlhYmxlIGFzIG9yZGVyZWQgZmFjdG9yDQogICAgbnVsbC5tIDwtIHN1cHByZXNzV2FybmluZ3MoY2xtbShhcy5mb3JtdWxhKGdzdWIoIn4iLCJ+IDEgKyIsbnVsbC5mKSksZGF0YT1kYXRhKSkgIyBzdXBwcmVzcyBmb3JtdWxhIHdhcm5pbmcgKGJ1Z2dlZCkNCiAgICBmb3IoaSBpbiAxOmxlbmd0aChmb3JtdWxhcykpeyBtb2RlbHNbW2ldXSA8LSBzdXBwcmVzc1dhcm5pbmdzKGNsbW0oZm9ybXVsYT1hcy5mb3JtdWxhKGZvcm11bGFzW2ldKSxkYXRhPWRhdGEsbkFHUT1uQUdRKSkgfQ0KICB9IGVsc2UgeyBzdG9wKG1lc3NhZ2U9IkVycm9yOiBtb2RlbFR5cGUgY2FuIG9ubHkgYmUgJ0dMTScsICdHTE1FUicsIG9yICdDTE1NJyIpIH0NCiAgDQogICMgb3V0cHV0cy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICBpZihtZXNzYWdlcz09VFJVRSl7IGNhdCgiXG5cbkdlbmVyYXRpbmcgbW9kZWxzIG91dHB1dHMuLi4iKSB9DQogIA0KICAjIG1vZGVsIGNvbXBhcmlzb24NCiAgICAjIGxpa2VsaWhvb2QgcmF0aW8gdGVzdA0KICAgIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJcblxuIC0gUnVubmluZyBsaWtlbGlob29kIHJhdGlvIHRlc3Q6IikgfSANCiAgICBzdXBwcmVzc01lc3NhZ2VzKHN1cHByZXNzV2FybmluZ3MocmVxdWlyZShrbml0cikpKTsgc3VwcHJlc3NNZXNzYWdlcyhzdXBwcmVzc1dhcm5pbmdzKHJlcXVpcmUoTXVNSW4pKSkgDQogICAgbS5udW0gPC0gMQ0KICAgIGlmKGlzLm5hKG1Db21wLmJhc2VsaW5lKSl7IGJzbCA8LSBudWxsLm0gICMgc2VsZWN0aW5nIGJhc2VsaW5lIG1vZGVsDQogICAgICB9IGVsc2UgeyBtLm51bSA8LSBncmVwKG1Db21wLmJhc2VsaW5lLGZpeC5lZmYpWzFdICsgMQ0KICAgICAgICAgYnNsIDwtIG1vZGVsc1tbbS5udW0gLSAxXV0gfQ0KICAgIGlmKG1vZGVsVHlwZSE9IkNMTU0iKXsgbHJ0IDwtIGFzLmRhdGEuZnJhbWUoYW5vdmEoYnNsLG1vZGVsc1tbbS5udW1dXSkpDQogICAgICBpZihsZW5ndGgobW9kZWxzKT5tLm51bSl7DQogICAgICAgIGZvcihpIGluIG0ubnVtOihsZW5ndGgobW9kZWxzKS0xKSl7IGxydCA8LSByYmluZChscnQsYXMuZGF0YS5mcmFtZShhbm92YShtb2RlbHNbW2ldXSxtb2RlbHNbW2krMV1dKSlbMixdKSB9fQ0KICAgICAgfSBlbHNlIHsgbHJ0IDwtIGFzLmRhdGEuZnJhbWUob3JkaW5hbDo6OmFub3ZhLmNsbShic2wsbW9kZWxzW1ttLm51bV1dKSkgIyB1c2UgYW5vdmEuY2xtKCkgdG8gYXZvaWQgZW52LiBpc3N1ZQ0KICAgICAgICBpZihsZW5ndGgobW9kZWxzKT5tLm51bSl7DQogICAgICAgICAgZm9yKGkgaW4gbS5udW06KGxlbmd0aChtb2RlbHMpLTEpKXsgDQogICAgICAgICAgICBscnQgPC0gcmJpbmQobHJ0LGFzLmRhdGEuZnJhbWUob3JkaW5hbDo6OmFub3ZhLmNsbShtb2RlbHNbW2ldXSxtb2RlbHNbW2krMV1dKSlbMixdKSB9fX0NCiAgICByb3duYW1lcyhscnQpIDwtIGMoaWZlbHNlKGlzLm5hKG1Db21wLmJhc2VsaW5lKSwiTnVsbCBtb2RlbCIsIkJhc2VsaW5lIiksDQogICAgICAgICAgICAgICAgICAgICAgIGZpeC5lZmZbbS5udW06bGVuZ3RoKGZpeC5lZmYpXSkNCiAgICBpZighaXMubmEocC5hZGp1c3QubWV0aG9kKSl7ICMgcC12YWx1ZSBjb3JyZWN0aW9ucyBmb3IgbXVsdGlwbGUgY29tcGFyaXNvbg0KICAgICAgaWYobWVzc2FnZXM9PVRSVUUpeyBjYXQoIiAoYXBwbHlpbmciLHAuYWRqdXN0Lm1ldGhvZCwicC12YWx1ZXMgY29ycmVjdGlvbikiKX0NCiAgICAgIGxydFshaXMubmEobHJ0JGBQcig+Q2hpc3EpYCksIlByKD5DaGlzcSkiXSA8LSBwLmFkanVzdChscnRbIWlzLm5hKGxydCRgUHIoPkNoaXNxKWApLCJQcig+Q2hpc3EpIl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kPXAuYWRqdXN0Lm1ldGhvZCkgIH0NCiAgICANCiAgICAjIEFrYWlrZSB3ZWlnaHRzDQogICAgQUlDcyA8LSBscnRbMToyLCJBSUMiXSAjIEFrYWlrZSB3ZWlnaHQNCiAgICANCiAgICAjIHVwZGF0aW5nIGtleSByZXN1bHRzDQogICAga2V5IDwtIGxydFt3aGljaChncmVwbChrZXkucHJlZGljdG9yLHJvdy5uYW1lcyhscnQpKSksXSAjIGtleSByZXN1bHRzDQogICAgaWYobnJvdyhrZXkpPjEpeyBrZXkgPC0ga2V5WzEsXSB9DQogICAga2V5LnJlc3VsdHMgPC0gZGF0YS5mcmFtZShzaWcuTFJUPWtleVssbmNvbChrZXkpXTwwLjA1LCAjIHNpZy5MUlQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlci5Bdz1rZXkkQUlDPT1taW4oQUlDc1sxOndoaWNoKEFJQ3M9PWtleSRBSUMpXSkpICMgaGlnaGVyLkF3DQogIA0KICAjIGVzdGltYXRlZCBwYXJhbWV0ZXJzIGZyb20ga2V5Lm1vZGVsDQogIG1vZFN1bW1hcnkgPC0gc3VtbWFyeShtb2RlbHNbW3doaWNoKGZpeC5lZmY9PWtleS5tb2RlbCldXSkNCiAgbW9kU3VtbWFyeSA8LSBtb2RTdW1tYXJ5JGNvZWZmaWNpZW50cw0KICBpZihtb2RlbFR5cGU9PSJDTE1NIil7IG1vZFN1bW1hcnkgPC0gbW9kU3VtbWFyeVtubGV2ZWxzKGRhdGFbLHJlc3BdKTpucm93KG1vZFN1bW1hcnkpLF0gfQ0KICBrZXkgPC0gcm91bmQobW9kU3VtbWFyeVt3aGljaChncmVwbChrZXkucHJlZGljdG9yLHJvdy5uYW1lcyhtb2RTdW1tYXJ5KSkpLDNdWzFdLDIpICMgdGFraW5nIG9ubHkgZmlyc3QgY29lZmYgZm9yIGtleS5yZXN1bHRzDQogIGtleS5yZXN1bHRzIDwtIGNiaW5kKGtleS5yZXN1bHRzLHQuMTk2PWFicyhrZXkpPjEuOTYsdD1rZXkpDQogIA0KICAjIHJldHVybmluZyBrZXkgcmVzdWx0cyAoc2lnLiBMUlQsIEF3IGhpZ2hlciB0aGFuIHByZXZpb3VzIG1vZGVsLCB0ID4gMS45NikNCiAgcmV0dXJuKGtleS5yZXN1bHRzKSB9DQpgYGANCjwvcD48L2RldGFpbHM+DQoNCjxkZXRhaWxzPjxzdW1tYXJ5PmBnbG1lck1lZGA8L3N1bW1hcnk+DQo8cD4NCmBgYHtyIH0NCiMnIEB0aXRsZSBHZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQtZWZmZWN0cyBtZWRpYXRpb24gYW5hbHlzaXMNCiMnIEBwYXJhbSBkYXRhID0gZGF0YS5mcmFtZSBvZiBkYXRhDQojJyBAcGFyYW0gcmVzcCA9IG5hbWUgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChjaGFyYWN0ZXIpDQojJyBAcGFyYW0gdHJlYXQgPSBuYW1lIG9mIHRoZSB0cmVhdG1lbnQgdmFyaWFibGUgKGNoYXJhY3RlcikNCiMnIEBwYXJhbSBtZWQgPSBuYW1lIG9mIHRoZSBtZWRpYXRvciB2YXJpYWJsZSAoY2hhcmFjdGVyKQ0KIycgQHBhcmFtIGZpeC5lZmYgPSBjaGFyYWN0ZXIgdmVjdG9yIG9mIG5hbWVzIG9mIHRoZSBwcmVkaWN0b3IocykNCiMnIEBwYXJhbSBSRU1MID0gYXJndW1lbnQgZnJvbSB0aGUgbG1lNDo6bG1lcigpIGZ1bmN0aW9uLCBzZWUgP2xtZXINCiMnIEBwYXJhbSByYW4uZWZmID0gY2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSByYW5kb20gZWZmZWN0IGJ5IHVzaW5nIHRoZSBsbWU0IHN5bnRheCAoZGVmdWx0OiAiKDF8SUQpIikNCiMnIEBwYXJhbSBmYW1pbHkgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIEdMTShFUikgZmFtaWx5IHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogIm5vcm1hbCIpDQojJyBAcGFyYW0gbGluayA9IGNoYXJhY3RlciBzdHJpbmcgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgR0xNKEVSKSBsaW5rIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIG1vZGVscyAoZGVmYXVsdDogImlkZW50aXR5IikNCiMnIEBwYXJhbSBzaW1zID0gbnVtYmVyIG9mIE1vbnRlIENhcmxvIGRyYXdzIGZvciBxdWFzaS1CYXllc2lhbiBDSSBhbmQgcC12YWx1ZSAoZGVmYXVsdDogMTAwMCkNCiMnIEBwYXJhbSBhbHBoYS5sZXZlbCA9IHNpZ25pZmljYW5jZSBsZXZlbCAoZGVmYXVsdDogMC4wNSkNCiMnIEBwYXJhbSBub0NvdiA9IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0ZXIgY292YXJpYXRlcyBzaG91bGQgYmUgY29uc2lkZXJlZCBpbiB0aGUgbWVkaWF0aW9uIG1vZGVscyBvciBub3QNCiMnIEBwYXJhbSBtZXNzYWdlcyA9IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGEgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCBmb3IgZWFjaCBvcGVyYXRpb24gKGRlZnVsdDogRkFMU0UpDQpnbG1lck1lZCA8LSBmdW5jdGlvbihkYXRhLHJlc3AsdHJlYXQsbWVkLGZpeC5lZmYsUkVNTD1UUlVFLHJhbi5lZmY9IigxfElEKSIsZmFtaWx5PSJub3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgbGluaz0iaWRlbnRpdHkiLHNpbXM9MTAwMCxhbHBoYS5sZXZlbD0wLjA1LG5vQ292PUZBTFNFLG1lc3NhZ2VzPUZBTFNFKXsgDQogIA0KICBsaWJyYXJ5KGxtZTQpOyBsaWJyYXJ5KG1lZGlhdGlvbikNCiAgDQogIGlmKG1lc3NhZ2VzPT1UUlVFKXsgY2F0KCJSdW5uaW5nIixtb2RlbFR5cGUsImFuYWx5c2lzIG9mIixyZXNwLCIuLi4iKSB9DQogIA0KICAjIG1vZGVsaW5nIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KICANCiAgIyBjcmVhdGluZyBtb2RlbCBmb3JtdWxhcw0KICBtTWVkLmYgPC0gcGFzdGUoZ3N1YigiLm1jIiwiIixtZWQpLCJ+IixmaXguZWZmWzFdKQ0KICBpZihsZW5ndGgoZml4LmVmZik+MSl7DQogICAgZm9yKGkgaW4gMjpsZW5ndGgoZml4LmVmZikpeyBtTWVkLmYgPC0gcGFzdGUobU1lZC5mLGZpeC5lZmZbaV0sc2VwPSIgKyAiKSB9fSAjIG1lZGlhdG9yIG1vZGVsIA0KICBtT3V0LmYgPC0gcGFzdGUoZ3N1Yihnc3ViKCIubWMiLCIiLG1lZCkscmVzcCxtTWVkLmYpLG1lZCxzZXA9IiArICIpICMgb3V0Y29tZSBtb2RlbA0KICBtTWVkLmYgPC0gcGFzdGUobU1lZC5mLHJhbi5lZmYsc2VwPSIgKyAiKSAjIGFkZGluZyByYW5kb20gZWZmZWN0cw0KICBtT3V0LmYgPC0gcGFzdGUobU91dC5mLHJhbi5lZmYsc2VwPSIgKyAiKQ0KICANCiAgIyBmaXR0aW5nIG1vZGVscw0KICBpZihtZXNzYWdlcz09VFJVRSl7IGNhdCgiXG5cbkZpdHRpbmcgR0xNUiBtb2RlbHMgb2YiLHJlc3AsImFuZCIsbWVkLCJvbiIsbnJvdyhkYXRhKSwib2JzZXJ2YXRpb25zIGZyb20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihkYXRhJElEKSkpLCJwYXJ0aWNpcGFudHMgXG4gICB1c2luZyB0aGUiLGZhbWlseSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFtaWx5IHdpdGggdGhlIixsaW5rLCJsaW5rIGZ1bmN0aW9uIHVzaW5nIixpZmVsc2UoUkVNTD09RkFMU0UsIk1MIiwiUkVNTCIpLCJlc3RpbWF0b3IuLi4iKSB9DQogIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rPT0iaWRlbnRpdHkiKXsgDQogICAgbU1lZCA8LSBsbWVyKGFzLmZvcm11bGEobU1lZC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MKQ0KICAgIG1PdXQgPC0gbG1lcihhcy5mb3JtdWxhKG1PdXQuZiksZGF0YT1kYXRhLFJFTUw9UkVNTCkNCiAgfSBlbHNlIGlmKGZhbWlseT09Im5vcm1hbCIgJiBsaW5rIT0iaWRlbnRpdHkiKSB7IA0KICAgICAgbU1lZCA8LSBnbG1lcihhcy5mb3JtdWxhKG1NZWQuZiksZGF0YT1kYXRhLFJFTUw9UkVNTCxmYW1pbHk9Z2F1c3NpYW4obGluaz1saW5rKSkgDQogICAgICBtT3V0IDwtIGdsbWVyKGFzLmZvcm11bGEobU91dC5mKSxkYXRhPWRhdGEsUkVNTD1SRU1MLGZhbWlseT1nYXVzc2lhbihsaW5rPWxpbmspKSANCiAgfSBlbHNlIGlmKGZhbWlseT09ImdhbW1hIil7DQogICAgICBtTWVkIDwtIGdsbWVyKGFzLmZvcm11bGEobU1lZC5mKSxkYXRhPWRhdGEsZmFtaWx5PUdhbW1hKGxpbms9bGluaykpIA0KICAgICAgbU91dCA8LSBnbG1lcihhcy5mb3JtdWxhKG1PdXQuZiksZGF0YT1kYXRhLGZhbWlseT1HYW1tYShsaW5rPWxpbmspKSAgDQogIH0gZWxzZSB7IHN0b3AobWVzc2FnZT0iRXJyb3I6IG9ubHkgbm9ybWFsLCBsb2dpc3RpYywgYW5kIGdhbW1hIGZhbWlseSBhcmUgYWxsb3dlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpZGVudGl0eSwgaW52ZXJzZSwgYW5kIGxvZyBsaW5rIGZ1bmN0aW9ucyIpIH0NCiAgDQogICMgbWVkaWF0aW9uIGFuYWx5c2lzDQogIGlmKG5vQ292PT1UUlVFKXsNCiAgICAgbWVkTSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkLG1vZGVsLnk9bU91dCx0cmVhdD10cmVhdCxtZWRpYXRvcj1tZWQsICMgbWVkaWF0aW9uICYgb3V0cHV0IG1vZGVscywgdHJlYXRtZW50ICYgbWVkaWF0b3INCiAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1OVUxMLGJvb3Q9RkFMU0Usc2ltcz1zaW1zKSAjIHF1YXNpLUJheWVzaWFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIH0gZWxzZSB7DQogICAgbWVkTSA8LSBtZWRpYXRpb246Om1lZGlhdGUobW9kZWwubT1tTWVkLG1vZGVsLnk9bU91dCx0cmVhdD10cmVhdCxtZWRpYXRvcj1tZWQsICMgbWVkaWF0aW9uICYgb3V0cHV0IG1vZGVscywgdHJlYXRtZW50ICYgbWVkaWF0b3INCiAgICAgICAgICAgICAgICAgY292YXJpYXRlcz1kYXRhWyxmaXguZWZmW2ZpeC5lZmYhPXRyZWF0XV0sICMgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICBib290PUZBTFNFLHNpbXM9c2ltcykgfSAjIHF1YXNpLUJheWVzaWFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQogIA0KICAjIHJldHVybmluZyBlc3RpbWF0ZWQgcXVhc2ktQmF5ZXNpYW4gcC12YWx1ZQ0KICBrZXkucmVzdWx0cyA8LSBkYXRhLmZyYW1lKGluZGlyZWN0LnA9bWVkTSRkLmF2Zy5wLGluZC5wLnNpZz1tZWRNJGQuYXZnLnA8YWxwaGEubGV2ZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnA9bWVkTSR6LmF2Zy5wLGluZC5wLnNpZz1tZWRNJHouYXZnLnA8YWxwaGEubGV2ZWwpDQogIHJldHVybihrZXkucmVzdWx0cykgfQ0KYGBgDQo8L3A+PC9kZXRhaWxzPg0KDQo8YnI+DQoNCk1vcmVvdmVyLCBzaW5jZSBhIGZ1cnRoZXIgcm9idXN0bmVzcyBjaGVjayB0byBiZSBpbXBsZW1lbnRlZCBmb3IgYWxsIG91dGNvbWVzIGlzIHJlcHJvZHVjaW5nIHRoZSBhbmFseXNlcyB3aXRoIHRoZSBmdWxsIHNhbXBsZSwgd2UgYWxzbyByZXByb2Nlc3MgdGhlICoqZnVsbCBgZGlhcnlgIGRhdGFzZXQqKiBieSByZW1vdmluZyBtaXNzaW5nIHJlc3BvbnNlcyBhbmQgbWVhbi1jZW50ZXJpbmcgcHJlZGljdG9ycy4NCg0KPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBjb2RlPC9zdW1tYXJ5Pg0KPHA+DQpgYGB7ciB9DQojIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZQ0KY2xlYW5CUF9hZnRfZnVsbCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoZGlhcnlbLGMoIklEIiwiU0JQX2FmdCIsIkRCUF9hZnQiLCJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmNsZWFuQlBfYWZ0X2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2FmdF9mdWxsJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdChucm93KGNsZWFuQlBfYWZ0X2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfYWZ0X2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIldITFNNIikpeyAjIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgcHJlZGljdG9ycw0KICBjbGVhbkJQX2FmdF9wcmVscXNfZnVsbCA8LSBjYmluZChwcmVscXNbcHJlbHFzJElEJWluJWxldmVscyhjbGVhbkJQX2FmdF9mdWxsJElEKSxdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUoY2xlYW5CUF9hZnRfZnVsbFssVmFyXSxsaXN0KGNsZWFuQlBfYWZ0X2Z1bGwkSUQpLG1lYW4pWywyXSkgIyBpbmRpdmlkdWFsIG1lYW5zDQogIGNvbG5hbWVzKGNsZWFuQlBfYWZ0X3ByZWxxc19mdWxsKVtuY29sKGNsZWFuQlBfYWZ0X3ByZWxxc19mdWxsKV0gPC0gcGFzdGUwKFZhciwiLmNtIikNCiAgY2xlYW5CUF9hZnRfZnVsbCA8LSBqb2luKGNsZWFuQlBfYWZ0X2Z1bGwsY2xlYW5CUF9hZnRfcHJlbHFzX2Z1bGxbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQogIGNsZWFuQlBfYWZ0X2Z1bGxbLHBhc3RlMChWYXIsIi5tYyIpXSA8LSBjbGVhbkJQX2FmdF9mdWxsWyxWYXJdIC0gY2xlYW5CUF9hZnRfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyANCiAgY2xlYW5CUF9hZnRfZnVsbFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSBjbGVhbkJQX2FmdF9mdWxsWyxWYXJdIC0gbWVhbihjbGVhbkJQX2FmdF9wcmVscXNfZnVsbFssVmFyXSkgfSAjIGdtYw0KDQojIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUNCmNsZWFuQlBfZXZlX2Z1bGwgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGRpYXJ5WyxjKCJJRCIsIlNCUF9ldmUiLCJEQlBfZXZlIiwiZ2VuZGVyIiwiYWdlIiwiQk1JIiwgIyBsaXN0LXdpc2UgZGVsZXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSExTTSIsIlBEIildKSkNCmNsZWFuQlBfZXZlX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX2V2ZV9mdWxsJElEKSkgIyByZXNldHRpbmcgcGFydGljaXBhbnQgaWRlbnRpZmllciBsZXZlbHMNCmNhdChucm93KGNsZWFuQlBfZXZlX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfZXZlX2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIldITFNNIiwiUEQiKSl7ICMgcGVyc29uLW1lYW4tY2VudGVyaW5nIGx2LTEgY29udGludW91cyBwcmVkaWN0b3JzDQogIGNsZWFuQlBfZXZlX3ByZWxxc19mdWxsIDwtIGNiaW5kKHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGNsZWFuQlBfZXZlX2Z1bGwkSUQpLF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZShjbGVhbkJQX2V2ZV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5CUF9ldmVfZnVsbCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMoY2xlYW5CUF9ldmVfcHJlbHFzX2Z1bGwpW25jb2woY2xlYW5CUF9ldmVfcHJlbHFzX2Z1bGwpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkJQX2V2ZV9mdWxsIDwtIGpvaW4oY2xlYW5CUF9ldmVfZnVsbCxjbGVhbkJQX2V2ZV9wcmVscXNfZnVsbFssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCiAgY2xlYW5CUF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuQlBfZXZlX2Z1bGxbLFZhcl0gLSBjbGVhbkJQX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIuY20iKV0gfSAjIG1lYW4tY2VudGVyZWQNCmZvcihWYXIgaW4gYygiYWdlIiwiQk1JIiwiV0hMU00uY20iKSl7IA0KICBjbGVhbkJQX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuQlBfZXZlX2Z1bGxbLFZhcl0gLSBtZWFuKGNsZWFuQlBfZXZlWyFkdXBsaWNhdGVkKGNsZWFuQlBfZXZlJElEKSxWYXJdKSB9ICMgZ21jDQoNCiMgYWZ0ZXJub29uLXRvLWV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUNCmNsZWFuQlBfbWVkX2V2ZV9mdWxsIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChkaWFyeVssYygiSUQiLCJTQlBfYWZ0IiwiREJQX2FmdCIsIlNCUF9ldmUiLCJEQlBfZXZlIiwgIyBsaXN0LXdpc2UgZGVsZXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZGVyIiwiYWdlIiwiQk1JIiwiV0hMU00iLCJQRCIpXSkpIA0KY2xlYW5CUF9tZWRfZXZlX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbkJQX21lZF9ldmVfZnVsbCRJRCkpIA0Kd2lkZSA8LSBjbGVhbkJQX21lZF9ldmVfZnVsbFshZHVwbGljYXRlZChjbGVhbkJQX21lZF9ldmVfZnVsbCRJRCksXSANCmZvcihWYXIgaW4gYygiV0hMU00iLCJQRCIsIlNCUF9hZnQiLCJEQlBfYWZ0Iikpew0KICB3aWRlIDwtIGNiaW5kKHdpZGUsYWdncmVnYXRlKGNsZWFuQlBfbWVkX2V2ZV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5CUF9tZWRfZXZlX2Z1bGwkSUQpLG1lYW4pWywyXSkgDQogIGNvbG5hbWVzKHdpZGUpW25jb2wod2lkZSldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuQlBfbWVkX2V2ZV9mdWxsIDwtIGpvaW4oY2xlYW5CUF9tZWRfZXZlX2Z1bGwsd2lkZVssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikgDQogIGNsZWFuQlBfbWVkX2V2ZV9mdWxsWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUF9tZWRfZXZlX2Z1bGxbLFZhcl0gLSBjbGVhbkJQX21lZF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gDQpmb3IoVmFyIGluIGMoImFnZSIsIkJNSSIsIldITFNNLmNtIikpeyBjbGVhbkJQX21lZF9ldmVfZnVsbFsscGFzdGUwKFZhciwiLmdtYyIpXSA8LSANCiAgY2xlYW5CUF9tZWRfZXZlX2Z1bGxbLFZhcl0gLSBtZWFuKHdpZGVbLFZhcl0pIH0gIyBnbWMNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5CUF9tZWRfZXZlX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsDQogICAgbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlBfbWVkX2V2ZV9mdWxsJElEKSkpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIGVtb3Rpb25hbCBleGhhdXN0aW9uDQpjbGVhbkVFX2Z1bGwgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGRpYXJ5WyxjKCJJRCIsIkVFIiwiZ2VuZGVyIiwiUEQiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsZXRpb24NCmNsZWFuRUVfZnVsbCRJRCA8LSBhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuRUVfZnVsbCRJRCkpICMgcmVzZXR0aW5nIHBhcnRpY2lwYW50IGlkZW50aWZpZXIgbGV2ZWxzDQpjYXQobnJvdyhjbGVhbkVFX2Z1bGwpLCJjb21wbGV0ZSBvYnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuRUVfZnVsbCRJRCkpKSwicGFydGljaXBhbnRzIikNCmZvcihWYXIgaW4gYygiUEQiLCJXSExTTSIpKXsgIyBwZXJzb24tbWVhbi1jZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIHByZWRpY3RvcnMNCiAgY2xlYW5fcHJlbHFzX2Z1bGwgPC0gY2JpbmQocHJlbHFzW3ByZWxxcyRJRCVpbiVsZXZlbHMoY2xlYW5FRV9mdWxsJElEKSxdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUoY2xlYW5FRV9mdWxsWyxWYXJdLGxpc3QoY2xlYW5FRV9mdWxsJElEKSxtZWFuKVssMl0pICMgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyhjbGVhbl9wcmVscXNfZnVsbClbbmNvbChjbGVhbl9wcmVscXNfZnVsbCldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuRUVfZnVsbCA8LSBqb2luKGNsZWFuRUVfZnVsbCxjbGVhbl9wcmVscXNfZnVsbFssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCiAgY2xlYW5FRV9mdWxsWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5FRV9mdWxsWyxWYXJdIC0gY2xlYW5FRV9mdWxsWyxwYXN0ZTAoVmFyLCIuY20iKV0gfSAjIG1lYW4tY2VudGVyZWQgc2NvcmVzDQpmb3IoVmFyIGluIGMoIldITFNNLmNtIikpeyBjbGVhbkVFX2Z1bGxbLHBhc3RlMChWYXIsIi5nbWMiKV0gPC0gY2xlYW5FRV9mdWxsWyxWYXJdIC0gbWVhbihjbGVhbkVFX2Z1bGxbLFZhcl0pIH0gIyBnbWMNCg0KIyBzbGVlcCBkaXN0dXJiYW5jZXMNCmNsZWFuU0RfZnVsbCA8LSBhcy5kYXRhLmZyYW1lKG5hLm9taXQoZGlhcnlbLGMoIklEIiwiU0QiLCJnZW5kZXIiLCJkYWlseUhhc3NsZXNfZXZlIiwiUEQiLCJXSExTTSIpXSkpICMgbGlzdHdpc2UgZGVsDQpjbGVhblNEX2Z1bGwkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEX2Z1bGwkSUQpKSAjIHJlc2V0dGluZyBwYXJ0aWNpcGFudCBpZGVudGlmaWVyIGxldmVscw0KY2F0KG5yb3coY2xlYW5TRF9mdWxsKSwiY29tcGxldGUgb2JzIGZyb20iLG5sZXZlbHMoYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhblNEX2Z1bGwkSUQpKSksInBhcnRpY2lwYW50cyIpDQpmb3IoVmFyIGluIGMoIlBEIiwiV0hMU00iKSl7ICMgcGVyc29uLW1lYW4tY2VudGVyaW5nIGx2LTEgY29udGludW91cyBwcmVkaWN0b3JzDQogIGNsZWFuX3ByZWxxc19mdWxsIDwtIGNiaW5kKHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGNsZWFuU0RfZnVsbCRJRCksXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlKGNsZWFuU0RfZnVsbFssVmFyXSxsaXN0KGNsZWFuU0RfZnVsbCRJRCksbWVhbilbLDJdKSAjIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMoY2xlYW5fcHJlbHFzX2Z1bGwpW25jb2woY2xlYW5fcHJlbHFzX2Z1bGwpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhblNEX2Z1bGwgPC0gam9pbihjbGVhblNEX2Z1bGwsY2xlYW5fcHJlbHFzX2Z1bGxbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQogIGNsZWFuU0RfZnVsbFsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuU0RfZnVsbFssVmFyXSAtIGNsZWFuU0RfZnVsbFsscGFzdGUwKFZhciwiLmNtIildIH0gIyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KZm9yKFZhciBpbiBjKCJXSExTTS5jbSIpKXsgY2xlYW5TRF9mdWxsWyxwYXN0ZTAoVmFyLCIuZ21jIildIDwtIGNsZWFuU0RfZnVsbFssVmFyXSAtIG1lYW4oY2xlYW5TRF9mdWxsWyxWYXJdKSB9ICMgZ21jDQpgYGANCjwvcD48L2RldGFpbHM+DQoNCjxicj4NCg0KQXMgYSBmdXJ0aGVyIGNoZWNrLCB3ZSBpbmNsdWRlIGBwb3NpdGlvbmAgYXMgYW4gYWRkaXRpb25hbCBjb3ZhcmlhdGUsIHdoaWNoIHdlIHJlY29kZSBpbnRvIHR3byBsZXZlbHMsIG5hbWVseSAiRW1wbG95ZWUvUHJvamVjdCIgdnMuICJNYW5hZ2Vycy9FbXBsb3llcnMiLg0KYGBge3IgfQ0KY2xlYW5CUF9hZnQkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5CUF9hZnQkcG9zaXRpb24pKSkNCmNsZWFuQlBfZXZlJHBvc2l0aW9uIDwtIGFzLmZhY3Rvcihnc3ViKCJFbXBsb3llZSIsImVtcGxveWVlL3Byb2plY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiUHJvamVjdCIsImVtcGxveWVlL3Byb2plY3QiLGNsZWFuQlBfZXZlJHBvc2l0aW9uKSkpDQpjbGVhbkJQX21lZF9ldmUkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5CUF9tZWRfZXZlJHBvc2l0aW9uKSkpDQpjbGVhbkVFJHBvc2l0aW9uIDwtIGFzLmZhY3Rvcihnc3ViKCJFbXBsb3llZSIsImVtcGxveWVlL3Byb2plY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3N1YigiUHJvamVjdCIsImVtcGxveWVlL3Byb2plY3QiLGNsZWFuRUUkcG9zaXRpb24pKSkNCmNsZWFuU0QkcG9zaXRpb24gPC0gYXMuZmFjdG9yKGdzdWIoIkVtcGxveWVlIiwiZW1wbG95ZWUvcHJvamVjdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJQcm9qZWN0IiwiZW1wbG95ZWUvcHJvamVjdCIsY2xlYW5TRCRwb3NpdGlvbikpKQ0KYGBgDQoNCjxicj4NCg0KRmluYWxseSwgd2UgbG9hZCB0aGUgcmF3IHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUgaXRlbSBzY29yZXMgdG8gY29tcHV0ZSB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTLCB1c2VkIGZvciBhIHJvYnVzdG5lc3MgY2hlY2suDQpgYGB7ciB9DQojIGlzb2xhdGluZyByYXcgaXRlbSBzY29yZXMgYXQgdGhlIHJldHJvc3BlY3RpdmUgRFVXQVMgc2NhbGUNCnByZWxxcy5yZXRyb1dITFNNIDwtIHByZWxxc1ssYygiSUQiLHBhc3RlMCgiZHV3YXMiLDE6MTApKV0NCnByZWxxcy5yZXRyb1dITFNNIDwtIHByZWxxcy5yZXRyb1dITFNNW3ByZWxxcy5yZXRyb1dITFNNJElEICVpbiUgY2xlYW4kSUQsXSAjIHN1YnNhbXBsaW5nIHBhcnRpY2lwYW50cyBpbmNsdWRlZCBpbiB0aGUgY2xlYW4gZGF0YXNldA0KcHJlbHFzLnJldHJvV0hMU00kSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihwcmVscXMucmV0cm9XSExTTSRJRCkpDQpjYXQoIkluY2x1ZGVkIHBhcnRpY2lwYW50cyA9IixubGV2ZWxzKHByZWxxcy5yZXRyb1dITFNNJElEKSkNCg0KIyBjb21wdXRpbmcgQ3JvbmJhY2gncyBhbHBoYSBhbmQgOTUlIENJDQpwc3ljaDo6YWxwaGEocHJlbHFzLnJldHJvV0hMU01bLHBhc3RlMCgiZHV3YXMiLDE6MTApXSkkZmVsZHQNCg0KIyBjb21wdXRpbmcgZ3JhbmQtbWVhbi1jZW50ZXJlZCBjb21wb3NpdGUgc2NvcmUgYW5kIGFkZGluZyBpdCB0byBhbGwgZGF0YXNldHMgdXNlZCBiZWxvdw0KcHJlbHFzLnJldHJvV0hMU00kV0hMU00ucmV0cm8gPC0gYXBwbHkocHJlbHFzLnJldHJvV0hMU01bLHBhc3RlMCgiZHV3YXMiLDE6MTApXSwxLG1lYW4pDQpjbGVhbkJQX2FmdCA8LSBwbHlyOjpqb2luKGNsZWFuQlBfYWZ0LHByZWxxcy5yZXRyb1dITFNNWyxjKCJJRCIsIldITFNNLnJldHJvIildLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQpjbGVhbkJQX2FmdCRXSExTTS5yZXRyby5nbWMgPC0gY2xlYW5CUF9hZnQkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuQlBfYWZ0JFdITFNNLnJldHJvKQ0KY2xlYW5CUF9ldmUgPC0gcGx5cjo6am9pbihjbGVhbkJQX2V2ZSxwcmVscXMucmV0cm9XSExTTVssYygiSUQiLCJXSExTTS5yZXRybyIpXSxieT0iSUQiLHR5cGU9ImxlZnQiKQ0KY2xlYW5CUF9ldmUkV0hMU00ucmV0cm8uZ21jIDwtIGNsZWFuQlBfZXZlJFdITFNNLnJldHJvIC0gbWVhbihjbGVhbkJQX2V2ZSRXSExTTS5yZXRybykNCmNsZWFuQlBfbWVkX2V2ZSA8LSBwbHlyOjpqb2luKGNsZWFuQlBfbWVkX2V2ZSxwcmVscXMucmV0cm9XSExTTVssYygiSUQiLCJXSExTTS5yZXRybyIpXSxieT0iSUQiLHR5cGU9ImxlZnQiKQ0KY2xlYW5CUF9tZWRfZXZlJFdITFNNLnJldHJvLmdtYyA8LSBjbGVhbkJQX21lZF9ldmUkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuQlBfbWVkX2V2ZSRXSExTTS5yZXRybykNCmNsZWFuRUUgPC0gcGx5cjo6am9pbihjbGVhbkVFLHByZWxxcy5yZXRyb1dITFNNWyxjKCJJRCIsIldITFNNLnJldHJvIildLGJ5PSJJRCIsdHlwZT0ibGVmdCIpDQpjbGVhbkVFJFdITFNNLnJldHJvLmdtYyA8LSBjbGVhbkVFJFdITFNNLnJldHJvIC0gbWVhbihjbGVhbkVFJFdITFNNLnJldHJvKQ0KY2xlYW5TRCA8LSBwbHlyOjpqb2luKGNsZWFuU0QscHJlbHFzLnJldHJvV0hMU01bLGMoIklEIiwiV0hMU00ucmV0cm8iKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCmNsZWFuU0QkV0hMU00ucmV0cm8uZ21jIDwtIGNsZWFuU0QkV0hMU00ucmV0cm8gLSBtZWFuKGNsZWFuU0QkV0hMU00ucmV0cm8pDQpgYGANCg0KPGJyPg0KDQojIyA0LjEuIEJsb29kIHByZXNzdXJlDQoNCiMjIyA0LjEuMS4gQWZ0ZXJub29uIEJQIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpGb3IgYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBkeXNmL2RydWdzYDogd2UgcmVtb3ZlIGFsbCBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwgb3IgcHN5Y2hvYWN0aXZlIG1lZGljYXRpb25zLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgYmxvb2QgcHJlc3N1cmUNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dUcmFuc2ZgOiB3ZSBsb2ctdHJhbnNmb3JtIHRoZSByZXNwb25zZSB2YXJpYWJsZSB2YWx1ZXMgYmVmb3JlIGZpdHRpbmcgdGhlIG1vZGVscw0KDQo4LiBgY29uZm91bmRlcnNfYWZ0YDogd2UgaW5jbHVkZSBwb3RlbnRpYWxseSBjb25mb3VuZGluZyBmYWN0b3JzIGZvciBibG9vZCBwcmVzc3VyZSAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHJlcG9ydGVkIGluIHRoZSBhZnRlcm5vb24gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjEwLiBgY2hpbGRyZW5gOiB3ZSBpbmNsdWRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBObyBmbGFnQlBgOiB3ZSBleGNsdWRlIGFsbCBvYnNlcnZhdGlvbnMgdGhhdCB3ZXJlIHJlcHJvY2Vzc2VkIGR1ZSB0byBleHRyZW1lIEJQIHZhbHVlcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjExLiBgTm8gZmxhZ1RpbWVgOiB3ZSBleGNsdWRlIGFsbCBvYnNlcnZhdGlvbnMgdGhhdCB3ZXJlIGZsYWdnZWQgZHVlIHRvIHRoZWlyIGFzc29jaWF0ZWQgdGltaW5nIChlLmcuLCBtb3JuaW5nIEJQIHJlY29yZGVkIGluIHRoZSBhZnRlcm5vb24pIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSkNCg0KMTIuIGBObyBjYXJlbGVzc2A6IHdlIGV4Y2x1ZGUgb25lIHBhcnRpY2lwYW50IGBTMTM3YCBmbGFnZ2VkIGFzIHBvdGVudGlhbGx5IGNhcmVsZXNzIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSkuDQoNCjEzLiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNC4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTUuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCjxicj4NCg0KSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGFyZSBjb25zaXN0ZW50Kiogd2l0aCB0aG9zZSByZXBvcnRlZCBpbiB0aGUgbWFpbiBhbmFseXNlcywgc2hvd2luZyBzdWJzdGFudGlhbCBjb250cmlidXRpb24gYW5kIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AuDQoNCiMjIyMgU0JQX2FmdA0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBtYWluIGVmZmVjdCBvZiBXSExTTS5tYw0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIldITFNNLmNtLmdtYyIsIldITFNNLm1jIikgIyBwcmVkaWN0b3JzDQpyIDwtICJTQlBfYWZ0IiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbIWNsZWFuQlBfYWZ0JElEJWluJWMoIlMwOTYiLCJTMDgyIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9hZnQkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9hZnQkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9YygiV0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdF9mdWxsLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIsUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPSJsb2coU0JQX2FmdCkiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBsb2ctdHJhbnNmDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnQscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6M10sImNvbmZvdW5kZXJzX2FmdCIsICMgYWRkaW5nIGNvbmZvdW5kZXJzX2FmdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1s0Omxlbmd0aChwcmVkaWN0b3JzKV0pLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRmbGFnQlBfYWZ0PT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbY2xlYW5CUF9hZnQkZmxhZ1RpbWU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50DQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldFLm1jIixrZXkubW9kZWw9IldFLm1jIiksICMgd29ya2luZyBleGNlc3MNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldDLm1jIixrZXkubW9kZWw9IldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNIHJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5yZXRyby5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIikpKQ0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2FmdA0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2FmdCIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBtYWluIGVmZmVjdCBvZiBXSExTTS5tYw0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIldITFNNLmNtLmdtYyIsIldITFNNLm1jIikgIyBwcmVkaWN0b3JzDQpyIDwtICJEQlBfYWZ0IiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9hZnRbIWNsZWFuQlBfYWZ0JElEJWluJWMoIlMwODIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2FmdCRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2FmdCRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKCJXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0X2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9ImxvZyhTQlBfYWZ0KSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIGxvZy10cmFuc2YNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdCxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiY29uZm91bmRlcnNfYWZ0IiwgIyBhZGRpbmcgY29uZm91bmRlcnNfYWZ0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JGZsYWdCUF9hZnQ9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2FmdFtjbGVhbkJQX2FmdCRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0W2NsZWFuQlBfYWZ0JGNhcmVsZXNzPT1GQUxTRSxdLCAjIHdpdGhvdXQgY2FyZWxlc3MNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0UubWMiLGtleS5tb2RlbD0iV0UubWMiKSwgIyB3b3JraW5nIGV4Y2Vzcw0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCANCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0MubWMiLGtleS5tb2RlbD0iV0MubWMiKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfYWZ0LHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMgNC4xLjIuIEV2ZW5pbmcgQlAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBkeXNmL2RydWdzYDogd2UgcmVtb3ZlIGFsbCBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwgb3IgcHN5Y2hvYWN0aXZlIG1lZGljYXRpb25zLCBpbiBhZGRpdGlvbiB0byB0aG9zZSBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgYmxvb2QgcHJlc3N1cmUNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dUcmFuc2ZgOiB3ZSBsb2ctdHJhbnNmb3JtIHRoZSByZXNwb25zZSB2YXJpYWJsZSB2YWx1ZXMgYmVmb3JlIGZpdHRpbmcgdGhlIG1vZGVscw0KDQo4LiBgY29uZm91bmRlcnNfZXZlYDogd2UgaW5jbHVkZSBwb3RlbnRpYWxseSBjb25mb3VuZGluZyBmYWN0b3JzIGZvciBibG9vZCBwcmVzc3VyZSAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHJlcG9ydGVkIGluIHRoZSBhZnRlcm5vb24gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjEwLiBgY2hpbGRyZW5gOiB3ZSBpbmNsdWRlIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjExLiBgTm8gZmxhZ0JQYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSByZXByb2Nlc3NlZCBkdWUgdG8gZXh0cmVtZSBCUCB2YWx1ZXMgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMC4gYE5vIGZsYWdUaW1lYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBmbGFnZ2VkIGR1ZSB0byB0aGVpciBhc3NvY2lhdGVkIHRpbWluZyAoZS5nLiwgbW9ybmluZyBCUCByZWNvcmRlZCBpbiB0aGUgYWZ0ZXJub29uKSAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjEyLiBgTm8gY2FyZWxlc3NgOiB3ZSBleGNsdWRlIG9uZSBwYXJ0aWNpcGFudCBgUzEzN2AgZmxhZ2dlZCBhcyBwb3RlbnRpYWxseSBjYXJlbGVzcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjEzLiBgZGF5MWA6IHdlIGluY2x1ZGUgcmVjb3JkaW5nIGBkYXlgIGFzIGEgZnVydGhlciBjb3ZhcmlhdGUgKGkuZS4sIDEgPSBmaXJzdCBkYXksIDIgPSBhbnkgb3RoZXIgZGF5KS4gSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGFyZSBjb25zaXN0ZW50Kiogd2l0aCB0aG9zZSByZXBvcnRlZCBpbiB0aGUgbWFpbiBhbmFseXNlcywgc2hvd2luZyBubyBzdWJzdGFudGlhbCBjb250cmlidXRpb24gYW5kIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AuDQoNCjE0LiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNS4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTYuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgc2V0dGluZyByb2J1c3RuZXNzIGNoZWNrcw0KY2hlY2tzIDwtIGMoIk9yaWdpbmFsIiwiTm8gSW5mbCIsIk5vIGR5c2YvZHJ1Z3MiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dUcmFuc2YiLA0KICAgICAgICAgICAgImNvbmZvdW5kZXJzX2V2ZSIsInBvc2l0aW9uIiwiY2hpbGRyZW4iLCJObyBmbGFnQlAiLCJObyBmbGFnVGltZSIsIk5vIGNhcmVsZXNzIiwiZGF5MSIsDQogICAgICAgICAgICAiV0UiLCJXQyIsIldITFNNIHJldHJvIikNCg0KIyBjcmVhdGluZyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBkYXkxIChpLmUuLCBmaXJzdCBkYXkgdnMuIGFsbCBvdGhlciBkYXlzKQ0KY2xlYW5CUF9ldmUkZGF5MSA8LSAwIA0KY2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZGF5PT0xLCJkYXkxIl0gPC0gMQ0KY2xlYW5CUF9ldmUkZGF5MSA8LSBhcy5mYWN0b3IoY2xlYW5CUF9ldmUkZGF5MSkNCmBgYA0KDQo8YnI+DQoNCkluIGFsbCBjYXNlcywgdGhlICoqcmVzdWx0cyBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgbm8gc3Vic3RhbnRpYWwgY29udHJpYnV0aW9uIG9yIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AgKG9ubHkgc3Vic3RhbnRpYWwgaW4gYSBmZXcgY2FzZXMgZm9yIGBEQlBfZXZlYCkgYW5kIG5vIHN1YnN0YW50aWFsIGludGVyYWN0aW9ucyB3aXRoIHBzeWNob2xvZ2ljYWwgZGV0YWNobWVudC4NCg0KIyMjIyBNQUlOIEVGRkVDVCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCnIgPC0gIlNCUF9ldmUiICMgcmVzcG9uc2UgdmFyaWFibGUNCmtleSA8LSAiV0hMU00ubWMiICMga2V5IG1vZGVsIGFuZCBrZXkgcHJlZGljdG9yDQpic2wgPC0gIldITFNNLmNtLmdtYyIgIyBiYXNlbGluZSBtb2RlbA0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwODIiLCJTMDk2IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMoIldITFNNLm1jIiksICMgd2l0aG91dCBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlX2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXksUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgcmFuZG9tIHNsb3BlIChTSU5HVUxBUiBGSVQpDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9ImxvZyhTQlBfZXZlKSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBsb2ctdHJhbnNmDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjb25mb3VuZGVyc19ldmUiLCAjIGFkZGluZyBjb25mb3VuZGVyc19ldmUNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pLG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0icG9zaXRpb24iLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0iY2hpbGRyZW4iLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGZsYWdCUF9ldmU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGZsYWdUaW1lPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCB0aW1lcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJkYXkxIixwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksICMgYWRkaW5nIGRheQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iZGF5MSIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9Z3N1YigiV0hMU00ubWMiLCJXRS5tYyIscHJlZGljdG9ycyksICMgd29ya2luZyBleGNlc3NpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj0iV0UubWMiLGtleS5tb2RlbD0iV0UubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj0iV0MubWMiLGtleS5tb2RlbD0iV0MubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNIHJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5yZXRyby5nbWMiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlWyFjbGVhbkJQX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA4MCIpLF0sICMgd2l0aG91dCBpbmZsdWVudGlhbA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKCJXSExTTS5tYyIpLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlX2Z1bGwscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXksUkVNTD1GQUxTRSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgcmFuZG9tIHNsb3BlDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9ImxvZyhEQlBfZXZlKSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBHYW1tYSBsb2cNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxmYW1pbHk9ImdhbW1hIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSxtQ29tcC5iYXNlbGluZT0iY29uZm91bmRlcnNfZXZlIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICBwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksbUNvbXAuYmFzZWxpbmU9InBvc2l0aW9uIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICBwcmVkaWN0b3JzWzY6bGVuZ3RoKHByZWRpY3RvcnMpXSksbUNvbXAuYmFzZWxpbmU9ImNoaWxkcmVuIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnQlBfZXZlPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImRheTEiLHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJkYXkxIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGV4Y2Vzc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksIA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSkpDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBJTlRFUkFDVElPTiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBpbnRlcmFjdGlvbiB3aXRoIFJEZXQubWMNCnIgPC0gIlNCUF9ldmUiDQpwcmVkaWN0b3JzIDwtIGMocHJlZGljdG9ycywiUEQubWM6V0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCmtleSA8LSAiUEQubWM6V0hMU00ubWMiICMga2V5IG1vZGVsIGFuZCBrZXkgcHJlZGljdG9yDQpic2wgPC0gIldITFNNLm1jIiAjIGJhc2VsaW5lIG1vZGVsDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVshY2xlYW5CUF9ldmUkSUQlaW4lYygiUzA5NiIsIlMwODIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVfZnVsbCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9ldmUkcHN5X2RydWdzPT0iTm8iLF0sIA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKCJQRC5tYyIsIldITFNNLm1jIiwiUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5LFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLCAjIHJhbmRvbSBzbG9wZSAoU0lOR1VMQVIgRklUKQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5LHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPSJsb2coU0JQX2V2ZSkiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgbG9nLXRyYW5zZg0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjZdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9InBvc2l0aW9uIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjaGlsZHJlbiIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZmxhZ0JQX2V2ZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgQlANCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkZmxhZ1RpbWU9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJGNhcmVsZXNzPT1GQUxTRSxdLCAjIHdpdGhvdXQgY2FyZWxlc3MgcGFydGljaXBhbnQNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6Nl0sImRheTEiLHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJkYXkxIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGV4Y2Vzc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXRS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0UubWMiLGtleS5tb2RlbD0iUEQubWM6V0UubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9Z3N1YigiV0hMU00uY20uZ21jIiwiV0hMU00ucmV0cm8uZ21jIixwcmVkaWN0b3JzKSwgICMgV0hMU00ucmV0cm8NCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpKSkNCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIg0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbIWNsZWFuQlBfZXZlJElEJWluJWMoIlMwOTYiLCJTMDgwIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlW2NsZWFuQlBfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhIChTSU5HVUxBUiBGSVQpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIgJiBjbGVhbkJQX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9YnNsLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVfZnVsbCxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxyYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD0iREJQX2V2ZSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCwgIyBHYW1tYSBsb2cNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSxmYW1pbHk9ImdhbW1hIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiY29uZm91bmRlcnNfZXZlIiwgIyBhZGRpbmcgY29uZm91bmRlcnNfZXZlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJjb25mb3VuZGVyc19ldmUiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWMocHJlZGljdG9yc1sxOjZdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzc6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJwb3NpdGlvbiIsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmUscmVzcD1yLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6Nl0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbNzpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImNoaWxkcmVuIixrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnQlBfZXZlPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUA0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZVtjbGVhbkJQX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT1ic2wsa2V5LnByZWRpY3Rvcj1rZXksa2V5Lm1vZGVsPWtleSksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5CUF9ldmVbY2xlYW5CUF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTo2XSwiZGF5MSIscHJlZGljdG9yc1s3Omxlbmd0aChwcmVkaWN0b3JzKV0pLCAjIGFkZGluZyBkYXkNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImRheTEiLGtleS5wcmVkaWN0b3I9a2V5LGtleS5tb2RlbD1rZXkpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuQlBfZXZlLHJlc3A9cixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXQy5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0MubWMiLGtleS5tb2RlbD0iUEQubWM6V0MubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkJQX2V2ZSxyZXNwPXIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLCAjIFdITFNNLnJldHJvDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPWJzbCxrZXkucHJlZGljdG9yPWtleSxrZXkubW9kZWw9a2V5KSkpDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS4zLiBNZWRpYXRpb25zIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpGb3IgQWZ0ZXJub29uLXRvLUV2ZW5pbmcgbWVkaWF0aW9ucywgd2UgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcm9idXN0bmVzcyBjaGVja3M6DQoNCjEuIGBObyBJbmZsYDogd2UgcmVtb3ZlIGFsbCBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMgZm91bmQgZm9yIGFmdGVybm9vbiBhbmQgZXZlbmluZyBCUA0KDQoyLiBgTm8gZHlzZi9kcnVnc2A6IHdlIHJlbW92ZSBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMsIGhvcm1vbmFsIG9yIHBzeWNob2FjdGl2ZSBtZWRpY2F0aW9ucywgaW4gYWRkaXRpb24gdG8gdGhvc2UgbWVldGluZyBleGNsdXNpb24gY3JpdGVyaWEgZm9yIGJsb29kIHByZXNzdXJlDQoNCjMuIGBObyBDb3ZgOiB3ZSByZW1vdmUgYWxsIGNvdmFyaWF0ZXMsIHRoYXQgaXMgd2Ugb25seSBpbmNsdWRlIGBXSExTTS5tY2AgYW5kIGl0cyBpbnRlcmFjdGlvbnMgYXMgbW9kZWwgcHJlZGljdG9ycw0KDQo0LiBgQWxsIGluYDogd2UgaW5jbHVkZSBhbGwgY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20gYWxsIHBhcnRpY2lwYW50cywgaW5jbHVkaW5nIHRob3NlIG1lZXRpbmcgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgY29tcGxpYW5jZSBhbmQgYmxvb2QgcHJlc3N1cmUNCg0KNS4gYE1MYDogd2UgcmVmaXQgdGhlIG1vZGVscyBieSB1c2luZyB0aGUgTWF4aW11bSBMaWtlbGlob29kIGVzdGltYXRvciwgcmF0aGVyIHRoYW4gdGhlIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kDQoNCjYuIGBSYW5kIHNsb3BlYDogd2UgaW5jbHVkZSB0aGUgcmFuZG9tIHNsb3BlIGZvciBgV0hMU00ubWNgDQoNCjcuIGBsb2ctdHJhbnNmYDogd2UgbG9nLXRyYW5zZm9ybSBibG9vZCBwcmVzc3VyZSBiZWZvcmUgZml0dGluZyB0aGUgbW9kZWxzDQoNCjguIGBjb25mb3VuZGVyc2A6IHdlIGluY2x1ZGUgcG90ZW50aWFsbHkgY29uZm91bmRpbmcgZmFjdG9ycyBmb3IgYmxvb2QgcHJlc3N1cmUgKGUuZy4sIHNtb2tpbmcsIHBoeXNpY2FsIGFjdGl2aXR5KSByZXBvcnRlZCBpbiB0aGUgYWZ0ZXJub29uIG9yIGluIHRoZSBldmVuaW5nIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQo5LiBgcG9zaXRpb25gOiB3ZSBpbmNsdWRlIGpvYiBwb3NpdGlvbiAoRW1wbG95ZWUvUHJvamVjdCB2cy4gTWFuYWdlci8oU2VsZi0pRW1wbG95ZXIpIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMC4gYGNoaWxkcmVuYDogd2UgaW5jbHVkZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMS4gYE5vIGZsYWdCUGA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgcmVwcm9jZXNzZWQgZHVlIHRvIGV4dHJlbWUgQlAgdmFsdWVzIGVpdGhlciBpbiB0aGUgYWZ0ZXJub29uIG9yIGluIHRoZSBldmVuaW5nIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSk7IG1vcm5pbmcgZmxhZ2dlZCBjYXNlcyBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYXZvaWQgbG9vc2luZyB0b28gbWFueSBvYnNlcnZhdGlvbnMNCg0KMTIuIGBObyBmbGFnVGltZWA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgZmxhZ2dlZCBkdWUgdG8gdGhlaXIgYXNzb2NpYXRlZCB0aW1pbmcgKGUuZy4sIG1vcm5pbmcgQlAgcmVjb3JkZWQgaW4gdGhlIGFmdGVybm9vbikgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMy4gYE5vIGNhcmVsZXNzYDogd2UgZXhjbHVkZSBvbmUgcGFydGljaXBhbnQgYFMxMzdgIGZsYWdnZWQgYXMgcG90ZW50aWFsbHkgY2FyZWxlc3MgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxNC4gYGRheTFgOiB3ZSBpbmNsdWRlIHJlY29yZGluZyBgZGF5YCBhcyBhIGZ1cnRoZXIgY292YXJpYXRlIChpLmUuLCAxID0gZmlyc3QgZGF5LCAyID0gYW55IG90aGVyIGRheSkuIEluIGFsbCBjYXNlcywgdGhlICoqcmVzdWx0cyBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgbm8gc3Vic3RhbnRpYWwgY29udHJpYnV0aW9uIGFuZCBtYWluIGVmZmVjdCBvZiBzdGF0ZSBgV0hMU00ubWNgLg0KDQoxNS4gYFdFYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTYuIGBXQ2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciBzdGF0ZSB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHdvcmtpbmcgZXhjZXNzaXZlbHkgZGltZW5zaW9uDQoNCjE3LiBgV0hMU00gcmV0cm9gOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3IgdHJhaXQgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTIGluY2x1ZGVkIGluIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlLg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIHNldHRpbmcgcm9idXN0bmVzcyBjaGVja3MNCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBkeXNmL2RydWdzIiwiTm8gQ292IiwiQWxsIGluIiwiTUwiLCJSYW5kIHNsb3BlIiwibG9nLXRyYW5zZiIsDQogICAgICAgICAgICAiY29uZm91bmRlcnMiLCJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ0JQIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsImRheTEiLA0KICAgICAgICAgICAgIldFIiwiV0MiLCJXSExTTS5yZXRybyIpDQoNCiMgcmVjb2RpbmcgdmFyaWFibGVzDQpjbGVhbkJQX21lZF9ldmUkY29uZiA8LSBGQUxTRSAjIHN1bW1hcnkgb2YgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGNvbmZvdW5kZXJzDQpjbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJGNvbmZvdW5kZXJzX2FmdD09VFJVRSB8IGNsZWFuQlBfbWVkX2V2ZSRjb25mb3VuZGVyc19ldmU9PVRSVUUsImNvbmYiXSA8LSBUUlVFDQpzdW1tYXJ5KGNsZWFuQlBfbWVkX2V2ZSRjb25mKQ0KY2xlYW5CUF9tZWRfZXZlJGZsYWdCUCA8LSBGQUxTRSAjIHN1bW1hcnkgb2YgYWZ0ZXJub29uIGFuZCBldmVuaW5nIGZsYWdCUA0KY2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnQlBfYWZ0PT1UUlVFIHwgY2xlYW5CUF9tZWRfZXZlJGZsYWdCUF9ldmU9PVRSVUUsImZsYWdCUCJdIDwtIFRSVUUNCnN1bW1hcnkoY2xlYW5CUF9tZWRfZXZlJGZsYWdCUCkNCmNsZWFuQlBfbWVkX2V2ZSRkYXkxIDwtIDAgIyBjcmVhdGluZyBjYXRlZ29yaWNhbCB2YXJpYWJsZSBkYXkxIChpLmUuLCBmaXJzdCBkYXkgdnMuIGFsbCBvdGhlciBkYXlzKQ0KY2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRkYXk9PTEsImRheTEiXSA8LSAxDQpjbGVhbkJQX21lZF9ldmUkZGF5MSA8LSBhcy5mYWN0b3IoY2xlYW5CUF9tZWRfZXZlJGRheTEpDQpzdW1tYXJ5KGNsZWFuQlBfbWVkX2V2ZSRkYXkxKQ0KYGBgDQoNCjxicj4NCg0KSW4gYWxsIGNhc2VzLCB0aGUgKipyZXN1bHRzIGZvciBgU0JQYCBhcmUgY29uc2lzdGVudCoqIHdpdGggdGhvc2UgcmVwb3J0ZWQgaW4gdGhlIG1haW4gYW5hbHlzZXMsIHNob3dpbmcgc2lnbmlmaWNhbnQgaW5kaXJlY3QgYnV0IG5vdCBkaXJlY3QgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RhdGUgYFdITFNNLm1jYCBhbmQgYFNCUF9ldmVgLiAqKk1vc3QgcmVzdWx0cyBmb3IgYERCUGAgYXJlIGNvbnNpc3RlbnQqKiBhcyB3ZWxsLCBidXQgdGhlICoqaW5kaXJlY3QgcmVsYXRpb25zaGlwIGlzIHJlZHVjZWQgaW4gb25lIGNhc2UqKiwgaS5lLiwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBwYXJ0aWNpcGFudHMgcmVwb3J0aW5nIHNsZWVwIGR5c2Z1bmN0aW9ucywgaG9ybW9uYWwsIG9yIHBzeWNob2FjdGl2ZSBtZWRpY2F0aW9ucy4gU2ltaWxhcmx5LCB0aGUgZGlyZWN0IHJlbGF0aW9uc2hpcCBiZWNvbWVzIHNpZ25pZmljYW50IHdpdGggdGhlIGluY2x1c2lvbiBvZiBgZGF5MWAgYXMgYSBjb3ZhcmlhdGUuIFdoZXJlYXMgdGhlc2UgZmluZGluZ3MgcXVlc3Rpb24gdGhlIGdlbmVyYWxpemFiaWxpdHkgb2Ygc3VjaCByZWxhdGlvbnNoaXAsIHRoZSBoaWdoIG51bWJlciBvZiBjb25zaXN0ZW50IHJvYnVzdG5lc3MgY2hlY2tzIHByb3ZpZGVzIHNvbWUgZXZpZGVuY2UgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIG9ic2VydmFibGUgaW4gb3VyIHNhbXBsZS4NCg0KIyMjIyAgU0JQX2V2ZQ0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKCJnZW5kZXIiLCJhZ2UuZ21jIiwiQk1JLmdtYyIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKSAjIHByZWRpY3RvcnMNCnIgPC0gIlNCUF9ldmUiICMgcmVzcG9uc2UgdmFyaWFibGUNCnQgPC0gIldITFNNLm1jIiAjIGtleSBtb2RlbCBhbmQga2V5IHByZWRpY3Rvcg0KbSA8LSAiU0JQX2FmdC5tYyINCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwgIyBvcmlnaW5hbA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbIWNsZWFuQlBfbWVkX2V2ZSRJRCVpbiVjKCJTMDgyIiwiUzA5NiIpLF0sICMgd2l0aG91dCBpbmZsdWVudGlhbCBjYXNlcw0KICAgICAgICAgICAgICAgICAgICByZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJHNsZWVwX2R5c2Y9PSJObyIgJiAjIHdpdGhvdXQgcGFydGljaXBhbnRzIG1lZXRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkJQX21lZF9ldmUkcHN5X2RydWdzPT0iTm8iICYgY2xlYW5CUF9tZWRfZXZlJHBzeV9kcnVncz09Ik5vIixdLCANCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YygiV0hMU00ubWMiKSxub0Nvdj1UUlVFKSwgIyB3L28gY292YXJpYXRlcw0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVfZnVsbCxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLCAjIGZ1bGwgc2FtcGxlDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMsUkVNTD1GQUxTRSksICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMsICMgcmFuZG9tIHNsb3BlIChzaW5ndWxhciBmaXQpDQogICAgICAgICAgICAgICAgICAgICByYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksIA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD0ibG9nKFNCUF9ldmUpIix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksICMgbG9nIHRyYW5zZm9ybWF0aW9uDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjb25mIiwgIyBhZGRpbmcgY29uZm91bmRlcnMNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sInBvc2l0aW9uIiwgIyBhZGRpbmcgcG9zaXRpb24NCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnQlA9PUZBTFNFLF0sICMgd2l0aG91dCBmbGFnZ2VkIEJQIGNhc2VzDQogICAgICAgICAgICAgICAgICAgICByZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmVbY2xlYW5CUF9tZWRfZXZlJGZsYWdUaW1lPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCB0aW1lcw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRjYXJlbGVzcz09RkFMU0UsXSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50cw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzE6NV0sImRheTEiLCAjIGFkZGluZyBkYXkNCiAgICAgICAgICAgICAgcHJlZGljdG9yc1s2Omxlbmd0aChwcmVkaWN0b3JzKV0pKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD0iV0UubWMiLG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSksICMgd29ya2luZyBleGNlc3NpdmVseQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PSJXQy5tYyIsbWVkPW0sDQogICAgICAgICAgICAgICAgICAgICBmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpKSwgIyB3b3JraW5nIGNvbXB1bHNpdmVseQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sDQogICAgICAgICAgICAgICAgICAgICBmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvIixwcmVkaWN0b3JzKSkpKSAjIFdITFNNIHJldHJvDQprYWJsZShwKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpyIDwtICJEQlBfZXZlIiAjIHJlc3BvbnNlIHZhcmlhYmxlDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksICMgb3JpZ2luYWwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlWyFjbGVhbkJQX21lZF9ldmUkSUQlaW4lYygiUzA4MiIsIlMwOTYiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwgY2FzZXMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRzbGVlcF9keXNmPT0iTm8iICYgIyB3aXRob3V0IHBhcnRpY2lwYW50cyBtZWV0aW5nIGV4Y2x1c2lvbiBjcml0ZXJpYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5CUF9tZWRfZXZlJHBzeV9kcnVncz09Ik5vIiAmIGNsZWFuQlBfbWVkX2V2ZSRwc3lfZHJ1Z3M9PSJObyIsXSwgDQogICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMoIldITFNNLm1jIiksbm9Db3Y9VFJVRSksICMgdy9vIGNvdmFyaWF0ZXMNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlX2Z1bGwscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzLFJFTUw9RkFMU0UpLCAjIG1heGltdW0gbGlrZWxpaG9vZA0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzLCAjIHJhbmRvbSBzbG9wZSAoc2luZ3VsYXIgZml0KQ0KICAgICAgICAgICAgICAgICAgICAgcmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLCANCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9ImxvZyhEQlBfZXZlKSIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPXByZWRpY3RvcnMpLCAjIGxvZy10cmFuc2Zvcm1hdGlvbg0KICAgICAgICAgICAgZ2xtZXJNZWQoZGF0YT1jbGVhbkJQX21lZF9ldmUscmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1jKHByZWRpY3RvcnNbMTo1XSwiY29uZiIsICMgYWRkaW5nIGNvbmZvdW5kZXJzDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJjaGlsZHJlbiIsICMgYWRkaW5nIGNoaWxkcmVuDQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZVtjbGVhbkJQX21lZF9ldmUkZmxhZ0JQPT1GQUxTRSxdLCAjIHdpdGhvdXQgZmxhZ2dlZCBCUCBjYXNlcw0KICAgICAgICAgICAgICAgICAgICAgcmVzcD1yLHRyZWF0PXQsbWVkPW0sZml4LmVmZj1wcmVkaWN0b3JzKSwNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlW2NsZWFuQlBfbWVkX2V2ZSRmbGFnVGltZT09RkFMU0UsXSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZVtjbGVhbkJQX21lZF9ldmUkY2FyZWxlc3M9PUZBTFNFLF0sICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgICAgICAgICAgIHJlc3A9cix0cmVhdD10LG1lZD1tLGZpeC5lZmY9cHJlZGljdG9ycyksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9dCxtZWQ9bSxmaXguZWZmPWMocHJlZGljdG9yc1sxOjVdLCJkYXkxIiwgIyBhZGRpbmcgZGF5DQogICAgICAgICAgICAgIHByZWRpY3RvcnNbNjpsZW5ndGgocHJlZGljdG9ycyldKSksDQogICAgICAgICAgICBnbG1lck1lZChkYXRhPWNsZWFuQlBfbWVkX2V2ZSxyZXNwPXIsdHJlYXQ9IldFLm1jIixtZWQ9bSwNCiAgICAgICAgICAgICAgICAgICAgIGZpeC5lZmY9Z3N1YigiV0hMU00ubWMiLCJXRS5tYyIscHJlZGljdG9ycykpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD0iV0MubWMiLG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldDLm1jIixwcmVkaWN0b3JzKSksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyTWVkKGRhdGE9Y2xlYW5CUF9tZWRfZXZlLHJlc3A9cix0cmVhdD10LG1lZD1tLA0KICAgICAgICAgICAgICAgICAgICAgZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpKSkpICMgV0hMU00gcmV0cm8NCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyA0LjIuIEVtb3Rpb25hbCBFeGhhdXN0aW9uICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KRm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLCB3ZSBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyByb2J1c3RuZXNzIGNoZWNrczoNCg0KMS4gYE5vIEluZmxgOiB3ZSByZW1vdmUgaW5mbHVlbnRpYWwgcGFydGljaXBhbnRzDQoNCjIuIGBObyBDb3ZgOiB3ZSByZW1vdmUgYWxsIGNvdmFyaWF0ZXMsIHRoYXQgaXMgd2Ugb25seSBpbmNsdWRlIGBXSExTTS5tY2AgYW5kIGl0cyBpbnRlcmFjdGlvbnMgYXMgbW9kZWwgcHJlZGljdG9ycw0KDQozLiBgQWxsIGluYDogd2UgaW5jbHVkZSBhbGwgY29tcGxldGUgb2JzZXJ2YXRpb25zIGZyb20gYWxsIHBhcnRpY2lwYW50cywgaW5jbHVkaW5nIHRob3NlIG1lZXRpbmcgdGhlIGV4Y2x1c2lvbiBjcml0ZXJpYSBmb3IgY29tcGxpYW5jZSBhbmQgYmxvb2QgcHJlc3N1cmUNCg0KNC4gYE1MYDogd2UgcmVmaXQgdGhlIG1vZGVscyBieSB1c2luZyB0aGUgTWF4aW11bSBMaWtlbGlob29kIGVzdGltYXRvciwgcmF0aGVyIHRoYW4gdGhlIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kDQoNCjUuIGBSYW5kIHNsb3BlYDogd2UgaW5jbHVkZSB0aGUgcmFuZG9tIHNsb3BlIGZvciBgV0hMU00ubWNgIA0KDQo2LiBgR2FtbWEtbG9nYDogd2UgcmVmaXQgdGhlIG1vZGVscyB1c2luZyB0aGUgR2FtbWEgZmFtaWx5IHdpdGggdGhlIGxvZ2FyaXRobWljIGxpbmsgZnVuY3Rpb24NCg0KNy4gYGxvZ05vcm1gOiB3ZSByZWZpdCB0aGUgbW9kZWxzIHdpdGggdXNpbmcgbG9nLW5vcm1hbCBHTE0NCg0KOC4gYHBvc2l0aW9uYDogd2UgaW5jbHVkZSBqb2IgcG9zaXRpb24gKEVtcGxveWVlL1Byb2plY3QgdnMuIE1hbmFnZXIvKFNlbGYtKUVtcGxveWVyKSBhcyBhbiBhZGRpdGlvbmFsIGNvbnRyb2wgdmFyaWFibGUNCg0KOS4gYGNoaWxkcmVuYDogd2UgaW5jbHVkZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGFzIGFuIGFkZGl0aW9uYWwgY29udHJvbCB2YXJpYWJsZQ0KDQoxMC4gYE5vIGZsYWdUaW1lYDogd2UgZXhjbHVkZSBhbGwgb2JzZXJ2YXRpb25zIHRoYXQgd2VyZSBmbGFnZ2VkIGR1ZSB0byB0aGVpciBhc3NvY2lhdGVkIHRpbWluZyAoZS5nLiwgbW9ybmluZyBCUCByZWNvcmRlZCBpbiB0aGUgYWZ0ZXJub29uKSAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjExLiBgTm8gY2FyZWxlc3NgOiB3ZSBleGNsdWRlIG9uZSBwYXJ0aWNpcGFudCBgUzEzN2AgZmxhZ2dlZCBhcyBwb3RlbnRpYWxseSBjYXJlbGVzcyAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLg0KDQoxMi4gYGRheWA6IHdlIGluY2x1ZGUgYGRheWAgYXMgYSBmdXJ0aGVyIGNvbnRpbnVvdXMgY292YXJpYXRlIChpLmUuLCAxID0gZmlyc3QgZGF5LCAyID0gc2Vjb25kIGRheSwgZXRjLikgDQoNCjEzLiBgV0VgOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3Igc3RhdGUgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSB3b3JraW5nIGV4Y2Vzc2l2ZWx5IGRpbWVuc2lvbg0KDQoxNC4gYFdDYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTUuIGBXSExTTSByZXRyb2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciB0cmFpdCB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHJldHJvc3BlY3RpdmUgdmVyc2lvbiBvZiB0aGUgRFVXQVMgaW5jbHVkZWQgaW4gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUuDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJHYW1tYS1sb2ciLCJsb2dOb3JtIiwNCiAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsImRheSIsIldFIiwiV0MiLCJXSExTTSByZXRybyIpDQpgYGANCg0KPGJyPg0KDQpJbiBhbGwgY2FzZXMsIHRoZSAqKnJlc3VsdHMgYXJlIGNvbnNpc3RlbnQqKiB3aXRoIHRob3NlIHJlcG9ydGVkIGluIHRoZSBtYWluIGFuYWx5c2VzLCBzaG93aW5nIHN1YnN0YW50aWFsIGNvbnRyaWJ1dGlvbiBhbmQgbWFpbiBlZmZlY3Qgb2Ygc3RhdGUgYFdITFNNLm1jYCwgYnV0IHdpdGggbm8gc3Vic3RhbnRpYWwgaW50ZXJhY3Rpb24gd2l0aCBgUEQubWNgIChvbmx5IHNpZ25pZmljYW50IHdoZW4gdXNpbmcgdGhlIGxvZy1ub3JtYWwgZGlzdHJpYnV0aW9uKS4gVGh1cywgd2UgaW50ZXJwcmV0IHRoZXNlIGZpbmRpbmdzIGFzIGEgc2lnbiBvZiB0aGUgKipjb25zaXN0ZW5jeSBvZiB0aGUgZXN0aW1hdGVkIHJlbGF0aW9uc2hpcCoqIGJldHdlZW4gc3RhdGUgYFdITFNNLm1jYCBhbmQgYEVFYC4NCg0KIyMjIE1BSU4gRUZGRUNUDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIG1haW4gZWZmZWN0IG9mIFdITFNNLm1jDQpwcmVkaWN0b3JzIDwtIGMoImdlbmRlciIsIlBELm1jIiwiV0hMU00uY20uZ21jIiwiV0hMU00ubWMiKQ0KcCA8LSBjYmluZChjaGVjaz1jaGVja3MsDQogICAgICByYmluZChnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMoIldITFNNLm1jIiksICMgd2l0aG91dCBjb3ZhcmlhdGVzDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRV9mdWxsLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbWF4aW11bSBsaWtlbGlob29kDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixSRU1MPUZBTFNFKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgcmFuZG9tIHNsb3BlDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIixyYW4uZWZmPSIoV0hMU00ubWN8SUQpIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCAjIEdhbW1hLWxvZyBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLGZhbWlseT0iZ2FtbWEiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBsb2ctbm9ybWFsIGZhbWlseQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIsbGluaz0ibG9nIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sInBvc2l0aW9uIiwgIyBhZGRpbmcgcG9zaXRpb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwiY2hpbGRyZW4iLCAjIGFkZGluZyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVbY2xlYW5FRSRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLCANCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwgIyB3aXRob3V0IGZsYWdnZWQgdGltZXMNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFW2NsZWFuRUUkY2FyZWxlc3M9PUZBTFNFLF0scmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksICMgd2l0aG91dCBjYXJlbGVzcyBwYXJ0aWNpcGFudHMNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxOjNdLCJkYXkiLHByZWRpY3RvcnNbNDpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9ImRheSIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyBJTlRFUkFDVElPTg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKHByZWRpY3RvcnMsIlBELm1jOldITFNNLm1jIikNCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVshY2xlYW5FRSRJRCVpbiVjKCJTMDQ5IiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVfZnVsbCxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGdhbW1hLWxvZyBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLGZhbWlseT0iZ2FtbWEiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUUscmVzcD0iRUUiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGxvZy1ub3JtYWwgZmFtaWx5DQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuRUVbY2xlYW5FRSRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJFRSIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksICMgd2l0aG91ZyBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRVtjbGVhbkVFJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IkVFIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1jKHByZWRpY3RvcnNbMTozXSwiZGF5IixwcmVkaWN0b3JzWzQ6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyBkYXkgYXMgY292YXJpYXRlDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5FRSxyZXNwPSJFRSIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhbkVFLHJlc3A9IkVFIixmaXguZWZmPWdzdWIoIldITFNNLmNtLmdtYyIsIldITFNNLnJldHJvLmdtYyIscHJlZGljdG9ycyksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsa2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSkpICMgV0hMU00gcmV0cm8NCmthYmxlKHApDQpgYGANCg0KPGJyPg0KDQojIyA0LjMuIFNsZWVwIGRpc3R1cmJhbmNlcyAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkZvciBzbGVlcCBkaXN0dXJiYW5jZXMsIHdlIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHJvYnVzdG5lc3MgY2hlY2tzOg0KDQoxLiBgTm8gSW5mbGA6IHdlIHJlbW92ZSBpbmZsdWVudGlhbCBwYXJ0aWNpcGFudHMNCg0KMi4gYE5vIHNsZWVwRHlzZmA6IHdlIHJlbW92ZSBhbGwgcGFydGljaXBhbnRzIHJlcG9ydGluZyBzbGVlcCBkeXNmdW5jdGlvbnMNCg0KMy4gYE5vIENvdmA6IHdlIHJlbW92ZSBhbGwgY292YXJpYXRlcywgdGhhdCBpcyB3ZSBvbmx5IGluY2x1ZGUgYFdITFNNLm1jYCBhbmQgaXRzIGludGVyYWN0aW9ucyBhcyBtb2RlbCBwcmVkaWN0b3JzDQoNCjQuIGBBbGwgaW5gOiB3ZSBpbmNsdWRlIGFsbCBjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSBhbGwgcGFydGljaXBhbnRzLCBpbmNsdWRpbmcgdGhvc2UgbWVldGluZyB0aGUgZXhjbHVzaW9uIGNyaXRlcmlhIGZvciBjb21wbGlhbmNlIGFuZCBibG9vZCBwcmVzc3VyZQ0KDQo1LiBgTUxgOiB3ZSByZWZpdCB0aGUgbW9kZWxzIGJ5IHVzaW5nIHRoZSBNYXhpbXVtIExpa2VsaWhvb2QgZXN0aW1hdG9yLCByYXRoZXIgdGhhbiB0aGUgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QNCg0KNi4gYFJhbmQgc2xvcGVgOiB3ZSBpbmNsdWRlIHRoZSByYW5kb20gc2xvcGUgZm9yIGBXSExTTS5tY2AgDQoNCjcuIGBsb2dOb3JtYDogd2UgcmVmaXQgdGhlIG1vZGVscyB3aXRoIHVzaW5nIGxvZy1ub3JtYWwgR0xNDQoNCjguIGBwb3NpdGlvbmA6IHdlIGluY2x1ZGUgam9iIHBvc2l0aW9uIChFbXBsb3llZS9Qcm9qZWN0IHZzLiBNYW5hZ2VyLyhTZWxmLSlFbXBsb3llcikgYXMgYW4gYWRkaXRpb25hbCBjb250cm9sIHZhcmlhYmxlDQoNCjkuIGBjaGlsZHJlbmA6IHdlIGluY2x1ZGUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBhcyBhbiBhZGRpdGlvbmFsIGNvbnRyb2wgdmFyaWFibGUNCg0KMTAuIGBObyBmbGFnVGltZWA6IHdlIGV4Y2x1ZGUgYWxsIG9ic2VydmF0aW9ucyB0aGF0IHdlcmUgZmxhZ2dlZCBkdWUgdG8gdGhlaXIgYXNzb2NpYXRlZCB0aW1pbmcgKGUuZy4sIG1vcm5pbmcgQlAgcmVjb3JkZWQgaW4gdGhlIGFmdGVybm9vbikgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMS4gYE5vIGNhcmVsZXNzYDogd2UgZXhjbHVkZSBvbmUgcGFydGljaXBhbnQgYFMxMzdgIGZsYWdnZWQgYXMgcG90ZW50aWFsbHkgY2FyZWxlc3MgKHNlZSBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTM10oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzNfcHJlUHJvY2Vzc2luZy9TM19kYXRhLXByb2Nlc3NpbmctY29kZS1hbmQtb3V0cHV0Lmh0bWwpKQ0KDQoxMi4gYFdFYDogd2UgcmVwbGFjZSB0aGUgcHJlZGljdG9yIHRlcm0gZm9yIHN0YXRlIHdvcmthaG9saXNtIHdpdGggdGhlIGNvbXBvc2l0ZSBzY29yZSBhdCB0aGUgd29ya2luZyBleGNlc3NpdmVseSBkaW1lbnNpb24NCg0KMTMuIGBXQ2A6IHdlIHJlcGxhY2UgdGhlIHByZWRpY3RvciB0ZXJtIGZvciBzdGF0ZSB3b3JrYWhvbGlzbSB3aXRoIHRoZSBjb21wb3NpdGUgc2NvcmUgYXQgdGhlIHdvcmtpbmcgZXhjZXNzaXZlbHkgZGltZW5zaW9uDQoNCjE0LiBgV0hMU00gcmV0cm9gOiB3ZSByZXBsYWNlIHRoZSBwcmVkaWN0b3IgdGVybSBmb3IgdHJhaXQgd29ya2Fob2xpc20gd2l0aCB0aGUgY29tcG9zaXRlIHNjb3JlIGF0IHRoZSByZXRyb3NwZWN0aXZlIHZlcnNpb24gb2YgdGhlIERVV0FTIGluY2x1ZGVkIGluIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmNoZWNrcyA8LSBjKCJPcmlnaW5hbCIsIk5vIEluZmwiLCJObyBzbGVlcER5c2YiLCJObyBDb3YiLCJBbGwgaW4iLCJNTCIsIlJhbmQgc2xvcGUiLCJsb2dOb3JtIiwNCiAgICAgICAgICAgICJwb3NpdGlvbiIsImNoaWxkcmVuIiwiTm8gZmxhZ1RpbWUiLCJObyBjYXJlbGVzcyIsIldFIiwiV0MiLCJXSExTTSByZXRybyIpDQpgYGANCg0KPGJyPg0KDQpJbiBhbGwgYnV0IHR3byBjYXNlcyAoaS5lLiwgb25seSB0aGUgaW50ZXJhY3Rpb24gYnV0IG5vdCB0aGUgbWFpbiBlZmZlY3Qgb2Ygc3RhdGUgd29ya2Fob2xpc20gaXMgc3Vic3RhbnRpYWwgd2hlbiBpbmNsdWRpbmcgdGhlIHJhbmRvbSBzbG9wZSBhbmQgd2hlbiB1c2luZyB0aGUgd29ya2luZyBjb21wdWxzaXZlbHkgZGltZW5zaW9uIHJhdGhlciB0aGFuIHRoZSB0b3RhbCBzdGF0ZSB3b3JrYWhvbGlzbSBzY29yZSksIHRoZSAqKnJlc3VsdHMgYXJlIGNvbnNpc3RlbnQqKiB3aXRoIHRob3NlIHJlcG9ydGVkIGluIHRoZSBtYWluIGFuYWx5c2VzLCBzaG93aW5nIHN1YnN0YW50aWFsIG1haW4gZWZmZWN0IG9mIHN0YXRlIGBXSExTTS5tY2AgYW5kIGludGVyYWN0aW9uLiBXZSBpbnRlcnByZXQgdGhlc2UgZmluZGluZ3MgYXMgYSBzaWduIG9mIHRoZSAqKmNvbnNpc3RlbmN5IG9mIHRoZSBlc3RpbWF0ZWQgaW50ZXJhY3Rpb25zKiogYmV0d2VlbiBgV0hMU00ubWNgIGFuZCBgUEQubWNgIGZvciBgU0RgLg0KDQojIyMgTUFJTiBFRkZFQ1QNCmBgYHtyIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCiMgbWFpbiBlZmZlY3Qgb2YgV0hMU00ubWMNCnByZWRpY3RvcnMgPC0gYygiZ2VuZGVyIiwiUEQubWMiLCJXSExTTS5jbS5nbWMiLCJXSExTTS5tYyIpDQpwIDwtIGNiaW5kKGNoZWNrPWNoZWNrcywNCiAgICAgIHJiaW5kKGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgb3JpZ2luYWwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEWyFjbGVhblNEJElEJWluJWMoIlMxMzIiLCJTMDQ5IiwiUzA3OSIsIlMwMDIiKSxdLCAjIHdpdGhvdXQgaW5mbHVlbnRpYWwNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RbY2xlYW4kc2xlZXBfZHlzZiE9IlllcyIsXSwgIyB3aXRob3V0IHBhcnRpY2lwYW50cyB3aXRoIHNsZWVwIGR5c2YNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9YygiV0hMU00ubWMiKSwgIyB3aXRob3V0IGNvdmFyaWF0ZXMNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEX2Z1bGwscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBmdWxsIHNhbXBsZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgIyByYW5kb20gc2xvcGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLHJhbi5lZmY9IihXSExTTS5tY3xJRCkiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsICMgbG9nLW5vcm1hbCBmYW1pbHkNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiLGxpbms9ImxvZyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9YyhwcmVkaWN0b3JzWzFdLCJwb3NpdGlvbiIsICMgYWRkaW5nIHBvc2l0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3JzWzI6bGVuZ3RoKHByZWRpY3RvcnMpXSksDQogICAgICAgICAgICAgICAgICAgIG1Db21wLmJhc2VsaW5lPSJXSExTTS5jbS5nbWMiLGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEW2NsZWFuU0QkZmxhZ1RpbWU9PUZBTFNFLF0scmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIiwgDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IldITFNNLm1jIixrZXkubW9kZWw9IldITFNNLm1jIiksICMgd2l0aG91dCBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFtjbGVhblNEJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsICAjIHdpdGhvdXQgY2FyZWxlc3MNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLmNtLmdtYyIsa2V5LnByZWRpY3Rvcj0iV0hMU00ubWMiLGtleS5tb2RlbD0iV0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0UubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXRS5tYyIsa2V5Lm1vZGVsPSJXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00uY20uZ21jIixrZXkucHJlZGljdG9yPSJXQy5tYyIsa2V5Lm1vZGVsPSJXQy5tYyIpLCAjIHdvcmtpbmcgY29tcHVsc2l2ZWx5DQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1nc3ViKCJXSExTTS5jbS5nbWMiLCJXSExTTS5yZXRyby5nbWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ucmV0cm8uZ21jIixrZXkucHJlZGljdG9yPSJXSExTTS5tYyIsa2V5Lm1vZGVsPSJXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMjIyBJTlRFUkFDVElPTg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KcHJlZGljdG9ycyA8LSBjKHByZWRpY3RvcnMsIlBELm1jOldITFNNLm1jIikNCnAgPC0gY2JpbmQoY2hlY2s9Y2hlY2tzLA0KICAgICAgcmJpbmQoZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIG9yaWdpbmFsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFshY2xlYW5TRCRJRCVpbiVjKCJTMTMyIiwiUzA0OSIsIlMwNzkiLCJTMDAyIiksXSwgIyB3aXRob3V0IGluZmx1ZW50aWFsIGNhc2VzDQogICAgICAgICAgICAgICAgICAgIHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNEW2NsZWFuJHNsZWVwX2R5c2YhPSJZZXMiLF0sICMgd2l0aG91dCBwYXJ0aWNpcGFudHMgd2l0aCBzbGVlcCBkeXNmdW5jdGlvbnMNCiAgICAgICAgICAgICAgICAgICAgcmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLA0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLCANCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWMoIlBELm1jIiwiV0hMU00ubWMiLCJQRC5tYzpXSExTTS5tYyIpLCAjIHdpdGhvdXQgY292YXJpYXRlcw0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RfZnVsbCxyZXNwPSJTRCIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsICMgZnVsbCBzYW1wbGUNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwgIyBtYXhpbXVtIGxpa2VsaWhvb2QNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiLFJFTUw9RkFMU0UpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIHJhbmRvbSBzbG9wZQ0KICAgICAgICAgICAgICAgICAgICBrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIscmFuLmVmZj0iKFdITFNNLm1jfElEKSIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9cHJlZGljdG9ycyxtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLCAjIGxvZy1ub3JtYWwgZmFtaWx5DQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIixsaW5rPSJsb2ciKSwNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWMocHJlZGljdG9yc1sxXSwicG9zaXRpb24iLCAjIGFkZGluZyBwb3NpdGlvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yc1syOmxlbmd0aChwcmVkaWN0b3JzKV0pLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0hMU00ubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1jKHByZWRpY3RvcnNbMV0sImNoaWxkcmVuIiwgIyBhZGRpbmcgY2hpbGRyZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcnNbMjpsZW5ndGgocHJlZGljdG9ycyldKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpLA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0RbY2xlYW5TRCRmbGFnVGltZT09RkFMU0UsXSxyZXNwPSJTRCIsZml4LmVmZj1wcmVkaWN0b3JzLG1Db21wLmJhc2VsaW5lPSJXSExTTS5tYyIsDQogICAgICAgICAgICAgICAgICAgIGtleS5wcmVkaWN0b3I9IlBELm1jOldITFNNLm1jIixrZXkubW9kZWw9IlBELm1jOldITFNNLm1jIiksICMgd2l0aG91ZyBmbGFnZ2VkIHRpbWVzDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRFtjbGVhblNEJGNhcmVsZXNzPT1GQUxTRSxdLHJlc3A9IlNEIixmaXguZWZmPXByZWRpY3RvcnMsbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIiwNCiAgICAgICAgICAgICAgICAgICAga2V5LnByZWRpY3Rvcj0iUEQubWM6V0hMU00ubWMiLGtleS5tb2RlbD0iUEQubWM6V0hMU00ubWMiKSwgIyB3aXRob3V0IGNhcmVsZXNzIHBhcnRpY2lwYW50cw0KICAgICAgICAgICAgDQogICAgICAgICAgICBnbG1lckFuKGRhdGE9Y2xlYW5TRCxyZXNwPSJTRCIsZml4LmVmZj1nc3ViKCJXSExTTS5tYyIsIldFLm1jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldFLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXRS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXRS5tYyIpLCAjIHdvcmtpbmcgZXhjZXNzaXZlbHkNCiAgICAgICAgICAgIGdsbWVyQW4oZGF0YT1jbGVhblNELHJlc3A9IlNEIixmaXguZWZmPWdzdWIoIldITFNNLm1jIiwiV0MubWMiLHByZWRpY3RvcnMpLA0KICAgICAgICAgICAgICAgICAgICBtQ29tcC5iYXNlbGluZT0iV0MubWMiLGtleS5wcmVkaWN0b3I9IlBELm1jOldDLm1jIixrZXkubW9kZWw9IlBELm1jOldDLm1jIiksICMgd29ya2luZyBjb21wdWxzaXZlbHkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZ2xtZXJBbihkYXRhPWNsZWFuU0QscmVzcD0iU0QiLGZpeC5lZmY9Z3N1YigiV0hMU00uY20uZ21jIiwiV0hMU00ucmV0cm8uZ21jIixwcmVkaWN0b3JzKSwNCiAgICAgICAgICAgICAgICAgICAgbUNvbXAuYmFzZWxpbmU9IldITFNNLm1jIixrZXkucHJlZGljdG9yPSJQRC5tYzpXSExTTS5tYyIsa2V5Lm1vZGVsPSJQRC5tYzpXSExTTS5tYyIpKSkgIyBXSExTTSByZXRybw0Ka2FibGUocCkNCmBgYA0KDQo8YnI+DQoNCiMgNS4gT3V0cHV0cw0KDQpIZXJlLCB3ZSBnZW5lcmF0ZSBhbmQgc2F2ZSB0aGUgcmVncmVzc2lvbiB0YWJsZXMgcmVwb3J0aW5nIHRoZSByZXN1bHRzIGVzdGltYXRlZCBieSB0aGUgc2VsZWN0ZWQgbW9kZWxzLiBGb3IgZWFjaCBtb2RlbCwgd2UgdmlzdWFsaXplIHRoZSB1bnN0YW5kYXJkaXplZCBjb2VmZmljaWVudHMgKGIpLCB0aGUgc3RhbmRhcmQgZXJyb3IgKFNFKSwgYW5kIHRoZSAqKjk1JSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMqKiBjb21wdXRlZCB3aXRoIDEwLDAwMCBpdGVyYXRpb25zLg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD01LGZpZy5oZWlnaHQ9NH0NCk5TSU0gPSAxMDAwMA0KDQojIGNvZWZmaWNpZW50cyBhZnRlcm5vb24gQlANCnRhYl9tb2RlbChtMV9TQlBfYWZ0LG0yX1NCUF9hZnQsbTFfREJQX2FmdCxtMl9EQlBfYWZ0LA0KICAgICAgICAgIGR2LmxhYmVscz1wYXN0ZTAocmVwKGMoIlNCUF9hZnRfIiwiREJQX2FmdF8iKSxlYWNoPTIpLGMoImJhc2VsaW5lIiwiV0hMU00ubWMiKSksDQogICAgICAgICAgc2hvdy5pY2M9RkFMU0Usc2hvdy5wPUZBTFNFLHNob3cuc2U9VFJVRSxzaG93LnIyPUZBTFNFLGNvbGxhcHNlLnNlPVRSVUUsc3RyaW5nLmVzdD0iYiAoU0UpIikNCg0KIyBib290c3RyYXAgQ0kgU0JQX2FmdA0KY29uZmludC5tZXJNb2QobTFfU0JQX2FmdCxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9TQlBfYWZ0KSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX1NCUF9hZnQscGFybT0zOihsZW5ndGgoZml4ZWYobTJfU0JQX2FmdCkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQoNCiMgYm9vdHN0cmFwIENJIERCUF9hZnQNCmNvbmZpbnQubWVyTW9kKG0xX0RCUF9hZnQscGFybT01OihsZW5ndGgoZml4ZWYobTFfU0JQX2FmdCkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9EQlBfYWZ0LHBhcm09NToobGVuZ3RoKGZpeGVmKG0yX1NCUF9hZnQpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMg0KDQojIGNvZWZmaWNpZW50cyBldmVuaW5nIEJQDQp0YWJfbW9kZWwobTFfU0JQX2V2ZSxtMl9TQlBfZXZlLG0zX1NCUF9ldmUsbTFfREJQX2V2ZSxtMl9EQlBfZXZlLG0zX0RCUF9ldmUsDQogICAgICAgICAgZHYubGFiZWxzPXBhc3RlMChyZXAoYygiU0JQX2V2ZV8iLCJEQlBfZXZlXyIpLGVhY2g9MyksYygiYmFzZWxpbmUiLCJXSExTTS5tYyIsImludGVyYWN0aW9uIikpLA0KICAgICAgICAgIHNob3cuaWNjPUZBTFNFLHNob3cucD1GQUxTRSxzaG93LnNlPVRSVUUsc2hvdy5yMj1GQUxTRSxjb2xsYXBzZS5zZT1UUlVFLHN0cmluZy5lc3Q9ImIgKFNFKSIpDQoNCiMgYm9vdHN0cmFwIENJIFNCUF9ldmUNCmNvbmZpbnQubWVyTW9kKG0xX1NCUF9ldmUscGFybT0zOihsZW5ndGgoZml4ZWYobTFfU0JQX2V2ZSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9TQlBfZXZlLHBhcm09MzoobGVuZ3RoKGZpeGVmKG0yX1NCUF9ldmUpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMg0KY29uZmludC5tZXJNb2QobTNfU0JQX2V2ZSxwYXJtPTM6KGxlbmd0aChmaXhlZihtM19TQlBfZXZlKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTMNCg0KIyBib290c3RyYXAgQ0kgREJQX2V2ZQ0KY29uZmludC5tZXJNb2QobTFfREJQX2V2ZSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9EQlBfZXZlKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX0RCUF9ldmUscGFybT0zOihsZW5ndGgoZml4ZWYobTJfREJQX2V2ZSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQpjb25maW50Lm1lck1vZChtM19EQlBfZXZlLHBhcm09MzoobGVuZ3RoKGZpeGVmKG0zX0RCUF9ldmUpKSsyKSxtZXRob2Q9ImJvb3QiLG5zaW09TlNJTSkgIyBNMw0KDQojIGNvZWZmaWNpZW50cyBFRSBhbmQgU0QNCnRhYl9tb2RlbChtMV9FRSxtMl9FRSxtM19FRSxtMV9TRCxtMl9TRCxtM19TRCwNCiAgICAgICAgICBkdi5sYWJlbHM9cGFzdGUwKHJlcChjKCJFRV8iLCJTRF8iKSxlYWNoPTMpLGMoImJhc2VsaW5lIiwiV0hMU00ubWMiLCJpbnRlcmFjdGlvbiIpKSwNCiAgICAgICAgICBzaG93LmljYz1GQUxTRSxzaG93LnA9RkFMU0Usc2hvdy5zZT1UUlVFLHNob3cucjI9RkFMU0UsY29sbGFwc2Uuc2U9VFJVRSxzdHJpbmcuZXN0PSJiIChTRSkiKQ0KDQogIyBib290c3RyYXAgQ0kgRUUgDQpjb25maW50Lm1lck1vZChtMV9FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMV9FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0xDQpjb25maW50Lm1lck1vZChtMl9FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtMl9FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0yDQpjb25maW50Lm1lck1vZChtM19FRSxwYXJtPTM6KGxlbmd0aChmaXhlZihtM19FRSkpKzIpLG1ldGhvZD0iYm9vdCIsbnNpbT1OU0lNKSAjIE0zDQoNCiMgYm9vc3RyYXAgQ0kgU0QNCmNvbmZpbnQubWVyTW9kKG0xX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0xX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTENCmNvbmZpbnQubWVyTW9kKG0yX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0yX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTINCmNvbmZpbnQubWVyTW9kKG0zX1NELHBhcm09MzoobGVuZ3RoKGZpeGVmKG0zX1NEKSkrMiksbWV0aG9kPSJib290Iixuc2ltPU5TSU0pICMgTTMNCg0KIyBwbG90dGluZyBpbnRlcmFjdGlvbg0KbGlicmFyeShnZ3Bsb3QyKTsgbGlicmFyeShncmlkRXh0cmEpDQpzZChjbGVhblNEJFBELm1jKSAjIFJEZXQ6IDEgU0QgPSAxLjM2DQpwIDwtIHBsb3RfbW9kZWwobTNfU0QsdHlwZT0icHJlZCIsdGVybXM9YygiV0hMU00ubWMiLCJQRC5tYyBbLTEuMzYsMS4zNl0iKSxjb2xvcnM9ImJ3IiwNCiAgICAgICAgICAgYWxwaGE9MC40LGxlZ2VuZC50aXRsZT0iUHN5Y2hvbG9naWNhbFxuZGV0YWNobWVudCIsYXhpcy50aXRsZT1jKCJTdGF0ZSB3b3JrYWhvbGlzbSIsIlNsZWVwIGRpc3R1cmJhbmNlcyIpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHM9YygiLTEgU0QiLCIrMSBTRCIpLHZhbHVlcz1jKCJibGFjayIsIiM2NjY2NjYiKSkgKw0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwobGFiZWxzPWMoIi0xIFNEIiwiKzEgU0QiKSx2YWx1ZXM9Yygic29saWQiLCJkYXNoZWQiKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbChsYWJlbHM9YygiLTEgU0QiLCIrMSBTRCIpLHZhbHVlcz1jKCJibGFjayIsIiM2NjY2NjYiKSkgKyBnZ3RpdGxlKCIiKSArDQogICAgICAgICAgICAgICAgICAgIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTUpKQ0KcA0KZ2dzYXZlKCJSRVNVTFRTL0ZpZ3VyZTMudGlmZiIscGxvdD1wLGRwaT0zMDAsd2lkdGg9NSxoZWlnaHQ9NCkNCmBgYA0KDQo8YnI+DQoNCiMgUmVmZXJlbmNlcyB7I3JlZn0NCg0KLSBTdGVlZ2VuLCBTLiwgVHVlcmxpbmNreCwgRi4sIEdlbG1hbiwgQS4sICYgVmFucGFlbWVsLCBXLiAoMjAxNikuIEluY3JlYXNpbmcgdHJhbnNwYXJlbmN5IHRocm91Z2ggYSBtdWx0aXZlcnNlIGFuYWx5c2lzLiAqUGVyc3BlY3RpdmVzIG9uIFBzeWNob2xvZ2ljYWwgU2NpZW5jZSwgMTEqKDUpLCA3MDItNzEyLiBodHRwczovL2RvaS5vcmcvMTAuMTE3Ny8xNzQ1NjkxNjE2NjU4NjM3DQoNCjxicj4NCg0KIyMgUiBwYWNrYWdlcw==