Aims and content

The present document includes the analytical steps implemented to compute the descriptive statistics from the retrospective and daily diary data collected with the Qualtrics platform (Qualtrics, Seattle, WA, USA) from an heterogeneous samples of workers over two weeks, pre-processed as shown in Supplementary Material S3 and aggregated as shown in Supplementary Material S4. The document also depicts the procedure used to select the covariates to be included in the following multilevel models (see Supplementary Material S6).

Here, we remove all objects from the R global environment.

# removing all objets from the workspace
rm(list=ls())

The following R packages are used in this document (see References section):

# required packages
packages <- c("knitr","Rmisc","Hmisc","lme4","ggplot2","reshape2","MuMIn")

# generate packages references
knitr::write_bib(c(.packages(), packages),"packagesDesc.bib")
## tweaking Hmisc
# # run to install missing packages
# xfun::pkg_attach2(packages, message = FALSE); rm(list=ls())


1. Data reading

First, we read daily diary dataset diary and we rebuild the preliminary questionnaire prelqs exported from the previous step (Supplementary Material S4).

# loading data
load("DATI/diary_aggregated.RData") 

# rebuilding the prelqs dataset (only including variables from the preliminary questionnaire)
prelqs <- diary[!duplicated(diary$ID),c(1,which(colnames(diary)=="gender"):ncol(diary))]

# original sample sizes
cat("diary:",nrow(diary),"responses (days) from",nlevels(diary$ID),"participants")
## diary: 1084 responses (days) from 135 participants
cat("prelqs:",nrow(prelqs),"responses from",nlevels(prelqs$ID),"participants")
## prelqs: 135 responses from 135 participants


2. Data filtering

As we pre-registered here, we filter the data based on participant compliance with the protocol, that is we exclude the participants with less than 3 full days of participation (i.e., with nonmissing response to the afternoon, evening, and morning questionnaire).

# filtering participants with less than 3 observations
clean <- diary[0,]
for(ID in levels(diary$ID)){ 
  if(nrow(diary[diary$ID==ID & diary$aft==1 & diary$eve==1 & diary$mor==1,]) >= 3){ 
    clean <- rbind(clean,diary[diary$ID==ID,]) }}
clean$ID <- as.factor(as.character(clean$ID)) # resetting ID levels
clean_prelqs <- prelqs[prelqs$ID %in% levels(clean$ID),] # filtering prelqs data
clean_prelqs$ID <- as.factor(as.character(clean_prelqs$ID)) # resetting ID levels
cat("diary: Excluded",nlevels(diary$ID)-nlevels(clean$ID),"participants and",nrow(diary)-nrow(clean),"observations")
## diary: Excluded 21 participants and 126 observations
# updating sample sizes
cat("diary:",nrow(clean),"responses from",nlevels(clean$ID),"participants")
## diary: 958 responses from 114 participants
prelqs <- prelqs[prelqs$ID %in% levels(clean$ID),] # filtering prelqs data
prelqs$ID <- as.factor(as.character(prelqs$ID)) # resetting ID levels
cat("prelqs:",nrow(prelqs),"responses from",nlevels(prelqs$ID),"participants")
## prelqs: 114 responses from 114 participants


3. Descriptives

First, we describe the sample and compute the descriptive statistics and correlations of the core study variables (i.e., workaholism, WHLSM; afternoon, evening, and morning blood pressure, SBP_aft, DBP_aft, SBP_eve DBP_eve; emotional exhaustion, EE; sleep disturbances, SD, and recovery experiences, RDet and RRel) and a set of potential quantitative covariates (i.e., workhours, workHours; time since waking-up, hhFromAwake; age, age; BMI, BMI, and weekly working hours, weekHours).

The following packages and functions are used to optimize the analysis.

library(knitr); library(ggplot2); library(reshape2)
multidesc()

#' @title Descriptive statistics (mean and SD) and intraclass correlation of multilevel datasets
#' @param long = long-form data.frame including all time-varying variables with one row per observation
#' @param wide = wide-form data.frame including all time-invariant variables with one row per subject
#' @param cluster = character string indicating the name of the column with the subject identifiers
#' @param lv1 = character vector indicating the column names of the time-varying variables in the long dataset
#' @param lv2 = character vector indicating the column names of the time-invariant variables in the wide dataset
#' @param group = character string indicating the name of the column of the grouping variable (defult: NA for no group specification)
#' @param group.labels = character vector indicating the name of the group variable levels (default: NA)
multidesc <- function(long,wide,cluster="ID",lv1,lv2){ require(Rmisc); require(lme4)
  
  # lv1 data
  out <- data.frame(Measure=lv1[1],
                    N=summarySE(long,lv1[1],na.rm=TRUE)[,2],
                    Mean=paste(round(summarySE(long,lv1[1],na.rm=TRUE)[,3],2)," (",
                               round(summarySE(long,lv1[1],na.rm=TRUE)[,4],2),")",sep=""))
  for(i in 2:length(lv1)){
    out <- rbind(out,
                 data.frame(Measure=lv1[i],
                            N=summarySE(long,lv1[i],na.rm=TRUE)[,2],
                            Mean=paste(round(summarySE(long,lv1[i],na.rm=TRUE)[,3],2)," (",
                                       round(summarySE(long,lv1[i],na.rm=TRUE)[,4],2),")",sep="")))}
  
  # lv2 data
  if(!is.na(lv2[1])){
    for(i in 1:length(lv2)){
      out <- rbind(out,
                   data.frame(Measure=lv2[i],
                              N=summarySE(wide,lv2[i],na.rm=TRUE)[,2],
                              Mean=paste(round(summarySE(wide,lv2[i],na.rm=TRUE)[,3],2)," (",
                                         round(summarySE(wide,lv2[i],na.rm=TRUE)[,4],2),")",sep="")))}}
  
  # ICC
  out$ICC <- NA
  for(i in 1:length(lv1)){
    m <- lmer(formula=gsub("var",lv1[i],gsub("ID",cluster,"var~(1|ID)")),data=long) # VAR_between / (VAR_between + VAR_within)
    out[out$Measure==lv1[i],"ICC"] <- round(as.data.frame(VarCorr(m))[1,4]/
                                              (as.data.frame(VarCorr(m))[1,4]+as.data.frame(VarCorr(m))[2,4]),2)}
  rownames(out) <- gsub(".cm","",rownames(out))
  return(out)}

Computes and prints descriptive statistics (mean and SD) and intraclass correlation of a multilevel dataset.

multicorr()

#' @title Correlation matrix of multilevel datasets
#' @param long = long-form data.frame including all time-varying variables with one row per observation
#' @param wide = wide-form data.frame including all time-invariant variables with one row per subject
#' @param cluster = character string indicating the name of the column with the subject identifiers
#' @param lv1 = character vector indicating the column names of the time-varying variables in the long dataset
#' @param lv2 = character vector indicating the column names of the time-invariant variables in the wide dataset
#' @param pvalue = logical value specifying whether p-values should be reported or not (default: FALSE)
#' @param correction = character specifying the type of correction to be applied to the computed p-values (see ?p.adjust), default is "bonferroni"
multicorr <- function(long,wide,lv1,lv2,cluster="ID",pvalue=FALSE,correction="bonferroni"){ 
  require(Rmisc); require(Hmisc); require(plyr)
  
  # renaming cluster as "ID"
  colnames(long)[which(colnames(long)==cluster)] <- "ID"
  
  # person-mean-centering lv-1 variables
  for(Var in lv1){
    wide <- cbind(wide,aggregate(long[,Var],list(long$ID),mean,na.rm=TRUE)[,2]) # computing individual means
    colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
    long <- join(long,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
    long[,paste(Var,".mc")] <- long[,Var] - long[,paste0(Var,".cm")] # computing mean-centered scores
    colnames(long)[ncol(long)] <- paste0(Var,".mc") }
  
  # between-subjects correlations (lv2)
  if(!is.na(lv2[1])){
    out <- rcorr(as.matrix(wide[,c(paste0(lv1,".cm"),lv2)]), type = "pearson")
  } else { out <- rcorr(as.matrix(wide[,paste0(lv1,".cm")]), type = "pearson") }
  rb <- round(out$r,2) # corr coefficients
  rb[lower.tri(rb)] <- NA
  rownames(rb) <- gsub(".cm","",rownames(rb))
  colnames(rb) <- gsub(".cm","",colnames(rb))
  rb.p <- out$P # pvalues
  rb.p[lower.tri(rb.p)] <- NA
  
  # within-participant correlations (lv1)
  out <- rcorr(as.matrix(long[,paste(lv1,".mc",sep="")]), type = "pearson")
  rw <- round(out$r,2) # corr coeff.
  rw[upper.tri(rw)] <- NA
  rownames(rw) <- gsub(".mc","",rownames(rw))
  colnames(rw) <- gsub(".mc","",colnames(rw))
  rw.p <- out$P # pvalues
  rw.p[upper.tri(rw.p)] <- NA
  
  # adjusting p-values
  if(pvalue==TRUE){
    adj <- data.frame(original=c(rb.p[!is.na(rb.p)],rw.p[!is.na(rw.p)]),
                      sig=rep(NA,length(c(rb.p[!is.na(rb.p)],rw.p[!is.na(rw.p)]))))
    adj$level <- "w"
    adj[1:length(rb.p[!is.na(rb.p)]),"level"] <- "b"
    adj$adjusted=p.adjust(adj$original,method=correction)
    # significance level
    adj[adj$adjusted<.05,"sig"] <- "*"
    adj[adj$adjusted<.01,"sig"] <- "**"
    adj[adj$adjusted<.001,"sig"] <- "***"
    adj[is.na(adj$sig),"sig"] <- ""
    adjb <- adj[adj$level=="b",]
    adjw <- adj[adj$level=="w",]
    for(i in 1:nrow(adjb)){ rb.p[!is.na(rb.p) & rb.p==adjb[i,"original"]] <- adjb[i,"sig"] }
    for(i in 1:nrow(adjw)){ rw.p[!is.na(rw.p) & rw.p==adjw[i,"original"]] <- adjw[i,"sig"] }
    for(i in 1:nrow(rb.p)){ for(j in 1:ncol(rb.p)){ 
      if(!is.na(rb.p[i,j])){ rb[i,j] <- paste(round(as.numeric(rb[i,j]),2),rb.p[i,j],sep="")}}}
    for(i in 1:nrow(rw.p)){ for(j in 1:ncol(rw.p)){ 
      if(!is.na(rw.p[i,j])){ rw[i,j] <- paste(round(as.numeric(rw[i,j]),2),rw.p[i,j],sep="")}}}}
  
  # filling rb empty cells
  rb[1:length(lv1),1:length(lv1)][lower.tri(rb[1:length(lv1),1:length(lv1)])] <- rw[lower.tri(rw)]
  rb <- t(rb) # transposing the matrix (correlations within-individual are shown above the main diagonal)
  return(rb)}

computes the correlation matrix of a multilevel dataset.


3.1. Sample description

Here, we describe the sample by providing frequencies and other descriptive statistics of sociodemographic and work-related variables collected with the preliminary questionnaire, considering the included subsample.

# gender (freq; %)
summary(prelqs$gender); round(100*summary(prelqs$gender)/nrow(prelqs),1)
##  F  M 
## 59 55
##    F    M 
## 51.8 48.2
# age (mean, SD)
round(mean(prelqs$age),2); round(sd(prelqs$age),2)
## [1] 42.12
## [1] 12.61
# BMI (mean, SD)
round(mean(prelqs$BMI),2); round(sd(prelqs$BMI),2)
## [1] 23.91
## [1] 3.53
# education (freq; %)
summary(prelqs$edu); round(100*summary(prelqs$edu)/nrow(prelqs),1)
## highschool- university+ 
##          45          69
## highschool- university+ 
##        39.5        60.5
# job sector (freq; %)
summary(prelqs$sector); round(100*summary(prelqs$sector)/nrow(prelqs),1)
## Private  Public 
##      91      23
## Private  Public 
##    79.8    20.2
# job position (freq; %)
summary(prelqs$position); round(100*summary(prelqs$position)/nrow(prelqs),1)
##          Employee Manager/Employers           Project 
##                57                53                 4
##          Employee Manager/Employers           Project 
##              50.0              46.5               3.5
# occupational groups (%)
jobs <- round(100*summary(prelqs$job)/nrow(prelqs),1)
jobs[order(jobs,decreasing=TRUE)]
##         Business and administration associate professionals 
##                                                        15.8 
##                   Business and administration professionals 
##                                                        13.2 
##                    Legal, social and cultural professionals 
##                                                        10.5 
##                       Science and engineering professionals 
##                                                        10.5 
##                                      Teaching professionals 
##                                                         9.6 
##             Science and engineering associate professionals 
##                                                         8.8 
##                                        Health professionals 
##                                                         5.3 
##                Production and specialised services managers 
##                                                         3.5 
##          Chief executives, senior officials and legislators 
##                                                         2.6 
##                              Health associate professionals 
##                                                         2.6 
##             Hospitality, retail and other services managers 
##                                                         2.6 
##     Information and communications technology professionals 
##                                                         2.6 
##                      Administrative and commercial managers 
##                                                         1.8 
##                                    Personal service workers 
##                                                         1.8 
##                                               Sales workers 
##                                                         1.8 
##                      Stationary plant and machine operators 
##                                                         1.8 
##                                                  Assemblers 
##                                                         0.9 
##                                    Customer services clerks 
##                                                         0.9 
##                    Electrical and electronic trades workers 
##                                                         0.9 
##                             Handicraft and printing workers 
##                                                         0.9 
## Legal, social, cultural and related associate professionals 
##                                                         0.9 
##                 Metal, machinery and related trades workers 
##                                                         0.9
# weekly working time (mean; SD)
round(mean(prelqs$weekHours),2); round(sd(prelqs$weekHours),2)
## [1] 41.22
## [1] 9.76
# having a partner (freq; %)
summary(prelqs$partner); round(100*summary(prelqs$partner)/nrow(prelqs),1)
##  No Yes 
##  61  53
##   No  Yes 
## 53.5 46.5
# having a children (freq; %)
summary(prelqs$children); round(100*summary(prelqs$children)/nrow(prelqs),1)
##  No Yes 
##  56  58
##   No  Yes 
## 49.1 50.9
# living arrangements (freq; %)
summary(prelqs$home); round(100*summary(prelqs$home)/nrow(prelqs),1)
##    alone  partner children  parents   others 
##       13       28       45       19        9
##    alone  partner children  parents   others 
##     11.4     24.6     39.5     16.7      7.9
# smoking status (freq; %)
summary(prelqs$smoker); round(100*summary(prelqs$smoker)/nrow(prelqs),1)
##  No Yes 
##  83  31
##   No  Yes 
## 72.8 27.2


3.2. Response rate

Here, we report the total number of observations and response rate for each variable, considering the included subsample.

# total number of diary entries, days, and participants
cat(nrow(clean[clean$aft==1,])+nrow(clean[clean$eve==1,])+nrow(clean[clean$mor==1,]),"diary entry,",
    nrow(clean),"daily observations from",nlevels(clean$ID),"participants")
## 2534 diary entry, 958 daily observations from 114 participants
# computing Nweeks, Nobs, and complDays variables
prelqs$Nweeks <- prelqs$complObs <- prelqs$complDays <- 1
for(i in 1:nrow(prelqs)){
  if(max(clean[clean$ID==prelqs[i,"ID"],"day"])>6){ prelqs[i,"Nweeks"] <- 2 } # No. of weeks
  prelqs[i,"complObs"] <- nrow(clean[clean$ID==prelqs[i,"ID"] & clean$aft==1,]) + # No. of complete observations
    nrow(clean[clean$ID==prelqs[i,"ID"] & clean$eve==1,]) + nrow(clean[clean$ID==prelqs[i,"ID"] & clean$mor==1,])
  prelqs[i,"complDays"] <- nrow(clean[clean$ID==prelqs[i,"ID"] & clean$aft==1 & clean$eve==1 & clean$aft==1,]) } # No. full days
cat("Sanity check:",min(prelqs$complDays)==3 & max(prelqs$Nweeks)==2) # min 3 complete days and max 2 weeks
## Sanity check: TRUE
# number and % of participants involved for 1 vs. 2 weeks
summary(as.factor(prelqs$Nweeks))
##  1  2 
## 31 83
round(100*summary(as.factor(prelqs$Nweeks))/nrow(prelqs),1)
##    1    2 
## 27.2 72.8
# computing respRate
prelqs[prelqs$Nweeks==1,"respRate"] <- round(100*prelqs[prelqs$Nweeks==1,"complObs"]/15,2) # max 15 obs when Nweeks = 1
prelqs[prelqs$Nweeks==2,"respRate"] <- round(100*prelqs[prelqs$Nweeks==2,"complObs"]/30,2) # max 30 obs when Nweeks = 2

# computing complDaysRate
prelqs[prelqs$Nweeks==1,"complDaysRate"] <- round(100*prelqs[prelqs$Nweeks==1,"complDays"]/5,2) # max 5 days when Nweeks = 1
prelqs[prelqs$Nweeks==2,"complDaysRate"] <- round(100*prelqs[prelqs$Nweeks==2,"complDays"]/10,2) # max 10 days when Nweeks = 2

# printing info
cat("- No. complete responses per participants:",round(mean(prelqs$complObs),2),", SD =",round(sd(prelqs$complObs),2),
    "\n- response rate per participants:",round(mean(prelqs$respRate),2),"%, SD =",round(sd(prelqs$respRate),2),
    "%\n- No. complete days (Aft + Eve + Mor) per participants",round(mean(prelqs$complDays),2),
    ", SD =",round(sd(prelqs$complDays),2),"\n- complete days rate per participants:",round(mean(prelqs$complDaysRate),2),
    "%, SD =",round(sd(prelqs$complDaysRate),2),"%","\n-",nrow(prelqs[prelqs$Nweeks==2,]),"on",nrow(prelqs),
    "participants involved for two weeks (",round(100*nrow(prelqs[prelqs$Nweeks==2,])/nrow(prelqs)),
    "% )\n- mean No. of complete responses for those participating over 2 weeks =",
    round(mean(prelqs[prelqs$Nweeks==2,"complObs"]),2),
    "\n- mean No. of complete responses for those participating over 1 week =",
    round(mean(prelqs[prelqs$Nweeks==1,"complObs"]),2))
## - No. complete responses per participants: 22.23 , SD = 6.09 
## - response rate per participants: 86.87 %, SD = 12.85 %
## - No. complete days (Aft + Eve + Mor) per participants 6.86 , SD = 2.23 
## - complete days rate per participants: 80.61 %, SD = 18.64 % 
## - 83 on 114 participants involved for two weeks ( 73 % )
## - mean No. of complete responses for those participating over 2 weeks = 25.27 
## - mean No. of complete responses for those participating over 1 week = 14.1


3.3. Blood pressure subsample

In addition to filtering participant based on their compliance, we pre-registered the exclusion of all participants reporting taking blood pressure medications bp_drugs or suffering from a cardiovascular dysfunction cv_dysf from the analyses of blood pressure. Here, we describe such excluded participants and the subsample of participants included in blood pressure analyses.

# filtering participants with bp_drugs or cv_dysf
BPout <- prelqs[prelqs$bp_drugs=="Yes" | prelqs$cv_dysf=="Yes",]
BPin <- prelqs[prelqs$bp_drugs=="No" & prelqs$cv_dysf=="No",]

# sample size for blood pressure
cat(nrow(clean[clean$ID %in% levels(as.factor(as.character(BPin$ID))),]),"ovservations (days) from",
    nlevels(as.factor(as.character(BPin$ID))),"participants included in BP analyses")
## 898 ovservations (days) from 106 participants included in BP analyses
# sociodemographics in excluded participants
summary(BPout$gender); 100*summary(BPout$gender)/nrow(BPout) # gender (freq; %)
## F M 
## 3 5
##    F    M 
## 37.5 62.5
mean(BPout$age); sd(BPout$age) # age (mean, SD)
## [1] 56
## [1] 5.529144
mean(BPout$BMI); sd(BPout$BMI) # BMI (mean, SD)
## [1] 26.49418
## [1] 3.793512
# response rate in included participants
cat("- No. complete responses per participants:",round(mean(BPin$complObs),2),", SD =",round(sd(BPin$complObs),2),
    "\n- response rate per participants:",round(mean(BPin$respRate),2),"%, SD =",round(sd(BPin$respRate),2),
    "%\n- No. complete days (Aft + Eve + Mor) per participants",round(mean(BPin$complDays),2),
    ", SD =",round(sd(BPin$complDays),2),"\n- complete days rate per participants:",round(mean(BPin$complDaysRate),2),
    "%, SD =",round(sd(BPin$complDaysRate),2),"%","\n-",nrow(BPin[BPin$Nweeks==2,]),"on",nrow(BPin),
    "participants involved for two weeks (",round(100*nrow(BPin[BPin$Nweeks==2,])/nrow(BPin)),"% )")
## - No. complete responses per participants: 22.26 , SD = 5.98 
## - response rate per participants: 86.13 %, SD = 12.96 %
## - No. complete days (Aft + Eve + Mor) per participants 6.85 , SD = 2.19 
## - complete days rate per participants: 79.72 %, SD = 18.64 % 
## - 79 on 106 participants involved for two weeks ( 75 % )


3.4. Quantitative variables

Here, we use the multidesc() function for computing the descriptive statistics (mean, SD and ICC) of level-1 and level-2 variables. We can see that WHLSM shows an ICC of .60, indicating that most variance is located at the between-individual level, but within-individual variance is still substantial. Similar results are shown by blood pressure (ICC ranging from .61 to .73) and emotional exhaustion (ICC = .56), whereas higher proportions of within-individual variability are estimated for SD, RDet, and RRel.

# selecting level-1 quantitative variables
lv1 <- c("WHLSM","SBP_aft","DBP_aft", # afternoon
         "SBP_eve","DBP_eve","EE","PD", # evening
         "SD") # next morning

# selecting level-2 quantitative variables
lv2 <- c("age","BMI")

# computing descriptives
desc <- multidesc(long=clean,wide=prelqs,lv1=lv1,lv2=lv2)
kable(desc)
Measure N Mean ICC
WHLSM 847 3.43 (1.54) 0.61
SBP_aft 843 122.18 (19.56) 0.70
DBP_aft 843 78.17 (14.6) 0.61
SBP_eve 841 115.58 (18.22) 0.69
DBP_eve 841 72.96 (14.26) 0.64
EE 841 3.24 (1.57) 0.56
PD 841 4.38 (1.85) 0.35
SD 842 2.57 (1.4) 0.39
age 114 42.12 (12.61) NA
BMI 114 23.91 (3.53) NA


3.4.1. Survey duration

Here, we inspect the mean, standard deviation, and distribution of diary survey durations. We can see that, after excluding a few outliers taking more than 30 minutes, the average response time to diary surveys was 4.02 minutes (SD = 3.51 min).

# computing durations in minutes
clean$dur_aft <- difftime(clean$end_aft,clean$start_aft,units="mins")
clean$dur_eve <- difftime(clean$end_eve,clean$start_eve,units="mins")
clean$dur_mor <- difftime(clean$end_mor,clean$start_mor,units="mins")
vars <- paste0("dur_",c("aft","eve","mor"))
clean[,vars] <- lapply(clean[,vars],as.numeric)
clean$dur_mean <- apply(clean[,c("dur_aft","dur_eve","dur_mor")],1,mean,na.rm=TRUE)

# plotting durations
par(mfrow=c(1,4)); for(Var in c(vars,"dur_mean")){ 
  hist(clean[,Var],breaks=100,main=paste(Var,"N =",length(na.omit(clean[,Var])))) }

# No. cases > 30 min (8 to 15)
for(Var in c(vars,"dur_mean")){ 
  colnames(clean)[which(colnames(clean)==Var)] <- "Var"
  cat(Var,"> 60 min:",nrow(clean[!is.na(clean$Var) & clean$Var > 30,]),"  ") 
  colnames(clean)[which(colnames(clean)=="Var")] <- Var }
## dur_aft > 60 min: 10   dur_eve > 60 min: 8   dur_mor > 60 min: 15   dur_mean > 60 min: 13
# mean and standard deviation (in minutes) without considering such outliers
round(mean(clean$dur_mean[clean$dur_mean<30],na.rm=TRUE),2)
## [1] 4.02
round(sd(clean$dur_mean[clean$dur_mean<30],na.rm=TRUE),2)
## [1] 3.51
# removing variables
clean[,c(vars,"dur_mean")] <- NULL


3.5. Correlations

Second, we use the multicorr function to compute the between-individual (shown below the main diagonal) and the within-individual correlations (shown above the main diagonal) among the same continuous variables.

cors <- multicorr(long=clean,wide=prelqs,lv1=lv1,lv2=lv2)
kable(cors)
WHLSM SBP_aft DBP_aft SBP_eve DBP_eve EE PD SD age BMI
WHLSM 1.00 0.14 0.14 0.04 0.08 0.18 -0.08 0.13 NA NA
SBP_aft 0.12 1.00 0.46 0.18 0.12 0.05 -0.02 0.09 NA NA
DBP_aft 0.13 0.83 1.00 0.10 0.12 0.08 -0.02 0.06 NA NA
SBP_eve 0.11 0.90 0.77 1.00 0.56 0.06 -0.10 0.03 NA NA
DBP_eve 0.04 0.77 0.86 0.87 1.00 0.08 -0.03 0.09 NA NA
EE 0.49 0.24 0.22 0.21 0.17 1.00 -0.13 0.09 NA NA
PD -0.14 -0.01 -0.05 -0.07 -0.08 -0.13 1.00 -0.06 NA NA
SD 0.43 0.09 0.15 0.12 0.13 0.47 -0.16 1.00 NA NA
age -0.14 0.35 0.35 0.34 0.38 -0.05 0.06 0.02 1.00 NA
BMI 0.06 0.33 0.33 0.40 0.40 0.06 0.07 -0.03 0.22 1


Correlations are also graphically visualized below (blue = negative, white = uncorrelated, red = positive).

ggplot(melt(as.matrix(multicorr(long=clean,wide=prelqs,lv1=lv1,lv2=lv2))),aes(x=Var1, y=Var2, fill=value)) + geom_tile() + 
  geom_text(aes(x = Var1, y = Var2, label = round(value,2)),color="black",size=5)+labs(x="",y="") +
  scale_fill_gradient2(low="darkblue",high="#f03b20",mid="white",midpoint=0,limit = c(-1,1), space = "Lab",
                       guide="legend",breaks=round(seq(1,-1,length.out = 11),2))+
  theme(text=element_text(face="bold",size=10),axis.text.x=element_text(angle=30))


3.6. Univariate distributions

Fourth, we visualize the univariate distributions of the focal variables, for each class of variables. We can see that level-1 self-reported predictors show quite skewed distributions. However, person-mean centered scores are approximately normally distributed.

# level-2
par(mfrow=c(3,6)); for(Var in c(lv2,"gender","edu","mStatus","home_partner","children","home_child","position","sector",
                                "smoker","careless","bp_drugs","horm_drugs","psy_drugs","cv_dysf","sleep_dysf")){
  if(class(clean[,Var])%in%c("factor","logical")){ plot(clean[!duplicated(clean$ID),Var],main=Var,xlab="") 
    } else { hist(clean[!duplicated(clean$ID),Var],main=Var,xlab="") }}

# level-1 (composite scores)
par(mfrow=c(3,6)); for(Var in c(lv1,"dailyHassles_eve","lateWorkHours","flagTime",
                                "where_aft","teleWork","confounders_aft","confounders_eve",
                                "flagBP_aft","flagBP_eve")){ 
  if(class(clean[,Var])%in%c("factor","logical")){ plot(clean[!duplicated(clean$ID),Var],main=Var,xlab="") 
    } else { hist(clean[!duplicated(clean$ID),Var],main=Var,xlab="") }}

# level-1 (person-mean-centered scores)
par(mfrow=c(2,4))

for(Var in lv1){ wide <- clean[!duplicated(clean$ID),]
  wide[,paste0(Var,".cm")] <- aggregate(clean[,Var],list(clean$ID),FUN=mean,na.rm=TRUE)[,2]
  clean <- plyr::join(clean,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left")
  clean[,paste0(Var,".mc")] <- clean[,Var] - clean[,paste0(Var,".cm")]
  hist(clean[,paste0(Var,".mc")],main=Var,xlab="") 
  clean <- clean[,1:(ncol(clean)-2)]}


3.7. Bivariate distributions

Fifth, we visualize the distribution of each focal variable (i.e., workaholism, blood pressure, emotional exhaustion, and sleep disturbances) and potential covariate against the following categorical variables:

  1. Demographics: gender, educational level edu, marital status mStatus and living with a partner home_partner, having children children and living with children home_child, job position position and sector

  2. Inclusion criteria: blood pressure bp_drugs, hormonal horm_drugs, and psychoactive medication psy_drugs, cardiovascular cv_dysf and sleep dysfunctions sleep_dysf

  3. Level-2 confounders: being a smoker smoker or a careless respondent careless

  4. Level-1 confounders: daily nonwork hassles in the evening dailyHassles_eve, presence of late working hours in the evening lateWorkHours, atypical response times flagTime

  5. Level-1 covariates: survey location in the afternoon where_aft, remote working teleWork

  6. BP confounders: aggregated confounders score confounders_aft and confounders_eve; coffee coffe_aft, coffe_eve; smoking smoke_aft, smoke_eve; vigorous physical activity sport_aft, sport_eve, having a meal meal_aft, meal_eve; and flagged BP cases flagBP_aft, flagBP_eve (see Supplementary Material S3)


The bivPlot function is used to optimize the data visualization.

bivPlot()

bivPlot <- function(data,resp,preds){ require(ggplot2)
 for(Var in preds){ 
   print(
     ggplot(na.omit(data[,c(resp,Var)]),aes_string(x=Var,y=resp,fill=Var)) + 
       geom_point(col="gray",position=position_jitter(width=.15)) + # data points
       geom_violin(alpha=.4) + geom_boxplot(width=0.3,alpha=0.2) + # violin & boxplot
       ggtitle(paste(resp,"by",Var)) + theme(legend.position="none") # title and removing legend
     )}}


DEMOS

WHLSM

Higher WHLSM can be observed in cases where children = "No" or home_child = "No" (with larger differences for the latter), where partner = "No", and where edu = "university+".

bivPlot(diary,resp="WHLSM",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


BP

Blood pressure is mainly affected by children, with SBP_aft, SBP_eve and morning blood pressure also showing differences by gender, while morning blood pressure is also affected by partner.

SBP_aft

Higher SBP_aft can be observed in cases where gender = "M", children = "Yes" or home_child = "Yes" (with larger differences for the former), with slightly higher SBP_aft in cases where partner = "Yes", where edu = "highschool-", and where position = "employer_mng".

bivPlot(diary,resp="SBP_aft",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


DBP_aft

Higher DBP_aft can be observed in cases where children = "Yes" or home_child = "Yes" (with larger differences for the former), with slightly higher DBP_aft in cases where partner = "Yes", and where sector = "public".

bivPlot(diary,resp="DBP_aft",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


SBP_eve

Higher SBP_eve can be observed in cases where gender = "M", children = "Yes" or home_child = "Yes" (with larger differences for the former), with slightly higher SBP_aft in cases where partner = "Yes", where edu = "highschool+", and where sector = "Public".

bivPlot(diary,resp="SBP_eve",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


DBP_eve

Slightly higher DBP_eve can be observed in cases where children = "Yes" or home_child = "Yes" (with larger differences for the former), were partner = "Yes", and where sector = "public".

bivPlot(diary,resp="DBP_eve",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


EE

Higher EE can be observed in cases where home_child = "No".

bivPlot(diary,resp="EE",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


SD

Higher SD can be observed in cases where gender = "F", where home_child = "Yes", where home_partner = "No", and where position = "employee_proj".

bivPlot(diary,resp="SD",pred=c("gender","edu","children","home_child","partner","home_partner","position","sector"))


INCLUSION

WHLSM

Higher WHLSM can be observed in cases where bp_drugs = "Yes".

bivPlot(diary,resp="WHLSM",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


BP

Blood pressure is mainly affected by bp_drugs, and cv_dysf, which further corroborate the validity of our blood pressure measurements and the importance of our pre-registered exclusion criteria.

SBP_aft

Higher SBP_aft can be observed in cases where bp_drugs = "Yes" and cv_dysf = "Yes", with only a slightly lower SBP_aft in cases where horm_drugs = "No".

bivPlot(diary,resp="SBP_aft",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


DBP_aft

Higher DBP_aft can be observed in cases where bp_drugs = "Yes" and cv_dysf = "Yes", with only a slightly lower DBP_aft in cases where horm_drugs = "No".

bivPlot(diary,resp="DBP_aft",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


SBP_eve

Higher SBP_eve can be observed in cases where bp_drugs = "Yes" and cv_dysf = "Yes".

bivPlot(diary,resp="SBP_eve",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


DBP_eve

Higher DBP_eve can be observed in cases where bp_drugs = "Yes" and cv_dysf = "Yes".

bivPlot(diary,resp="DBP_eve",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


EE

Higher EE can be observed in cases where bp_drugs = "Yes" or psy_drugs = "Yes".

bivPlot(diary,resp="EE",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


SD

SD does not substantially differ across inclusion criteria levels, with only slightly higher SD for those reporting bp_drugs = "Yes". Critically, SD does not substantially differ across sleep_dysf levels, corroborating our choice to not rely on this inclusion criterion (see Supplementary Material S7).

bivPlot(diary,resp="SD",pred=c("bp_drugs", "horm_drugs", "psy_drugs", "cv_dysf", "sleep_dysf"))


LV-2 CONF

WHLSM

WHLSM does not substantially differ across level-2 confounders levels, with only slightly higher WHLSM in those with smoker = "quit_less.

bivPlot(diary,resp="WHLSM",pred=c("smoker","careless"))


BP

Blood pressure is not substantially affected by level-2 confounders. Although it is lower in potentially careless participants, this might be due to the very small number of such cases.

SBP_aft

SBP_aft does not substantially differ across level-2 confounders levels. Although it is lower in potentially careless participants, this might be due to the very small number of such cases.

bivPlot(diary,resp="SBP_aft",pred=c("smoker","careless"))


DBP_aft

DBP_aft is slightly lower in smoker participants. Although it is lower in potentially careless participants, this might be due to the very small number of such cases.

bivPlot(diary,resp="DBP_aft",pred=c("smoker","careless"))


SBP_eve

SBP_eve does not substantially differ across level-2 confounders levels. Although it is lower in potentially careless participants, this might be due to the very small number of such cases.

bivPlot(diary,resp="SBP_eve",pred=c("smoker","careless"))


DBP_eve

DBP_eve is slightly lower in smoker participants. Although it is lower in potentially careless participants, this might be due to the very small number of such cases.

bivPlot(diary,resp="DBP_eve",pred=c("smoker","careless"))


EE

EE does not substantially differ across level-2 confounders levels.

bivPlot(diary,resp="EE",pred=c("smoker","careless"))


SD

SD is lower in individuals with smoker = "Yes".

bivPlot(diary,resp="SD",pred=c("smoker","careless"))


LV-1 CONF

WHLSM

Slightly higher WHLSM can be observed in cases where lateWorkHours = TRUE.

bivPlot(diary,resp="WHLSM",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


BP

Blood pressure is not substantially affected by level-1 confounders.

SBP_aft

SBP_aft does not substantially differ across level-1 confounders levels.

bivPlot(diary,resp="SBP_aft",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


DBP_aft

DBP_aft does not substantially differ across level-1 confounders levels, with only slightly higher DBP_aft in cases where lateWorkHours = TRUE.

bivPlot(diary,resp="DBP_aft",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


SBP_eve

SBP_eve does not substantially differ across level-1 confounders levels, with only slightly higher SBP_eve in cases where lateWorkHours = TRUE.

bivPlot(diary,resp="SBP_eve",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


DBP_eve

DBP_eve does not substantially differ across level-1 confounders levels, with only slightly lower DBP_eve in cases where flagTime = TRUE.

bivPlot(diary,resp="DBP_eve",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


EE

Lower EE can be observed in cases where dailyHassles_eve = "Yes"

bivPlot(diary,resp="EE",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


SD

Higher SD can be observed in cases where dailyHassles_eve = "Yes".

bivPlot(diary,resp="SD",pred=c("dailyHassles_eve","lateWorkHours","flagTime"))


LV-1 COV

WHLSM

Higher WHLSM can be observed in cases where where_aft = "workplace".

bivPlot(diary,resp="WHLSM",pred=c("where_aft","teleWork"))


BP

Blood pressure is not substantially affected by level-1 confounders, with only slightly lower SBP_aft in cases where teleWork = "Yes".

SBP_aft

SBP_aft is slightly lower in cases where teleWork = "teleWork".

bivPlot(diary,resp="SBP_aft",pred=c("where_aft","teleWork"))


DBP_aft

DBP_aft does not substantially differ across the levels of level-1 covariates. Although slightly higher DBP_aft is shown in cases where teleWork = "both", this might be due to the small number of such cases.

bivPlot(diary,resp="DBP_aft",pred=c("where_aft","teleWork"))


SBP_eve

SBP_eve does not substantially differ across the levels of level-1 covariates. Although slightly higher SBP_eve is shown in cases where teleWork = "both" or where where_aft = "other", this might be due to the small number of such cases.

bivPlot(diary,resp="SBP_eve",pred=c("where_aft","teleWork"))


DBP_eve

DBP_eve does not substantially differ across the levels of level-1 covariates. Although slightly higher DBP_eve is shown in cases where teleWork = "both", this might be due to the small number of such cases.

bivPlot(diary,resp="DBP_eve",pred=c("where_aft","teleWork"))


EE

Slightly higher EE can be observed in cases where teleWork = "both".

bivPlot(diary,resp="EE",pred=c("where_aft","teleWork"))


SD

Lower SD can be observed in cases where teleWork = "both".

bivPlot(diary,resp="SD",pred=c("where_aft","teleWork"))


BP CONF

WHLSM

Higher WHLSM can be observed in all cases where confounders = FALSE, with larger differences by confounders_eve. Differences by specific confounder are in line with those showed by the aggregated scores. Lower WHLSM can be observed in cases where flagBP_eve = TRUE.

bivPlot(diary,resp="WHLSM",pred=c("confounders_aft", "confounders_eve",
                                  "coffee_aft", "coffee_eve", "smoke_aft", "smoke_eve", 
                                  "sport_aft", "sport_eve", "meal_aft", "meal_eve", 
                                  "flagBP_aft", "flagBP_eve"))


BP

Only systolic blood pressure is slightly affected by BP confounders.

SBP_aft

Only afternoon confounders are considered for SBP_aft, which is only slightly higher in cases where confounders_aft = TRUE.

bivPlot(diary,resp="SBP_aft",pred=c("confounders_aft","coffee_aft","smoke_aft","sport_aft","meal_aft","flagBP_aft"))


DBP_aft

Only afternoon confounders are considered for DBP_aft, which is only slightly lower in cases where coffe_aft or smoke_aft = 1, slightly higher in cases where sport_aft or meal_aft = TRUE. Although higher DBP_aft is shown in cases where flagBP_aft = TRUE, this might be due to the small number of such cases.

bivPlot(diary,resp="DBP_aft",pred=c("confounders_aft","coffee_aft","smoke_aft","sport_aft","meal_aft","flagBP_aft"))


SBP_eve

Only evening confounders are considered for SBP_eve, which is slightly higher in cases where confounders_eve = TRUE, and higher in cases where flagBP_eve = TRUE.

bivPlot(diary,resp="SBP_eve",pred=c("confounders_eve","coffee_eve","smoke_eve","sport_eve","meal_eve","flagBP_eve"))


DBP_eve

Only evening confounders are considered for DBP_eve, which does not substantially differ across the levels of confounders_eve, whereas slightly higher DBP_eve can be observed in cases where flagBP_eve = TRUE.

bivPlot(diary,resp="DBP_eve",pred=c("confounders_eve","coffee_eve","smoke_eve","sport_eve","meal_eve","flagBP_eve"))


EE

EE does not substantially differ across blood pressure confounder levels, with only higher EE when sport_eve = "TRUE".

bivPlot(diary,resp="EE",pred=c("confounders_aft", "confounders_eve",
                               "coffee_aft", "coffee_eve", "smoke_aft", "smoke_eve",
                               "sport_aft", "sport_eve", "meal_aft", "meal_eve"))


SD

SD does not substantially differ across blood pressure confounder levels, with only a slightly lower SD when smoke_eve = "TRUE".

bivPlot(diary,resp="SD",pred=c("confounders_aft", "confounders_eve",
                               "coffee_aft", "coffee_eve", "smoke_aft", "smoke_eve",
                               "sport_aft", "sport_eve", "meal_aft", "meal_eve"))


4. Covariate selection

As pre-registered, for maximizing model parsimony while minimizing the risk of non-convergence, the covariates to be included in the following regression analyses are selected based on an empirical approach accounting for the following criteria:

  1. The No. of cases in each level, prioritizing categorical covariates with balanced number of cases

  2. The bivariate distributions and correlations with the response variable, prioritizing covariates showing some potential covariance trend with the response variable

  3. Linear modeling, prioritizing the covariates whose inclusion as predictor of the corresponding response variable shows stronger evidence (i.e., higher Akaike weight) than more parsimonious models and absolute t-value of 2 or higher

However, deviating from the pre-registration (see Supplementary Material S7), we also consider theoretical arguments concerning some important covariates. Particularly, we prioritize level-1 over level-2 covariates as our study is focused on within-individual relationships. Moreover, following Spector (2021), we attempt to avoid risking to rule out variables acting as potential exploratory mechanisms (e.g., mediators) of the focused relationships. Theoretical arguments are detailed below for each response variable.

The following packages are used to optimize the analyses.

library(lme4); library(MuMIn)


4.1. Afternoon BP

For afternoon systolic and diastolic blood pressure, the pre-registered potential covariates to be considered are:

  1. gender, in light of the robust literature on sex differences in blood pressure and hypertension (e.g., [Sandberg & Ji, 2012]), with gender having been highlighted as a potential moderator of the straining effects of trait workaholism (e.g., Bladucci et al., 2018; 2021).

  2. age, in light of the consolidated relationship between aging and high blood pressure; however, no clear differences have been highlighted on the relationship between age and workaholism (Clark et al., 2016).

  3. BMI, in light of the robust literature on the increased risk for hypertension and CVD in individuals with higher BMI (e.g., Gregg et al., 2005); however, no clear differences have been highlighted, to our knowledge, on the relationship between BMI and workaholism.

  4. Participants’ smoking status smoker, in light of the widely acknowledged relationship between smoking and hypertension; however, no clear differences have been highlighted, to our knowledge, on the relationship between smoking status and workaholism.

  5. The daily number of worked hours workHours, as long working hours is a definitional aspect of workaholism which has been found positively associated with higher blood pressure and other cardiovascular risks (Virtanen, 2012); however, controlling for this variable might risk to artificially deflate the relationship between workaholism and blood pressure since the former might influence the latter through working hours. That is, working hours is a potential explanatory mechanism of the focused relationship, and including it as a control variable might bias rather than strengthening the results (see Spector et al., 2021).

  6. Remote work teleWork, although with no clear expectations on its relationship with blood pressure, while we originally hypothesized that remote working might act as a moderator of the straining effect of workaholism.

  7. BP confounders_aft identifying behavioral factors (e.g., smoking, physical activity) that might affect blood pressure, although with no clear expectation on their relationship with workaholism.

Further pre-registered level-2 covariates (i.e., retrospective measures of trait workaholism, technostress creators) are not included due to our aim to focus the study on the focused level-1 variables, whereas recovery experiences will be included in all models. Moreover, we do not include the previous BP measure as we focus on the covariance of intra-individual fluctuations between workaholism and blood pressure, rather than the change of the latter over time (see Supplementary material S7). In contrast, additional (i.e., not pre-registered) level-2 covariates potentially moderating the relationship between workaholism and afternoon blood pressure are considered as potentially confounding factors.

Prior to evaluate the inclusion of each covariate, we prepare the data for the analyses. That is, we remove cases of missing responses in the response variable or any covariate (list-wise deletion) and we center level-1 continuous covariates on the individual mean (person-mean-centering). Moreover, we apply our inclusion criteria by removing all cases with bp_drugs or cv_dysf = "Yes".

# inclusion criteria
cleanBP <- clean[clean$bp_drugs=="No" & clean$cv_dysf=="No",]

# list-wise deletion
cleanBP <- as.data.frame(na.omit(cleanBP[,c("ID","day","SBP_aft","DBP_aft",
                                        "gender","age","BMI","smoker","workHours",
                                        "teleWork","confounders_aft",
                                        "home_child","children")]))
cat("Considering",nrow(cleanBP),"complete observations from",nlevels(as.factor(as.character(cleanBP$ID))),"participants")
## Considering 719 complete observations from 106 participants
# mean centering lv-1 continuous covariates
for(Var in c("workHours")){
  wide <- prelqs[prelqs$ID%in%levels(as.factor(as.character(cleanBP$ID))),]
  wide <- cbind(wide,aggregate(cleanBP[,Var],list(cleanBP$ID),mean)[,2]) # computing individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP <- join(cleanBP,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanBP[,paste0(Var,".mc")] <- cleanBP[,Var] - cleanBP[,paste0(Var,".cm")] } # computing mean-centered scores


4.1.1. gender

gender is a categorical variable with a roughly balanced number of participants. In section 3.5 we observed some tendency with higher SBP_aft in men than in women. Consistently, its inclusion in the null model shows improved evidence (i.e., higher Akaike weight) compared to the null model, although the estimated t-value is lower than 2, with a particularly low value for DBP_aft. In both cases, also considering its theoretical relevance as a potential moderator of the straining effects of workaholism (e.g., Balducci et al. (2018; 2021)) we include gender as a covariate.

SBP_aft

# number of cases by covariate level
summary(cleanBP[!duplicated(cleanBP$ID),"gender"]) # No. participants
##  F  M 
## 56 50
summary(cleanBP$gender) # No. cases
##   F   M 
## 389 330
# model comparison
m0 <- lmer(SBP_aft ~ (1|ID),data=cleanBP)
m1 <- lmer(SBP_aft ~ gender + (1|ID),data=cleanBP)
Weights(AIC(m0,m1)) # Akaike weights: stronger evidence including gender
##  model weights 
## [1] 0.059 0.941
summary(m1)$coefficients # coefficient: proximal to |t|=2
##               Estimate Std. Error   t value
## (Intercept) 118.249199   2.138441 55.296928
## genderM       5.785312   3.114885  1.857312


DBP_aft

# model comparison
m0d <- lmer(DBP_aft ~ (1|ID),data=cleanBP)
m1d <- lmer(DBP_aft ~ gender + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d)) # Akaike weights: stronger evidence including gender
##  model weights 
## [1] 0.317 0.683
summary(m1d)$coefficients # coefficient: lower than |t|=2
##               Estimate Std. Error   t value
## (Intercept) 76.7945450   1.598385 48.045090
## genderM      0.2649914   2.328735  0.113792


4.1.2. age

age is a level-2 continuous variable that in section 3.2 showed moderate-to-strong positive relationships with blood pressure (r from .42 to .52). Consistently, its inclusion in the model including gender implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2. Thus, despite the uncertainty on its relationship with workaholism, we include age as a covariate for afternoon blood pressure.

SBP_aft

# model comparison vs null
m1.bis <- lmer(SBP_aft ~ age + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.041 0.959
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error   t value
## (Intercept) 104.2508117  5.2271705 19.944024
## age           0.4070428  0.1218572  3.340327
# model comparison vs gender
m2 <- lmer(SBP_aft ~ gender + age + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.001 0.015 0.984
summary(m2)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 99.6056504  5.4739198 18.196403
## genderM      7.0313855  2.9637550  2.372458
## age          0.4394154  0.1199469  3.663417


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ age + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.049 0.951
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error   t value
## (Intercept) 104.2508117  5.2271705 19.944024
## age           0.4070428  0.1218572  3.340327
# model comparison vs gender
m2d <- lmer(DBP_aft ~ gender + age + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.021 0.044 0.935
summary(m2)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 99.6056504  5.4739198 18.196403
## genderM      7.0313855  2.9637550  2.372458
## age          0.4394154  0.1199469  3.663417


4.1.3. BMI

BMI is a level-2 continuous variable that in section 3.2 showed weak-to-moderate positive relationships with blood pressure (r from .28 to .43). Consistently, its inclusion in the model including gender and age implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2. Thus, despite the uncertainty on its relationship with workaholism, we include BMI as a covariate for afternoon blood pressure.

SBP_aft

# model comparison vs null
m1.bis <- lmer(SBP_aft ~ BMI + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.008 0.992
summary(m1.bis)$coefficients # coefficient: |t| > 2
##              Estimate Std. Error  t value
## (Intercept) 85.026929 10.4387588 8.145310
## BMI          1.515511  0.4355548 3.479496
# model comparison vs previous model
m3 <- lmer(SBP_aft ~ gender + age + BMI + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.001 0.080 0.919
summary(m3)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error  t value
## (Intercept) 75.9904976 10.4542585 7.268856
## genderM      5.3399277  2.9528268 1.808412
## age          0.3781251  0.1189131 3.179845
## BMI          1.1352957  0.4326673 2.623946


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ BMI + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.007 0.993
summary(m1.bisd)$coefficients # coefficient: |t| > 2
##              Estimate Std. Error  t value
## (Intercept) 49.600097  7.6470113 6.486207
## BMI          1.151826  0.3190604 3.610055
# model comparison vs previous model
m3d <- lmer(DBP_aft ~ gender + age + BMI + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.001 0.001 0.029 0.969
summary(m3d)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error    t value
## (Intercept) 42.7168148 7.78109757  5.4898187
## genderM     -0.3646649 2.19626487 -0.1660387
## age          0.2532776 0.08837419  2.8659682
## BMI          1.0105432 0.32190699  3.1392395


4.1.4. smoker

smoker is a level-2 categorical variable that in section 3.5 did not show substantially relationships with blood pressure. Consistently, both models show an absolute t-value lower than 2, although its inclusion implies stronger evidence than more parsimonious models. Also considering the uncertainty of its relationship with workaholism, we do not include it as a covariate for afternoon blood pressure.

SBP_aft

# model comparison vs null
m1.bis <- lmer(SBP_aft ~ smoker + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.155 0.845
summary(m1.bis)$coefficients # coefficient: |t| < 2
##             Estimate Std. Error   t value
## (Intercept) 121.9556   1.844173 66.130213
## smokerYes    -3.5964   3.534608 -1.017482
# model comparison vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + smoker + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.013 0.148 0.838
summary(m4)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error   t value
## (Intercept) 78.0843784 10.6162759  7.355157
## genderM      6.2564672  3.0660002  2.040596
## age          0.3664817  0.1192519  3.073173
## BMI          1.0912172  0.4340473  2.514051
## smokerYes   -3.6844451  3.3666439 -1.094397


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ smoker + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.05 0.95
summary(m1.bis)$coefficients # coefficient: |t| < 2
##             Estimate Std. Error   t value
## (Intercept) 121.9556   1.844173 66.130213
## smokerYes    -3.5964   3.534608 -1.017482
# model comparison vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + smoker + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.003 0.097 0.900
summary(m4d)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 45.0927640 7.84320044  5.7492811
## genderM      0.6816631 2.26441229  0.3010331
## age          0.2403700 0.08793307  2.7335567
## BMI          0.9596918 0.32054971  2.9938940
## smokerYes   -4.1730935 2.48797620 -1.6773044


4.1.5. WorkHours

workHours is a level-1 continuous variable that in section 3.2 was weakly correlated with afternoon blood pressure (r = .12-.04). Here, its inclusion implies stronger evidence (i.e., higher Akaike weight) than more parsimonious models, with an estimated absolute t-value higher than 2. However, we consider the theoretical importance of this variable, which might be a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on blood pressure, and thus, we do not include it as a covariate for afternoon blood pressure.

SBP_aft

# model comparison vs null
m1.bis <- lmer(SBP_aft ~ workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.015 0.985
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error   t value
## (Intercept)  120.976976  1.5735066 76.883679
## workHours.mc   1.039052  0.3140563  3.308489
# model comparison vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.001 0.015 0.984
summary(m4)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error  t value
## (Intercept)  75.9955836 10.4538297 7.269640
## genderM       5.3388469  2.9527772 1.808076
## age           0.3781262  0.1189145 3.179816
## BMI           1.1351249  0.4326554 2.623623
## workHours.mc  1.0390519  0.3140932 3.308100


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.142 0.858
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error   t value
## (Intercept)  120.976976  1.5735066 76.883679
## workHours.mc   1.039052  0.3140563  3.308489
# model comparison vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.004 0.142 0.854
summary(m4d)$coefficients # coefficient: |t| > 2
##                Estimate Std. Error   t value
## (Intercept)  42.7211824 7.78035413  5.490905
## genderM      -0.3652985 2.19609521 -0.166340
## age           0.2532791 0.08836923  2.866146
## BMI           1.0103643 0.32187966  3.138950
## workHours.mc  0.7109242 0.28329330  2.509499


4.1.6. teleWork

teleWork is a level-1 categorical variable that in section 3.5 only showed some slight difference in afternoon blood pressure. Here, whereas its inclusion implies weaker evidence than more parsimonious models, absolute t-values are lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with both workaholism and blood pressure, we do not include it as a covariate for afternoon blood pressure.

SBP_aft

# number of cases by covariate level
summary(cleanBP$teleWork) # currently 4 categories
##   office teleWork     both   dayOff 
##      543      133       43        0
cleanBP$teleWork <- as.factor(gsub("both","teleWork",gsub("dayOff","teleWork",cleanBP$teleWork))) # recoding to 2 categories
summary(cleanBP$teleWork)
##   office teleWork 
##      543      176
# model comparison vs null
m1.bis <- lmer(SBP_aft ~ teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.187 0.813
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)      121.565029   1.627667 74.686690
## teleWorkteleWork  -2.330782   1.572030 -1.482657
# model comparison vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.014 0.165 0.821
summary(m4)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)      76.3138065 10.4787050  7.282752
## genderM           5.6385384  2.9652628  1.901531
## age               0.3740369  0.1191998  3.137899
## BMI               1.1489370  0.4336873  2.649229
## teleWorkteleWork -2.4552154  1.5545308 -1.579393


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.424 0.576
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)      121.565029   1.627667 74.686690
## teleWorkteleWork  -2.330782   1.572030 -1.482657
# model comparison vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.001 0.013 0.426 0.560
summary(m4d)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error    t value
## (Intercept)      42.7764078 7.80143722  5.4831445
## genderM          -0.3118548 2.20747157 -0.1412724
## age               0.2525514 0.08861229  2.8500713
## BMI               1.0129252 0.32275646  3.1383576
## teleWorkteleWork -0.4412502 1.35200750 -0.3263667


4.1.7. confounders_aft

confounders_aft is a level-1 categorical variable that in section 3.5 only showed some slight difference in afternoon blood pressure. Consistently, its inclusion implies weaker evidence than more parsimonious models. However, absolute t-values are lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with workaholism, we do not include it as a covariate for afternoon blood pressure.

SBP_aft

# number of cases by covariate level
summary(cleanBP$confounders_aft)
##    Mode   FALSE    TRUE 
## logical     603     116
# model comparison vs null
m1.bis <- lmer(SBP_aft ~ confounders_aft + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.396 0.604
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                        Estimate Std. Error    t value
## (Intercept)         121.0797775   1.599142 75.7154629
## confounders_aftTRUE  -0.5699072   1.543322 -0.3692729
# model comparison vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + confounders_aft + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.001 0.032 0.371 0.596
summary(m4)$coefficients # coefficient: |t| < 2
##                       Estimate Std. Error    t value
## (Intercept)         76.0718943 10.4567638  7.2748984
## genderM              5.3736525  2.9539259  1.8191562
## age                  0.3804731  0.1190172  3.1967893
## BMI                  1.1330399  0.4327424  2.6182782
## confounders_aftTRUE -0.7757918  1.5303890 -0.5069246


DBP_aft

# model comparison vs null
m1.bisd <- lmer(DBP_aft ~ confounders_aft + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.415 0.585
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                        Estimate Std. Error    t value
## (Intercept)         121.0797775   1.599142 75.7154629
## confounders_aftTRUE  -0.5699072   1.543322 -0.3692729
# model comparison vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + confounders_aft + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.001 0.012 0.391 0.597
summary(m4d)$coefficients # coefficient: |t| > 2
##                       Estimate Std. Error    t value
## (Intercept)         42.8075146 7.77106123  5.5085803
## genderM             -0.3255433 2.19385493 -0.1483887
## age                  0.2558796 0.08833487  2.8967000
## BMI                  1.0080372 0.32146015  3.1358076
## confounders_aftTRUE -0.8695439 1.34340881 -0.6472668


4.1.8. Other covariates

In addition to the pre-registered covariates, we consider a further level-2 covariate that in section 3.5 showed substantial trends in both afternoon blood pressure and workaholism, and whose potential influence on both variables can be theoretically argued, namely having children children or living with children home_child. Indeed, respondents reporting to live with their children reported higher afternoon blood pressure, whereas those reporting to have children reported slightly lower workaholism (see section 3.5). Theoretically, it is plausible although not consistently reported by previous research (see Clark et al., 2016) that workaholism levels and overall investment in the work vs. family domain are influenced by family needs and presence of children in the household. On the other hand, family needs and living with children might negatively impact on blood pressure. Thus, both children and home_child might be a common external variable influencing both workaholism and afternoon, and we consider it as a further potential covariate.

Although both children and home_child have an acceptably balanced number of cases per level and both imply stronger evidence than more parsimonious models, none of them show an absolute t value higher than 2. Thus, also in this case, we do not include these two variables as covariates for afternoon blood pressure.

SBP_aft

# number of cases by covariate level
summary(cleanBP[!duplicated(cleanBP$ID),"children"]) # children: No. participants
##  No Yes 
##  55  51
summary(cleanBP$children) # children: No. cases
##  No Yes 
## 389 330
summary(cleanBP[!duplicated(cleanBP$ID),"home_child"]) # home_child: No. participants
##  No Yes 
##  66  40
summary(cleanBP$home_child) # home_child: No. cases
##  No Yes 
## 454 265
# model comparison children vs null
m1.bis <- lmer(SBP_aft ~ children + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.02 0.98
summary(m1.bis)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 117.406750   2.132033 55.067976
## childrenYes   7.443637   3.079216  2.417381
# model comparison home_child vs null
m1.bis <- lmer(SBP_aft ~ home_child + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.03 0.97
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                 Estimate Std. Error   t value
## (Intercept)   118.321044   1.957441 60.446809
## home_childYes   7.050187   3.190032  2.210068
# model comparison children vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + children + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.017 0.201 0.782
summary(m4)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error   t value
## (Intercept) 76.3480979 10.8616067 7.0291717
## genderM      5.3307009  2.9678555 1.7961457
## age          0.3620579  0.1730404 2.0923323
## BMI          1.1373504  0.4350812 2.6141107
## childrenYes  0.5394472  4.2020256 0.1283779
# model comparison home_child vs previous model
m4 <- lmer(SBP_aft ~ gender + age + BMI + home_child + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.018 0.211 0.770
summary(m4)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error   t value
## (Intercept)   76.8276612 10.9164560 7.0377842
## genderM        5.4351193  2.9860037 1.8201984
## age            0.3530459  0.1493131 2.3644662
## BMI            1.1246307  0.4362791 2.5777780
## home_childYes  1.0671470  3.8114921 0.2799814


DBP_aft

# model comparison children vs null
m1.bisd <- lmer(DBP_aft ~ children + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.055 0.945
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                 Estimate Std. Error   t value
## (Intercept)   118.321044   1.957441 60.446809
## home_childYes   7.050187   3.190032  2.210068
# model comparison home_child vs null
m1.bisd <- lmer(DBP_aft ~ home_child + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.094 0.906
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                 Estimate Std. Error   t value
## (Intercept)   118.321044   1.957441 60.446809
## home_childYes   7.050187   3.190032  2.210068
# model comparison children vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + children + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.007 0.242 0.751
summary(m4d)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 41.9172261  8.0757799  5.1904864
## genderM     -0.3432938  2.2059915 -0.1556188
## age          0.2898331  0.1284984  2.2555391
## BMI          1.0052550  0.3234879  3.1075510
## childrenYes -1.2278268  3.1216864 -0.3933216
# model comparison home_child vs previous model
m4d <- lmer(DBP_aft ~ gender + age + BMI + home_child + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.007 0.238 0.755
summary(m4d)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)   41.3410570  8.1077717  5.0989419
## genderM       -0.5201802  2.2160967 -0.2347281
## age            0.2949959  0.1109493  2.6588355
## BMI            1.0274123  0.3239097  3.1719098
## home_childYes -1.7699884  2.8327357 -0.6248336


4.2. Evening BP

For evening systolic and diastolic blood pressure, the pre-registered potential covariates to be considered are:

  1. gender, in light of the robust literature on sex differences in blood pressure and hypertension (e.g., [Sandberg & Ji, 2012]), with gender having been highlighted as a potential moderator of the straining effects of trait workaholism (e.g., Bladucci et al., 2018; 2021).

  2. age, in light of the consolidated relationship between aging and high blood pressure; however, no clear differences have been highlighted on the relationship between age and workaholism (Clark et al., 2016).

  3. BMI, in light of the robust literature on the increased risk for hypertension and CVD in individuals with higher BMI (e.g., Gregg et al., 2005); however, no clear differences have been highlighted, to our knowledge, on the relationship between BMI and workaholism.

  4. Participants’ smoking status smoker, in light of the widely acknowledged relationship between smoking and hypertension; however, no clear differences have been highlighted, to our knowledge, on the relationship between smoking status and workaholism.

  5. The daily number of worked hours workHours, as long working hours is a definitional aspect of workaholism which has been found positively associated with higher blood pressure and other cardiovascular risks (Virtanen, 2012); however, controlling for this variable might risk to artificially deflate the relationship between workaholism and blood pressure since the former might influence the latter through working hours. That is, working hours is a potential explanatory mechanism of the focused relationship, and including it as a control variable might bias rather than strengthening the results (see Spector et al., 2021).

  6. The occurrence of late working hours in the evening lateWorkHours, consistently with what argued above for workHours; also in this case, controlling for this variable might risk to rule out a potential explanatory mechanism of the relationship between workaholism and blood pressure.

  7. Nonwork hassles in the evening dailyHassles_eve, as hassles have been related to high blood pressure (e.g., Nyklíček et al. 1999) and nonwork hassles such as relationship tension have been recently related to state workaholism (Clark et al., 2021); also in this case, such an argument imply that nonwork hassles are a potential explanatory mechanism of the focused relationship.

  8. Remote work teleWork, although with no clear expectations on its relationship with blood pressure, while we originally hypothesized that remote working might act as a moderator of the straining effect of workaholism.

  9. BP confounders_eve identifying behavioral factors (e.g., smoking, physical activity) that might affect blood pressure, although with no clear expectation on their relationship with workaholism.

Further pre-registered level-2 covariates (i.e., retrospective measures of trait workaholism, technostress creators) are not included due to our aim to focus the study on the focused level-1 variables, whereas recovery experiences will be included in all models. Moreover, we do not include the previous BP measure as we focus on the covariance of intra-individual fluctuations between workaholism and blood pressure, rather than the change of the latter over time (see Supplementary material S7). In contrast, additional (i.e., not pre-registered) level-2 covariates potentially moderating the relationship between workaholism and evening blood pressure are considered as potentially confounding factors.

Prior to evaluate the inclusion of each covariate, we prepare the data for the analyses. That is, we remove cases of missing responses in the response variable or any covariate (list-wise deletion) and we center level-1 continuous covariates on the individual mean (person-mean-centering). Moreover, we apply our inclusion criteria by removing all cases with bp_drugs or cv_dysf = "Yes".

# inclusion criteria
cleanBP <- clean[clean$bp_drugs=="No" & diary$cv_dysf=="No",]
## Warning in clean$bp_drugs == "No" & diary$cv_dysf == "No": longer object length
## is not a multiple of shorter object length
# list-wise deletion
cleanBP <- as.data.frame(na.omit(cleanBP[,c("ID","day","SBP_eve","DBP_eve",
                                        "gender","age","BMI","smoker","workHours",
                                        "lateWorkHours","dailyHassles_eve","teleWork","confounders_eve",
                                        "home_child","children")]))
cat("Considering",nrow(cleanBP),"complete observations from",nlevels(as.factor(as.character(cleanBP$ID))),"participants")
## Considering 692 complete observations from 104 participants
# mean centering lv-1 continuous covariates
for(Var in c("workHours")){
  wide <- prelqs[prelqs$ID%in%levels(as.factor(as.character(cleanBP$ID))),]
  wide <- cbind(wide,aggregate(cleanBP[,Var],list(cleanBP$ID),mean)[,2]) # computing individual means
  colnames(wide)[ncol(wide)] <- paste0(Var,".cm")
  cleanBP <- join(cleanBP,wide[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanBP[,paste0(Var,".mc")] <- cleanBP[,Var] - cleanBP[,paste0(Var,".cm")] } # computing mean-centered scores


4.2.1. gender

gender is a categorical variable with a roughly balanced number of participants. In section 3.5 we observed some tendency with higher SBP_aft in men than in women. Consistently, its inclusion in the null model shows improved evidence (i.e., higher Akaike weight) compared to the null model, although the estimated t-value is lower than 2, with a particularly low value for DBP_eve. In both cases, also considering its theoretical relevance as a potential moderator of the straining effects of workaholism (e.g., Balducci et al. (2018; 2021)) we include gender as a covariate for evening blood pressure.

SBP_eve

# number of cases by covariate level
summary(cleanBP[!duplicated(cleanBP$ID),"gender"]) # No. participants
##  F  M 
## 56 48
summary(cleanBP$gender) # No. cases
##   F   M 
## 378 314
# model comparison
m0 <- lmer(SBP_eve ~ (1|ID),data=cleanBP)
m1 <- lmer(SBP_eve ~ gender + (1|ID),data=cleanBP)
Weights(AIC(m0,m1)) # Akaike weights: stronger evidence including gender
##  model weights 
## [1] 0.182 0.818
summary(m1)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 112.772030   2.047974 55.0651613
## genderM       2.947148   3.009381  0.9793205


DBP_eve

# model comparison
m0d <- lmer(DBP_eve ~ (1|ID),data=cleanBP)
m1d <- lmer(DBP_eve ~ gender + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d)) # Akaike weights: stronger evidence including gender
##  model weights 
## [1] 0.283 0.717
summary(m1d)$coefficients # coefficient: |t| < 2
##              Estimate Std. Error    t value
## (Intercept) 72.612532   1.623491 44.7261620
## genderM     -1.276225   2.385144 -0.5350723


4.2.2. age

age is a level-2 continuous variable that in section 3.2 showed moderate-to-strong positive relationships with blood pressure (r from .42 to .52). Consistently, its inclusion in the model including gender implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2. Thus, despite the uncertainty on its relationship with workaholism, we include age as a covariate for evening blood pressure.

SBP_eve

# model comparison vs null
m1.bis <- lmer(SBP_eve ~ age + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.092 0.908
summary(m1.bis)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 99.4140642  5.0313896 19.758769
## age          0.3586221  0.1174414  3.053627
# model comparison vs gender
m2 <- lmer(SBP_eve ~ gender + age + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.013 0.060 0.926
summary(m2)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 96.7850331   5.353289 18.079544
## genderM      4.0251342   2.902976  1.386555
## age          0.3772338   0.117619  3.207252


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ age + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.02 0.98
summary(m1.bisd)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 58.3154142 3.90114715 14.948273
## age          0.3339043 0.09107584  3.666222
# model comparison vs gender
m2d <- lmer(DBP_eve ~ gender + age + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.009 0.023 0.968
summary(m2d)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 58.5253156 4.19231174 13.960154
## genderM     -0.3232550 2.27397847 -0.142154
## age          0.3324499 0.09212372  3.608733


4.2.3. BMI

BMI is a level-2 continuous variable that in section 3.2 showed weak-to-moderate positive relationships with blood pressure (r from .28 to .43). Consistently, its inclusion in the model including gender and age implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2. Thus, despite the uncertainty on its relationship with workaholism, we include BMI as a covariate for evening blood pressure.

SBP_eve

# model comparison vs null
m1.bis <- lmer(SBP_eve ~ BMI + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.001 0.999
summary(m1.bis)$coefficients # coefficient: |t| > 2
##              Estimate Std. Error  t value
## (Intercept) 74.637445  9.6936361 7.699634
## BMI          1.666018  0.4047412 4.116254
# model comparison vs previous model
m3 <- lmer(SBP_eve ~ gender + age + BMI + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.008 0.992
summary(m3)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 66.7536942  9.9521132 6.7074895
## genderM      1.8651042  2.8177119 0.6619215
## age          0.3015323  0.1134012 2.6589857
## BMI          1.4399848  0.4105817 3.5071816


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ BMI + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.002 0.998
summary(m1.bisd)$coefficients # coefficient: |t| > 2
##              Estimate Std. Error  t value
## (Intercept) 41.647371  7.6992896 5.409249
## BMI          1.281191  0.3214748 3.985353
# model comparison vs previous model
m3d <- lmer(DBP_eve ~ gender + age + BMI + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.005 0.995
summary(m3d)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error    t value
## (Intercept) 33.7373006 7.75857430  4.3483892
## genderM     -2.1071024 2.19458836 -0.9601356
## age          0.2703706 0.08827595  3.0627886
## BMI          1.1879624 0.32009100  3.7113271


4.2.4. smoker

smoker is a level-2 categorical variable that in section 3.5 did not show substantially relationships with blood pressure. Consistently, both models show an absolute t-value lower than 2 when the other covariates are considered, although its inclusion implies stronger evidence than more parsimonious models. Also considering the uncertainty of its relationship with workaholism, we do not include it as a covariate for evening blood pressure.

SBP_eve

# model comparison vs null
m1.bis <- lmer(SBP_eve ~ smoker + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.178 0.822
summary(m1.bis)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 114.979132   1.770017 64.9593428
## smokerYes    -3.013209   3.348420 -0.8998896
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + smoker + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.213 0.786
summary(m4)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 67.9810435 10.1460246  6.7002640
## genderM      2.4284192  2.9485341  0.8236022
## age          0.2944551  0.1142132  2.5781170
## BMI          1.4147582  0.4134176  3.4221048
## smokerYes   -2.1451698  3.2071411 -0.6688729


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ smoker + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.06 0.94
summary(m1.bisd)$coefficients # coefficient: |t| > 2
##              Estimate Std. Error   t value
## (Intercept) 73.437284   1.377685 53.304850
## smokerYes   -5.072819   2.605867 -1.946692
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + smoker + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.001 0.155 0.845
summary(m4d)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 35.6083679 7.85886356  4.5309818
## genderM     -1.2444063 2.28168622 -0.5453889
## age          0.2595295 0.08832129  2.9384706
## BMI          1.1495439 0.32023108  3.5897325
## smokerYes   -3.2765622 2.48102605 -1.3206481


4.2.5. WorkHours

workHours is a level-1 continuous variable that in section 3.2 was not substantially correlated with evening blood pressure (r = .03-.06). Here, its inclusion implies weaker evidence (i.e., lower Akaike weight) than more parsimonious models, with an estimated absolute t-value lower than 2. Thus, also considering the theoretical importance of this variable, which might be a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on blood pressure, we do not include it as a covariate for evening blood pressure.

SBP_eve

# model comparison vs null
m1.bis <- lmer(SBP_eve ~ workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.783 0.217
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                  Estimate Std. Error     t value
## (Intercept)  114.13682845  1.5009580 76.04265396
## workHours.mc   0.02148807  0.3004189  0.07152703
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.006 0.778 0.216
summary(m4)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)  66.75274308  9.9521610 6.70736164
## genderM       1.86520431  2.8177044 0.66195883
## age           0.30152409  0.1134005 2.65893175
## BMI           1.44003076  0.4105838 3.50727617
## workHours.mc  0.02148807  0.3004662 0.07151576


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.799 0.201
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)  72.02074791  1.1848960 60.7823382
## workHours.mc -0.08479742  0.2585833 -0.3279307
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + workHours.mc + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.004 0.796 0.200
summary(m4d)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)  33.73656247 7.75869758  4.3482250
## genderM      -2.10699373 2.19460644 -0.9600782
## age           0.27036578 0.08827629  3.0627223
## BMI           1.18799666 0.32009611  3.7113749
## workHours.mc -0.08479742 0.25853889 -0.3279871


4.2.6. lateWorkHours

lateWorkHours is a level-1 categorical variable that in section 3.5 only showed slight differences in evening systolic blood pressure. Consistently, its inclusion implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2 for SBP_eve. However, we consider its role as a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on blood pressure. Thus, also in light of the unbalanced number of cases, we do not include it as a covariate for evening blood pressure.

SBP_eve

# summary of cases
summary(cleanBP$lateWorkHours)
##    Mode   FALSE    TRUE 
## logical     530     162
# model comparison vs null
m1.bis <- lmer(SBP_eve ~ lateWorkHours + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.072 0.928
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                     Estimate Std. Error   t value
## (Intercept)       113.488306   1.522966 74.517927
## lateWorkHoursTRUE   2.607868   1.169246  2.230385
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + lateWorkHours + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.000 0.056 0.943
summary(m4)$coefficients # coefficient: |t| < 2
##                     Estimate Std. Error   t value
## (Intercept)       65.6998746  9.8959439 6.6390710
## genderM            1.9966948  2.7994116 0.7132552
## age                0.2998013  0.1126424 2.6615311
## BMI                1.4562411  0.4079060 3.5700411
## lateWorkHoursTRUE  2.7321405  1.1628043 2.3496133


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ lateWorkHours + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.459 0.541
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##                     Estimate Std. Error    t value
## (Intercept)       71.8475051   1.208679 59.4429936
## lateWorkHoursTRUE  0.6972278   1.004637  0.6940097
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + lateWorkHours + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.438 0.559
summary(m4d)$coefficients # coefficient: |t| < 2
##                     Estimate Std. Error    t value
## (Intercept)       33.4270451 7.74499888  4.3159522
## genderM           -2.0683839 2.18856218 -0.9450880
## age                0.2698522 0.08801337  3.0660368
## BMI                1.1927294 0.31920098  3.7366095
## lateWorkHoursTRUE  0.8089683 0.99692009  0.8114675


4.2.7. dailyHassles_eve

dailyHassles_eve is a level-1 categorical variable that in section 3.5 predicted slightly higher evening systolic blood pressure. Consistently, its inclusion implies stronger evidence (i.e., higher Akaike weight) than more parsimonious models, with an estimated absolute t-value higher than 2 for both systolic and diastolic evening blood pressure. However, the variable shows a strongly unbalanced number of cases, with only 10% of cases with some evening hassle. Moreover, we consider the theoretical importance of this variable, which might be a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain. Thus, we do not include it as a covariate for evening blood pressure.

SBP_eve

# number of cases by covariate level
summary(cleanBP$dailyHassles_eve)
##  No Yes 
## 620  72
# model comparison vs null
m1.bis <- lmer(SBP_eve ~ dailyHassles_eve + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.045 0.955
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                       Estimate Std. Error   t value
## (Intercept)         113.796757   1.512925 75.216380
## dailyHassles_eveYes   3.382891   1.430865  2.364227
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + dailyHassles_eve + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.000 0.041 0.959
summary(m4)$coefficients # coefficient: |t| > 2
##                       Estimate Std. Error   t value
## (Intercept)         66.0268707  9.9807438 6.6154258
## genderM              2.0319644  2.8255272 0.7191452
## age                  0.2990615  0.1136900 2.6305004
## BMI                  1.4570446  0.4116337 3.5396631
## dailyHassles_eveYes  3.4402674  1.4282481 2.4087324


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ dailyHassles_eve + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.022 0.978
summary(m1.bisd)$coefficients # coefficient: |t| > 2
##                      Estimate Std. Error   t value
## (Intercept)         71.685385   1.196960 59.889560
## dailyHassles_eveYes  3.330774   1.226915  2.714755
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + dailyHassles_eve + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.000 0.023 0.977
summary(m4d)$coefficients # coefficient: |t| > 2
##                       Estimate Std. Error    t value
## (Intercept)         33.0442605 7.80296420  4.2348343
## genderM             -1.9474501 2.20697544 -0.8824068
## age                  0.2679757 0.08875228  3.0193674
## BMI                  1.2041648 0.32180164  3.7419473
## dailyHassles_eveYes  3.3028539 1.22338067  2.6997761


4.2.8. teleWork

teleWork is a level-1 categorical variable that in section 3.5 only showed some slight difference in evening blood pressure. Here, although its inclusion implies stronger evidence than more parsimonious models, absolute t-values are lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with both workaholism and blood pressure, we do not include it as a covariate for evening blood pressure.

SBP_eve

# number of cases by covariate level
summary(cleanBP$teleWork) # currently 4 categories
##   office teleWork     both   dayOff 
##      521      129       42        0
cleanBP$teleWork <- as.factor(gsub("both","teleWork",gsub("dayOff","teleWork",cleanBP$teleWork))) # recoding to 2 categories
summary(cleanBP$teleWork)
##   office teleWork 
##      521      171
# model comparison vs null
m1.bis <- lmer(SBP_eve ~ teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.323 0.677
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error    t value
## (Intercept)      113.794472   1.544992 73.6537680
## teleWorkteleWork   1.366617   1.508391  0.9060097
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.003 0.335 0.663
summary(m4)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)      66.6300806  9.9413202 6.7023372
## genderM           1.7281196  2.8189077 0.6130458
## age               0.3030699  0.1132787 2.6754370
## BMI               1.4317496  0.4102103 3.4902823
## teleWorkteleWork  1.2733757  1.4912985 0.8538705


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.379 0.621
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##                   Estimate Std. Error    t value
## (Intercept)      71.760041   1.224678 58.5950051
## teleWorkteleWork  1.039961   1.282581  0.8108345
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + teleWork + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.361 0.637
summary(m4d)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error    t value
## (Intercept)      33.6242929 7.73173940  4.3488653
## genderM          -2.2298695 2.19081519 -1.0178264
## age               0.2717364 0.08796724  3.0890637
## BMI               1.1805730 0.31905459  3.7002226
## teleWorkteleWork  1.1519514 1.26191981  0.9128563


4.2.9. confounders_eve

confounders_eve is a level-1 categorical variable that in section 3.5 showed some slight difference in afternoon blood pressure. Here, although its inclusion implies weaker evidence than more parsimonious models, absolute t-values are lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with workaholism, we do not include it as a covariate for evening blood pressure.

SBP_eve

# number of cases by covariate level
summary(cleanBP$confounders_eve)
##    Mode   FALSE    TRUE 
## logical     556     136
# model comparison vs null
m1.bis <- lmer(SBP_eve ~ confounders_eve + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.408 0.592
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                        Estimate Std. Error    t value
## (Intercept)         114.2968993   1.531994 74.6066118
## confounders_eveTRUE  -0.7463954   1.353309 -0.5515335
# model comparison vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + confounders_eve + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.003 0.415 0.582
summary(m4)$coefficients # coefficient: |t| < 2
##                       Estimate Std. Error    t value
## (Intercept)         66.9646776  9.9856414  6.7060968
## genderM              1.9679221  2.8324620  0.6947744
## age                  0.3032453  0.1137364  2.6662115
## BMI                  1.4321009  0.4118961  3.4768496
## confounders_eveTRUE -0.6633106  1.3466258 -0.4925723


DBP_eve

# model comparison vs null
m1.bisd <- lmer(DBP_eve ~ confounders_eve + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.477 0.523
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##                       Estimate Std. Error    t value
## (Intercept)         71.9611667   1.210820 59.4317760
## confounders_eveTRUE  0.2791632   1.156894  0.2413041
# model comparison vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + confounders_eve + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.469 0.528
summary(m4d)$coefficients # coefficient: |t| > 2
##                      Estimate Std. Error    t value
## (Intercept)         33.609966 7.76754741  4.3269728
## genderM             -2.169489 2.20197992 -0.9852447
## age                  0.269359 0.08832794  3.0495338
## BMI                  1.192690 0.32039420  3.7225691
## confounders_eveTRUE  0.401611 1.14812688  0.3497967


4.2.10. Other covariates

In addition to the pre-registered covariates, we consider a further level-2 covariate that in section 3.5 showed substantial trends in both evening blood pressure and workaholism, and whose potential influence on both variables can be theoretically argued, namely having children children or living with children home_child. Indeed, respondents reporting to live with their children reported higher evening blood pressure, whereas those reporting to have children reported slightly lower workaholism (see section 3.5). Theoretically, it is plausible although not consistently reported by previous research (see Clark et al., 2016) that workaholism levels and overall investment in the work vs. family domain are influenced by family needs and presence of children in the household. On the other hand, family needs and living with children might negatively impact on blood pressure. Thus, both children and home_child might be a common external variable influencing both workaholism and evening, and we consider it as a further potential covariate.

Although both children and home_child have an acceptably balanced number of cases per level and both imply stronger evidence than more parsimonious models, none of them show an absolute t value higher than 2. Thus, also in this case, we do not include these two variables as covariates for evening blood pressure.

SBP_eve

# number of cases by covariate level
summary(cleanBP[!duplicated(cleanBP$ID),"children"]) # children: No. participants
##  No Yes 
##  54  50
summary(cleanBP$children) # children: No. cases
##  No Yes 
## 384 308
summary(cleanBP[!duplicated(cleanBP$ID),"home_child"]) # home_child: No. participants
##  No Yes 
##  65  39
summary(cleanBP$home_child) # home_child: No. cases
##  No Yes 
## 446 246
# model comparison children vs null
m1.bis <- lmer(SBP_eve ~ children + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.044 0.956
summary(m1.bis)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept) 111.253421   2.043111 54.452940
## childrenYes   6.052529   2.961321  2.043861
# model comparison home_child vs null
m1.bis <- lmer(SBP_eve ~ home_child + (1|ID),data=cleanBP)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.071 0.929
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error   t value
## (Intercept)   112.128619   1.875623 59.782080
## home_childYes   5.403577   3.077756  1.755687
# model comparison children vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + children + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.214 0.784
summary(m4)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error     t value
## (Intercept) 66.6125958 10.3254484  6.45130299
## genderM      1.8685767  2.8328983  0.65959896
## age          0.3083002  0.1636152  1.88430051
## BMI          1.4387451  0.4129912  3.48371830
## childrenYes -0.2271017  3.9672903 -0.05724352
# model comparison home_child vs previous model
m4 <- lmer(SBP_eve ~ gender + age + BMI + home_child + (1|ID),data=cleanBP)
Weights(AIC(m0,m1,m2,m3,m4)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.002 0.226 0.773
summary(m4)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)   66.0912873 10.3746008  6.3704897
## genderM        1.7842699  2.8503310  0.6259869
## age            0.3217752  0.1414442  2.2749274
## BMI            1.4481325  0.4139393  3.4984179
## home_childYes -0.8711060  3.6150390 -0.2409672


DBP_eve

# model comparison children vs null
m1.bisd <- lmer(DBP_eve ~ children + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.032 0.968
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##              Estimate Std. Error  t value
## (Intercept) 69.461465   1.604318 43.29656
## childrenYes  5.381759   2.327368  2.31238
# model comparison home_child vs null
m1.bisd <- lmer(DBP_eve ~ home_child + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1.bisd)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.073 0.927
summary(m1.bisd)$coefficients # coefficient: |t| < 2
##                Estimate Std. Error   t value
## (Intercept)   70.336214   1.477690 47.598754
## home_childYes  4.539922   2.426653  1.870858
# model comparison children vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + children + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.001 0.255 0.744
summary(m4d)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept) 33.2719874  8.0446895  4.1358945
## genderM     -2.0934794  2.2056867 -0.9491282
## age          0.2919544  0.1272977  2.2934770
## BMI          1.1845708  0.3218551  3.6804475
## childrenYes -0.7287210  3.0872911 -0.2360390
# model comparison home_child vs previous model
m4d <- lmer(DBP_eve ~ gender + age + BMI + home_child + (1|ID),data=cleanBP)
Weights(AIC(m0d,m1d,m2d,m3d,m4d)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.000 0.000 0.001 0.228 0.771
summary(m4d)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)   32.1652186  8.0651917  3.9881530
## genderM       -2.2924693  2.2132622 -1.0357875
## age            0.3181343  0.1099083  2.8945428
## BMI            1.2073609  0.3217968  3.7519356
## home_childYes -2.0562008  2.8095946 -0.7318496


4.3. Emotional Exhaustion

For emotional exhaustion, the pre-registered potential covariates to be considered are:

  1. gender, as previous evidence highlighted higher emotional exhaustion in women compared to men (e.g., Purvanova et al 2010) and gender has been highlighted as a potential moderator of the straining effects of trait workaholism (e.g., Bladucci et al., 2018; 2021).

  2. age, as previous evidence highlighted some emotional exhaustion trend over age (e.g., Brewer et al., 2004); however, no clear differences have been highlighted for workaholism over age (Clark et al., 2016).

  3. The daily number of worked hours workHours, as long working hours is a definitional aspect of workaholism which has been found associated with emotional exhaustion (Seidler et al, 2014); however, controlling for this variable might risk to artificially deflate the relationship between workaholism and sleep disturbances since the former might influence the latter through working hours. That is, working hours is a potential explanatory mechanism of the focused relationship, and including it as a control variable might bias rather than strengthening the results (see Spector et al., 2021).

  4. The occurrence of late working hours in the evening lateWorkHours, consistently with what argued above for workHours; also in this case, controlling for this variable might risk to rule out a potential explanatory mechanism of the relationship between workaholism and sleep disturbances.

  5. Nonwork hassles in the evening dailyHassles_eve, as private life hassles have been related to emotional exhaustion (e.g., Klusmann et al., 2021) and nonwork hassles such as relationship tension have been recently related to state workaholism (Clark et al., 2021); also in this case, such an argument imply that nonwork hassles are a potential explanatory mechanism of the focused relationship.

  6. Remote work teleWork, as emotional exhaustion might be different during remote work days (e.g., Abdel Hadi et al., 2021), although with no clear expectations on its relationship with workaholism.

Further pre-registered level-2 covariates (i.e., retrospective measures of trait workaholism, technostress creators) are not included due to our aim to focus the study on the focused level-1 variables, whereas recovery experiences will be included in all models (see Supplementary material S7). Blood pressure confounders are not considered as well, due to the lack of clear link with exhaustion and workaholism. In contrast, additional (i.e., not pre-registered) level-2 covariates potentially moderating the relationship between workaholism and emotional exhaustion are considered as potentially confounding factors.

Prior to evaluate the inclusion of each covariate, we prepare the data for the analyses. That is, we remove cases of missing responses in the response variable or any covariate (list-wise deletion) and we center level-1 continuous covariates on the individual mean (person-mean-centering).

# list-wise deletion culo
cleanEE <- as.data.frame(na.omit(clean[,c("ID","day","EE","gender","age","workHours","lateWorkHours",
                                          "dailyHassles_eve","teleWork","home_child","children")]))
cat("Considering",nrow(cleanEE),"complete observations from",nlevels(as.factor(as.character(cleanEE$ID))),"participants")
## Considering 774 complete observations from 114 participants
# mean centering lv-1 continuous covariates
for(Var in c("workHours")){
  prelqs <- cbind(prelqs,aggregate(cleanEE[,Var],list(cleanEE$ID),mean)[,2]) # computing individual means
  colnames(prelqs)[ncol(prelqs)] <- paste0(Var,".cm")
  cleanEE <- join(cleanEE,prelqs[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanEE[,paste0(Var,".mc")] <- cleanEE[,Var] - cleanEE[,paste0(Var,".cm")] } # computing mean-centered scores


4.3.1. gender

gender is a categorical variable with a roughly balanced number of participants. In section 3.5 we did not observed substantial gender differences in emotional exhaustion. Consistently, its inclusion in the null model shows weaker evidence (i.e., lower Akaike weight), with an estimated t-value lower than 2. However, considering its theoretical relevance as a potential moderator of the straining effects of workaholism (e.g., Balducci et al. (2018)) we include gender as a covariate for sleep disturbances.

# number of cases by covariate level
summary(cleanEE[!duplicated(cleanEE$ID),"gender"]) # No. participants
##  F  M 
## 59 55
summary(cleanEE$gender) # No. cases
##   F   M 
## 411 363
# model comparison
m0 <- lmer(EE ~ (1|ID),data=cleanEE)
m1 <- lmer(EE ~ gender + (1|ID),data=cleanEE)
Weights(AIC(m0,m1)) # Akaike weights: weaker evidence including gender
##  model weights 
## [1] 0.725 0.275
summary(m1)$coefficients # coefficient: |t| < 2
##              Estimate Std. Error   t value
## (Intercept) 3.1002605  0.1608989 19.268382
## genderM     0.2485523  0.2318810  1.071896


4.3.2. age

age is a level-2 continuous variable that in section 3.2 was uncorrelated with emotional exhaustion (r = 0.00). Consistently, its inclusion in the model including gender implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering the uncertainty on its relationship with workaholism, we do not include it as a covariate for emotional exhaustion.

# model comparison vs null
m1.bis <- lmer(EE ~ age + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.99 0.01
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                 Estimate  Std. Error    t value
## (Intercept)  3.429317614 0.406974930  8.4263608
## age         -0.004969458 0.009255897 -0.5368964
# model comparison vs gender
m2 <- lmer(EE ~ gender + age + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.723 0.275 0.003
summary(m2)$coefficients # coefficient: |t| < 2
##                 Estimate  Std. Error    t value
## (Intercept)  3.281307057 0.431683535  7.6011865
## genderM      0.240100182 0.233541082  1.0280854
## age         -0.004200372 0.009285946 -0.4523365


4.3.3. workHours

workHours is a level-1 continuous variable that in section 3.2 was positively correlated with emotional exhaustion (r = 0.22). Consistently, its inclusion implies stronger evidence than more parsimonious models, with an absolute t-value higher than 2. However, considering its role as a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain, we do not include it as a covariate for emotional exhaustion.

# model comparison vs null
m1.bis <- lmer(EE ~ workHours.mc + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.004 0.996
summary(m1.bis)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept)  3.2199170 0.11590941 27.779599
## workHours.mc 0.1257082 0.02941963  4.272938
# model comparison vs gender
m2 <- lmer(EE ~ gender + workHours.mc + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: stronger evidence than previous model
##  model weights 
## [1] 0.012 0.004 0.984
summary(m2)$coefficients # coefficient: |t| > 2
##               Estimate Std. Error   t value
## (Intercept)  3.1001459 0.16091111 19.266201
## genderM      0.2487437 0.23189176  1.072671
## workHours.mc 0.1257082 0.02941813  4.273155


4.3.4. lateWorkHours

lateWorkHours is a level-1 categorical variable that in section 3.5 did not predict substantial differences in emotional exhaustion. Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering its role as a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain, we do not include it as a covariate for emotional exhaustion.

# number of cases by covariate level
summary(cleanEE$lateWorkHours)
##    Mode   FALSE    TRUE 
## logical     584     190
# model comparison vs null
m1.bis <- lmer(EE ~ lateWorkHours + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.794 0.206
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)       3.1805575  0.1190303 26.720560
## lateWorkHoursTRUE 0.1526904  0.1126787  1.355095
# model comparison vs gender
m2 <- lmer(EE ~ gender + lateWorkHours + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.675 0.256 0.068
summary(m2)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)       3.0580254  0.1631294 18.746014
## genderM           0.2534415  0.2308978  1.097635
## lateWorkHoursTRUE 0.1546659  0.1126817  1.372591


4.3.5. dailyHassles_eve

dailyHassles_eve is a level-1 categorical variable that in section 3.5 predicted higher emotional exhaustion. Consistently, its inclusion implies stronger evidence (i.e., higher Akaike weight) than more parsimonious models, with an estimated absolute t-value higher than 2. However, the variable shows a strongly unbalanced number of cases, with only 10% of cases with some evening hassles. Moreover, we consider the theoretical importance of this variable, which might be a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain. Thus, we do not include it as a covariate for emotional exhaustion.

# number of cases by covariate level
summary(cleanEE$dailyHassles_eve)
##  No Yes 
## 696  78
# model comparison dailyHassles_eve vs null
m1.bis <- lmer(EE ~ dailyHassles_eve + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.001 0.999
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                      Estimate Std. Error   t value
## (Intercept)         3.1576786  0.1150583 27.444156
## dailyHassles_eveYes 0.6301497  0.1437826  4.382657
# model comparison vs gender
m2 <- lmer(EE ~ gender + dailyHassles_eve + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.001 0.000 0.998
summary(m2)$coefficients # coefficient: |t| > 2
##                      Estimate Std. Error   t value
## (Intercept)         3.0172110  0.1592633 18.944797
## genderM             0.2901592  0.2281258  1.271926
## dailyHassles_eveYes 0.6379189  0.1438860  4.433503


4.3.6. teleWork

teleWork is a level-1 categorical variable that in section 3.5 did not predict substantial differences in emotional exhaustion. Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with workaholism, we do not include it as a covariate for emotional exhaustion.

# number of cases by covariate level
summary(cleanEE$teleWork) # currently 4 categories
##   office teleWork     both   dayOff 
##      580      143       51        0
cleanEE$teleWork <- as.factor(gsub("both","teleWork",gsub("dayOff","teleWork",cleanEE$teleWork))) # recoding to 2 categories
summary(cleanEE$teleWork)
##   office teleWork 
##      580      194
# model comparison vs null
m1.bis <- lmer(EE ~ teleWork + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.818 0.182
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)       3.2568184  0.1218023 26.738560
## teleWorkteleWork -0.1465454  0.1457767 -1.005273
# model comparison vs gender + dailyHassles_eve
m2 <- lmer(EE ~ gender + teleWork + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.680 0.258 0.062
summary(m2)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error   t value
## (Intercept)       3.1316744  0.1637507 19.124646
## genderM           0.2658847  0.2327925  1.142153
## teleWorkteleWork -0.1579611  0.1460864 -1.081285


4.3.7. Other covariates

In addition to the pre-registered covariates, we consider a further level-2 covariate that in section 3.5 showed substantial trends in both emotional exhaustion and workaholism, and whose potential influence on both variables can be theoretically argued, namely having children or living with children home_child. Indeed, respondents reporting to live with their children showed lower emotional exhaustion, whereas those reporting to have children reported slightly lower workaholism (see section 3.5). Theoretically, it is plausible although not consistently reported by previous research (see Clark et al., 2016) that workaholism levels and overall investment in the work vs. family domain are influenced by family needs and presence of children in the household. Thus, both children and home_child might be a common external variable influencing both workaholism and emotional exhaustion, and we consider it as a further potential covariate.

Although both children and home_child have an acceptably balanced number of cases per level, none of them implied stronger evidence than the more parsimonious models. Thus, also in this case, we do not include these two variables as covariates for emotional exhaustion.

# children...........................................................

# number of cases by covariate level
summary(cleanEE[!duplicated(cleanEE$ID),"children"]) # children: No. participants
##  No Yes 
##  56  58
summary(cleanEE$children) # children: No. cases
##  No Yes 
## 398 376
# model comparison home_child vs null
m1.bis <- lmer(EE ~ home_child + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.525 0.475
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error   t value
## (Intercept)    3.3766989  0.1476390 22.871319
## home_childYes -0.3985085  0.2354001 -1.692899
# model comparison children vs gender
m2 <- lmer(EE ~ gender + children + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.637 0.242 0.121
summary(m2)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error    t value
## (Intercept)  3.2623275  0.2028118 16.0854889
## genderM      0.2293104  0.2317081  0.9896521
## childrenYes -0.3024936  0.2315611 -1.3063232
# home_child...........................................................

summary(cleanEE[!duplicated(cleanEE$ID),"home_child"]) # home_child: No. participants
##  No Yes 
##  69  45
summary(cleanEE$home_child) # home_child: No. cases
##  No Yes 
## 474 300
# model comparison children vs null
m1.bis <- lmer(EE ~ children + (1|ID),data=cleanEE)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.647 0.353
summary(m1.bis)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error   t value
## (Intercept)  3.3800736  0.1641959 20.585610
## childrenYes -0.3170249  0.2310272 -1.372241
# model comparison home_child vs gender
m2 <- lmer(EE ~ gender + home_child + (1|ID),data=cleanEE)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.606 0.230 0.164
summary(m2)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error   t value
## (Intercept)    3.2727244  0.1954395 16.745456
## genderM        0.1901306  0.2336362  0.813789
## home_childYes -0.3669013  0.2389737 -1.535321


4.4. Sleep disturbances

For sleep disturbances, the pre-registered potential covariates to be considered are:

  1. gender, as previous evidence highlighted poorer sleep quality in women compared to men (e.g., Zeng et al., 2022) and gender has been highlighted as a potential moderator of the straining effects of trait workaholism (e.g., Bladucci et al., 2018; 2021).

  2. age, as previous evidence highlighted poorer sleep quality in aging (e.g., Floyd et al., 2000); however, no clear differences have been highlighted for workaholism over age (Clark et al., 2016).

  3. The time since waking up hhFromAwake, as perceived sleep disturbances might change with the time between awakening and the subsequent survey response; however, we have no clear expectation on its relationship with workaholism, and the two variables are uncorrelated (r = 0.02).

  4. The daily number of worked hours workHours, as long working hours is a definitional aspect of workaholism which has been found associated with sleep disturbances (Virtanen, 2009); however, controlling for this variable might risk to artificially deflate the relationship between workaholism and sleep disturbances since the former might influence the latter through working hours. That is, working hours is a potential explanatory mechanism of the focused relationship, and including it as a control variable might bias rather than strengthening the results (see Spector et al., 2021).

  5. The occurrence of late working hours in the evening lateWorkHours, consistently with what argued above for workHours; also in this case, controlling for this variable might risk to rule out a potential explanatory mechanism of the relationship between workaholism and sleep disturbances

  6. Nonwork hassles in the evening dailyHassles_eve, as hassles have been related to sleep disturbances (e.g., Dahl et al., 2007) and nonwork hassles such as relationship tension have been recently related to state workaholism (Clark et al., 2021); also in this case, such an argument imply that nonwork hassles are a potential explanatory mechanism of the focused relationship.

  7. Remote work teleWork, although with no clear expectations on its relationship with sleep disturbances, while we originally hypothesized that remote working might act as a moderator of the straining effect of workaholism.

Further pre-registered level-2 covariates (i.e., retrospective measures of trait workaholism, technostress creators) are not included due to our aim to focus the study on the focused level-1 variables, whereas recovery experiences will be included in all models (see Supplementary material S7). In contrast, additional (i.e., not pre-registered) level-2 covariates potentially moderating the relationship between workaholism and sleep disturbances are considered as potentially confounding factors.

Prior to evaluate the inclusion of each covariate, we prepare the data for the analyses. That is, we remove cases of missing responses in the response variable or any covariate (list-wise deletion) and we center level-1 continuous covariates on the individual mean (person-mean-centering).

# list-wise deletion
cleanSD <- as.data.frame(na.omit(clean[,c("ID","day","SD",
                                        "gender","age","workHours","hhFromAwake","lateWorkHours",
                                        "dailyHassles_eve","teleWork",
                                        "home_child","children")]))
cat("Considering",nrow(cleanSD),"complete observations from",nlevels(as.factor(as.character(cleanSD$ID))),"participants")
## Considering 768 complete observations from 114 participants
# mean centering lv-1 continuous covariates
for(Var in c("hhFromAwake","workHours")){
  prelqs <- cbind(prelqs,aggregate(cleanSD[,Var],list(cleanSD$ID),mean)[,2]) # computing individual means
  colnames(prelqs)[ncol(prelqs)] <- paste0(Var,".cm")
  cleanSD <- join(cleanSD,prelqs[,c("ID",paste0(Var,".cm"))],by="ID",type="left") # joining with long-form data
  cleanSD[,paste0(Var,".mc")] <- cleanSD[,Var] - cleanSD[,paste0(Var,".cm")] } # computing mean-centered scores


4.4.1. gender

gender is a categorical variable with a roughly balanced number of participants. Although in section 3.5 we only observed some slight tendency, its inclusion in the null model shows improved evidence (i.e., higher Akaike weight) compared to the null model, with an estimated t-value close to 2. Thus, also considering its theoretical relevance as a potential moderator of the straining effects of workaholism (e.g., Balducci et al. (2018)) we include gender as a covariate for sleep disturbances.

# number of cases by covariate level
summary(cleanSD[!duplicated(cleanSD$ID),"gender"]) # No. participants
##  F  M 
## 59 55
summary(cleanSD$gender) # No. cases
##   F   M 
## 410 358
# model comparison
m0 <- lmer(SD ~ (1|ID),data=cleanSD)
m1 <- lmer(SD ~ gender + (1|ID),data=cleanSD)
Weights(AIC(m0,m1)) # Akaike weights: stronger evidence including gender
##  model weights 
## [1] 0.468 0.532
summary(m1)$coefficients # coefficient: proximal to |t|=2
##               Estimate Std. Error   t value
## (Intercept)  2.7377768  0.1267734 21.595831
## genderM     -0.3588516  0.1829553 -1.961417


4.4.2. age

age is a level-2 continuous variable that in section 3.2 was unrelated with sleep disturbances (r = 0.02). Consistently, its inclusion in the model including gender implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering the uncertainty on its relationship with workaholism, we do not include it as a covariate for sleep disturbances.

# model comparison vs null
m1.bis <- lmer(SD ~ age + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.992 0.008
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                Estimate  Std. Error   t value
## (Intercept) 2.402643598 0.324103465 7.4131993
## age         0.003861789 0.007368504 0.5240941
# model comparison vs gender
m2 <- lmer(SD ~ gender + age + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.466 0.530 0.004
summary(m2)$coefficients # coefficient: |t| < 2
##                 Estimate  Std. Error    t value
## (Intercept)  2.618859240 0.339967408  7.7032656
## genderM     -0.353330171 0.184161326 -1.9185905
## age          0.002758294 0.007311898  0.3772336


4.4.3. hhFromAwake

hhFromAwake is a level-1 continuous variable that in section 3.2 was unrelated to sleep disturbances (r = 0.02). Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering the uncertainty of its relationship with both workaholism and sleep disturbances, we do not include it as a covariate for sleep disturbances.

# model comparison vs null
m1.bis <- lmer(SD ~ hhFromAwake.mc + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.957 0.043
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                   Estimate Std. Error     t value
## (Intercept)     2.56542218 0.09247725 27.74111643
## hhFromAwake.mc -0.00449394 0.04905488 -0.09161045
# model comparison vs gender
m2 <- lmer(SD ~ gender + hhFromAwake.mc + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.457 0.520 0.024
summary(m2)$coefficients # coefficient: |t| < 2
##                   Estimate Std. Error     t value
## (Intercept)     2.73777344  0.1267739 21.59572270
## genderM        -0.35883930  0.1829568 -1.96133389
## hhFromAwake.mc -0.00449394  0.0490475 -0.09162423


4.4.4. workHours

workHours is a level-1 continuous variable that in section 3.2 was uncorrelated with sleep disturbances (r = 0.02). Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering its role as a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain, we do not include it as a covariate for sleep disturbances.

# model comparison vs null
m1.bis <- lmer(SD ~ workHours.mc + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.961 0.039
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)   2.56563093 0.09248917 27.7397989
## workHours.mc -0.02634331 0.03074465 -0.8568419
# model comparison vs gender
m2 <- lmer(SD ~ gender + workHours.mc + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.458 0.521 0.021
summary(m2)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error    t value
## (Intercept)   2.73777677 0.12679557 21.5920533
## genderM      -0.35841232 0.18298806 -1.9586651
## workHours.mc -0.02616138 0.03073998 -0.8510541


4.4.5. lateWorkHours

lateWorkHours is a level-1 categorical variable that in section 3.5 did not predict substantial differences in sleep disturbances. Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering its role as a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain, we do not include it as a covariate for sleep disturbances.

# number of cases by covariate level
summary(cleanSD$lateWorkHours)
##    Mode   FALSE    TRUE 
## logical     580     188
# model comparison vs null
m1.bis <- lmer(SD ~ lateWorkHours + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.699 0.301
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                   Estimate Std. Error   t value
## (Intercept)       2.516734 0.09642726 26.099821
## lateWorkHoursTRUE 0.190358 0.11271379  1.688861
# model comparison vs gender
m2 <- lmer(SD ~ gender + lateWorkHours + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.383 0.436 0.180
summary(m2)$coefficients # coefficient: |t| < 2
##                     Estimate Std. Error   t value
## (Intercept)        2.6873902  0.1297561 20.711094
## genderM           -0.3537025  0.1821281 -1.942053
## lateWorkHoursTRUE  0.1873724  0.1125491  1.664806


4.4.6. dailyHassles_eve

dailyHassles_eve is a level-1 categorical variable that in section 3.5 predicted slightly higher sleep disturbances. Consistently, its inclusion implies stronger evidence (i.e., higher Akaike weight) than more parsimonious models, with an estimated absolute t-value higher than 2. However, the variable shows a strongly unbalanced number of cases, with only 10% of cases with some evening hassle. Moreover, we consider the theoretical importance of this variable, which might be a potential explanatory mechanism (e.g., mediator) through which workaholism might impact on strain. Thus, we do not include it as a covariate for sleep disturbances.

# number of cases by covariate level
summary(cleanSD$dailyHassles_eve)
##  No Yes 
## 690  78
# model comparison dailyHassles_eve vs null
m1.bis <- lmer(SD ~ dailyHassles_eve + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: stronger evidence than null model
##  model weights 
## [1] 0.096 0.904
summary(m1.bis)$coefficients # coefficient: |t| > 2
##                      Estimate Std. Error   t value
## (Intercept)         2.5225367 0.09252243 27.264057
## dailyHassles_eveYes 0.4270638 0.14607846  2.923523
# model comparison vs gender
m2 <- lmer(SD ~ gender + dailyHassles_eve + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.095 0.109 0.796
summary(m2)$coefficients # coefficient: |t| > 2
##                       Estimate Std. Error   t value
## (Intercept)          2.6833050  0.1269841 21.131025
## genderM             -0.3320883  0.1814007 -1.830689
## dailyHassles_eveYes  0.4142470  0.1461602  2.834199


4.4.7. teleWork

teleWork is a level-1 categorical variable that in section 3.5 did not predict substantial differences in sleep disturbances. Consistently, its inclusion implies weaker evidence than more parsimonious models, with an absolute t-value lower than 2. Thus, also considering the unbalanced number of cases per level and the uncertainty of its relationship with both workaholism and sleep disturbances, we do not include it as a covariate for sleep disturbances.

# number of cases by covariate level
summary(cleanSD$teleWork) # currently 4 categories
##   office teleWork     both   dayOff 
##      575      143       50        0
cleanSD$teleWork <- as.factor(gsub("both","teleWork",gsub("dayOff","teleWork",cleanSD$teleWork))) # recoding to 2 categories
summary(cleanSD$teleWork)
##   office teleWork 
##      575      193
# model comparison vs null
m1.bis <- lmer(SD ~ teleWork + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.875 0.125
summary(m1.bis)$coefficients # coefficient: |t| < 2
##                    Estimate Std. Error    t value
## (Intercept)       2.5814746 0.09907303 26.0562796
## teleWorkteleWork -0.0637545 0.14035665 -0.4542322
# model comparison vs gender + dailyHassles_eve
m2 <- lmer(SD ~ gender + teleWork + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.437 0.496 0.067
summary(m2)$coefficients # coefficient: |t| < 2
##                     Estimate Std. Error    t value
## (Intercept)       2.74618253  0.1300248 21.1204479
## genderM          -0.35438961  0.1838099 -1.9280224
## teleWorkteleWork -0.04188835  0.1403313 -0.2984961


4.4.8. Other covariates

In addition to the pre-registered covariates, we consider a further level-2 covariate that in section 3.5 showed substantial trends in both sleep disturbances and workaholism, and whose potential influence on both variables can be theoretically argued, namely having children children or living with children home_child. Indeed, respondents reporting to live with their children reported slightly higher sleep disturbances, whereas those reporting to have children reported slightly lower workaholism (see section 3.5). Theoretically, it is plausible although not consistently reported by previous research (see Clark et al., 2016) that workaholism levels and overall investment in the work vs. family domain are influenced by family needs and presence of children in the household. On the other hand, family needs and living with children have been shown to negatively impact on sleep disturbances (e.g., Gay et al., 20040). Thus, both children and home_child might be a common external variable influencing both workaholism and sleep disturbances, and we consider it as a further potential covariate.

Although both children and home_child have an acceptably balanced number of cases per level, none of them implies stronger evidence than the more parsimonious models. Thus, also in this case, we do not include these two variables as covariates for sleep disturbances.

# children.....................................................

# number of cases by covariate level
summary(cleanSD[!duplicated(cleanSD$ID),"children"]) # children: No. participants
##  No Yes 
##  56  58
summary(cleanSD$children) # children: No. cases
##  No Yes 
## 395 373
# model comparison children vs null
m1.bis <- lmer(SD ~ children + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.829 0.171
summary(m1.bis)$coefficients # coefficient: |t| < 2
##              Estimate Std. Error    t value
## (Intercept) 2.5078091  0.1314603 19.0765451
## childrenYes 0.1145479  0.1853899  0.6178756
# model comparison home_child vs null
m1.bis <- lmer(SD ~ home_child + (1|ID),data=cleanSD)
Weights(AIC(m0,m1.bis)) # Akaike weights: weaker evidence than null model
##  model weights 
## [1] 0.637 0.363
summary(m1.bis)$coefficients # coefficient: |t| < 2
##               Estimate Std. Error   t value
## (Intercept)   2.451325  0.1179382 20.784826
## home_childYes 0.290675  0.1882206  1.544332
# home_child.....................................................

summary(cleanSD[!duplicated(cleanSD$ID),"home_child"]) # home_child: No. participants
##  No Yes 
##  69  45
summary(cleanSD$home_child) # home_child: No. cases
##  No Yes 
## 470 298
# model comparison home_child vs gender
m2 <- lmer(SD ~ gender + home_child + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.388 0.442 0.170
summary(m2)$coefficients # coefficient: |t| < 2
##                 Estimate Std. Error   t value
## (Intercept)    2.6264209  0.1542313 17.029100
## genderM       -0.3216865  0.1847922 -1.740801
## home_childYes  0.2382180  0.1890599  1.260013
# model comparison children vs gender
m2 <- lmer(SD ~ gender + children + (1|ID),data=cleanSD)
Weights(AIC(m0,m1,m2)) # Akaike weights: weaker evidence than previous model
##  model weights 
## [1] 0.424 0.483 0.093
summary(m2)$coefficients # coefficient: |t| < 2
##                Estimate Std. Error   t value
## (Intercept)  2.68790172  0.1602551 16.772642
## genderM     -0.35332513  0.1838018 -1.922316
## childrenYes  0.09391617  0.1836596  0.511360


4.5. Summary of results

Here, we summarize the results of our covariate selection procedure:

  • for SBP_aft and DBP_aft, we selected gender, age, and BMI as covariates;

  • for SBP_eve and DBP_eve, we selected gender, age, and BMI as covariates;

  • for EE, we selected gender as a covariate;

  • for SD, we selected gender as a covariate.


5. Data export

Here, we export the formulas of the models including the covariates selected for each response variable (see section 4).

# specifying model formulas
mformulas <- c("SBP_aft ~ gender + age + BMI",
               "DBP_aft ~ gender + age + BMI",
               
               "SBP_eve ~ gender + age + BMI",
               "DBP_eve ~ gender + age + BMI",
               
               "EE ~ gender",
               
               "SD ~ gender")

# exporting model formula
save(mformulas,file="DATI/mformulas.RData")


6. Outputs

Finally, we generate and export the outputs to be included in the manuscript, namely the table with the descriptive statistics and correlations that only includes the focused variables and the selected covariates.

# selecting level-1 quantitative variables
lv1 <- c("WHLSM","SBP_aft","DBP_aft", # afternoon
         "SBP_eve","DBP_eve","EE","PD", # evening
         "SD") # next morning
lv2 <- c("age","BMI")

# computing descriptives
tab1 <- cbind(multidesc(long=clean,wide=prelqs,lv1=lv1,lv2=lv2),
              multicorr(long=clean,wide=prelqs,lv1=lv1,lv2=lv2,pvalue=TRUE,correction="BH"))
write.csv(tab1,"RESULTS/Table1.csv",row.names=FALSE)
kable(tab1)
Measure N Mean ICC WHLSM SBP_aft DBP_aft SBP_eve DBP_eve EE PD SD age BMI
WHLSM 847 3.43 (1.54) 0.61 1 0.14*** 0.14*** 0.04 0.08 0.18*** -0.08* 0.13** NA NA
SBP_aft 843 122.18 (19.56) 0.70 0.12 1 0.46*** 0.18*** 0.12** 0.05 -0.02 0.09* NA NA
DBP_aft 843 78.17 (14.6) 0.61 0.13 0.83*** 1 0.1* 0.12** 0.08* -0.02 0.06 NA NA
SBP_eve 841 115.58 (18.22) 0.69 0.11 0.9*** 0.77*** 1 0.56*** 0.06 -0.1* 0.03 NA NA
DBP_eve 841 72.96 (14.26) 0.64 0.04 0.77*** 0.86*** 0.87*** 1 0.08* -0.03 0.09* NA NA
EE 841 3.24 (1.57) 0.56 0.49*** 0.24* 0.22* 0.21 0.17 1 -0.13*** 0.09* NA NA
PD 841 4.38 (1.85) 0.35 -0.14 -0.01 -0.05 -0.07 -0.08 -0.13 1 -0.06 NA NA
SD 842 2.57 (1.4) 0.39 0.43*** 0.09 0.15 0.12 0.13 0.47*** -0.16 1 NA NA
age 114 42.12 (12.61) NA -0.14 0.35*** 0.35*** 0.34*** 0.38*** -0.05 0.06 0.02 1 NA
BMI 114 23.91 (3.53) NA 0.06 0.33*** 0.33** 0.4*** 0.4*** 0.06 0.07 -0.03 0.22* 1


References

  • Abdel Hadi, S., Bakker, A. B., & Häusser, J. A. (2021). The role of leisure crafting for emotional exhaustion in telework during the COVID-19 pandemic. Anxiety, Stress, & Coping, 34(5), 530-544. https://doi.org/10.1080/10615806.2021.1903447

  • Balducci, C., Avanzi, L., & Fraccaroli, F. (2018). The Individual “Costs” of Workaholism: An Analysis Based on Multisource and Prospective Data. Journal of Management, 44(7), 2961–2986. https://doi.org/10.1177/0149206316658348

  • Brewer, E. W., & Shapard, L. (2004). Employee burnout: A meta-analysis of the relationship between age or years of experience. Human resource development review, 3(2), 102-123. https://doi.org/10.1177/1534484304263335

  • Clark, M. A., Hunter, E. M., & Carlson, D. S. (2021). Hidden costs of anticipated workload for individuals and partners: Exploring the role of daily fluctuations in workaholism. Journal of Occupational Health Psychology, 26(5), 393–404. https://doi.org/10.1037/ocp0000284

  • Clark, M. A., Michel, J. S., Zhdanova, L., Pui, S. Y., & Baltes, B. B. (2016). All Work and No Play? A Meta-Analytic Examination of the Correlates and Outcomes of Workaholism. Journal of Management, 42(7), 1836–1873. https://doi.org/10.1177/0149206314522301

  • Dahl, R. E., & El-Sheikh, M. (2007). Considering sleep in a family context: introduction to the special issue. Journal of Family Psychology, 21(1), 1. https://psycnet.apa.org/doi/10.1037/0893-3200.21.1.1

  • Floyd, J. A., Medler, S. M., Ager, J. W., & Janisse, J. J. (2000). Age‐related changes in initiation and maintenance of sleep: a meta‐analysis. Research in nursing & health, 23(2), 106-117. https://doi.org/10.1002/(SICI)1098-240X(200004)23:2%3C106::AID-NUR3%3E3.0.CO;2-A

  • Gay, C. L., Lee, K. A., & Lee, S. Y. (2004). Sleep patterns and fatigue in new mothers and fathers. Biological research for nursing, 5(4), 311-318. https://doi.org/10.1177/1099800403262142

  • Gregg, E. W., Cheng, Y. J., Cadwell, B. L., Imperatore, G., Williams, D. E., Flegal, K. M., … & Williamson, D. F. (2005). Secular trends in cardiovascular disease risk factors according to body mass index in US adults. Jama, 293(15), 1868-1874. https://doi.org/10.1001/jama.293.15.1868

  • Klusmann, U., Aldrup, K., Schmidt, J., & Lüdtke, O. (2021). Is emotional exhaustion only the result of work experiences? A diary study on daily hassles and uplifts in different life domains. Anxiety, Stress, & Coping, 34(2), 173-190.

  • Landsbergis, P. A., Dobson, M., Koutsouras, G., & Schnall, P. (2013). Job strain and ambulatory blood pressure: a meta-analysis and systematic review. American journal of public health, 103(3), e61-e71. https://doi.org/10.2105/AJPH.2012.301153

  • McQuillan, M. E., Bates, J. E., Staples, A. D., & Deater-Deckard, K. (2022). A 1-year longitudinal study of the stress, sleep, and parenting of mothers of toddlers. Sleep Health, 8(1), 47-53. https://doi.org/10.1016/j.sleh.2021.08.006

  • Nyklíček, I., Vingerhoets, A. J., & Van Heck, G. L. (1999). Elevated blood pressure and self-reported symptom complaints, daily hassles, and defensiveness. International journal of behavioral medicine, 6, 177-189. https://doi.org/10.1207/s15327558ijbm0602_5

  • Purvanova, R. K., & Muros, J. P. (2010). Gender differences in burnout: A meta-analysis. Journal of vocational behavior, 77(2), 168-185. https://doi.org/10.1016/j.jvb.2010.04.006

  • Sandberg, K., & Ji, H. (2012). Sex differences in primary hypertension. Biology of sex differences, 3(1), 1-21. https://doi.org/10.1186/2042-6410-3-7

  • Seidler, A., Thinschmidt, M., Deckert, S., Then, F., Hegewald, J., Nieuwenhuijsen, K., & Riedel-Heller, S. G. (2014). The role of psychosocial working conditions on burnout and its core component emotional exhaustion–a systematic review. Journal of occupational medicine and toxicology, 9(1), 1-13.

  • Spector, P. E. (2021). Mastering the use of control variables: The hierarchical iterative control (HIC) approach. Journal of Business and Psychology, 36(5), 737-750. https://doi.org/10.1007/s10869-020-09709-0

  • Virtanen, M., Ferrie, J. E., Gimeno, D., Vahtera, J., Elovainio, M., Singh-Manoux, A., … & Kivimäki, M. (2009). Long working hours and sleep disturbances: the Whitehall II prospective cohort study. Sleep, 32(6), 737-745. https://doi.org/10.1093/sleep/32.6.737

  • Virtanen, M., Heikkilä, K., Jokela, M., Ferrie, J. E., Batty, G. D., Vahtera, J., & Kivimäki, M. (2012). Long working hours and coronary heart disease: a systematic review and meta-analysis. American journal of epidemiology, 176(7), 586-596. https://doi.org/10.1093/aje/kws139

  • Zeng, L. N., Zong, Q. Q., Yang, Y., Zhang, L., Xiang, Y. F., Ng, C. H., … & Xiang, Y. T. (2020). Gender difference in the prevalence of insomnia: a meta-analysis of observational studies. Frontiers in Psychiatry, 11, 577429. https://doi.org/10.3389/fpsyt.2020.577429


R packages

Bartoń, Kamil. 2023. MuMIn: Multi-Model Inference. https://CRAN.R-project.org/package=MuMIn.
Bates, Douglas, Martin Mächler, Ben Bolker, and Steve Walker. 2015. “Fitting Linear Mixed-Effects Models Using lme4.” Journal of Statistical Software 67 (1): 1–48. https://doi.org/10.18637/jss.v067.i01.
Bates, Douglas, Martin Maechler, Ben Bolker, and Steven Walker. 2023. Lme4: Linear Mixed-Effects Models Using Eigen and S4. https://github.com/lme4/lme4/.
Harrell, Frank E, Jr. 2023. Hmisc: Harrell Miscellaneous. https://hbiostat.org/R/Hmisc/.
Hope, Ryan M. 2022. Rmisc: Ryan Miscellaneous. https://CRAN.R-project.org/package=Rmisc.
R Core Team. 2023. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
———. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
———. 2020. Reshape2: Flexibly Reshape Data: A Reboot of the Reshape Package. https://github.com/hadley/reshape.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2023. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC.
———. 2015. Dynamic Documents with R and Knitr. 2nd ed. Boca Raton, Florida: Chapman; Hall/CRC. https://yihui.org/knitr/.
———. 2023. Knitr: A General-Purpose Package for Dynamic Report Generation in r. https://yihui.org/knitr/.
LS0tDQp0aXRsZTogIlRoZSBkYWlseSBjb3N0cyBvZiB3b3JrYWhvbGlzbSINCnN1YnRpdGxlOiAiU3VwcGxlbWVudGFyeSBtYXRlcmlhbCBTNTogRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBhbmQgY292YXJpYXRlIHNlbGVjdGlvbiINCmF1dGhvcjogICJMdWNhIE1lbmdoaW5pLCBQaC5ELiwgQ3Jpc3RpYW4gQmFsZHVjY2ksIFBoLkQuIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0KYmlibGlvZ3JhcGh5OiBbcGFja2FnZXNEZXNjLmJpYl0NCm5vY2l0ZTogJ0AqJw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIGNzczogc3R5bGVzLmNzcw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgdGhlbWU6IHVuaXRlZA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCjxicj4NCg0KIyBBaW1zIGFuZCBjb250ZW50DQoNClRoZSBwcmVzZW50IGRvY3VtZW50IGluY2x1ZGVzIHRoZSBhbmFseXRpY2FsIHN0ZXBzIGltcGxlbWVudGVkIHRvIGNvbXB1dGUgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZnJvbSB0aGUgcmV0cm9zcGVjdGl2ZSBhbmQgZGFpbHkgZGlhcnkgZGF0YSBjb2xsZWN0ZWQgd2l0aCB0aGUgUXVhbHRyaWNzIHBsYXRmb3JtIChRdWFsdHJpY3MsIFNlYXR0bGUsIFdBLCBVU0EpIGZyb20gYW4gaGV0ZXJvZ2VuZW91cyBzYW1wbGVzIG9mIHdvcmtlcnMgb3ZlciB0d28gd2Vla3MsIHByZS1wcm9jZXNzZWQgYXMgc2hvd24gaW4gW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzNdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1MzX3ByZVByb2Nlc3NpbmcvUzNfZGF0YS1wcm9jZXNzaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSBhbmQgYWdncmVnYXRlZCBhcyBzaG93biBpbiBbU3VwcGxlbWVudGFyeSBNYXRlcmlhbCBTNF0oaHR0cHM6Ly9MdWNhLU1lbmdoaW5pLmdpdGh1Yi5pby90aGUtZGFpbHktY29zdHMtb2Ytd29ya2Fob2xpc20vUzRfcHN5Y2hvbWV0cmljcy9TNF9wc3ljaG9tZXRyaWNzLWNvZGUtYW5kLW91dHB1dC5odG1sKS4gVGhlIGRvY3VtZW50IGFsc28gZGVwaWN0cyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gKipzZWxlY3QgdGhlIGNvdmFyaWF0ZXMqKiB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZm9sbG93aW5nIG11bHRpbGV2ZWwgbW9kZWxzIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzZdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M2X21vZGVsaW5nL1M2X21vZGVsaW5nLWNvZGUtYW5kLW91dHB1dC5odG1sKSkuDQoNCkhlcmUsIHdlIHJlbW92ZSBhbGwgb2JqZWN0cyBmcm9tIHRoZSBSIGdsb2JhbCBlbnZpcm9ubWVudC4NCmBgYHtyICB9DQojIHJlbW92aW5nIGFsbCBvYmpldHMgZnJvbSB0aGUgd29ya3NwYWNlDQpybShsaXN0PWxzKCkpDQpgYGANCg0KVGhlIGZvbGxvd2luZyBSIHBhY2thZ2VzIGFyZSB1c2VkIGluIHRoaXMgZG9jdW1lbnQgKHNlZSBbUmVmZXJlbmNlc10oI3JlZikgc2VjdGlvbik6DQpgYGB7ciAgfQ0KIyByZXF1aXJlZCBwYWNrYWdlcw0KcGFja2FnZXMgPC0gYygia25pdHIiLCJSbWlzYyIsIkhtaXNjIiwibG1lNCIsImdncGxvdDIiLCJyZXNoYXBlMiIsIk11TUluIikNCg0KIyBnZW5lcmF0ZSBwYWNrYWdlcyByZWZlcmVuY2VzDQprbml0cjo6d3JpdGVfYmliKGMoLnBhY2thZ2VzKCksIHBhY2thZ2VzKSwicGFja2FnZXNEZXNjLmJpYiIpDQoNCiMgIyBydW4gdG8gaW5zdGFsbCBtaXNzaW5nIHBhY2thZ2VzDQojIHhmdW46OnBrZ19hdHRhY2gyKHBhY2thZ2VzLCBtZXNzYWdlID0gRkFMU0UpOyBybShsaXN0PWxzKCkpDQpgYGANCg0KPGJyPg0KDQojIDEuIERhdGEgcmVhZGluZw0KDQpGaXJzdCwgd2UgcmVhZCBkYWlseSBkaWFyeSBkYXRhc2V0IGBkaWFyeWAgYW5kIHdlIHJlYnVpbGQgdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUgYHByZWxxc2AgZXhwb3J0ZWQgZnJvbSB0aGUgcHJldmlvdXMgc3RlcCAoW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzRdKGh0dHBzOi8vTHVjYS1NZW5naGluaS5naXRodWIuaW8vdGhlLWRhaWx5LWNvc3RzLW9mLXdvcmthaG9saXNtL1M0X3BzeWNob21ldHJpY3MvUzRfcHN5Y2hvbWV0cmljcy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpLg0KYGBge3IgIH0NCiMgbG9hZGluZyBkYXRhDQpsb2FkKCJEQVRJL2RpYXJ5X2FnZ3JlZ2F0ZWQuUkRhdGEiKSANCg0KIyByZWJ1aWxkaW5nIHRoZSBwcmVscXMgZGF0YXNldCAob25seSBpbmNsdWRpbmcgdmFyaWFibGVzIGZyb20gdGhlIHByZWxpbWluYXJ5IHF1ZXN0aW9ubmFpcmUpDQpwcmVscXMgPC0gZGlhcnlbIWR1cGxpY2F0ZWQoZGlhcnkkSUQpLGMoMSx3aGljaChjb2xuYW1lcyhkaWFyeSk9PSJnZW5kZXIiKTpuY29sKGRpYXJ5KSldDQoNCiMgb3JpZ2luYWwgc2FtcGxlIHNpemVzDQpjYXQoImRpYXJ5OiIsbnJvdyhkaWFyeSksInJlc3BvbnNlcyAoZGF5cykgZnJvbSIsbmxldmVscyhkaWFyeSRJRCksInBhcnRpY2lwYW50cyIpDQpjYXQoInByZWxxczoiLG5yb3cocHJlbHFzKSwicmVzcG9uc2VzIGZyb20iLG5sZXZlbHMocHJlbHFzJElEKSwicGFydGljaXBhbnRzIikNCmBgYA0KDQo8YnI+DQoNCiMgMi4gRGF0YSBmaWx0ZXJpbmcNCg0KQXMgd2UgW3ByZS1yZWdpc3RlcmVkIGhlcmVdKGh0dHBzOi8vb3NmLmlvL2g5enZxKSwgd2UgZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uIHBhcnRpY2lwYW50IGNvbXBsaWFuY2Ugd2l0aCB0aGUgcHJvdG9jb2wsIHRoYXQgaXMgd2UgKipleGNsdWRlIHRoZSBwYXJ0aWNpcGFudHMgd2l0aCBsZXNzIHRoYW4gMyBmdWxsIGRheXMgb2YgcGFydGljaXBhdGlvbioqIChpLmUuLCB3aXRoIG5vbm1pc3NpbmcgcmVzcG9uc2UgdG8gdGhlIGFmdGVybm9vbiwgZXZlbmluZywgYW5kIG1vcm5pbmcgcXVlc3Rpb25uYWlyZSkuDQpgYGB7ciAgfQ0KIyBmaWx0ZXJpbmcgcGFydGljaXBhbnRzIHdpdGggbGVzcyB0aGFuIDMgb2JzZXJ2YXRpb25zDQpjbGVhbiA8LSBkaWFyeVswLF0NCmZvcihJRCBpbiBsZXZlbHMoZGlhcnkkSUQpKXsgDQogIGlmKG5yb3coZGlhcnlbZGlhcnkkSUQ9PUlEICYgZGlhcnkkYWZ0PT0xICYgZGlhcnkkZXZlPT0xICYgZGlhcnkkbW9yPT0xLF0pID49IDMpeyANCiAgICBjbGVhbiA8LSByYmluZChjbGVhbixkaWFyeVtkaWFyeSRJRD09SUQsXSkgfX0NCmNsZWFuJElEIDwtIGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW4kSUQpKSAjIHJlc2V0dGluZyBJRCBsZXZlbHMNCmNsZWFuX3ByZWxxcyA8LSBwcmVscXNbcHJlbHFzJElEICVpbiUgbGV2ZWxzKGNsZWFuJElEKSxdICMgZmlsdGVyaW5nIHByZWxxcyBkYXRhDQpjbGVhbl9wcmVscXMkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihjbGVhbl9wcmVscXMkSUQpKSAjIHJlc2V0dGluZyBJRCBsZXZlbHMNCmNhdCgiZGlhcnk6IEV4Y2x1ZGVkIixubGV2ZWxzKGRpYXJ5JElEKS1ubGV2ZWxzKGNsZWFuJElEKSwicGFydGljaXBhbnRzIGFuZCIsbnJvdyhkaWFyeSktbnJvdyhjbGVhbiksIm9ic2VydmF0aW9ucyIpDQoNCiMgdXBkYXRpbmcgc2FtcGxlIHNpemVzDQpjYXQoImRpYXJ5OiIsbnJvdyhjbGVhbiksInJlc3BvbnNlcyBmcm9tIixubGV2ZWxzKGNsZWFuJElEKSwicGFydGljaXBhbnRzIikNCnByZWxxcyA8LSBwcmVscXNbcHJlbHFzJElEICVpbiUgbGV2ZWxzKGNsZWFuJElEKSxdICMgZmlsdGVyaW5nIHByZWxxcyBkYXRhDQpwcmVscXMkSUQgPC0gYXMuZmFjdG9yKGFzLmNoYXJhY3RlcihwcmVscXMkSUQpKSAjIHJlc2V0dGluZyBJRCBsZXZlbHMNCmNhdCgicHJlbHFzOiIsbnJvdyhwcmVscXMpLCJyZXNwb25zZXMgZnJvbSIsbmxldmVscyhwcmVscXMkSUQpLCJwYXJ0aWNpcGFudHMiKQ0KYGBgDQoNCjxicj4NCg0KIyAzLiBEZXNjcmlwdGl2ZXMNCg0KRmlyc3QsIHdlIGRlc2NyaWJlIHRoZSBzYW1wbGUgYW5kIGNvbXB1dGUgdGhlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgYW5kIGNvcnJlbGF0aW9ucyBvZiB0aGUgY29yZSBzdHVkeSB2YXJpYWJsZXMgKGkuZS4sIHdvcmthaG9saXNtLCBgV0hMU01gOyBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtb3JuaW5nIGJsb29kIHByZXNzdXJlLCBgU0JQX2FmdGAsIGBEQlBfYWZ0YCwgYFNCUF9ldmVgIGBEQlBfZXZlYDsgZW1vdGlvbmFsIGV4aGF1c3Rpb24sIGBFRWA7IHNsZWVwIGRpc3R1cmJhbmNlcywgYFNEYCwgYW5kIHJlY292ZXJ5IGV4cGVyaWVuY2VzLCBgUkRldGAgYW5kIGBSUmVsYCkgYW5kIGEgc2V0IG9mIHBvdGVudGlhbCBxdWFudGl0YXRpdmUgY292YXJpYXRlcyAoaS5lLiwgd29ya2hvdXJzLCBgd29ya0hvdXJzYDsgdGltZSBzaW5jZSB3YWtpbmctdXAsIGBoaEZyb21Bd2FrZWA7IGFnZSwgYGFnZWA7IEJNSSwgYEJNSWAsIGFuZCB3ZWVrbHkgd29ya2luZyBob3VycywgYHdlZWtIb3Vyc2ApLg0KDQpUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2lzLg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShrbml0cik7IGxpYnJhcnkoZ2dwbG90Mik7IGxpYnJhcnkocmVzaGFwZTIpDQpgYGANCg0KPGRldGFpbHM+PHN1bW1hcnk+YG11bHRpZGVzYygpYDwvc3VtbWFyeT4NCjxwPg0KYGBge3IgfQ0KIycgQHRpdGxlIERlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKG1lYW4gYW5kIFNEKSBhbmQgaW50cmFjbGFzcyBjb3JyZWxhdGlvbiBvZiBtdWx0aWxldmVsIGRhdGFzZXRzDQojJyBAcGFyYW0gbG9uZyA9IGxvbmctZm9ybSBkYXRhLmZyYW1lIGluY2x1ZGluZyBhbGwgdGltZS12YXJ5aW5nIHZhcmlhYmxlcyB3aXRoIG9uZSByb3cgcGVyIG9ic2VydmF0aW9uDQojJyBAcGFyYW0gd2lkZSA9IHdpZGUtZm9ybSBkYXRhLmZyYW1lIGluY2x1ZGluZyBhbGwgdGltZS1pbnZhcmlhbnQgdmFyaWFibGVzIHdpdGggb25lIHJvdyBwZXIgc3ViamVjdA0KIycgQHBhcmFtIGNsdXN0ZXIgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzdWJqZWN0IGlkZW50aWZpZXJzDQojJyBAcGFyYW0gbHYxID0gY2hhcmFjdGVyIHZlY3RvciBpbmRpY2F0aW5nIHRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIHRpbWUtdmFyeWluZyB2YXJpYWJsZXMgaW4gdGhlIGxvbmcgZGF0YXNldA0KIycgQHBhcmFtIGx2MiA9IGNoYXJhY3RlciB2ZWN0b3IgaW5kaWNhdGluZyB0aGUgY29sdW1uIG5hbWVzIG9mIHRoZSB0aW1lLWludmFyaWFudCB2YXJpYWJsZXMgaW4gdGhlIHdpZGUgZGF0YXNldA0KIycgQHBhcmFtIGdyb3VwID0gY2hhcmFjdGVyIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gb2YgdGhlIGdyb3VwaW5nIHZhcmlhYmxlIChkZWZ1bHQ6IE5BIGZvciBubyBncm91cCBzcGVjaWZpY2F0aW9uKQ0KIycgQHBhcmFtIGdyb3VwLmxhYmVscyA9IGNoYXJhY3RlciB2ZWN0b3IgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAgdmFyaWFibGUgbGV2ZWxzIChkZWZhdWx0OiBOQSkNCm11bHRpZGVzYyA8LSBmdW5jdGlvbihsb25nLHdpZGUsY2x1c3Rlcj0iSUQiLGx2MSxsdjIpeyByZXF1aXJlKFJtaXNjKTsgcmVxdWlyZShsbWU0KQ0KICANCiAgIyBsdjEgZGF0YQ0KICBvdXQgPC0gZGF0YS5mcmFtZShNZWFzdXJlPWx2MVsxXSwNCiAgICAgICAgICAgICAgICAgICAgTj1zdW1tYXJ5U0UobG9uZyxsdjFbMV0sbmEucm09VFJVRSlbLDJdLA0KICAgICAgICAgICAgICAgICAgICBNZWFuPXBhc3RlKHJvdW5kKHN1bW1hcnlTRShsb25nLGx2MVsxXSxuYS5ybT1UUlVFKVssM10sMiksIiAoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5U0UobG9uZyxsdjFbMV0sbmEucm09VFJVRSlbLDRdLDIpLCIpIixzZXA9IiIpKQ0KICBmb3IoaSBpbiAyOmxlbmd0aChsdjEpKXsNCiAgICBvdXQgPC0gcmJpbmQob3V0LA0KICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKE1lYXN1cmU9bHYxW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE49c3VtbWFyeVNFKGxvbmcsbHYxW2ldLG5hLnJtPVRSVUUpWywyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWFuPXBhc3RlKHJvdW5kKHN1bW1hcnlTRShsb25nLGx2MVtpXSxuYS5ybT1UUlVFKVssM10sMiksIiAoIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKHN1bW1hcnlTRShsb25nLGx2MVtpXSxuYS5ybT1UUlVFKVssNF0sMiksIikiLHNlcD0iIikpKX0NCiAgDQogICMgbHYyIGRhdGENCiAgaWYoIWlzLm5hKGx2MlsxXSkpew0KICAgIGZvcihpIGluIDE6bGVuZ3RoKGx2Mikpew0KICAgICAgb3V0IDwtIHJiaW5kKG91dCwNCiAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKE1lYXN1cmU9bHYyW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTj1zdW1tYXJ5U0Uod2lkZSxsdjJbaV0sbmEucm09VFJVRSlbLDJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbj1wYXN0ZShyb3VuZChzdW1tYXJ5U0Uod2lkZSxsdjJbaV0sbmEucm09VFJVRSlbLDNdLDIpLCIgKCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKHN1bW1hcnlTRSh3aWRlLGx2MltpXSxuYS5ybT1UUlVFKVssNF0sMiksIikiLHNlcD0iIikpKX19DQogIA0KICAjIElDQw0KICBvdXQkSUNDIDwtIE5BDQogIGZvcihpIGluIDE6bGVuZ3RoKGx2MSkpew0KICAgIG0gPC0gbG1lcihmb3JtdWxhPWdzdWIoInZhciIsbHYxW2ldLGdzdWIoIklEIixjbHVzdGVyLCJ2YXJ+KDF8SUQpIikpLGRhdGE9bG9uZykgIyBWQVJfYmV0d2VlbiAvIChWQVJfYmV0d2VlbiArIFZBUl93aXRoaW4pDQogICAgb3V0W291dCRNZWFzdXJlPT1sdjFbaV0sIklDQyJdIDwtIHJvdW5kKGFzLmRhdGEuZnJhbWUoVmFyQ29ycihtKSlbMSw0XS8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXMuZGF0YS5mcmFtZShWYXJDb3JyKG0pKVsxLDRdK2FzLmRhdGEuZnJhbWUoVmFyQ29ycihtKSlbMiw0XSksMil9DQogIHJvd25hbWVzKG91dCkgPC0gZ3N1YigiLmNtIiwiIixyb3duYW1lcyhvdXQpKQ0KICByZXR1cm4ob3V0KX0NCmBgYA0KPC9wPg0KPC9kZXRhaWxzPg0KDQpDb21wdXRlcyBhbmQgcHJpbnRzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgKG1lYW4gYW5kIFNEKSBhbmQgaW50cmFjbGFzcyBjb3JyZWxhdGlvbiBvZiBhIG11bHRpbGV2ZWwgZGF0YXNldC4NCg0KPGRldGFpbHM+PHN1bW1hcnk+YG11bHRpY29ycigpYDwvc3VtbWFyeT4NCjxwPg0KYGBge3IgfQ0KIycgQHRpdGxlIENvcnJlbGF0aW9uIG1hdHJpeCBvZiBtdWx0aWxldmVsIGRhdGFzZXRzDQojJyBAcGFyYW0gbG9uZyA9IGxvbmctZm9ybSBkYXRhLmZyYW1lIGluY2x1ZGluZyBhbGwgdGltZS12YXJ5aW5nIHZhcmlhYmxlcyB3aXRoIG9uZSByb3cgcGVyIG9ic2VydmF0aW9uDQojJyBAcGFyYW0gd2lkZSA9IHdpZGUtZm9ybSBkYXRhLmZyYW1lIGluY2x1ZGluZyBhbGwgdGltZS1pbnZhcmlhbnQgdmFyaWFibGVzIHdpdGggb25lIHJvdyBwZXIgc3ViamVjdA0KIycgQHBhcmFtIGNsdXN0ZXIgPSBjaGFyYWN0ZXIgc3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzdWJqZWN0IGlkZW50aWZpZXJzDQojJyBAcGFyYW0gbHYxID0gY2hhcmFjdGVyIHZlY3RvciBpbmRpY2F0aW5nIHRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIHRpbWUtdmFyeWluZyB2YXJpYWJsZXMgaW4gdGhlIGxvbmcgZGF0YXNldA0KIycgQHBhcmFtIGx2MiA9IGNoYXJhY3RlciB2ZWN0b3IgaW5kaWNhdGluZyB0aGUgY29sdW1uIG5hbWVzIG9mIHRoZSB0aW1lLWludmFyaWFudCB2YXJpYWJsZXMgaW4gdGhlIHdpZGUgZGF0YXNldA0KIycgQHBhcmFtIHB2YWx1ZSA9IGxvZ2ljYWwgdmFsdWUgc3BlY2lmeWluZyB3aGV0aGVyIHAtdmFsdWVzIHNob3VsZCBiZSByZXBvcnRlZCBvciBub3QgKGRlZmF1bHQ6IEZBTFNFKQ0KIycgQHBhcmFtIGNvcnJlY3Rpb24gPSBjaGFyYWN0ZXIgc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBjb3JyZWN0aW9uIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbXB1dGVkIHAtdmFsdWVzIChzZWUgP3AuYWRqdXN0KSwgZGVmYXVsdCBpcyAiYm9uZmVycm9uaSINCm11bHRpY29yciA8LSBmdW5jdGlvbihsb25nLHdpZGUsbHYxLGx2MixjbHVzdGVyPSJJRCIscHZhbHVlPUZBTFNFLGNvcnJlY3Rpb249ImJvbmZlcnJvbmkiKXsgDQogIHJlcXVpcmUoUm1pc2MpOyByZXF1aXJlKEhtaXNjKTsgcmVxdWlyZShwbHlyKQ0KICANCiAgIyByZW5hbWluZyBjbHVzdGVyIGFzICJJRCINCiAgY29sbmFtZXMobG9uZylbd2hpY2goY29sbmFtZXMobG9uZyk9PWNsdXN0ZXIpXSA8LSAiSUQiDQogIA0KICAjIHBlcnNvbi1tZWFuLWNlbnRlcmluZyBsdi0xIHZhcmlhYmxlcw0KICBmb3IoVmFyIGluIGx2MSl7DQogICAgd2lkZSA8LSBjYmluZCh3aWRlLGFnZ3JlZ2F0ZShsb25nWyxWYXJdLGxpc3QobG9uZyRJRCksbWVhbixuYS5ybT1UUlVFKVssMl0pICMgY29tcHV0aW5nIGluZGl2aWR1YWwgbWVhbnMNCiAgICBjb2xuYW1lcyh3aWRlKVtuY29sKHdpZGUpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICAgIGxvbmcgPC0gam9pbihsb25nLHdpZGVbLGMoIklEIixwYXN0ZTAoVmFyLCIuY20iKSldLGJ5PSJJRCIsdHlwZT0ibGVmdCIpICMgam9pbmluZyB3aXRoIGxvbmctZm9ybSBkYXRhDQogICAgbG9uZ1sscGFzdGUoVmFyLCIubWMiKV0gPC0gbG9uZ1ssVmFyXSAtIGxvbmdbLHBhc3RlMChWYXIsIi5jbSIpXSAjIGNvbXB1dGluZyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KICAgIGNvbG5hbWVzKGxvbmcpW25jb2wobG9uZyldIDwtIHBhc3RlMChWYXIsIi5tYyIpIH0NCiAgDQogICMgYmV0d2Vlbi1zdWJqZWN0cyBjb3JyZWxhdGlvbnMgKGx2MikNCiAgaWYoIWlzLm5hKGx2MlsxXSkpew0KICAgIG91dCA8LSByY29ycihhcy5tYXRyaXgod2lkZVssYyhwYXN0ZTAobHYxLCIuY20iKSxsdjIpXSksIHR5cGUgPSAicGVhcnNvbiIpDQogIH0gZWxzZSB7IG91dCA8LSByY29ycihhcy5tYXRyaXgod2lkZVsscGFzdGUwKGx2MSwiLmNtIildKSwgdHlwZSA9ICJwZWFyc29uIikgfQ0KICByYiA8LSByb3VuZChvdXQkciwyKSAjIGNvcnIgY29lZmZpY2llbnRzDQogIHJiW2xvd2VyLnRyaShyYildIDwtIE5BDQogIHJvd25hbWVzKHJiKSA8LSBnc3ViKCIuY20iLCIiLHJvd25hbWVzKHJiKSkNCiAgY29sbmFtZXMocmIpIDwtIGdzdWIoIi5jbSIsIiIsY29sbmFtZXMocmIpKQ0KICByYi5wIDwtIG91dCRQICMgcHZhbHVlcw0KICByYi5wW2xvd2VyLnRyaShyYi5wKV0gPC0gTkENCiAgDQogICMgd2l0aGluLXBhcnRpY2lwYW50IGNvcnJlbGF0aW9ucyAobHYxKQ0KICBvdXQgPC0gcmNvcnIoYXMubWF0cml4KGxvbmdbLHBhc3RlKGx2MSwiLm1jIixzZXA9IiIpXSksIHR5cGUgPSAicGVhcnNvbiIpDQogIHJ3IDwtIHJvdW5kKG91dCRyLDIpICMgY29yciBjb2VmZi4NCiAgcndbdXBwZXIudHJpKHJ3KV0gPC0gTkENCiAgcm93bmFtZXMocncpIDwtIGdzdWIoIi5tYyIsIiIscm93bmFtZXMocncpKQ0KICBjb2xuYW1lcyhydykgPC0gZ3N1YigiLm1jIiwiIixjb2xuYW1lcyhydykpDQogIHJ3LnAgPC0gb3V0JFAgIyBwdmFsdWVzDQogIHJ3LnBbdXBwZXIudHJpKHJ3LnApXSA8LSBOQQ0KICANCiAgIyBhZGp1c3RpbmcgcC12YWx1ZXMNCiAgaWYocHZhbHVlPT1UUlVFKXsNCiAgICBhZGogPC0gZGF0YS5mcmFtZShvcmlnaW5hbD1jKHJiLnBbIWlzLm5hKHJiLnApXSxydy5wWyFpcy5uYShydy5wKV0pLA0KICAgICAgICAgICAgICAgICAgICAgIHNpZz1yZXAoTkEsbGVuZ3RoKGMocmIucFshaXMubmEocmIucCldLHJ3LnBbIWlzLm5hKHJ3LnApXSkpKSkNCiAgICBhZGokbGV2ZWwgPC0gInciDQogICAgYWRqWzE6bGVuZ3RoKHJiLnBbIWlzLm5hKHJiLnApXSksImxldmVsIl0gPC0gImIiDQogICAgYWRqJGFkanVzdGVkPXAuYWRqdXN0KGFkaiRvcmlnaW5hbCxtZXRob2Q9Y29ycmVjdGlvbikNCiAgICAjIHNpZ25pZmljYW5jZSBsZXZlbA0KICAgIGFkalthZGokYWRqdXN0ZWQ8LjA1LCJzaWciXSA8LSAiKiINCiAgICBhZGpbYWRqJGFkanVzdGVkPC4wMSwic2lnIl0gPC0gIioqIg0KICAgIGFkalthZGokYWRqdXN0ZWQ8LjAwMSwic2lnIl0gPC0gIioqKiINCiAgICBhZGpbaXMubmEoYWRqJHNpZyksInNpZyJdIDwtICIiDQogICAgYWRqYiA8LSBhZGpbYWRqJGxldmVsPT0iYiIsXQ0KICAgIGFkancgPC0gYWRqW2FkaiRsZXZlbD09InciLF0NCiAgICBmb3IoaSBpbiAxOm5yb3coYWRqYikpeyByYi5wWyFpcy5uYShyYi5wKSAmIHJiLnA9PWFkamJbaSwib3JpZ2luYWwiXV0gPC0gYWRqYltpLCJzaWciXSB9DQogICAgZm9yKGkgaW4gMTpucm93KGFkancpKXsgcncucFshaXMubmEocncucCkgJiBydy5wPT1hZGp3W2ksIm9yaWdpbmFsIl1dIDwtIGFkandbaSwic2lnIl0gfQ0KICAgIGZvcihpIGluIDE6bnJvdyhyYi5wKSl7IGZvcihqIGluIDE6bmNvbChyYi5wKSl7IA0KICAgICAgaWYoIWlzLm5hKHJiLnBbaSxqXSkpeyByYltpLGpdIDwtIHBhc3RlKHJvdW5kKGFzLm51bWVyaWMocmJbaSxqXSksMikscmIucFtpLGpdLHNlcD0iIil9fX0NCiAgICBmb3IoaSBpbiAxOm5yb3cocncucCkpeyBmb3IoaiBpbiAxOm5jb2wocncucCkpeyANCiAgICAgIGlmKCFpcy5uYShydy5wW2ksal0pKXsgcndbaSxqXSA8LSBwYXN0ZShyb3VuZChhcy5udW1lcmljKHJ3W2ksal0pLDIpLHJ3LnBbaSxqXSxzZXA9IiIpfX19fQ0KICANCiAgIyBmaWxsaW5nIHJiIGVtcHR5IGNlbGxzDQogIHJiWzE6bGVuZ3RoKGx2MSksMTpsZW5ndGgobHYxKV1bbG93ZXIudHJpKHJiWzE6bGVuZ3RoKGx2MSksMTpsZW5ndGgobHYxKV0pXSA8LSByd1tsb3dlci50cmkocncpXQ0KICByYiA8LSB0KHJiKSAjIHRyYW5zcG9zaW5nIHRoZSBtYXRyaXggKGNvcnJlbGF0aW9ucyB3aXRoaW4taW5kaXZpZHVhbCBhcmUgc2hvd24gYWJvdmUgdGhlIG1haW4gZGlhZ29uYWwpDQogIHJldHVybihyYil9DQpgYGANCjwvcD4NCjwvZGV0YWlscz4NCg0KY29tcHV0ZXMgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBvZiBhIG11bHRpbGV2ZWwgZGF0YXNldC4NCg0KPGJyPg0KDQojIyAzLjEuIFNhbXBsZSBkZXNjcmlwdGlvbg0KDQpIZXJlLCB3ZSBkZXNjcmliZSB0aGUgc2FtcGxlIGJ5IHByb3ZpZGluZyBmcmVxdWVuY2llcyBhbmQgb3RoZXIgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiBzb2Npb2RlbW9ncmFwaGljIGFuZCB3b3JrLXJlbGF0ZWQgdmFyaWFibGVzIGNvbGxlY3RlZCB3aXRoIHRoZSBwcmVsaW1pbmFyeSBxdWVzdGlvbm5haXJlLCBjb25zaWRlcmluZyB0aGUgaW5jbHVkZWQgc3Vic2FtcGxlLg0KYGBge3IgfQ0KIyBnZW5kZXIgKGZyZXE7ICUpDQpzdW1tYXJ5KHByZWxxcyRnZW5kZXIpOyByb3VuZCgxMDAqc3VtbWFyeShwcmVscXMkZ2VuZGVyKS9ucm93KHByZWxxcyksMSkNCg0KIyBhZ2UgKG1lYW4sIFNEKQ0Kcm91bmQobWVhbihwcmVscXMkYWdlKSwyKTsgcm91bmQoc2QocHJlbHFzJGFnZSksMikNCg0KIyBCTUkgKG1lYW4sIFNEKQ0Kcm91bmQobWVhbihwcmVscXMkQk1JKSwyKTsgcm91bmQoc2QocHJlbHFzJEJNSSksMikNCg0KIyBlZHVjYXRpb24gKGZyZXE7ICUpDQpzdW1tYXJ5KHByZWxxcyRlZHUpOyByb3VuZCgxMDAqc3VtbWFyeShwcmVscXMkZWR1KS9ucm93KHByZWxxcyksMSkNCg0KIyBqb2Igc2VjdG9yIChmcmVxOyAlKQ0Kc3VtbWFyeShwcmVscXMkc2VjdG9yKTsgcm91bmQoMTAwKnN1bW1hcnkocHJlbHFzJHNlY3RvcikvbnJvdyhwcmVscXMpLDEpDQoNCiMgam9iIHBvc2l0aW9uIChmcmVxOyAlKQ0Kc3VtbWFyeShwcmVscXMkcG9zaXRpb24pOyByb3VuZCgxMDAqc3VtbWFyeShwcmVscXMkcG9zaXRpb24pL25yb3cocHJlbHFzKSwxKQ0KDQojIG9jY3VwYXRpb25hbCBncm91cHMgKCUpDQpqb2JzIDwtIHJvdW5kKDEwMCpzdW1tYXJ5KHByZWxxcyRqb2IpL25yb3cocHJlbHFzKSwxKQ0Kam9ic1tvcmRlcihqb2JzLGRlY3JlYXNpbmc9VFJVRSldDQoNCiMgd2Vla2x5IHdvcmtpbmcgdGltZSAobWVhbjsgU0QpDQpyb3VuZChtZWFuKHByZWxxcyR3ZWVrSG91cnMpLDIpOyByb3VuZChzZChwcmVscXMkd2Vla0hvdXJzKSwyKQ0KDQojIGhhdmluZyBhIHBhcnRuZXIgKGZyZXE7ICUpDQpzdW1tYXJ5KHByZWxxcyRwYXJ0bmVyKTsgcm91bmQoMTAwKnN1bW1hcnkocHJlbHFzJHBhcnRuZXIpL25yb3cocHJlbHFzKSwxKQ0KDQojIGhhdmluZyBhIGNoaWxkcmVuIChmcmVxOyAlKQ0Kc3VtbWFyeShwcmVscXMkY2hpbGRyZW4pOyByb3VuZCgxMDAqc3VtbWFyeShwcmVscXMkY2hpbGRyZW4pL25yb3cocHJlbHFzKSwxKQ0KDQojIGxpdmluZyBhcnJhbmdlbWVudHMgKGZyZXE7ICUpDQpzdW1tYXJ5KHByZWxxcyRob21lKTsgcm91bmQoMTAwKnN1bW1hcnkocHJlbHFzJGhvbWUpL25yb3cocHJlbHFzKSwxKQ0KDQojIHNtb2tpbmcgc3RhdHVzIChmcmVxOyAlKQ0Kc3VtbWFyeShwcmVscXMkc21va2VyKTsgcm91bmQoMTAwKnN1bW1hcnkocHJlbHFzJHNtb2tlcikvbnJvdyhwcmVscXMpLDEpDQpgYGANCg0KPGJyPg0KDQojIyAzLjIuIFJlc3BvbnNlIHJhdGUNCg0KSGVyZSwgd2UgcmVwb3J0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGFuZCByZXNwb25zZSByYXRlIGZvciBlYWNoIHZhcmlhYmxlLCBjb25zaWRlcmluZyB0aGUgaW5jbHVkZWQgc3Vic2FtcGxlLg0KYGBge3IgIH0NCiMgdG90YWwgbnVtYmVyIG9mIGRpYXJ5IGVudHJpZXMsIGRheXMsIGFuZCBwYXJ0aWNpcGFudHMNCmNhdChucm93KGNsZWFuW2NsZWFuJGFmdD09MSxdKStucm93KGNsZWFuW2NsZWFuJGV2ZT09MSxdKStucm93KGNsZWFuW2NsZWFuJG1vcj09MSxdKSwiZGlhcnkgZW50cnksIiwNCiAgICBucm93KGNsZWFuKSwiZGFpbHkgb2JzZXJ2YXRpb25zIGZyb20iLG5sZXZlbHMoY2xlYW4kSUQpLCJwYXJ0aWNpcGFudHMiKQ0KDQojIGNvbXB1dGluZyBOd2Vla3MsIE5vYnMsIGFuZCBjb21wbERheXMgdmFyaWFibGVzDQpwcmVscXMkTndlZWtzIDwtIHByZWxxcyRjb21wbE9icyA8LSBwcmVscXMkY29tcGxEYXlzIDwtIDENCmZvcihpIGluIDE6bnJvdyhwcmVscXMpKXsNCiAgaWYobWF4KGNsZWFuW2NsZWFuJElEPT1wcmVscXNbaSwiSUQiXSwiZGF5Il0pPjYpeyBwcmVscXNbaSwiTndlZWtzIl0gPC0gMiB9ICMgTm8uIG9mIHdlZWtzDQogIHByZWxxc1tpLCJjb21wbE9icyJdIDwtIG5yb3coY2xlYW5bY2xlYW4kSUQ9PXByZWxxc1tpLCJJRCJdICYgY2xlYW4kYWZ0PT0xLF0pICsgIyBOby4gb2YgY29tcGxldGUgb2JzZXJ2YXRpb25zDQogICAgbnJvdyhjbGVhbltjbGVhbiRJRD09cHJlbHFzW2ksIklEIl0gJiBjbGVhbiRldmU9PTEsXSkgKyBucm93KGNsZWFuW2NsZWFuJElEPT1wcmVscXNbaSwiSUQiXSAmIGNsZWFuJG1vcj09MSxdKQ0KICBwcmVscXNbaSwiY29tcGxEYXlzIl0gPC0gbnJvdyhjbGVhbltjbGVhbiRJRD09cHJlbHFzW2ksIklEIl0gJiBjbGVhbiRhZnQ9PTEgJiBjbGVhbiRldmU9PTEgJiBjbGVhbiRhZnQ9PTEsXSkgfSAjIE5vLiBmdWxsIGRheXMNCmNhdCgiU2FuaXR5IGNoZWNrOiIsbWluKHByZWxxcyRjb21wbERheXMpPT0zICYgbWF4KHByZWxxcyROd2Vla3MpPT0yKSAjIG1pbiAzIGNvbXBsZXRlIGRheXMgYW5kIG1heCAyIHdlZWtzDQoNCiMgbnVtYmVyIGFuZCAlIG9mIHBhcnRpY2lwYW50cyBpbnZvbHZlZCBmb3IgMSB2cy4gMiB3ZWVrcw0Kc3VtbWFyeShhcy5mYWN0b3IocHJlbHFzJE53ZWVrcykpDQpyb3VuZCgxMDAqc3VtbWFyeShhcy5mYWN0b3IocHJlbHFzJE53ZWVrcykpL25yb3cocHJlbHFzKSwxKQ0KDQojIGNvbXB1dGluZyByZXNwUmF0ZQ0KcHJlbHFzW3ByZWxxcyROd2Vla3M9PTEsInJlc3BSYXRlIl0gPC0gcm91bmQoMTAwKnByZWxxc1twcmVscXMkTndlZWtzPT0xLCJjb21wbE9icyJdLzE1LDIpICMgbWF4IDE1IG9icyB3aGVuIE53ZWVrcyA9IDENCnByZWxxc1twcmVscXMkTndlZWtzPT0yLCJyZXNwUmF0ZSJdIDwtIHJvdW5kKDEwMCpwcmVscXNbcHJlbHFzJE53ZWVrcz09MiwiY29tcGxPYnMiXS8zMCwyKSAjIG1heCAzMCBvYnMgd2hlbiBOd2Vla3MgPSAyDQoNCiMgY29tcHV0aW5nIGNvbXBsRGF5c1JhdGUNCnByZWxxc1twcmVscXMkTndlZWtzPT0xLCJjb21wbERheXNSYXRlIl0gPC0gcm91bmQoMTAwKnByZWxxc1twcmVscXMkTndlZWtzPT0xLCJjb21wbERheXMiXS81LDIpICMgbWF4IDUgZGF5cyB3aGVuIE53ZWVrcyA9IDENCnByZWxxc1twcmVscXMkTndlZWtzPT0yLCJjb21wbERheXNSYXRlIl0gPC0gcm91bmQoMTAwKnByZWxxc1twcmVscXMkTndlZWtzPT0yLCJjb21wbERheXMiXS8xMCwyKSAjIG1heCAxMCBkYXlzIHdoZW4gTndlZWtzID0gMg0KDQojIHByaW50aW5nIGluZm8NCmNhdCgiLSBOby4gY29tcGxldGUgcmVzcG9uc2VzIHBlciBwYXJ0aWNpcGFudHM6Iixyb3VuZChtZWFuKHByZWxxcyRjb21wbE9icyksMiksIiwgU0QgPSIscm91bmQoc2QocHJlbHFzJGNvbXBsT2JzKSwyKSwNCiAgICAiXG4tIHJlc3BvbnNlIHJhdGUgcGVyIHBhcnRpY2lwYW50czoiLHJvdW5kKG1lYW4ocHJlbHFzJHJlc3BSYXRlKSwyKSwiJSwgU0QgPSIscm91bmQoc2QocHJlbHFzJHJlc3BSYXRlKSwyKSwNCiAgICAiJVxuLSBOby4gY29tcGxldGUgZGF5cyAoQWZ0ICsgRXZlICsgTW9yKSBwZXIgcGFydGljaXBhbnRzIixyb3VuZChtZWFuKHByZWxxcyRjb21wbERheXMpLDIpLA0KICAgICIsIFNEID0iLHJvdW5kKHNkKHByZWxxcyRjb21wbERheXMpLDIpLCJcbi0gY29tcGxldGUgZGF5cyByYXRlIHBlciBwYXJ0aWNpcGFudHM6Iixyb3VuZChtZWFuKHByZWxxcyRjb21wbERheXNSYXRlKSwyKSwNCiAgICAiJSwgU0QgPSIscm91bmQoc2QocHJlbHFzJGNvbXBsRGF5c1JhdGUpLDIpLCIlIiwiXG4tIixucm93KHByZWxxc1twcmVscXMkTndlZWtzPT0yLF0pLCJvbiIsbnJvdyhwcmVscXMpLA0KICAgICJwYXJ0aWNpcGFudHMgaW52b2x2ZWQgZm9yIHR3byB3ZWVrcyAoIixyb3VuZCgxMDAqbnJvdyhwcmVscXNbcHJlbHFzJE53ZWVrcz09MixdKS9ucm93KHByZWxxcykpLA0KICAgICIlIClcbi0gbWVhbiBOby4gb2YgY29tcGxldGUgcmVzcG9uc2VzIGZvciB0aG9zZSBwYXJ0aWNpcGF0aW5nIG92ZXIgMiB3ZWVrcyA9IiwNCiAgICByb3VuZChtZWFuKHByZWxxc1twcmVscXMkTndlZWtzPT0yLCJjb21wbE9icyJdKSwyKSwNCiAgICAiXG4tIG1lYW4gTm8uIG9mIGNvbXBsZXRlIHJlc3BvbnNlcyBmb3IgdGhvc2UgcGFydGljaXBhdGluZyBvdmVyIDEgd2VlayA9IiwNCiAgICByb3VuZChtZWFuKHByZWxxc1twcmVscXMkTndlZWtzPT0xLCJjb21wbE9icyJdKSwyKSkNCmBgYA0KDQo8YnI+DQoNCiMjIDMuMy4gQmxvb2QgcHJlc3N1cmUgc3Vic2FtcGxlDQoNCkluIGFkZGl0aW9uIHRvIGZpbHRlcmluZyBwYXJ0aWNpcGFudCBiYXNlZCBvbiB0aGVpciBjb21wbGlhbmNlLCB3ZSBwcmUtcmVnaXN0ZXJlZCB0aGUgKipleGNsdXNpb24gb2YgYWxsIHBhcnRpY2lwYW50cyByZXBvcnRpbmcgdGFraW5nIGJsb29kIHByZXNzdXJlIG1lZGljYXRpb25zIGBicF9kcnVnc2Agb3Igc3VmZmVyaW5nIGZyb20gYSBjYXJkaW92YXNjdWxhciBkeXNmdW5jdGlvbiBgY3ZfZHlzZmAgZnJvbSB0aGUgYW5hbHlzZXMgb2YgYmxvb2QgcHJlc3N1cmUqKi4gSGVyZSwgd2UgZGVzY3JpYmUgc3VjaCBleGNsdWRlZCBwYXJ0aWNpcGFudHMgYW5kIHRoZSBzdWJzYW1wbGUgb2YgcGFydGljaXBhbnRzIGluY2x1ZGVkIGluIGJsb29kIHByZXNzdXJlIGFuYWx5c2VzLg0KYGBge3IgIH0NCiMgZmlsdGVyaW5nIHBhcnRpY2lwYW50cyB3aXRoIGJwX2RydWdzIG9yIGN2X2R5c2YNCkJQb3V0IDwtIHByZWxxc1twcmVscXMkYnBfZHJ1Z3M9PSJZZXMiIHwgcHJlbHFzJGN2X2R5c2Y9PSJZZXMiLF0NCkJQaW4gPC0gcHJlbHFzW3ByZWxxcyRicF9kcnVncz09Ik5vIiAmIHByZWxxcyRjdl9keXNmPT0iTm8iLF0NCg0KIyBzYW1wbGUgc2l6ZSBmb3IgYmxvb2QgcHJlc3N1cmUNCmNhdChucm93KGNsZWFuW2NsZWFuJElEICVpbiUgbGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoQlBpbiRJRCkpKSxdKSwib3ZzZXJ2YXRpb25zIChkYXlzKSBmcm9tIiwNCiAgICBubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoQlBpbiRJRCkpKSwicGFydGljaXBhbnRzIGluY2x1ZGVkIGluIEJQIGFuYWx5c2VzIikNCg0KIyBzb2Npb2RlbW9ncmFwaGljcyBpbiBleGNsdWRlZCBwYXJ0aWNpcGFudHMNCnN1bW1hcnkoQlBvdXQkZ2VuZGVyKTsgMTAwKnN1bW1hcnkoQlBvdXQkZ2VuZGVyKS9ucm93KEJQb3V0KSAjIGdlbmRlciAoZnJlcTsgJSkNCm1lYW4oQlBvdXQkYWdlKTsgc2QoQlBvdXQkYWdlKSAjIGFnZSAobWVhbiwgU0QpDQptZWFuKEJQb3V0JEJNSSk7IHNkKEJQb3V0JEJNSSkgIyBCTUkgKG1lYW4sIFNEKQ0KDQojIHJlc3BvbnNlIHJhdGUgaW4gaW5jbHVkZWQgcGFydGljaXBhbnRzDQpjYXQoIi0gTm8uIGNvbXBsZXRlIHJlc3BvbnNlcyBwZXIgcGFydGljaXBhbnRzOiIscm91bmQobWVhbihCUGluJGNvbXBsT2JzKSwyKSwiLCBTRCA9Iixyb3VuZChzZChCUGluJGNvbXBsT2JzKSwyKSwNCiAgICAiXG4tIHJlc3BvbnNlIHJhdGUgcGVyIHBhcnRpY2lwYW50czoiLHJvdW5kKG1lYW4oQlBpbiRyZXNwUmF0ZSksMiksIiUsIFNEID0iLHJvdW5kKHNkKEJQaW4kcmVzcFJhdGUpLDIpLA0KICAgICIlXG4tIE5vLiBjb21wbGV0ZSBkYXlzIChBZnQgKyBFdmUgKyBNb3IpIHBlciBwYXJ0aWNpcGFudHMiLHJvdW5kKG1lYW4oQlBpbiRjb21wbERheXMpLDIpLA0KICAgICIsIFNEID0iLHJvdW5kKHNkKEJQaW4kY29tcGxEYXlzKSwyKSwiXG4tIGNvbXBsZXRlIGRheXMgcmF0ZSBwZXIgcGFydGljaXBhbnRzOiIscm91bmQobWVhbihCUGluJGNvbXBsRGF5c1JhdGUpLDIpLA0KICAgICIlLCBTRCA9Iixyb3VuZChzZChCUGluJGNvbXBsRGF5c1JhdGUpLDIpLCIlIiwiXG4tIixucm93KEJQaW5bQlBpbiROd2Vla3M9PTIsXSksIm9uIixucm93KEJQaW4pLA0KICAgICJwYXJ0aWNpcGFudHMgaW52b2x2ZWQgZm9yIHR3byB3ZWVrcyAoIixyb3VuZCgxMDAqbnJvdyhCUGluW0JQaW4kTndlZWtzPT0yLF0pL25yb3coQlBpbikpLCIlICkiKQ0KYGBgDQoNCjxicj4NCg0KIyMgMy40LiBRdWFudGl0YXRpdmUgdmFyaWFibGVzDQoNCkhlcmUsIHdlIHVzZSB0aGUgYG11bHRpZGVzYygpYCBmdW5jdGlvbiBmb3IgY29tcHV0aW5nIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIChtZWFuLCBTRCBhbmQgSUNDKSBvZiBsZXZlbC0xIGFuZCBsZXZlbC0yIHZhcmlhYmxlcy4gV2UgY2FuIHNlZSB0aGF0IGBXSExTTWAgc2hvd3MgYW4gSUNDIG9mIC42MCwgaW5kaWNhdGluZyB0aGF0IG1vc3QgdmFyaWFuY2UgaXMgbG9jYXRlZCBhdCB0aGUgYmV0d2Vlbi1pbmRpdmlkdWFsIGxldmVsLCBidXQgd2l0aGluLWluZGl2aWR1YWwgdmFyaWFuY2UgaXMgc3RpbGwgc3Vic3RhbnRpYWwuIFNpbWlsYXIgcmVzdWx0cyBhcmUgc2hvd24gYnkgYmxvb2QgcHJlc3N1cmUgKElDQyByYW5naW5nIGZyb20gLjYxIHRvIC43MykgYW5kIGVtb3Rpb25hbCBleGhhdXN0aW9uIChJQ0MgPSAuNTYpLCB3aGVyZWFzIGhpZ2hlciBwcm9wb3J0aW9ucyBvZiB3aXRoaW4taW5kaXZpZHVhbCB2YXJpYWJpbGl0eSBhcmUgZXN0aW1hdGVkIGZvciBgU0RgLCBgUkRldGAsIGFuZCBgUlJlbGAuDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIHNlbGVjdGluZyBsZXZlbC0xIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMNCmx2MSA8LSBjKCJXSExTTSIsIlNCUF9hZnQiLCJEQlBfYWZ0IiwgIyBhZnRlcm5vb24NCiAgICAgICAgICJTQlBfZXZlIiwiREJQX2V2ZSIsIkVFIiwiUEQiLCAjIGV2ZW5pbmcNCiAgICAgICAgICJTRCIpICMgbmV4dCBtb3JuaW5nDQoNCiMgc2VsZWN0aW5nIGxldmVsLTIgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcw0KbHYyIDwtIGMoImFnZSIsIkJNSSIpDQoNCiMgY29tcHV0aW5nIGRlc2NyaXB0aXZlcw0KZGVzYyA8LSBtdWx0aWRlc2MobG9uZz1jbGVhbix3aWRlPXByZWxxcyxsdjE9bHYxLGx2Mj1sdjIpDQprYWJsZShkZXNjKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDMuNC4xLiBTdXJ2ZXkgZHVyYXRpb24NCg0KSGVyZSwgd2UgaW5zcGVjdCB0aGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIGRpYXJ5IHN1cnZleSBkdXJhdGlvbnMuIFdlIGNhbiBzZWUgdGhhdCwgYWZ0ZXIgZXhjbHVkaW5nIGEgZmV3IG91dGxpZXJzIHRha2luZyBtb3JlIHRoYW4gMzAgbWludXRlcywgdGhlIGF2ZXJhZ2UgcmVzcG9uc2UgdGltZSB0byBkaWFyeSBzdXJ2ZXlzIHdhcyA0LjAyIG1pbnV0ZXMgKFNEID0gMy41MSBtaW4pLg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTN9DQojIGNvbXB1dGluZyBkdXJhdGlvbnMgaW4gbWludXRlcw0KY2xlYW4kZHVyX2FmdCA8LSBkaWZmdGltZShjbGVhbiRlbmRfYWZ0LGNsZWFuJHN0YXJ0X2FmdCx1bml0cz0ibWlucyIpDQpjbGVhbiRkdXJfZXZlIDwtIGRpZmZ0aW1lKGNsZWFuJGVuZF9ldmUsY2xlYW4kc3RhcnRfZXZlLHVuaXRzPSJtaW5zIikNCmNsZWFuJGR1cl9tb3IgPC0gZGlmZnRpbWUoY2xlYW4kZW5kX21vcixjbGVhbiRzdGFydF9tb3IsdW5pdHM9Im1pbnMiKQ0KdmFycyA8LSBwYXN0ZTAoImR1cl8iLGMoImFmdCIsImV2ZSIsIm1vciIpKQ0KY2xlYW5bLHZhcnNdIDwtIGxhcHBseShjbGVhblssdmFyc10sYXMubnVtZXJpYykNCmNsZWFuJGR1cl9tZWFuIDwtIGFwcGx5KGNsZWFuWyxjKCJkdXJfYWZ0IiwiZHVyX2V2ZSIsImR1cl9tb3IiKV0sMSxtZWFuLG5hLnJtPVRSVUUpDQoNCiMgcGxvdHRpbmcgZHVyYXRpb25zDQpwYXIobWZyb3c9YygxLDQpKTsgZm9yKFZhciBpbiBjKHZhcnMsImR1cl9tZWFuIikpeyANCiAgaGlzdChjbGVhblssVmFyXSxicmVha3M9MTAwLG1haW49cGFzdGUoVmFyLCJOID0iLGxlbmd0aChuYS5vbWl0KGNsZWFuWyxWYXJdKSkpKSB9DQoNCiMgTm8uIGNhc2VzID4gMzAgbWluICg4IHRvIDE1KQ0KZm9yKFZhciBpbiBjKHZhcnMsImR1cl9tZWFuIikpeyANCiAgY29sbmFtZXMoY2xlYW4pW3doaWNoKGNvbG5hbWVzKGNsZWFuKT09VmFyKV0gPC0gIlZhciINCiAgY2F0KFZhciwiPiA2MCBtaW46Iixucm93KGNsZWFuWyFpcy5uYShjbGVhbiRWYXIpICYgY2xlYW4kVmFyID4gMzAsXSksIiAgIikgDQogIGNvbG5hbWVzKGNsZWFuKVt3aGljaChjb2xuYW1lcyhjbGVhbik9PSJWYXIiKV0gPC0gVmFyIH0NCg0KIyBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gKGluIG1pbnV0ZXMpIHdpdGhvdXQgY29uc2lkZXJpbmcgc3VjaCBvdXRsaWVycw0Kcm91bmQobWVhbihjbGVhbiRkdXJfbWVhbltjbGVhbiRkdXJfbWVhbjwzMF0sbmEucm09VFJVRSksMikNCnJvdW5kKHNkKGNsZWFuJGR1cl9tZWFuW2NsZWFuJGR1cl9tZWFuPDMwXSxuYS5ybT1UUlVFKSwyKQ0KDQojIHJlbW92aW5nIHZhcmlhYmxlcw0KY2xlYW5bLGModmFycywiZHVyX21lYW4iKV0gPC0gTlVMTA0KYGBgDQoNCjxicj4NCg0KIyMgMy41LiBDb3JyZWxhdGlvbnMNCg0KU2Vjb25kLCB3ZSB1c2UgdGhlIGBtdWx0aWNvcnJgIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGJldHdlZW4taW5kaXZpZHVhbCAoc2hvd24gYmVsb3cgdGhlIG1haW4gZGlhZ29uYWwpIGFuZCB0aGUgd2l0aGluLWluZGl2aWR1YWwgY29ycmVsYXRpb25zIChzaG93biBhYm92ZSB0aGUgbWFpbiBkaWFnb25hbCkgYW1vbmcgdGhlIHNhbWUgY29udGludW91cyB2YXJpYWJsZXMuDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpjb3JzIDwtIG11bHRpY29ycihsb25nPWNsZWFuLHdpZGU9cHJlbHFzLGx2MT1sdjEsbHYyPWx2MikNCmthYmxlKGNvcnMpDQpgYGANCg0KPGJyPg0KDQpDb3JyZWxhdGlvbnMgYXJlIGFsc28gZ3JhcGhpY2FsbHkgdmlzdWFsaXplZCBiZWxvdyAoYmx1ZSA9IG5lZ2F0aXZlLCB3aGl0ZSA9IHVuY29ycmVsYXRlZCwgcmVkID0gcG9zaXRpdmUpLg0KYGBge3IgIGZpZy53aWR0aD0xMixmaWcuaGVpZ2h0PTgsd2FybmluZz1GQUxTRX0NCmdncGxvdChtZWx0KGFzLm1hdHJpeChtdWx0aWNvcnIobG9uZz1jbGVhbix3aWRlPXByZWxxcyxsdjE9bHYxLGx2Mj1sdjIpKSksYWVzKHg9VmFyMSwgeT1WYXIyLCBmaWxsPXZhbHVlKSkgKyBnZW9tX3RpbGUoKSArIA0KICBnZW9tX3RleHQoYWVzKHggPSBWYXIxLCB5ID0gVmFyMiwgbGFiZWwgPSByb3VuZCh2YWx1ZSwyKSksY29sb3I9ImJsYWNrIixzaXplPTUpK2xhYnMoeD0iIix5PSIiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iZGFya2JsdWUiLGhpZ2g9IiNmMDNiMjAiLG1pZD0id2hpdGUiLG1pZHBvaW50PTAsbGltaXQgPSBjKC0xLDEpLCBzcGFjZSA9ICJMYWIiLA0KICAgICAgICAgICAgICAgICAgICAgICBndWlkZT0ibGVnZW5kIixicmVha3M9cm91bmQoc2VxKDEsLTEsbGVuZ3RoLm91dCA9IDExKSwyKSkrDQogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLHNpemU9MTApLGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0zMCkpDQpgYGANCg0KPGJyPg0KDQojIyAzLjYuIFVuaXZhcmlhdGUgZGlzdHJpYnV0aW9ucw0KDQpGb3VydGgsIHdlIHZpc3VhbGl6ZSB0aGUgdW5pdmFyaWF0ZSBkaXN0cmlidXRpb25zIG9mIHRoZSBmb2NhbCB2YXJpYWJsZXMsIGZvciBlYWNoIGNsYXNzIG9mIHZhcmlhYmxlcy4gV2UgY2FuIHNlZSB0aGF0IGxldmVsLTEgc2VsZi1yZXBvcnRlZCBwcmVkaWN0b3JzIHNob3cgcXVpdGUgc2tld2VkIGRpc3RyaWJ1dGlvbnMuIEhvd2V2ZXIsIHBlcnNvbi1tZWFuIGNlbnRlcmVkIHNjb3JlcyBhcmUgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZC4NCmBgYHtyIGZpZy53aWR0aD0xMixmaWcuaGVpZ2h0PTZ9DQojIGxldmVsLTINCnBhcihtZnJvdz1jKDMsNikpOyBmb3IoVmFyIGluIGMobHYyLCJnZW5kZXIiLCJlZHUiLCJtU3RhdHVzIiwiaG9tZV9wYXJ0bmVyIiwiY2hpbGRyZW4iLCJob21lX2NoaWxkIiwicG9zaXRpb24iLCJzZWN0b3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic21va2VyIiwiY2FyZWxlc3MiLCJicF9kcnVncyIsImhvcm1fZHJ1Z3MiLCJwc3lfZHJ1Z3MiLCJjdl9keXNmIiwic2xlZXBfZHlzZiIpKXsNCiAgaWYoY2xhc3MoY2xlYW5bLFZhcl0pJWluJWMoImZhY3RvciIsImxvZ2ljYWwiKSl7IHBsb3QoY2xlYW5bIWR1cGxpY2F0ZWQoY2xlYW4kSUQpLFZhcl0sbWFpbj1WYXIseGxhYj0iIikgDQogICAgfSBlbHNlIHsgaGlzdChjbGVhblshZHVwbGljYXRlZChjbGVhbiRJRCksVmFyXSxtYWluPVZhcix4bGFiPSIiKSB9fQ0KDQojIGxldmVsLTEgKGNvbXBvc2l0ZSBzY29yZXMpDQpwYXIobWZyb3c9YygzLDYpKTsgZm9yKFZhciBpbiBjKGx2MSwiZGFpbHlIYXNzbGVzX2V2ZSIsImxhdGVXb3JrSG91cnMiLCJmbGFnVGltZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZV9hZnQiLCJ0ZWxlV29yayIsImNvbmZvdW5kZXJzX2FmdCIsImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFnQlBfYWZ0IiwiZmxhZ0JQX2V2ZSIpKXsgDQogIGlmKGNsYXNzKGNsZWFuWyxWYXJdKSVpbiVjKCJmYWN0b3IiLCJsb2dpY2FsIikpeyBwbG90KGNsZWFuWyFkdXBsaWNhdGVkKGNsZWFuJElEKSxWYXJdLG1haW49VmFyLHhsYWI9IiIpIA0KICAgIH0gZWxzZSB7IGhpc3QoY2xlYW5bIWR1cGxpY2F0ZWQoY2xlYW4kSUQpLFZhcl0sbWFpbj1WYXIseGxhYj0iIikgfX0NCg0KIyBsZXZlbC0xIChwZXJzb24tbWVhbi1jZW50ZXJlZCBzY29yZXMpDQpwYXIobWZyb3c9YygyLDQpKQ0KZm9yKFZhciBpbiBsdjEpeyB3aWRlIDwtIGNsZWFuWyFkdXBsaWNhdGVkKGNsZWFuJElEKSxdDQogIHdpZGVbLHBhc3RlMChWYXIsIi5jbSIpXSA8LSBhZ2dyZWdhdGUoY2xlYW5bLFZhcl0sbGlzdChjbGVhbiRJRCksRlVOPW1lYW4sbmEucm09VFJVRSlbLDJdDQogIGNsZWFuIDwtIHBseXI6OmpvaW4oY2xlYW4sd2lkZVssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikNCiAgY2xlYW5bLHBhc3RlMChWYXIsIi5tYyIpXSA8LSBjbGVhblssVmFyXSAtIGNsZWFuWyxwYXN0ZTAoVmFyLCIuY20iKV0NCiAgaGlzdChjbGVhblsscGFzdGUwKFZhciwiLm1jIildLG1haW49VmFyLHhsYWI9IiIpIA0KICBjbGVhbiA8LSBjbGVhblssMToobmNvbChjbGVhbiktMildfQ0KYGBgDQoNCjxicj4NCg0KIyMgMy43LiBCaXZhcmlhdGUgZGlzdHJpYnV0aW9ucyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KRmlmdGgsIHdlIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggZm9jYWwgdmFyaWFibGUgKGkuZS4sIHdvcmthaG9saXNtLCBibG9vZCBwcmVzc3VyZSwgZW1vdGlvbmFsIGV4aGF1c3Rpb24sIGFuZCBzbGVlcCBkaXN0dXJiYW5jZXMpIGFuZCBwb3RlbnRpYWwgY292YXJpYXRlIGFnYWluc3QgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWNhbCB2YXJpYWJsZXM6DQoNCjEuICoqRGVtb2dyYXBoaWNzKio6IGBnZW5kZXJgLCBlZHVjYXRpb25hbCBsZXZlbCBgZWR1YCwgbWFyaXRhbCBzdGF0dXMgYG1TdGF0dXNgIGFuZCBsaXZpbmcgd2l0aCBhIHBhcnRuZXIgYGhvbWVfcGFydG5lcmAsIGhhdmluZyBjaGlsZHJlbiBgY2hpbGRyZW5gIGFuZCBsaXZpbmcgd2l0aCBjaGlsZHJlbiBgaG9tZV9jaGlsZGAsIGpvYiBwb3NpdGlvbiBgcG9zaXRpb25gIGFuZCBgc2VjdG9yYA0KDQoyLiAqKkluY2x1c2lvbiBjcml0ZXJpYSoqOiBibG9vZCBwcmVzc3VyZSBgYnBfZHJ1Z3NgLCBob3Jtb25hbCBgaG9ybV9kcnVnc2AsIGFuZCBwc3ljaG9hY3RpdmUgbWVkaWNhdGlvbiBgcHN5X2RydWdzYCwgY2FyZGlvdmFzY3VsYXIgYGN2X2R5c2ZgIGFuZCBzbGVlcCBkeXNmdW5jdGlvbnMgYHNsZWVwX2R5c2ZgDQoNCjMuICoqTGV2ZWwtMiBjb25mb3VuZGVycyoqOiBiZWluZyBhIHNtb2tlciBgc21va2VyYCBvciBhIGNhcmVsZXNzIHJlc3BvbmRlbnQgYGNhcmVsZXNzYCANCg0KNC4gKipMZXZlbC0xIGNvbmZvdW5kZXJzKio6IGRhaWx5IG5vbndvcmsgaGFzc2xlcyBpbiB0aGUgZXZlbmluZyBgZGFpbHlIYXNzbGVzX2V2ZWAsIHByZXNlbmNlIG9mIGxhdGUgd29ya2luZyBob3VycyBpbiB0aGUgZXZlbmluZyBgbGF0ZVdvcmtIb3Vyc2AsIGF0eXBpY2FsIHJlc3BvbnNlIHRpbWVzIGBmbGFnVGltZWANCg0KNS4gKipMZXZlbC0xIGNvdmFyaWF0ZXMqKjogc3VydmV5IGxvY2F0aW9uIGluIHRoZSBhZnRlcm5vb24gYHdoZXJlX2FmdGAsIHJlbW90ZSB3b3JraW5nIGB0ZWxlV29ya2ANCg0KNi4gKipCUCBjb25mb3VuZGVycyoqOiBhZ2dyZWdhdGVkIGNvbmZvdW5kZXJzIHNjb3JlIGBjb25mb3VuZGVyc19hZnRgIGFuZCBgY29uZm91bmRlcnNfZXZlYDsgY29mZmVlIGBjb2ZmZV9hZnRgLCBgY29mZmVfZXZlYDsgc21va2luZyBgc21va2VfYWZ0YCwgYHNtb2tlX2V2ZWA7IHZpZ29yb3VzIHBoeXNpY2FsIGFjdGl2aXR5IGBzcG9ydF9hZnRgLCBgc3BvcnRfZXZlYCwgaGF2aW5nIGEgbWVhbCBgbWVhbF9hZnRgLCBgbWVhbF9ldmVgOyBhbmQgZmxhZ2dlZCBCUCBjYXNlcyBgZmxhZ0JQX2FmdGAsIGBmbGFnQlBfZXZlYCAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFMzXShodHRwczovL0x1Y2EtTWVuZ2hpbmkuZ2l0aHViLmlvL3RoZS1kYWlseS1jb3N0cy1vZi13b3JrYWhvbGlzbS9TM19wcmVQcm9jZXNzaW5nL1MzX2RhdGEtcHJvY2Vzc2luZy1jb2RlLWFuZC1vdXRwdXQuaHRtbCkpDQoNCjxicj4NCg0KVGhlIGBiaXZQbG90YCBmdW5jdGlvbiBpcyB1c2VkIHRvIG9wdGltaXplIHRoZSBkYXRhIHZpc3VhbGl6YXRpb24uDQoNCjxkZXRhaWxzPjxzdW1tYXJ5PmBiaXZQbG90KClgPC9zdW1tYXJ5Pg0KPHA+DQpgYGB7ciB9DQpiaXZQbG90IDwtIGZ1bmN0aW9uKGRhdGEscmVzcCxwcmVkcyl7IHJlcXVpcmUoZ2dwbG90MikNCiBmb3IoVmFyIGluIHByZWRzKXsgDQogICBwcmludCgNCiAgICAgZ2dwbG90KG5hLm9taXQoZGF0YVssYyhyZXNwLFZhcildKSxhZXNfc3RyaW5nKHg9VmFyLHk9cmVzcCxmaWxsPVZhcikpICsgDQogICAgICAgZ2VvbV9wb2ludChjb2w9ImdyYXkiLHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcih3aWR0aD0uMTUpKSArICMgZGF0YSBwb2ludHMNCiAgICAgICBnZW9tX3Zpb2xpbihhbHBoYT0uNCkgKyBnZW9tX2JveHBsb3Qod2lkdGg9MC4zLGFscGhhPTAuMikgKyAjIHZpb2xpbiAmIGJveHBsb3QNCiAgICAgICBnZ3RpdGxlKHBhc3RlKHJlc3AsImJ5IixWYXIpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICMgdGl0bGUgYW5kIHJlbW92aW5nIGxlZ2VuZA0KICAgICApfX0NCmBgYA0KPC9wPg0KPC9kZXRhaWxzPg0KDQo8YnI+DQoNCiMjIyBERU1PUyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyBXSExTTQ0KDQpIaWdoZXIgYFdITFNNYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYGNoaWxkcmVuID0gIk5vImAgb3IgYGhvbWVfY2hpbGQgPSAiTm8iYCAod2l0aCBsYXJnZXIgZGlmZmVyZW5jZXMgZm9yIHRoZSBsYXR0ZXIpLCB3aGVyZSBgcGFydG5lciA9ICJObyJgLCBhbmQgd2hlcmUgYGVkdSA9ICJ1bml2ZXJzaXR5KyJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJXSExTTSIscHJlZD1jKCJnZW5kZXIiLCJlZHUiLCJjaGlsZHJlbiIsImhvbWVfY2hpbGQiLCJwYXJ0bmVyIiwiaG9tZV9wYXJ0bmVyIiwicG9zaXRpb24iLCJzZWN0b3IiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgQlAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkJsb29kIHByZXNzdXJlIGlzIG1haW5seSBhZmZlY3RlZCBieSBgY2hpbGRyZW5gLCB3aXRoIGBTQlBfYWZ0YCwgYFNCUF9ldmVgIGFuZCBtb3JuaW5nIGJsb29kIHByZXNzdXJlIGFsc28gc2hvd2luZyBkaWZmZXJlbmNlcyBieSBgZ2VuZGVyYCwgd2hpbGUgbW9ybmluZyBibG9vZCBwcmVzc3VyZSBpcyBhbHNvIGFmZmVjdGVkIGJ5IGBwYXJ0bmVyYC4NCg0KIyMjIyMgU0JQX2FmdA0KDQpIaWdoZXIgYFNCUF9hZnRgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgZ2VuZGVyID0gIk0iYCwgYGNoaWxkcmVuID0gIlllcyJgIG9yIGBob21lX2NoaWxkID0gIlllcyJgICh3aXRoIGxhcmdlciBkaWZmZXJlbmNlcyBmb3IgdGhlIGZvcm1lciksIHdpdGggc2xpZ2h0bHkgaGlnaGVyIGBTQlBfYWZ0YCBpbiBjYXNlcyB3aGVyZSBgcGFydG5lciA9ICJZZXMiYCwgd2hlcmUgYGVkdSA9ICJoaWdoc2Nob29sLSJgLCBhbmQgd2hlcmUgYHBvc2l0aW9uID0gImVtcGxveWVyX21uZyJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJTQlBfYWZ0IixwcmVkPWMoImdlbmRlciIsImVkdSIsImNoaWxkcmVuIiwiaG9tZV9jaGlsZCIsInBhcnRuZXIiLCJob21lX3BhcnRuZXIiLCJwb3NpdGlvbiIsInNlY3RvciIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2FmdA0KDQpIaWdoZXIgYERCUF9hZnRgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgY2hpbGRyZW4gPSAiWWVzImAgb3IgYGhvbWVfY2hpbGQgPSAiWWVzImAgKHdpdGggbGFyZ2VyIGRpZmZlcmVuY2VzIGZvciB0aGUgZm9ybWVyKSwgd2l0aCBzbGlnaHRseSBoaWdoZXIgYERCUF9hZnRgIGluIGNhc2VzIHdoZXJlIGBwYXJ0bmVyID0gIlllcyJgLCBhbmQgd2hlcmUgYHNlY3RvciA9ICJwdWJsaWMiYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iREJQX2FmdCIscHJlZD1jKCJnZW5kZXIiLCJlZHUiLCJjaGlsZHJlbiIsImhvbWVfY2hpbGQiLCJwYXJ0bmVyIiwiaG9tZV9wYXJ0bmVyIiwicG9zaXRpb24iLCJzZWN0b3IiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMjIFNCUF9ldmUNCg0KSGlnaGVyIGBTQlBfZXZlYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYGdlbmRlciA9ICJNImAsIGBjaGlsZHJlbiA9ICJZZXMiYCBvciBgaG9tZV9jaGlsZCA9ICJZZXMiYCAod2l0aCBsYXJnZXIgZGlmZmVyZW5jZXMgZm9yIHRoZSBmb3JtZXIpLCB3aXRoIHNsaWdodGx5IGhpZ2hlciBgU0JQX2FmdGAgaW4gY2FzZXMgd2hlcmUgYHBhcnRuZXIgPSAiWWVzImAsIHdoZXJlIGBlZHUgPSAiaGlnaHNjaG9vbCsiYCwgYW5kIHdoZXJlIGBzZWN0b3IgPSAiUHVibGljImAuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNCUF9ldmUiLHByZWQ9YygiZ2VuZGVyIiwiZWR1IiwiY2hpbGRyZW4iLCJob21lX2NoaWxkIiwicGFydG5lciIsImhvbWVfcGFydG5lciIsInBvc2l0aW9uIiwic2VjdG9yIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQoNClNsaWdodGx5IGhpZ2hlciBgREJQX2V2ZWAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBjaGlsZHJlbiA9ICJZZXMiYCBvciBgaG9tZV9jaGlsZCA9ICJZZXMiYCAod2l0aCBsYXJnZXIgZGlmZmVyZW5jZXMgZm9yIHRoZSBmb3JtZXIpLCB3ZXJlIGBwYXJ0bmVyID0gIlllcyJgLCBhbmQgd2hlcmUgYHNlY3RvciA9ICJwdWJsaWMiYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iREJQX2V2ZSIscHJlZD1jKCJnZW5kZXIiLCJlZHUiLCJjaGlsZHJlbiIsImhvbWVfY2hpbGQiLCJwYXJ0bmVyIiwiaG9tZV9wYXJ0bmVyIiwicG9zaXRpb24iLCJzZWN0b3IiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgRUUNCg0KSGlnaGVyIGBFRWAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBob21lX2NoaWxkID0gIk5vImAuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IkVFIixwcmVkPWMoImdlbmRlciIsImVkdSIsImNoaWxkcmVuIiwiaG9tZV9jaGlsZCIsInBhcnRuZXIiLCJob21lX3BhcnRuZXIiLCJwb3NpdGlvbiIsInNlY3RvciIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBTRA0KDQpIaWdoZXIgYFNEYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYGdlbmRlciA9ICJGImAsIHdoZXJlIGBob21lX2NoaWxkID0gIlllcyJgLCB3aGVyZSBgaG9tZV9wYXJ0bmVyID0gIk5vImAsIGFuZCB3aGVyZSBgcG9zaXRpb24gPSAiZW1wbG95ZWVfcHJvaiJgLg0KYGBge3IgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNEIixwcmVkPWMoImdlbmRlciIsImVkdSIsImNoaWxkcmVuIiwiaG9tZV9jaGlsZCIsInBhcnRuZXIiLCJob21lX3BhcnRuZXIiLCJwb3NpdGlvbiIsInNlY3RvciIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIElOQ0xVU0lPTiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyBXSExTTQ0KDQpIaWdoZXIgYFdITFNNYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYGJwX2RydWdzID0gIlllcyJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJXSExTTSIscHJlZD1jKCJicF9kcnVncyIsICJob3JtX2RydWdzIiwgInBzeV9kcnVncyIsICJjdl9keXNmIiwgInNsZWVwX2R5c2YiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgQlAgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkJsb29kIHByZXNzdXJlIGlzIG1haW5seSBhZmZlY3RlZCBieSBgYnBfZHJ1Z3NgLCBhbmQgYGN2X2R5c2ZgLCB3aGljaCBmdXJ0aGVyIGNvcnJvYm9yYXRlIHRoZSB2YWxpZGl0eSBvZiBvdXIgYmxvb2QgcHJlc3N1cmUgbWVhc3VyZW1lbnRzIGFuZCB0aGUgaW1wb3J0YW5jZSBvZiBvdXIgcHJlLXJlZ2lzdGVyZWQgZXhjbHVzaW9uIGNyaXRlcmlhLg0KDQojIyMjIyBTQlBfYWZ0DQoNCkhpZ2hlciBgU0JQX2FmdGAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBicF9kcnVncyA9ICJZZXMiYCBhbmQgYGN2X2R5c2YgPSAiWWVzImAsIHdpdGggb25seSBhIHNsaWdodGx5IGxvd2VyIGBTQlBfYWZ0YCBpbiBjYXNlcyB3aGVyZSAgYGhvcm1fZHJ1Z3MgPSAiTm8iYC4gDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNCUF9hZnQiLHByZWQ9YygiYnBfZHJ1Z3MiLCAiaG9ybV9kcnVncyIsICJwc3lfZHJ1Z3MiLCAiY3ZfZHlzZiIsICJzbGVlcF9keXNmIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfYWZ0DQoNCkhpZ2hlciBgREJQX2FmdGAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBicF9kcnVncyA9ICJZZXMiYCBhbmQgYGN2X2R5c2YgPSAiWWVzImAsIHdpdGggb25seSBhIHNsaWdodGx5IGxvd2VyIGBEQlBfYWZ0YCBpbiBjYXNlcyB3aGVyZSAgYGhvcm1fZHJ1Z3MgPSAiTm8iYC4gDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IkRCUF9hZnQiLHByZWQ9YygiYnBfZHJ1Z3MiLCAiaG9ybV9kcnVncyIsICJwc3lfZHJ1Z3MiLCAiY3ZfZHlzZiIsICJzbGVlcF9keXNmIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBTQlBfZXZlDQoNCkhpZ2hlciBgU0JQX2V2ZWAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBicF9kcnVncyA9ICJZZXMiYCBhbmQgYGN2X2R5c2YgPSAiWWVzImAuIA0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJTQlBfZXZlIixwcmVkPWMoImJwX2RydWdzIiwgImhvcm1fZHJ1Z3MiLCAicHN5X2RydWdzIiwgImN2X2R5c2YiLCAic2xlZXBfZHlzZiIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2V2ZQ0KDQpIaWdoZXIgYERCUF9ldmVgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgYnBfZHJ1Z3MgPSAiWWVzImAgYW5kIGBjdl9keXNmID0gIlllcyJgLiANCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iREJQX2V2ZSIscHJlZD1jKCJicF9kcnVncyIsICJob3JtX2RydWdzIiwgInBzeV9kcnVncyIsICJjdl9keXNmIiwgInNsZWVwX2R5c2YiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgRUUNCg0KSGlnaGVyIGBFRWAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBicF9kcnVncyA9ICJZZXMiYCBvciBgcHN5X2RydWdzID0gIlllcyJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJFRSIscHJlZD1jKCJicF9kcnVncyIsICJob3JtX2RydWdzIiwgInBzeV9kcnVncyIsICJjdl9keXNmIiwgInNsZWVwX2R5c2YiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgU0QNCg0KYFNEYCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgaW5jbHVzaW9uIGNyaXRlcmlhIGxldmVscywgd2l0aCBvbmx5IHNsaWdodGx5IGhpZ2hlciBgU0RgIGZvciB0aG9zZSByZXBvcnRpbmcgYGJwX2RydWdzID0gIlllcyJgLiBDcml0aWNhbGx5LCBgU0RgIGRvZXMgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyIGFjcm9zcyBgc2xlZXBfZHlzZmAgbGV2ZWxzLCBjb3Jyb2JvcmF0aW5nIG91ciBjaG9pY2UgdG8gbm90IHJlbHkgb24gdGhpcyBpbmNsdXNpb24gY3JpdGVyaW9uIChzZWUgW1N1cHBsZW1lbnRhcnkgTWF0ZXJpYWwgUzddKGh0dHBzOi8vb3NmLmlvL2JwcnZnKSkuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNEIixwcmVkPWMoImJwX2RydWdzIiwgImhvcm1fZHJ1Z3MiLCAicHN5X2RydWdzIiwgImN2X2R5c2YiLCAic2xlZXBfZHlzZiIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIExWLTIgQ09ORiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KIyMjIyBXSExTTQ0KDQpgV0hMU01gIGRvZXMgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyIGFjcm9zcyBsZXZlbC0yIGNvbmZvdW5kZXJzIGxldmVscywgd2l0aCBvbmx5IHNsaWdodGx5IGhpZ2hlciBgV0hMU01gIGluIHRob3NlIHdpdGggYHNtb2tlciA9ICJxdWl0X2xlc3NgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJXSExTTSIscHJlZD1jKCJzbW9rZXIiLCJjYXJlbGVzcyIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBCUCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KQmxvb2QgcHJlc3N1cmUgaXMgbm90IHN1YnN0YW50aWFsbHkgYWZmZWN0ZWQgYnkgbGV2ZWwtMiBjb25mb3VuZGVycy4gQWx0aG91Z2ggaXQgaXMgbG93ZXIgaW4gcG90ZW50aWFsbHkgYGNhcmVsZXNzYCBwYXJ0aWNpcGFudHMsIHRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSB2ZXJ5IHNtYWxsIG51bWJlciBvZiBzdWNoIGNhc2VzLg0KDQojIyMjIyBTQlBfYWZ0DQoNCmBTQlBfYWZ0YCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgbGV2ZWwtMiBjb25mb3VuZGVycyBsZXZlbHMuIEFsdGhvdWdoIGl0IGlzIGxvd2VyIGluIHBvdGVudGlhbGx5IGBjYXJlbGVzc2AgcGFydGljaXBhbnRzLCB0aGlzIG1pZ2h0IGJlIGR1ZSB0byB0aGUgdmVyeSBzbWFsbCBudW1iZXIgb2Ygc3VjaCBjYXNlcy4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0JQX2FmdCIscHJlZD1jKCJzbW9rZXIiLCJjYXJlbGVzcyIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2FmdA0KDQpgREJQX2FmdGAgaXMgc2xpZ2h0bHkgbG93ZXIgaW4gYHNtb2tlcmAgcGFydGljaXBhbnRzLiBBbHRob3VnaCBpdCBpcyBsb3dlciBpbiBwb3RlbnRpYWxseSBgY2FyZWxlc3NgIHBhcnRpY2lwYW50cywgdGhpcyBtaWdodCBiZSBkdWUgdG8gdGhlIHZlcnkgc21hbGwgbnVtYmVyIG9mIHN1Y2ggY2FzZXMuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IkRCUF9hZnQiLHByZWQ9Yygic21va2VyIiwiY2FyZWxlc3MiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMjIFNCUF9ldmUNCg0KYFNCUF9ldmVgIGRvZXMgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyIGFjcm9zcyBsZXZlbC0yIGNvbmZvdW5kZXJzIGxldmVscy4gQWx0aG91Z2ggaXQgaXMgbG93ZXIgaW4gcG90ZW50aWFsbHkgYGNhcmVsZXNzYCBwYXJ0aWNpcGFudHMsIHRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSB2ZXJ5IHNtYWxsIG51bWJlciBvZiBzdWNoIGNhc2VzLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJTQlBfZXZlIixwcmVkPWMoInNtb2tlciIsImNhcmVsZXNzIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQoNCmBEQlBfZXZlYCBpcyBzbGlnaHRseSBsb3dlciBpbiBgc21va2VyYCBwYXJ0aWNpcGFudHMuIEFsdGhvdWdoIGl0IGlzIGxvd2VyIGluIHBvdGVudGlhbGx5IGBjYXJlbGVzc2AgcGFydGljaXBhbnRzLCB0aGlzIG1pZ2h0IGJlIGR1ZSB0byB0aGUgdmVyeSBzbWFsbCBudW1iZXIgb2Ygc3VjaCBjYXNlcy4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iREJQX2V2ZSIscHJlZD1jKCJzbW9rZXIiLCJjYXJlbGVzcyIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBFRQ0KDQpgRUVgIGRvZXMgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyIGFjcm9zcyBsZXZlbC0yIGNvbmZvdW5kZXJzIGxldmVscy4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iRUUiLHByZWQ9Yygic21va2VyIiwiY2FyZWxlc3MiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgU0QNCg0KYFNEYCBpcyBsb3dlciBpbiBpbmRpdmlkdWFscyB3aXRoIGBzbW9rZXIgPSAiWWVzImAuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNEIixwcmVkPWMoInNtb2tlciIsImNhcmVsZXNzIikpDQpgYGANCg0KPGJyPg0KDQojIyMgTFYtMSBDT05GIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMjIFdITFNNDQoNClNsaWdodGx5IGhpZ2hlciBgV0hMU01gIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgbGF0ZVdvcmtIb3VycyA9IFRSVUVgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJXSExTTSIscHJlZD1jKCJkYWlseUhhc3NsZXNfZXZlIiwibGF0ZVdvcmtIb3VycyIsImZsYWdUaW1lIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIEJQIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpCbG9vZCBwcmVzc3VyZSBpcyBub3Qgc3Vic3RhbnRpYWxseSBhZmZlY3RlZCBieSBsZXZlbC0xIGNvbmZvdW5kZXJzLg0KDQojIyMjIyBTQlBfYWZ0DQoNCmBTQlBfYWZ0YCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgbGV2ZWwtMSBjb25mb3VuZGVycyBsZXZlbHMuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IlNCUF9hZnQiLHByZWQ9YygiZGFpbHlIYXNzbGVzX2V2ZSIsImxhdGVXb3JrSG91cnMiLCJmbGFnVGltZSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2FmdA0KDQpgREJQX2FmdGAgZG9lcyBub3Qgc3Vic3RhbnRpYWxseSBkaWZmZXIgYWNyb3NzIGxldmVsLTEgY29uZm91bmRlcnMgbGV2ZWxzLCB3aXRoIG9ubHkgc2xpZ2h0bHkgaGlnaGVyIGBEQlBfYWZ0YCBpbiBjYXNlcyB3aGVyZSBgbGF0ZVdvcmtIb3VycyA9IFRSVUVgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJEQlBfYWZ0IixwcmVkPWMoImRhaWx5SGFzc2xlc19ldmUiLCJsYXRlV29ya0hvdXJzIiwiZmxhZ1RpbWUiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMjIFNCUF9ldmUNCg0KYFNCUF9ldmVgIGRvZXMgbm90IHN1YnN0YW50aWFsbHkgZGlmZmVyIGFjcm9zcyBsZXZlbC0xIGNvbmZvdW5kZXJzIGxldmVscywgd2l0aCBvbmx5IHNsaWdodGx5IGhpZ2hlciBgU0JQX2V2ZWAgaW4gY2FzZXMgd2hlcmUgYGxhdGVXb3JrSG91cnMgPSBUUlVFYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0JQX2V2ZSIscHJlZD1jKCJkYWlseUhhc3NsZXNfZXZlIiwibGF0ZVdvcmtIb3VycyIsImZsYWdUaW1lIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQoNCmBEQlBfZXZlYCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgbGV2ZWwtMSBjb25mb3VuZGVycyBsZXZlbHMsIHdpdGggb25seSBzbGlnaHRseSBsb3dlciBgREJQX2V2ZWAgaW4gY2FzZXMgd2hlcmUgYGZsYWdUaW1lID0gVFJVRWAuDQpgYGB7ciAgZmlnLndpZHRoPTQsZmlnLmhlaWdodD0zLHdhcm5pbmc9RkFMU0V9DQpiaXZQbG90KGRpYXJ5LHJlc3A9IkRCUF9ldmUiLHByZWQ9YygiZGFpbHlIYXNzbGVzX2V2ZSIsImxhdGVXb3JrSG91cnMiLCJmbGFnVGltZSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBFRQ0KDQpMb3dlciBgRUVgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgZGFpbHlIYXNzbGVzX2V2ZSA9ICJZZXMiYA0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJFRSIscHJlZD1jKCJkYWlseUhhc3NsZXNfZXZlIiwibGF0ZVdvcmtIb3VycyIsImZsYWdUaW1lIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIFNEDQoNCkhpZ2hlciBgU0RgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgZGFpbHlIYXNzbGVzX2V2ZSA9ICJZZXMiYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0QiLHByZWQ9YygiZGFpbHlIYXNzbGVzX2V2ZSIsImxhdGVXb3JrSG91cnMiLCJmbGFnVGltZSIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIExWLTEgQ09WIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMjIFdITFNNDQoNCkhpZ2hlciBgV0hMU01gIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgd2hlcmVfYWZ0ID0gIndvcmtwbGFjZSJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJXSExTTSIscHJlZD1jKCJ3aGVyZV9hZnQiLCJ0ZWxlV29yayIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBCUCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KQmxvb2QgcHJlc3N1cmUgaXMgbm90IHN1YnN0YW50aWFsbHkgYWZmZWN0ZWQgYnkgbGV2ZWwtMSBjb25mb3VuZGVycywgd2l0aCBvbmx5IHNsaWdodGx5IGxvd2VyIGBTQlBfYWZ0YCBpbiBjYXNlcyB3aGVyZSBgdGVsZVdvcmsgPSAiWWVzImAuDQoNCiMjIyMjIFNCUF9hZnQNCg0KYFNCUF9hZnRgIGlzIHNsaWdodGx5IGxvd2VyIGluIGNhc2VzIHdoZXJlIGB0ZWxlV29yayA9ICJ0ZWxlV29yayJgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJTQlBfYWZ0IixwcmVkPWMoIndoZXJlX2FmdCIsInRlbGVXb3JrIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfYWZ0DQoNCmBEQlBfYWZ0YCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgdGhlIGxldmVscyBvZiBsZXZlbC0xIGNvdmFyaWF0ZXMuIEFsdGhvdWdoIHNsaWdodGx5IGhpZ2hlciBgREJQX2FmdGAgaXMgc2hvd24gaW4gY2FzZXMgd2hlcmUgYHRlbGVXb3JrID0gImJvdGgiYCwgdGhpcyBtaWdodCBiZSBkdWUgdG8gdGhlIHNtYWxsIG51bWJlciBvZiBzdWNoIGNhc2VzLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJEQlBfYWZ0IixwcmVkPWMoIndoZXJlX2FmdCIsInRlbGVXb3JrIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBTQlBfZXZlDQoNCmBTQlBfZXZlYCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgdGhlIGxldmVscyBvZiBsZXZlbC0xIGNvdmFyaWF0ZXMuIEFsdGhvdWdoIHNsaWdodGx5IGhpZ2hlciBgU0JQX2V2ZWAgaXMgc2hvd24gaW4gY2FzZXMgd2hlcmUgYHRlbGVXb3JrID0gImJvdGgiYCBvciB3aGVyZSBgd2hlcmVfYWZ0ID0gIm90aGVyImAsIHRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSBzbWFsbCBudW1iZXIgb2Ygc3VjaCBjYXNlcy4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0JQX2V2ZSIscHJlZD1jKCJ3aGVyZV9hZnQiLCJ0ZWxlV29yayIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyMgREJQX2V2ZQ0KDQpgREJQX2V2ZWAgZG9lcyBub3Qgc3Vic3RhbnRpYWxseSBkaWZmZXIgYWNyb3NzIHRoZSBsZXZlbHMgb2YgbGV2ZWwtMSBjb3ZhcmlhdGVzLiBBbHRob3VnaCBzbGlnaHRseSBoaWdoZXIgYERCUF9ldmVgIGlzIHNob3duIGluIGNhc2VzIHdoZXJlIGB0ZWxlV29yayA9ICJib3RoImAsIHRoaXMgbWlnaHQgYmUgZHVlIHRvIHRoZSBzbWFsbCBudW1iZXIgb2Ygc3VjaCBjYXNlcy4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iREJQX2V2ZSIscHJlZD1jKCJ3aGVyZV9hZnQiLCJ0ZWxlV29yayIpKQ0KYGBgDQoNCjxicj4NCg0KIyMjIyBFRQ0KDQpTbGlnaHRseSBoaWdoZXIgYEVFYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYHRlbGVXb3JrID0gImJvdGgiYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iRUUiLHByZWQ9Yygid2hlcmVfYWZ0IiwidGVsZVdvcmsiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgU0QNCg0KTG93ZXIgYFNEYCBjYW4gYmUgb2JzZXJ2ZWQgaW4gY2FzZXMgd2hlcmUgYHRlbGVXb3JrID0gImJvdGgiYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0QiLHByZWQ9Yygid2hlcmVfYWZ0IiwidGVsZVdvcmsiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyBCUCBDT05GIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQojIyMjIFdITFNNDQoNCkhpZ2hlciBgV0hMU01gIGNhbiBiZSBvYnNlcnZlZCBpbiBhbGwgY2FzZXMgd2hlcmUgYGNvbmZvdW5kZXJzID0gRkFMU0VgLCB3aXRoIGxhcmdlciBkaWZmZXJlbmNlcyBieSBgY29uZm91bmRlcnNfZXZlYC4gRGlmZmVyZW5jZXMgYnkgc3BlY2lmaWMgY29uZm91bmRlciBhcmUgaW4gbGluZSB3aXRoIHRob3NlIHNob3dlZCBieSB0aGUgYWdncmVnYXRlZCBzY29yZXMuIExvd2VyIGBXSExTTWAgY2FuIGJlIG9ic2VydmVkIGluIGNhc2VzIHdoZXJlIGBmbGFnQlBfZXZlID0gVFJVRWAuDQpgYGB7ciAgZmlnLndpZHRoPTMsZmlnLmhlaWdodD0yLjUsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iV0hMU00iLHByZWQ9YygiY29uZm91bmRlcnNfYWZ0IiwgImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZmZlZV9hZnQiLCAiY29mZmVlX2V2ZSIsICJzbW9rZV9hZnQiLCAic21va2VfZXZlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwb3J0X2FmdCIsICJzcG9ydF9ldmUiLCAibWVhbF9hZnQiLCAibWVhbF9ldmUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ0JQX2FmdCIsICJmbGFnQlBfZXZlIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIEJQIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpPbmx5IHN5c3RvbGljIGJsb29kIHByZXNzdXJlIGlzIHNsaWdodGx5IGFmZmVjdGVkIGJ5IEJQIGNvbmZvdW5kZXJzLg0KDQojIyMjIyBTQlBfYWZ0DQoNCk9ubHkgYWZ0ZXJub29uIGNvbmZvdW5kZXJzIGFyZSBjb25zaWRlcmVkIGZvciBgU0JQX2FmdGAsIHdoaWNoIGlzIG9ubHkgc2xpZ2h0bHkgaGlnaGVyIGluIGNhc2VzIHdoZXJlIGBjb25mb3VuZGVyc19hZnQgPSBUUlVFYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0JQX2FmdCIscHJlZD1jKCJjb25mb3VuZGVyc19hZnQiLCJjb2ZmZWVfYWZ0Iiwic21va2VfYWZ0Iiwic3BvcnRfYWZ0IiwibWVhbF9hZnQiLCJmbGFnQlBfYWZ0IikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfYWZ0DQoNCk9ubHkgYWZ0ZXJub29uIGNvbmZvdW5kZXJzIGFyZSBjb25zaWRlcmVkIGZvciBgREJQX2FmdGAsIHdoaWNoIGlzIG9ubHkgc2xpZ2h0bHkgbG93ZXIgaW4gY2FzZXMgd2hlcmUgYGNvZmZlX2FmdGAgb3IgYHNtb2tlX2FmdCA9IDFgLCBzbGlnaHRseSBoaWdoZXIgaW4gY2FzZXMgd2hlcmUgYHNwb3J0X2FmdGAgb3IgYG1lYWxfYWZ0ID0gVFJVRWAuIEFsdGhvdWdoIGhpZ2hlciBgREJQX2FmdGAgaXMgc2hvd24gaW4gY2FzZXMgd2hlcmUgYGZsYWdCUF9hZnQgPSBUUlVFYCwgdGhpcyBtaWdodCBiZSBkdWUgdG8gdGhlIHNtYWxsIG51bWJlciBvZiBzdWNoIGNhc2VzLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJEQlBfYWZ0IixwcmVkPWMoImNvbmZvdW5kZXJzX2FmdCIsImNvZmZlZV9hZnQiLCJzbW9rZV9hZnQiLCJzcG9ydF9hZnQiLCJtZWFsX2FmdCIsImZsYWdCUF9hZnQiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMjIFNCUF9ldmUNCg0KT25seSBldmVuaW5nIGNvbmZvdW5kZXJzIGFyZSBjb25zaWRlcmVkIGZvciBgU0JQX2V2ZWAsIHdoaWNoIGlzIHNsaWdodGx5IGhpZ2hlciBpbiBjYXNlcyB3aGVyZSBgY29uZm91bmRlcnNfZXZlID0gVFJVRWAsIGFuZCBoaWdoZXIgaW4gY2FzZXMgd2hlcmUgYGZsYWdCUF9ldmUgPSBUUlVFYC4NCmBgYHtyICBmaWcud2lkdGg9NCxmaWcuaGVpZ2h0PTMsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0JQX2V2ZSIscHJlZD1jKCJjb25mb3VuZGVyc19ldmUiLCJjb2ZmZWVfZXZlIiwic21va2VfZXZlIiwic3BvcnRfZXZlIiwibWVhbF9ldmUiLCJmbGFnQlBfZXZlIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIyBEQlBfZXZlDQoNCk9ubHkgZXZlbmluZyBjb25mb3VuZGVycyBhcmUgY29uc2lkZXJlZCBmb3IgYERCUF9ldmVgLCB3aGljaCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgdGhlIGxldmVscyBvZiBgY29uZm91bmRlcnNfZXZlYCwgd2hlcmVhcyBzbGlnaHRseSBoaWdoZXIgYERCUF9ldmVgIGNhbiBiZSBvYnNlcnZlZCBpbiBjYXNlcyB3aGVyZSBgZmxhZ0JQX2V2ZSA9IFRSVUVgLg0KYGBge3IgIGZpZy53aWR0aD00LGZpZy5oZWlnaHQ9Myx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJEQlBfZXZlIixwcmVkPWMoImNvbmZvdW5kZXJzX2V2ZSIsImNvZmZlZV9ldmUiLCJzbW9rZV9ldmUiLCJzcG9ydF9ldmUiLCJtZWFsX2V2ZSIsImZsYWdCUF9ldmUiKSkNCmBgYA0KDQo8YnI+DQoNCiMjIyMgRUUNCg0KYEVFYCBkb2VzIG5vdCBzdWJzdGFudGlhbGx5IGRpZmZlciBhY3Jvc3MgYmxvb2QgcHJlc3N1cmUgY29uZm91bmRlciBsZXZlbHMsIHdpdGggb25seSAgaGlnaGVyIGBFRWAgd2hlbiBgc3BvcnRfZXZlID0gIlRSVUUiYC4NCmBgYHtyICBmaWcud2lkdGg9MyxmaWcuaGVpZ2h0PTIuNSx3YXJuaW5nPUZBTFNFfQ0KYml2UGxvdChkaWFyeSxyZXNwPSJFRSIscHJlZD1jKCJjb25mb3VuZGVyc19hZnQiLCAiY29uZm91bmRlcnNfZXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29mZmVlX2FmdCIsICJjb2ZmZWVfZXZlIiwgInNtb2tlX2FmdCIsICJzbW9rZV9ldmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcG9ydF9hZnQiLCAic3BvcnRfZXZlIiwgIm1lYWxfYWZ0IiwgIm1lYWxfZXZlIikpDQpgYGANCg0KPGJyPg0KDQojIyMjIFNEDQoNCmBTRGAgZG9lcyBub3Qgc3Vic3RhbnRpYWxseSBkaWZmZXIgYWNyb3NzIGJsb29kIHByZXNzdXJlIGNvbmZvdW5kZXIgbGV2ZWxzLCB3aXRoIG9ubHkgYSBzbGlnaHRseSBsb3dlciBgU0RgIHdoZW4gYHNtb2tlX2V2ZSA9ICJUUlVFImAuDQpgYGB7ciAgZmlnLndpZHRoPTMsZmlnLmhlaWdodD0yLjUsd2FybmluZz1GQUxTRX0NCmJpdlBsb3QoZGlhcnkscmVzcD0iU0QiLHByZWQ9YygiY29uZm91bmRlcnNfYWZ0IiwgImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvZmZlZV9hZnQiLCAiY29mZmVlX2V2ZSIsICJzbW9rZV9hZnQiLCAic21va2VfZXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BvcnRfYWZ0IiwgInNwb3J0X2V2ZSIsICJtZWFsX2FmdCIsICJtZWFsX2V2ZSIpKQ0KYGBgDQoNCjxicj4NCg0KIyA0LiBDb3ZhcmlhdGUgc2VsZWN0aW9uDQoNCkFzIHByZS1yZWdpc3RlcmVkLCBmb3IgbWF4aW1pemluZyBtb2RlbCBwYXJzaW1vbnkgd2hpbGUgbWluaW1pemluZyB0aGUgcmlzayBvZiBub24tY29udmVyZ2VuY2UsIHRoZSBjb3ZhcmlhdGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmb2xsb3dpbmcgcmVncmVzc2lvbiBhbmFseXNlcyBhcmUgc2VsZWN0ZWQgYmFzZWQgb24gYW4gKiplbXBpcmljYWwgYXBwcm9hY2gqKiBhY2NvdW50aW5nIGZvciB0aGUgZm9sbG93aW5nIGNyaXRlcmlhOg0KDQoxLiBUaGUgTm8uIG9mIGNhc2VzIGluIGVhY2ggbGV2ZWwsIHByaW9yaXRpemluZyBjYXRlZ29yaWNhbCBjb3ZhcmlhdGVzIHdpdGggKipiYWxhbmNlZCBudW1iZXIgb2YgY2FzZXMqKg0KDQoyLiBUaGUgYml2YXJpYXRlIGRpc3RyaWJ1dGlvbnMgYW5kIGNvcnJlbGF0aW9ucyB3aXRoIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgcHJpb3JpdGl6aW5nIGNvdmFyaWF0ZXMgc2hvd2luZyAqKnNvbWUgcG90ZW50aWFsIGNvdmFyaWFuY2UgdHJlbmQqKiB3aXRoIHRoZSByZXNwb25zZSB2YXJpYWJsZQ0KDQozLiBMaW5lYXIgbW9kZWxpbmcsIHByaW9yaXRpemluZyB0aGUgY292YXJpYXRlcyB3aG9zZSBpbmNsdXNpb24gYXMgcHJlZGljdG9yIG9mIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIHZhcmlhYmxlIHNob3dzICoqc3Ryb25nZXIgZXZpZGVuY2UqKiAoaS5lLiwgaGlnaGVyIEFrYWlrZSB3ZWlnaHQpIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzIGFuZCAqKmFic29sdXRlIHQtdmFsdWUgb2YgMiBvciBoaWdoZXIqKg0KDQpIb3dldmVyLCBkZXZpYXRpbmcgZnJvbSB0aGUgcHJlLXJlZ2lzdHJhdGlvbiAoc2VlIFtTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIFM3XShodHRwczovL29zZi5pby9icHJ2ZykpLCB3ZSBhbHNvIGNvbnNpZGVyICoqdGhlb3JldGljYWwgYXJndW1lbnRzKiogY29uY2VybmluZyBzb21lIGltcG9ydGFudCBjb3ZhcmlhdGVzLiBQYXJ0aWN1bGFybHksIHdlIHByaW9yaXRpemUgbGV2ZWwtMSBvdmVyIGxldmVsLTIgY292YXJpYXRlcyBhcyBvdXIgc3R1ZHkgaXMgZm9jdXNlZCBvbiB3aXRoaW4taW5kaXZpZHVhbCByZWxhdGlvbnNoaXBzLiBNb3Jlb3ZlciwgZm9sbG93aW5nIFtTcGVjdG9yICgyMDIxKV0oI3JlZiksIHdlIGF0dGVtcHQgdG8gYXZvaWQgcmlza2luZyB0byBydWxlIG91dCB2YXJpYWJsZXMgYWN0aW5nIGFzIHBvdGVudGlhbCBleHBsb3JhdG9yeSBtZWNoYW5pc21zIChlLmcuLCBtZWRpYXRvcnMpIG9mIHRoZSBmb2N1c2VkIHJlbGF0aW9uc2hpcHMuIFRoZW9yZXRpY2FsIGFyZ3VtZW50cyBhcmUgZGV0YWlsZWQgYmVsb3cgZm9yIGVhY2ggcmVzcG9uc2UgdmFyaWFibGUuDQoNClRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGFuYWx5c2VzLg0KYGBge3Igd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShsbWU0KTsgbGlicmFyeShNdU1JbikNCmBgYA0KDQo8YnI+DQoNCiMjIDQuMS4gQWZ0ZXJub29uIEJQDQoNCkZvciBhZnRlcm5vb24gc3lzdG9saWMgYW5kIGRpYXN0b2xpYyBibG9vZCBwcmVzc3VyZSwgdGhlIHByZS1yZWdpc3RlcmVkIHBvdGVudGlhbCBjb3ZhcmlhdGVzIHRvIGJlIGNvbnNpZGVyZWQgYXJlOg0KDQoxLiBgZ2VuZGVyYCwgaW4gbGlnaHQgb2YgdGhlIHJvYnVzdCBsaXRlcmF0dXJlIG9uIHNleCBkaWZmZXJlbmNlcyBpbiBibG9vZCBwcmVzc3VyZSBhbmQgaHlwZXJ0ZW5zaW9uIChlLmcuLCBbU2FuZGJlcmcgJiBKaSwgMjAxMl0pLCB3aXRoIGdlbmRlciBoYXZpbmcgYmVlbiBoaWdobGlnaHRlZCBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3RzIG9mIHRyYWl0IHdvcmthaG9saXNtIChlLmcuLCBbQmxhZHVjY2kgZXQgYWwuLCAyMDE4OyAyMDIxXSgjcmVmKSkuDQoNCjIuIGBhZ2VgLCBpbiBsaWdodCBvZiB0aGUgY29uc29saWRhdGVkIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFnaW5nIGFuZCBoaWdoIGJsb29kIHByZXNzdXJlOyBob3dldmVyLCBubyBjbGVhciBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQgb24gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFnZSBhbmQgd29ya2Fob2xpc20gKFtDbGFyayBldCBhbC4sIDIwMTZdKCNyZWYpKS4NCg0KMy4gYEJNSWAsIGluIGxpZ2h0IG9mIHRoZSByb2J1c3QgbGl0ZXJhdHVyZSBvbiB0aGUgaW5jcmVhc2VkIHJpc2sgZm9yIGh5cGVydGVuc2lvbiBhbmQgQ1ZEIGluIGluZGl2aWR1YWxzIHdpdGggaGlnaGVyIEJNSSAoZS5nLiwgW0dyZWdnIGV0IGFsLiwgMjAwNV0oI3JlZikpOyBob3dldmVyLCBubyBjbGVhciBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQsIHRvIG91ciBrbm93bGVkZ2UsIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBCTUkgYW5kIHdvcmthaG9saXNtLg0KDQo0LiBQYXJ0aWNpcGFudHMnIHNtb2tpbmcgc3RhdHVzIGBzbW9rZXJgLCBpbiBsaWdodCBvZiB0aGUgd2lkZWx5IGFja25vd2xlZGdlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBzbW9raW5nIGFuZCBoeXBlcnRlbnNpb247IGhvd2V2ZXIsIG5vIGNsZWFyIGRpZmZlcmVuY2VzIGhhdmUgYmVlbiBoaWdobGlnaHRlZCwgdG8gb3VyIGtub3dsZWRnZSwgb24gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNtb2tpbmcgc3RhdHVzIGFuZCB3b3JrYWhvbGlzbS4NCg0KNS4gVGhlIGRhaWx5IG51bWJlciBvZiB3b3JrZWQgaG91cnMgYHdvcmtIb3Vyc2AsIGFzIGxvbmcgd29ya2luZyBob3VycyBpcyBhIGRlZmluaXRpb25hbCBhc3BlY3Qgb2Ygd29ya2Fob2xpc20gd2hpY2ggaGFzIGJlZW4gZm91bmQgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIGJsb29kIHByZXNzdXJlIGFuZCBvdGhlciBjYXJkaW92YXNjdWxhciByaXNrcyAoW1ZpcnRhbmVuLCAyMDEyXSgjcmVmKSk7IGhvd2V2ZXIsIGNvbnRyb2xsaW5nIGZvciB0aGlzIHZhcmlhYmxlIG1pZ2h0IHJpc2sgdG8gYXJ0aWZpY2lhbGx5IGRlZmxhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBibG9vZCBwcmVzc3VyZSBzaW5jZSB0aGUgZm9ybWVyIG1pZ2h0IGluZmx1ZW5jZSB0aGUgbGF0dGVyIHRocm91Z2ggd29ya2luZyBob3Vycy4gVGhhdCBpcywgd29ya2luZyBob3VycyBpcyBhICoqcG90ZW50aWFsIGV4cGxhbmF0b3J5IG1lY2hhbmlzbSoqIG9mIHRoZSBmb2N1c2VkIHJlbGF0aW9uc2hpcCwgYW5kIGluY2x1ZGluZyBpdCBhcyBhIGNvbnRyb2wgdmFyaWFibGUgbWlnaHQgYmlhcyByYXRoZXIgdGhhbiBzdHJlbmd0aGVuaW5nIHRoZSByZXN1bHRzIChzZWUgW1NwZWN0b3IgZXQgYWwuLCAyMDIxXSgjcmVmKSkuDQoNCjYuIFJlbW90ZSB3b3JrIGB0ZWxlV29ya2AsIGFsdGhvdWdoIHdpdGggbm8gY2xlYXIgZXhwZWN0YXRpb25zIG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBibG9vZCBwcmVzc3VyZSwgd2hpbGUgd2Ugb3JpZ2luYWxseSBoeXBvdGhlc2l6ZWQgdGhhdCByZW1vdGUgd29ya2luZyBtaWdodCBhY3QgYXMgYSBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3Qgb2Ygd29ya2Fob2xpc20uDQoNCjcuIEJQIGBjb25mb3VuZGVyc19hZnRgIGlkZW50aWZ5aW5nIGJlaGF2aW9yYWwgZmFjdG9ycyAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHRoYXQgbWlnaHQgYWZmZWN0IGJsb29kIHByZXNzdXJlLCBhbHRob3VnaCB3aXRoIG5vIGNsZWFyIGV4cGVjdGF0aW9uIG9uIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLiANCg0KRnVydGhlciBwcmUtcmVnaXN0ZXJlZCBsZXZlbC0yIGNvdmFyaWF0ZXMgKGkuZS4sIHJldHJvc3BlY3RpdmUgbWVhc3VyZXMgb2YgdHJhaXQgd29ya2Fob2xpc20sIHRlY2hub3N0cmVzcyBjcmVhdG9ycykgYXJlIG5vdCBpbmNsdWRlZCBkdWUgdG8gb3VyIGFpbSB0byBmb2N1cyB0aGUgc3R1ZHkgb24gdGhlIGZvY3VzZWQgbGV2ZWwtMSB2YXJpYWJsZXMsIHdoZXJlYXMgcmVjb3ZlcnkgZXhwZXJpZW5jZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwgbW9kZWxzLiBNb3Jlb3Zlciwgd2UgZG8gbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIEJQIG1lYXN1cmUgYXMgd2UgZm9jdXMgb24gdGhlIGNvdmFyaWFuY2Ugb2YgaW50cmEtaW5kaXZpZHVhbCBmbHVjdHVhdGlvbnMgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgYmxvb2QgcHJlc3N1cmUsIHJhdGhlciB0aGFuIHRoZSBjaGFuZ2Ugb2YgdGhlIGxhdHRlciBvdmVyIHRpbWUgKHNlZSBbU3VwcGxlbWVudGFyeSBtYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKS4gSW4gY29udHJhc3QsIGFkZGl0aW9uYWwgKGkuZS4sIG5vdCBwcmUtcmVnaXN0ZXJlZCkgbGV2ZWwtMiBjb3ZhcmlhdGVzIHBvdGVudGlhbGx5IG1vZGVyYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUgYXJlIGNvbnNpZGVyZWQgYXMgcG90ZW50aWFsbHkgY29uZm91bmRpbmcgZmFjdG9ycy4NCg0KUHJpb3IgdG8gZXZhbHVhdGUgdGhlIGluY2x1c2lvbiBvZiBlYWNoIGNvdmFyaWF0ZSwgd2UgcHJlcGFyZSB0aGUgZGF0YSBmb3IgdGhlIGFuYWx5c2VzLiBUaGF0IGlzLCB3ZSByZW1vdmUgY2FzZXMgb2YgbWlzc2luZyByZXNwb25zZXMgaW4gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIG9yIGFueSBjb3ZhcmlhdGUgKCoqbGlzdC13aXNlIGRlbGV0aW9uKiopIGFuZCB3ZSBjZW50ZXIgbGV2ZWwtMSBjb250aW51b3VzIGNvdmFyaWF0ZXMgb24gdGhlIGluZGl2aWR1YWwgbWVhbiAoKipwZXJzb24tbWVhbi1jZW50ZXJpbmcqKikuIE1vcmVvdmVyLCB3ZSBhcHBseSBvdXIgaW5jbHVzaW9uIGNyaXRlcmlhIGJ5IHJlbW92aW5nIGFsbCBjYXNlcyB3aXRoIGBicF9kcnVnc2Agb3IgYGN2X2R5c2YgPSAiWWVzImAuIA0KYGBge3IgfQ0KIyBpbmNsdXNpb24gY3JpdGVyaWENCmNsZWFuQlAgPC0gY2xlYW5bY2xlYW4kYnBfZHJ1Z3M9PSJObyIgJiBjbGVhbiRjdl9keXNmPT0iTm8iLF0NCg0KIyBsaXN0LXdpc2UgZGVsZXRpb24NCmNsZWFuQlAgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGNsZWFuQlBbLGMoIklEIiwiZGF5IiwiU0JQX2FmdCIsIkRCUF9hZnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5kZXIiLCJhZ2UiLCJCTUkiLCJzbW9rZXIiLCJ3b3JrSG91cnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWxlV29yayIsImNvbmZvdW5kZXJzX2FmdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvbWVfY2hpbGQiLCJjaGlsZHJlbiIpXSkpDQpjYXQoIkNvbnNpZGVyaW5nIixucm93KGNsZWFuQlApLCJjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlAkSUQpKSksInBhcnRpY2lwYW50cyIpDQoNCiMgbWVhbiBjZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIGNvdmFyaWF0ZXMNCmZvcihWYXIgaW4gYygid29ya0hvdXJzIikpew0KICB3aWRlIDwtIHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5CUCRJRCkpKSxdDQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5CUFssVmFyXSxsaXN0KGNsZWFuQlAkSUQpLG1lYW4pWywyXSkgIyBjb21wdXRpbmcgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyh3aWRlKVtuY29sKHdpZGUpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkJQIDwtIGpvaW4oY2xlYW5CUCx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgd2l0aCBsb25nLWZvcm0gZGF0YQ0KICBjbGVhbkJQWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUFssVmFyXSAtIGNsZWFuQlBbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgY29tcHV0aW5nIG1lYW4tY2VudGVyZWQgc2NvcmVzDQpgYGANCg0KPGJyPg0KDQojIyMgNC4xLjEuIGdlbmRlciB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KYGdlbmRlcmAgaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIGEgcm91Z2hseSBiYWxhbmNlZCBudW1iZXIgb2YgcGFydGljaXBhbnRzLiBJbiBzZWN0aW9uIDMuNSB3ZSBvYnNlcnZlZCBzb21lIHRlbmRlbmN5IHdpdGggaGlnaGVyIGBTQlBfYWZ0YCBpbiBtZW4gdGhhbiBpbiB3b21lbi4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGluIHRoZSBudWxsIG1vZGVsIHNob3dzIGltcHJvdmVkIGV2aWRlbmNlIChpLmUuLCBoaWdoZXIgQWthaWtlIHdlaWdodCkgY29tcGFyZWQgdG8gdGhlIG51bGwgbW9kZWwsIGFsdGhvdWdoIHRoZSBlc3RpbWF0ZWQgdC12YWx1ZSBpcyBsb3dlciB0aGFuIDIsIHdpdGggYSBwYXJ0aWN1bGFybHkgbG93IHZhbHVlIGZvciBgREJQX2FmdGAuIEluIGJvdGggY2FzZXMsIGFsc28gY29uc2lkZXJpbmcgaXRzIHRoZW9yZXRpY2FsIHJlbGV2YW5jZSBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3RzIG9mIHdvcmthaG9saXNtIChlLmcuLCBbQmFsZHVjY2kgZXQgYWwuICgyMDE4OyAyMDIxKV0oI3JlZikpICoqd2UgaW5jbHVkZSBgZ2VuZGVyYCBhcyBhIGNvdmFyaWF0ZSoqLg0KDQojIyMjIFNCUF9hZnQNCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkJQWyFkdXBsaWNhdGVkKGNsZWFuQlAkSUQpLCJnZW5kZXIiXSkgIyBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuQlAkZ2VuZGVyKSAjIE5vLiBjYXNlcw0KDQojIG1vZGVsIGNvbXBhcmlzb24NCm0wIDwtIGxtZXIoU0JQX2FmdCB+ICgxfElEKSxkYXRhPWNsZWFuQlApDQptMSA8LSBsbWVyKFNCUF9hZnQgfiBnZW5kZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSBpbmNsdWRpbmcgZ2VuZGVyDQpzdW1tYXJ5KG0xKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogcHJveGltYWwgdG8gfHR8PTINCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2FmdA0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uDQptMGQgPC0gbG1lcihEQlBfYWZ0IH4gKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCm0xZCA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIGluY2x1ZGluZyBnZW5kZXINCnN1bW1hcnkobTFkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogbG93ZXIgdGhhbiB8dHw9Mg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS4yLiBhZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCmBhZ2VgIGlzIGEgbGV2ZWwtMiBjb250aW51b3VzIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjIgc2hvd2VkIG1vZGVyYXRlLXRvLXN0cm9uZyBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzIHdpdGggYmxvb2QgcHJlc3N1cmUgKCpyKiBmcm9tIC40MiB0byAuNTIpLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW4gdGhlIG1vZGVsIGluY2x1ZGluZyBgZ2VuZGVyYCBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgaGlnaGVyIHRoYW4gMi4gVGh1cywgZGVzcGl0ZSB0aGUgdW5jZXJ0YWludHkgb24gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCB3ZSAqKmluY2x1ZGUgYGFnZWAgYXMgYSBjb3ZhcmlhdGUqKiBmb3IgYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9hZnQNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfYWZ0IH4gYWdlICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTIpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9hZnQNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2FmdCB+IGFnZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTEuYmlzZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yZCA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xZCxtMmQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS4zLiBCTUkgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCmBCTUlgIGlzIGEgbGV2ZWwtMiBjb250aW51b3VzIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjIgc2hvd2VkIHdlYWstdG8tbW9kZXJhdGUgcG9zaXRpdmUgcmVsYXRpb25zaGlwcyB3aXRoIGJsb29kIHByZXNzdXJlICgqciogZnJvbSAuMjggdG8gLjQzKS4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGluIHRoZSBtb2RlbCBpbmNsdWRpbmcgYGdlbmRlcmAgYW5kIGBhZ2VgIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIHdpdGggYW4gYWJzb2x1dGUgdC12YWx1ZSBoaWdoZXIgdGhhbiAyLiBUaHVzLCBkZXNwaXRlIHRoZSB1bmNlcnRhaW50eSBvbiBpdHMgcmVsYXRpb25zaGlwIHdpdGggd29ya2Fob2xpc20sIHdlICoqaW5jbHVkZSBgQk1JYCBhcyBhIGNvdmFyaWF0ZSoqIGZvciBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2FmdA0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9hZnQgfiBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptMyA8LSBsbWVyKFNCUF9hZnQgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0zKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfYWZ0DQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9hZnQgfiBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptM2QgPC0gbG1lcihEQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTNkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS40LiBzbW9rZXIgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCmBzbW9rZXJgIGlzIGEgbGV2ZWwtMiBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy41IGRpZCBub3Qgc2hvdyBzdWJzdGFudGlhbGx5IHJlbGF0aW9uc2hpcHMgd2l0aCBibG9vZCBwcmVzc3VyZS4gQ29uc2lzdGVudGx5LCBib3RoIG1vZGVscyBzaG93IGFuIGFic29sdXRlIHQtdmFsdWUgbG93ZXIgdGhhbiAyLCBhbHRob3VnaCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMuIEFsc28gY29uc2lkZXJpbmcgdGhlIHVuY2VydGFpbnR5IG9mIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB3b3JrYWhvbGlzbSwgd2UgKipkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2FmdA0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9hZnQgfiBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9hZnQgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfYWZ0DQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9hZnQgfiBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00ZCA8LSBsbWVyKERCUF9hZnQgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xZCxtMmQsbTNkLG00ZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTRkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS41LiBXb3JrSG91cnMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCmB3b3JrSG91cnNgIGlzIGEgbGV2ZWwtMSBjb250aW51b3VzIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjIgd2FzIHdlYWtseSBjb3JyZWxhdGVkIHdpdGggYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlICgqciogPSAuMTItLjA0KS4gSGVyZSwgaXRzIGluY2x1c2lvbiBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIChpLmUuLCBoaWdoZXIgQWthaWtlIHdlaWdodCkgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIHdpdGggYW4gZXN0aW1hdGVkIGFic29sdXRlIHQtdmFsdWUgaGlnaGVyIHRoYW4gMi4gSG93ZXZlciwgd2UgY29uc2lkZXIgdGhlIHRoZW9yZXRpY2FsIGltcG9ydGFuY2Ugb2YgdGhpcyB2YXJpYWJsZSwgd2hpY2ggbWlnaHQgYmUgYSBwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtIChlLmcuLCBtZWRpYXRvcikgdGhyb3VnaCB3aGljaCB3b3JrYWhvbGlzbSBtaWdodCBpbXBhY3Qgb24gYmxvb2QgcHJlc3N1cmUsIGFuZCB0aHVzLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZS4NCg0KIyMjIyBTQlBfYWZ0DQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2FmdCB+IHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00IDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9hZnQNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2FmdCB+IHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTEuYmlzZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTFkLG0yZCxtM2QsbTRkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtNGQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC4xLjYuIHRlbGVXb3JrIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgdGVsZVdvcmtgIGlzIGEgbGV2ZWwtMSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy41IG9ubHkgc2hvd2VkIHNvbWUgc2xpZ2h0IGRpZmZlcmVuY2UgaW4gYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlLiBIZXJlLCB3aGVyZWFzIGl0cyBpbmNsdXNpb24gaW1wbGllcyB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIGFic29sdXRlIHQtdmFsdWVzIGFyZSBsb3dlciB0aGFuIDIuIFRodXMsIGFsc28gY29uc2lkZXJpbmcgdGhlIHVuYmFsYW5jZWQgbnVtYmVyIG9mIGNhc2VzIHBlciBsZXZlbCBhbmQgdGhlIHVuY2VydGFpbnR5IG9mIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBib3RoIHdvcmthaG9saXNtIGFuZCBibG9vZCBwcmVzc3VyZSwgKip3ZSBkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2FmdA0KYGBge3IgfQ0KIyBudW1iZXIgb2YgY2FzZXMgYnkgY292YXJpYXRlIGxldmVsDQpzdW1tYXJ5KGNsZWFuQlAkdGVsZVdvcmspICMgY3VycmVudGx5IDQgY2F0ZWdvcmllcw0KY2xlYW5CUCR0ZWxlV29yayA8LSBhcy5mYWN0b3IoZ3N1YigiYm90aCIsInRlbGVXb3JrIixnc3ViKCJkYXlPZmYiLCJ0ZWxlV29yayIsY2xlYW5CUCR0ZWxlV29yaykpKSAjIHJlY29kaW5nIHRvIDIgY2F0ZWdvcmllcw0Kc3VtbWFyeShjbGVhbkJQJHRlbGVXb3JrKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2FmdCB+IHRlbGVXb3JrICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgdGVsZVdvcmsgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfYWZ0DQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9hZnQgfiB0ZWxlV29yayArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTEuYmlzZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIHRlbGVXb3JrICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjEuNy4gY29uZm91bmRlcnNfYWZ0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgY29uZm91bmRlcnNfYWZ0YCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBvbmx5IHNob3dlZCBzb21lIHNsaWdodCBkaWZmZXJlbmNlIGluIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZS4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgd2Vha2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLiBIb3dldmVyLCBhYnNvbHV0ZSB0LXZhbHVlcyBhcmUgbG93ZXIgdGhhbiAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIHRoZSB1bmJhbGFuY2VkIG51bWJlciBvZiBjYXNlcyBwZXIgbGV2ZWwgYW5kIHRoZSB1bmNlcnRhaW50eSBvZiBpdHMgcmVsYXRpb25zaGlwIHdpdGggIHdvcmthaG9saXNtLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZS4NCg0KIyMjIyBTQlBfYWZ0DQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5CUCRjb25mb3VuZGVyc19hZnQpDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfYWZ0IH4gY29uZm91bmRlcnNfYWZ0ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgY29uZm91bmRlcnNfYWZ0ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLG0yLG0zLG00KSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtNCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2FmdA0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpc2QgPC0gbG1lcihEQlBfYWZ0IH4gY29uZm91bmRlcnNfYWZ0ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgY29uZm91bmRlcnNfYWZ0ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjEuOC4gT3RoZXIgY292YXJpYXRlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KSW4gYWRkaXRpb24gdG8gdGhlIHByZS1yZWdpc3RlcmVkIGNvdmFyaWF0ZXMsIHdlIGNvbnNpZGVyIGEgKipmdXJ0aGVyIGxldmVsLTIgY292YXJpYXRlKiogdGhhdCBpbiBzZWN0aW9uIDMuNSBzaG93ZWQgc3Vic3RhbnRpYWwgdHJlbmRzIGluIGJvdGggYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlIGFuZCB3b3JrYWhvbGlzbSwgYW5kIHdob3NlIHBvdGVudGlhbCBpbmZsdWVuY2Ugb24gYm90aCB2YXJpYWJsZXMgY2FuIGJlIHRoZW9yZXRpY2FsbHkgYXJndWVkLCBuYW1lbHkgaGF2aW5nICoqY2hpbGRyZW4qKiBgY2hpbGRyZW5gIG9yIGxpdmluZyB3aXRoIGNoaWxkcmVuIGBob21lX2NoaWxkYC4gSW5kZWVkLCByZXNwb25kZW50cyByZXBvcnRpbmcgdG8gbGl2ZSB3aXRoIHRoZWlyIGNoaWxkcmVuIHJlcG9ydGVkIGhpZ2hlciBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUsIHdoZXJlYXMgdGhvc2UgcmVwb3J0aW5nIHRvIGhhdmUgY2hpbGRyZW4gcmVwb3J0ZWQgc2xpZ2h0bHkgbG93ZXIgd29ya2Fob2xpc20gKHNlZSBzZWN0aW9uIDMuNSkuIFRoZW9yZXRpY2FsbHksIGl0IGlzIHBsYXVzaWJsZSBhbHRob3VnaCBub3QgY29uc2lzdGVudGx5IHJlcG9ydGVkIGJ5IHByZXZpb3VzIHJlc2VhcmNoIChzZWUgW0NsYXJrIGV0IGFsLiwgMjAxNl0oI3JlZikpIHRoYXQgd29ya2Fob2xpc20gbGV2ZWxzIGFuZCBvdmVyYWxsIGludmVzdG1lbnQgaW4gdGhlIHdvcmsgdnMuIGZhbWlseSBkb21haW4gYXJlIGluZmx1ZW5jZWQgYnkgZmFtaWx5IG5lZWRzIGFuZCBwcmVzZW5jZSBvZiBjaGlsZHJlbiBpbiB0aGUgaG91c2Vob2xkLiBPbiB0aGUgb3RoZXIgaGFuZCwgZmFtaWx5IG5lZWRzIGFuZCBsaXZpbmcgd2l0aCBjaGlsZHJlbiBtaWdodCBuZWdhdGl2ZWx5IGltcGFjdCBvbiBibG9vZCBwcmVzc3VyZS4gVGh1cywgYm90aCBgY2hpbGRyZW5gIGFuZCBgaG9tZV9jaGlsZGAgbWlnaHQgYmUgYSBjb21tb24gZXh0ZXJuYWwgdmFyaWFibGUgaW5mbHVlbmNpbmcgYm90aCB3b3JrYWhvbGlzbSBhbmQgYWZ0ZXJub29uLCBhbmQgd2UgY29uc2lkZXIgaXQgYXMgYSBmdXJ0aGVyIHBvdGVudGlhbCBjb3ZhcmlhdGUuDQoNCkFsdGhvdWdoIGJvdGggYGNoaWxkcmVuYCBhbmQgYGhvbWVfY2hpbGRgIGhhdmUgYW4gYWNjZXB0YWJseSBiYWxhbmNlZCBudW1iZXIgb2YgY2FzZXMgcGVyIGxldmVsIGFuZCBib3RoIGltcGx5IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCBub25lIG9mIHRoZW0gc2hvdyBhbiBhYnNvbHV0ZSAqdCogdmFsdWUgaGlnaGVyIHRoYW4gMi4gVGh1cywgYWxzbyBpbiB0aGlzIGNhc2UsICoqd2UgZG8gbm90IGluY2x1ZGUqKiB0aGVzZSB0d28gdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgZm9yIGFmdGVybm9vbiBibG9vZCBwcmVzc3VyZS4NCg0KIyMjIyBTQlBfYWZ0DQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5CUFshZHVwbGljYXRlZChjbGVhbkJQJElEKSwiY2hpbGRyZW4iXSkgIyBjaGlsZHJlbjogTm8uIHBhcnRpY2lwYW50cw0Kc3VtbWFyeShjbGVhbkJQJGNoaWxkcmVuKSAjIGNoaWxkcmVuOiBOby4gY2FzZXMNCnN1bW1hcnkoY2xlYW5CUFshZHVwbGljYXRlZChjbGVhbkJQJElEKSwiaG9tZV9jaGlsZCJdKSAjIGhvbWVfY2hpbGQ6IE5vLiBwYXJ0aWNpcGFudHMNCnN1bW1hcnkoY2xlYW5CUCRob21lX2NoaWxkKSAjIGhvbWVfY2hpbGQ6IE5vLiBjYXNlcw0KDQojIG1vZGVsIGNvbXBhcmlzb24gY2hpbGRyZW4gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2FmdCB+IGNoaWxkcmVuICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBob21lX2NoaWxkIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9hZnQgfiBob21lX2NoaWxkICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBjaGlsZHJlbiB2cyBwcmV2aW91cyBtb2RlbA0KbTQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gaG9tZV9jaGlsZCB2cyBwcmV2aW91cyBtb2RlbA0KbTQgPC0gbG1lcihTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgaG9tZV9jaGlsZCArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9hZnQNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiBjaGlsZHJlbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2FmdCB+IGNoaWxkcmVuICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGhvbWVfY2hpbGQgdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9hZnQgfiBob21lX2NoaWxkICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JICsgY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xZCxtMmQsbTNkLG00ZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTRkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gaG9tZV9jaGlsZCB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIGhvbWVfY2hpbGQgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xZCxtMmQsbTNkLG00ZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTRkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMS45LiBUaW1lIHRyZW5kcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KQXMgYSBmaW5hbCwgbm90IHByZS1yZWdpc3RlcmVkLCBjb250cm9sLCB3ZSBpbnNwZWN0IHRoZSAqKmxpbmVhciB0aW1lIHRyZW5kcyoqIG9mIHRoZSBvdXRjb21lIHZhcmlhYmxlLiBUaGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgYGRheWBzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0dWR5IGFzIGEgZnVydGhlciBjb3ZhcmlhdGUuIFdlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIGBkYXlgIGRvZXMgbm90IGltcGx5IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlICp0KiB2YWx1ZSBsb3dlciB0aGFuIDIuIFRodXMsIHdlIGNob3NlIHRvICoqbm90IGluY2x1ZGUqKiBgZGF5YCBhcyBhIGNvdmFyaWF0ZSBmb3IgYWZ0ZXJub29uIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9hZnQNCmBgYHtyIH0NCiMgcGxvdHRpbmcgU0JQX2FmdCBieSBkYXkNCmJveHBsb3QoU0JQX2FmdCB+IGRheSxkYXRhPWNsZWFuQlApDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfYWZ0IH4gZGF5ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00IDwtIGxtZXIoU0JQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQoNCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2FmdA0KYGBge3IgfQ0KIyBwbG90dGluZyBEQlBfYWZ0IGJ5IGRheQ0KYm94cGxvdChEQlBfYWZ0IH4gZGF5LGRhdGE9Y2xlYW5CUCkNCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpc2QgPC0gbG1lcihEQlBfYWZ0IH4gZGF5ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2FmdCB+IGdlbmRlciArIGFnZSArIEJNSSArIGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTFkLG0yZCxtM2QsbTRkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTRkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMgNC4yLiBFdmVuaW5nIEJQDQoNCkZvciBldmVuaW5nIHN5c3RvbGljIGFuZCBkaWFzdG9saWMgYmxvb2QgcHJlc3N1cmUsIHRoZSBwcmUtcmVnaXN0ZXJlZCBwb3RlbnRpYWwgY292YXJpYXRlcyB0byBiZSBjb25zaWRlcmVkIGFyZToNCg0KMS4gYGdlbmRlcmAsIGluIGxpZ2h0IG9mIHRoZSByb2J1c3QgbGl0ZXJhdHVyZSBvbiBzZXggZGlmZmVyZW5jZXMgaW4gYmxvb2QgcHJlc3N1cmUgYW5kIGh5cGVydGVuc2lvbiAoZS5nLiwgW1NhbmRiZXJnICYgSmksIDIwMTJdKSwgd2l0aCBnZW5kZXIgaGF2aW5nIGJlZW4gaGlnaGxpZ2h0ZWQgYXMgYSBwb3RlbnRpYWwgbW9kZXJhdG9yIG9mIHRoZSBzdHJhaW5pbmcgZWZmZWN0cyBvZiB0cmFpdCB3b3JrYWhvbGlzbSAoZS5nLiwgW0JsYWR1Y2NpIGV0IGFsLiwgMjAxODsgMjAyMV0oI3JlZikpLg0KDQoyLiBgYWdlYCwgaW4gbGlnaHQgb2YgdGhlIGNvbnNvbGlkYXRlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhZ2luZyBhbmQgaGlnaCBibG9vZCBwcmVzc3VyZTsgaG93ZXZlciwgbm8gY2xlYXIgZGlmZmVyZW5jZXMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhZ2UgYW5kIHdvcmthaG9saXNtIChbQ2xhcmsgZXQgYWwuLCAyMDE2XSgjcmVmKSkuDQoNCjMuIGBCTUlgLCBpbiBsaWdodCBvZiB0aGUgcm9idXN0IGxpdGVyYXR1cmUgb24gdGhlIGluY3JlYXNlZCByaXNrIGZvciBoeXBlcnRlbnNpb24gYW5kIENWRCBpbiBpbmRpdmlkdWFscyB3aXRoIGhpZ2hlciBCTUkgKGUuZy4sIFtHcmVnZyBldCBhbC4sIDIwMDVdKCNyZWYpKTsgaG93ZXZlciwgbm8gY2xlYXIgZGlmZmVyZW5jZXMgaGF2ZSBiZWVuIGhpZ2hsaWdodGVkLCB0byBvdXIga25vd2xlZGdlLCBvbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQk1JIGFuZCB3b3JrYWhvbGlzbS4NCg0KNC4gUGFydGljaXBhbnRzJyBzbW9raW5nIHN0YXR1cyBgc21va2VyYCwgaW4gbGlnaHQgb2YgdGhlIHdpZGVseSBhY2tub3dsZWRnZWQgcmVsYXRpb25zaGlwIGJldHdlZW4gc21va2luZyBhbmQgaHlwZXJ0ZW5zaW9uOyBob3dldmVyLCBubyBjbGVhciBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQsIHRvIG91ciBrbm93bGVkZ2UsIG9uIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzbW9raW5nIHN0YXR1cyBhbmQgd29ya2Fob2xpc20uDQoNCjUuIFRoZSBkYWlseSBudW1iZXIgb2Ygd29ya2VkIGhvdXJzIGB3b3JrSG91cnNgLCBhcyBsb25nIHdvcmtpbmcgaG91cnMgaXMgYSBkZWZpbml0aW9uYWwgYXNwZWN0IG9mIHdvcmthaG9saXNtIHdoaWNoIGhhcyBiZWVuIGZvdW5kIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGhpZ2hlciBibG9vZCBwcmVzc3VyZSBhbmQgb3RoZXIgY2FyZGlvdmFzY3VsYXIgcmlza3MgKFtWaXJ0YW5lbiwgMjAxMl0oI3JlZikpOyBob3dldmVyLCBjb250cm9sbGluZyBmb3IgdGhpcyB2YXJpYWJsZSBtaWdodCByaXNrIHRvIGFydGlmaWNpYWxseSBkZWZsYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgYmxvb2QgcHJlc3N1cmUgc2luY2UgdGhlIGZvcm1lciBtaWdodCBpbmZsdWVuY2UgdGhlIGxhdHRlciB0aHJvdWdoIHdvcmtpbmcgaG91cnMuIFRoYXQgaXMsIHdvcmtpbmcgaG91cnMgaXMgYSAqKnBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20qKiBvZiB0aGUgZm9jdXNlZCByZWxhdGlvbnNoaXAsIGFuZCBpbmNsdWRpbmcgaXQgYXMgYSBjb250cm9sIHZhcmlhYmxlIG1pZ2h0IGJpYXMgcmF0aGVyIHRoYW4gc3RyZW5ndGhlbmluZyB0aGUgcmVzdWx0cyAoc2VlIFtTcGVjdG9yIGV0IGFsLiwgMjAyMV0oI3JlZikpLg0KDQo2LiBUaGUgb2NjdXJyZW5jZSBvZiBsYXRlIHdvcmtpbmcgaG91cnMgaW4gdGhlIGV2ZW5pbmcgYGxhdGVXb3JrSG91cnNgLCBjb25zaXN0ZW50bHkgd2l0aCB3aGF0IGFyZ3VlZCBhYm92ZSBmb3IgYHdvcmtIb3Vyc2A7IGFsc28gaW4gdGhpcyBjYXNlLCBjb250cm9sbGluZyBmb3IgdGhpcyB2YXJpYWJsZSBtaWdodCByaXNrIHRvIHJ1bGUgb3V0IGEgKipwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtKiogb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBibG9vZCBwcmVzc3VyZS4NCg0KNy4gTm9ud29yayBoYXNzbGVzIGluIHRoZSBldmVuaW5nIGBkYWlseUhhc3NsZXNfZXZlYCwgYXMgaGFzc2xlcyBoYXZlIGJlZW4gcmVsYXRlZCB0byBoaWdoIGJsb29kIHByZXNzdXJlIChlLmcuLCBbTnlrbMOtxI1layBldCBhbC4gMTk5OV0oI3JlZikpIGFuZCBub253b3JrIGhhc3NsZXMgc3VjaCBhcyByZWxhdGlvbnNoaXAgdGVuc2lvbiBoYXZlIGJlZW4gcmVjZW50bHkgcmVsYXRlZCB0byBzdGF0ZSB3b3JrYWhvbGlzbSAoW0NsYXJrIGV0IGFsLiwgMjAyMV0oI3JlZikpOyBhbHNvIGluIHRoaXMgY2FzZSwgc3VjaCBhbiBhcmd1bWVudCBpbXBseSB0aGF0IG5vbndvcmsgaGFzc2xlcyBhcmUgYSAqKnBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20qKiBvZiB0aGUgZm9jdXNlZCByZWxhdGlvbnNoaXAuDQoNCjguIFJlbW90ZSB3b3JrIGB0ZWxlV29ya2AsIGFsdGhvdWdoIHdpdGggbm8gY2xlYXIgZXhwZWN0YXRpb25zIG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBibG9vZCBwcmVzc3VyZSwgd2hpbGUgd2Ugb3JpZ2luYWxseSBoeXBvdGhlc2l6ZWQgdGhhdCByZW1vdGUgd29ya2luZyBtaWdodCBhY3QgYXMgYSBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3Qgb2Ygd29ya2Fob2xpc20uDQoNCjkuIEJQIGBjb25mb3VuZGVyc19ldmVgIGlkZW50aWZ5aW5nIGJlaGF2aW9yYWwgZmFjdG9ycyAoZS5nLiwgc21va2luZywgcGh5c2ljYWwgYWN0aXZpdHkpIHRoYXQgbWlnaHQgYWZmZWN0IGJsb29kIHByZXNzdXJlLCBhbHRob3VnaCB3aXRoIG5vIGNsZWFyIGV4cGVjdGF0aW9uIG9uIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLiANCg0KRnVydGhlciBwcmUtcmVnaXN0ZXJlZCBsZXZlbC0yIGNvdmFyaWF0ZXMgKGkuZS4sIHJldHJvc3BlY3RpdmUgbWVhc3VyZXMgb2YgdHJhaXQgd29ya2Fob2xpc20sIHRlY2hub3N0cmVzcyBjcmVhdG9ycykgYXJlIG5vdCBpbmNsdWRlZCBkdWUgdG8gb3VyIGFpbSB0byBmb2N1cyB0aGUgc3R1ZHkgb24gdGhlIGZvY3VzZWQgbGV2ZWwtMSB2YXJpYWJsZXMsIHdoZXJlYXMgcmVjb3ZlcnkgZXhwZXJpZW5jZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwgbW9kZWxzLiBNb3Jlb3Zlciwgd2UgZG8gbm90IGluY2x1ZGUgdGhlIHByZXZpb3VzIEJQIG1lYXN1cmUgYXMgd2UgZm9jdXMgb24gdGhlIGNvdmFyaWFuY2Ugb2YgaW50cmEtaW5kaXZpZHVhbCBmbHVjdHVhdGlvbnMgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgYmxvb2QgcHJlc3N1cmUsIHJhdGhlciB0aGFuIHRoZSBjaGFuZ2Ugb2YgdGhlIGxhdHRlciBvdmVyIHRpbWUgKHNlZSBbU3VwcGxlbWVudGFyeSBtYXRlcmlhbCBTN10oaHR0cHM6Ly9vc2YuaW8vYnBydmcpKS4gSW4gY29udHJhc3QsIGFkZGl0aW9uYWwgKGkuZS4sIG5vdCBwcmUtcmVnaXN0ZXJlZCkgbGV2ZWwtMiBjb3ZhcmlhdGVzIHBvdGVudGlhbGx5IG1vZGVyYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBldmVuaW5nIGJsb29kIHByZXNzdXJlIGFyZSBjb25zaWRlcmVkIGFzIHBvdGVudGlhbGx5IGNvbmZvdW5kaW5nIGZhY3RvcnMuDQoNClByaW9yIHRvIGV2YWx1YXRlIHRoZSBpbmNsdXNpb24gb2YgZWFjaCBjb3ZhcmlhdGUsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcy4gVGhhdCBpcywgd2UgcmVtb3ZlIGNhc2VzIG9mIG1pc3NpbmcgcmVzcG9uc2VzIGluIHRoZSByZXNwb25zZSB2YXJpYWJsZSBvciBhbnkgY292YXJpYXRlICgqKmxpc3Qtd2lzZSBkZWxldGlvbioqKSBhbmQgd2UgY2VudGVyIGxldmVsLTEgY29udGludW91cyBjb3ZhcmlhdGVzIG9uIHRoZSBpbmRpdmlkdWFsIG1lYW4gKCoqcGVyc29uLW1lYW4tY2VudGVyaW5nKiopLiBNb3Jlb3Zlciwgd2UgYXBwbHkgb3VyIGluY2x1c2lvbiBjcml0ZXJpYSBieSByZW1vdmluZyBhbGwgY2FzZXMgd2l0aCBgYnBfZHJ1Z3NgIG9yIGBjdl9keXNmID0gIlllcyJgLiANCmBgYHtyIH0NCiMgaW5jbHVzaW9uIGNyaXRlcmlhDQpjbGVhbkJQIDwtIGNsZWFuW2NsZWFuJGJwX2RydWdzPT0iTm8iICYgZGlhcnkkY3ZfZHlzZj09Ik5vIixdDQoNCiMgbGlzdC13aXNlIGRlbGV0aW9uDQpjbGVhbkJQIDwtIGFzLmRhdGEuZnJhbWUobmEub21pdChjbGVhbkJQWyxjKCJJRCIsImRheSIsIlNCUF9ldmUiLCJEQlBfZXZlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZGVyIiwiYWdlIiwiQk1JIiwic21va2VyIiwid29ya0hvdXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0ZVdvcmtIb3VycyIsImRhaWx5SGFzc2xlc19ldmUiLCJ0ZWxlV29yayIsImNvbmZvdW5kZXJzX2V2ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvbWVfY2hpbGQiLCJjaGlsZHJlbiIpXSkpDQpjYXQoIkNvbnNpZGVyaW5nIixucm93KGNsZWFuQlApLCJjb21wbGV0ZSBvYnNlcnZhdGlvbnMgZnJvbSIsbmxldmVscyhhcy5mYWN0b3IoYXMuY2hhcmFjdGVyKGNsZWFuQlAkSUQpKSksInBhcnRpY2lwYW50cyIpDQoNCiMgbWVhbiBjZW50ZXJpbmcgbHYtMSBjb250aW51b3VzIGNvdmFyaWF0ZXMNCmZvcihWYXIgaW4gYygid29ya0hvdXJzIikpew0KICB3aWRlIDwtIHByZWxxc1twcmVscXMkSUQlaW4lbGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5CUCRJRCkpKSxdDQogIHdpZGUgPC0gY2JpbmQod2lkZSxhZ2dyZWdhdGUoY2xlYW5CUFssVmFyXSxsaXN0KGNsZWFuQlAkSUQpLG1lYW4pWywyXSkgIyBjb21wdXRpbmcgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyh3aWRlKVtuY29sKHdpZGUpXSA8LSBwYXN0ZTAoVmFyLCIuY20iKQ0KICBjbGVhbkJQIDwtIGpvaW4oY2xlYW5CUCx3aWRlWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgd2l0aCBsb25nLWZvcm0gZGF0YQ0KICBjbGVhbkJQWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5CUFssVmFyXSAtIGNsZWFuQlBbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgY29tcHV0aW5nIG1lYW4tY2VudGVyZWQgc2NvcmVzDQpgYGANCg0KPGJyPg0KDQojIyMgNC4yLjEuIGdlbmRlciB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KYGdlbmRlcmAgaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIGEgcm91Z2hseSBiYWxhbmNlZCBudW1iZXIgb2YgcGFydGljaXBhbnRzLiBJbiBzZWN0aW9uIDMuNSB3ZSBvYnNlcnZlZCBzb21lIHRlbmRlbmN5IHdpdGggaGlnaGVyIGBTQlBfYWZ0YCBpbiBtZW4gdGhhbiBpbiB3b21lbi4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGluIHRoZSBudWxsIG1vZGVsIHNob3dzIGltcHJvdmVkIGV2aWRlbmNlIChpLmUuLCBoaWdoZXIgQWthaWtlIHdlaWdodCkgY29tcGFyZWQgdG8gdGhlIG51bGwgbW9kZWwsIGFsdGhvdWdoIHRoZSBlc3RpbWF0ZWQgdC12YWx1ZSBpcyBsb3dlciB0aGFuIDIsIHdpdGggYSBwYXJ0aWN1bGFybHkgbG93IHZhbHVlIGZvciBgREJQX2V2ZWAuIEluIGJvdGggY2FzZXMsIGFsc28gY29uc2lkZXJpbmcgaXRzIHRoZW9yZXRpY2FsIHJlbGV2YW5jZSBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3RzIG9mIHdvcmthaG9saXNtIChlLmcuLCBbQmFsZHVjY2kgZXQgYWwuICgyMDE4OyAyMDIxKV0oI3JlZikpICoqd2UgaW5jbHVkZSBgZ2VuZGVyYCBhcyBhIGNvdmFyaWF0ZSoqIGZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9ldmUNCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkJQWyFkdXBsaWNhdGVkKGNsZWFuQlAkSUQpLCJnZW5kZXIiXSkgIyBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuQlAkZ2VuZGVyKSAjIE5vLiBjYXNlcw0KDQojIG1vZGVsIGNvbXBhcmlzb24NCm0wIDwtIGxtZXIoU0JQX2V2ZSB+ICgxfElEKSxkYXRhPWNsZWFuQlApDQptMSA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSBpbmNsdWRpbmcgZ2VuZGVyDQpzdW1tYXJ5KG0xKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24NCm0wZCA8LSBsbWVyKERCUF9ldmUgfiAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KbTFkIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTFkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgaW5jbHVkaW5nIGdlbmRlcg0Kc3VtbWFyeShtMWQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC4yLjIuIGFnZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KYGFnZWAgaXMgYSBsZXZlbC0yIGNvbnRpbnVvdXMgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuMiBzaG93ZWQgbW9kZXJhdGUtdG8tc3Ryb25nIHBvc2l0aXZlIHJlbGF0aW9uc2hpcHMgd2l0aCBibG9vZCBwcmVzc3VyZSAoKnIqIGZyb20gLjQyIHRvIC41MikuIENvbnNpc3RlbnRseSwgaXRzIGluY2x1c2lvbiBpbiB0aGUgbW9kZWwgaW5jbHVkaW5nIGBnZW5kZXJgIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIHdpdGggYW4gYWJzb2x1dGUgdC12YWx1ZSBoaWdoZXIgdGhhbiAyLiBUaHVzLCBkZXNwaXRlIHRoZSB1bmNlcnRhaW50eSBvbiBpdHMgcmVsYXRpb25zaGlwIHdpdGggd29ya2Fob2xpc20sIHdlICoqaW5jbHVkZSBgYWdlYCBhcyBhIGNvdmFyaWF0ZSoqIGZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9ldmUNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfZXZlIH4gYWdlICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTIpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9ldmUNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2V2ZSB+IGFnZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTEuYmlzZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXNkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgZ2VuZGVyDQptMmQgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMmQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC4yLjMuIEJNSSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KYEJNSWAgaXMgYSBsZXZlbC0yIGNvbnRpbnVvdXMgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuMiBzaG93ZWQgd2Vhay10by1tb2RlcmF0ZSBwb3NpdGl2ZSByZWxhdGlvbnNoaXBzIHdpdGggYmxvb2QgcHJlc3N1cmUgKCpyKiBmcm9tIC4yOCB0byAuNDMpLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW4gdGhlIG1vZGVsIGluY2x1ZGluZyBgZ2VuZGVyYCBhbmQgYGFnZWAgaW1wbGllcyBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSB0LXZhbHVlIGhpZ2hlciB0aGFuIDIuIFRodXMsIGRlc3BpdGUgdGhlIHVuY2VydGFpbnR5IG9uIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB3b3JrYWhvbGlzbSwgd2UgKippbmNsdWRlIGBCTUlgIGFzIGEgY292YXJpYXRlKiogZm9yIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2V2ZQ0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9ldmUgfiBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptMyA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0zKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiBCTUkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptM2QgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTNkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMi40LiBzbW9rZXIgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCmBzbW9rZXJgIGlzIGEgbGV2ZWwtMiBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy41IGRpZCBub3Qgc2hvdyBzdWJzdGFudGlhbGx5IHJlbGF0aW9uc2hpcHMgd2l0aCBibG9vZCBwcmVzc3VyZS4gQ29uc2lzdGVudGx5LCBib3RoIG1vZGVscyBzaG93IGFuIGFic29sdXRlIHQtdmFsdWUgbG93ZXIgdGhhbiAyIHdoZW4gdGhlIG90aGVyIGNvdmFyaWF0ZXMgYXJlIGNvbnNpZGVyZWQsIGFsdGhvdWdoIGl0cyBpbmNsdXNpb24gaW1wbGllcyBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscy4gQWxzbyBjb25zaWRlcmluZyB0aGUgdW5jZXJ0YWludHkgb2YgaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCB3ZSAqKmRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2V2ZQ0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9ldmUgfiBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiBzbW9rZXIgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgc21va2VyICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjIuNS4gV29ya0hvdXJzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgd29ya0hvdXJzYCBpcyBhIGxldmVsLTEgY29udGludW91cyB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy4yIHdhcyBub3Qgc3Vic3RhbnRpYWxseSBjb3JyZWxhdGVkIHdpdGggZXZlbmluZyBibG9vZCBwcmVzc3VyZSAoKnIqID0gLjAzLS4wNikuIEhlcmUsIGl0cyBpbmNsdXNpb24gaW1wbGllcyB3ZWFrZXIgZXZpZGVuY2UgKGkuZS4sIGxvd2VyIEFrYWlrZSB3ZWlnaHQpIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGVzdGltYXRlZCBhYnNvbHV0ZSB0LXZhbHVlIGxvd2VyIHRoYW4gMi4gVGh1cywgYWxzbyBjb25zaWRlcmluZyB0aGUgdGhlb3JldGljYWwgaW1wb3J0YW5jZSBvZiB0aGlzIHZhcmlhYmxlLCB3aGljaCBtaWdodCBiZSBhIHBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20gKGUuZy4sIG1lZGlhdG9yKSB0aHJvdWdoIHdoaWNoIHdvcmthaG9saXNtIG1pZ2h0IGltcGFjdCBvbiBibG9vZCBwcmVzc3VyZSwgKip3ZSBkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9ldmUNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfZXZlIH4gd29ya0hvdXJzLm1jICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00IDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiB3b3JrSG91cnMubWMgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpc2QpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIHdvcmtIb3Vycy5tYyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTFkLG0yZCxtM2QsbTRkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTRkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMi42LiBsYXRlV29ya0hvdXJzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgbGF0ZVdvcmtIb3Vyc2AgaXMgYSBsZXZlbC0xIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjUgb25seSBzaG93ZWQgc2xpZ2h0IGRpZmZlcmVuY2VzIGluIGV2ZW5pbmcgc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUuIENvbnNpc3RlbnRseSwgaXRzIGluY2x1c2lvbiBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgaGlnaGVyIHRoYW4gMiBmb3IgYFNCUF9ldmVgLiBIb3dldmVyLCB3ZSBjb25zaWRlciBpdHMgcm9sZSBhcyBhIHBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20gKGUuZy4sIG1lZGlhdG9yKSB0aHJvdWdoIHdoaWNoIHdvcmthaG9saXNtIG1pZ2h0IGltcGFjdCBvbiBibG9vZCBwcmVzc3VyZS4gVGh1cywgYWxzbyBpbiBsaWdodCBvZiB0aGUgdW5iYWxhbmNlZCBudW1iZXIgb2YgY2FzZXMsICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3IgZXZlbmluZyBibG9vZCBwcmVzc3VyZS4NCg0KIyMjIyBTQlBfZXZlDQpgYGB7ciB9DQojIHN1bW1hcnkgb2YgY2FzZXMNCnN1bW1hcnkoY2xlYW5CUCRsYXRlV29ya0hvdXJzKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2V2ZSB+IGxhdGVXb3JrSG91cnMgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBsYXRlV29ya0hvdXJzICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLG0yLG0zLG00KSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtNCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2V2ZQ0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpc2QgPC0gbG1lcihEQlBfZXZlIH4gbGF0ZVdvcmtIb3VycyArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTEuYmlzZCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXNkKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00ZCA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBsYXRlV29ya0hvdXJzICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjIuNy4gZGFpbHlIYXNzbGVzX2V2ZSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30NCg0KYGRhaWx5SGFzc2xlc19ldmVgIGlzIGEgbGV2ZWwtMSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy41IHByZWRpY3RlZCBzbGlnaHRseSBoaWdoZXIgZXZlbmluZyBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZS4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgKGkuZS4sIGhpZ2hlciBBa2Fpa2Ugd2VpZ2h0KSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBlc3RpbWF0ZWQgYWJzb2x1dGUgdC12YWx1ZSBoaWdoZXIgdGhhbiAyIGZvciBib3RoIHN5c3RvbGljIGFuZCBkaWFzdG9saWMgZXZlbmluZyBibG9vZCBwcmVzc3VyZS4gSG93ZXZlciwgdGhlIHZhcmlhYmxlIHNob3dzIGEgc3Ryb25nbHkgdW5iYWxhbmNlZCBudW1iZXIgb2YgY2FzZXMsIHdpdGggb25seSAxMCUgb2YgY2FzZXMgd2l0aCBzb21lIGV2ZW5pbmcgaGFzc2xlLiBNb3Jlb3Zlciwgd2UgY29uc2lkZXIgdGhlIHRoZW9yZXRpY2FsIGltcG9ydGFuY2Ugb2YgdGhpcyB2YXJpYWJsZSwgd2hpY2ggbWlnaHQgYmUgYSBwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtIChlLmcuLCBtZWRpYXRvcikgdGhyb3VnaCB3aGljaCB3b3JrYWhvbGlzbSBtaWdodCBpbXBhY3Qgb24gc3RyYWluLiBUaHVzLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUuDQoNCiMjIyMgU0JQX2V2ZQ0KYGBge3IgfQ0KIyBudW1iZXIgb2YgY2FzZXMgYnkgY292YXJpYXRlIGxldmVsDQpzdW1tYXJ5KGNsZWFuQlAkZGFpbHlIYXNzbGVzX2V2ZSkNCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9ldmUgfiBkYWlseUhhc3NsZXNfZXZlICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTQgPC0gbG1lcihTQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgZGFpbHlIYXNzbGVzX2V2ZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9ldmUNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2V2ZSB+IGRhaWx5SGFzc2xlc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgZGFpbHlIYXNzbGVzX2V2ZSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMGQsbTFkLG0yZCxtM2QsbTRkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtNGQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC4yLjguIHRlbGVXb3JrIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgdGVsZVdvcmtgIGlzIGEgbGV2ZWwtMSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy41IG9ubHkgc2hvd2VkIHNvbWUgc2xpZ2h0IGRpZmZlcmVuY2UgaW4gZXZlbmluZyBibG9vZCBwcmVzc3VyZS4gSGVyZSwgYWx0aG91Z2ggaXRzIGluY2x1c2lvbiBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCBhYnNvbHV0ZSB0LXZhbHVlcyBhcmUgbG93ZXIgdGhhbiAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIHRoZSB1bmJhbGFuY2VkIG51bWJlciBvZiBjYXNlcyBwZXIgbGV2ZWwgYW5kIHRoZSB1bmNlcnRhaW50eSBvZiBpdHMgcmVsYXRpb25zaGlwIHdpdGggYm90aCB3b3JrYWhvbGlzbSBhbmQgYmxvb2QgcHJlc3N1cmUsICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3IgZXZlbmluZyBibG9vZCBwcmVzc3VyZS4NCg0KIyMjIyBTQlBfZXZlDQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5CUCR0ZWxlV29yaykgIyBjdXJyZW50bHkgNCBjYXRlZ29yaWVzDQpjbGVhbkJQJHRlbGVXb3JrIDwtIGFzLmZhY3Rvcihnc3ViKCJib3RoIiwidGVsZVdvcmsiLGdzdWIoImRheU9mZiIsInRlbGVXb3JrIixjbGVhbkJQJHRlbGVXb3JrKSkpICMgcmVjb2RpbmcgdG8gMiBjYXRlZ29yaWVzDQpzdW1tYXJ5KGNsZWFuQlAkdGVsZVdvcmspDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfZXZlIH4gdGVsZVdvcmsgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyB0ZWxlV29yayArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMjIERCUF9ldmUNCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXNkIDwtIGxtZXIoREJQX2V2ZSB+IHRlbGVXb3JrICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpc2QpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIHRlbGVXb3JrICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjIuOS4gY29uZm91bmRlcnNfZXZlIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpgY29uZm91bmRlcnNfZXZlYCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBzaG93ZWQgc29tZSBzbGlnaHQgZGlmZmVyZW5jZSBpbiBhZnRlcm5vb24gYmxvb2QgcHJlc3N1cmUuIEhlcmUsIGFsdGhvdWdoIGl0cyBpbmNsdXNpb24gaW1wbGllcyB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIGFic29sdXRlIHQtdmFsdWVzIGFyZSBsb3dlciB0aGFuIDIuIFRodXMsIGFsc28gY29uc2lkZXJpbmcgdGhlIHVuYmFsYW5jZWQgbnVtYmVyIG9mIGNhc2VzIHBlciBsZXZlbCBhbmQgdGhlIHVuY2VydGFpbnR5IG9mIGl0cyByZWxhdGlvbnNoaXAgd2l0aCB3b3JrYWhvbGlzbSwgKip3ZSBkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9ldmUNCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkJQJGNvbmZvdW5kZXJzX2V2ZSkNCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNCUF9ldmUgfiBjb25mb3VuZGVyc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBjb25mb3VuZGVyc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiBjb25mb3VuZGVyc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgY29uZm91bmRlcnNfZXZlICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjIuMTAuIE90aGVyIGNvdmFyaWF0ZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9DQoNCkluIGFkZGl0aW9uIHRvIHRoZSBwcmUtcmVnaXN0ZXJlZCBjb3ZhcmlhdGVzLCB3ZSBjb25zaWRlciBhICoqZnVydGhlciBsZXZlbC0yIGNvdmFyaWF0ZSoqIHRoYXQgaW4gc2VjdGlvbiAzLjUgc2hvd2VkIHN1YnN0YW50aWFsIHRyZW5kcyBpbiBib3RoIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUgYW5kIHdvcmthaG9saXNtLCBhbmQgd2hvc2UgcG90ZW50aWFsIGluZmx1ZW5jZSBvbiBib3RoIHZhcmlhYmxlcyBjYW4gYmUgdGhlb3JldGljYWxseSBhcmd1ZWQsIG5hbWVseSBoYXZpbmcgKipjaGlsZHJlbioqIGBjaGlsZHJlbmAgb3IgbGl2aW5nIHdpdGggY2hpbGRyZW4gYGhvbWVfY2hpbGRgLiBJbmRlZWQsIHJlc3BvbmRlbnRzIHJlcG9ydGluZyB0byBsaXZlIHdpdGggdGhlaXIgY2hpbGRyZW4gcmVwb3J0ZWQgaGlnaGVyIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUsIHdoZXJlYXMgdGhvc2UgcmVwb3J0aW5nIHRvIGhhdmUgY2hpbGRyZW4gcmVwb3J0ZWQgc2xpZ2h0bHkgbG93ZXIgd29ya2Fob2xpc20gKHNlZSBzZWN0aW9uIDMuNSkuIFRoZW9yZXRpY2FsbHksIGl0IGlzIHBsYXVzaWJsZSBhbHRob3VnaCBub3QgY29uc2lzdGVudGx5IHJlcG9ydGVkIGJ5IHByZXZpb3VzIHJlc2VhcmNoIChzZWUgW0NsYXJrIGV0IGFsLiwgMjAxNl0oI3JlZikpIHRoYXQgd29ya2Fob2xpc20gbGV2ZWxzIGFuZCBvdmVyYWxsIGludmVzdG1lbnQgaW4gdGhlIHdvcmsgdnMuIGZhbWlseSBkb21haW4gYXJlIGluZmx1ZW5jZWQgYnkgZmFtaWx5IG5lZWRzIGFuZCBwcmVzZW5jZSBvZiBjaGlsZHJlbiBpbiB0aGUgaG91c2Vob2xkLiBPbiB0aGUgb3RoZXIgaGFuZCwgZmFtaWx5IG5lZWRzIGFuZCBsaXZpbmcgd2l0aCBjaGlsZHJlbiBtaWdodCBuZWdhdGl2ZWx5IGltcGFjdCBvbiBibG9vZCBwcmVzc3VyZS4gVGh1cywgYm90aCBgY2hpbGRyZW5gIGFuZCBgaG9tZV9jaGlsZGAgbWlnaHQgYmUgYSBjb21tb24gZXh0ZXJuYWwgdmFyaWFibGUgaW5mbHVlbmNpbmcgYm90aCB3b3JrYWhvbGlzbSBhbmQgZXZlbmluZywgYW5kIHdlIGNvbnNpZGVyIGl0IGFzIGEgZnVydGhlciBwb3RlbnRpYWwgY292YXJpYXRlLg0KDQpBbHRob3VnaCBib3RoIGBjaGlsZHJlbmAgYW5kIGBob21lX2NoaWxkYCBoYXZlIGFuIGFjY2VwdGFibHkgYmFsYW5jZWQgbnVtYmVyIG9mIGNhc2VzIHBlciBsZXZlbCBhbmQgYm90aCBpbXBseSBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgbm9uZSBvZiB0aGVtIHNob3cgYW4gYWJzb2x1dGUgKnQqIHZhbHVlIGhpZ2hlciB0aGFuIDIuIFRodXMsIGFsc28gaW4gdGhpcyBjYXNlLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogdGhlc2UgdHdvIHZhcmlhYmxlcyBhcyBjb3ZhcmlhdGVzIGZvciBldmVuaW5nIGJsb29kIHByZXNzdXJlLg0KDQojIyMjIFNCUF9ldmUNCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkJQWyFkdXBsaWNhdGVkKGNsZWFuQlAkSUQpLCJjaGlsZHJlbiJdKSAjIGNoaWxkcmVuOiBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuQlAkY2hpbGRyZW4pICMgY2hpbGRyZW46IE5vLiBjYXNlcw0Kc3VtbWFyeShjbGVhbkJQWyFkdXBsaWNhdGVkKGNsZWFuQlAkSUQpLCJob21lX2NoaWxkIl0pICMgaG9tZV9jaGlsZDogTm8uIHBhcnRpY2lwYW50cw0Kc3VtbWFyeShjbGVhbkJQJGhvbWVfY2hpbGQpICMgaG9tZV9jaGlsZDogTm8uIGNhc2VzDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBjaGlsZHJlbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTQlBfZXZlIH4gY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGhvbWVfY2hpbGQgdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2V2ZSB+IGhvbWVfY2hpbGQgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBjaGlsZHJlbiArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBob21lX2NoaWxkIHZzIHByZXZpb3VzIG1vZGVsDQptNCA8LSBsbWVyKFNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBob21lX2NoaWxkICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wLG0xLG0yLG0zLG00KSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtNCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyMgREJQX2V2ZQ0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIG51bGwNCm0xLmJpc2QgPC0gbG1lcihEQlBfZXZlIH4gY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGhvbWVfY2hpbGQgdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiBob21lX2NoaWxkICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMS5iaXNkKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpc2QpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBjaGlsZHJlbiB2cyBwcmV2aW91cyBtb2RlbA0KbTRkIDwtIGxtZXIoREJQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIGNoaWxkcmVuICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGhvbWVfY2hpbGQgdnMgcHJldmlvdXMgbW9kZWwNCm00ZCA8LSBsbWVyKERCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkgKyBob21lX2NoaWxkICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjIuMTEuIFRpbWUgdHJlbmRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQpBcyBhIGZpbmFsLCBub3QgcHJlLXJlZ2lzdGVyZWQsIGNvbnRyb2wsIHdlIGluc3BlY3QgdGhlICoqbGluZWFyIHRpbWUgdHJlbmRzKiogb2YgdGhlIG91dGNvbWUgdmFyaWFibGUuIFRoaXMgaXMgZG9uZSBieSBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBgZGF5YHMgc2luY2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3R1ZHkgYXMgYSBmdXJ0aGVyIGNvdmFyaWF0ZS4gV2UgY2FuIHNlZSB0aGF0IHRoZSBpbmNsdXNpb24gb2YgYGRheWAgaW1wbGllcyBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSAqdCogdmFsdWUgaGlnaGVyIHRoYW4gMi4gSG93ZXZlciwgYSBiZXR0ZXIgaW5zcGVjdGlvbiBvZiBibG9vZCBwcmVzc3VyZSBkaXN0cmlidXRpb25zIHRocm91Z2ggYGRheWAgbGV2ZWxzIHNob3dzIHRoYXQgc3VjaCBlZmZlY3QgaXMgbGlrZWx5IGR1ZSB0byBtZWFzdXJlbWVudCByZWFjdGl2aXR5IChpLmUuLCBpbmNyZWFzZWQgcGh5c2lvbG9naWNhbCBhY3RpdmF0aW9uIGR1cmluZyB0aGUgZmlyc3QgLSBsZXNzIGZhbWlsaWFyIC0gYmxvb2QgcHJlc3N1cmUgcmVjb3JkaW5ncykuIENvbnNpc3RlbnRseSB0aGUgbGluZWFyIHRpbWUgdHJlbmQgaXMgbm8gbG9uZ2VyIHN1YnN0YW50aWFsIGFmdGVyIHRoZSByZW1vdmFsIG9mIG9ic2VydmF0aW9ucyBjb2xsZWN0ZWQgb24gdGhlIGZpcnN0IGRheSwgd2hlcmVhcyB0aGUgZWZmZWN0IGlzIGxhcmdlciB3aGVuIGBkYXlgIGlzIGluY2x1ZGVkIGFzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUgd2l0aCBkYXkgMSB2cy4gb3RoZXIgZGF5cy4gVGh1cywgd2UgKipkbyBub3QgaW5jbHVkZSoqIGBkYXlgIGFzIGEgY292YXJpYXRlKiogZm9yIGV2ZW5pbmcgYmxvb2QgcHJlc3N1cmUsIGJ1dCB3ZSB3aWxsIGNvbnNpZGVyIGl0IGFzIGEgcm9idXN0bmVzcyBjaGVjay4NCg0KIyMjIyBTQlBfZXZlDQpgYGB7ciB9DQojIHBsb3R0aW5nIFNCUF9ldmUgYnkgZGF5DQpib3hwbG90KFNCUF9ldmUgfiBkYXksZGF0YT1jbGVhbkJQKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0JQX2V2ZSB+IGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KDQojIHJlbW92aW5nIGRheSAxDQpXZWlnaHRzKEFJQyh1cGRhdGUobTAsZGF0YT1jbGVhbkJQW2NsZWFuQlAkZGF5IT0xLF0pLHVwZGF0ZShtMS5iaXMsZGF0YT1jbGVhbkJQW2NsZWFuQlAkZGF5IT0xLF0pKSkgIyB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsDQpzdW1tYXJ5KHVwZGF0ZShtMS5iaXMsZGF0YT1jbGVhbkJQW2NsZWFuQlAkZGF5IT0xLF0pKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgcHJldmlvdXMgbW9kZWwNCm00IDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIGRheSArICgxfElEKSxkYXRhPWNsZWFuQlApDQpXZWlnaHRzKEFJQyhtMCxtMSxtMixtMyxtNCkpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTQpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgcmVtb3ZpbmcgZGF5IDENCldlaWdodHMoQUlDKHVwZGF0ZShtMCxkYXRhPWNsZWFuQlBbY2xlYW5CUCRkYXkhPTEsXSksdXBkYXRlKG0xLGRhdGE9Y2xlYW5CUFtjbGVhbkJQJGRheSE9MSxdKSwNCiAgICAgICAgICAgIHVwZGF0ZShtMixkYXRhPWNsZWFuQlBbY2xlYW5CUCRkYXkhPTEsXSksdXBkYXRlKG0zLGRhdGE9Y2xlYW5CUFtjbGVhbkJQJGRheSE9MSxdKSwNCiAgICAgICAgICAgIHVwZGF0ZShtNCxkYXRhPWNsZWFuQlBbY2xlYW5CUCRkYXkhPTEsXSkpKSAjIHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwNCnN1bW1hcnkodXBkYXRlKG00LGRhdGE9Y2xlYW5CUFtjbGVhbkJQJGRheSE9MSxdKSkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBpc29sYXRpbmcgZGF5IDEgYXMgYSBmYWN0b3INCmNsZWFuQlAkZGF5MSA8LSAwDQpjbGVhbkJQW2NsZWFuQlAkZGF5PT0xLCJkYXkxIl0gPC0gMQ0KY2xlYW5CUCRkYXkxIDwtIGFzLmZhY3RvcihjbGVhbkJQJGRheTEpDQpzdW1tYXJ5KGNsZWFuQlAkZGF5MSkgIyBudW1iZXIgb2YgY2FzZXMNCmJveHBsb3QoU0JQX2V2ZSB+IGRheTEsZGF0YT1jbGVhbkJQKSAjIHBsb3R0aW5nIFNCUCBieSBkYXkNCg0KIyBtb2RlbCBjb21wYXJpc29uIGNvbnNpZGVyaW5nIGRheTEgdnMgcHJldmlvdXMgbW9kZWwNCm00IDwtIGxtZXIoU0JQX2V2ZSB+IGdlbmRlciArIGFnZSArIEJNSSArIGRheTEgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIsbTMsbTQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00KSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIyBEQlBfZXZlDQpgYGB7ciB9DQojIHBsb3R0aW5nIERCUF9ldmUgYnkgZGF5DQpib3hwbG90KERCUF9ldmUgfiBkYXksZGF0YT1jbGVhbkJQKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzZCA8LSBsbWVyKERCUF9ldmUgfiBkYXkgKyAoMXxJRCksZGF0YT1jbGVhbkJQKQ0KV2VpZ2h0cyhBSUMobTBkLG0xLmJpc2QpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIHByZXZpb3VzIG1vZGVsDQptNGQgPC0gbG1lcihEQlBfZXZlIH4gZ2VuZGVyICsgYWdlICsgQk1JICsgZGF5ICsgKDF8SUQpLGRhdGE9Y2xlYW5CUCkNCldlaWdodHMoQUlDKG0wZCxtMWQsbTJkLG0zZCxtNGQpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG00ZCkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIDQuMy4gRW1vdGlvbmFsIEV4aGF1c3Rpb24NCg0KRm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLCB0aGUgcHJlLXJlZ2lzdGVyZWQgcG90ZW50aWFsIGNvdmFyaWF0ZXMgdG8gYmUgY29uc2lkZXJlZCBhcmU6IA0KDQoxLiBgZ2VuZGVyYCwgYXMgcHJldmlvdXMgZXZpZGVuY2UgaGlnaGxpZ2h0ZWQgaGlnaGVyIGVtb3Rpb25hbCBleGhhdXN0aW9uIGluIHdvbWVuIGNvbXBhcmVkIHRvIG1lbiAoZS5nLiwgW1B1cnZhbm92YSBldCBhbCAyMDEwXSgjcmVmKSkgYW5kIGdlbmRlciBoYXMgYmVlbiBoaWdobGlnaHRlZCBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3RzIG9mIHRyYWl0IHdvcmthaG9saXNtIChlLmcuLCBbQmxhZHVjY2kgZXQgYWwuLCAyMDE4OyAyMDIxXSgjcmVmKSkuDQoNCjIuIGBhZ2VgLCBhcyBwcmV2aW91cyBldmlkZW5jZSBoaWdobGlnaHRlZCBzb21lIGVtb3Rpb25hbCBleGhhdXN0aW9uIHRyZW5kIG92ZXIgYWdlIChlLmcuLCBbQnJld2VyIGV0IGFsLiwgMjAwNF0oI3JlZikpOyBob3dldmVyLCBubyBjbGVhciBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQgZm9yIHdvcmthaG9saXNtIG92ZXIgYWdlIChbQ2xhcmsgZXQgYWwuLCAyMDE2XSgjcmVmKSkuDQoNCjMuIFRoZSBkYWlseSBudW1iZXIgb2Ygd29ya2VkIGhvdXJzIGB3b3JrSG91cnNgLCBhcyBsb25nIHdvcmtpbmcgaG91cnMgaXMgYSBkZWZpbml0aW9uYWwgYXNwZWN0IG9mIHdvcmthaG9saXNtIHdoaWNoIGhhcyBiZWVuIGZvdW5kIGFzc29jaWF0ZWQgd2l0aCBlbW90aW9uYWwgZXhoYXVzdGlvbiAoW1NlaWRsZXIgZXQgYWwsIDIwMTRdKCNyZWYpKTsgaG93ZXZlciwgY29udHJvbGxpbmcgZm9yIHRoaXMgdmFyaWFibGUgbWlnaHQgcmlzayB0byBhcnRpZmljaWFsbHkgZGVmbGF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29ya2Fob2xpc20gYW5kIHNsZWVwIGRpc3R1cmJhbmNlcyBzaW5jZSB0aGUgZm9ybWVyIG1pZ2h0IGluZmx1ZW5jZSB0aGUgbGF0dGVyIHRocm91Z2ggd29ya2luZyBob3Vycy4gVGhhdCBpcywgd29ya2luZyBob3VycyBpcyBhICoqcG90ZW50aWFsIGV4cGxhbmF0b3J5IG1lY2hhbmlzbSoqIG9mIHRoZSBmb2N1c2VkIHJlbGF0aW9uc2hpcCwgYW5kIGluY2x1ZGluZyBpdCBhcyBhIGNvbnRyb2wgdmFyaWFibGUgbWlnaHQgYmlhcyByYXRoZXIgdGhhbiBzdHJlbmd0aGVuaW5nIHRoZSByZXN1bHRzIChzZWUgW1NwZWN0b3IgZXQgYWwuLCAyMDIxXSgjcmVmKSkuDQoNCjUuIFRoZSBvY2N1cnJlbmNlIG9mIGxhdGUgd29ya2luZyBob3VycyBpbiB0aGUgZXZlbmluZyBgbGF0ZVdvcmtIb3Vyc2AsIGNvbnNpc3RlbnRseSB3aXRoIHdoYXQgYXJndWVkIGFib3ZlIGZvciBgd29ya0hvdXJzYDsgYWxzbyBpbiB0aGlzIGNhc2UsIGNvbnRyb2xsaW5nIGZvciB0aGlzIHZhcmlhYmxlIG1pZ2h0IHJpc2sgdG8gcnVsZSBvdXQgYSAqKnBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20qKiBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gd29ya2Fob2xpc20gYW5kIHNsZWVwIGRpc3R1cmJhbmNlcy4NCg0KNy4gTm9ud29yayBoYXNzbGVzIGluIHRoZSBldmVuaW5nIGBkYWlseUhhc3NsZXNfZXZlYCwgYXMgcHJpdmF0ZSBsaWZlIGhhc3NsZXMgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gZW1vdGlvbmFsIGV4aGF1c3Rpb24gKGUuZy4sIFtLbHVzbWFubiBldCBhbC4sIDIwMjFdKCNyZWYpKSBhbmQgbm9ud29yayBoYXNzbGVzIHN1Y2ggYXMgcmVsYXRpb25zaGlwIHRlbnNpb24gaGF2ZSBiZWVuIHJlY2VudGx5IHJlbGF0ZWQgdG8gc3RhdGUgd29ya2Fob2xpc20gKFtDbGFyayBldCBhbC4sIDIwMjFdKCNyZWYpKTsgYWxzbyBpbiB0aGlzIGNhc2UsIHN1Y2ggYW4gYXJndW1lbnQgaW1wbHkgdGhhdCBub253b3JrIGhhc3NsZXMgYXJlIGEgKipwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtKiogb2YgdGhlIGZvY3VzZWQgcmVsYXRpb25zaGlwLg0KDQo4LiBSZW1vdGUgd29yayBgdGVsZVdvcmtgLCBhcyBlbW90aW9uYWwgZXhoYXVzdGlvbiBtaWdodCBiZSBkaWZmZXJlbnQgZHVyaW5nIHJlbW90ZSB3b3JrIGRheXMgKGUuZy4sIFtBYmRlbCBIYWRpIGV0IGFsLiwgMjAyMV0oI3JlZikpLCBhbHRob3VnaCB3aXRoIG5vIGNsZWFyIGV4cGVjdGF0aW9ucyBvbiBpdHMgcmVsYXRpb25zaGlwIHdpdGggd29ya2Fob2xpc20uDQoNCkZ1cnRoZXIgcHJlLXJlZ2lzdGVyZWQgbGV2ZWwtMiBjb3ZhcmlhdGVzIChpLmUuLCByZXRyb3NwZWN0aXZlIG1lYXN1cmVzIG9mIHRyYWl0IHdvcmthaG9saXNtLCB0ZWNobm9zdHJlc3MgY3JlYXRvcnMpIGFyZSBub3QgaW5jbHVkZWQgZHVlIHRvIG91ciBhaW0gdG8gZm9jdXMgdGhlIHN0dWR5IG9uIHRoZSBmb2N1c2VkIGxldmVsLTEgdmFyaWFibGVzLCB3aGVyZWFzIHJlY292ZXJ5IGV4cGVyaWVuY2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gYWxsIG1vZGVscyAoc2VlIFtTdXBwbGVtZW50YXJ5IG1hdGVyaWFsIFM3XShodHRwczovL29zZi5pby9icHJ2ZykpLiBCbG9vZCBwcmVzc3VyZSBjb25mb3VuZGVycyBhcmUgbm90IGNvbnNpZGVyZWQgYXMgd2VsbCwgZHVlIHRvIHRoZSBsYWNrIG9mIGNsZWFyIGxpbmsgd2l0aCBleGhhdXN0aW9uIGFuZCB3b3JrYWhvbGlzbS4gSW4gY29udHJhc3QsIGFkZGl0aW9uYWwgKGkuZS4sIG5vdCBwcmUtcmVnaXN0ZXJlZCkgbGV2ZWwtMiBjb3ZhcmlhdGVzIHBvdGVudGlhbGx5IG1vZGVyYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHdvcmthaG9saXNtIGFuZCBlbW90aW9uYWwgZXhoYXVzdGlvbiBhcmUgY29uc2lkZXJlZCBhcyBwb3RlbnRpYWxseSBjb25mb3VuZGluZyBmYWN0b3JzLg0KDQpQcmlvciB0byBldmFsdWF0ZSB0aGUgaW5jbHVzaW9uIG9mIGVhY2ggY292YXJpYXRlLCB3ZSBwcmVwYXJlIHRoZSBkYXRhIGZvciB0aGUgYW5hbHlzZXMuIFRoYXQgaXMsIHdlIHJlbW92ZSBjYXNlcyBvZiBtaXNzaW5nIHJlc3BvbnNlcyBpbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgb3IgYW55IGNvdmFyaWF0ZSAoKipsaXN0LXdpc2UgZGVsZXRpb24qKikgYW5kIHdlIGNlbnRlciBsZXZlbC0xIGNvbnRpbnVvdXMgY292YXJpYXRlcyBvbiB0aGUgaW5kaXZpZHVhbCBtZWFuICgqKnBlcnNvbi1tZWFuLWNlbnRlcmluZyoqKS4NCmBgYHtyIH0NCiMgbGlzdC13aXNlIGRlbGV0aW9uIGN1bG8NCmNsZWFuRUUgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGNsZWFuWyxjKCJJRCIsImRheSIsIkVFIiwiZ2VuZGVyIiwiYWdlIiwid29ya0hvdXJzIiwibGF0ZVdvcmtIb3VycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHlIYXNzbGVzX2V2ZSIsInRlbGVXb3JrIiwiaG9tZV9jaGlsZCIsImNoaWxkcmVuIildKSkNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5FRSksImNvbXBsZXRlIG9ic2VydmF0aW9ucyBmcm9tIixubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5FRSRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBtZWFuIGNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgY292YXJpYXRlcw0KZm9yKFZhciBpbiBjKCJ3b3JrSG91cnMiKSl7DQogIHByZWxxcyA8LSBjYmluZChwcmVscXMsYWdncmVnYXRlKGNsZWFuRUVbLFZhcl0sbGlzdChjbGVhbkVFJElEKSxtZWFuKVssMl0pICMgY29tcHV0aW5nIGluZGl2aWR1YWwgbWVhbnMNCiAgY29sbmFtZXMocHJlbHFzKVtuY29sKHByZWxxcyldIDwtIHBhc3RlMChWYXIsIi5jbSIpDQogIGNsZWFuRUUgPC0gam9pbihjbGVhbkVFLHByZWxxc1ssYygiSUQiLHBhc3RlMChWYXIsIi5jbSIpKV0sYnk9IklEIix0eXBlPSJsZWZ0IikgIyBqb2luaW5nIHdpdGggbG9uZy1mb3JtIGRhdGENCiAgY2xlYW5FRVsscGFzdGUwKFZhciwiLm1jIildIDwtIGNsZWFuRUVbLFZhcl0gLSBjbGVhbkVFWyxwYXN0ZTAoVmFyLCIuY20iKV0gfSAjIGNvbXB1dGluZyBtZWFuLWNlbnRlcmVkIHNjb3Jlcw0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMy4xLiBnZW5kZXINCg0KYGdlbmRlcmAgaXMgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB3aXRoIGEgcm91Z2hseSBiYWxhbmNlZCBudW1iZXIgb2YgcGFydGljaXBhbnRzLiBJbiBzZWN0aW9uIDMuNSB3ZSBkaWQgbm90IG9ic2VydmVkIHN1YnN0YW50aWFsIGdlbmRlciBkaWZmZXJlbmNlcyBpbiBlbW90aW9uYWwgZXhoYXVzdGlvbi4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGluIHRoZSBudWxsIG1vZGVsIHNob3dzIHdlYWtlciBldmlkZW5jZSAoaS5lLiwgbG93ZXIgQWthaWtlIHdlaWdodCksIHdpdGggYW4gZXN0aW1hdGVkIHQtdmFsdWUgbG93ZXIgdGhhbiAyLiBIb3dldmVyLCBjb25zaWRlcmluZyBpdHMgdGhlb3JldGljYWwgcmVsZXZhbmNlIGFzIGEgcG90ZW50aWFsIG1vZGVyYXRvciBvZiB0aGUgc3RyYWluaW5nIGVmZmVjdHMgb2Ygd29ya2Fob2xpc20gKGUuZy4sIFtCYWxkdWNjaSBldCBhbC4gKDIwMTgpXSgjcmVmKSkgKip3ZSBpbmNsdWRlIGBnZW5kZXJgIGFzIGEgY292YXJpYXRlKiogZm9yIHNsZWVwIGRpc3R1cmJhbmNlcy4NCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkVFWyFkdXBsaWNhdGVkKGNsZWFuRUUkSUQpLCJnZW5kZXIiXSkgIyBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuRUUkZ2VuZGVyKSAjIE5vLiBjYXNlcw0KDQojIG1vZGVsIGNvbXBhcmlzb24NCm0wIDwtIGxtZXIoRUUgfiAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KbTEgPC0gbG1lcihFRSB+IGdlbmRlciArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMSkpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSBpbmNsdWRpbmcgZ2VuZGVyDQpzdW1tYXJ5KG0xKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMy4yLiBhZ2UNCg0KYGFnZWAgaXMgYSBsZXZlbC0yIGNvbnRpbnVvdXMgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuMiB3YXMgdW5jb3JyZWxhdGVkIHdpdGggZW1vdGlvbmFsIGV4aGF1c3Rpb24gKCpyKiA9IDAuMDApLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW4gdGhlIG1vZGVsIGluY2x1ZGluZyBgZ2VuZGVyYCBpbXBsaWVzIHdlYWtlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSB0LXZhbHVlIGxvd2VyIHRoYW4gMi4gVGh1cywgYWxzbyBjb25zaWRlcmluZyB0aGUgdW5jZXJ0YWludHkgb24gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLg0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKEVFIH4gYWdlICsgKDF8SUQpLGRhdGE9Y2xlYW5FRSkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgZ2VuZGVyDQptMiA8LSBsbWVyKEVFIH4gZ2VuZGVyICsgYWdlICsgKDF8SUQpLGRhdGE9Y2xlYW5FRSkNCldlaWdodHMoQUlDKG0wLG0xLG0yKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTIpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC4zLjMuIHdvcmtIb3Vycw0KDQpgd29ya0hvdXJzYCBpcyBhIGxldmVsLTEgY29udGludW91cyB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy4yIHdhcyBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgd2l0aCBlbW90aW9uYWwgZXhoYXVzdGlvbiAoKnIqID0gMC4yMikuIENvbnNpc3RlbnRseSwgaXRzIGluY2x1c2lvbiBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgaGlnaGVyIHRoYW4gMi4gSG93ZXZlciwgY29uc2lkZXJpbmcgaXRzIHJvbGUgYXMgYSBwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtIChlLmcuLCBtZWRpYXRvcikgdGhyb3VnaCB3aGljaCB3b3JrYWhvbGlzbSBtaWdodCBpbXBhY3Qgb24gc3RyYWluLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLg0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKEVFIH4gd29ya0hvdXJzLm1jICsgKDF8SUQpLGRhdGE9Y2xlYW5FRSkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyB3b3JrSG91cnMubWMgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMy40LiBsYXRlV29ya0hvdXJzDQoNCmBsYXRlV29ya0hvdXJzYCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBkaWQgbm90IHByZWRpY3Qgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZXMgaW4gZW1vdGlvbmFsIGV4aGF1c3Rpb24uIENvbnNpc3RlbnRseSwgaXRzIGluY2x1c2lvbiBpbXBsaWVzIHdlYWtlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSB0LXZhbHVlIGxvd2VyIHRoYW4gMi4gVGh1cywgYWxzbyBjb25zaWRlcmluZyBpdHMgcm9sZSBhcyBhIHBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20gKGUuZy4sIG1lZGlhdG9yKSB0aHJvdWdoIHdoaWNoIHdvcmthaG9saXNtIG1pZ2h0IGltcGFjdCBvbiBzdHJhaW4sICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3IgZW1vdGlvbmFsIGV4aGF1c3Rpb24uDQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5FRSRsYXRlV29ya0hvdXJzKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoRUUgfiBsYXRlV29ya0hvdXJzICsgKDF8SUQpLGRhdGE9Y2xlYW5FRSkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgZ2VuZGVyDQptMiA8LSBsbWVyKEVFIH4gZ2VuZGVyICsgbGF0ZVdvcmtIb3VycyArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMy41LiBkYWlseUhhc3NsZXNfZXZlDQoNCmBkYWlseUhhc3NsZXNfZXZlYCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBwcmVkaWN0ZWQgaGlnaGVyIGVtb3Rpb25hbCBleGhhdXN0aW9uLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW1wbGllcyBzdHJvbmdlciBldmlkZW5jZSAoaS5lLiwgaGlnaGVyIEFrYWlrZSB3ZWlnaHQpIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGVzdGltYXRlZCBhYnNvbHV0ZSB0LXZhbHVlIGhpZ2hlciB0aGFuIDIuIEhvd2V2ZXIsIHRoZSB2YXJpYWJsZSBzaG93cyBhIHN0cm9uZ2x5IHVuYmFsYW5jZWQgbnVtYmVyIG9mIGNhc2VzLCB3aXRoIG9ubHkgMTAlIG9mIGNhc2VzIHdpdGggc29tZSBldmVuaW5nIGhhc3NsZXMuIE1vcmVvdmVyLCB3ZSBjb25zaWRlciB0aGUgdGhlb3JldGljYWwgaW1wb3J0YW5jZSBvZiB0aGlzIHZhcmlhYmxlLCB3aGljaCBtaWdodCBiZSBhIHBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20gKGUuZy4sIG1lZGlhdG9yKSB0aHJvdWdoIHdoaWNoIHdvcmthaG9saXNtIG1pZ2h0IGltcGFjdCBvbiBzdHJhaW4uIFRodXMsICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3IgZW1vdGlvbmFsIGV4aGF1c3Rpb24uDQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5FRSRkYWlseUhhc3NsZXNfZXZlKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gZGFpbHlIYXNzbGVzX2V2ZSB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihFRSB+IGRhaWx5SGFzc2xlc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIGdlbmRlcg0KbTIgPC0gbG1lcihFRSB+IGdlbmRlciArIGRhaWx5SGFzc2xlc19ldmUgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMikkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjMuNi4gdGVsZVdvcmsNCg0KYHRlbGVXb3JrYCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBkaWQgbm90IHByZWRpY3Qgc3Vic3RhbnRpYWwgZGlmZmVyZW5jZXMgaW4gZW1vdGlvbmFsIGV4aGF1c3Rpb24uIENvbnNpc3RlbnRseSwgaXRzIGluY2x1c2lvbiBpbXBsaWVzIHdlYWtlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSB0LXZhbHVlIGxvd2VyIHRoYW4gMi4gVGh1cywgYWxzbyBjb25zaWRlcmluZyB0aGUgdW5iYWxhbmNlZCBudW1iZXIgb2YgY2FzZXMgcGVyIGxldmVsIGFuZCB0aGUgdW5jZXJ0YWludHkgb2YgaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLg0KYGBge3IgfQ0KIyBudW1iZXIgb2YgY2FzZXMgYnkgY292YXJpYXRlIGxldmVsDQpzdW1tYXJ5KGNsZWFuRUUkdGVsZVdvcmspICMgY3VycmVudGx5IDQgY2F0ZWdvcmllcw0KY2xlYW5FRSR0ZWxlV29yayA8LSBhcy5mYWN0b3IoZ3N1YigiYm90aCIsInRlbGVXb3JrIixnc3ViKCJkYXlPZmYiLCJ0ZWxlV29yayIsY2xlYW5FRSR0ZWxlV29yaykpKSAjIHJlY29kaW5nIHRvIDIgY2F0ZWdvcmllcw0Kc3VtbWFyeShjbGVhbkVFJHRlbGVXb3JrKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoRUUgfiB0ZWxlV29yayArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIGdlbmRlciArIGRhaWx5SGFzc2xlc19ldmUNCm0yIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyB0ZWxlV29yayArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuMy43LiBPdGhlciBjb3ZhcmlhdGVzDQoNCkluIGFkZGl0aW9uIHRvIHRoZSBwcmUtcmVnaXN0ZXJlZCBjb3ZhcmlhdGVzLCB3ZSBjb25zaWRlciBhICoqZnVydGhlciBsZXZlbC0yIGNvdmFyaWF0ZSoqIHRoYXQgaW4gc2VjdGlvbiAzLjUgc2hvd2VkIHN1YnN0YW50aWFsIHRyZW5kcyBpbiBib3RoIGVtb3Rpb25hbCBleGhhdXN0aW9uIGFuZCB3b3JrYWhvbGlzbSwgYW5kIHdob3NlIHBvdGVudGlhbCBpbmZsdWVuY2Ugb24gYm90aCB2YXJpYWJsZXMgY2FuIGJlIHRoZW9yZXRpY2FsbHkgYXJndWVkLCBuYW1lbHkgaGF2aW5nIGBjaGlsZHJlbmAgb3IgbGl2aW5nIHdpdGggY2hpbGRyZW4gYGhvbWVfY2hpbGRgLiBJbmRlZWQsIHJlc3BvbmRlbnRzIHJlcG9ydGluZyB0byBsaXZlIHdpdGggdGhlaXIgY2hpbGRyZW4gc2hvd2VkIGxvd2VyIGVtb3Rpb25hbCBleGhhdXN0aW9uLCB3aGVyZWFzIHRob3NlIHJlcG9ydGluZyB0byBoYXZlIGNoaWxkcmVuIHJlcG9ydGVkIHNsaWdodGx5IGxvd2VyIHdvcmthaG9saXNtIChzZWUgc2VjdGlvbiAzLjUpLiBUaGVvcmV0aWNhbGx5LCBpdCBpcyBwbGF1c2libGUgYWx0aG91Z2ggbm90IGNvbnNpc3RlbnRseSByZXBvcnRlZCBieSBwcmV2aW91cyByZXNlYXJjaCAoc2VlIFtDbGFyayBldCBhbC4sIDIwMTZdKCNyZWYpKSB0aGF0IHdvcmthaG9saXNtIGxldmVscyBhbmQgb3ZlcmFsbCBpbnZlc3RtZW50IGluIHRoZSB3b3JrIHZzLiBmYW1pbHkgZG9tYWluIGFyZSBpbmZsdWVuY2VkIGJ5IGZhbWlseSBuZWVkcyBhbmQgcHJlc2VuY2Ugb2YgY2hpbGRyZW4gaW4gdGhlIGhvdXNlaG9sZC4gVGh1cywgYm90aCBgY2hpbGRyZW5gIGFuZCBgaG9tZV9jaGlsZGAgbWlnaHQgYmUgYSBjb21tb24gZXh0ZXJuYWwgdmFyaWFibGUgaW5mbHVlbmNpbmcgYm90aCB3b3JrYWhvbGlzbSBhbmQgZW1vdGlvbmFsIGV4aGF1c3Rpb24sIGFuZCB3ZSBjb25zaWRlciBpdCBhcyBhIGZ1cnRoZXIgcG90ZW50aWFsIGNvdmFyaWF0ZS4NCg0KQWx0aG91Z2ggYm90aCBgY2hpbGRyZW5gIGFuZCBgaG9tZV9jaGlsZGAgaGF2ZSBhbiBhY2NlcHRhYmx5IGJhbGFuY2VkIG51bWJlciBvZiBjYXNlcyBwZXIgbGV2ZWwsIG5vbmUgb2YgdGhlbSBpbXBsaWVkIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gdGhlIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscy4gVGh1cywgYWxzbyBpbiB0aGlzIGNhc2UsICoqd2UgZG8gbm90IGluY2x1ZGUqKiB0aGVzZSB0d28gdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgZm9yIGVtb3Rpb25hbCBleGhhdXN0aW9uLg0KYGBge3IgfQ0KIyBjaGlsZHJlbi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uDQoNCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhbkVFWyFkdXBsaWNhdGVkKGNsZWFuRUUkSUQpLCJjaGlsZHJlbiJdKSAjIGNoaWxkcmVuOiBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuRUUkY2hpbGRyZW4pICMgY2hpbGRyZW46IE5vLiBjYXNlcw0KDQojIG1vZGVsIGNvbXBhcmlzb24gaG9tZV9jaGlsZCB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihFRSB+IGhvbWVfY2hpbGQgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBjaGlsZHJlbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBjaGlsZHJlbiArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIGhvbWVfY2hpbGQuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpzdW1tYXJ5KGNsZWFuRUVbIWR1cGxpY2F0ZWQoY2xlYW5FRSRJRCksImhvbWVfY2hpbGQiXSkgIyBob21lX2NoaWxkOiBOby4gcGFydGljaXBhbnRzDQpzdW1tYXJ5KGNsZWFuRUUkaG9tZV9jaGlsZCkgIyBob21lX2NoaWxkOiBOby4gY2FzZXMNCg0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKEVFIH4gY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBob21lX2NoaWxkIHZzIGdlbmRlcg0KbTIgPC0gbG1lcihFRSB+IGdlbmRlciArIGhvbWVfY2hpbGQgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMikkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjMuOC4gVGltZSB0cmVuZHMNCg0KQXMgYSBmaW5hbCwgbm90IHByZS1yZWdpc3RlcmVkLCBjb250cm9sLCB3ZSBpbnNwZWN0IHRoZSAqKmxpbmVhciB0aW1lIHRyZW5kcyoqIG9mIHRoZSBvdXRjb21lIHZhcmlhYmxlLiBUaGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgYGRheWBzIHNpbmNlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0dWR5IGFzIGEgZnVydGhlciBjb3ZhcmlhdGUuIFdlIGNhbiBzZWUgdGhhdCB0aGUgaW5jbHVzaW9uIG9mIGBkYXlgIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgdGhhbiB0aGUgbnVsbCBtb2RlbCB1bmxlc3MgdGhlIG1vZGVsIG9ubHkgaW5jbHVkaW5nIGBnZW5kZXJgIGlzIGNvbnNpZGVyZWQsIHdpdGggYSB0LXZhbHVlIGhpZ2hlciB0aGFuIDIuIEhvd2V2ZXIsIHdlIGNhbm5vdCBzZWUgYSBjbGVhciBsaW5lYXIgdHJlbmQgb2YgYEVFYCBvdmVyIHRpbWUuIFRodXMsIHdlICoqZG8gbm90IGluY2x1ZGUqKiBgZGF5YCBhcyBhIGNvdmFyaWF0ZSBmb3IgZW1vdGlvbmFsIGV4aGF1c3Rpb24sIGJ1dCB3ZSB3aWxsIGNvbnNpZGVyIGl0IGFzIGEgcm9idXN0bmVzcyBjaGVjay4NCmBgYHtyIH0NCiMgcGxvdHRpbmcgU0QgYnkgZGF5DQpib3hwbG90KEVFIH4gZGF5LGRhdGE9Y2xlYW5FRSkNCg0KIyBtb2RlbCBjb21wYXJpc29uIGRheSB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihFRSB+IGRheSArICgxfElEKSxkYXRhPWNsZWFuRUUpDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gZGF5IHZzIGdlbmRlciArIGRhaWx5SGFzc2xlc19ldmUNCm0yIDwtIGxtZXIoRUUgfiBnZW5kZXIgKyBkYXkgKyAoMXxJRCksZGF0YT1jbGVhbkVFKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiBzYW1lIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWxzDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMgNC40LiBTbGVlcCBkaXN0dXJiYW5jZXMNCg0KRm9yIHNsZWVwIGRpc3R1cmJhbmNlcywgdGhlIHByZS1yZWdpc3RlcmVkIHBvdGVudGlhbCBjb3ZhcmlhdGVzIHRvIGJlIGNvbnNpZGVyZWQgYXJlOiANCg0KMS4gYGdlbmRlcmAsIGFzIHByZXZpb3VzIGV2aWRlbmNlIGhpZ2hsaWdodGVkIHBvb3JlciBzbGVlcCBxdWFsaXR5IGluIHdvbWVuIGNvbXBhcmVkIHRvIG1lbiAoZS5nLiwgW1plbmcgZXQgYWwuLCAyMDIyXSgjcmVmKSkgYW5kIGdlbmRlciBoYXMgYmVlbiBoaWdobGlnaHRlZCBhcyBhIHBvdGVudGlhbCBtb2RlcmF0b3Igb2YgdGhlIHN0cmFpbmluZyBlZmZlY3RzIG9mIHRyYWl0IHdvcmthaG9saXNtIChlLmcuLCBbQmxhZHVjY2kgZXQgYWwuLCAyMDE4OyAyMDIxXSgjcmVmKSkuDQoNCjIuIGBhZ2VgLCBhcyBwcmV2aW91cyBldmlkZW5jZSBoaWdobGlnaHRlZCBwb29yZXIgc2xlZXAgcXVhbGl0eSBpbiBhZ2luZyAoZS5nLiwgW0Zsb3lkIGV0IGFsLiwgMjAwMF0oI3JlZikpOyBob3dldmVyLCBubyBjbGVhciBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gaGlnaGxpZ2h0ZWQgZm9yIHdvcmthaG9saXNtIG92ZXIgYWdlIChbQ2xhcmsgZXQgYWwuLCAyMDE2XSgjcmVmKSkuDQoNCjMuIFRoZSB0aW1lIHNpbmNlIHdha2luZyB1cCBgaGhGcm9tQXdha2VgLCBhcyBwZXJjZWl2ZWQgc2xlZXAgZGlzdHVyYmFuY2VzIG1pZ2h0IGNoYW5nZSB3aXRoIHRoZSB0aW1lIGJldHdlZW4gYXdha2VuaW5nIGFuZCB0aGUgc3Vic2VxdWVudCBzdXJ2ZXkgcmVzcG9uc2U7IGhvd2V2ZXIsIHdlIGhhdmUgbm8gY2xlYXIgZXhwZWN0YXRpb24gb24gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCBhbmQgdGhlIHR3byB2YXJpYWJsZXMgYXJlIHVuY29ycmVsYXRlZCAoKnIqID0gMC4wMikuDQoNCjQuIFRoZSBkYWlseSBudW1iZXIgb2Ygd29ya2VkIGhvdXJzIGB3b3JrSG91cnNgLCBhcyBsb25nIHdvcmtpbmcgaG91cnMgaXMgYSBkZWZpbml0aW9uYWwgYXNwZWN0IG9mIHdvcmthaG9saXNtIHdoaWNoIGhhcyBiZWVuIGZvdW5kIGFzc29jaWF0ZWQgd2l0aCBzbGVlcCBkaXN0dXJiYW5jZXMgKFtWaXJ0YW5lbiwgMjAwOV0oI3JlZikpOyBob3dldmVyLCBjb250cm9sbGluZyBmb3IgdGhpcyB2YXJpYWJsZSBtaWdodCByaXNrIHRvIGFydGlmaWNpYWxseSBkZWZsYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgc2xlZXAgZGlzdHVyYmFuY2VzIHNpbmNlIHRoZSBmb3JtZXIgbWlnaHQgaW5mbHVlbmNlIHRoZSBsYXR0ZXIgdGhyb3VnaCB3b3JraW5nIGhvdXJzLiBUaGF0IGlzLCB3b3JraW5nIGhvdXJzIGlzIGEgKipwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtKiogb2YgdGhlIGZvY3VzZWQgcmVsYXRpb25zaGlwLCBhbmQgaW5jbHVkaW5nIGl0IGFzIGEgY29udHJvbCB2YXJpYWJsZSBtaWdodCBiaWFzIHJhdGhlciB0aGFuIHN0cmVuZ3RoZW5pbmcgdGhlIHJlc3VsdHMgKHNlZSBbU3BlY3RvciBldCBhbC4sIDIwMjFdKCNyZWYpKS4NCg0KNS4gVGhlIG9jY3VycmVuY2Ugb2YgbGF0ZSB3b3JraW5nIGhvdXJzIGluIHRoZSBldmVuaW5nIGBsYXRlV29ya0hvdXJzYCwgY29uc2lzdGVudGx5IHdpdGggd2hhdCBhcmd1ZWQgYWJvdmUgZm9yIGB3b3JrSG91cnNgOyBhbHNvIGluIHRoaXMgY2FzZSwgY29udHJvbGxpbmcgZm9yIHRoaXMgdmFyaWFibGUgbWlnaHQgcmlzayB0byBydWxlIG91dCBhICoqcG90ZW50aWFsIGV4cGxhbmF0b3J5IG1lY2hhbmlzbSoqIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgc2xlZXAgZGlzdHVyYmFuY2VzDQoNCjcuIE5vbndvcmsgaGFzc2xlcyBpbiB0aGUgZXZlbmluZyBgZGFpbHlIYXNzbGVzX2V2ZWAsIGFzIGhhc3NsZXMgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gc2xlZXAgZGlzdHVyYmFuY2VzIChlLmcuLCBbRGFobCBldCBhbC4sIDIwMDddKCNyZWYpKSBhbmQgbm9ud29yayBoYXNzbGVzIHN1Y2ggYXMgcmVsYXRpb25zaGlwIHRlbnNpb24gaGF2ZSBiZWVuIHJlY2VudGx5IHJlbGF0ZWQgdG8gc3RhdGUgd29ya2Fob2xpc20gKFtDbGFyayBldCBhbC4sIDIwMjFdKCNyZWYpKTsgYWxzbyBpbiB0aGlzIGNhc2UsIHN1Y2ggYW4gYXJndW1lbnQgaW1wbHkgdGhhdCBub253b3JrIGhhc3NsZXMgYXJlIGEgKipwb3RlbnRpYWwgZXhwbGFuYXRvcnkgbWVjaGFuaXNtKiogb2YgdGhlIGZvY3VzZWQgcmVsYXRpb25zaGlwLg0KDQo4LiBSZW1vdGUgd29yayBgdGVsZVdvcmtgLCBhbHRob3VnaCB3aXRoIG5vIGNsZWFyIGV4cGVjdGF0aW9ucyBvbiBpdHMgcmVsYXRpb25zaGlwIHdpdGggc2xlZXAgZGlzdHVyYmFuY2VzLCB3aGlsZSB3ZSBvcmlnaW5hbGx5IGh5cG90aGVzaXplZCB0aGF0IHJlbW90ZSB3b3JraW5nIG1pZ2h0IGFjdCBhcyBhIG1vZGVyYXRvciBvZiB0aGUgc3RyYWluaW5nIGVmZmVjdCBvZiB3b3JrYWhvbGlzbS4NCg0KRnVydGhlciBwcmUtcmVnaXN0ZXJlZCBsZXZlbC0yIGNvdmFyaWF0ZXMgKGkuZS4sIHJldHJvc3BlY3RpdmUgbWVhc3VyZXMgb2YgdHJhaXQgd29ya2Fob2xpc20sIHRlY2hub3N0cmVzcyBjcmVhdG9ycykgYXJlIG5vdCBpbmNsdWRlZCBkdWUgdG8gb3VyIGFpbSB0byBmb2N1cyB0aGUgc3R1ZHkgb24gdGhlIGZvY3VzZWQgbGV2ZWwtMSB2YXJpYWJsZXMsIHdoZXJlYXMgcmVjb3ZlcnkgZXhwZXJpZW5jZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiBhbGwgbW9kZWxzIChzZWUgW1N1cHBsZW1lbnRhcnkgbWF0ZXJpYWwgUzddKGh0dHBzOi8vb3NmLmlvL2JwcnZnKSkuIEluIGNvbnRyYXN0LCBhZGRpdGlvbmFsIChpLmUuLCBub3QgcHJlLXJlZ2lzdGVyZWQpIGxldmVsLTIgY292YXJpYXRlcyBwb3RlbnRpYWxseSBtb2RlcmF0aW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3b3JrYWhvbGlzbSBhbmQgc2xlZXAgZGlzdHVyYmFuY2VzIGFyZSBjb25zaWRlcmVkIGFzIHBvdGVudGlhbGx5IGNvbmZvdW5kaW5nIGZhY3RvcnMuDQoNClByaW9yIHRvIGV2YWx1YXRlIHRoZSBpbmNsdXNpb24gb2YgZWFjaCBjb3ZhcmlhdGUsIHdlIHByZXBhcmUgdGhlIGRhdGEgZm9yIHRoZSBhbmFseXNlcy4gVGhhdCBpcywgd2UgcmVtb3ZlIGNhc2VzIG9mIG1pc3NpbmcgcmVzcG9uc2VzIGluIHRoZSByZXNwb25zZSB2YXJpYWJsZSBvciBhbnkgY292YXJpYXRlICgqKmxpc3Qtd2lzZSBkZWxldGlvbioqKSBhbmQgd2UgY2VudGVyIGxldmVsLTEgY29udGludW91cyBjb3ZhcmlhdGVzIG9uIHRoZSBpbmRpdmlkdWFsIG1lYW4gKCoqcGVyc29uLW1lYW4tY2VudGVyaW5nKiopLg0KYGBge3IgfQ0KIyBsaXN0LXdpc2UgZGVsZXRpb24NCmNsZWFuU0QgPC0gYXMuZGF0YS5mcmFtZShuYS5vbWl0KGNsZWFuWyxjKCJJRCIsImRheSIsIlNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZGVyIiwiYWdlIiwid29ya0hvdXJzIiwiaGhGcm9tQXdha2UiLCJsYXRlV29ya0hvdXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHlIYXNzbGVzX2V2ZSIsInRlbGVXb3JrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9tZV9jaGlsZCIsImNoaWxkcmVuIildKSkNCmNhdCgiQ29uc2lkZXJpbmciLG5yb3coY2xlYW5TRCksImNvbXBsZXRlIG9ic2VydmF0aW9ucyBmcm9tIixubGV2ZWxzKGFzLmZhY3Rvcihhcy5jaGFyYWN0ZXIoY2xlYW5TRCRJRCkpKSwicGFydGljaXBhbnRzIikNCg0KIyBtZWFuIGNlbnRlcmluZyBsdi0xIGNvbnRpbnVvdXMgY292YXJpYXRlcw0KZm9yKFZhciBpbiBjKCJoaEZyb21Bd2FrZSIsIndvcmtIb3VycyIpKXsNCiAgcHJlbHFzIDwtIGNiaW5kKHByZWxxcyxhZ2dyZWdhdGUoY2xlYW5TRFssVmFyXSxsaXN0KGNsZWFuU0QkSUQpLG1lYW4pWywyXSkgIyBjb21wdXRpbmcgaW5kaXZpZHVhbCBtZWFucw0KICBjb2xuYW1lcyhwcmVscXMpW25jb2wocHJlbHFzKV0gPC0gcGFzdGUwKFZhciwiLmNtIikNCiAgY2xlYW5TRCA8LSBqb2luKGNsZWFuU0QscHJlbHFzWyxjKCJJRCIscGFzdGUwKFZhciwiLmNtIikpXSxieT0iSUQiLHR5cGU9ImxlZnQiKSAjIGpvaW5pbmcgd2l0aCBsb25nLWZvcm0gZGF0YQ0KICBjbGVhblNEWyxwYXN0ZTAoVmFyLCIubWMiKV0gPC0gY2xlYW5TRFssVmFyXSAtIGNsZWFuU0RbLHBhc3RlMChWYXIsIi5jbSIpXSB9ICMgY29tcHV0aW5nIG1lYW4tY2VudGVyZWQgc2NvcmVzDQpgYGANCg0KPGJyPg0KDQojIyMgNC40LjEuIGdlbmRlcg0KDQpgZ2VuZGVyYCBpcyBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHdpdGggYSByb3VnaGx5IGJhbGFuY2VkIG51bWJlciBvZiBwYXJ0aWNpcGFudHMuIEFsdGhvdWdoIGluIHNlY3Rpb24gMy41IHdlIG9ubHkgb2JzZXJ2ZWQgc29tZSBzbGlnaHQgdGVuZGVuY3ksIGl0cyBpbmNsdXNpb24gaW4gdGhlIG51bGwgbW9kZWwgc2hvd3MgaW1wcm92ZWQgZXZpZGVuY2UgKGkuZS4sIGhpZ2hlciBBa2Fpa2Ugd2VpZ2h0KSBjb21wYXJlZCB0byB0aGUgbnVsbCBtb2RlbCwgd2l0aCBhbiBlc3RpbWF0ZWQgdC12YWx1ZSBjbG9zZSB0byAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIGl0cyB0aGVvcmV0aWNhbCByZWxldmFuY2UgYXMgYSBwb3RlbnRpYWwgbW9kZXJhdG9yIG9mIHRoZSBzdHJhaW5pbmcgZWZmZWN0cyBvZiB3b3JrYWhvbGlzbSAoZS5nLiwgW0JhbGR1Y2NpIGV0IGFsLiAoMjAxOCldKCNyZWYpKSAqKndlIGluY2x1ZGUgYGdlbmRlcmAgYXMgYSBjb3ZhcmlhdGUqKiBmb3Igc2xlZXAgZGlzdHVyYmFuY2VzLg0KYGBge3IgfQ0KIyBudW1iZXIgb2YgY2FzZXMgYnkgY292YXJpYXRlIGxldmVsDQpzdW1tYXJ5KGNsZWFuU0RbIWR1cGxpY2F0ZWQoY2xlYW5TRCRJRCksImdlbmRlciJdKSAjIE5vLiBwYXJ0aWNpcGFudHMNCnN1bW1hcnkoY2xlYW5TRCRnZW5kZXIpICMgTm8uIGNhc2VzDQoNCiMgbW9kZWwgY29tcGFyaXNvbg0KbTAgPC0gbG1lcihTRCB+ICgxfElEKSxkYXRhPWNsZWFuU0QpDQptMSA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xKSkgIyBBa2Fpa2Ugd2VpZ2h0czogc3Ryb25nZXIgZXZpZGVuY2UgaW5jbHVkaW5nIGdlbmRlcg0Kc3VtbWFyeShtMSkkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHByb3hpbWFsIHRvIHx0fD0yDQpgYGANCg0KPGJyPg0KDQojIyMgNC40LjIuIGFnZQ0KDQpgYWdlYCBpcyBhIGxldmVsLTIgY29udGludW91cyB2YXJpYWJsZSB0aGF0IGluIHNlY3Rpb24gMy4yIHdhcyB1bnJlbGF0ZWQgd2l0aCBzbGVlcCBkaXN0dXJiYW5jZXMgKCpyKiA9IDAuMDIpLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW4gdGhlIG1vZGVsIGluY2x1ZGluZyBgZ2VuZGVyYCBpbXBsaWVzIHdlYWtlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBhYnNvbHV0ZSB0LXZhbHVlIGxvd2VyIHRoYW4gMi4gVGh1cywgYWxzbyBjb25zaWRlcmluZyB0aGUgdW5jZXJ0YWludHkgb24gaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHdvcmthaG9saXNtLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIHNsZWVwIGRpc3R1cmJhbmNlcy4NCmBgYHtyIH0NCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTRCB+IGFnZSArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIGdlbmRlcg0KbTIgPC0gbG1lcihTRCB+IGdlbmRlciArIGFnZSArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuNC4zLiBoaEZyb21Bd2FrZQ0KDQpgaGhGcm9tQXdha2VgIGlzIGEgbGV2ZWwtMSBjb250aW51b3VzIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjIgd2FzIHVucmVsYXRlZCB0byBzbGVlcCBkaXN0dXJiYW5jZXMgKCpyKiA9IDAuMDIpLiBDb25zaXN0ZW50bHksIGl0cyBpbmNsdXNpb24gaW1wbGllcyB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBtb3JlIHBhcnNpbW9uaW91cyBtb2RlbHMsIHdpdGggYW4gYWJzb2x1dGUgdC12YWx1ZSBsb3dlciB0aGFuIDIuIFRodXMsIGFsc28gY29uc2lkZXJpbmcgdGhlIHVuY2VydGFpbnR5IG9mIGl0cyByZWxhdGlvbnNoaXAgd2l0aCBib3RoIHdvcmthaG9saXNtIGFuZCBzbGVlcCBkaXN0dXJiYW5jZXMsICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3Igc2xlZXAgZGlzdHVyYmFuY2VzLg0KYGBge3IgfQ0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNEIH4gaGhGcm9tQXdha2UubWMgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBoaEZyb21Bd2FrZS5tYyArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuNC40LiB3b3JrSG91cnMNCg0KYHdvcmtIb3Vyc2AgaXMgYSBsZXZlbC0xIGNvbnRpbnVvdXMgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuMiB3YXMgdW5jb3JyZWxhdGVkIHdpdGggc2xlZXAgZGlzdHVyYmFuY2VzICgqciogPSAwLjAyKS4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgd2Vha2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgbG93ZXIgdGhhbiAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIGl0cyByb2xlIGFzIGEgcG90ZW50aWFsIGV4cGxhbmF0b3J5IG1lY2hhbmlzbSAoZS5nLiwgbWVkaWF0b3IpIHRocm91Z2ggd2hpY2ggd29ya2Fob2xpc20gbWlnaHQgaW1wYWN0IG9uIHN0cmFpbiwgKip3ZSBkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBzbGVlcCBkaXN0dXJiYW5jZXMuDQpgYGB7ciB9DQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0QgfiB3b3JrSG91cnMubWMgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyB3b3JrSG91cnMubWMgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMikkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjQuNS4gbGF0ZVdvcmtIb3Vycw0KDQpgbGF0ZVdvcmtIb3Vyc2AgaXMgYSBsZXZlbC0xIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjUgZGlkIG5vdCBwcmVkaWN0IHN1YnN0YW50aWFsIGRpZmZlcmVuY2VzIGluIHNsZWVwIGRpc3R1cmJhbmNlcy4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgd2Vha2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgbG93ZXIgdGhhbiAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIGl0cyByb2xlIGFzIGEgcG90ZW50aWFsIGV4cGxhbmF0b3J5IG1lY2hhbmlzbSAoZS5nLiwgbWVkaWF0b3IpIHRocm91Z2ggd2hpY2ggd29ya2Fob2xpc20gbWlnaHQgaW1wYWN0IG9uIHN0cmFpbiwgKip3ZSBkbyBub3QgaW5jbHVkZSoqIGl0IGFzIGEgY292YXJpYXRlIGZvciBzbGVlcCBkaXN0dXJiYW5jZXMuDQpgYGB7ciB9DQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5TRCRsYXRlV29ya0hvdXJzKQ0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0QgfiBsYXRlV29ya0hvdXJzICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIG51bGwgbW9kZWwNCnN1bW1hcnkobTEuYmlzKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KDQojIG1vZGVsIGNvbXBhcmlzb24gdnMgZ2VuZGVyDQptMiA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgbGF0ZVdvcmtIb3VycyArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMSxtMikpICMgQWthaWtlIHdlaWdodHM6IHdlYWtlciBldmlkZW5jZSB0aGFuIHByZXZpb3VzIG1vZGVsDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8IDwgMg0KYGBgDQoNCjxicj4NCg0KIyMjIDQuNC42LiBkYWlseUhhc3NsZXNfZXZlDQoNCmBkYWlseUhhc3NsZXNfZXZlYCBpcyBhIGxldmVsLTEgY2F0ZWdvcmljYWwgdmFyaWFibGUgdGhhdCBpbiBzZWN0aW9uIDMuNSBwcmVkaWN0ZWQgc2xpZ2h0bHkgaGlnaGVyIHNsZWVwIGRpc3R1cmJhbmNlcy4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgc3Ryb25nZXIgZXZpZGVuY2UgKGkuZS4sIGhpZ2hlciBBa2Fpa2Ugd2VpZ2h0KSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgd2l0aCBhbiBlc3RpbWF0ZWQgYWJzb2x1dGUgdC12YWx1ZSBoaWdoZXIgdGhhbiAyLiBIb3dldmVyLCB0aGUgdmFyaWFibGUgc2hvd3MgYSBzdHJvbmdseSB1bmJhbGFuY2VkIG51bWJlciBvZiBjYXNlcywgd2l0aCBvbmx5IDEwJSBvZiBjYXNlcyB3aXRoIHNvbWUgZXZlbmluZyBoYXNzbGUuIE1vcmVvdmVyLCB3ZSBjb25zaWRlciB0aGUgdGhlb3JldGljYWwgaW1wb3J0YW5jZSBvZiB0aGlzIHZhcmlhYmxlLCB3aGljaCBtaWdodCBiZSBhIHBvdGVudGlhbCBleHBsYW5hdG9yeSBtZWNoYW5pc20gKGUuZy4sIG1lZGlhdG9yKSB0aHJvdWdoIHdoaWNoIHdvcmthaG9saXNtIG1pZ2h0IGltcGFjdCBvbiBzdHJhaW4uIFRodXMsICoqd2UgZG8gbm90IGluY2x1ZGUqKiBpdCBhcyBhIGNvdmFyaWF0ZSBmb3Igc2xlZXAgZGlzdHVyYmFuY2VzLg0KYGBge3IgfQ0KIyBudW1iZXIgb2YgY2FzZXMgYnkgY292YXJpYXRlIGxldmVsDQpzdW1tYXJ5KGNsZWFuU0QkZGFpbHlIYXNzbGVzX2V2ZSkNCg0KIyBtb2RlbCBjb21wYXJpc29uIGRhaWx5SGFzc2xlc19ldmUgdnMgbnVsbA0KbTEuYmlzIDwtIGxtZXIoU0QgfiBkYWlseUhhc3NsZXNfZXZlICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xLmJpcykpICMgQWthaWtlIHdlaWdodHM6IHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXINCm0yIDwtIGxtZXIoU0QgfiBnZW5kZXIgKyBkYWlseUhhc3NsZXNfZXZlICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xLG0yKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTIpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPiAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC40LjcuIHRlbGVXb3JrDQoNCmB0ZWxlV29ya2AgaXMgYSBsZXZlbC0xIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHRoYXQgaW4gc2VjdGlvbiAzLjUgZGlkIG5vdCBwcmVkaWN0IHN1YnN0YW50aWFsIGRpZmZlcmVuY2VzIGluIHNsZWVwIGRpc3R1cmJhbmNlcy4gQ29uc2lzdGVudGx5LCBpdHMgaW5jbHVzaW9uIGltcGxpZXMgd2Vha2VyIGV2aWRlbmNlIHRoYW4gbW9yZSBwYXJzaW1vbmlvdXMgbW9kZWxzLCB3aXRoIGFuIGFic29sdXRlIHQtdmFsdWUgbG93ZXIgdGhhbiAyLiBUaHVzLCBhbHNvIGNvbnNpZGVyaW5nIHRoZSB1bmJhbGFuY2VkIG51bWJlciBvZiBjYXNlcyBwZXIgbGV2ZWwgYW5kIHRoZSB1bmNlcnRhaW50eSBvZiBpdHMgcmVsYXRpb25zaGlwIHdpdGggYm90aCB3b3JrYWhvbGlzbSBhbmQgc2xlZXAgZGlzdHVyYmFuY2VzLCAqKndlIGRvIG5vdCBpbmNsdWRlKiogaXQgYXMgYSBjb3ZhcmlhdGUgZm9yIHNsZWVwIGRpc3R1cmJhbmNlcy4NCmBgYHtyIH0NCiMgbnVtYmVyIG9mIGNhc2VzIGJ5IGNvdmFyaWF0ZSBsZXZlbA0Kc3VtbWFyeShjbGVhblNEJHRlbGVXb3JrKSAjIGN1cnJlbnRseSA0IGNhdGVnb3JpZXMNCmNsZWFuU0QkdGVsZVdvcmsgPC0gYXMuZmFjdG9yKGdzdWIoImJvdGgiLCJ0ZWxlV29yayIsZ3N1YigiZGF5T2ZmIiwidGVsZVdvcmsiLGNsZWFuU0QkdGVsZVdvcmspKSkgIyByZWNvZGluZyB0byAyIGNhdGVnb3JpZXMNCnN1bW1hcnkoY2xlYW5TRCR0ZWxlV29yaykNCg0KIyBtb2RlbCBjb21wYXJpc29uIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNEIH4gdGVsZVdvcmsgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiB2cyBnZW5kZXIgKyBkYWlseUhhc3NsZXNfZXZlDQptMiA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgdGVsZVdvcmsgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMikkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCmBgYA0KDQo8YnI+DQoNCiMjIyA0LjQuOC4gT3RoZXIgY292YXJpYXRlcw0KDQpJbiBhZGRpdGlvbiB0byB0aGUgcHJlLXJlZ2lzdGVyZWQgY292YXJpYXRlcywgd2UgY29uc2lkZXIgYSAqKmZ1cnRoZXIgbGV2ZWwtMiBjb3ZhcmlhdGUqKiB0aGF0IGluIHNlY3Rpb24gMy41IHNob3dlZCBzdWJzdGFudGlhbCB0cmVuZHMgaW4gYm90aCBzbGVlcCBkaXN0dXJiYW5jZXMgYW5kIHdvcmthaG9saXNtLCBhbmQgd2hvc2UgcG90ZW50aWFsIGluZmx1ZW5jZSBvbiBib3RoIHZhcmlhYmxlcyBjYW4gYmUgdGhlb3JldGljYWxseSBhcmd1ZWQsIG5hbWVseSBoYXZpbmcgKipjaGlsZHJlbioqIGBjaGlsZHJlbmAgb3IgbGl2aW5nIHdpdGggY2hpbGRyZW4gYGhvbWVfY2hpbGRgLiBJbmRlZWQsIHJlc3BvbmRlbnRzIHJlcG9ydGluZyB0byBsaXZlIHdpdGggdGhlaXIgY2hpbGRyZW4gcmVwb3J0ZWQgc2xpZ2h0bHkgaGlnaGVyIHNsZWVwIGRpc3R1cmJhbmNlcywgd2hlcmVhcyB0aG9zZSByZXBvcnRpbmcgdG8gaGF2ZSBjaGlsZHJlbiByZXBvcnRlZCBzbGlnaHRseSBsb3dlciB3b3JrYWhvbGlzbSAoc2VlIHNlY3Rpb24gMy41KS4gVGhlb3JldGljYWxseSwgaXQgaXMgcGxhdXNpYmxlIGFsdGhvdWdoIG5vdCBjb25zaXN0ZW50bHkgcmVwb3J0ZWQgYnkgcHJldmlvdXMgcmVzZWFyY2ggKHNlZSBbQ2xhcmsgZXQgYWwuLCAyMDE2XSgjcmVmKSkgdGhhdCB3b3JrYWhvbGlzbSBsZXZlbHMgYW5kIG92ZXJhbGwgaW52ZXN0bWVudCBpbiB0aGUgd29yayB2cy4gZmFtaWx5IGRvbWFpbiBhcmUgaW5mbHVlbmNlZCBieSBmYW1pbHkgbmVlZHMgYW5kIHByZXNlbmNlIG9mIGNoaWxkcmVuIGluIHRoZSBob3VzZWhvbGQuIE9uIHRoZSBvdGhlciBoYW5kLCBmYW1pbHkgbmVlZHMgYW5kIGxpdmluZyB3aXRoIGNoaWxkcmVuIGhhdmUgYmVlbiBzaG93biB0byBuZWdhdGl2ZWx5IGltcGFjdCBvbiBzbGVlcCBkaXN0dXJiYW5jZXMgKGUuZy4sIFtHYXkgZXQgYWwuLCAyMDA0MF0oI3JlZikpLiBUaHVzLCBib3RoIGBjaGlsZHJlbmAgYW5kIGBob21lX2NoaWxkYCBtaWdodCBiZSBhIGNvbW1vbiBleHRlcm5hbCB2YXJpYWJsZSBpbmZsdWVuY2luZyBib3RoIHdvcmthaG9saXNtIGFuZCBzbGVlcCBkaXN0dXJiYW5jZXMsIGFuZCB3ZSBjb25zaWRlciBpdCBhcyBhIGZ1cnRoZXIgcG90ZW50aWFsIGNvdmFyaWF0ZS4NCg0KQWx0aG91Z2ggYm90aCBgY2hpbGRyZW5gIGFuZCBgaG9tZV9jaGlsZGAgaGF2ZSBhbiBhY2NlcHRhYmx5IGJhbGFuY2VkIG51bWJlciBvZiBjYXNlcyBwZXIgbGV2ZWwsIG5vbmUgb2YgdGhlbSBpbXBsaWVzIHN0cm9uZ2VyIGV2aWRlbmNlIHRoYW4gdGhlIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscy4gVGh1cywgYWxzbyBpbiB0aGlzIGNhc2UsICoqd2UgZG8gbm90IGluY2x1ZGUqKiB0aGVzZSB0d28gdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgZm9yIHNsZWVwIGRpc3R1cmJhbmNlcy4NCmBgYHtyIH0NCiMgY2hpbGRyZW4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQojIG51bWJlciBvZiBjYXNlcyBieSBjb3ZhcmlhdGUgbGV2ZWwNCnN1bW1hcnkoY2xlYW5TRFshZHVwbGljYXRlZChjbGVhblNEJElEKSwiY2hpbGRyZW4iXSkgIyBjaGlsZHJlbjogTm8uIHBhcnRpY2lwYW50cw0Kc3VtbWFyeShjbGVhblNEJGNoaWxkcmVuKSAjIGNoaWxkcmVuOiBOby4gY2FzZXMNCg0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNEIH4gY2hpbGRyZW4gKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEuYmlzKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gbnVsbCBtb2RlbA0Kc3VtbWFyeShtMS5iaXMpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBob21lX2NoaWxkIHZzIG51bGwNCm0xLmJpcyA8LSBsbWVyKFNEIH4gaG9tZV9jaGlsZCArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBob21lX2NoaWxkLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0Kc3VtbWFyeShjbGVhblNEWyFkdXBsaWNhdGVkKGNsZWFuU0QkSUQpLCJob21lX2NoaWxkIl0pICMgaG9tZV9jaGlsZDogTm8uIHBhcnRpY2lwYW50cw0Kc3VtbWFyeShjbGVhblNEJGhvbWVfY2hpbGQpICMgaG9tZV9jaGlsZDogTm8uIGNhc2VzDQoNCiMgbW9kZWwgY29tcGFyaXNvbiBob21lX2NoaWxkIHZzIGdlbmRlcg0KbTIgPC0gbG1lcihTRCB+IGdlbmRlciArIGhvbWVfY2hpbGQgKyAoMXxJRCksZGF0YT1jbGVhblNEKQ0KV2VpZ2h0cyhBSUMobTAsbTEsbTIpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBwcmV2aW91cyBtb2RlbA0Kc3VtbWFyeShtMikkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA8IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGNoaWxkcmVuIHZzIGdlbmRlcg0KbTIgPC0gbG1lcihTRCB+IGdlbmRlciArIGNoaWxkcmVuICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xLG0yKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWwNCnN1bW1hcnkobTIpJGNvZWZmaWNpZW50cyAjIGNvZWZmaWNpZW50OiB8dHwgPCAyDQpgYGANCg0KPGJyPg0KDQojIyMgNC40LjkuIFRpbWUgdHJlbmRzDQoNCkFzIGEgZmluYWwsIG5vdCBwcmUtcmVnaXN0ZXJlZCwgY29udHJvbCwgd2UgaW5zcGVjdCB0aGUgKipsaW5lYXIgdGltZSB0cmVuZHMqKiBvZiB0aGUgb3V0Y29tZSB2YXJpYWJsZS4gVGhpcyBpcyBkb25lIGJ5IGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGBkYXlgcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHVkeSBhcyBhIGZ1cnRoZXIgY292YXJpYXRlLiBXZSBjYW4gc2VlIHRoYXQgdGhlIGluY2x1c2lvbiBvZiBgZGF5YCBkb2VzIG5vdCBpbXBseSBzdHJvbmdlciBldmlkZW5jZSB0aGFuIG1vcmUgcGFyc2ltb25pb3VzIG1vZGVscywgYWx0aG91Z2ggYSBuZWdhdGl2ZSB0aW1lIHRyZW5kICh8KnQqfCA+IDIpIGlzIGVzdGltYXRlZCBmb3Igc2xlZXAgZGlzdHVyYmFuY2VzLiBUaHVzLCB3ZSBjaG9zZSB0byAqKm5vdCBpbmNsdWRlKiogYGRheWAgYXMgYSBjb3ZhcmlhdGUgZm9yIHNsZWVwIGRpc3R1cmJhbmNlcy4NCmBgYHtyIH0NCiMgcGxvdHRpbmcgU0QgYnkgZGF5DQpib3hwbG90KFNEIH4gZGF5LGRhdGE9Y2xlYW5TRCkNCg0KIyBtb2RlbCBjb21wYXJpc29uIGRheSB2cyBudWxsDQptMS5iaXMgPC0gbG1lcihTRCB+IGRheSArICgxfElEKSxkYXRhPWNsZWFuU0QpDQpXZWlnaHRzKEFJQyhtMCxtMS5iaXMpKSAjIEFrYWlrZSB3ZWlnaHRzOiB3ZWFrZXIgZXZpZGVuY2UgdGhhbiBudWxsIG1vZGVsDQpzdW1tYXJ5KG0xLmJpcykkY29lZmZpY2llbnRzICMgY29lZmZpY2llbnQ6IHx0fCA+IDINCg0KIyBtb2RlbCBjb21wYXJpc29uIGRheSB2cyBnZW5kZXIgKyBkYWlseUhhc3NsZXNfZXZlDQptMiA8LSBsbWVyKFNEIH4gZ2VuZGVyICsgZGF5ICsgKDF8SUQpLGRhdGE9Y2xlYW5TRCkNCldlaWdodHMoQUlDKG0wLG0xLG0yKSkgIyBBa2Fpa2Ugd2VpZ2h0czogd2Vha2VyIGV2aWRlbmNlIHRoYW4gcHJldmlvdXMgbW9kZWxzDQpzdW1tYXJ5KG0yKSRjb2VmZmljaWVudHMgIyBjb2VmZmljaWVudDogfHR8ID4gMg0KYGBgDQoNCjxicj4NCg0KIyMgNC41LiBTdW1tYXJ5IG9mIHJlc3VsdHMNCg0KSGVyZSwgd2Ugc3VtbWFyaXplIHRoZSByZXN1bHRzIG9mIG91ciBjb3ZhcmlhdGUgc2VsZWN0aW9uIHByb2NlZHVyZToNCg0KLSBmb3IgYFNCUF9hZnRgIGFuZCBgREJQX2FmdGAsIHdlIHNlbGVjdGVkIGBnZW5kZXJgLCBgYWdlYCwgYW5kIGBCTUlgIGFzIGNvdmFyaWF0ZXM7DQoNCi0gZm9yIGBTQlBfZXZlYCBhbmQgYERCUF9ldmVgLCB3ZSBzZWxlY3RlZCBgZ2VuZGVyYCwgYGFnZWAsIGFuZCBgQk1JYCBhcyBjb3ZhcmlhdGVzOw0KDQotIGZvciBgRUVgLCB3ZSBzZWxlY3RlZCBgZ2VuZGVyYCBhcyBhIGNvdmFyaWF0ZTsNCg0KLSBmb3IgYFNEYCwgd2Ugc2VsZWN0ZWQgYGdlbmRlcmAgYXMgYSBjb3ZhcmlhdGUuIA0KDQo8YnI+DQoNCiMgNS4gRGF0YSBleHBvcnQNCg0KSGVyZSwgd2UgZXhwb3J0IHRoZSBmb3JtdWxhcyBvZiB0aGUgbW9kZWxzIGluY2x1ZGluZyB0aGUgY292YXJpYXRlcyBzZWxlY3RlZCBmb3IgZWFjaCByZXNwb25zZSB2YXJpYWJsZSAoc2VlIHNlY3Rpb24gNCkuDQpgYGB7ciB9DQojIHNwZWNpZnlpbmcgbW9kZWwgZm9ybXVsYXMNCm1mb3JtdWxhcyA8LSBjKCJTQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JIiwNCiAgICAgICAgICAgICAgICJEQlBfYWZ0IH4gZ2VuZGVyICsgYWdlICsgQk1JIiwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIlNCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkiLA0KICAgICAgICAgICAgICAgIkRCUF9ldmUgfiBnZW5kZXIgKyBhZ2UgKyBCTUkiLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAiRUUgfiBnZW5kZXIiLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAiU0QgfiBnZW5kZXIiKQ0KDQojIGV4cG9ydGluZyBtb2RlbCBmb3JtdWxhDQpzYXZlKG1mb3JtdWxhcyxmaWxlPSJEQVRJL21mb3JtdWxhcy5SRGF0YSIpDQpgYGANCg0KPGJyPg0KDQojIDYuIE91dHB1dHMNCg0KRmluYWxseSwgd2UgZ2VuZXJhdGUgYW5kIGV4cG9ydCB0aGUgb3V0cHV0cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWFudXNjcmlwdCwgbmFtZWx5IHRoZSB0YWJsZSB3aXRoIHRoZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIGFuZCBjb3JyZWxhdGlvbnMgdGhhdCBvbmx5IGluY2x1ZGVzIHRoZSBmb2N1c2VkIHZhcmlhYmxlcyBhbmQgdGhlIHNlbGVjdGVkIGNvdmFyaWF0ZXMuDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQojIHNlbGVjdGluZyBsZXZlbC0xIHF1YW50aXRhdGl2ZSB2YXJpYWJsZXMNCmx2MSA8LSBjKCJXSExTTSIsIlNCUF9hZnQiLCJEQlBfYWZ0IiwgIyBhZnRlcm5vb24NCiAgICAgICAgICJTQlBfZXZlIiwiREJQX2V2ZSIsIkVFIiwiUEQiLCAjIGV2ZW5pbmcNCiAgICAgICAgICJTRCIpICMgbmV4dCBtb3JuaW5nDQpsdjIgPC0gYygiYWdlIiwiQk1JIikNCg0KIyBjb21wdXRpbmcgZGVzY3JpcHRpdmVzDQp0YWIxIDwtIGNiaW5kKG11bHRpZGVzYyhsb25nPWNsZWFuLHdpZGU9cHJlbHFzLGx2MT1sdjEsbHYyPWx2MiksDQogICAgICAgICAgICAgIG11bHRpY29ycihsb25nPWNsZWFuLHdpZGU9cHJlbHFzLGx2MT1sdjEsbHYyPWx2MixwdmFsdWU9VFJVRSxjb3JyZWN0aW9uPSJCSCIpKQ0Kd3JpdGUuY3N2KHRhYjEsIlJFU1VMVFMvVGFibGUxLmNzdiIscm93Lm5hbWVzPUZBTFNFKQ0Ka2FibGUodGFiMSkNCmBgYA0KDQo8YnI+DQoNCiMgUmVmZXJlbmNlcyB7I3JlZn0NCg0KLSBBYmRlbCBIYWRpLCBTLiwgQmFra2VyLCBBLiBCLiwgJiBIw6R1c3NlciwgSi4gQS4gKDIwMjEpLiBUaGUgcm9sZSBvZiBsZWlzdXJlIGNyYWZ0aW5nIGZvciBlbW90aW9uYWwgZXhoYXVzdGlvbiBpbiB0ZWxld29yayBkdXJpbmcgdGhlIENPVklELTE5IHBhbmRlbWljLiAqQW54aWV0eSwgU3RyZXNzLCAmIENvcGluZywgMzQqKDUpLCA1MzAtNTQ0LiBodHRwczovL2RvaS5vcmcvMTAuMTA4MC8xMDYxNTgwNi4yMDIxLjE5MDM0NDcNCg0KLSBCYWxkdWNjaSwgQy4sIEF2YW56aSwgTC4sICYgRnJhY2Nhcm9saSwgRi4gKDIwMTgpLiBUaGUgSW5kaXZpZHVhbCDigJxDb3N0c+KAnSBvZiBXb3JrYWhvbGlzbTogQW4gQW5hbHlzaXMgQmFzZWQgb24gTXVsdGlzb3VyY2UgYW5kIFByb3NwZWN0aXZlIERhdGEuICpKb3VybmFsIG9mIE1hbmFnZW1lbnQsIDQ0Kig3KSwgMjk2MeKAkzI5ODYuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTc3LzAxNDkyMDYzMTY2NTgzNDgNCg0KLSBCcmV3ZXIsIEUuIFcuLCAmIFNoYXBhcmQsIEwuICgyMDA0KS4gRW1wbG95ZWUgYnVybm91dDogQSBtZXRhLWFuYWx5c2lzIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhZ2Ugb3IgeWVhcnMgb2YgZXhwZXJpZW5jZS4gKkh1bWFuIHJlc291cmNlIGRldmVsb3BtZW50IHJldmlldywgMyooMiksIDEwMi0xMjMuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTc3LzE1MzQ0ODQzMDQyNjMzMzUNCg0KLSBDbGFyaywgTS4gQS4sIEh1bnRlciwgRS4gTS4sICYgQ2FybHNvbiwgRC4gUy4gKDIwMjEpLiBIaWRkZW4gY29zdHMgb2YgYW50aWNpcGF0ZWQgd29ya2xvYWQgZm9yIGluZGl2aWR1YWxzIGFuZCBwYXJ0bmVyczogRXhwbG9yaW5nIHRoZSByb2xlIG9mIGRhaWx5IGZsdWN0dWF0aW9ucyBpbiB3b3JrYWhvbGlzbS4gKkpvdXJuYWwgb2YgT2NjdXBhdGlvbmFsIEhlYWx0aCBQc3ljaG9sb2d5LCAyNiooNSksIDM5M+KAkzQwNC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMzcvb2NwMDAwMDI4NA0KDQotIENsYXJrLCBNLiBBLiwgTWljaGVsLCBKLiBTLiwgWmhkYW5vdmEsIEwuLCBQdWksIFMuIFkuLCAmIEJhbHRlcywgQi4gQi4gKDIwMTYpLiBBbGwgV29yayBhbmQgTm8gUGxheT8gQSBNZXRhLUFuYWx5dGljIEV4YW1pbmF0aW9uIG9mIHRoZSBDb3JyZWxhdGVzIGFuZCBPdXRjb21lcyBvZiBXb3JrYWhvbGlzbS4gKkpvdXJuYWwgb2YgTWFuYWdlbWVudCwgNDIqKDcpLCAxODM24oCTMTg3My4gaHR0cHM6Ly9kb2kub3JnLzEwLjExNzcvMDE0OTIwNjMxNDUyMjMwMQ0KDQotIERhaGwsIFIuIEUuLCAmIEVsLVNoZWlraCwgTS4gKDIwMDcpLiBDb25zaWRlcmluZyBzbGVlcCBpbiBhIGZhbWlseSBjb250ZXh0OiBpbnRyb2R1Y3Rpb24gdG8gdGhlIHNwZWNpYWwgaXNzdWUuICpKb3VybmFsIG9mIEZhbWlseSBQc3ljaG9sb2d5LCAyMSooMSksIDEuIGh0dHBzOi8vcHN5Y25ldC5hcGEub3JnL2RvaS8xMC4xMDM3LzA4OTMtMzIwMC4yMS4xLjENCg0KLSBGbG95ZCwgSi4gQS4sIE1lZGxlciwgUy4gTS4sIEFnZXIsIEouIFcuLCAmIEphbmlzc2UsIEouIEouICgyMDAwKS4gQWdl4oCQcmVsYXRlZCBjaGFuZ2VzIGluIGluaXRpYXRpb24gYW5kIG1haW50ZW5hbmNlIG9mIHNsZWVwOiBhIG1ldGHigJBhbmFseXNpcy4gKlJlc2VhcmNoIGluIG51cnNpbmcgJiBoZWFsdGgsIDIzKigyKSwgMTA2LTExNy4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvKFNJQ0kpMTA5OC0yNDBYKDIwMDAwNCkyMzoyJTNDMTA2OjpBSUQtTlVSMyUzRTMuMC5DTzsyLUENCg0KLSBHYXksIEMuIEwuLCBMZWUsIEsuIEEuLCAmIExlZSwgUy4gWS4gKDIwMDQpLiBTbGVlcCBwYXR0ZXJucyBhbmQgZmF0aWd1ZSBpbiBuZXcgbW90aGVycyBhbmQgZmF0aGVycy4gKkJpb2xvZ2ljYWwgcmVzZWFyY2ggZm9yIG51cnNpbmcsIDUqKDQpLCAzMTEtMzE4LiBodHRwczovL2RvaS5vcmcvMTAuMTE3Ny8xMDk5ODAwNDAzMjYyMTQyDQoNCi0gR3JlZ2csIEUuIFcuLCBDaGVuZywgWS4gSi4sIENhZHdlbGwsIEIuIEwuLCBJbXBlcmF0b3JlLCBHLiwgV2lsbGlhbXMsIEQuIEUuLCBGbGVnYWwsIEsuIE0uLCAuLi4gJiBXaWxsaWFtc29uLCBELiBGLiAoMjAwNSkuIFNlY3VsYXIgdHJlbmRzIGluIGNhcmRpb3Zhc2N1bGFyIGRpc2Vhc2UgcmlzayBmYWN0b3JzIGFjY29yZGluZyB0byBib2R5IG1hc3MgaW5kZXggaW4gVVMgYWR1bHRzLiAqSmFtYSwgMjkzKigxNSksIDE4NjgtMTg3NC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDEvamFtYS4yOTMuMTUuMTg2OA0KDQotIEtsdXNtYW5uLCBVLiwgQWxkcnVwLCBLLiwgU2NobWlkdCwgSi4sICYgTMO8ZHRrZSwgTy4gKDIwMjEpLiBJcyBlbW90aW9uYWwgZXhoYXVzdGlvbiBvbmx5IHRoZSByZXN1bHQgb2Ygd29yayBleHBlcmllbmNlcz8gQSBkaWFyeSBzdHVkeSBvbiBkYWlseSBoYXNzbGVzIGFuZCB1cGxpZnRzIGluIGRpZmZlcmVudCBsaWZlIGRvbWFpbnMuICpBbnhpZXR5LCBTdHJlc3MsICYgQ29waW5nLCAzNCooMiksIDE3My0xOTAuDQoNCi0gTGFuZHNiZXJnaXMsIFAuIEEuLCBEb2Jzb24sIE0uLCBLb3V0c291cmFzLCBHLiwgJiBTY2huYWxsLCBQLiAoMjAxMykuIEpvYiBzdHJhaW4gYW5kIGFtYnVsYXRvcnkgYmxvb2QgcHJlc3N1cmU6IGEgbWV0YS1hbmFseXNpcyBhbmQgc3lzdGVtYXRpYyByZXZpZXcuICpBbWVyaWNhbiBqb3VybmFsIG9mIHB1YmxpYyBoZWFsdGgsIDEwMyooMyksIGU2MS1lNzEuIGh0dHBzOi8vZG9pLm9yZy8xMC4yMTA1L0FKUEguMjAxMi4zMDExNTMNCg0KLSBNY1F1aWxsYW4sIE0uIEUuLCBCYXRlcywgSi4gRS4sIFN0YXBsZXMsIEEuIEQuLCAmIERlYXRlci1EZWNrYXJkLCBLLiAoMjAyMikuIEEgMS15ZWFyIGxvbmdpdHVkaW5hbCBzdHVkeSBvZiB0aGUgc3RyZXNzLCBzbGVlcCwgYW5kIHBhcmVudGluZyBvZiBtb3RoZXJzIG9mIHRvZGRsZXJzLiAqU2xlZXAgSGVhbHRoLCA4KigxKSwgNDctNTMuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2ouc2xlaC4yMDIxLjA4LjAwNg0KDQotIE55a2zDrcSNZWssIEkuLCBWaW5nZXJob2V0cywgQS4gSi4sICYgVmFuIEhlY2ssIEcuIEwuICgxOTk5KS4gRWxldmF0ZWQgYmxvb2QgcHJlc3N1cmUgYW5kIHNlbGYtcmVwb3J0ZWQgc3ltcHRvbSBjb21wbGFpbnRzLCBkYWlseSBoYXNzbGVzLCBhbmQgZGVmZW5zaXZlbmVzcy4gKkludGVybmF0aW9uYWwgam91cm5hbCBvZiBiZWhhdmlvcmFsIG1lZGljaW5lLCA2KiwgMTc3LTE4OS4gaHR0cHM6Ly9kb2kub3JnLzEwLjEyMDcvczE1MzI3NTU4aWpibTA2MDJfNQ0KDQotIFB1cnZhbm92YSwgUi4gSy4sICYgTXVyb3MsIEouIFAuICgyMDEwKS4gR2VuZGVyIGRpZmZlcmVuY2VzIGluIGJ1cm5vdXQ6IEEgbWV0YS1hbmFseXNpcy4gKkpvdXJuYWwgb2Ygdm9jYXRpb25hbCBiZWhhdmlvciwgNzcqKDIpLCAxNjgtMTg1LiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmp2Yi4yMDEwLjA0LjAwNg0KDQotIFNhbmRiZXJnLCBLLiwgJiBKaSwgSC4gKDIwMTIpLiBTZXggZGlmZmVyZW5jZXMgaW4gcHJpbWFyeSBoeXBlcnRlbnNpb24uICpCaW9sb2d5IG9mIHNleCBkaWZmZXJlbmNlcywgMyooMSksIDEtMjEuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2LzIwNDItNjQxMC0zLTcNCg0KLSBTZWlkbGVyLCBBLiwgVGhpbnNjaG1pZHQsIE0uLCBEZWNrZXJ0LCBTLiwgVGhlbiwgRi4sIEhlZ2V3YWxkLCBKLiwgTmlldXdlbmh1aWpzZW4sIEsuLCAmIFJpZWRlbC1IZWxsZXIsIFMuIEcuICgyMDE0KS4gVGhlIHJvbGUgb2YgcHN5Y2hvc29jaWFsIHdvcmtpbmcgY29uZGl0aW9ucyBvbiBidXJub3V0IGFuZCBpdHMgY29yZSBjb21wb25lbnQgZW1vdGlvbmFsIGV4aGF1c3Rpb27igJNhIHN5c3RlbWF0aWMgcmV2aWV3LiAqSm91cm5hbCBvZiBvY2N1cGF0aW9uYWwgbWVkaWNpbmUgYW5kIHRveGljb2xvZ3ksIDkqKDEpLCAxLTEzLg0KDQotIFNwZWN0b3IsIFAuIEUuICgyMDIxKS4gTWFzdGVyaW5nIHRoZSB1c2Ugb2YgY29udHJvbCB2YXJpYWJsZXM6IFRoZSBoaWVyYXJjaGljYWwgaXRlcmF0aXZlIGNvbnRyb2wgKEhJQykgYXBwcm9hY2guICpKb3VybmFsIG9mIEJ1c2luZXNzIGFuZCBQc3ljaG9sb2d5LCAzNiooNSksIDczNy03NTAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDA3L3MxMDg2OS0wMjAtMDk3MDktMA0KDQotIFZpcnRhbmVuLCBNLiwgRmVycmllLCBKLiBFLiwgR2ltZW5vLCBELiwgVmFodGVyYSwgSi4sIEVsb3ZhaW5pbywgTS4sIFNpbmdoLU1hbm91eCwgQS4sIC4uLiAmIEtpdmltw6RraSwgTS4gKDIwMDkpLiBMb25nIHdvcmtpbmcgaG91cnMgYW5kIHNsZWVwIGRpc3R1cmJhbmNlczogdGhlIFdoaXRlaGFsbCBJSSBwcm9zcGVjdGl2ZSBjb2hvcnQgc3R1ZHkuICpTbGVlcCwgMzIqKDYpLCA3MzctNzQ1LiBodHRwczovL2RvaS5vcmcvMTAuMTA5My9zbGVlcC8zMi42LjczNw0KDQotIFZpcnRhbmVuLCBNLiwgSGVpa2tpbMOkLCBLLiwgSm9rZWxhLCBNLiwgRmVycmllLCBKLiBFLiwgQmF0dHksIEcuIEQuLCBWYWh0ZXJhLCBKLiwgJiBLaXZpbcOka2ksIE0uICgyMDEyKS4gTG9uZyB3b3JraW5nIGhvdXJzIGFuZCBjb3JvbmFyeSBoZWFydCBkaXNlYXNlOiBhIHN5c3RlbWF0aWMgcmV2aWV3IGFuZCBtZXRhLWFuYWx5c2lzLiAqQW1lcmljYW4gam91cm5hbCBvZiBlcGlkZW1pb2xvZ3ksIDE3NiooNyksIDU4Ni01OTYuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDkzL2FqZS9rd3MxMzkNCg0KLSBaZW5nLCBMLiBOLiwgWm9uZywgUS4gUS4sIFlhbmcsIFkuLCBaaGFuZywgTC4sIFhpYW5nLCBZLiBGLiwgTmcsIEMuIEguLCAuLi4gJiBYaWFuZywgWS4gVC4gKDIwMjApLiBHZW5kZXIgZGlmZmVyZW5jZSBpbiB0aGUgcHJldmFsZW5jZSBvZiBpbnNvbW5pYTogYSBtZXRhLWFuYWx5c2lzIG9mIG9ic2VydmF0aW9uYWwgc3R1ZGllcy4gKkZyb250aWVycyBpbiBQc3ljaGlhdHJ5LCAxMSosIDU3NzQyOS4gaHR0cHM6Ly9kb2kub3JnLzEwLjMzODkvZnBzeXQuMjAyMC41Nzc0MjkNCg0KPGJyPg0KDQojIyBSIHBhY2thZ2Vz