• 1 Getting started
    • 1.1 clean up
    • 1.2 general custom functions
    • 1.3 necessary packages
  • 2 Download data
  • 3 Import data
  • 4 tie_maintenance.RDa
    • 4.1 wave 1 –> wave 2 (maintained vs dropped)
    • 4.2 wave 2 created
    • 4.3 wave 2 –> wave 3
  • 5 networkdata.RDa
  • References

The following scripts can be used to replicate the data-set of Franken, Bekhuis, and Tolsma (2024). It may also be obtained by downloading: Download networkdata.RDa



1 Getting started

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

1.1 clean up

rm(list = ls())
gc()


1.2 general custom functions

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

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

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

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


1.3 necessary packages

  • dplyr: package for data wrangling
  • lubridate: parse and manipulate dates
  • stringr: string manipulation
packages = c("dplyr", "lubridate", "stringr")
fpackage.check(packages)
rm(packages)


2 Download data

Anonymized data-sets of the ‘Sports and Friendships’ study are deposited in DANS Data Station SSH (Franken, Bekhuis, and Tolsma 2023). For this study we use waves 3-5 (Cohort II):

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

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


To see the code used to anonymize the raw data files, see: https://netchange.netlify.app/prep.

3 Import data

Load the downloaded data. First, we clean our environment (but we keep our functions; we need them later on).

# clean environment, but keep functions
rm(list = setdiff(ls(), lsf.str()))

# load public data
data3 <- fload("./data/wave3_public.RDa")
data4 <- fload("./data/wave4_public.RDa")
data5 <- fload("./data/wave5_public.RDa")



4 tie_maintenance.RDa

In the following script, I construct a long data-frame (based on Cohort II, waves 1-2-3), with alters nested in egos, to investigate which alters are maintained in the personal networks of ego over the academic year. To each ego, relevant individual-level, contextual-level, and network-level attributes are assigned; to each alter, relevant alter and dyadic features are assigned. The data-set is saved.

4.1 wave 1 –> wave 2 (maintained vs dropped)

# subset respondents that filled out both surveys w1 and w2;
# by matching on `respnr`
data <- data3[which(data3$respnr %in% unique(data4$respnr)),]
row.names(data) <- 1:nrow(data)
nrow(data) #N=516

# make a dataframe of w1-alters, with potential duplicates...
# recall that all alter names were replaced with a unique anonymized alter-id
df_names <- data.frame(
  p1 = data$egonet1.SQ001.,
  p2 = data$egonet1.SQ002.,
  p3 = data$egonet1.SQ003.,
  p4 = data$egonet1.SQ004.,
  p5 = data$egonet1.SQ005.,
  p6 = data$egonet2.SQ001.,
  p7 = data$egonet2.SQ002.,
  p8 = data$egonet2.SQ003.,
  p9 = data$egonet2.SQ004.,
  p10= data$egonet2.SQ005.,
  p11= data$egonet3.SQ001.,
  p12= data$egonet3.SQ002.,
  p13= data$egonet3.SQ003.,
  p14= data$egonet3.SQ004.,
  p15= data$egonet3.SQ005.,
  p16= data$egonet4.SQ001.,
  p17= data$egonet4.SQ002.,
  p18= data$egonet4.SQ003.,
  p19= data$egonet4.SQ004.,
  p20= data$egonet4.SQ005.)

#"pre-allocate" empty list of length equals number of egos
alterL <- vector("list", nrow(df_names))

# loop over all egos
for ( i in 1:length(alterL)) {
    alterL[[i]] <- data.frame(
      ego_gender = NA, ego_age = NA, ego_educ = NA,
      alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA,
      alter_gender = NA, alter_age = NA, alter_educ=NA,
      same_gender = NA, dif_age = NA, sim_educ = NA,
      cdn_embed.t1 = NA, study_embed.t1 = NA, bff_embed.t1 = NA, csn_embed.t1 = NA)
}

# fill the names based on the names data-frame and replace empty strings with <NA>
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=FALSE)
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
}

# a matching matrix allowed ego to match names that referred to the same person.
# in limesurvey, i could not let the number of columns condition
# on the number of alters named in the latest egonet, so i made 5 separate matrices,
# conditional on netsize.
# i calculate netsize for each net
{
  net1 <- cbind(data$egonet1.SQ001.,data$egonet1.SQ002., data$egonet1.SQ003.,data$egonet1.SQ004., data$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data$egonet2.SQ001.,data$egonet2.SQ002., data$egonet2.SQ003.,data$egonet2.SQ004., data$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data$egonet3.SQ001.,data$egonet3.SQ002., data$egonet3.SQ003.,data$egonet3.SQ004., data$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data$egonet4.SQ001.,data$egonet4.SQ002., data$egonet4.SQ003.,data$egonet4.SQ004., data$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

# i construct the matching matrices, 1 - 5 (conditional on the ns of the latest net)
# put these in a list and list these again, for each respondent (so a list of lists...)
matchingList <- list()
for (i in 1:length(alterL)) { # for ego i
  matchingL <- list()
  # make 5 seperate matching matrices. naturally, only 1 is relevant... but i will select that later.
  matchingL[[1]] <- cbind(data$matching1N1.SQ001_SQ001.[i],data$matching1N1.SQ002_SQ001.[i],data$matching1N1.SQ003_SQ001.[i],data$matching1N1.SQ004_SQ001.[i],data$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data$matching1N2.SQ001_SQ001.[i], data$matching1N2.SQ002_SQ001.[i], data$matching1N2.SQ003_SQ001.[i], data$matching1N2.SQ004_SQ001.[i], data$matching1N2.SQ005_SQ001.[i]),
    cbind(data$matching1N2.SQ001_SQ002.[i], data$matching1N2.SQ002_SQ002.[i], data$matching1N2.SQ003_SQ002.[i], data$matching1N2.SQ004_SQ002.[i], data$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data$matching1N3.SQ001_SQ001.[i], data$matching1N3.SQ002_SQ001.[i], data$matching1N3.SQ003_SQ001.[i], data$matching1N3.SQ004_SQ001.[i], data$matching1N3.SQ005_SQ001.[i]),
    cbind(data$matching1N3.SQ001_SQ002.[i], data$matching1N3.SQ002_SQ002.[i], data$matching1N3.SQ003_SQ002.[i], data$matching1N3.SQ004_SQ002.[i], data$matching1N3.SQ005_SQ002.[i]),
    cbind(data$matching1N3.SQ001_SQ003.[i], data$matching1N3.SQ002_SQ003.[i], data$matching1N3.SQ003_SQ003.[i], data$matching1N3.SQ004_SQ003.[i], data$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data$matching1N4.SQ001_SQ001.[i], data$matching1N4.SQ002_SQ001.[i], data$matching1N4.SQ003_SQ001.[i], data$matching1N4.SQ004_SQ001.[i], data$matching1N4.SQ005_SQ001.[i]),
    cbind(data$matching1N4.SQ001_SQ002.[i], data$matching1N4.SQ002_SQ002.[i], data$matching1N4.SQ003_SQ002.[i], data$matching1N4.SQ004_SQ002.[i], data$matching1N4.SQ005_SQ002.[i]),
    cbind(data$matching1N4.SQ001_SQ003.[i], data$matching1N4.SQ002_SQ003.[i], data$matching1N4.SQ003_SQ003.[i], data$matching1N4.SQ004_SQ003.[i], data$matching1N4.SQ005_SQ003.[i]),
    cbind(data$matching1N4.SQ001_SQ004.[i], data$matching1N4.SQ002_SQ004.[i], data$matching1N4.SQ003_SQ004.[i], data$matching1N4.SQ004_SQ004.[i], data$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data$matching1N5.SQ001_SQ001.[i], data$matching1N5.SQ002_SQ001.[i], data$matching1N5.SQ003_SQ001.[i], data$matching1N5.SQ004_SQ001.[i], data$matching1N5.SQ005_SQ001.[i]),
    cbind(data$matching1N5.SQ001_SQ002.[i], data$matching1N5.SQ002_SQ002.[i], data$matching1N5.SQ003_SQ002.[i], data$matching1N5.SQ004_SQ002.[i], data$matching1N5.SQ005_SQ002.[i]),
    cbind(data$matching1N5.SQ001_SQ003.[i], data$matching1N5.SQ002_SQ003.[i], data$matching1N5.SQ003_SQ003.[i], data$matching1N5.SQ004_SQ003.[i], data$matching1N5.SQ005_SQ003.[i]),
    cbind(data$matching1N5.SQ001_SQ004.[i], data$matching1N5.SQ002_SQ004.[i], data$matching1N5.SQ003_SQ004.[i], data$matching1N5.SQ004_SQ004.[i], data$matching1N5.SQ005_SQ004.[i]),
    cbind(data$matching1N5.SQ001_SQ005.[i], data$matching1N5.SQ002_SQ005.[i], data$matching1N5.SQ003_SQ005.[i], data$matching1N5.SQ004_SQ005.[i], data$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
} # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
} #ignore warning

#repeat for the second matching matrices
# (i.e., matching egonet3 alters to prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data$matching2N1.SQ001_SQ001.[i],data$matching2N1.SQ002_SQ001.[i],data$matching2N1.SQ003_SQ001.[i],data$matching2N1.SQ004_SQ001.[i],data$matching2N1.SQ005_SQ001.[i],data$matching2N1.SQ006_SQ001.[i],data$matching2N1.SQ007_SQ001.[i],data$matching2N1.SQ008_SQ001.[i],data$matching2N1.SQ009_SQ001.[i],data$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data$matching2N2.SQ001_SQ001.[i],data$matching2N2.SQ002_SQ001.[i],data$matching2N2.SQ003_SQ001.[i],data$matching2N2.SQ004_SQ001.[i],data$matching2N2.SQ005_SQ001.[i],data$matching2N2.SQ006_SQ001.[i],data$matching2N2.SQ007_SQ001.[i],data$matching2N2.SQ008_SQ001.[i],data$matching2N2.SQ009_SQ001.[i],data$matching2N2.SQ010_SQ001.[i]),
    cbind(data$matching2N2.SQ001_SQ002.[i],data$matching2N2.SQ002_SQ002.[i],data$matching2N2.SQ003_SQ002.[i],data$matching2N2.SQ004_SQ002.[i],data$matching2N2.SQ005_SQ002.[i],data$matching2N2.SQ006_SQ002.[i],data$matching2N2.SQ007_SQ002.[i],data$matching2N2.SQ008_SQ002.[i],data$matching2N2.SQ009_SQ002.[i],data$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data$matching2N3.SQ001_SQ001.[i],data$matching2N3.SQ002_SQ001.[i],data$matching2N3.SQ003_SQ001.[i],data$matching2N3.SQ004_SQ001.[i],data$matching2N3.SQ005_SQ001.[i],data$matching2N3.SQ006_SQ001.[i],data$matching2N3.SQ007_SQ001.[i],data$matching2N3.SQ008_SQ001.[i],data$matching2N3.SQ009_SQ001.[i],data$matching2N3.SQ010_SQ001.[i]),
    cbind(data$matching2N3.SQ001_SQ002.[i],data$matching2N3.SQ002_SQ002.[i],data$matching2N3.SQ003_SQ002.[i],data$matching2N3.SQ004_SQ002.[i],data$matching2N3.SQ005_SQ002.[i],data$matching2N3.SQ006_SQ002.[i],data$matching2N3.SQ007_SQ002.[i],data$matching2N3.SQ008_SQ002.[i],data$matching2N3.SQ009_SQ002.[i],data$matching2N3.SQ010_SQ002.[i]),
    cbind(data$matching2N3.SQ001_SQ003.[i],data$matching2N3.SQ002_SQ003.[i],data$matching2N3.SQ003_SQ003.[i],data$matching2N3.SQ004_SQ003.[i],data$matching2N3.SQ005_SQ003.[i],data$matching2N3.SQ006_SQ003.[i],data$matching2N3.SQ007_SQ003.[i],data$matching2N3.SQ008_SQ003.[i],data$matching2N3.SQ009_SQ003.[i],data$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data$matching2N4.SQ001_SQ001.[i],data$matching2N4.SQ002_SQ001.[i],data$matching2N4.SQ003_SQ001.[i],data$matching2N4.SQ004_SQ001.[i],data$matching2N4.SQ005_SQ001.[i],data$matching2N4.SQ006_SQ001.[i],data$matching2N4.SQ007_SQ001.[i],data$matching2N4.SQ008_SQ001.[i],data$matching2N4.SQ009_SQ001.[i],data$matching2N4.SQ010_SQ001.[i]),
    cbind(data$matching2N4.SQ001_SQ002.[i],data$matching2N4.SQ002_SQ002.[i],data$matching2N4.SQ003_SQ002.[i],data$matching2N4.SQ004_SQ002.[i],data$matching2N4.SQ005_SQ002.[i],data$matching2N4.SQ006_SQ002.[i],data$matching2N4.SQ007_SQ002.[i],data$matching2N4.SQ008_SQ002.[i],data$matching2N4.SQ009_SQ002.[i],data$matching2N4.SQ010_SQ002.[i]),
    cbind(data$matching2N4.SQ001_SQ003.[i],data$matching2N4.SQ002_SQ003.[i],data$matching2N4.SQ003_SQ003.[i],data$matching2N4.SQ004_SQ003.[i],data$matching2N4.SQ005_SQ003.[i],data$matching2N4.SQ006_SQ003.[i],data$matching2N4.SQ007_SQ003.[i],data$matching2N4.SQ008_SQ003.[i],data$matching2N4.SQ009_SQ003.[i],data$matching2N4.SQ010_SQ003.[i]),
    cbind(data$matching2N4.SQ001_SQ004.[i],data$matching2N4.SQ002_SQ004.[i],data$matching2N4.SQ003_SQ004.[i],data$matching2N4.SQ004_SQ004.[i],data$matching2N4.SQ005_SQ004.[i],data$matching2N4.SQ006_SQ004.[i],data$matching2N4.SQ007_SQ004.[i],data$matching2N4.SQ008_SQ004.[i],data$matching2N4.SQ009_SQ004.[i],data$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data$matching2N5.SQ001_SQ001.[i],data$matching2N5.SQ002_SQ001.[i],data$matching2N5.SQ003_SQ001.[i],data$matching2N5.SQ004_SQ001.[i],data$matching2N5.SQ005_SQ001.[i],data$matching2N5.SQ006_SQ001.[i],data$matching2N5.SQ007_SQ001.[i],data$matching2N5.SQ008_SQ001.[i],data$matching2N5.SQ009_SQ001.[i],data$matching2N5.SQ010_SQ001.[i]),
    cbind(data$matching2N5.SQ001_SQ002.[i],data$matching2N5.SQ002_SQ002.[i],data$matching2N5.SQ003_SQ002.[i],data$matching2N5.SQ004_SQ002.[i],data$matching2N5.SQ005_SQ002.[i],data$matching2N5.SQ006_SQ002.[i],data$matching2N5.SQ007_SQ002.[i],data$matching2N5.SQ008_SQ002.[i],data$matching2N5.SQ009_SQ002.[i],data$matching2N5.SQ010_SQ002.[i]),
    cbind(data$matching2N5.SQ001_SQ003.[i],data$matching2N5.SQ002_SQ003.[i],data$matching2N5.SQ003_SQ003.[i],data$matching2N5.SQ004_SQ003.[i],data$matching2N5.SQ005_SQ003.[i],data$matching2N5.SQ006_SQ003.[i],data$matching2N5.SQ007_SQ003.[i],data$matching2N5.SQ008_SQ003.[i],data$matching2N5.SQ009_SQ003.[i],data$matching2N5.SQ010_SQ003.[i]),
    cbind(data$matching2N5.SQ001_SQ004.[i],data$matching2N5.SQ002_SQ004.[i],data$matching2N5.SQ003_SQ004.[i],data$matching2N5.SQ004_SQ004.[i],data$matching2N5.SQ005_SQ004.[i],data$matching2N5.SQ006_SQ004.[i],data$matching2N5.SQ007_SQ004.[i],data$matching2N5.SQ008_SQ004.[i],data$matching2N5.SQ009_SQ004.[i],data$matching2N5.SQ010_SQ004.[i]),
    cbind(data$matching2N5.SQ001_SQ005.[i],data$matching2N5.SQ002_SQ005.[i],data$matching2N5.SQ003_SQ005.[i],data$matching2N5.SQ004_SQ005.[i],data$matching2N5.SQ005_SQ005.[i],data$matching2N5.SQ006_SQ005.[i],data$matching2N5.SQ007_SQ005.[i],data$matching2N5.SQ008_SQ005.[i],data$matching2N5.SQ009_SQ005.[i],data$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

#and for matching matrix 3 (i.e., matching egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data$matching3N1.SQ001_SQ001.[i],data$matching3N1.SQ002_SQ001.[i],data$matching3N1.SQ003_SQ001.[i],data$matching3N1.SQ004_SQ001.[i],data$matching3N1.SQ005_SQ001.[i],data$matching3N1.SQ006_SQ001.[i],data$matching3N1.SQ007_SQ001.[i],data$matching3N1.SQ008_SQ001.[i],data$matching3N1.SQ009_SQ001.[i],data$matching3N1.SQ010_SQ001.[i], data$matching3N1.SQ011_SQ001.[i], data$matching3N1.SQ012_SQ001.[i], data$matching3N1.SQ013_SQ001.[i], data$matching3N1.SQ014_SQ001.[i], data$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data$matching3N2.SQ001_SQ001.[i],data$matching3N2.SQ002_SQ001.[i],data$matching3N2.SQ003_SQ001.[i],data$matching3N2.SQ004_SQ001.[i],data$matching3N2.SQ005_SQ001.[i],data$matching3N2.SQ006_SQ001.[i],data$matching3N2.SQ007_SQ001.[i],data$matching3N2.SQ008_SQ001.[i],data$matching3N2.SQ009_SQ001.[i],data$matching3N2.SQ010_SQ001.[i], data$matching3N2.SQ011_SQ001.[i], data$matching3N2.SQ012_SQ001.[i], data$matching3N2.SQ013_SQ001.[i], data$matching3N2.SQ014_SQ001.[i], data$matching3N2.SQ015_SQ001.[i]),
    cbind(data$matching3N2.SQ001_SQ002.[i],data$matching3N2.SQ002_SQ002.[i],data$matching3N2.SQ003_SQ002.[i],data$matching3N2.SQ004_SQ002.[i],data$matching3N2.SQ005_SQ002.[i],data$matching3N2.SQ006_SQ002.[i],data$matching3N2.SQ007_SQ002.[i],data$matching3N2.SQ008_SQ002.[i],data$matching3N2.SQ009_SQ002.[i],data$matching3N2.SQ010_SQ002.[i], data$matching3N2.SQ011_SQ002.[i], data$matching3N2.SQ012_SQ002.[i], data$matching3N2.SQ013_SQ002.[i], data$matching3N2.SQ014_SQ002.[i], data$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data$matching3N3.SQ001_SQ001.[i],data$matching3N3.SQ002_SQ001.[i],data$matching3N3.SQ003_SQ001.[i],data$matching3N3.SQ004_SQ001.[i],data$matching3N3.SQ005_SQ001.[i],data$matching3N3.SQ006_SQ001.[i],data$matching3N3.SQ007_SQ001.[i],data$matching3N3.SQ008_SQ001.[i],data$matching3N3.SQ009_SQ001.[i],data$matching3N3.SQ010_SQ001.[i], data$matching3N3.SQ011_SQ001.[i], data$matching3N3.SQ012_SQ001.[i], data$matching3N3.SQ013_SQ001.[i], data$matching3N3.SQ014_SQ001.[i], data$matching3N3.SQ015_SQ001.[i]),
    cbind(data$matching3N3.SQ001_SQ002.[i],data$matching3N3.SQ002_SQ002.[i],data$matching3N3.SQ003_SQ002.[i],data$matching3N3.SQ004_SQ002.[i],data$matching3N3.SQ005_SQ002.[i],data$matching3N3.SQ006_SQ002.[i],data$matching3N3.SQ007_SQ002.[i],data$matching3N3.SQ008_SQ002.[i],data$matching3N3.SQ009_SQ002.[i],data$matching3N3.SQ010_SQ002.[i], data$matching3N3.SQ011_SQ002.[i], data$matching3N3.SQ012_SQ002.[i], data$matching3N3.SQ013_SQ002.[i], data$matching3N3.SQ014_SQ002.[i], data$matching3N3.SQ015_SQ002.[i]),
    cbind(data$matching3N3.SQ001_SQ003.[i],data$matching3N3.SQ002_SQ003.[i],data$matching3N3.SQ003_SQ003.[i],data$matching3N3.SQ004_SQ003.[i],data$matching3N3.SQ005_SQ003.[i],data$matching3N3.SQ006_SQ003.[i],data$matching3N3.SQ007_SQ003.[i],data$matching3N3.SQ008_SQ003.[i],data$matching3N3.SQ009_SQ003.[i],data$matching3N3.SQ010_SQ003.[i], data$matching3N3.SQ011_SQ003.[i], data$matching3N3.SQ012_SQ003.[i], data$matching3N3.SQ013_SQ003.[i], data$matching3N3.SQ014_SQ003.[i], data$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data$matching3N4.SQ001_SQ001.[i],data$matching3N4.SQ002_SQ001.[i],data$matching3N4.SQ003_SQ001.[i],data$matching3N4.SQ004_SQ001.[i],data$matching3N4.SQ005_SQ001.[i],data$matching3N4.SQ006_SQ001.[i],data$matching3N4.SQ007_SQ001.[i],data$matching3N4.SQ008_SQ001.[i],data$matching3N4.SQ009_SQ001.[i],data$matching3N4.SQ010_SQ001.[i], data$matching3N4.SQ011_SQ001.[i], data$matching3N4.SQ012_SQ001.[i], data$matching3N4.SQ013_SQ001.[i], data$matching3N4.SQ014_SQ001.[i], data$matching3N4.SQ015_SQ001.[i]),
    cbind(data$matching3N4.SQ001_SQ002.[i],data$matching3N4.SQ002_SQ002.[i],data$matching3N4.SQ003_SQ002.[i],data$matching3N4.SQ004_SQ002.[i],data$matching3N4.SQ005_SQ002.[i],data$matching3N4.SQ006_SQ002.[i],data$matching3N4.SQ007_SQ002.[i],data$matching3N4.SQ008_SQ002.[i],data$matching3N4.SQ009_SQ002.[i],data$matching3N4.SQ010_SQ002.[i], data$matching3N4.SQ011_SQ002.[i], data$matching3N4.SQ012_SQ002.[i], data$matching3N4.SQ013_SQ002.[i], data$matching3N4.SQ014_SQ002.[i], data$matching3N4.SQ015_SQ002.[i]),
    cbind(data$matching3N4.SQ001_SQ003.[i],data$matching3N4.SQ002_SQ003.[i],data$matching3N4.SQ003_SQ003.[i],data$matching3N4.SQ004_SQ003.[i],data$matching3N4.SQ005_SQ003.[i],data$matching3N4.SQ006_SQ003.[i],data$matching3N4.SQ007_SQ003.[i],data$matching3N4.SQ008_SQ003.[i],data$matching3N4.SQ009_SQ003.[i],data$matching3N4.SQ010_SQ003.[i], data$matching3N4.SQ011_SQ003.[i], data$matching3N4.SQ012_SQ003.[i], data$matching3N4.SQ013_SQ003.[i], data$matching3N4.SQ014_SQ003.[i], data$matching3N4.SQ015_SQ003.[i]),
    cbind(data$matching3N4.SQ001_SQ003.[i],data$matching3N4.SQ002_SQ003.[i],data$matching3N4.SQ003_SQ003.[i],data$matching3N4.SQ004_SQ003.[i],data$matching3N4.SQ005_SQ003.[i],data$matching3N4.SQ006_SQ003.[i],data$matching3N4.SQ007_SQ003.[i],data$matching3N4.SQ008_SQ003.[i],data$matching3N4.SQ009_SQ003.[i],data$matching3N4.SQ010_SQ003.[i], data$matching3N4.SQ011_SQ003.[i], data$matching3N4.SQ012_SQ003.[i], data$matching3N4.SQ013_SQ003.[i], data$matching3N4.SQ014_SQ003.[i], data$matching3N4.SQ015_SQ003.[i]),
    cbind(data$matching3N4.SQ001_SQ004.[i],data$matching3N4.SQ002_SQ004.[i],data$matching3N4.SQ003_SQ004.[i],data$matching3N4.SQ004_SQ004.[i],data$matching3N4.SQ005_SQ004.[i],data$matching3N4.SQ006_SQ004.[i],data$matching3N4.SQ007_SQ004.[i],data$matching3N4.SQ008_SQ004.[i],data$matching3N4.SQ009_SQ004.[i],data$matching3N4.SQ010_SQ004.[i], data$matching3N4.SQ011_SQ004.[i], data$matching3N4.SQ012_SQ004.[i], data$matching3N4.SQ013_SQ004.[i], data$matching3N4.SQ014_SQ004.[i], data$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data$matching3N5.SQ001_SQ001.[i],data$matching3N5.SQ002_SQ001.[i],data$matching3N5.SQ003_SQ001.[i],data$matching3N5.SQ004_SQ001.[i],data$matching3N5.SQ005_SQ001.[i],data$matching3N5.SQ006_SQ001.[i],data$matching3N5.SQ007_SQ001.[i],data$matching3N5.SQ008_SQ001.[i],data$matching3N5.SQ009_SQ001.[i],data$matching3N5.SQ010_SQ001.[i], data$matching3N5.SQ011_SQ001.[i], data$matching3N5.SQ012_SQ001.[i], data$matching3N5.SQ013_SQ001.[i], data$matching3N5.SQ014_SQ001.[i], data$matching3N5.SQ015_SQ001.[i]),
    cbind(data$matching3N5.SQ001_SQ002.[i],data$matching3N5.SQ002_SQ002.[i],data$matching3N5.SQ003_SQ002.[i],data$matching3N5.SQ004_SQ002.[i],data$matching3N5.SQ005_SQ002.[i],data$matching3N5.SQ006_SQ002.[i],data$matching3N5.SQ007_SQ002.[i],data$matching3N5.SQ008_SQ002.[i],data$matching3N5.SQ009_SQ002.[i],data$matching3N5.SQ010_SQ002.[i], data$matching3N5.SQ011_SQ002.[i], data$matching3N5.SQ012_SQ002.[i], data$matching3N5.SQ013_SQ002.[i], data$matching3N5.SQ014_SQ002.[i], data$matching3N5.SQ015_SQ002.[i]),
    cbind(data$matching3N5.SQ001_SQ003.[i],data$matching3N5.SQ002_SQ003.[i],data$matching3N5.SQ003_SQ003.[i],data$matching3N5.SQ004_SQ003.[i],data$matching3N5.SQ005_SQ003.[i],data$matching3N5.SQ006_SQ003.[i],data$matching3N5.SQ007_SQ003.[i],data$matching3N5.SQ008_SQ003.[i],data$matching3N5.SQ009_SQ003.[i],data$matching3N5.SQ010_SQ003.[i], data$matching3N5.SQ011_SQ003.[i], data$matching3N5.SQ012_SQ003.[i], data$matching3N5.SQ013_SQ003.[i], data$matching3N5.SQ014_SQ003.[i], data$matching3N5.SQ015_SQ003.[i]),
    cbind(data$matching3N5.SQ001_SQ003.[i],data$matching3N5.SQ002_SQ003.[i],data$matching3N5.SQ003_SQ003.[i],data$matching3N5.SQ004_SQ003.[i],data$matching3N5.SQ005_SQ003.[i],data$matching3N5.SQ006_SQ003.[i],data$matching3N5.SQ007_SQ003.[i],data$matching3N5.SQ008_SQ003.[i],data$matching3N5.SQ009_SQ003.[i],data$matching3N5.SQ010_SQ003.[i], data$matching3N5.SQ011_SQ003.[i], data$matching3N5.SQ012_SQ003.[i], data$matching3N5.SQ013_SQ003.[i], data$matching3N5.SQ014_SQ003.[i], data$matching3N5.SQ015_SQ003.[i]),
    cbind(data$matching3N5.SQ001_SQ005.[i],data$matching3N5.SQ002_SQ005.[i],data$matching3N5.SQ003_SQ005.[i],data$matching3N5.SQ004_SQ005.[i],data$matching3N5.SQ005_SQ005.[i],data$matching3N5.SQ006_SQ005.[i],data$matching3N5.SQ007_SQ005.[i],data$matching3N5.SQ008_SQ005.[i],data$matching3N5.SQ009_SQ005.[i],data$matching3N5.SQ010_SQ005.[i], data$matching3N5.SQ011_SQ005.[i], data$matching3N5.SQ012_SQ005.[i], data$matching3N5.SQ013_SQ005.[i], data$matching3N5.SQ014_SQ005.[i], data$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#i also calculate structural embeddedness (alter-level) per ego-net.

#first i fix some irregularities in the data
#1. a mistake was made in labeling the adjacency matrix variables for the friends network, so i first relabel them, so the same script below for constructing density scores can be used.
#(I started with N1 instead of N2 (N denotes the number of named alters; which should start at 2, because only at netsizes > 1, I asked for alter-ties) )
data <- data %>%
  rename (adj3N2a.SQ001. = adj3N1a.SQ001., adj3N3a.SQ001. = adj3N2a.SQ001.,adj3N3a.SQ002. = adj3N2a.SQ002.,adj3N3b.SQ001. = adj3N2b.SQ001.,adj3N4a.SQ001. = adj3N3a.SQ001.,adj3N4a.SQ002. = adj3N3a.SQ002.,adj3N4a.SQ003. = adj3N3a.SQ003.,adj3N4b.SQ001. = adj3N3b.SQ001.,adj3N4b.SQ002. = adj3N3b.SQ002.,   adj3N4c.SQ001. = adj3N3c.SQ001.,adj3N5a.SQ001. = adj3N4a.SQ001.,adj3N5a.SQ002. = adj3N4a.SQ002.,adj3N5a.SQ003. = adj3N4a.SQ003.,adj3N5a.SQ004. = adj3N4a.SQ004.,adj3N5b.SQ001. = adj3N4b.SQ001.,adj3N5b.SQ002. = adj3N4b.SQ002.,adj3N5b.SQ003. = adj3N4b.SQ003.,adj3N5c.SQ001. = adj3N4c.SQ001.,adj3N5c.SQ002. = adj3N4c.SQ002.,adj3N5d.SQ001. = adj3N4d.SQ001.)

#2. a labeling mistake: for the adjacency matrix for sports ties, with ns=3, the question about relation between alter 2 and 3 was coded wrongly. 
data$adj4N3b.SQ001. <- data$adj4N3b.SQ002.
##

for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t1[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t1[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t1[11:(10+nnames_bff)] <- embed 
  }
  
  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t1[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
        
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t1))],
                                            alterL[[i]]$study_embed.t1[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t1))],
                                          alterL[[i]]$bff_embed.t1[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t1[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t1[which(alterL[[i]]$name1==alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t1))],     
                                          alterL[[i]]$csn_embed.t1[j] )
  }
}

# i use the name interpreter data to add (stable) alter characteristics (e.g., gender)
# in name-interpreter questions, only unique (i.e., non-matched) alters were listed... thus, alter ids without a gender assigned to them are non-uniques, and can later be filtered out.
df_gender <- data.frame(p1 = data$gender.SQ001.,p2 = data$gender.SQ002.,p3 = data$gender.SQ003.,p4 = data$gender.SQ004.,p5 = data$gender.SQ005.,p6 = data$gender.SQ006.,p7 = data$gender.SQ007.,p8 = data$gender.SQ008.,p9 = data$gender.SQ009.,p10= data$gender.SQ010.,p11= data$gender.SQ011.,p12= data$gender.SQ012.,p13= data$gender.SQ013.,p14= data$gender.SQ014.,p15= data$gender.SQ015.,p16= data$gender.SQ016.,p17= data$gender.SQ017.,p18= data$gender.SQ018.,p19= data$gender.SQ019.,p20= data$gender.SQ020.)

# same for age...
df_age <- data.frame(p1 = data$age.SQ001.,p2 = data$age.SQ002.,p3 = data$age.SQ003.,p4 = data$age.SQ004.,p5 = data$age.SQ005.,p6 = data$age.SQ006.,p7 = data$age.SQ007.,p8 = data$age.SQ008.,p9 = data$age.SQ009.,p10= data$age.SQ010.,p11= data$age.SQ011.,p12= data$age.SQ012.,p13= data$age.SQ013.,p14= data$age.SQ014.,p15= data$age.SQ015.,p16= data$age.SQ016.,p17= data$age.SQ017.,p18= data$age.SQ018.,p19= data$age.SQ019.,p20= data$age.SQ020.)

# kin
df_kin <- data.frame( p1 = data$kin.SQ001.,p2 = data$kin.SQ002.,p3 = data$kin.SQ003.,p4 = data$kin.SQ004.,p5 = data$kin.SQ005.,p6 = data$kin.SQ006.,p7 = data$kin.SQ007.,p8 = data$kin.SQ008.,p9 = data$kin.SQ009.,p10= data$kin.SQ010.,p11= data$kin.SQ011.,p12= data$kin.SQ012.,p13= data$kin.SQ013.,p14= data$kin.SQ014.,p15= data$kin.SQ015.,p16= data$kin.SQ016.,p17= data$kin.SQ017.,p18= data$kin.SQ018.,p19= data$kin.SQ019.,p20= data$kin.SQ020.)

#education
df_educ <- data.frame(p1 = data$educ.SQ001.,p2 = data$educ.SQ002.,p3 = data$educ.SQ003.,p4 = data$educ.SQ004.,p5 = data$educ.SQ005.,p6 = data$educ.SQ006.,p7 = data$educ.SQ007.,p8 = data$educ.SQ008., p9 = data$educ.SQ009.,p10= data$educ.SQ010., p11= data$educ.SQ011., p12= data$educ.SQ012., p13= data$educ.SQ013., p14= data$educ.SQ014., p15= data$educ.SQ015., p16= data$educ.SQ016., p17= data$educ.SQ017., p18= data$educ.SQ018., p19= data$educ.SQ019., p20= data$educ.SQ020.)

#also dynamic characteristics
#communication frequency
df_freq <- data.frame(p1 = data$freq.SQ001.,p2 = data$freq.SQ002.,p3 = data$freq.SQ003.,p4 = data$freq.SQ004.,p5 = data$freq.SQ005.,p6 = data$freq.SQ006.,p7 = data$freq.SQ007.,p8 = data$freq.SQ008., p9 = data$freq.SQ009.,p10= data$freq.SQ010., p11= data$freq.SQ011., p12= data$freq.SQ012., p13= data$freq.SQ013., p14= data$freq.SQ014., p15= data$freq.SQ015., p16= data$freq.SQ016., p17= data$freq.SQ017., p18= data$freq.SQ018., p19= data$freq.SQ019., p20= data$freq.SQ020.)

#closeness
df_close <- data.frame(p1 = data$close.SQ001.,p2 = data$close.SQ002.,p3 = data$close.SQ003.,p4 = data$close.SQ004.,p5 = data$close.SQ005.,p6 = data$close.SQ006.,p7 = data$close.SQ007.,p8 = data$close.SQ008., p9 = data$close.SQ009.,p10= data$close.SQ010., p11= data$close.SQ011., p12= data$close.SQ012., p13= data$close.SQ013., p14= data$close.SQ014., p15= data$close.SQ015., p16= data$close.SQ016., p17= data$close.SQ017., p18= data$close.SQ018., p19= data$close.SQ019., p20= data$close.SQ020.)

#and other dyadic featuers
# duration;
df_duration <- data.frame(p1 = data$duur.SQ001.,p2 = data$duur.SQ002.,p3 = data$duur.SQ003.,p4 = data$duur.SQ004.,p5 = data$duur.SQ005.,p6 = data$duur.SQ006.,p7 = data$duur.SQ007.,p8 = data$duur.SQ008., p9 = data$duur.SQ009.,p10= data$duur.SQ010., p11= data$duur.SQ011., p12= data$duur.SQ012., p13= data$duur.SQ013., p14= data$duur.SQ014., p15= data$duur.SQ015., p16= data$duur.SQ016., p17= data$duur.SQ017., p18= data$duur.SQ018., p19= data$duur.SQ019., p20= data$duur.SQ020.)

#geographical proximity
df_proximity <- data.frame(p1 = data$prox.SQ001.,p2 = data$prox.SQ002.,p3 = data$prox.SQ003.,p4 = data$prox.SQ004.,p5 = data$prox.SQ005.,p6 = data$prox.SQ006.,p7 = data$prox.SQ007.,p8 = data$prox.SQ008., p9 = data$prox.SQ009.,p10= data$prox.SQ010., p11= data$prox.SQ011., p12= data$prox.SQ012., p13= data$prox.SQ013., p14= data$prox.SQ014., p15= data$prox.SQ015., p16= data$prox.SQ016., p17= data$prox.SQ017., p18= data$prox.SQ018., p19= data$prox.SQ019., p20= data$prox.SQ020.)


for (i in 1:length(alterL)) {
  
  #gender
  alterL[[i]]$alter_gender <- 
    ifelse(unlist(df_gender[i,], use.names=F)=="Man", 0,  # male = ref.
           ifelse(unlist(df_gender[i,], use.names=F)=="Vrouw", 1,
                  ifelse(unlist(df_gender[i,], use.names=F)=="Anders", 2, "")))
  #kin  
  alterL[[i]]$kin <- 
    ifelse(unlist(df_kin[i,], use.names=F)=="Ja", 1,
           ifelse(unlist(df_kin[i,], use.names=F)=="Nee", 0, ""))
  #age  
  alterL[[i]]$alter_age <- 
    ifelse(unlist(df_age[i,], use.names=F)=="Jonger dan 18 jaar", 16, #???
           ifelse(unlist(df_age[i,], use.names=F)=="18 tot 21 jaar", 20,
                  ifelse(unlist(df_age[i,], use.names=F)=="22 tot 25 jaar", 23,
                         ifelse(unlist(df_age[i,], use.names=F)=="26 tot 30 jaar", 28,
                                ifelse(unlist(df_age[i,], use.names=F)=="31 tot 40 jaar", 35,
                                       ifelse(unlist(df_age[i,], use.names=F)=="Ouder dan 40 jaar", 45, #???
                                              ifelse(unlist(df_age[i,], use.names=F)=="Weet ik niet", NA, # i don't know = missing
                                                     unlist(df_age[i,], use.names=F))))))))
  #education
  alterL[[i]]$alter_educ <- ifelse(unlist(df_educ[i,],use.names=F)=="lagere school", 1,
                               ifelse(unlist(df_educ[i,],use.names=F)=="vmbo, mavo", 2,
                                      ifelse(unlist(df_educ[i,],use.names=F)=="mbo", 3,
                                         ifelse(unlist(df_educ[i,],use.names=F)=="havo", 4,
                                            ifelse(unlist(df_educ[i,],use.names=F)=="vwo / gymnasium", 5,
                                                 ifelse(unlist(df_educ[i,],use.names=F)=="hbo", 6,
                                                     ifelse(unlist(df_educ[i,],use.names=F)=="universiteit", 7, NA))))))) 
  #frequency
  alterL[[i]]$frequency.t1 <- ifelse(unlist(df_freq[i,],use.names=F)=="(Bijna) elke dag", 7,
                               ifelse(unlist(df_freq[i,],use.names=F)=="1-2 keer per week",6,
                                      ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per maand",5, 
                                         ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per maand",4, 
                                            ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per jaar",3,
                                                 ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per jaar",2,
                                                     ifelse(unlist(df_freq[i,],use.names=F)=="Nooit",1, NA )))))))
  #closeness
  alterL[[i]]$closeness.t1 <- ifelse(unlist(df_close[i,],use.names=F)=="Niet hecht", 1, 
                               ifelse(unlist(df_close[i,],use.names=F)=="Enigszins hecht", 2,
                                      ifelse(unlist(df_close[i,],use.names=F)=="Hecht", 3,
                                             ifelse(unlist(df_close[i,],use.names=F)=="Heel erg hecht", 4, NA ))))
  #proximity
  alterL[[i]]$proximity <- ifelse(unlist(df_proximity[i,], use.names=FALSE) == "In hetzelfde huis", "roommate",
                                  ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In dezelfde buurt" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde straat" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde gemeente", "close",
                                    ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In hetzelfde land" |
                                             unlist(df_proximity[i,], use.names = FALSE) == "In een ander land","far", NA)))

  
   #duration:  take midpoint on scale.
   alterL[[i]]$duration <- ifelse(unlist(df_duration[i,],use.names=F)=="Minder dan 1 jaar", 0, 
                               ifelse(unlist(df_duration[i,],use.names=F)=="1 tot 3 jaar", 2,
                                      ifelse(unlist(df_duration[i,],use.names=F)=="4 tot 8 jaar", 6,
                                             ifelse(unlist(df_duration[i,],use.names=F)=="9 tot 15 jaar", 12,
                                                    ifelse(unlist(df_duration[i,],use.names=F)=="Meer dan 15 jaar", 15,NA )))))
}

#for sports partners, how frequent they participate and how competent they are in the sport they do with ego.
df_altfreq <- data.frame(p1 = data$altfreq1, p2 = data$altfreq2, p3 = data$altfreq3, p4 = data$altfreq4, p5 = data$altfreq5)
df_altgrade <- data.frame(p1 = data$grade1, p2 = data$grade2, p3 = data$grade3, p4 = data$grade4, p5 = data$grade5)

for (i in 1:length(alterL)) { 
  alterL[[i]]$alter_freq[16:20] <- unlist(df_altfreq[i,], use.names=TRUE)
  alterL[[i]]$alter_grade[16:20] <- unlist(df_altgrade[i,], use.names=TRUE)
}

# before we can construct similarity indices, we must add ego-attributes
for (i in 1:length(alterL)) {
  #  gender
  alterL[[i]]$ego_gender <- ifelse(data$A1[i] == "Man", 0,ifelse(data$A1[i] == "Vrouw", 1,ifelse(data$A1[i] == "Overige", 2,NA)))
  
  # education 
  # these score should correspond to scores given to alter educ...
  alterL[[i]]$ego_educ <- ifelse(data$T1[i] == "aan de Hogeschool van Arnhem en Nijmegen (HAN)", "6", "7" )
 
  # age
  # calculated as the difference between submission date and birthdate
  # in years.
  birth_date <- as.Date(data$A2[i])
  #x_date <- as.Date(data$submitdate) #submission date was not deposited; so, take 1-jan 2023
  x_date <- as.Date("2023-01-01")
  alterL[[i]]$ego_age <- trunc((birth_date %--% x_date) / years(1))
}

# i also want to know ego's sports frequency and skill
# ultimately, i want to make a dyadic variable indicating the skill level (difference) of ego and alter, in *the specific sports that they do together*
# for now, i will put ego's sports frequency and skill, per sport, in a dataframe. 
# also, the setting ego participates each sports in (e.g., alone, informal, club-organized, ...)

#frequency
egos <- data %>%
  select(S3X.SQ001.:S3X.SQ017., S3bX.SQ001.:S3bX.SQ017. )
egos[egos == "Minder dan 1 keer per maand"] <- 0.125
egos[egos == "1 keer per maand" ] <- 0.25
egos[egos == "2 keer per maand" ] <- 0.5
egos[egos == "1 keer per week" ] <- 1

#in cases where ego participated more than once a week, get the answer to the questino how often per week he/she participated
for (i in 1:17) {
  egos[,i] <- ifelse(egos[,i] == "Vaker dan 1 keer per week", gsub("\\D", "", egos[,17+i]), egos[,i])
}
egos[,1:17] -> egos
egos <- mutate_all(egos, as.numeric)

#and skill
egos2 <- data %>%
  select(S2b.SQ001.: S2b.SQ017.)

#and setting
egos3 <- data %>%
  select(S2a.SQ001. : S2a.SQ017.)
egos3[egos3 == "Als lid van een commerciële sportaanbieder (bijv., fitnesscentrum)"] <- "gym"
egos3[egos3 == "Als lid van een sportvereniging"] <- "club"
egos3[egos3 == "In groepsverband, georganiseerd door jezelf, familie, vrienden, en/of kennissen"] <- "informal"
egos3[egos3 == "Alleen, ongeorganiseerd"] <- "alone"

#first, also save ego's (weekly) sports frequency (averaged over sports types)
#and ego's average/total skill (over sports types)
for (i in 1:length(alterL)) {
  alterL[[i]]$ego_meanfreq <- ifelse( length(which(is.na(egos[i,]))) < 17, rowMeans(egos[i,], na.rm=TRUE), 0) #those without a sports get a 0
  alterL[[i]]$ego_meanskill <- rowMeans(egos2[i,], na.rm = TRUE)
  #and also save number of sports
  alterL[[i]]$ego_nsport <- length(which(!is.na(egos[i,])))
}

#now get for each sports partner in the list of alters, the sports ego does with them

for (i in 1:length(alterL)) { # for ego

  alterL[[i]]$sporttogether[16:20] <-
    
    c( ifelse( length(which( data[i,] %>%
  select(samenCSN1.SQ001.:samenCSN1.SQ017.) == "Ja" )) > 0,
  which(data[i,] %>% select(samenCSN1.SQ001.:samenCSN1.SQ017.) == "Ja" ), NA),
  
  ifelse( length(which( data[i,] %>%
  select(samenCSN2.SQ001.:samenCSN2.SQ017.) == "Ja" )) > 0,
  which(data[i,] %>% select(samenCSN2.SQ001.:samenCSN2.SQ017.) == "Ja" ), NA),
  
  ifelse( length(which( data[i,] %>%
  select(samenCSN3.SQ001.:samenCSN3.SQ017.) == "Ja" )) > 0,
  which(data[i,] %>% select(samenCSN3.SQ001.:samenCSN3.SQ017.) == "Ja" ), NA),
  
  ifelse( length(which( data[i,] %>%
  select(samenCSN4.SQ001.:samenCSN4.SQ017.) == "Ja" )) > 0,
  which(data[i,] %>% select(samenCSN4.SQ001.:samenCSN4.SQ017.) == "Ja" ), NA),
  
  ifelse( length(which( data[i,] %>%
  select(samenCSN5.SQ001.:samenCSN5.SQ017.) == "Ja" )) > 0,
  which(data[i,] %>% select(samenCSN5.SQ001.:samenCSN5.SQ017.) == "Ja" ), NA)
  )
}

# i filter out the unique, non-duplicate alters;
# by excluding alters with empty strings for gender attribute

#but first, match sports attributes.
#that is, from sports partners (p16-p20) to other alters who correspond to sports partners (name4)

for (i in 1:length(alterL)) {
  for (j in which(!is.na(alterL[[i]]$name4))) {
    alterL[[i]][j, c("alter_freq", "alter_grade", "sporttogether")] <- alterL[[i]][which(alterL[[i]]$name1 == alterL[[i]]$name4[j]), c("alter_freq", "alter_grade", "sporttogether")]
  }
}

#now do the filtering on gender, to filter out duplicates.
for ( i in 1:length(alterL)) {
  alterL[[i]] <- alterL[[i]][which(alterL[[i]]$alter_gender!=""),]
  # and replace the alter id: 1 : no. unique alters
  alterL[[i]]$alterid <- 1:nrow(alterL[[i]])
}

#attach ego_grade, ego's self-assessed skill for the sports he/she does together with alter
#and ego_freq, ego's sports frequency in this sports activity
#and ego_context, the social sporting context in which ego does this activity (assumedly, with alter)
for (i in 1:length(alterL)) { #for ego i
  alterL[[i]]$ego_grade <- NA
  alterL[[i]]$ego_freq <- NA
  alterL[[i]]$ego_context <- NA
  
  for (j in which(!is.na(alterL[[i]]$sporttogether))) { #for alters with a value on the 'sporttogether' attribute (i.e., who belong to sportnetwork)
    
    #attach ego's self-assessed sports skill for the sports he/she did with alter with alterid j
    alterL[[i]]$ego_grade[alterL[[i]]$alterid == j] <- egos2[i, alterL[[i]]$sporttogether[j]]
    
    #and ego's self-assessed sports frequency for this sports type
    alterL[[i]]$ego_freq[alterL[[i]]$alterid == j] <- egos[i, alterL[[i]]$sporttogether[j]]
    
    #and the setting in which ego engaged (with alter) in this sports type
    alterL[[i]]$ego_context[alterL[[i]]$alterid == j] <- egos3[i, alterL[[i]]$sporttogether[j]]
    
  }
}

#also add whether ego was still active in the sports type he/she did with alter, at t+1
for (i in 1:length(alterL)) {
  
  alterL[[i]]$ego_quit <- NA
  
  for (j in which(!is.na(alterL[[i]]$sporttogether))) { #for alters with a value on the 'sporttogether' attribute (i.e., who belong to sportnetwork)
    
    #get sports type of ego and alter j
    sharedsport <- alterL[[i]][j,"sporttogether"]
    
    #get ego's activity levels over sports types
    sportsego <- data4 %>%
      select(S1a.SQ001.:S1a.SQ017.) %>% 
      filter(row_number() == i)
    
    #and check whether ego quit participating in sports type he/she did with alter j:
    alterL[[i]]$ego_quit[j] <- ifelse(sportsego[,sharedsport] == "Niet", 1,0)
  }
}
  
#dyadic similarity measures
for (i in 1:length(alterL))  { # for ego i
  # get attributes of ego
  agei <- alterL[[i]]$ego_age[1]
  genderi <- alterL[[i]]$ego_gender[1]
  edi <- alterL[[i]]$ego_educ[1]
  
  for (j in 1:max(alterL[[i]]$alterid)) { # for alter j
    # calculate "same gender" (0/1)
    genderj <- as.numeric(alterL[[i]]$alter_gender[j]) # get alter j gender
    same <- ifelse(genderi==genderj, 1, 0)
    alterL[[i]]$same_gender[which(alterL[[i]]$alterid==j)] <- same
    
    #same education
    eduj <- alterL[[i]]$alter_educ[j]
    same <- ifelse(eduj==edi, 1, 0)
    alterL[[i]]$sim_educ[which(alterL[[i]]$alterid==j)] <- same
    
    # calculate similarity for age as the absolute difference between alter and ego value
    #get alter j attributes
    agej <- as.numeric(alterL[[i]]$alter_age[j])
    #difference score
    difage <- abs(agei - agej)
    
    # so higher values represent *less* similarity
    if( !is.na (agej) ) { # age similarity only calculable if z_j is known!
        alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- difage
      } else { alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- NA}
  }
}

#based on this, i make a long dataframe with alters nested in ego.
#first, add an ego_id
for (i in 1:length(alterL)) {
  alterL[[i]]$ego <- i
  alterL[[i]]$respnr <- data$respnr[i]
}

#combine using rbind
df <- do.call(rbind,alterL)

#other ego variables:
#transitions
# we need info of waves 1 and 2, so i merge them
d <- merge(data3, data4, by="respnr")
d <- data.frame(d[order(d$respnr, decreasing = FALSE), ]) # and sort by respnr

#1. residential transitions
df$housing.t1a <- NA #wave 1, pre-transition
df$housing.t1b <- NA #wave 1, post-transition
df$housing.t2 <- NA #wave 2
df$housing.transition <- NA #no. of changes 

#make sure descriptions of living situation matches over waves
d$A7 <- ifelse(d$A7 == "inwonend bij ouder(s)/verzorger(s)", "inwonend bij je ouder(s)/verzorger(s)", d$A7)
d$A4d <- ifelse(d$A4d == "inwonend bij ouder(s)/verzorger(s)", "inwonend bij je ouder(s)/verzorger(s)", d$A4d)

for (i in unique(df$ego)) {
  df$housing.t1a[which(df$ego == i)] <- d$A4.x[i] # w1, half year prior to transition
    
  # if respondent had moved at the time of w1, get current living situation
  df$housing.t1b[which(df$ego==i)] <- ifelse(d$A6[i] == "Nee", d$A7[i], df$housing.t1a[which(df$ego==i)])
  
  #if they moved, this indicates a transition
  transition <- ifelse(d$A6[i]=="Nee", 1, 0)
  
  # if respondent has moved since then (in w2), ...
  df$housing.t2[which(df$ego==i)] <- ifelse(d$A4.y[i] == "Ja" | d$A4b[i] == "Ja" | d$A4c[i] == "Ja", d$A4d[i], df$housing.t1b[which(df$ego==i)]) 
  
  transition <- ifelse(d$A4.y[i] == "Ja" | d$A4b[i] == "Ja" | d$A4c[i] == "Ja", transition + 1, transition)
  
  # no. of housing transition
  df$housing.transition[which(df$ego==i)] <- transition
}

#also make it binary (yes/no)
df$housing.transition_bin <- ifelse(df$housing.transition > 0, 1, 0)

#2. transition to university
df$occupation.t1 <- NA
df$occupation.t2 <- "higher" #everybody is in school...
df$study.year <- NA
df$occupation.transition <- NA 

for (i in unique(df$ego)) {
  df$occupation.t1[which(df$ego==i)] <- ifelse(data$E1[i]=="Ik zat op de middelbare school", "secondary",
                             ifelse(data$E1[i]=="Ik deed een MBO-, HBO- of WO-opleiding","higher",
                                    ifelse(data$E1[i]=="Ik werkte","work",
                                             ifelse(data$E1[i]=="Ik had een tussenjaar","gap",
                                                    ifelse(data$E1[i]=="Overige","other",NA)))))

  df$study.year[which(df$ego==i)] <- ifelse(data$T3[i]=="in het eerste jaar", 1,
                                            ifelse(data$T3[i]=="in het tweede jaar", 2,
                                                   ifelse(data$T3[i]=="in het derde jaar of hoger", 3, NA)))
  
  #transition = 1 for those who are first years and who came from secondary school/gap year
  transition <- ifelse( data$T3[i]=="in het eerste jaar" & (data$E1[i]=="Ik zat op de middelbare school" | data$E2[i]=="Ik had een tussenjaar"), 1, 0)
  
  # did ego drop out/start a new study?
  transition <- ifelse(data4$G07Q90[i]== "Nee", transition + 1, transition)
  df$occupation.transition[which(df$ego==i)] <- transition
}

#also make binary
df$occupation.transition_bin <- ifelse(df$occupation.transition > 0, 1, 0)

#romantic relationship 
df$romantic <- NA
for (i in unique(df$ego)) {
  df$romantic[which(df$ego==i)] <- ifelse(data$R3[i] == "Ja", 1,0)
}

#psychological/other variables (wave 2)
#loneliness  
l <- cbind(d$stellingen.SQ001., d$stellingen.SQ002.)
l <- ifelse(l=="Helemaal oneens", 1, ifelse(l=="Mee oneens", 2,
                   # do not know = neutral... this category was sparsely populated 
                   ifelse(l=="Neutraal" | l=="Ik weet het niet", 3, 
                          ifelse(l=="Mee eens", 4, ifelse(l=="Helemaal eens", 5, l)))))
# turn the first indicator, so that higher scores indicate "more" loneliness.
l[,1] <- 6-as.numeric(l[,1])

#extraversion
e <- cbind(d$stellingen.SQ003., d$stellingen.SQ006.)
e <- ifelse(e=="Helemaal oneens", 1,
            ifelse(e=="Mee oneens", 2,
                   ifelse(e=="Neutraal" | e=="Ik weet het niet", 3, 
                          ifelse(e=="Mee eens", 4,
                                 ifelse(e=="Helemaal eens", 5, e)))))
# turn the second indicator
e[,2] <- 6-as.numeric(e[,2])

# calculate averages.
df$loneliness <- NA
df$extraversion <- NA
for (i in unique(df$ego)) {
  l_scores <- as.numeric(l[i,])
  e_scores <- as.numeric(e[i,])
  df$loneliness[which(df$ego==i)] <- mean(l_scores)
  df$extraversion[which(df$ego==i)] <- mean(e_scores)
}

# financial restrictions (for social interaction)
df$fin_restr <- NA
# 0. never; 1. sometimes; 2. often; 3. always
for (i in unique(df$ego)) {
  df$fin_restr[which(df$ego==i)] <- d$G01Q111[i]
}
df$fin_restr <- ifelse(df$fin_restr=="Nooit",0,
                       ifelse(df$fin_restr=="Soms",1,
                              ifelse(df$fin_restr=="Vaak",2,
                                     ifelse(df$fin_restr=="Altijd",3, NA))))

# add network variables
# 1. size (no. of unique alters)
df$netsize <- NA
# also per egonet
df$cdn.size <- df$study.size <- df$csn.size <- df$bff.size <- 0

for (i in unique(df$ego)) {
  #no. of unique alters is simply the number of rows per ego
  df$netsize[which(df$ego==i)] <- nrow(df[which(df$ego==i),])
  
  #size of each egonet is the number of alters named in the name generators
  #thus, including 'duplicates'
  df$cdn.size[which(df$ego==i)] <- length(which(!df_names[i,c(1:5)]==""))
  df$study.size[which(df$ego==i)] <- length(which(!df_names[i,c(6:10)]==""))
  df$bff.size[which(df$ego==i)] <- length(which(!df_names[i,c(11:15)]==""))
  df$csn.size[which(df$ego==i)] <- length(which(!df_names[i,c(16:20)]==""))
}

# 2. density.
# this can only be calculated per egonet, as only between-alter ties within egonet are asked.
df$cdn.density <- df$study.density <- df$csn.density <- df$bff.density <- NA

for (i in unique(df$ego)) {
  #a. CDN
  size <- df$cdn.size[which(df$ego==i)][1]
  #no. possible ties between alters
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  #get no. of observed ties
  #only if ego named at least 2 alters in this name generator
  #because only then i can calculate density
  if(size>1) {
    #get alter-alter adjacency matrices of this particular egonet
    adjacency <- data[i,c(13:32)]
   
    #i want the correct ones, given the no. of listed alters in this name generator
    #i list the columns numbers of the variables corresponding to each matching matrix set,
    #and subset corresponding columns in `adjacency`
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$cdn.density[which(df$ego==i)] <- obs/pos  }
  
  #b. study
  size <- df$study.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(53:72)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$study.density[which(df$ego==i)] <- obs/pos }
  
  #c. friends
  size <- df$bff.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(169:188)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$bff.density[which(df$ego==i)] <- obs/pos }

  #d. sports partners
  size <- df$csn.size[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data[i,c(444:463)]

    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$csn.density[which(df$ego==i)] <- obs/pos }
}

#set NAs to 0.
df$cdn.density[is.na(df$cdn.density)] <- 0
df$study.density[is.na(df$study.density)] <- 0
df$bff.density[is.na(df$bff.density)] <- 0
df$csn.density[is.na(df$csn.density)] <- 0

#binary attributes indicating whether alters appeared in each of the ego-nets at w1.
for (i in unique(df$ego)) {  
    for (j in 1:nrow(df[which(df$ego==i),])) { # for alters nested in ego

    # find out if alter_id denoting alter j appear in the 4 egonets
    alter <- unlist(df[which(df$ego==i & df$alterid==j),][5:8], use.names = FALSE) # get name(s) of alter j
    alter <- alter[!is.na(alter)] # exclude NAs
    
    cdn <- alter %in% net1[i,]
    study <- alter %in% net2[i,]
    bff <- alter %in% net3[i,]
    csn <- alter %in% net4[i,]
    
    # and if so, give alter j score 1 on indicators; 0 otherwise
    df$cdn1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% cdn, 1, 0)
    df$study1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% study, 1, 0)
    df$bff1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% bff, 1, 0)
    df$csn1[which(df$ego==i & df$alterid==j)] <- ifelse("TRUE" %in% csn, 1, 0)
  }
}

#calculate multiplexity as an alter/tie attribute (i.e., number of *additional* networks j appeared in)
#names(df)
df$multiplex <- rowSums(df[,c(59:62)]) - 1 #minus one to reach a meaningful intercept
#psych::describe(df$multiplex) #M=.51; SD=.76

#now, find out whether w1-alters were maintainted in w2.
df$survive <- NA

# In wave 2, another matching procedure was used; in rows, alters named in w2 are listed; columns denote (unique) alters of w1, so the same one as our data-frame.
# again, i made multiple matrices, conditional on the no. of unique alters of w1 (15, to be precise)
# if, in one of these matrices, column j was marked as corresponding to a named alter in w2, then alter j did, indeed, survive

# subset w1-w2 matching matrices; and respnr
w1w2 <- data4[,c(756:1155,length(data4))]

for (i in unique(df$ego)) {  # for ego 
  matchingL <- vector("list", 20) #pre-allocate empty list of length 20, to store matching matrices

  {
    matchingL[[1]] <- w1w2[i,1:20]
    matchingL[[2]] <- w1w2[i,21:40]
    matchingL[[3]] <- w1w2[i,41:60]
    matchingL[[4]] <- w1w2[i,61:80]
    matchingL[[5]] <- w1w2[i,81:100]
    matchingL[[6]] <- w1w2[i,101:120]
    matchingL[[7]] <- w1w2[i,121:140]
    matchingL[[8]] <- w1w2[i,141:160]
    matchingL[[9]] <- w1w2[i,161:180]
    matchingL[[10]] <- w1w2[i,181:200]
    matchingL[[11]] <- w1w2[i,201:220]
    matchingL[[12]] <- w1w2[i,221:240]
    matchingL[[13]] <- w1w2[i,241:260]
    matchingL[[14]] <- w1w2[i,261:280]
    matchingL[[15]] <- w1w2[i,281:300]
    matchingL[[16]] <- w1w2[i,301:320]
    matchingL[[17]] <- w1w2[i,321:340]
    matchingL[[18]] <- w1w2[i,341:360]
    matchingL[[19]] <- w1w2[i,361:380]
    matchingL[[20]] <- w1w2[i,381:400]
  }
  
  #find the 'right' matching matrix in this list, by taking the one that contains answers
  ind <- NULL
  for (j in seq_along(matchingL)) {
    #check along the sequence of elements j in the matching matrix list if they are non-empty and not NA
    check <- FALSE
    for (col in matchingL[[j]]) {
      if (!all(is.na(col)) && any(nchar(col) > 0)) {
        check <- TRUE
        break  
      }
      }
    if (check) {
      ind <- j
      break  
    }
  }
  if(length(ind)>0) {
    # get the  corresponding matrix
    mm <- matchingL[[ind]]
    
    # unlist the answers given
    ans <- unlist(mm, use.names = FALSE)
    
    # use 'stringr' to extract numbers in these answers,
    # they refer to the id of "survived" alters
    id <- unlist(stringr::str_extract_all(ans,"\\(?[0-9,.]+\\)?"))
    id <- id[!is.na(id)] # exclude NA
    
    # if alter id of ego i corresponds to this id, they did indeed survive:
    df$survive[which(df$ego==i)] <- ifelse(df$alterid[which(df$ego==i)] %in% id, 1, 0)
  }
}

# in which egonet did they (re)appear?
df$cdn2 <- NA
df$study2 <- NA
df$bff2 <- NA
df$csn2 <- NA

# i use the matching matrices of w2; where columns refer to unique w1 alters (those of our constructed dataframe) and rows referring to unique w2 alters
# so, if w1-alter/column j is matched to w2-alter/row i, then w1-alter did survive (but we already knew that); but more importantly, j was the i^th alter mentioned
# and this allows me to infer in what network j (re-)appeared
# since cdn = 1-5; study = 6-10; bff = 11-15; csn = 16-20.
# however, since the rows only include non-duplicate w2-alters;
# if alter j at t1 was named more than once at t2, i only know the first
# egonet in which j was named...
# thus, before i proceed, i use the matching matrices that allowed ego to match alters from different egonets to make alter ids for w2 alters; and figure out to which egonets they belonged

# i make a dataframe of w2-alters, with potential duplicates...
df_names <- data.frame(p1 = data4$egonet1.SQ001.,p2 = data4$egonet1.SQ002.,p3 = data4$egonet1.SQ003.,p4 = data4$egonet1.SQ004.,p5 = data4$egonet1.SQ005.,p6 = data4$egonet2.SQ001.,p7 = data4$egonet2.SQ002.,p8 = data4$egonet2.SQ003.,p9 = data4$egonet2.SQ004.,p10= data4$egonet2.SQ005.,p11= data4$egonet3.SQ001.,p12= data4$egonet3.SQ002.,p13= data4$egonet3.SQ003.,p14= data4$egonet3.SQ004.,p15= data4$egonet3.SQ005.,p16= data4$egonet4.SQ001., p17= data4$egonet4.SQ002., p18= data4$egonet4.SQ003.,p19= data4$egonet4.SQ004.,p20= data4$egonet4.SQ005.)

#males
df_gender <- data.frame(p1 = data4$males.SQ001.,p2 = data4$males.SQ002.,p3 = data4$males.SQ003.,p4 = data4$males.SQ004.,p5 = data4$males.SQ005.,p6 = data4$males.SQ006.,p7 = data4$males.SQ007.,p8 = data4$males.SQ008.,p9 = data4$males.SQ009.,p10= data4$males.SQ010.,p11= data4$males.SQ011.,p12= data4$males.SQ012.,p13= data4$males.SQ013.,p14= data4$males.SQ014.,p15= data4$males.SQ015.,p16= data4$males.SQ016.,p17= data4$males.SQ017.,p18= data4$males.SQ018.,p19= data4$males.SQ019.,p20= data4$males.SQ020.)

# list of dataframes per ego with rows reflecting alters
# and columns indicating the name(s) of the particular alters
alterL <- list()
# loop over all egos
for ( i in 1:nrow(df_names)) {alterL[[i]] <- data.frame(
    alterid = 1:20,name1 = NA,name2 = NA, name3 = NA,name4 = NA, gender=NA,
    cdn_embed.t2 = NA, study_embed.t2 = NA, bff_embed.t2 = NA, csn_embed.t2 = NA)}

# fill the names based on the names data-frame
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=F)
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
  
  alterL[[i]]$gender <- unlist(df_gender[i,], use.names=F)
  alterL[[i]]$gender <- ifelse(alterL[[i]]$gender=="Ja", 0, #male = ref
                               ifelse(alterL[[i]]$gender=="Nee", 1, NA))
  
  }

# calculate netsize for each net to get the correct matching matrix
{
  net1 <- cbind(data4$egonet1.SQ001.,data4$egonet1.SQ002., data4$egonet1.SQ003.,data4$egonet1.SQ004., data4$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data4$egonet2.SQ001.,data4$egonet2.SQ002., data4$egonet2.SQ003.,data4$egonet2.SQ004., data4$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data4$egonet3.SQ001.,data4$egonet3.SQ002., data4$egonet3.SQ003.,data4$egonet3.SQ004., data4$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data4$egonet4.SQ001.,data4$egonet4.SQ002., data4$egonet4.SQ003.,data4$egonet4.SQ004., data4$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

# construct the matching matrices list for egonet1-2
matchingList <- list()
for (i in 1:length(alterL)) {
  matchingL <- list()
  matchingL[[1]] <- cbind(data4$matching1N1.SQ001_SQ001.[i],data4$matching1N1.SQ002_SQ001.[i],data4$matching1N1.SQ003_SQ001.[i],data4$matching1N1.SQ004_SQ001.[i],data4$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data4$matching1N2.SQ001_SQ001.[i], data4$matching1N2.SQ002_SQ001.[i], data4$matching1N2.SQ003_SQ001.[i], data4$matching1N2.SQ004_SQ001.[i], data4$matching1N2.SQ005_SQ001.[i]),
    cbind(data4$matching1N2.SQ001_SQ002.[i], data4$matching1N2.SQ002_SQ002.[i], data4$matching1N2.SQ003_SQ002.[i], data4$matching1N2.SQ004_SQ002.[i], data4$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data4$matching1N3.SQ001_SQ001.[i], data4$matching1N3.SQ002_SQ001.[i], data4$matching1N3.SQ003_SQ001.[i], data4$matching1N3.SQ004_SQ001.[i], data4$matching1N3.SQ005_SQ001.[i]),
    cbind(data4$matching1N3.SQ001_SQ002.[i], data4$matching1N3.SQ002_SQ002.[i], data4$matching1N3.SQ003_SQ002.[i], data4$matching1N3.SQ004_SQ002.[i], data4$matching1N3.SQ005_SQ002.[i]),
    cbind(data4$matching1N3.SQ001_SQ003.[i], data4$matching1N3.SQ002_SQ003.[i], data4$matching1N3.SQ003_SQ003.[i], data4$matching1N3.SQ004_SQ003.[i], data4$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data4$matching1N4.SQ001_SQ001.[i], data4$matching1N4.SQ002_SQ001.[i], data4$matching1N4.SQ003_SQ001.[i], data4$matching1N4.SQ004_SQ001.[i], data4$matching1N4.SQ005_SQ001.[i]),
    cbind(data4$matching1N4.SQ001_SQ002.[i], data4$matching1N4.SQ002_SQ002.[i], data4$matching1N4.SQ003_SQ002.[i], data4$matching1N4.SQ004_SQ002.[i], data4$matching1N4.SQ005_SQ002.[i]),
    cbind(data4$matching1N4.SQ001_SQ003.[i], data4$matching1N4.SQ002_SQ003.[i], data4$matching1N4.SQ003_SQ003.[i], data4$matching1N4.SQ004_SQ003.[i], data4$matching1N4.SQ005_SQ003.[i]),
    cbind(data4$matching1N4.SQ001_SQ004.[i], data4$matching1N4.SQ002_SQ004.[i], data4$matching1N4.SQ003_SQ004.[i], data4$matching1N4.SQ004_SQ004.[i], data4$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data4$matching1N5.SQ001_SQ001.[i], data4$matching1N5.SQ002_SQ001.[i], data4$matching1N5.SQ003_SQ001.[i], data4$matching1N5.SQ004_SQ001.[i], data4$matching1N5.SQ005_SQ001.[i]),
    cbind(data4$matching1N5.SQ001_SQ002.[i], data4$matching1N5.SQ002_SQ002.[i], data4$matching1N5.SQ003_SQ002.[i], data4$matching1N5.SQ004_SQ002.[i], data4$matching1N5.SQ005_SQ002.[i]),
    cbind(data4$matching1N5.SQ001_SQ003.[i], data4$matching1N5.SQ002_SQ003.[i], data4$matching1N5.SQ003_SQ003.[i], data4$matching1N5.SQ004_SQ003.[i], data4$matching1N5.SQ005_SQ003.[i]),
    cbind(data4$matching1N5.SQ001_SQ004.[i], data4$matching1N5.SQ002_SQ004.[i], data4$matching1N5.SQ003_SQ004.[i], data4$matching1N5.SQ004_SQ004.[i], data4$matching1N5.SQ005_SQ004.[i]),
    cbind(data4$matching1N5.SQ001_SQ005.[i], data4$matching1N5.SQ002_SQ005.[i], data4$matching1N5.SQ003_SQ005.[i], data4$matching1N5.SQ004_SQ005.[i], data4$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
} # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
}#ignore warning

# again, make a matching list for the second matching matrices
# (i.e., matching egonet3 alters to prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data4$matching2N1.SQ001_SQ001.[i],data4$matching2N1.SQ002_SQ001.[i],data4$matching2N1.SQ003_SQ001.[i],data4$matching2N1.SQ004_SQ001.[i],data4$matching2N1.SQ005_SQ001.[i],data4$matching2N1.SQ006_SQ001.[i],data4$matching2N1.SQ007_SQ001.[i],data4$matching2N1.SQ008_SQ001.[i],data4$matching2N1.SQ009_SQ001.[i],data4$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data4$matching2N2.SQ001_SQ001.[i],data4$matching2N2.SQ002_SQ001.[i],data4$matching2N2.SQ003_SQ001.[i],data4$matching2N2.SQ004_SQ001.[i],data4$matching2N2.SQ005_SQ001.[i],data4$matching2N2.SQ006_SQ001.[i],data4$matching2N2.SQ007_SQ001.[i],data4$matching2N2.SQ008_SQ001.[i],data4$matching2N2.SQ009_SQ001.[i],data4$matching2N2.SQ010_SQ001.[i]),
    cbind(data4$matching2N2.SQ001_SQ002.[i],data4$matching2N2.SQ002_SQ002.[i],data4$matching2N2.SQ003_SQ002.[i],data4$matching2N2.SQ004_SQ002.[i],data4$matching2N2.SQ005_SQ002.[i],data4$matching2N2.SQ006_SQ002.[i],data4$matching2N2.SQ007_SQ002.[i],data4$matching2N2.SQ008_SQ002.[i],data4$matching2N2.SQ009_SQ002.[i],data4$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data4$matching2N3.SQ001_SQ001.[i],data4$matching2N3.SQ002_SQ001.[i],data4$matching2N3.SQ003_SQ001.[i],data4$matching2N3.SQ004_SQ001.[i],data4$matching2N3.SQ005_SQ001.[i],data4$matching2N3.SQ006_SQ001.[i],data4$matching2N3.SQ007_SQ001.[i],data4$matching2N3.SQ008_SQ001.[i],data4$matching2N3.SQ009_SQ001.[i],data4$matching2N3.SQ010_SQ001.[i]),
    cbind(data4$matching2N3.SQ001_SQ002.[i],data4$matching2N3.SQ002_SQ002.[i],data4$matching2N3.SQ003_SQ002.[i],data4$matching2N3.SQ004_SQ002.[i],data4$matching2N3.SQ005_SQ002.[i],data4$matching2N3.SQ006_SQ002.[i],data4$matching2N3.SQ007_SQ002.[i],data4$matching2N3.SQ008_SQ002.[i],data4$matching2N3.SQ009_SQ002.[i],data4$matching2N3.SQ010_SQ002.[i]),
    cbind(data4$matching2N3.SQ001_SQ003.[i],data4$matching2N3.SQ002_SQ003.[i],data4$matching2N3.SQ003_SQ003.[i],data4$matching2N3.SQ004_SQ003.[i],data4$matching2N3.SQ005_SQ003.[i],data4$matching2N3.SQ006_SQ003.[i],data4$matching2N3.SQ007_SQ003.[i],data4$matching2N3.SQ008_SQ003.[i],data4$matching2N3.SQ009_SQ003.[i],data4$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data4$matching2N4.SQ001_SQ001.[i],data4$matching2N4.SQ002_SQ001.[i],data4$matching2N4.SQ003_SQ001.[i],data4$matching2N4.SQ004_SQ001.[i],data4$matching2N4.SQ005_SQ001.[i],data4$matching2N4.SQ006_SQ001.[i],data4$matching2N4.SQ007_SQ001.[i],data4$matching2N4.SQ008_SQ001.[i],data4$matching2N4.SQ009_SQ001.[i],data4$matching2N4.SQ010_SQ001.[i]),
    cbind(data4$matching2N4.SQ001_SQ002.[i],data4$matching2N4.SQ002_SQ002.[i],data4$matching2N4.SQ003_SQ002.[i],data4$matching2N4.SQ004_SQ002.[i],data4$matching2N4.SQ005_SQ002.[i],data4$matching2N4.SQ006_SQ002.[i],data4$matching2N4.SQ007_SQ002.[i],data4$matching2N4.SQ008_SQ002.[i],data4$matching2N4.SQ009_SQ002.[i],data4$matching2N4.SQ010_SQ002.[i]),
    cbind(data4$matching2N4.SQ001_SQ003.[i],data4$matching2N4.SQ002_SQ003.[i],data4$matching2N4.SQ003_SQ003.[i],data4$matching2N4.SQ004_SQ003.[i],data4$matching2N4.SQ005_SQ003.[i],data4$matching2N4.SQ006_SQ003.[i],data4$matching2N4.SQ007_SQ003.[i],data4$matching2N4.SQ008_SQ003.[i],data4$matching2N4.SQ009_SQ003.[i],data4$matching2N4.SQ010_SQ003.[i]),
    cbind(data4$matching2N4.SQ001_SQ004.[i],data4$matching2N4.SQ002_SQ004.[i],data4$matching2N4.SQ003_SQ004.[i],data4$matching2N4.SQ004_SQ004.[i],data4$matching2N4.SQ005_SQ004.[i],data4$matching2N4.SQ006_SQ004.[i],data4$matching2N4.SQ007_SQ004.[i],data4$matching2N4.SQ008_SQ004.[i],data4$matching2N4.SQ009_SQ004.[i],data4$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data4$matching2N5.SQ001_SQ001.[i],data4$matching2N5.SQ002_SQ001.[i],data4$matching2N5.SQ003_SQ001.[i],data4$matching2N5.SQ004_SQ001.[i],data4$matching2N5.SQ005_SQ001.[i],data4$matching2N5.SQ006_SQ001.[i],data4$matching2N5.SQ007_SQ001.[i],data4$matching2N5.SQ008_SQ001.[i],data4$matching2N5.SQ009_SQ001.[i],data4$matching2N5.SQ010_SQ001.[i]),
    cbind(data4$matching2N5.SQ001_SQ002.[i],data4$matching2N5.SQ002_SQ002.[i],data4$matching2N5.SQ003_SQ002.[i],data4$matching2N5.SQ004_SQ002.[i],data4$matching2N5.SQ005_SQ002.[i],data4$matching2N5.SQ006_SQ002.[i],data4$matching2N5.SQ007_SQ002.[i],data4$matching2N5.SQ008_SQ002.[i],data4$matching2N5.SQ009_SQ002.[i],data4$matching2N5.SQ010_SQ002.[i]),
    cbind(data4$matching2N5.SQ001_SQ003.[i],data4$matching2N5.SQ002_SQ003.[i],data4$matching2N5.SQ003_SQ003.[i],data4$matching2N5.SQ004_SQ003.[i],data4$matching2N5.SQ005_SQ003.[i],data4$matching2N5.SQ006_SQ003.[i],data4$matching2N5.SQ007_SQ003.[i],data4$matching2N5.SQ008_SQ003.[i],data4$matching2N5.SQ009_SQ003.[i],data4$matching2N5.SQ010_SQ003.[i]),
    cbind(data4$matching2N5.SQ001_SQ004.[i],data4$matching2N5.SQ002_SQ004.[i],data4$matching2N5.SQ003_SQ004.[i],data4$matching2N5.SQ004_SQ004.[i],data4$matching2N5.SQ005_SQ004.[i],data4$matching2N5.SQ006_SQ004.[i],data4$matching2N5.SQ007_SQ004.[i],data4$matching2N5.SQ008_SQ004.[i],data4$matching2N5.SQ009_SQ004.[i],data4$matching2N5.SQ010_SQ004.[i]),
    cbind(data4$matching2N5.SQ001_SQ005.[i],data4$matching2N5.SQ002_SQ005.[i],data4$matching2N5.SQ003_SQ005.[i],data4$matching2N5.SQ004_SQ005.[i],data4$matching2N5.SQ005_SQ005.[i],data4$matching2N5.SQ006_SQ005.[i],data4$matching2N5.SQ007_SQ005.[i],data4$matching2N5.SQ008_SQ005.[i],data4$matching2N5.SQ009_SQ005.[i],data4$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

# same for matching 3 (i.e., egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data4$matching3N1.SQ001_SQ001.[i],data4$matching3N1.SQ002_SQ001.[i],data4$matching3N1.SQ003_SQ001.[i],data4$matching3N1.SQ004_SQ001.[i],data4$matching3N1.SQ005_SQ001.[i],data4$matching3N1.SQ006_SQ001.[i],data4$matching3N1.SQ007_SQ001.[i],data4$matching3N1.SQ008_SQ001.[i],data4$matching3N1.SQ009_SQ001.[i],data4$matching3N1.SQ010_SQ001.[i], data4$matching3N1.SQ011_SQ001.[i], data4$matching3N1.SQ012_SQ001.[i], data4$matching3N1.SQ013_SQ001.[i], data4$matching3N1.SQ014_SQ001.[i], data4$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data4$matching3N2.SQ001_SQ001.[i],data4$matching3N2.SQ002_SQ001.[i],data4$matching3N2.SQ003_SQ001.[i],data4$matching3N2.SQ004_SQ001.[i],data4$matching3N2.SQ005_SQ001.[i],data4$matching3N2.SQ006_SQ001.[i],data4$matching3N2.SQ007_SQ001.[i],data4$matching3N2.SQ008_SQ001.[i],data4$matching3N2.SQ009_SQ001.[i],data4$matching3N2.SQ010_SQ001.[i], data4$matching3N2.SQ011_SQ001.[i], data4$matching3N2.SQ012_SQ001.[i], data4$matching3N2.SQ013_SQ001.[i], data4$matching3N2.SQ014_SQ001.[i], data4$matching3N2.SQ015_SQ001.[i]),
    cbind(data4$matching3N2.SQ001_SQ002.[i],data4$matching3N2.SQ002_SQ002.[i],data4$matching3N2.SQ003_SQ002.[i],data4$matching3N2.SQ004_SQ002.[i],data4$matching3N2.SQ005_SQ002.[i],data4$matching3N2.SQ006_SQ002.[i],data4$matching3N2.SQ007_SQ002.[i],data4$matching3N2.SQ008_SQ002.[i],data4$matching3N2.SQ009_SQ002.[i],data4$matching3N2.SQ010_SQ002.[i], data4$matching3N2.SQ011_SQ002.[i], data4$matching3N2.SQ012_SQ002.[i], data4$matching3N2.SQ013_SQ002.[i], data4$matching3N2.SQ014_SQ002.[i], data4$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data4$matching3N3.SQ001_SQ001.[i],data4$matching3N3.SQ002_SQ001.[i],data4$matching3N3.SQ003_SQ001.[i],data4$matching3N3.SQ004_SQ001.[i],data4$matching3N3.SQ005_SQ001.[i],data4$matching3N3.SQ006_SQ001.[i],data4$matching3N3.SQ007_SQ001.[i],data4$matching3N3.SQ008_SQ001.[i],data4$matching3N3.SQ009_SQ001.[i],data4$matching3N3.SQ010_SQ001.[i], data4$matching3N3.SQ011_SQ001.[i], data4$matching3N3.SQ012_SQ001.[i], data4$matching3N3.SQ013_SQ001.[i], data4$matching3N3.SQ014_SQ001.[i], data4$matching3N3.SQ015_SQ001.[i]),
    cbind(data4$matching3N3.SQ001_SQ002.[i],data4$matching3N3.SQ002_SQ002.[i],data4$matching3N3.SQ003_SQ002.[i],data4$matching3N3.SQ004_SQ002.[i],data4$matching3N3.SQ005_SQ002.[i],data4$matching3N3.SQ006_SQ002.[i],data4$matching3N3.SQ007_SQ002.[i],data4$matching3N3.SQ008_SQ002.[i],data4$matching3N3.SQ009_SQ002.[i],data4$matching3N3.SQ010_SQ002.[i], data4$matching3N3.SQ011_SQ002.[i], data4$matching3N3.SQ012_SQ002.[i], data4$matching3N3.SQ013_SQ002.[i], data4$matching3N3.SQ014_SQ002.[i], data4$matching3N3.SQ015_SQ002.[i]),
    cbind(data4$matching3N3.SQ001_SQ003.[i],data4$matching3N3.SQ002_SQ003.[i],data4$matching3N3.SQ003_SQ003.[i],data4$matching3N3.SQ004_SQ003.[i],data4$matching3N3.SQ005_SQ003.[i],data4$matching3N3.SQ006_SQ003.[i],data4$matching3N3.SQ007_SQ003.[i],data4$matching3N3.SQ008_SQ003.[i],data4$matching3N3.SQ009_SQ003.[i],data4$matching3N3.SQ010_SQ003.[i], data4$matching3N3.SQ011_SQ003.[i], data4$matching3N3.SQ012_SQ003.[i], data4$matching3N3.SQ013_SQ003.[i], data4$matching3N3.SQ014_SQ003.[i], data4$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data4$matching3N4.SQ001_SQ001.[i],data4$matching3N4.SQ002_SQ001.[i],data4$matching3N4.SQ003_SQ001.[i],data4$matching3N4.SQ004_SQ001.[i],data4$matching3N4.SQ005_SQ001.[i],data4$matching3N4.SQ006_SQ001.[i],data4$matching3N4.SQ007_SQ001.[i],data4$matching3N4.SQ008_SQ001.[i],data4$matching3N4.SQ009_SQ001.[i],data4$matching3N4.SQ010_SQ001.[i], data4$matching3N4.SQ011_SQ001.[i], data4$matching3N4.SQ012_SQ001.[i], data4$matching3N4.SQ013_SQ001.[i], data4$matching3N4.SQ014_SQ001.[i], data4$matching3N4.SQ015_SQ001.[i]),
    cbind(data4$matching3N4.SQ001_SQ002.[i],data4$matching3N4.SQ002_SQ002.[i],data4$matching3N4.SQ003_SQ002.[i],data4$matching3N4.SQ004_SQ002.[i],data4$matching3N4.SQ005_SQ002.[i],data4$matching3N4.SQ006_SQ002.[i],data4$matching3N4.SQ007_SQ002.[i],data4$matching3N4.SQ008_SQ002.[i],data4$matching3N4.SQ009_SQ002.[i],data4$matching3N4.SQ010_SQ002.[i], data4$matching3N4.SQ011_SQ002.[i], data4$matching3N4.SQ012_SQ002.[i], data4$matching3N4.SQ013_SQ002.[i], data4$matching3N4.SQ014_SQ002.[i], data4$matching3N4.SQ015_SQ002.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ004.[i],data4$matching3N4.SQ002_SQ004.[i],data4$matching3N4.SQ003_SQ004.[i],data4$matching3N4.SQ004_SQ004.[i],data4$matching3N4.SQ005_SQ004.[i],data4$matching3N4.SQ006_SQ004.[i],data4$matching3N4.SQ007_SQ004.[i],data4$matching3N4.SQ008_SQ004.[i],data4$matching3N4.SQ009_SQ004.[i],data4$matching3N4.SQ010_SQ004.[i], data4$matching3N4.SQ011_SQ004.[i], data4$matching3N4.SQ012_SQ004.[i], data4$matching3N4.SQ013_SQ004.[i], data4$matching3N4.SQ014_SQ004.[i], data4$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data4$matching3N5.SQ001_SQ001.[i],data4$matching3N5.SQ002_SQ001.[i],data4$matching3N5.SQ003_SQ001.[i],data4$matching3N5.SQ004_SQ001.[i],data4$matching3N5.SQ005_SQ001.[i],data4$matching3N5.SQ006_SQ001.[i],data4$matching3N5.SQ007_SQ001.[i],data4$matching3N5.SQ008_SQ001.[i],data4$matching3N5.SQ009_SQ001.[i],data4$matching3N5.SQ010_SQ001.[i], data4$matching3N5.SQ011_SQ001.[i], data4$matching3N5.SQ012_SQ001.[i], data4$matching3N5.SQ013_SQ001.[i], data4$matching3N5.SQ014_SQ001.[i], data4$matching3N5.SQ015_SQ001.[i]),
    cbind(data4$matching3N5.SQ001_SQ002.[i],data4$matching3N5.SQ002_SQ002.[i],data4$matching3N5.SQ003_SQ002.[i],data4$matching3N5.SQ004_SQ002.[i],data4$matching3N5.SQ005_SQ002.[i],data4$matching3N5.SQ006_SQ002.[i],data4$matching3N5.SQ007_SQ002.[i],data4$matching3N5.SQ008_SQ002.[i],data4$matching3N5.SQ009_SQ002.[i],data4$matching3N5.SQ010_SQ002.[i], data4$matching3N5.SQ011_SQ002.[i], data4$matching3N5.SQ012_SQ002.[i], data4$matching3N5.SQ013_SQ002.[i], data4$matching3N5.SQ014_SQ002.[i], data4$matching3N5.SQ015_SQ002.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ005.[i],data4$matching3N5.SQ002_SQ005.[i],data4$matching3N5.SQ003_SQ005.[i],data4$matching3N5.SQ004_SQ005.[i],data4$matching3N5.SQ005_SQ005.[i],data4$matching3N5.SQ006_SQ005.[i],data4$matching3N5.SQ007_SQ005.[i],data4$matching3N5.SQ008_SQ005.[i],data4$matching3N5.SQ009_SQ005.[i],data4$matching3N5.SQ010_SQ005.[i], data4$matching3N5.SQ011_SQ005.[i], data4$matching3N5.SQ012_SQ005.[i], data4$matching3N5.SQ013_SQ005.[i], data4$matching3N5.SQ014_SQ005.[i], data4$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#let us here also attach structural embeddedness. because the 'network environment' for maintained alters may change in t2

#again, fix the irregularities in the data.
data4 <- data4 %>%
  rename (adj3N2a.SQ001. = adj3N1a.SQ001., adj3N3a.SQ001. = adj3N2a.SQ001.,adj3N3a.SQ002. = adj3N2a.SQ002.,adj3N3b.SQ001. = adj3N2b.SQ001.,adj3N4a.SQ001. = adj3N3a.SQ001.,adj3N4a.SQ002. = adj3N3a.SQ002.,adj3N4a.SQ003. = adj3N3a.SQ003.,adj3N4b.SQ001. = adj3N3b.SQ001.,adj3N4b.SQ002. = adj3N3b.SQ002.,   adj3N4c.SQ001. = adj3N3c.SQ001.,adj3N5a.SQ001. = adj3N4a.SQ001.,adj3N5a.SQ002. = adj3N4a.SQ002.,adj3N5a.SQ003. = adj3N4a.SQ003.,adj3N5a.SQ004. = adj3N4a.SQ004.,adj3N5b.SQ001. = adj3N4b.SQ001.,adj3N5b.SQ002. = adj3N4b.SQ002.,adj3N5b.SQ003. = adj3N4b.SQ003.,adj3N5c.SQ001. = adj3N4c.SQ001.,adj3N5c.SQ002. = adj3N4c.SQ002.,adj3N5d.SQ001. = adj3N4d.SQ001.)

data4$adj4N3b.SQ001. <- data4$adj4N3b.SQ002.

for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data4[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data4[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data4[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data4[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t2[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t2[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t2[11:(10+nnames_bff)] <- embed 
  }
  
  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t2[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
        
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t2))],
                                            alterL[[i]]$study_embed.t2[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t2))],
                                          alterL[[i]]$bff_embed.t2[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t2))],     
                                          alterL[[i]]$csn_embed.t2[j] )
  }
}

# make long df with alters in ego,
# and indicators for 4 egonets;
df2 <- data.frame(
  ego=rep(1:length(alterL),each=20),alter=rep(1:20),cdn=NA, study=NA,bff=NA,csn=NA,
  cdn_embed.t2=NA, study_embed.t2=NA, bff_embed.t2=NA, csn_embed.t2=NA)

for (i in unique(df2$ego)) {  
      for (j in 1:20) { # for alters nested in ego
                 
        # find out if names denoting alter j appear in the 4 egonets
        alter <- unlist(alterL[[i]][j,c(2:5)], use.names = FALSE)
        alter <- alter[!is.na(alter)] # exclude NAs
        
        cdn <- alter %in% net1[i,]
        study <- alter %in% net2[i,]
        bff <- alter %in% net3[i,]
        csn <- alter %in% net4[i,]
        
        # and if so, give alter j score 1 on indicators; 0 otherwise
        df2$cdn[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% cdn, 1, 0)
        df2$study[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% study, 1, 0)
        df2$bff[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% bff, 1, 0)
        df2$csn[which(df2$ego==i & df2$alter==j)] <- ifelse("TRUE" %in% csn, 1, 0)
        
        #and attach embeddedness t2 scores
        df2$cdn_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$cdn_embed.t2[j]
        df2$study_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$study_embed.t2[j]
        df2$bff_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$bff_embed.t2[j]
        df2$csn_embed.t2[which(df2$ego==i & df2$alter==j)] <- alterL[[i]]$csn_embed.t2[j]
      }
}

# now that i have, for each alter of ego (including duplicates) at t2,
# the nets to which they belong..
# i continue with the w1-w2 matching matrices

# we already subsetted the matching matrices (in `w1w2`)
for (i in unique(df$ego)) {  # for ego i
  
  matchingL <- vector("list", 20) #pre-allocate empty list of length 15, to store matching matrices
  {
    matchingL[[1]] <- w1w2[i,1:20]
    matchingL[[2]] <- w1w2[i,21:40]
    matchingL[[3]] <- w1w2[i,41:60]
    matchingL[[4]] <- w1w2[i,61:80]
    matchingL[[5]] <- w1w2[i,81:100]
    matchingL[[6]] <- w1w2[i,101:120]
    matchingL[[7]] <- w1w2[i,121:140]
    matchingL[[8]] <- w1w2[i,141:160]
    matchingL[[9]] <- w1w2[i,161:180]
    matchingL[[10]] <- w1w2[i,181:200]
    matchingL[[11]] <- w1w2[i,201:220]
    matchingL[[12]] <- w1w2[i,221:240]
    matchingL[[13]] <- w1w2[i,241:260]
    matchingL[[14]] <- w1w2[i,261:280]
    matchingL[[15]] <- w1w2[i,281:300]
    matchingL[[16]] <- w1w2[i,301:320]
    matchingL[[17]] <- w1w2[i,321:340]
    matchingL[[18]] <- w1w2[i,341:360]
    matchingL[[19]] <- w1w2[i,361:380]
    matchingL[[20]] <- w1w2[i,381:400]
  }
  
  #find the 'right' matching matrix in this list, by taking the one that contains answers
  ind <- NULL
  for (j in seq_along(matchingL)) {
    #check along the sequence of elements j in the matching matrix list if they are non-empty and not NA
    check <- FALSE
    for (col in matchingL[[j]]) {
      if (!all(is.na(col)) && any(nchar(col) > 0)) {
        check <- TRUE
        break  
      }
      }
    if (check) {
      ind <- j
      break  
    }
  }
  
  if(length(ind)>0) {
    # get the  corresponding matrix
    mm <- matchingL[[ind]]
    
    # extract alter ids
    ans <- stringr::str_extract_all(mm,"\\(?[0-9,.]+\\)?") 
    # here, the object refers to the w1-alter j;
    # and the element indicator in the list refers to the w2-alter 
    
    for (j in unique(df$alterid[which(df$ego==i)])) { # for w1-alter j,
      
      # to which row/w2-alter was alter j matched?
      match <- which(ans==j)
      # and in which networks did this w2-alter belong?
      nets <- df2[which(df2$ego==i & df2$alter==match[1]),] #add [1] to match, for the few cases where multiple w2-alters were matched to the same w1-alter (i.e., when ego did not correclty perform match w2 alters to each other.)
    
    if(length(match)>0) { # if j was matched to w2-alters...
      # assign to alter j the networks in which j reappeared
      df$cdn2[which(df$ego==i & df$alterid==j)] <- nets$cdn[1]
      df$study2[which(df$ego==i & df$alterid==j)] <- nets$study[1]
      df$bff2[which(df$ego==i & df$alterid==j)] <- nets$bff[1]
      df$csn2[which(df$ego==i & df$alterid==j)] <- nets$csn[1]
      
      #and attach their t2 embeddednes score
      df$cdn_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$cdn_embed.t2[1]
      df$study_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$study_embed.t2[1]
      df$bff_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$bff_embed.t2[1]
      df$csn_embed.t2[which(df$ego==i & df$alterid==j)] <- nets$csn_embed.t2[1]
    }
  }
  }
}

# currently; a lot of NAs in the attributes indicating whether alter j was member of the respective networks.
# those are alters that were not renamed, and thus have no 'chance' to re-appear. so, 0s are alters that were once part of a specific network, but re-appeared not in that particular network.
# naturally, for analyses, NAs can be set to 0.

# as a second tie change indicator, i look at whether (un-listed) alters and ego were still in touch
df$frequency.t2 <- NA
df$closeness.t2 <- NA

# subset w2 name interpreters on contact freq. of w1 alters (sq021 - sq040!)
freq <- data4[,c(1176:1195)]
# also closeness
close <- data4[,c(1216:1235)]

# recode into numeric values;
freq <- ifelse(freq=="(Bijna) elke dag",7,
                       ifelse(freq=="1-2 keer per week",6,
                              ifelse(freq=="Aantal keer per maand",5, 
                                     ifelse(freq=="Ong. 1 keer per maand",4, 
                                            ifelse(freq=="Aantal keer per jaar",3,
                                                   ifelse(freq=="Ong. 1 keer per jaar",2,
                                                          ifelse(freq=="Nooit",1,
                                                                      NA   )))))))
close <- ifelse(close=="Heel erg hecht", 4, ifelse(close=="Hecht", 3, ifelse(close=="Enigszins hecht",2, ifelse(close=="Niet hecht", 1, NA))))

for (i in unique(df$ego)) {
  for (j in unique(df$alterid[which(df$ego==i)])) {
    df$frequency.t2[which(df$ego==i & df$alterid==j)] <- freq[i,][!is.na(freq[i,])][j]
    df$closeness.t2[which(df$ego==i & df$alterid==j)] <- close[i,][!is.na(close[i,])][j]
  }
}

# size of each egonet at t2
df$cdn.size2 <- NA
df$study.size2 <- NA
df$bff.size2 <- NA
df$csn.size2 <- NA

for (i in unique(df$ego)) {
  df$cdn.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet1.SQ001.[i],data4$egonet1.SQ002.[i],data4$egonet1.SQ003.[i],data4$egonet1.SQ004.[i],data4$egonet1.SQ005.[i])!="")
    df$study.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet2.SQ001.[i],data4$egonet2.SQ002.[i],data4$egonet2.SQ003.[i],data4$egonet2.SQ004.[i],data4$egonet2.SQ005.[i])!="")
    df$bff.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet3.SQ001.[i],data4$egonet3.SQ002.[i],data4$egonet3.SQ003.[i],data4$egonet3.SQ004.[i],data4$egonet3.SQ005.[i])!="")
    df$csn.size2[which(df$ego==i)] <- rowSums(cbind(data4$egonet4.SQ001.[i],data4$egonet4.SQ002.[i],data4$egonet4.SQ003.[i],data4$egonet4.SQ004.[i],data4$egonet4.SQ005.[i])!="") }

#and density at t2.
df$cdn.density2 <- df$study.density2 <- df$csn.density2 <- df$bff.density2 <- NA

for (i in unique(df$ego)) {
  #a. CDN
  size <- df$cdn.size2[which(df$ego==i)][1]
  #no. possible ties between alters
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  #get no. of observed ties
  #only if ego named at least 2 alters in this name generator
  #because only then i can calculate density
  if(size>1) {
    #get alter-alter adjacency matrices of this particular egonet
    adjacency <- data4[i,c(8:27)]

    #i want the correct ones, given the no. of listed alters in this name generator
    #i list the columns numbers of the variables corresponding to each matching matrix set,
    #and subset corresponding columns in `adjacency`
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
   
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$cdn.density2[which(df$ego==i)] <- obs/pos  }
  
  #b. study
  size <- df$study.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(33:52)]
    #reorder columns.... messy!
    adjacency <- adjacency[,c("adj2N2a.SQ001.", "adj2N3a.SQ001.", "adj2N3a.SQ002.", "adj2N3b.SQ001.", "adj2N4a.SQ001.", "adj2N4a.SQ002.",
                       "adj2N4a.SQ003.", "adj2N4b.SQ001.", "adj2N4b.SQ002.", "adj2N4c.SQ001.", "adj2N5a.SQ001.", "adj2N5a.SQ002.",
                       "adj2N5a.SQ003.", "adj2N5a.SQ004.", "adj2N5b.SQ001.", "adj2N5b.SQ002.", "adj2N5b.SQ003.", "adj2N5c.SQ001.",
                       "adj2N5c.SQ002.", "adj2N5d.SQ001.")]
    
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$study.density2[which(df$ego==i)] <- obs/pos }
  
  #c. friends
  size <- df$bff.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(156:175)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
    
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$bff.density2[which(df$ego==i)] <- obs/pos }

  #d. sports partners
  size <- df$csn.size2[which(df$ego==i)][1]
  pos <- ifelse(size==2, 1, ifelse(size==3, 3, ifelse(size==4, 6, ifelse(size==5, 10, 0))))
  if(size>1) {
    adjacency <- data4[i,c(401:420)]
    adj <- adjacency[,list(0,1,c(2:4),c(5:10),c(11:20))[size][[1]]]
  
    #count number of ties that ego described as (very) close (vs. not close but no stranger; strangers)
    obs <- length(which(adj=="Hecht"|adj=="Erg hecht"))
    df$csn.density2[which(df$ego==i)] <- obs/pos }
}

#set NAs to 0.
df$cdn.density2[is.na(df$cdn.density2)] <- 0
df$study.density2[is.na(df$study.density2)] <- 0
df$bff.density2[is.na(df$bff.density2)] <- 0
df$csn.density2[is.na(df$csn.density2)] <- 0

#add Wave 2 status
df$statusW2 <- NA
df$statusW2 <- ifelse(df$survive==1, "Maintained", "Dropped")

df_maintained <- df
#fix(df_maintained)
#str(df_maintained)
#last make gender numeric..
df_maintained$alter_gender <- as.numeric(df_maintained$alter_gender)


4.2 wave 2 created

#create a new alter List
alterL <- vector("list", nrow(data))

# loop over all egos
for ( i in 1:length(alterL)) {
    alterL[[i]] <- data.frame(
      ego_gender = NA, ego_age = NA, ego_educ = NA,
      alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA,
      alter_gender = NA, alter_age = NA, alter_educ=NA,
      same_gender = NA, dif_age = NA, sim_educ = NA,
      cdn_embed.t2 = NA, study_embed.t2 = NA, bff_embed.t2 = NA, csn_embed.t2 = NA)
}

#fill in names based on names_df
for ( i in 1:length(alterL)) {
  alterL[[i]]$name1 <- unlist(df_names[i, ], use.names=FALSE)
}

# replace empty strings with <NA>
for (i in 1:length(alterL)) {
  alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1=="", NA, alterL[[i]]$name1)
}

#matching
{
  net1 <- cbind(data4$egonet1.SQ001.,data4$egonet1.SQ002., data4$egonet1.SQ003.,data4$egonet1.SQ004., data4$egonet1.SQ005.)
  net1 <- ifelse(net1=="", NA, net1)
  ns1 <- vector()
  for (i in 1:nrow(net1)) {
    ns1[i] <- length(net1[i,][which(!is.na(net1[i,]))])
  }
  net2 <- cbind(data4$egonet2.SQ001.,data4$egonet2.SQ002., data4$egonet2.SQ003.,data4$egonet2.SQ004., data4$egonet2.SQ005.)
  net2 <- ifelse(net2=="", NA, net2)
  ns2 <- vector()
  for (i in 1:nrow(net2)) {
    ns2[i] <- length(net2[i,][which(!is.na(net2[i,]))])
  }
  net3 <- cbind(data4$egonet3.SQ001.,data4$egonet3.SQ002., data4$egonet3.SQ003.,data4$egonet3.SQ004., data4$egonet3.SQ005.)
  net3 <- ifelse(net3=="", NA, net3)
  ns3 <- vector()
  for (i in 1:nrow(net3)) {
    ns3[i] <- length(net3[i,][which(!is.na(net3[i,]))])
  }
  net4 <- cbind(data4$egonet4.SQ001.,data4$egonet4.SQ002., data4$egonet4.SQ003.,data4$egonet4.SQ004., data4$egonet4.SQ005.)
  net4 <- ifelse(net4=="", NA, net4)
  ns4 <- vector()
  for (i in 1:nrow(net4)) {
    ns4[i] <- length(net4[i,][which(!is.na(net4[i,]))])
  }
}

matchingList <- list()
for (i in 1:length(alterL)) { # for ego i
  matchingL <- list()
  # make 5 seperate matching matrices. naturally, only 1 is relevant... but i will select that later.
  matchingL[[1]] <- cbind(data4$matching1N1.SQ001_SQ001.[i],data4$matching1N1.SQ002_SQ001.[i],data4$matching1N1.SQ003_SQ001.[i],data4$matching1N1.SQ004_SQ001.[i],data4$matching1N1.SQ005_SQ001.[i])
  matchingL[[2]]<- rbind(
    cbind(data4$matching1N2.SQ001_SQ001.[i], data4$matching1N2.SQ002_SQ001.[i], data4$matching1N2.SQ003_SQ001.[i], data4$matching1N2.SQ004_SQ001.[i], data4$matching1N2.SQ005_SQ001.[i]),
    cbind(data4$matching1N2.SQ001_SQ002.[i], data4$matching1N2.SQ002_SQ002.[i], data4$matching1N2.SQ003_SQ002.[i], data4$matching1N2.SQ004_SQ002.[i], data4$matching1N2.SQ005_SQ002.[i]))
  matchingL[[3]]<- rbind(
    cbind(data4$matching1N3.SQ001_SQ001.[i], data4$matching1N3.SQ002_SQ001.[i], data4$matching1N3.SQ003_SQ001.[i], data4$matching1N3.SQ004_SQ001.[i], data4$matching1N3.SQ005_SQ001.[i]),
    cbind(data4$matching1N3.SQ001_SQ002.[i], data4$matching1N3.SQ002_SQ002.[i], data4$matching1N3.SQ003_SQ002.[i], data4$matching1N3.SQ004_SQ002.[i], data4$matching1N3.SQ005_SQ002.[i]),
    cbind(data4$matching1N3.SQ001_SQ003.[i], data4$matching1N3.SQ002_SQ003.[i], data4$matching1N3.SQ003_SQ003.[i], data4$matching1N3.SQ004_SQ003.[i], data4$matching1N3.SQ005_SQ003.[i]))
  matchingL[[4]]<- rbind(
    cbind(data4$matching1N4.SQ001_SQ001.[i], data4$matching1N4.SQ002_SQ001.[i], data4$matching1N4.SQ003_SQ001.[i], data4$matching1N4.SQ004_SQ001.[i], data4$matching1N4.SQ005_SQ001.[i]),
    cbind(data4$matching1N4.SQ001_SQ002.[i], data4$matching1N4.SQ002_SQ002.[i], data4$matching1N4.SQ003_SQ002.[i], data4$matching1N4.SQ004_SQ002.[i], data4$matching1N4.SQ005_SQ002.[i]),
    cbind(data4$matching1N4.SQ001_SQ003.[i], data4$matching1N4.SQ002_SQ003.[i], data4$matching1N4.SQ003_SQ003.[i], data4$matching1N4.SQ004_SQ003.[i], data4$matching1N4.SQ005_SQ003.[i]),
    cbind(data4$matching1N4.SQ001_SQ004.[i], data4$matching1N4.SQ002_SQ004.[i], data4$matching1N4.SQ003_SQ004.[i], data4$matching1N4.SQ004_SQ004.[i], data4$matching1N4.SQ005_SQ004.[i]))
  matchingL[[5]]<- rbind(
    cbind(data4$matching1N5.SQ001_SQ001.[i], data4$matching1N5.SQ002_SQ001.[i], data4$matching1N5.SQ003_SQ001.[i], data4$matching1N5.SQ004_SQ001.[i], data4$matching1N5.SQ005_SQ001.[i]),
    cbind(data4$matching1N5.SQ001_SQ002.[i], data4$matching1N5.SQ002_SQ002.[i], data4$matching1N5.SQ003_SQ002.[i], data4$matching1N5.SQ004_SQ002.[i], data4$matching1N5.SQ005_SQ002.[i]),
    cbind(data4$matching1N5.SQ001_SQ003.[i], data4$matching1N5.SQ002_SQ003.[i], data4$matching1N5.SQ003_SQ003.[i], data4$matching1N5.SQ004_SQ003.[i], data4$matching1N5.SQ005_SQ003.[i]),
    cbind(data4$matching1N5.SQ001_SQ004.[i], data4$matching1N5.SQ002_SQ004.[i], data4$matching1N5.SQ003_SQ004.[i], data4$matching1N5.SQ004_SQ004.[i], data4$matching1N5.SQ005_SQ004.[i]),
    cbind(data4$matching1N5.SQ001_SQ005.[i], data4$matching1N5.SQ002_SQ005.[i], data4$matching1N5.SQ003_SQ005.[i], data4$matching1N5.SQ004_SQ005.[i], data4$matching1N5.SQ005_SQ005.[i]))
  matchingList[[i]] <- matchingL
}

# the combination of the matching matrices and the netsizes for ego allows me to match the names myself.
for (i in 1:length(matchingList)) {     # for ego i
  mL <- matchingList[[i]]               # get the matching list
  ns <- ns2[[i]]                        # get the size of egonet2
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # retrieve the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net2[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name2[which(alterL[[i]]$alterid==matched[,2])] <- net[matched[,1]]
    }
  }
}

matchingList2 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching2L <- list()
  matching2L[[1]] <- cbind(data4$matching2N1.SQ001_SQ001.[i],data4$matching2N1.SQ002_SQ001.[i],data4$matching2N1.SQ003_SQ001.[i],data4$matching2N1.SQ004_SQ001.[i],data4$matching2N1.SQ005_SQ001.[i],data4$matching2N1.SQ006_SQ001.[i],data4$matching2N1.SQ007_SQ001.[i],data4$matching2N1.SQ008_SQ001.[i],data4$matching2N1.SQ009_SQ001.[i],data4$matching2N1.SQ010_SQ001.[i])
  matching2L[[2]] <- rbind(
    cbind(data4$matching2N2.SQ001_SQ001.[i],data4$matching2N2.SQ002_SQ001.[i],data4$matching2N2.SQ003_SQ001.[i],data4$matching2N2.SQ004_SQ001.[i],data4$matching2N2.SQ005_SQ001.[i],data4$matching2N2.SQ006_SQ001.[i],data4$matching2N2.SQ007_SQ001.[i],data4$matching2N2.SQ008_SQ001.[i],data4$matching2N2.SQ009_SQ001.[i],data4$matching2N2.SQ010_SQ001.[i]),
    cbind(data4$matching2N2.SQ001_SQ002.[i],data4$matching2N2.SQ002_SQ002.[i],data4$matching2N2.SQ003_SQ002.[i],data4$matching2N2.SQ004_SQ002.[i],data4$matching2N2.SQ005_SQ002.[i],data4$matching2N2.SQ006_SQ002.[i],data4$matching2N2.SQ007_SQ002.[i],data4$matching2N2.SQ008_SQ002.[i],data4$matching2N2.SQ009_SQ002.[i],data4$matching2N2.SQ010_SQ002.[i]))
  matching2L[[3]] <- rbind(
    cbind(data4$matching2N3.SQ001_SQ001.[i],data4$matching2N3.SQ002_SQ001.[i],data4$matching2N3.SQ003_SQ001.[i],data4$matching2N3.SQ004_SQ001.[i],data4$matching2N3.SQ005_SQ001.[i],data4$matching2N3.SQ006_SQ001.[i],data4$matching2N3.SQ007_SQ001.[i],data4$matching2N3.SQ008_SQ001.[i],data4$matching2N3.SQ009_SQ001.[i],data4$matching2N3.SQ010_SQ001.[i]),
    cbind(data4$matching2N3.SQ001_SQ002.[i],data4$matching2N3.SQ002_SQ002.[i],data4$matching2N3.SQ003_SQ002.[i],data4$matching2N3.SQ004_SQ002.[i],data4$matching2N3.SQ005_SQ002.[i],data4$matching2N3.SQ006_SQ002.[i],data4$matching2N3.SQ007_SQ002.[i],data4$matching2N3.SQ008_SQ002.[i],data4$matching2N3.SQ009_SQ002.[i],data4$matching2N3.SQ010_SQ002.[i]),
    cbind(data4$matching2N3.SQ001_SQ003.[i],data4$matching2N3.SQ002_SQ003.[i],data4$matching2N3.SQ003_SQ003.[i],data4$matching2N3.SQ004_SQ003.[i],data4$matching2N3.SQ005_SQ003.[i],data4$matching2N3.SQ006_SQ003.[i],data4$matching2N3.SQ007_SQ003.[i],data4$matching2N3.SQ008_SQ003.[i],data4$matching2N3.SQ009_SQ003.[i],data4$matching2N3.SQ010_SQ003.[i]))
  matching2L[[4]] <- rbind(
    cbind(data4$matching2N4.SQ001_SQ001.[i],data4$matching2N4.SQ002_SQ001.[i],data4$matching2N4.SQ003_SQ001.[i],data4$matching2N4.SQ004_SQ001.[i],data4$matching2N4.SQ005_SQ001.[i],data4$matching2N4.SQ006_SQ001.[i],data4$matching2N4.SQ007_SQ001.[i],data4$matching2N4.SQ008_SQ001.[i],data4$matching2N4.SQ009_SQ001.[i],data4$matching2N4.SQ010_SQ001.[i]),
    cbind(data4$matching2N4.SQ001_SQ002.[i],data4$matching2N4.SQ002_SQ002.[i],data4$matching2N4.SQ003_SQ002.[i],data4$matching2N4.SQ004_SQ002.[i],data4$matching2N4.SQ005_SQ002.[i],data4$matching2N4.SQ006_SQ002.[i],data4$matching2N4.SQ007_SQ002.[i],data4$matching2N4.SQ008_SQ002.[i],data4$matching2N4.SQ009_SQ002.[i],data4$matching2N4.SQ010_SQ002.[i]),
    cbind(data4$matching2N4.SQ001_SQ003.[i],data4$matching2N4.SQ002_SQ003.[i],data4$matching2N4.SQ003_SQ003.[i],data4$matching2N4.SQ004_SQ003.[i],data4$matching2N4.SQ005_SQ003.[i],data4$matching2N4.SQ006_SQ003.[i],data4$matching2N4.SQ007_SQ003.[i],data4$matching2N4.SQ008_SQ003.[i],data4$matching2N4.SQ009_SQ003.[i],data4$matching2N4.SQ010_SQ003.[i]),
    cbind(data4$matching2N4.SQ001_SQ004.[i],data4$matching2N4.SQ002_SQ004.[i],data4$matching2N4.SQ003_SQ004.[i],data4$matching2N4.SQ004_SQ004.[i],data4$matching2N4.SQ005_SQ004.[i],data4$matching2N4.SQ006_SQ004.[i],data4$matching2N4.SQ007_SQ004.[i],data4$matching2N4.SQ008_SQ004.[i],data4$matching2N4.SQ009_SQ004.[i],data4$matching2N4.SQ010_SQ004.[i]))
  matching2L[[5]] <- rbind(
    cbind(data4$matching2N5.SQ001_SQ001.[i],data4$matching2N5.SQ002_SQ001.[i],data4$matching2N5.SQ003_SQ001.[i],data4$matching2N5.SQ004_SQ001.[i],data4$matching2N5.SQ005_SQ001.[i],data4$matching2N5.SQ006_SQ001.[i],data4$matching2N5.SQ007_SQ001.[i],data4$matching2N5.SQ008_SQ001.[i],data4$matching2N5.SQ009_SQ001.[i],data4$matching2N5.SQ010_SQ001.[i]),
    cbind(data4$matching2N5.SQ001_SQ002.[i],data4$matching2N5.SQ002_SQ002.[i],data4$matching2N5.SQ003_SQ002.[i],data4$matching2N5.SQ004_SQ002.[i],data4$matching2N5.SQ005_SQ002.[i],data4$matching2N5.SQ006_SQ002.[i],data4$matching2N5.SQ007_SQ002.[i],data4$matching2N5.SQ008_SQ002.[i],data4$matching2N5.SQ009_SQ002.[i],data4$matching2N5.SQ010_SQ002.[i]),
    cbind(data4$matching2N5.SQ001_SQ003.[i],data4$matching2N5.SQ002_SQ003.[i],data4$matching2N5.SQ003_SQ003.[i],data4$matching2N5.SQ004_SQ003.[i],data4$matching2N5.SQ005_SQ003.[i],data4$matching2N5.SQ006_SQ003.[i],data4$matching2N5.SQ007_SQ003.[i],data4$matching2N5.SQ008_SQ003.[i],data4$matching2N5.SQ009_SQ003.[i],data4$matching2N5.SQ010_SQ003.[i]),
    cbind(data4$matching2N5.SQ001_SQ004.[i],data4$matching2N5.SQ002_SQ004.[i],data4$matching2N5.SQ003_SQ004.[i],data4$matching2N5.SQ004_SQ004.[i],data4$matching2N5.SQ005_SQ004.[i],data4$matching2N5.SQ006_SQ004.[i],data4$matching2N5.SQ007_SQ004.[i],data4$matching2N5.SQ008_SQ004.[i],data4$matching2N5.SQ009_SQ004.[i],data4$matching2N5.SQ010_SQ004.[i]),
    cbind(data4$matching2N5.SQ001_SQ005.[i],data4$matching2N5.SQ002_SQ005.[i],data4$matching2N5.SQ003_SQ005.[i],data4$matching2N5.SQ004_SQ005.[i],data4$matching2N5.SQ005_SQ005.[i],data4$matching2N5.SQ006_SQ005.[i],data4$matching2N5.SQ007_SQ005.[i],data4$matching2N5.SQ008_SQ005.[i],data4$matching2N5.SQ009_SQ005.[i],data4$matching2N5.SQ010_SQ005.[i]))
  matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {    # for ego i
  mL <- matchingList2[[i]]              # get the matching list 2
  ns <- ns3[[i]]                        # get the size of egonet3
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net3[i,]
    
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name3[matched[,2]] <- net[matched[,1]]
    }
  }
}

matchingList3 <- list()
for (i in 1:length(alterL)) { # for ego i
  matching3L <- list()
  matching3L[[1]] <- cbind(data4$matching3N1.SQ001_SQ001.[i],data4$matching3N1.SQ002_SQ001.[i],data4$matching3N1.SQ003_SQ001.[i],data4$matching3N1.SQ004_SQ001.[i],data4$matching3N1.SQ005_SQ001.[i],data4$matching3N1.SQ006_SQ001.[i],data4$matching3N1.SQ007_SQ001.[i],data4$matching3N1.SQ008_SQ001.[i],data4$matching3N1.SQ009_SQ001.[i],data4$matching3N1.SQ010_SQ001.[i], data4$matching3N1.SQ011_SQ001.[i], data4$matching3N1.SQ012_SQ001.[i], data4$matching3N1.SQ013_SQ001.[i], data4$matching3N1.SQ014_SQ001.[i], data4$matching3N1.SQ015_SQ001.[i])
  matching3L[[2]] <- rbind(
    cbind(data4$matching3N2.SQ001_SQ001.[i],data4$matching3N2.SQ002_SQ001.[i],data4$matching3N2.SQ003_SQ001.[i],data4$matching3N2.SQ004_SQ001.[i],data4$matching3N2.SQ005_SQ001.[i],data4$matching3N2.SQ006_SQ001.[i],data4$matching3N2.SQ007_SQ001.[i],data4$matching3N2.SQ008_SQ001.[i],data4$matching3N2.SQ009_SQ001.[i],data4$matching3N2.SQ010_SQ001.[i], data4$matching3N2.SQ011_SQ001.[i], data4$matching3N2.SQ012_SQ001.[i], data4$matching3N2.SQ013_SQ001.[i], data4$matching3N2.SQ014_SQ001.[i], data4$matching3N2.SQ015_SQ001.[i]),
    cbind(data4$matching3N2.SQ001_SQ002.[i],data4$matching3N2.SQ002_SQ002.[i],data4$matching3N2.SQ003_SQ002.[i],data4$matching3N2.SQ004_SQ002.[i],data4$matching3N2.SQ005_SQ002.[i],data4$matching3N2.SQ006_SQ002.[i],data4$matching3N2.SQ007_SQ002.[i],data4$matching3N2.SQ008_SQ002.[i],data4$matching3N2.SQ009_SQ002.[i],data4$matching3N2.SQ010_SQ002.[i], data4$matching3N2.SQ011_SQ002.[i], data4$matching3N2.SQ012_SQ002.[i], data4$matching3N2.SQ013_SQ002.[i], data4$matching3N2.SQ014_SQ002.[i], data4$matching3N2.SQ015_SQ002.[i]))
  matching3L[[3]] <- rbind(
    cbind(data4$matching3N3.SQ001_SQ001.[i],data4$matching3N3.SQ002_SQ001.[i],data4$matching3N3.SQ003_SQ001.[i],data4$matching3N3.SQ004_SQ001.[i],data4$matching3N3.SQ005_SQ001.[i],data4$matching3N3.SQ006_SQ001.[i],data4$matching3N3.SQ007_SQ001.[i],data4$matching3N3.SQ008_SQ001.[i],data4$matching3N3.SQ009_SQ001.[i],data4$matching3N3.SQ010_SQ001.[i], data4$matching3N3.SQ011_SQ001.[i], data4$matching3N3.SQ012_SQ001.[i], data4$matching3N3.SQ013_SQ001.[i], data4$matching3N3.SQ014_SQ001.[i], data4$matching3N3.SQ015_SQ001.[i]),
    cbind(data4$matching3N3.SQ001_SQ002.[i],data4$matching3N3.SQ002_SQ002.[i],data4$matching3N3.SQ003_SQ002.[i],data4$matching3N3.SQ004_SQ002.[i],data4$matching3N3.SQ005_SQ002.[i],data4$matching3N3.SQ006_SQ002.[i],data4$matching3N3.SQ007_SQ002.[i],data4$matching3N3.SQ008_SQ002.[i],data4$matching3N3.SQ009_SQ002.[i],data4$matching3N3.SQ010_SQ002.[i], data4$matching3N3.SQ011_SQ002.[i], data4$matching3N3.SQ012_SQ002.[i], data4$matching3N3.SQ013_SQ002.[i], data4$matching3N3.SQ014_SQ002.[i], data4$matching3N3.SQ015_SQ002.[i]),
    cbind(data4$matching3N3.SQ001_SQ003.[i],data4$matching3N3.SQ002_SQ003.[i],data4$matching3N3.SQ003_SQ003.[i],data4$matching3N3.SQ004_SQ003.[i],data4$matching3N3.SQ005_SQ003.[i],data4$matching3N3.SQ006_SQ003.[i],data4$matching3N3.SQ007_SQ003.[i],data4$matching3N3.SQ008_SQ003.[i],data4$matching3N3.SQ009_SQ003.[i],data4$matching3N3.SQ010_SQ003.[i], data4$matching3N3.SQ011_SQ003.[i], data4$matching3N3.SQ012_SQ003.[i], data4$matching3N3.SQ013_SQ003.[i], data4$matching3N3.SQ014_SQ003.[i], data4$matching3N3.SQ015_SQ003.[i]))
  matching3L[[4]] <- rbind(
    cbind(data4$matching3N4.SQ001_SQ001.[i],data4$matching3N4.SQ002_SQ001.[i],data4$matching3N4.SQ003_SQ001.[i],data4$matching3N4.SQ004_SQ001.[i],data4$matching3N4.SQ005_SQ001.[i],data4$matching3N4.SQ006_SQ001.[i],data4$matching3N4.SQ007_SQ001.[i],data4$matching3N4.SQ008_SQ001.[i],data4$matching3N4.SQ009_SQ001.[i],data4$matching3N4.SQ010_SQ001.[i], data4$matching3N4.SQ011_SQ001.[i], data4$matching3N4.SQ012_SQ001.[i], data4$matching3N4.SQ013_SQ001.[i], data4$matching3N4.SQ014_SQ001.[i], data4$matching3N4.SQ015_SQ001.[i]),
    cbind(data4$matching3N4.SQ001_SQ002.[i],data4$matching3N4.SQ002_SQ002.[i],data4$matching3N4.SQ003_SQ002.[i],data4$matching3N4.SQ004_SQ002.[i],data4$matching3N4.SQ005_SQ002.[i],data4$matching3N4.SQ006_SQ002.[i],data4$matching3N4.SQ007_SQ002.[i],data4$matching3N4.SQ008_SQ002.[i],data4$matching3N4.SQ009_SQ002.[i],data4$matching3N4.SQ010_SQ002.[i], data4$matching3N4.SQ011_SQ002.[i], data4$matching3N4.SQ012_SQ002.[i], data4$matching3N4.SQ013_SQ002.[i], data4$matching3N4.SQ014_SQ002.[i], data4$matching3N4.SQ015_SQ002.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ003.[i],data4$matching3N4.SQ002_SQ003.[i],data4$matching3N4.SQ003_SQ003.[i],data4$matching3N4.SQ004_SQ003.[i],data4$matching3N4.SQ005_SQ003.[i],data4$matching3N4.SQ006_SQ003.[i],data4$matching3N4.SQ007_SQ003.[i],data4$matching3N4.SQ008_SQ003.[i],data4$matching3N4.SQ009_SQ003.[i],data4$matching3N4.SQ010_SQ003.[i], data4$matching3N4.SQ011_SQ003.[i], data4$matching3N4.SQ012_SQ003.[i], data4$matching3N4.SQ013_SQ003.[i], data4$matching3N4.SQ014_SQ003.[i], data4$matching3N4.SQ015_SQ003.[i]),
    cbind(data4$matching3N4.SQ001_SQ004.[i],data4$matching3N4.SQ002_SQ004.[i],data4$matching3N4.SQ003_SQ004.[i],data4$matching3N4.SQ004_SQ004.[i],data4$matching3N4.SQ005_SQ004.[i],data4$matching3N4.SQ006_SQ004.[i],data4$matching3N4.SQ007_SQ004.[i],data4$matching3N4.SQ008_SQ004.[i],data4$matching3N4.SQ009_SQ004.[i],data4$matching3N4.SQ010_SQ004.[i], data4$matching3N4.SQ011_SQ004.[i], data4$matching3N4.SQ012_SQ004.[i], data4$matching3N4.SQ013_SQ004.[i], data4$matching3N4.SQ014_SQ004.[i], data4$matching3N4.SQ015_SQ004.[i]))
  matching3L[[5]] <- rbind(
    cbind(data4$matching3N5.SQ001_SQ001.[i],data4$matching3N5.SQ002_SQ001.[i],data4$matching3N5.SQ003_SQ001.[i],data4$matching3N5.SQ004_SQ001.[i],data4$matching3N5.SQ005_SQ001.[i],data4$matching3N5.SQ006_SQ001.[i],data4$matching3N5.SQ007_SQ001.[i],data4$matching3N5.SQ008_SQ001.[i],data4$matching3N5.SQ009_SQ001.[i],data4$matching3N5.SQ010_SQ001.[i], data4$matching3N5.SQ011_SQ001.[i], data4$matching3N5.SQ012_SQ001.[i], data4$matching3N5.SQ013_SQ001.[i], data4$matching3N5.SQ014_SQ001.[i], data4$matching3N5.SQ015_SQ001.[i]),
    cbind(data4$matching3N5.SQ001_SQ002.[i],data4$matching3N5.SQ002_SQ002.[i],data4$matching3N5.SQ003_SQ002.[i],data4$matching3N5.SQ004_SQ002.[i],data4$matching3N5.SQ005_SQ002.[i],data4$matching3N5.SQ006_SQ002.[i],data4$matching3N5.SQ007_SQ002.[i],data4$matching3N5.SQ008_SQ002.[i],data4$matching3N5.SQ009_SQ002.[i],data4$matching3N5.SQ010_SQ002.[i], data4$matching3N5.SQ011_SQ002.[i], data4$matching3N5.SQ012_SQ002.[i], data4$matching3N5.SQ013_SQ002.[i], data4$matching3N5.SQ014_SQ002.[i], data4$matching3N5.SQ015_SQ002.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ003.[i],data4$matching3N5.SQ002_SQ003.[i],data4$matching3N5.SQ003_SQ003.[i],data4$matching3N5.SQ004_SQ003.[i],data4$matching3N5.SQ005_SQ003.[i],data4$matching3N5.SQ006_SQ003.[i],data4$matching3N5.SQ007_SQ003.[i],data4$matching3N5.SQ008_SQ003.[i],data4$matching3N5.SQ009_SQ003.[i],data4$matching3N5.SQ010_SQ003.[i], data4$matching3N5.SQ011_SQ003.[i], data4$matching3N5.SQ012_SQ003.[i], data4$matching3N5.SQ013_SQ003.[i], data4$matching3N5.SQ014_SQ003.[i], data4$matching3N5.SQ015_SQ003.[i]),
    cbind(data4$matching3N5.SQ001_SQ005.[i],data4$matching3N5.SQ002_SQ005.[i],data4$matching3N5.SQ003_SQ005.[i],data4$matching3N5.SQ004_SQ005.[i],data4$matching3N5.SQ005_SQ005.[i],data4$matching3N5.SQ006_SQ005.[i],data4$matching3N5.SQ007_SQ005.[i],data4$matching3N5.SQ008_SQ005.[i],data4$matching3N5.SQ009_SQ005.[i],data4$matching3N5.SQ010_SQ005.[i], data4$matching3N5.SQ011_SQ005.[i], data4$matching3N5.SQ012_SQ005.[i], data4$matching3N5.SQ013_SQ005.[i], data4$matching3N5.SQ014_SQ005.[i], data4$matching3N5.SQ015_SQ005.[i]))
  matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {    # for ego i
  mL <- matchingList3[[i]]              # get the matching list 2
  ns <- ns4[[i]]                        # get the size of egonet4
  if(ns>0) {                            # if ns=0, no matching was done!
    mm <- as.matrix(mL[[ns]])           # and the corresponding matrix
    matched <- which(mm==1, arr.ind=T)  # retrieve array indices
    net <- net4[i,]
    if(length(matched)>0) {             # if matching was performed!
      alterL[[i]]$name4[matched[,2]] <- net[matched[,1]]
    }
  }
}

#i also calculate structural embeddedness (alter-level) per ego-net.
for (i in 1:length(alterL)) { # for ego i

  #get number of names listed in the egonets
  nnames_cdn <- length(which(data4[i,c("egonet1.SQ001.","egonet1.SQ002.","egonet1.SQ003.","egonet1.SQ004.","egonet1.SQ005.")]!=""))
  nnames_study <- length(which(data4[i,c("egonet2.SQ001.","egonet2.SQ002.","egonet2.SQ003.","egonet2.SQ004.","egonet2.SQ005.")]!=""))
  nnames_bff <- length(which(data4[i,c("egonet3.SQ001.","egonet3.SQ002.","egonet3.SQ003.","egonet3.SQ004.","egonet3.SQ005.")]!=""))
  nnames_csn <- length(which(data4[i,c("egonet4.SQ001.","egonet4.SQ002.","egonet4.SQ003.","egonet4.SQ004.","egonet4.SQ005.")]!=""))
  
  #CDN
  
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj1N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj1N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj1N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj1N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj1N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj1N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj1N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj1N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj1N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj1N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj1N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj1N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj1N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj1N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj1N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj1N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj1N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj1N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj1N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj1N5d.SQ001.[i]
  }

  if(nnames_cdn>1) { #we only know alter-alter relations for nnames>1
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_cdn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
  
  #CDN: 1:nnames_CDN
  alterL[[i]]$cdn_embed.t2[1:nnames_cdn] <- embed 
  }
  
  #STUDY

  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj2N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj2N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj2N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj2N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj2N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj2N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj2N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj2N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj2N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj2N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj2N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj2N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj2N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj2N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj2N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj2N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj2N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj2N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj2N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj2N5d.SQ001.[i]
  }

  if(nnames_study>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_study]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$study_embed.t2[6:(5+nnames_study)] <- embed 
  }
  
  # BEST FRIENDS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj3N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj3N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj3N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj3N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj3N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj3N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj3N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj3N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj3N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj3N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj3N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj3N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj3N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj3N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj3N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj3N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj3N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj3N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj3N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj3N5d.SQ001.[i]
  }

  if(nnames_bff>1) { #we only know alter-alter relations for nnames
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_bff]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$bff_embed.t2[11:(10+nnames_bff)] <- embed 
  }

  # SPORTS PARTNERS
  #make list of adjacency matrices
  adjL <- list()
  {
  #2 alters
  adjL[[2]] <- matrix(NA,ncol=2,nrow=2)
  adjL[[2]][1,2] <- adjL[[2]][2,1] <- data4$adj4N2a.SQ001.[i]

  #3 alters
  adjL[[3]] <- matrix(NA,ncol=3,nrow=3)
  adjL[[3]][1,2] <- adjL[[3]][2,1] <- data4$adj4N3a.SQ001.[i]
  adjL[[3]][1,3] <- adjL[[3]][3,1] <- data4$adj4N3a.SQ002.[i]
  adjL[[3]][2,3] <- adjL[[3]][3,2] <- data4$adj4N3b.SQ001.[i]

  #4 alters
  adjL[[4]] <- matrix(NA,ncol=4,nrow=4)
  adjL[[4]][1,2] <- adjL[[4]][2,1] <- data4$adj4N4a.SQ001.[i]
  adjL[[4]][1,3] <- adjL[[4]][3,1] <- data4$adj4N4a.SQ002.[i]
  adjL[[4]][1,4] <- adjL[[4]][4,1] <- data4$adj4N4a.SQ003.[i]
  adjL[[4]][2,3] <- adjL[[4]][3,2] <- data4$adj4N4b.SQ001.[i]
  adjL[[4]][2,4] <- adjL[[4]][4,2] <- data4$adj4N4b.SQ002.[i]
  adjL[[4]][3,4] <- adjL[[4]][4,3] <- data4$adj4N4c.SQ001.[i]

  #5 alters
  adjL[[5]] <- matrix(NA,ncol=5,nrow=5)
  adjL[[5]][1,2] <- adjL[[5]][2,1] <- data4$adj4N5a.SQ001.[i]
  adjL[[5]][1,3] <- adjL[[5]][3,1] <- data4$adj4N5a.SQ002.[i]
  adjL[[5]][1,4] <- adjL[[5]][4,1] <- data4$adj4N5a.SQ003.[i]
  adjL[[5]][1,5] <- adjL[[5]][5,1] <- data4$adj4N5a.SQ004.[i]
  adjL[[5]][2,3] <- adjL[[5]][3,2] <- data4$adj4N5b.SQ001.[i]
  adjL[[5]][2,4] <- adjL[[5]][4,2] <- data4$adj4N5b.SQ002.[i]
  adjL[[5]][2,5] <- adjL[[5]][5,2] <- data4$adj4N5b.SQ003.[i]
  adjL[[5]][3,4] <- adjL[[5]][4,3] <- data4$adj4N5c.SQ001.[i]
  adjL[[5]][3,5] <- adjL[[5]][5,3] <- data4$adj4N5c.SQ002.[i]
  adjL[[5]][4,5] <- adjL[[5]][5,4] <- data4$adj4N5d.SQ001.[i]
  }

  if(nnames_csn>1) { #we only know alter-alter relations for nnames>2
    #take the matrix corresponding the nnames
    mat <- adjL[[nnames_csn]]
    
    #ties that are (very) close are 1
    mat[!is.na(mat)] <- ifelse(mat[!is.na(mat)]=="Erg hecht" | mat[!is.na(mat)]=="Hecht", 1,0)

    #calculate embeddedness for each alter/row:
    embed <- apply(mat, 1, function(row) {
    n_cols <- sum(!is.na(row))
    n_ones <- sum(row == "1", na.rm = TRUE)
    ratio <- n_ones / n_cols
    return(ratio)
    })
    
    alterL[[i]]$csn_embed.t2[16:(15+nnames_csn)] <- embed 
  }
}

#alters could be named in multiple name generators. each element of alterL contains rows corresponding to alters that may be 'duplicates'.
#i match the structural embeddedness measures

for (i in 1:length(alterL)) { #for ego i 
  for (j in 1:nrow(alterL[[i]])) { #for alter j
 
    #if name2 is not empty, alter j was matched to the study network; and more precisely, to the study partner with name1: alterL[[i]]$name2[j]
    alterL[[i]]$study_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name2[j]), 
                                            alterL[[i]]$study_embed.t2[which(alterL[[i]]$name1==alterL[[i]]$name2[j] & !is.na(alterL[[i]]$study_embed.t2))], 
                                            alterL[[i]]$study_embed.t2[j])
    
    #if name3 is not empty, alter j was matched to the friends network; and more precisely, to the friend with name1: alterL[[i]]$name3[j]
    alterL[[i]]$bff_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name3[j]), 
                                          alterL[[i]]$bff_embed.t2[which(alterL[[i]]$name1 == alterL[[i]]$name3[j] & !is.na(alterL[[i]]$bff_embed.t2))], 
                                          alterL[[i]]$bff_embed.t2[j])
    
    #if name4 is not empty, alter j was matched to the sports network; and more precisely, to the sports partner with name1: alterL[[i]]$name4[j]
    alterL[[i]]$csn_embed.t2[j] <- ifelse(!is.na(alterL[[i]]$name4[j]), 
                                          alterL[[i]]$csn_embed.t2[which(alterL[[i]]$name1 == alterL[[i]]$name4[j] & !is.na(alterL[[i]]$csn_embed.t2))],
                                          alterL[[i]]$csn_embed.t2[j] )

  }
}

#while in wave 1, only the unique alters were listed in the gender-name interpreters
#in wave 2, only the NEW alters were listed (since it is a stable characteristic)
#so only the non-matched alters that did not appear in w1
#i asked respondents to 'check' males.

#gender
df_males <- data.frame(p1 = data4$males.SQ001.,p2 = data4$males.SQ002.,p3 = data4$males.SQ003.,p4 = data4$males.SQ004.,p5 = data4$males.SQ005.,p6 = data4$males.SQ006.,p7 = data4$males.SQ007.,p8 = data4$males.SQ008.,p9 = data4$males.SQ009.,p10= data4$males.SQ010.,p11= data4$males.SQ011.,p12= data4$males.SQ012.,p13= data4$males.SQ013.,p14= data4$males.SQ014.,p15= data4$males.SQ015.,p16= data4$males.SQ016.,p17= data4$males.SQ017.,p18= data4$males.SQ018.,p19= data4$males.SQ019.,p20= data4$males.SQ020.)

#kin 
df_kin <- data.frame(p1 = data4$kin.SQ001.,p2 = data4$kin.SQ002.,p3 = data4$kin.SQ003.,p4 = data4$kin.SQ004.,p5 = data4$kin.SQ005.,p6 = data4$kin.SQ006.,p7 = data4$kin.SQ007.,p8 = data4$kin.SQ008.,p9 = data4$kin.SQ009., p10= data4$kin.SQ010., p11= data4$kin.SQ011., p12= data4$kin.SQ012., p13= data4$kin.SQ013., p14= data4$kin.SQ014.,p15= data4$kin.SQ015., p16= data4$kin.SQ016., p17= data4$kin.SQ017., p18= data4$kin.SQ018., p19= data4$kin.SQ019., p20= data4$kin.SQ020.)

#age 
df_age <- data.frame(p1 = data4$age.SQ001.,p2 = data4$age.SQ002.,p3 = data4$age.SQ003.,p4 = data4$age.SQ004.,p5 = data4$age.SQ005.,p6 = data4$age.SQ006.,p7 = data4$age.SQ007.,p8 = data4$age.SQ008.,p9 = data4$age.SQ009., p10= data4$age.SQ010., p11= data4$age.SQ011., p12= data4$age.SQ012., p13= data4$age.SQ013., p14= data4$age.SQ014.,p15= data4$age.SQ015., p16= data4$age.SQ016., p17= data4$age.SQ017., p18= data4$age.SQ018., p19= data4$age.SQ019., p20= data4$age.SQ020.)

#educ 
df_educ <- data.frame(p1 = data4$educ.SQ001.,p2 = data4$educ.SQ002.,p3 = data4$educ.SQ003.,p4 = data4$educ.SQ004.,p5 = data4$educ.SQ005.,p6 = data4$educ.SQ006.,p7 = data4$educ.SQ007.,p8 = data4$educ.SQ008.,p9 = data4$educ.SQ009., p10= data4$educ.SQ010., p11= data4$educ.SQ011., p12= data4$educ.SQ012., p13= data4$educ.SQ013., p14= data4$educ.SQ014.,p15= data4$educ.SQ015., p16= data4$educ.SQ016., p17= data4$educ.SQ017., p18= data4$educ.SQ018., p19= data4$educ.SQ019., p20= data4$educ.SQ020.)

#duration 
df_duration <- data.frame(p1 = data4$duur.SQ001.,p2 = data4$duur.SQ002.,p3 = data4$duur.SQ003.,p4 = data4$duur.SQ004.,p5 = data4$duur.SQ005.,p6 = data4$duur.SQ006.,p7 = data4$duur.SQ007.,p8 = data4$duur.SQ008.,p9 = data4$duur.SQ009.,p10= data4$duur.SQ010.,p11= data4$duur.SQ011.,p12= data4$duur.SQ012.,p13= data4$duur.SQ013.,p14= data4$duur.SQ014.,p15= data4$duur.SQ015.,p16= data4$duur.SQ016.,p17= data4$duur.SQ017.,p18= data4$duur.SQ018.,p19= data4$duur.SQ019.,p20= data4$duur.SQ020.)

#proximity
df_proximity <- data.frame(p1 = data4$prox.SQ001.,p2 = data4$prox.SQ002.,p3 = data4$prox.SQ003.,p4 = data4$prox.SQ004.,p5 = data4$prox.SQ005.,p6 = data4$prox.SQ006.,p7 = data4$prox.SQ007.,p8 = data4$prox.SQ008., p9 = data4$prox.SQ009.,p10= data4$prox.SQ010., p11= data4$prox.SQ011., p12= data4$prox.SQ012., p13= data4$prox.SQ013., p14= data4$prox.SQ014., p15= data4$prox.SQ015., p16= data4$prox.SQ016., p17= data4$prox.SQ017., p18= data4$prox.SQ018., p19= data4$prox.SQ019., p20= data4$prox.SQ020.)

#and dynamic
#communication frequency
df_freq <- data.frame(p1 = data4$freq.SQ001.,p2 = data4$freq.SQ002.,p3 = data4$freq.SQ003.,p4 = data4$freq.SQ004.,p5 = data4$freq.SQ005.,p6 = data4$freq.SQ006.,p7 = data4$freq.SQ007.,p8 = data4$freq.SQ008., p9 = data4$freq.SQ009.,p10= data4$freq.SQ010., p11= data4$freq.SQ011., p12= data4$freq.SQ012., p13= data4$freq.SQ013., p14= data4$freq.SQ014., p15= data4$freq.SQ015., p16= data4$freq.SQ016., p17= data4$freq.SQ017., p18= data4$freq.SQ018., p19= data4$freq.SQ019., p20= data4$freq.SQ020.)

#closeness
df_close <- data.frame(p1 = data4$close.SQ001.,p2 = data4$close.SQ002.,p3 = data4$close.SQ003.,p4 = data4$close.SQ004.,p5 = data4$close.SQ005.,p6 = data4$close.SQ006.,p7 = data4$close.SQ007.,p8 = data4$close.SQ008., p9 = data4$close.SQ009.,p10= data4$close.SQ010., p11= data4$close.SQ011., p12= data4$close.SQ012., p13= data4$close.SQ013., p14= data4$close.SQ014., p15= data4$close.SQ015., p16= data4$close.SQ016., p17= data4$close.SQ017., p18= data4$close.SQ018., p19= data4$close.SQ019., p20= data4$close.SQ020.)

for (i in 1:length(alterL)) {
  
  alterL[[i]]$alter_gender <- ifelse(unlist(df_males[i,], use.names=F)=="Ja", 0, ifelse(unlist(df_males[i,], use.names=F)=="Nee", 1, NA))
  
  alterL[[i]]$alter_age <- 
    ifelse(unlist(df_age[i,], use.names=F)=="Jonger dan 18 jaar", 16, #???
           ifelse(unlist(df_age[i,], use.names=F)=="18 tot 21 jaar", 20,
                  ifelse(unlist(df_age[i,], use.names=F)=="22 tot 25 jaar", 23,
                         ifelse(unlist(df_age[i,], use.names=F)=="26 tot 30 jaar", 28,
                                ifelse(unlist(df_age[i,], use.names=F)=="31 tot 40 jaar", 35,
                                       ifelse(unlist(df_age[i,], use.names=F)=="Ouder dan 40 jaar", 45, #???
                                              ifelse(unlist(df_age[i,], use.names=F)=="Weet ik niet", NA, # i don't know = missing
                                                     unlist(df_age[i,], use.names=F))))))))
  alterL[[i]]$kin <- ifelse(unlist(df_kin[i,], use.names=F)=="Ja", 1, ifelse(unlist(df_kin[i,], use.names=F)=="Nee", 0, ""))
  
  alterL[[i]]$alter_educ <- ifelse(unlist(df_educ[i,],use.names=F)=="lagere school", 1,
                               ifelse(unlist(df_educ[i,],use.names=F)=="vmbo, mavo", 2,
                                      ifelse(unlist(df_educ[i,],use.names=F)=="mbo", 3,
                                         ifelse(unlist(df_educ[i,],use.names=F)=="havo", 4,
                                            ifelse(unlist(df_educ[i,],use.names=F)=="vwo / gymnasium", 5,
                                                 ifelse(unlist(df_educ[i,],use.names=F)=="hbo", 6,
                                                     ifelse(unlist(df_educ[i,],use.names=F)=="universiteit", 7, NA))))))) 
  
  alterL[[i]]$proximity <- ifelse(unlist(df_proximity[i,], use.names=FALSE) == "In hetzelfde huis", "roommate",
                                  ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In dezelfde buurt" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde straat" |
                                    unlist(df_proximity[i,],use.names=F)=="In dezelfde gemeente", "close",
                                    ifelse(unlist(df_proximity[i,], use.names = FALSE) == "In hetzelfde land" |
                                             unlist(df_proximity[i,], use.names = FALSE) == "In een ander land","far", NA)))
  
  
  
  alterL[[i]]$duration <- ifelse(unlist(df_duration[i,],use.names=F)=="Minder dan 1 jaar", 0, 
                               ifelse(unlist(df_duration[i,],use.names=F)=="1 tot 3 jaar", 2,
                                      ifelse(unlist(df_duration[i,],use.names=F)=="4 tot 8 jaar", 6,
                                             ifelse(unlist(df_duration[i,],use.names=F)=="9 tot 15 jaar", 12,
                                                    ifelse(unlist(df_duration[i,],use.names=F)=="Meer dan 15 jaar", 15,NA )))))
  
  alterL[[i]]$frequency.t2 <- ifelse(unlist(df_freq[i,],use.names=F)=="(Bijna) elke dag", 7,
                               ifelse(unlist(df_freq[i,],use.names=F)=="1-2 keer per week",6,
                                      ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per maand",5, 
                                         ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per maand",4, 
                                            ifelse(unlist(df_freq[i,],use.names=F)=="Aantal keer per jaar",3,
                                                 ifelse(unlist(df_freq[i,],use.names=F)=="Ong. 1 keer per jaar",2,
                                                     ifelse(unlist(df_freq[i,],use.names=F)=="Nooit",1, NA )))))))
  alterL[[i]]$closeness.t2 <- ifelse(unlist(df_close[i,],use.names=F)=="Niet hecht", 1, 
                               ifelse(unlist(df_close[i,],use.names=F)=="Enigszins hecht", 2,
                                      ifelse(unlist(df_close[i,],use.names=F)=="Hecht", 3,
                                             ifelse(unlist(df_close[i,],use.names=F)=="Heel erg hecht", 4, NA ))))
}

#match ego-covars (based on 'df'.) 
for (i in 1:length(alterL)) {
  alterL[[i]]$ego_gender <- df$ego_gender[which(df$ego==1)][1]
  alterL[[i]]$ego_age <- df$ego_age[which(df$ego==1)][1]
  alterL[[i]]$ego_educ <- df$ego_educ[which(df$ego==1)][1]
}

#sameness
for (i in 1:length(alterL))  { # for ego i
  # get attributes of ego
  agei <- alterL[[i]]$ego_age[1]
  genderi <- alterL[[i]]$ego_gender[1]
  edi <- alterL[[i]]$ego_educ[1]
  
  for (j in 1:max(alterL[[i]]$alterid)) { # for alter j
    # calculate "same gender" (0/1)
    genderj <- as.numeric(alterL[[i]]$alter_gender[j]) # get alter j gender
    same <- ifelse(genderi==genderj, 1, 0)
    alterL[[i]]$same_gender[which(alterL[[i]]$alterid==j)] <- same
    
    #same education
    eduj <- alterL[[i]]$alter_educ[j]
    same <- ifelse(eduj==edi, 1, 0)
    alterL[[i]]$sim_educ[which(alterL[[i]]$alterid==j)] <- same
    
    # calculate similarity for age as the absolute difference between alter and ego value
    #get alter j attributes
    agej <- as.numeric(alterL[[i]]$alter_age[j])
    #difference score
    difage <- abs(agei - agej)
    
    # so higher values represent *less* similarity
    if( !is.na (agej) ) { # age similarity only calculable if z_j is known!
        alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- difage
      } else { alterL[[i]]$dif_age[which(alterL[[i]]$alterid==j)] <- NA}
  }
}

#in which egonets did altesr appear at t2?
for (i in 1:length(alterL))  { 
  for (j in 1:nrow(alterL[[i]])) {
    
    #get name(s) of j
    alter <- unlist(alterL[[i]][j,c(5:8)], use.names=FALSE)
    alter <- alter[!is.na(alter)] # exclude NAs
    
    #find out alter j appears in the 4 egonets
    cdn <- alter %in% net1[i,]
    study <- alter %in% net2[i,]
    bff <- alter %in% net3[i,]
    csn <- alter %in% net4[i,]
    
    # and if so, give alter j score 1 on indicators; 0 otherwise
    alterL[[i]]$cdn2[j] <- ifelse("TRUE" %in% cdn, 1, 0)
    alterL[[i]]$study2[j] <- ifelse("TRUE" %in% study, 1, 0)
    alterL[[i]]$bff2[j] <- ifelse("TRUE" %in% bff, 1, 0)
    alterL[[i]]$csn2[j] <- ifelse("TRUE" %in% csn, 1, 0)
  }
}

#calculate multiplexity as an alter/tie attribute (i.e., number of *additional* networks j appeared in)
for (i in 1:length(alterL))  {
  for (j in 1:nrow(alterL[[i]])) {
    alterL[[i]]$multiplex.t2[j] <- rowSums(alterL[[i]][j,c(24:27)]) - 1 #minus one to reach a meaningful intercept
  }
}

#for sports partners, how frequent they participate and how competent they are in the sport they do with ego.
df_altfreq <- data.frame(p1 = data4$altfreq1, p2 = data4$altfreq2, p3 = data4$altfreq3, p4 = data4$altfreq4, p5 = data4$altfreq5)
df_altgrade <- data.frame(p1 = data4$grade1, p2 = data4$grade2, p3 = data4$grade3, p4 = data4$grade4, p5 = data4$grade5)

for (i in 1:length(alterL)) { 
  alterL[[i]]$alter_freq[16:20] <- unlist(df_altfreq[i,], use.names=TRUE)
  alterL[[i]]$alter_grade[16:20] <- unlist(df_altgrade[i,], use.names=TRUE)
}

# i also want to know ego's sports frequency and skills
# ultimately, i want to make a dyadic variable indicating the skill level (difference) of ego and alter, in *the specific sports that they do together*
# for now, i will put ego's sports frequency and skill, per sport, in a dataframe. 

#in wave 2, a different approach to measuring ego sport participation
#1. we asked respondents how frequently they engaged in the sports activities they reported *at w1* (s1a)
#2. they could provide an additional 3 sports they had done in the past semenster
#thus in total maximum of 20 sports types (14 from w1 + 3 others from w1 + 3 new in w2)

egos <- data4 %>%
  select(S1a.SQ001.:S1a.SQ017., S2.SQ001.:S2.SQ003., S2b.SQ001.:S2b.SQ020.)

egos[egos == "Niet"] <- 0
egos[egos == "Minder dan 1 keer per maand"] <- 0.125
egos[egos == "1 keer per maand" ] <- 0.25
egos[egos == "2 keer per maand" ] <- 0.5
egos[egos == "1 keer per week" ] <- 1

#in cases where ego participated more than once a week, get the answer to the questino how often per week he/she participated
for (i in 1:20) {
  egos[,i] <- ifelse(egos[,i] == "Vaker dan 1 keer per week", gsub("\\D", "", egos[,20+i]), egos[,i])
}
egos[,1:20] -> egos
egos <- mutate_all(egos, as.numeric)

#skill
egos2 <- data4 %>%
  select(S2x.SQ001.: S2x.SQ020.)

#first, also save ego's (weekly) sports frequency (averaged over sports types)
#and ego's average/total skill (over sports types)
for (i in 1:length(alterL)) {
  alterL[[i]]$ego_meanfreq <- ifelse( length(which(is.na(egos[i,]))) < 20, rowMeans(egos[i,], na.rm=TRUE), 0) #those without a sports get a 0
  alterL[[i]]$ego_meanskill <- rowMeans(egos2[i,], na.rm = TRUE)
  #and also save number of sports
  alterL[[i]]$ego_nsport <- length(which(!is.na(egos[i,])))
}

#now get for each sports partner in the list of alters, the sports ego does with them

for (i in 1:length(alterL)) { # for ego

  alterL[[i]]$sporttogether[16:20] <-
    
    c( ifelse( length(which( data4[i,] %>%
  select(samenCSN1.SQ001.:samenCSN1.SQ020.) == "Ja" )) > 0,
  which(data4[i,] %>% select(samenCSN1.SQ001.:samenCSN1.SQ020.) == "Ja" ), NA),
  
  ifelse( length(which( data4[i,] %>%
  select(samenCSN2.SQ001.:samenCSN2.SQ020.) == "Ja" )) > 0,
  which(data4[i,] %>% select(samenCSN2.SQ001.:samenCSN2.SQ020.) == "Ja" ), NA),
  
  ifelse( length(which( data4[i,] %>%
  select(samenCSN3.SQ001.:samenCSN3.SQ020.) == "Ja" )) > 0,
  which(data4[i,] %>% select(samenCSN3.SQ001.:samenCSN3.SQ020.) == "Ja" ), NA),
  
  ifelse( length(which( data4[i,] %>%
  select(samenCSN4.SQ001.:samenCSN4.SQ020.) == "Ja" )) > 0,
  which(data4[i,] %>% select(samenCSN4.SQ001.:samenCSN4.SQ020.) == "Ja" ), NA),
  
  ifelse( length(which( data4[i,] %>%
  select(samenCSN5.SQ001.:samenCSN5.SQ020.) == "Ja" )) > 0,
  which(data4[i,] %>% select(samenCSN5.SQ001.:samenCSN5.SQ020.) == "Ja" ), NA))

}

#match sports attributes
#that is, from sports partners (p16-p20) to other alters who correspond to sports partners (name4)

for (i in 1:length(alterL)) {
  for (j in which(!is.na(alterL[[i]]$name4))) {
    alterL[[i]][j, c("alter_freq", "alter_grade", "sporttogether")] <- alterL[[i]][which(alterL[[i]]$name1 == alterL[[i]]$name4[j]), c("alter_freq", "alter_grade", "sporttogether")]
  }
}

#attach ego_grade, ego's self-asessed skill for the sports he/she does together with alter
#and ego_Freq, ego's sports frequency in this sports activity
for (i in 1:length(alterL)) { #for ego i
  alterL[[i]]$ego_grade <- NA
  alterL[[i]]$ego_freq <- NA
  
  for (j in which(!is.na(alterL[[i]]$sporttogether))) { #for alters with a value on the 'sporttogether' attribute (i.e., who belong to sportnetwork)
    
    #attach ego's self-assessed sports skill for the sports he/she did with alter with alterid j
    alterL[[i]]$ego_grade[alterL[[i]]$alterid == j] <- egos2[i, alterL[[i]]$sporttogether[j]]
    
    #and ego's self-assessed sports frequency for this sports type
    alterL[[i]]$ego_freq[alterL[[i]]$alterid == j] <- egos[i, alterL[[i]]$sporttogether[j]]
    
  }
}

#sports activities were not measured in w3...
#so unknown whether ego was still active in the sports type he/she did with alter at t3.
alterL <- lapply(alterL, function(x) {
  x$ego_quit <- NA
  return(x)})

#context in which ego did sports activities is not measured in w2. i assume that, for the sports activities ego continued into w2, the setting (e.g., club-organized) remains stable.


# i filter out the maintained alters
# by excluding alters with empty strings for gender attribute
for ( i in 1:length(alterL)) {
  alterL[[i]] <- alterL[[i]][which(!is.na(alterL[[i]]$alter_gender) & alterL[[i]]$alter_gender!=""),]
  
    if (nrow(alterL[[i]])>0){ #if no. of created alters > 0
      # replace the alter id: 1 : no. unique alters
      alterL[[i]]$alterid <- 1:nrow(alterL[[i]])
  }
}

#based on this, i make a long dataframe with alters nested in ego.
#first, add an ego_id
for (i in 1:length(alterL)) {
  if(nrow(alterL[[i]]>0)) {
    alterL[[i]]$ego <- i
    alterL[[i]]$respnr <- data$respnr[i]
    }
}

#combine using rbind
df <- do.call(rbind,alterL)

#add network variables; match based on df_maintained
df$cdn.size2 <- df$study.size2 <- df$bff.size2 <- df$csn.size2 <- NA
df$cdn.density2 <- df$study.density2 <- df$bff.density2 <- df$csn.density2 <- NA

for ( i in unique(df$ego)) { 
  df$cdn.size2[which(df$ego == i)] <- df_maintained$cdn.size2[which(df_maintained$ego == i)][1]
  df$study.size2[which(df$ego == i)] <- df_maintained$study.size2[which(df_maintained$ego == i)][1]
  df$bff.size2[which(df$ego == i)] <- df_maintained$bff.size2[which(df_maintained$ego == i)][1]
  df$csn.size2[which(df$ego == i)] <- df_maintained$csn.size2[which(df_maintained$ego == i)][1]
  
  df$cdn.density2[which(df$ego == i)] <- df_maintained$cdn.density2[which(df_maintained$ego == i)][1]
  df$study.density2[which(df$ego == i)] <- df_maintained$study.density2[which(df_maintained$ego == i)][1]
  df$bff.density2[which(df$ego == i)] <- df_maintained$bff.density2[which(df_maintained$ego == i)][1]
  df$csn.density2[which(df$ego == i)] <- df_maintained$csn.density2[which(df_maintained$ego == i)][1]
}

df$statusW2 <- "Created"
df_created <- df

#some empty name generator entries were saved, due to a bug.
#empties <- which(is.na(df$name1)) #done using the data with names instead of alter_ids
#save(empties,file="./data/empty_entries_indicators.Rda")
empties <- fload("./data shared/empty_entries_indicators.Rda")

df_created <- df_created[-empties,]
# bind them together
df_alters <- dplyr::bind_rows(df_maintained, df_created)

# arrange, by ego, and status
df_alters <- df_alters %>%
    arrange(ego, factor(statusW2, levels = c("Maintained", "Created", "Dropped")))
row.names(df_alters) <- 1:nrow(df_alters)


4.3 wave 2 –> wave 3

Let’s see whether wave 2 alters were maintained into wave 3.

# first subset from `df_alters` w2-maintained or w2-created alters
test <- df_alters[which(df_alters$statusW2 == "Maintained" | df_alters$statusW2 == "Created"), ]

# make variable indicating whether alter was (re-)named in w3
test$surviveW3 <- NA

# some alters had no 'chance' to reappear, because ego did fill out the last survey
test$w3participation <- NA
for (i in unique(test$respnr)) {
    test$w3participation[which(test$respnr == i)] <- ifelse(i %in% data5$respnr, 1, 0)
}

# fix alter ids, 1:N
for (i in unique(test$respnr)) {
    test$alterid[which(test$respnr == i)] <- 1:length(test$alterid[which(test$respnr == i)])
}

# subset wave 5 matching matrix (matching wave 3 alters to wave 2 alters - either created or
# maintained ) also add respnr
w1w2 <- data5[, c(486:885, ncol(data5))]

for (i in unique(test$respnr)) {
    # for all egos (both those that participated in w3, and those that didnt)

    matchingL <- vector("list", 20)  #pre-allocate empty list of length 20, to store matching matrices
    {
        matchingL[[1]] <- w1w2[which(w1w2$respnr == i), 1:20]
        matchingL[[2]] <- w1w2[which(w1w2$respnr == i), 21:40]
        matchingL[[3]] <- w1w2[which(w1w2$respnr == i), 41:60]
        matchingL[[4]] <- w1w2[which(w1w2$respnr == i), 61:80]
        matchingL[[5]] <- w1w2[which(w1w2$respnr == i), 81:100]
        matchingL[[6]] <- w1w2[which(w1w2$respnr == i), 101:120]
        matchingL[[7]] <- w1w2[which(w1w2$respnr == i), 121:140]
        matchingL[[8]] <- w1w2[which(w1w2$respnr == i), 141:160]
        matchingL[[9]] <- w1w2[which(w1w2$respnr == i), 161:180]
        matchingL[[10]] <- w1w2[which(w1w2$respnr == i), 181:200]
        matchingL[[11]] <- w1w2[which(w1w2$respnr == i), 201:220]
        matchingL[[12]] <- w1w2[which(w1w2$respnr == i), 221:240]
        matchingL[[13]] <- w1w2[which(w1w2$respnr == i), 241:260]
        matchingL[[14]] <- w1w2[which(w1w2$respnr == i), 261:280]
        matchingL[[15]] <- w1w2[which(w1w2$respnr == i), 281:300]
        matchingL[[16]] <- w1w2[which(w1w2$respnr == i), 301:320]
        matchingL[[17]] <- w1w2[which(w1w2$respnr == i), 321:340]
        matchingL[[18]] <- w1w2[which(w1w2$respnr == i), 341:360]
        matchingL[[19]] <- w1w2[which(w1w2$respnr == i), 361:380]
        matchingL[[20]] <- w1w2[which(w1w2$respnr == i), 381:400]
    }
    # find the 'right' matching matrix in this list, by taking the one that contains answers
    ind <- NULL
    for (j in seq_along(matchingL)) {
        # check along the sequence of elements j in the matching matrix list if they are non-empty
        # and not NA
        check <- FALSE
        for (col in matchingL[[j]]) {
            if (!all(is.na(col)) && any(nchar(col) > 0)) {
                check <- TRUE
                break
            }
        }
        if (check) {
            ind <- j
            break
        }
    }
    if (length(ind) > 0) {
        # get the matrix
        mm <- matchingL[[ind]]
        # unlist the answers given
        ans <- unlist(mm, use.names = FALSE)
        # use `stringr` to extract numbers in these answers
        id <- unlist(stringr::str_extract_all(ans, "\\(?[0-9,.]+\\)?"))
        id <- id[!is.na(id)]  #remove NA

        for (k in 1:length(which(test$respnr == i))) {
            # for w2-alters of ego i, with ids 1:k, if alter was renamed, give score 1, if he/she
            # was not renamed give 0, alters who had no chance to reappear due to ego not filling
            # out the survey keep NA.
            test$surviveW3[which(test$respnr == i & test$alterid == k)] <- ifelse(test$alterid[which(test$respnr ==
                i & test$alterid == k)] %in% id, 1, 0)
        }
    }
}

# remaining NAs on `survivew3` among egos who did fill out w3, are due to ego not listing any
# alters.. any(test$w3participation==1 & is.na(test$surviveW3))
# test$respnr[which(test$w3participation==1 & is.na(test$surviveW3))] so, set to 0...
test$surviveW3[which(is.na(test$surviveW3) & test$w3participation == 1)] <- 0

# in which egonet did they (re)appear?
test$cdn3 <- NA
test$study3 <- NA
test$bff3 <- NA
test$csn3 <- NA

# i use the matching matrices of w3; where columns refer to unique w2 alters (maintained and
# created; those of our constructed dataframe) and rows referring to unique w3 alters so, if
# w2-alter/column j is matched to w3-alter/row i, then w2-alter did survive (but we already knew
# that); but more importantly, j was the i^th alter mentioned and this allows me to infer in what
# network j (re-)appeared since cdn = 1-5; study = 6-10; bff = 11-15; csn = 16-20.  however, since
# the rows only include non-duplicate w3-alters; if alter j at t2 was named more than once at t3, i
# only know the first egonet in which j was named...  thus, before i proceed, i use the matching
# matrices that allowed ego to match alters from different egonets to make alter ids for w3 alters;
# and figure out to which egonets they belonged

# first, subset data5, bc we only want names data of egos with w1/w2 alters who participated in w3
data5a <- data5[which(data5$respnr %in% unique(test$respnr[which(test$w3participation == 1)])), ]

# i make a dataframe of w3-alters, with potential duplicates...
df_names <- data.frame(p1 = data5a$egonet1.SQ001., p2 = data5a$egonet1.SQ002., p3 = data5a$egonet1.SQ003.,
    p4 = data5a$egonet1.SQ004., p5 = data5a$egonet1.SQ005., p6 = data5a$egonet2.SQ001., p7 = data5a$egonet2.SQ002.,
    p8 = data5a$egonet2.SQ003., p9 = data5a$egonet2.SQ004., p10 = data5a$egonet2.SQ005., p11 = data5a$egonet3.SQ001.,
    p12 = data5a$egonet3.SQ002., p13 = data5a$egonet3.SQ003., p14 = data5a$egonet3.SQ004., p15 = data5a$egonet3.SQ005.,
    p16 = data5a$egonet4.SQ001., p17 = data5a$egonet4.SQ002., p18 = data5a$egonet4.SQ003., p19 = data5a$egonet4.SQ004.,
    p20 = data5a$egonet4.SQ005.)

# list of dataframes per ego with rows reflecting alters and columns indicating the name(s) of the
# particular alters
alterL <- list()
# loop over all egos, that filled out w3
for (i in 1:nrow(data5a)) {
    alterL[[i]] <- data.frame(alterid = 1:20, name1 = NA, name2 = NA, name3 = NA, name4 = NA)
}

# fill the names based on the names data-frame
for (i in 1:length(alterL)) {
    alterL[[i]]$name1 <- unlist(df_names[i, ], use.names = FALSE)
    alterL[[i]]$name1 <- ifelse(alterL[[i]]$name1 == "", NA, alterL[[i]]$name1)
}

# calculate netsize for each net to get the correct matching matrix
{
    net1 <- cbind(data5a$egonet1.SQ001., data5a$egonet1.SQ002., data5a$egonet1.SQ003., data5a$egonet1.SQ004.,
        data5a$egonet1.SQ005.)
    net1 <- ifelse(net1 == "", NA, net1)
    ns1 <- vector()
    for (i in 1:nrow(net1)) {
        ns1[i] <- length(net1[i, ][which(!is.na(net1[i, ]))])
    }
    net2 <- cbind(data5a$egonet2.SQ001., data5a$egonet2.SQ002., data5a$egonet2.SQ003., data5a$egonet2.SQ004.,
        data5a$egonet2.SQ005.)
    net2 <- ifelse(net2 == "", NA, net2)
    ns2 <- vector()
    for (i in 1:nrow(net2)) {
        ns2[i] <- length(net2[i, ][which(!is.na(net2[i, ]))])
    }
    net3 <- cbind(data5a$egonet3.SQ001., data5a$egonet3.SQ002., data5a$egonet3.SQ003., data5a$egonet3.SQ004.,
        data5a$egonet3.SQ005.)
    net3 <- ifelse(net3 == "", NA, net3)
    ns3 <- vector()
    for (i in 1:nrow(net3)) {
        ns3[i] <- length(net3[i, ][which(!is.na(net3[i, ]))])
    }
    net4 <- cbind(data5a$egonet4.SQ001., data5a$egonet4.SQ002., data5a$egonet4.SQ003., data5a$egonet4.SQ004.,
        data5a$egonet4.SQ005.)
    net4 <- ifelse(net4 == "", NA, net4)
    ns4 <- vector()
    for (i in 1:nrow(net4)) {
        ns4[i] <- length(net4[i, ][which(!is.na(net4[i, ]))])
    }
}

# construct the matching matrices list for egonet1-2
matchingList <- list()
for (i in 1:length(alterL)) {
    matchingL <- list()
    matchingL[[1]] <- cbind(data5a$matching1N1.SQ001_SQ001.[i], data5a$matching1N1.SQ002_SQ001.[i], data5a$matching1N1.SQ003_SQ001.[i],
        data5a$matching1N1.SQ004_SQ001.[i], data5a$matching1N1.SQ005_SQ001.[i])
    matchingL[[2]] <- rbind(cbind(data5a$matching1N2.SQ001_SQ001.[i], data5a$matching1N2.SQ002_SQ001.[i],
        data5a$matching1N2.SQ003_SQ001.[i], data5a$matching1N2.SQ004_SQ001.[i], data5a$matching1N2.SQ005_SQ001.[i]),
        cbind(data5a$matching1N2.SQ001_SQ002.[i], data5a$matching1N2.SQ002_SQ002.[i], data5a$matching1N2.SQ003_SQ002.[i],
            data5a$matching1N2.SQ004_SQ002.[i], data5a$matching1N2.SQ005_SQ002.[i]))
    matchingL[[3]] <- rbind(cbind(data5a$matching1N3.SQ001_SQ001.[i], data5a$matching1N3.SQ002_SQ001.[i],
        data5a$matching1N3.SQ003_SQ001.[i], data5a$matching1N3.SQ004_SQ001.[i], data5a$matching1N3.SQ005_SQ001.[i]),
        cbind(data5a$matching1N3.SQ001_SQ002.[i], data5a$matching1N3.SQ002_SQ002.[i], data5a$matching1N3.SQ003_SQ002.[i],
            data5a$matching1N3.SQ004_SQ002.[i], data5a$matching1N3.SQ005_SQ002.[i]), cbind(data5a$matching1N3.SQ001_SQ003.[i],
            data5a$matching1N3.SQ002_SQ003.[i], data5a$matching1N3.SQ003_SQ003.[i], data5a$matching1N3.SQ004_SQ003.[i],
            data5a$matching1N3.SQ005_SQ003.[i]))
    matchingL[[4]] <- rbind(cbind(data5a$matching1N4.SQ001_SQ001.[i], data5a$matching1N4.SQ002_SQ001.[i],
        data5a$matching1N4.SQ003_SQ001.[i], data5a$matching1N4.SQ004_SQ001.[i], data5a$matching1N4.SQ005_SQ001.[i]),
        cbind(data5a$matching1N4.SQ001_SQ002.[i], data5a$matching1N4.SQ002_SQ002.[i], data5a$matching1N4.SQ003_SQ002.[i],
            data5a$matching1N4.SQ004_SQ002.[i], data5a$matching1N4.SQ005_SQ002.[i]), cbind(data5a$matching1N4.SQ001_SQ003.[i],
            data5a$matching1N4.SQ002_SQ003.[i], data5a$matching1N4.SQ003_SQ003.[i], data5a$matching1N4.SQ004_SQ003.[i],
            data5a$matching1N4.SQ005_SQ003.[i]), cbind(data5a$matching1N4.SQ001_SQ004.[i], data5a$matching1N4.SQ002_SQ004.[i],
            data5a$matching1N4.SQ003_SQ004.[i], data5a$matching1N4.SQ004_SQ004.[i], data5a$matching1N4.SQ005_SQ004.[i]))
    matchingL[[5]] <- rbind(cbind(data5a$matching1N5.SQ001_SQ001.[i], data5a$matching1N5.SQ002_SQ001.[i],
        data5a$matching1N5.SQ003_SQ001.[i], data5a$matching1N5.SQ004_SQ001.[i], data5a$matching1N5.SQ005_SQ001.[i]),
        cbind(data5a$matching1N5.SQ001_SQ002.[i], data5a$matching1N5.SQ002_SQ002.[i], data5a$matching1N5.SQ003_SQ002.[i],
            data5a$matching1N5.SQ004_SQ002.[i], data5a$matching1N5.SQ005_SQ002.[i]), cbind(data5a$matching1N5.SQ001_SQ003.[i],
            data5a$matching1N5.SQ002_SQ003.[i], data5a$matching1N5.SQ003_SQ003.[i], data5a$matching1N5.SQ004_SQ003.[i],
            data5a$matching1N5.SQ005_SQ003.[i]), cbind(data5a$matching1N5.SQ001_SQ004.[i], data5a$matching1N5.SQ002_SQ004.[i],
            data5a$matching1N5.SQ003_SQ004.[i], data5a$matching1N5.SQ004_SQ004.[i], data5a$matching1N5.SQ005_SQ004.[i]),
        cbind(data5a$matching1N5.SQ001_SQ005.[i], data5a$matching1N5.SQ002_SQ005.[i], data5a$matching1N5.SQ003_SQ005.[i],
            data5a$matching1N5.SQ004_SQ005.[i], data5a$matching1N5.SQ005_SQ005.[i]))
    matchingList[[i]] <- matchingL
}  # so... matchingL[[1]][[5]] is matchingmatrix 5 (i.e., 5 alters named in egonet2) for ego 1

# the combination of the matching matrices and the netsizes for ego allows me to match the names
# myself.  for ego i
for (i in 1:length(matchingList)) {
    mL <- matchingList[[i]]  # get the matching list
    ns <- ns2[[i]]  # get the size of egonet2
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # retrieve the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net2[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name2[which(alterL[[i]]$alterid == matched[, 2])] <- net[matched[, 1]]
        }
    }
}  #ignore warning

# again, make a matching list for the second matching matrices (i.e., matching egonet3 alters to
# prev. alters);
matchingList2 <- list()
for (i in 1:length(alterL)) {
    # for ego i
    matching2L <- list()
    matching2L[[1]] <- cbind(data5a$matching2N1.SQ001_SQ001.[i], data5a$matching2N1.SQ002_SQ001.[i],
        data5a$matching2N1.SQ003_SQ001.[i], data5a$matching2N1.SQ004_SQ001.[i], data5a$matching2N1.SQ005_SQ001.[i],
        data5a$matching2N1.SQ006_SQ001.[i], data5a$matching2N1.SQ007_SQ001.[i], data5a$matching2N1.SQ008_SQ001.[i],
        data5a$matching2N1.SQ009_SQ001.[i], data5a$matching2N1.SQ010_SQ001.[i])
    matching2L[[2]] <- rbind(cbind(data5a$matching2N2.SQ001_SQ001.[i], data5a$matching2N2.SQ002_SQ001.[i],
        data5a$matching2N2.SQ003_SQ001.[i], data5a$matching2N2.SQ004_SQ001.[i], data5a$matching2N2.SQ005_SQ001.[i],
        data5a$matching2N2.SQ006_SQ001.[i], data5a$matching2N2.SQ007_SQ001.[i], data5a$matching2N2.SQ008_SQ001.[i],
        data5a$matching2N2.SQ009_SQ001.[i], data5a$matching2N2.SQ010_SQ001.[i]), cbind(data5a$matching2N2.SQ001_SQ002.[i],
        data5a$matching2N2.SQ002_SQ002.[i], data5a$matching2N2.SQ003_SQ002.[i], data5a$matching2N2.SQ004_SQ002.[i],
        data5a$matching2N2.SQ005_SQ002.[i], data5a$matching2N2.SQ006_SQ002.[i], data5a$matching2N2.SQ007_SQ002.[i],
        data5a$matching2N2.SQ008_SQ002.[i], data5a$matching2N2.SQ009_SQ002.[i], data5a$matching2N2.SQ010_SQ002.[i]))
    matching2L[[3]] <- rbind(cbind(data5a$matching2N3.SQ001_SQ001.[i], data5a$matching2N3.SQ002_SQ001.[i],
        data5a$matching2N3.SQ003_SQ001.[i], data5a$matching2N3.SQ004_SQ001.[i], data5a$matching2N3.SQ005_SQ001.[i],
        data5a$matching2N3.SQ006_SQ001.[i], data5a$matching2N3.SQ007_SQ001.[i], data5a$matching2N3.SQ008_SQ001.[i],
        data5a$matching2N3.SQ009_SQ001.[i], data5a$matching2N3.SQ010_SQ001.[i]), cbind(data5a$matching2N3.SQ001_SQ002.[i],
        data5a$matching2N3.SQ002_SQ002.[i], data5a$matching2N3.SQ003_SQ002.[i], data5a$matching2N3.SQ004_SQ002.[i],
        data5a$matching2N3.SQ005_SQ002.[i], data5a$matching2N3.SQ006_SQ002.[i], data5a$matching2N3.SQ007_SQ002.[i],
        data5a$matching2N3.SQ008_SQ002.[i], data5a$matching2N3.SQ009_SQ002.[i], data5a$matching2N3.SQ010_SQ002.[i]),
        cbind(data5a$matching2N3.SQ001_SQ003.[i], data5a$matching2N3.SQ002_SQ003.[i], data5a$matching2N3.SQ003_SQ003.[i],
            data5a$matching2N3.SQ004_SQ003.[i], data5a$matching2N3.SQ005_SQ003.[i], data5a$matching2N3.SQ006_SQ003.[i],
            data5a$matching2N3.SQ007_SQ003.[i], data5a$matching2N3.SQ008_SQ003.[i], data5a$matching2N3.SQ009_SQ003.[i],
            data5a$matching2N3.SQ010_SQ003.[i]))
    matching2L[[4]] <- rbind(cbind(data5a$matching2N4.SQ001_SQ001.[i], data5a$matching2N4.SQ002_SQ001.[i],
        data5a$matching2N4.SQ003_SQ001.[i], data5a$matching2N4.SQ004_SQ001.[i], data5a$matching2N4.SQ005_SQ001.[i],
        data5a$matching2N4.SQ006_SQ001.[i], data5a$matching2N4.SQ007_SQ001.[i], data5a$matching2N4.SQ008_SQ001.[i],
        data5a$matching2N4.SQ009_SQ001.[i], data5a$matching2N4.SQ010_SQ001.[i]), cbind(data5a$matching2N4.SQ001_SQ002.[i],
        data5a$matching2N4.SQ002_SQ002.[i], data5a$matching2N4.SQ003_SQ002.[i], data5a$matching2N4.SQ004_SQ002.[i],
        data5a$matching2N4.SQ005_SQ002.[i], data5a$matching2N4.SQ006_SQ002.[i], data5a$matching2N4.SQ007_SQ002.[i],
        data5a$matching2N4.SQ008_SQ002.[i], data5a$matching2N4.SQ009_SQ002.[i], data5a$matching2N4.SQ010_SQ002.[i]),
        cbind(data5a$matching2N4.SQ001_SQ003.[i], data5a$matching2N4.SQ002_SQ003.[i], data5a$matching2N4.SQ003_SQ003.[i],
            data5a$matching2N4.SQ004_SQ003.[i], data5a$matching2N4.SQ005_SQ003.[i], data5a$matching2N4.SQ006_SQ003.[i],
            data5a$matching2N4.SQ007_SQ003.[i], data5a$matching2N4.SQ008_SQ003.[i], data5a$matching2N4.SQ009_SQ003.[i],
            data5a$matching2N4.SQ010_SQ003.[i]), cbind(data5a$matching2N4.SQ001_SQ004.[i], data5a$matching2N4.SQ002_SQ004.[i],
            data5a$matching2N4.SQ003_SQ004.[i], data5a$matching2N4.SQ004_SQ004.[i], data5a$matching2N4.SQ005_SQ004.[i],
            data5a$matching2N4.SQ006_SQ004.[i], data5a$matching2N4.SQ007_SQ004.[i], data5a$matching2N4.SQ008_SQ004.[i],
            data5a$matching2N4.SQ009_SQ004.[i], data5a$matching2N4.SQ010_SQ004.[i]))
    matching2L[[5]] <- rbind(cbind(data5a$matching2N5.SQ001_SQ001.[i], data5a$matching2N5.SQ002_SQ001.[i],
        data5a$matching2N5.SQ003_SQ001.[i], data5a$matching2N5.SQ004_SQ001.[i], data5a$matching2N5.SQ005_SQ001.[i],
        data5a$matching2N5.SQ006_SQ001.[i], data5a$matching2N5.SQ007_SQ001.[i], data5a$matching2N5.SQ008_SQ001.[i],
        data5a$matching2N5.SQ009_SQ001.[i], data5a$matching2N5.SQ010_SQ001.[i]), cbind(data5a$matching2N5.SQ001_SQ002.[i],
        data5a$matching2N5.SQ002_SQ002.[i], data5a$matching2N5.SQ003_SQ002.[i], data5a$matching2N5.SQ004_SQ002.[i],
        data5a$matching2N5.SQ005_SQ002.[i], data5a$matching2N5.SQ006_SQ002.[i], data5a$matching2N5.SQ007_SQ002.[i],
        data5a$matching2N5.SQ008_SQ002.[i], data5a$matching2N5.SQ009_SQ002.[i], data5a$matching2N5.SQ010_SQ002.[i]),
        cbind(data5a$matching2N5.SQ001_SQ003.[i], data5a$matching2N5.SQ002_SQ003.[i], data5a$matching2N5.SQ003_SQ003.[i],
            data5a$matching2N5.SQ004_SQ003.[i], data5a$matching2N5.SQ005_SQ003.[i], data5a$matching2N5.SQ006_SQ003.[i],
            data5a$matching2N5.SQ007_SQ003.[i], data5a$matching2N5.SQ008_SQ003.[i], data5a$matching2N5.SQ009_SQ003.[i],
            data5a$matching2N5.SQ010_SQ003.[i]), cbind(data5a$matching2N5.SQ001_SQ004.[i], data5a$matching2N5.SQ002_SQ004.[i],
            data5a$matching2N5.SQ003_SQ004.[i], data5a$matching2N5.SQ004_SQ004.[i], data5a$matching2N5.SQ005_SQ004.[i],
            data5a$matching2N5.SQ006_SQ004.[i], data5a$matching2N5.SQ007_SQ004.[i], data5a$matching2N5.SQ008_SQ004.[i],
            data5a$matching2N5.SQ009_SQ004.[i], data5a$matching2N5.SQ010_SQ004.[i]), cbind(data5a$matching2N5.SQ001_SQ005.[i],
            data5a$matching2N5.SQ002_SQ005.[i], data5a$matching2N5.SQ003_SQ005.[i], data5a$matching2N5.SQ004_SQ005.[i],
            data5a$matching2N5.SQ005_SQ005.[i], data5a$matching2N5.SQ006_SQ005.[i], data5a$matching2N5.SQ007_SQ005.[i],
            data5a$matching2N5.SQ008_SQ005.[i], data5a$matching2N5.SQ009_SQ005.[i], data5a$matching2N5.SQ010_SQ005.[i]))
    matchingList2[[i]] <- matching2L
}

for (i in 1:length(matchingList2)) {
    # for ego i
    mL <- matchingList2[[i]]  # get the matching list 2
    ns <- ns3[[i]]  # get the size of egonet3
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # and the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net3[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name3[matched[, 2]] <- net[matched[, 1]]
        }
    }
}

# same for matching 3 (i.e., egonet4 with egonets 1-3)
matchingList3 <- list()
for (i in 1:length(alterL)) {
    # for ego i
    matching3L <- list()
    matching3L[[1]] <- cbind(data5a$matching3N1.SQ001_SQ001.[i], data5a$matching3N1.SQ002_SQ001.[i],
        data5a$matching3N1.SQ003_SQ001.[i], data5a$matching3N1.SQ004_SQ001.[i], data5a$matching3N1.SQ005_SQ001.[i],
        data5a$matching3N1.SQ006_SQ001.[i], data5a$matching3N1.SQ007_SQ001.[i], data5a$matching3N1.SQ008_SQ001.[i],
        data5a$matching3N1.SQ009_SQ001.[i], data5a$matching3N1.SQ010_SQ001.[i], data5a$matching3N1.SQ011_SQ001.[i],
        data5a$matching3N1.SQ012_SQ001.[i], data5a$matching3N1.SQ013_SQ001.[i], data5a$matching3N1.SQ014_SQ001.[i],
        data5a$matching3N1.SQ015_SQ001.[i])
    matching3L[[2]] <- rbind(cbind(data5a$matching3N2.SQ001_SQ001.[i], data5a$matching3N2.SQ002_SQ001.[i],
        data5a$matching3N2.SQ003_SQ001.[i], data5a$matching3N2.SQ004_SQ001.[i], data5a$matching3N2.SQ005_SQ001.[i],
        data5a$matching3N2.SQ006_SQ001.[i], data5a$matching3N2.SQ007_SQ001.[i], data5a$matching3N2.SQ008_SQ001.[i],
        data5a$matching3N2.SQ009_SQ001.[i], data5a$matching3N2.SQ010_SQ001.[i], data5a$matching3N2.SQ011_SQ001.[i],
        data5a$matching3N2.SQ012_SQ001.[i], data5a$matching3N2.SQ013_SQ001.[i], data5a$matching3N2.SQ014_SQ001.[i],
        data5a$matching3N2.SQ015_SQ001.[i]), cbind(data5a$matching3N2.SQ001_SQ002.[i], data5a$matching3N2.SQ002_SQ002.[i],
        data5a$matching3N2.SQ003_SQ002.[i], data5a$matching3N2.SQ004_SQ002.[i], data5a$matching3N2.SQ005_SQ002.[i],
        data5a$matching3N2.SQ006_SQ002.[i], data5a$matching3N2.SQ007_SQ002.[i], data5a$matching3N2.SQ008_SQ002.[i],
        data5a$matching3N2.SQ009_SQ002.[i], data5a$matching3N2.SQ010_SQ002.[i], data5a$matching3N2.SQ011_SQ002.[i],
        data5a$matching3N2.SQ012_SQ002.[i], data5a$matching3N2.SQ013_SQ002.[i], data5a$matching3N2.SQ014_SQ002.[i],
        data5a$matching3N2.SQ015_SQ002.[i]))
    matching3L[[3]] <- rbind(cbind(data5a$matching3N3.SQ001_SQ001.[i], data5a$matching3N3.SQ002_SQ001.[i],
        data5a$matching3N3.SQ003_SQ001.[i], data5a$matching3N3.SQ004_SQ001.[i], data5a$matching3N3.SQ005_SQ001.[i],
        data5a$matching3N3.SQ006_SQ001.[i], data5a$matching3N3.SQ007_SQ001.[i], data5a$matching3N3.SQ008_SQ001.[i],
        data5a$matching3N3.SQ009_SQ001.[i], data5a$matching3N3.SQ010_SQ001.[i], data5a$matching3N3.SQ011_SQ001.[i],
        data5a$matching3N3.SQ012_SQ001.[i], data5a$matching3N3.SQ013_SQ001.[i], data5a$matching3N3.SQ014_SQ001.[i],
        data5a$matching3N3.SQ015_SQ001.[i]), cbind(data5a$matching3N3.SQ001_SQ002.[i], data5a$matching3N3.SQ002_SQ002.[i],
        data5a$matching3N3.SQ003_SQ002.[i], data5a$matching3N3.SQ004_SQ002.[i], data5a$matching3N3.SQ005_SQ002.[i],
        data5a$matching3N3.SQ006_SQ002.[i], data5a$matching3N3.SQ007_SQ002.[i], data5a$matching3N3.SQ008_SQ002.[i],
        data5a$matching3N3.SQ009_SQ002.[i], data5a$matching3N3.SQ010_SQ002.[i], data5a$matching3N3.SQ011_SQ002.[i],
        data5a$matching3N3.SQ012_SQ002.[i], data5a$matching3N3.SQ013_SQ002.[i], data5a$matching3N3.SQ014_SQ002.[i],
        data5a$matching3N3.SQ015_SQ002.[i]), cbind(data5a$matching3N3.SQ001_SQ003.[i], data5a$matching3N3.SQ002_SQ003.[i],
        data5a$matching3N3.SQ003_SQ003.[i], data5a$matching3N3.SQ004_SQ003.[i], data5a$matching3N3.SQ005_SQ003.[i],
        data5a$matching3N3.SQ006_SQ003.[i], data5a$matching3N3.SQ007_SQ003.[i], data5a$matching3N3.SQ008_SQ003.[i],
        data5a$matching3N3.SQ009_SQ003.[i], data5a$matching3N3.SQ010_SQ003.[i], data5a$matching3N3.SQ011_SQ003.[i],
        data5a$matching3N3.SQ012_SQ003.[i], data5a$matching3N3.SQ013_SQ003.[i], data5a$matching3N3.SQ014_SQ003.[i],
        data5a$matching3N3.SQ015_SQ003.[i]))
    matching3L[[4]] <- rbind(cbind(data5a$matching3N4.SQ001_SQ001.[i], data5a$matching3N4.SQ002_SQ001.[i],
        data5a$matching3N4.SQ003_SQ001.[i], data5a$matching3N4.SQ004_SQ001.[i], data5a$matching3N4.SQ005_SQ001.[i],
        data5a$matching3N4.SQ006_SQ001.[i], data5a$matching3N4.SQ007_SQ001.[i], data5a$matching3N4.SQ008_SQ001.[i],
        data5a$matching3N4.SQ009_SQ001.[i], data5a$matching3N4.SQ010_SQ001.[i], data5a$matching3N4.SQ011_SQ001.[i],
        data5a$matching3N4.SQ012_SQ001.[i], data5a$matching3N4.SQ013_SQ001.[i], data5a$matching3N4.SQ014_SQ001.[i],
        data5a$matching3N4.SQ015_SQ001.[i]), cbind(data5a$matching3N4.SQ001_SQ002.[i], data5a$matching3N4.SQ002_SQ002.[i],
        data5a$matching3N4.SQ003_SQ002.[i], data5a$matching3N4.SQ004_SQ002.[i], data5a$matching3N4.SQ005_SQ002.[i],
        data5a$matching3N4.SQ006_SQ002.[i], data5a$matching3N4.SQ007_SQ002.[i], data5a$matching3N4.SQ008_SQ002.[i],
        data5a$matching3N4.SQ009_SQ002.[i], data5a$matching3N4.SQ010_SQ002.[i], data5a$matching3N4.SQ011_SQ002.[i],
        data5a$matching3N4.SQ012_SQ002.[i], data5a$matching3N4.SQ013_SQ002.[i], data5a$matching3N4.SQ014_SQ002.[i],
        data5a$matching3N4.SQ015_SQ002.[i]), cbind(data5a$matching3N4.SQ001_SQ003.[i], data5a$matching3N4.SQ002_SQ003.[i],
        data5a$matching3N4.SQ003_SQ003.[i], data5a$matching3N4.SQ004_SQ003.[i], data5a$matching3N4.SQ005_SQ003.[i],
        data5a$matching3N4.SQ006_SQ003.[i], data5a$matching3N4.SQ007_SQ003.[i], data5a$matching3N4.SQ008_SQ003.[i],
        data5a$matching3N4.SQ009_SQ003.[i], data5a$matching3N4.SQ010_SQ003.[i], data5a$matching3N4.SQ011_SQ003.[i],
        data5a$matching3N4.SQ012_SQ003.[i], data5a$matching3N4.SQ013_SQ003.[i], data5a$matching3N4.SQ014_SQ003.[i],
        data5a$matching3N4.SQ015_SQ003.[i]), cbind(data5a$matching3N4.SQ001_SQ003.[i], data5a$matching3N4.SQ002_SQ003.[i],
        data5a$matching3N4.SQ003_SQ003.[i], data5a$matching3N4.SQ004_SQ003.[i], data5a$matching3N4.SQ005_SQ003.[i],
        data5a$matching3N4.SQ006_SQ003.[i], data5a$matching3N4.SQ007_SQ003.[i], data5a$matching3N4.SQ008_SQ003.[i],
        data5a$matching3N4.SQ009_SQ003.[i], data5a$matching3N4.SQ010_SQ003.[i], data5a$matching3N4.SQ011_SQ003.[i],
        data5a$matching3N4.SQ012_SQ003.[i], data5a$matching3N4.SQ013_SQ003.[i], data5a$matching3N4.SQ014_SQ003.[i],
        data5a$matching3N4.SQ015_SQ003.[i]), cbind(data5a$matching3N4.SQ001_SQ004.[i], data5a$matching3N4.SQ002_SQ004.[i],
        data5a$matching3N4.SQ003_SQ004.[i], data5a$matching3N4.SQ004_SQ004.[i], data5a$matching3N4.SQ005_SQ004.[i],
        data5a$matching3N4.SQ006_SQ004.[i], data5a$matching3N4.SQ007_SQ004.[i], data5a$matching3N4.SQ008_SQ004.[i],
        data5a$matching3N4.SQ009_SQ004.[i], data5a$matching3N4.SQ010_SQ004.[i], data5a$matching3N4.SQ011_SQ004.[i],
        data5a$matching3N4.SQ012_SQ004.[i], data5a$matching3N4.SQ013_SQ004.[i], data5a$matching3N4.SQ014_SQ004.[i],
        data5a$matching3N4.SQ015_SQ004.[i]))
    matching3L[[5]] <- rbind(cbind(data5a$matching3N5.SQ001_SQ001.[i], data5a$matching3N5.SQ002_SQ001.[i],
        data5a$matching3N5.SQ003_SQ001.[i], data5a$matching3N5.SQ004_SQ001.[i], data5a$matching3N5.SQ005_SQ001.[i],
        data5a$matching3N5.SQ006_SQ001.[i], data5a$matching3N5.SQ007_SQ001.[i], data5a$matching3N5.SQ008_SQ001.[i],
        data5a$matching3N5.SQ009_SQ001.[i], data5a$matching3N5.SQ010_SQ001.[i], data5a$matching3N5.SQ011_SQ001.[i],
        data5a$matching3N5.SQ012_SQ001.[i], data5a$matching3N5.SQ013_SQ001.[i], data5a$matching3N5.SQ014_SQ001.[i],
        data5a$matching3N5.SQ015_SQ001.[i]), cbind(data5a$matching3N5.SQ001_SQ002.[i], data5a$matching3N5.SQ002_SQ002.[i],
        data5a$matching3N5.SQ003_SQ002.[i], data5a$matching3N5.SQ004_SQ002.[i], data5a$matching3N5.SQ005_SQ002.[i],
        data5a$matching3N5.SQ006_SQ002.[i], data5a$matching3N5.SQ007_SQ002.[i], data5a$matching3N5.SQ008_SQ002.[i],
        data5a$matching3N5.SQ009_SQ002.[i], data5a$matching3N5.SQ010_SQ002.[i], data5a$matching3N5.SQ011_SQ002.[i],
        data5a$matching3N5.SQ012_SQ002.[i], data5a$matching3N5.SQ013_SQ002.[i], data5a$matching3N5.SQ014_SQ002.[i],
        data5a$matching3N5.SQ015_SQ002.[i]), cbind(data5a$matching3N5.SQ001_SQ003.[i], data5a$matching3N5.SQ002_SQ003.[i],
        data5a$matching3N5.SQ003_SQ003.[i], data5a$matching3N5.SQ004_SQ003.[i], data5a$matching3N5.SQ005_SQ003.[i],
        data5a$matching3N5.SQ006_SQ003.[i], data5a$matching3N5.SQ007_SQ003.[i], data5a$matching3N5.SQ008_SQ003.[i],
        data5a$matching3N5.SQ009_SQ003.[i], data5a$matching3N5.SQ010_SQ003.[i], data5a$matching3N5.SQ011_SQ003.[i],
        data5a$matching3N5.SQ012_SQ003.[i], data5a$matching3N5.SQ013_SQ003.[i], data5a$matching3N5.SQ014_SQ003.[i],
        data5a$matching3N5.SQ015_SQ003.[i]), cbind(data5a$matching3N5.SQ001_SQ003.[i], data5a$matching3N5.SQ002_SQ003.[i],
        data5a$matching3N5.SQ003_SQ003.[i], data5a$matching3N5.SQ004_SQ003.[i], data5a$matching3N5.SQ005_SQ003.[i],
        data5a$matching3N5.SQ006_SQ003.[i], data5a$matching3N5.SQ007_SQ003.[i], data5a$matching3N5.SQ008_SQ003.[i],
        data5a$matching3N5.SQ009_SQ003.[i], data5a$matching3N5.SQ010_SQ003.[i], data5a$matching3N5.SQ011_SQ003.[i],
        data5a$matching3N5.SQ012_SQ003.[i], data5a$matching3N5.SQ013_SQ003.[i], data5a$matching3N5.SQ014_SQ003.[i],
        data5a$matching3N5.SQ015_SQ003.[i]), cbind(data5a$matching3N5.SQ001_SQ005.[i], data5a$matching3N5.SQ002_SQ005.[i],
        data5a$matching3N5.SQ003_SQ005.[i], data5a$matching3N5.SQ004_SQ005.[i], data5a$matching3N5.SQ005_SQ005.[i],
        data5a$matching3N5.SQ006_SQ005.[i], data5a$matching3N5.SQ007_SQ005.[i], data5a$matching3N5.SQ008_SQ005.[i],
        data5a$matching3N5.SQ009_SQ005.[i], data5a$matching3N5.SQ010_SQ005.[i], data5a$matching3N5.SQ011_SQ005.[i],
        data5a$matching3N5.SQ012_SQ005.[i], data5a$matching3N5.SQ013_SQ005.[i], data5a$matching3N5.SQ014_SQ005.[i],
        data5a$matching3N5.SQ015_SQ005.[i]))
    matchingList3[[i]] <- matching3L
}

for (i in 1:length(matchingList3)) {
    # for ego i
    mL <- matchingList3[[i]]  # get the matching list 2
    ns <- ns4[[i]]  # get the size of egonet4
    if (ns > 0) {
        # if ns=0, no matching was done!
        mm <- as.matrix(mL[[ns]])  # and the corresponding matrix
        matched <- which(mm == 1, arr.ind = T)  # retrieve array indices
        net <- net4[i, ]
        if (length(matched) > 0) {
            # if matching was performed!
            alterL[[i]]$name4[matched[, 2]] <- net[matched[, 1]]
        }
    }
}

# make long df with w3 alters in ego, and indicators for 4 egonets;
df2 <- data.frame(ego = rep(1:length(alterL), each = 20), alter = rep(1:20), cdn = NA, study = NA, bff = NA,
    csn = NA)

for (i in unique(df2$ego)) {
    for (j in 1:20) {
        # for alters nested in ego find out if names denoting alter j appear in the 4 egonets
        alter <- unlist(alterL[[i]][j, -1], use.names = F)  # get names alter j
        alter <- alter[!is.na(alter)]  # exclude NAs
        cdn <- alter %in% net1[i, ]
        study <- alter %in% net2[i, ]
        bff <- alter %in% net3[i, ]
        csn <- alter %in% net4[i, ]
        # and if so, give alter j score 1 on indicators; 0 otherwise
        df2$cdn[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% cdn, 1, 0)
        df2$study[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% study, 1, 0)
        df2$bff[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% bff, 1, 0)
        df2$csn[which(df2$ego == i & df2$alter == j)] <- ifelse("TRUE" %in% csn, 1, 0)
    }
}

# now that i have, for each alter of ego (including duplicates) at t2, the nets to which they
# belong..  i continue with the w1-w2 matching matrices

# we already subsetted the matching matrices (in `w1w2`), but now we take only the rows
# corresponding to w3 egos who have w2 maintained/created alters
w1w2 <- w1w2[which(w1w2$respnr %in% unique(test$respnr[which(test$w3participation == 1)])), ]

for (i in 1:length(alterL)) {

    matchingL <- vector("list", 20)  #pre-allocate empty list of length 20, to store matching matrices
    {
        matchingL[[1]] <- w1w2[i, 1:20]
        matchingL[[2]] <- w1w2[i, 21:40]
        matchingL[[3]] <- w1w2[i, 41:60]
        matchingL[[4]] <- w1w2[i, 61:80]
        matchingL[[5]] <- w1w2[i, 81:100]
        matchingL[[6]] <- w1w2[i, 101:120]
        matchingL[[7]] <- w1w2[i, 121:140]
        matchingL[[8]] <- w1w2[i, 141:160]
        matchingL[[9]] <- w1w2[i, 161:180]
        matchingL[[10]] <- w1w2[i, 181:200]
        matchingL[[11]] <- w1w2[i, 201:220]
        matchingL[[12]] <- w1w2[i, 221:240]
        matchingL[[13]] <- w1w2[i, 241:260]
        matchingL[[14]] <- w1w2[i, 261:280]
        matchingL[[15]] <- w1w2[i, 281:300]
        matchingL[[16]] <- w1w2[i, 301:320]
        matchingL[[17]] <- w1w2[i, 321:340]
        matchingL[[18]] <- w1w2[i, 341:360]
        matchingL[[19]] <- w1w2[i, 361:380]
        matchingL[[20]] <- w1w2[i, 381:400]
    }

    # find the 'right' matching matrix in this list, by taking the one that contains answers
    ind <- NULL
    for (j in seq_along(matchingL)) {
        # check along the sequence of elements j in the matching matrix list if they are non-empty
        # and not NA
        check <- FALSE
        for (col in matchingL[[j]]) {
            if (!all(is.na(col)) && any(nchar(col) > 0)) {
                check <- TRUE
                break
            }
        }
        if (check) {
            ind <- j
            break
        }
    }
    if (length(ind) > 0) {
        # get the matrix
        mm <- matchingL[[ind]]

        # extract alter ids
        ans <- stringr::str_extract_all(mm, "\\(?[0-9,.]+\\)?")
        # here, the object refers to the w2-alter j; and the element indicator in the list refers
        # to the w3-alter

        for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation ==
            1)])[i])])) {
            # for wave-2 alter j

            # to which row/w3-alter was alter j matched?
            match <- which(ans == j)

            # and in which networks did this w3-alter belong?
            nets <- df2[which(df2$ego == i & df2$alter == match[1]), ]

            if (length(match) > 0) {
                # if j was matched to w3-alters...

                # assign to alter j the networks in which the w3-alter appeared
                test$cdn3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$cdn[1]
                test$study3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] &
                  test$alterid == j)] <- nets$study[1]
                test$bff3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$bff[1]
                test$csn3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                  j)] <- nets$csn[1]
            }
        }
    }
}

# also add dynamic relational info on closeness and communication frequency in w3, this was only
# asked for alters from w2 (those maintained from w1 or w2-created)!
test$frequency.t3 <- NA
test$closeness.t3 <- NA

# subset w3 name interpreters on contact freq. of w1 alters (sq021 - sq040!)
# tail(names(data5a),234)
freq <- data5a[, c(1106:1125)]
close <- data5a[, c(1126:1145)]

# recode into numeric values;
freq <- ifelse(freq == "(Bijna) elke dag", 7, ifelse(freq == "1-2 keer per week", 6, ifelse(freq == "Aantal keer per maand",
    5, ifelse(freq == "Ong. 1 keer per maand", 4, ifelse(freq == "Aantal keer per jaar", 3, ifelse(freq ==
        "Ong. 1 keer per jaar", 2, ifelse(freq == "Nooit", 1, NA)))))))
close <- ifelse(close == "Heel erg hecht", 4, ifelse(close == "Hecht", 3, ifelse(close == "Enigszins hecht",
    2, ifelse(close == "Niet hecht", 1, NA))))

for (i in 1:length(alterL)) {
    # for ego i for wave-2 alter j
    for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i])])) {

        test$frequency.t3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
            j)] <- freq[i, ][!is.na(freq[i, ])][j]

        test$closeness.t3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
            j)] <- close[i, ][!is.na(close[i, ])][j]
    }
}

# last, add respnodent's reasons for not renaming a w2-alter. this was only asked for w2 alters who
# were not relisted
test$reason <- NA

# subset reasons given for not renaming a w2-alter tail(names(data5a),243)
reasons <- data5a[, c(1146:1165)]
# unique(reasons$vergeten.SQ001.)  if, according to ego, the relationship with alter changed ('Onze
# relatie is veranderd.'), we probed further
reasons2 <- data5a[, c(1186:1205)]

for (i in 1:length(alterL)) {
    # for ego i

    # if any w2-alter of i went unlisted (thus, scored 0 on `surviveW3`)...

    if (0 %in% test$surviveW3[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i])]) {

        # for *non-renamed* alter j
        for (j in unique(test$alterid[which(test$ego == unique(test$ego[which(test$w3participation ==
            1)])[i] & test$surviveW3 == 0)])) {

            # get respondent i's reason for not re-naming j,
            reasonij <- reasons[i, j]
            # if it was due to a change in relationship, probe further
            reasonij <- ifelse(reasonij == "Onze relatie is veranderd.", reasons2[i, j], reasonij)
            # and if the relationship changed in other ways than we offered as choices, just set to
            # 'other'
            reasonij <- ifelse(reasonij == "De relatie is op een andere manier veranderd.", "Andere reden.",
                reasonij)

            test$reason[which(test$ego == unique(test$ego[which(test$w3participation == 1)])[i] & test$alterid ==
                j)] <- reasonij
        }
    }
}

# recode... unique(test$reason)
test$reason <- ifelse(test$reason == "Andere reden.", "miscellaneous", ifelse(test$reason == "Er is geen gelegenheid geweest voor ons om contact te hebben.",
    "no occasion to get together", ifelse(test$reason == "Eén van ons is verhuisd.", "someone moved",
        ifelse(test$reason == "Eén van ons heeft een belangrijke verandering doorgemaakt  (zoals het stoppen met studeren, het aangaan/beëindigen van een relatie, het krijgen van een kind, enzovoort).",
            "other life event", ifelse(test$reason == "Eén van ons heeft gezondheidsproblemen.", "other life event",
                ifelse(test$reason == "We zijn uit elkaar gegroeid/de relatie is verwaterd.", "drifted apart",
                  ifelse(test$reason == "We hadden meningsverschillen of ruzie.", "disagreement / conflict",
                    ifelse(test$reason == "Ik ben simpelweg vergeten om deze persoon opnieuw te noemen.",
                      "forgotten", test$reason))))))))

data_alters23 <- test
# now 'bind back together'
test <- df_alters[which(df_alters$statusW2 == "Dropped"), ]
df_alters <- bind_rows(test, data_alters23)

# rearrange, by ego, and status
df_alters <- df_alters %>%
    arrange(ego, factor(statusW2, levels = c("Maintained", "Created", "Dropped")))
row.names(df_alters) <- 1:nrow(df_alters)

# new alter ids, 1:n_alter
for (i in unique(df_alters$ego)) {
    df_alters$alterid[which(df_alters$ego == i)] <- 1:length(df_alters$alterid[which(df_alters$ego ==
        i)])
}

# exclude 'names'
df_alters.nn <- df_alters[, -c(5:8)]

# save the resulting dataframe (exclude names)
fsave(df_alters.nn, "tie_maintenance.RDa")


5 networkdata.RDa

We take ego’s alters at t, and see who becomes sports partner at t+1. We do this both for wave 1 –> wave 2, and wave 2 –> wave 3.

First, tidy up the data-frame (deleting stuff that we won’t need + re-ordering columns)

df <- fload("./data/processed/20240717tie_maintenance.RDa")

# set gender to binary
df$ego_female <- ifelse(df$ego_gender == 2, 1, df$ego_gender)
df$alter_female <- ifelse(df$alter_gender == 2, 1, df$alter_gender)

# multiplex t2
df$multiplex.t2 <- rowSums(df[, c("cdn2", "study2", "bff2", "csn2")]) - 1
# in analyzing waves 1 and 2, we look at w1 alters and where they reappear at w2
df1 <- df[-which(df$statusW2 == "Created"), ]
# nrow(df1) #n=3174

# make variables reflecting whether alters are member of each network layer at t
df1$cdn <- df1$cdn1
df1$bff <- df1$bff1
df1$csn <- df1$csn1
df1$study <- df1$study1

# Y: network at t+1
df1$Ycdn <- df1$cdn2
df1$Ycsn <- df1$csn2
df1$Ybff <- df1$bff2
df1$Ystudy <- df1$study2

# NA (i.e., 'did not reappear so not chance to be named again'), to 0
df1$Ycdn[is.na(df1$Ycdn)] <- 0
df1$Ycsn[is.na(df1$Ycsn)] <- 0
df1$Ybff[is.na(df1$Ybff)] <- 0
df1$Ystudy[is.na(df1$Ystudy)] <- 0

# in analyzing waves 2 and 3, we look at w2-alters (maintained / created) and see if and where they
# reappear at w3. so, drop w2-dropped and only of egos who participated in w3
df2 <- df[-which(df$statusW2 == "Dropped"), ]
df2 <- df2[df2$w3participation == 1, ]
nrow(df2)

# make variables reflecting whether alters are member of each network layer at t
df2$cdn <- df2$cdn2
df2$bff <- df2$bff2
df2$csn <- df2$csn2
df2$study <- df2$study2

# Y: network at t+1
df2$Ycdn <- df2$cdn3
df2$Ycsn <- df2$csn3
df2$Ybff <- df2$bff3
df2$Ystudy <- df2$study3

# NA (i.e., 'did not reappear so not chance to be named again'), to 0
df2$Ycdn[is.na(df2$Ycdn)] <- 0
df2$Ycsn[is.na(df2$Ycsn)] <- 0
df2$Ybff[is.na(df2$Ybff)] <- 0
df2$Ystudy[is.na(df2$Ystudy)] <- 0

# subset columns of interest
colnames(df1)[c(31, 90, 2, 3, 4, 91, 6:10, 16:30, 39, 92:99, 36, 41, 15)]
df1 <- df1[, c(31, 90, 2, 3, 4, 91, 6:10, 16:30, 39, 92:99, 36, 41, 15)]

colnames(df1) <- sub("1$", "", colnames(df1))
# names(df1)[names(df1)=='multiplex'] <- 'multiplex.t'

colnames(df2)[c(31, 90, 2, 3, 4, 91, 6:10, 69:70, 18:30, 39, 92:99, 36, 41, 15)]
df2 <- df2[, c(31, 90, 2, 3, 4, 91, 6:10, 69:70, 18:30, 39, 92:99, 36, 41, 15)]
colnames(df2) <- sub("2$", "", colnames(df2))

df1$period <- 1
df2$period <- 2

# fill NA values on transitions in period 2
for (i in which(is.na(df2$housing.transition_bin))) {
    df2$housing.transition_bin[i] <- df1$housing.transition_bin[which(df1$ego == df2$ego[i])][1]
    df2$occupation.transition_bin[i] <- df1$occupation.transition_bin[which(df1$ego == df2$ego[i])][1]
}

# combine
data <- rbind(df1, df2)


fsave

fsave(data, "networkdata.Rda")



References

Franken, Rob, Hidde Bekhuis, and Jochem Tolsma. 2023. “The Sports and Friendships Study 2021-2023 (Data File).” DANS Data Station Social Sciences and Humanities. https://doi.org/10.17026/SS/GODKDR.
———. 2024. “Choosing Your Sports Partners: Assessing Selection Preferences Through Observational and Experimental Studies.” Research Quarterly for Exercise and Sports. https://doi.org/10.1080/02701367.2024.2389907.
LS0tDQp0aXRsZTogIkRhdGEgcHJlcGFyYXRpb24iDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNzczogdHdlYWtzLmNzcw0KICAgIHRvYzogIHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCi0tLQ0KDQoNCmBgYHtyLCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpvcHRzX2NodW5rJHNldCh0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9MTAwKSx0aWR5PVRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLGNvbW1lbnQgPSAiIz4iLCBjYWNoZT1UUlVFLCBjbGFzcy5zb3VyY2U9YygidGVzdCIpLCBjbGFzcy5vdXRwdXQ9YygidGVzdDMiKSkNCm9wdGlvbnMod2lkdGggPSAxMDApDQpyZ2w6OnNldHVwS25pdHIoKQ0KDQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikge3NwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgeCkgfQ0KYGBgDQoNCg0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoJ3RvcCcsICdyaWdodCcpKQ0KI2tsaXBweTo6a2xpcHB5KGNvbG9yID0gJ2RhcmtyZWQnKQ0KI2tsaXBweTo6a2xpcHB5KHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0RvbmUnKQ0KYGBgDQoNCg0KLS0tICANCg0KVGhlIGZvbGxvd2luZyBzY3JpcHRzIGNhbiBiZSB1c2VkIHRvIHJlcGxpY2F0ZSB0aGUgZGF0YS1zZXQgb2YgQEZyYW5rZW4yMDIyLiBJdCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBieSBkb3dubG9hZGluZzogYHIgeGZ1bjo6ZW1iZWRfZmlsZSgiLi9kYXRhIHNoYXJlZC9uZXR3b3JrZGF0YS5SRGEiKWANCg0KDQoNCi0tLS0NCg0KPGJyPg0KDQojIEdldHRpbmcgc3RhcnRlZA0KDQpUbyBjb3B5IHRoZSBjb2RlLCBjbGljayB0aGUgYnV0dG9uIGluIHRoZSB1cHBlciByaWdodCBjb3JuZXIgb2YgdGhlIGNvZGUtY2h1bmtzLg0KDQojIyBjbGVhbiB1cA0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpybShsaXN0PWxzKCkpDQpnYygpDQpgYGANCg0KPGJyPg0KDQojIyBnZW5lcmFsIGN1c3RvbSBmdW5jdGlvbnMNCg0KLSBgZnBhY2thZ2UuY2hlY2tgOiBDaGVjayBpZiBwYWNrYWdlcyBhcmUgaW5zdGFsbGVkIChhbmQgaW5zdGFsbCBpZiBub3QpIGluIFINCi0gYGZzYXZlYDogRnVuY3Rpb24gdG8gc2F2ZSBkYXRhIHdpdGggdGltZSBzdGFtcCBpbiBjb3JyZWN0IGRpcmVjdG9yeQ0KLSBgZmxvYWRgOiBMb2FkIFItb2JqZWN0cyB1bmRlciBuZXcgbmFtZXMNCi0gYGZzaG93ZGZgOiBQcmludCBvYmplY3RzIChgdGliYmxlYCAvIGBkYXRhLmZyYW1lYCkgbmljZWx5IG9uIHNjcmVlbiBpbiBgLlJtZGAuDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KZnBhY2thZ2UuY2hlY2sgPC0gZnVuY3Rpb24ocGFja2FnZXMpIHsNCiAgICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsNCiAgICAgICAgaWYgKCFyZXF1aXJlKHgsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICAgICAgICAgIGluc3RhbGwucGFja2FnZXMoeCwgZGVwZW5kZW5jaWVzID0gVFJVRSkNCiAgICAgICAgICAgIGxpYnJhcnkoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KICAgICAgICB9DQogICAgfSkNCn0NCg0KZnNhdmUgPC0gZnVuY3Rpb24oeCwgZmlsZSwgbG9jYXRpb24gPSAiLi9kYXRhL3Byb2Nlc3NlZC8iLCAuLi4pIHsNCiAgICBpZiAoIWRpci5leGlzdHMobG9jYXRpb24pKQ0KICAgICAgICBkaXIuY3JlYXRlKGxvY2F0aW9uKQ0KICAgIGRhdGVuYW1lIDwtIHN1YnN0cihnc3ViKCJbOi1dIiwgIiIsIFN5cy50aW1lKCkpLCAxLCA4KQ0KICAgIHRvdGFsbmFtZSA8LSBwYXN0ZShsb2NhdGlvbiwgZGF0ZW5hbWUsIGZpbGUsIHNlcCA9ICIiKQ0KICAgIHByaW50KHBhc3RlKCJTQVZFRDogIiwgdG90YWxuYW1lLCBzZXAgPSAiIikpDQogICAgc2F2ZSh4LCBmaWxlID0gdG90YWxuYW1lKQ0KfQ0KDQpmbG9hZCAgPC0gZnVuY3Rpb24oZmlsZU5hbWUpew0KICBsb2FkKGZpbGVOYW1lKQ0KICBnZXQobHMoKVtscygpICE9ICJmaWxlTmFtZSJdKQ0KfQ0KDQpmc2hvd2RmIDwtIGZ1bmN0aW9uKHgsIGRpZ2l0cyA9IDIsIC4uLikgew0KICAgIGtuaXRyOjprYWJsZSh4LCBkaWdpdHMgPSBkaWdpdHMsICJodG1sIiwgLi4uKSAlPiUNCiAgICAgICAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSkgJT4lDQogICAgICAgIGthYmxlRXh0cmE6OnNjcm9sbF9ib3god2lkdGggPSAiMTAwJSIsIGhlaWdodCA9ICIzMDBweCIpDQp9DQpgYGANCg0KPGJyPg0KDQojIyBuZWNlc3NhcnkgcGFja2FnZXMNCg0KLSBgZHBseXJgOiBwYWNrYWdlIGZvciBkYXRhIHdyYW5nbGluZw0KLSBgbHVicmlkYXRlYDogcGFyc2UgYW5kIG1hbmlwdWxhdGUgZGF0ZXMNCi0gYHN0cmluZ3JgOiBzdHJpbmcgbWFuaXB1bGF0aW9uDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KcGFja2FnZXMgPSBjKCJkcGx5ciIsICJsdWJyaWRhdGUiLCAic3RyaW5nciIpDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCnJtKHBhY2thZ2VzKQ0KYGBgDQo8YnI+DQoNCiMgRG93bmxvYWQgZGF0YQ0KDQpBbm9ueW1pemVkIGRhdGEtc2V0cyBvZiB0aGUgJ1Nwb3J0cyBhbmQgRnJpZW5kc2hpcHMnIHN0dWR5IGFyZSBkZXBvc2l0ZWQgaW4gREFOUyBEYXRhIFN0YXRpb24gU1NIIFtAZGF0YTIwMjJdLiBGb3IgdGhpcyBzdHVkeSB3ZSB1c2Ugd2F2ZXMgMy01IChDb2hvcnQgSUkpOg0KDQoNCg0KLSBgciB4ZnVuOjplbWJlZF9maWxlKCIuL2RhdGEvd2F2ZTNfcHVibGljLlJEYSIpYA0KLSBgciB4ZnVuOjplbWJlZF9maWxlKCIuL2RhdGEvd2F2ZTRfcHVibGljLlJEYSIpYA0KLSBgciB4ZnVuOjplbWJlZF9maWxlKCIuL2RhdGEvd2F2ZTVfcHVibGljLlJEYSIpYA0KDQoNCkRvd25sb2FkIHRoZSBkYXRhLWZpbGVzLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGAuL2RhdGEvYCBmb2xkZXIuIEJ1dCBmaXJzdCwgbWFrZSBhIGAuL2RhdGEvYCBmb2xkZXI6IA0KDQpgYGB7ciwgZXZhbD1GfQ0KaWZlbHNlKCFkaXIuZXhpc3RzKCJkYXRhIiksIGRpci5jcmVhdGUoImRhdGEiKSwgRkFMU0UpDQpgYGAgDQoNCjxicj4NCg0KVG8gc2VlIHRoZSBjb2RlIHVzZWQgdG8gYW5vbnltaXplIHRoZSByYXcgZGF0YSBmaWxlcywgc2VlOiBodHRwczovL25ldGNoYW5nZS5uZXRsaWZ5LmFwcC9wcmVwLg0KDQoNCiMgSW1wb3J0IGRhdGENCg0KTG9hZCB0aGUgZG93bmxvYWRlZCBkYXRhLiBGaXJzdCwgd2UgY2xlYW4gb3VyIGVudmlyb25tZW50IChidXQgd2Uga2VlcCBvdXIgZnVuY3Rpb25zOyB3ZSBuZWVkIHRoZW0gbGF0ZXIgb24pLg0KDQpgYGB7cixldmFsPUZ9DQojY2xlYW4gZW52aXJvbm1lbnQsIGJ1dCBrZWVwIGZ1bmN0aW9ucw0Kcm0obGlzdCA9IHNldGRpZmYobHMoKSwgbHNmLnN0cigpKSkNCg0KI2xvYWQgcHVibGljIGRhdGENCmRhdGEzIDwtIGZsb2FkKCIuL2RhdGEvd2F2ZTNfcHVibGljLlJEYSIpDQpkYXRhNCA8LSBmbG9hZCgiLi9kYXRhL3dhdmU0X3B1YmxpYy5SRGEiKQ0KZGF0YTUgPC0gZmxvYWQoIi4vZGF0YS93YXZlNV9wdWJsaWMuUkRhIikNCmBgYA0KDQoNCjxicj4NCg0KLS0tLQ0KDQoNCiMgdGllX21haW50ZW5hbmNlLlJEYSANCg0KSW4gdGhlIGZvbGxvd2luZyBzY3JpcHQsIEkgY29uc3RydWN0IGEgbG9uZyBkYXRhLWZyYW1lIChiYXNlZCBvbiBDb2hvcnQgSUksIHdhdmVzIDEtMi0zKSwgd2l0aCBhbHRlcnMgbmVzdGVkIGluIGVnb3MsIHRvIGludmVzdGlnYXRlIHdoaWNoIGFsdGVycyBhcmUgbWFpbnRhaW5lZCBpbiB0aGUgcGVyc29uYWwgbmV0d29ya3Mgb2YgZWdvIG92ZXIgdGhlIGFjYWRlbWljIHllYXIuIFRvIGVhY2ggZWdvLCByZWxldmFudCBpbmRpdmlkdWFsLWxldmVsLCBjb250ZXh0dWFsLWxldmVsLCBhbmQgbmV0d29yay1sZXZlbCBhdHRyaWJ1dGVzIGFyZSBhc3NpZ25lZDsgdG8gZWFjaCBhbHRlciwgcmVsZXZhbnQgYWx0ZXIgYW5kIGR5YWRpYyBmZWF0dXJlcyBhcmUgYXNzaWduZWQuIFRoZSBkYXRhLXNldCBpcyBzYXZlZC4NCg0KIyMgd2F2ZSAxIC0tPiB3YXZlIDIgKG1haW50YWluZWQgdnMgZHJvcHBlZCkNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojIHN1YnNldCByZXNwb25kZW50cyB0aGF0IGZpbGxlZCBvdXQgYm90aCBzdXJ2ZXlzIHcxIGFuZCB3MjsNCiMgYnkgbWF0Y2hpbmcgb24gYHJlc3BucmANCmRhdGEgPC0gZGF0YTNbd2hpY2goZGF0YTMkcmVzcG5yICVpbiUgdW5pcXVlKGRhdGE0JHJlc3BucikpLF0NCnJvdy5uYW1lcyhkYXRhKSA8LSAxOm5yb3coZGF0YSkNCm5yb3coZGF0YSkgI049NTE2DQoNCiMgbWFrZSBhIGRhdGFmcmFtZSBvZiB3MS1hbHRlcnMsIHdpdGggcG90ZW50aWFsIGR1cGxpY2F0ZXMuLi4NCiMgcmVjYWxsIHRoYXQgYWxsIGFsdGVyIG5hbWVzIHdlcmUgcmVwbGFjZWQgd2l0aCBhIHVuaXF1ZSBhbm9ueW1pemVkIGFsdGVyLWlkDQpkZl9uYW1lcyA8LSBkYXRhLmZyYW1lKA0KICBwMSA9IGRhdGEkZWdvbmV0MS5TUTAwMS4sDQogIHAyID0gZGF0YSRlZ29uZXQxLlNRMDAyLiwNCiAgcDMgPSBkYXRhJGVnb25ldDEuU1EwMDMuLA0KICBwNCA9IGRhdGEkZWdvbmV0MS5TUTAwNC4sDQogIHA1ID0gZGF0YSRlZ29uZXQxLlNRMDA1LiwNCiAgcDYgPSBkYXRhJGVnb25ldDIuU1EwMDEuLA0KICBwNyA9IGRhdGEkZWdvbmV0Mi5TUTAwMi4sDQogIHA4ID0gZGF0YSRlZ29uZXQyLlNRMDAzLiwNCiAgcDkgPSBkYXRhJGVnb25ldDIuU1EwMDQuLA0KICBwMTA9IGRhdGEkZWdvbmV0Mi5TUTAwNS4sDQogIHAxMT0gZGF0YSRlZ29uZXQzLlNRMDAxLiwNCiAgcDEyPSBkYXRhJGVnb25ldDMuU1EwMDIuLA0KICBwMTM9IGRhdGEkZWdvbmV0My5TUTAwMy4sDQogIHAxND0gZGF0YSRlZ29uZXQzLlNRMDA0LiwNCiAgcDE1PSBkYXRhJGVnb25ldDMuU1EwMDUuLA0KICBwMTY9IGRhdGEkZWdvbmV0NC5TUTAwMS4sDQogIHAxNz0gZGF0YSRlZ29uZXQ0LlNRMDAyLiwNCiAgcDE4PSBkYXRhJGVnb25ldDQuU1EwMDMuLA0KICBwMTk9IGRhdGEkZWdvbmV0NC5TUTAwNC4sDQogIHAyMD0gZGF0YSRlZ29uZXQ0LlNRMDA1LikNCg0KIyJwcmUtYWxsb2NhdGUiIGVtcHR5IGxpc3Qgb2YgbGVuZ3RoIGVxdWFscyBudW1iZXIgb2YgZWdvcw0KYWx0ZXJMIDwtIHZlY3RvcigibGlzdCIsIG5yb3coZGZfbmFtZXMpKQ0KDQojIGxvb3Agb3ZlciBhbGwgZWdvcw0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogICAgYWx0ZXJMW1tpXV0gPC0gZGF0YS5mcmFtZSgNCiAgICAgIGVnb19nZW5kZXIgPSBOQSwgZWdvX2FnZSA9IE5BLCBlZ29fZWR1YyA9IE5BLA0KICAgICAgYWx0ZXJpZCA9IDE6MjAsIG5hbWUxID0gTkEsIG5hbWUyID0gTkEsIG5hbWUzID0gTkEsIG5hbWU0ID0gTkEsDQogICAgICBhbHRlcl9nZW5kZXIgPSBOQSwgYWx0ZXJfYWdlID0gTkEsIGFsdGVyX2VkdWM9TkEsDQogICAgICBzYW1lX2dlbmRlciA9IE5BLCBkaWZfYWdlID0gTkEsIHNpbV9lZHVjID0gTkEsDQogICAgICBjZG5fZW1iZWQudDEgPSBOQSwgc3R1ZHlfZW1iZWQudDEgPSBOQSwgYmZmX2VtYmVkLnQxID0gTkEsIGNzbl9lbWJlZC50MSA9IE5BKQ0KfQ0KDQojIGZpbGwgdGhlIG5hbWVzIGJhc2VkIG9uIHRoZSBuYW1lcyBkYXRhLWZyYW1lIGFuZCByZXBsYWNlIGVtcHR5IHN0cmluZ3Mgd2l0aCA8TkE+DQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gdW5saXN0KGRmX25hbWVzW2ksIF0sIHVzZS5uYW1lcz1GQUxTRSkNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gaWZlbHNlKGFsdGVyTFtbaV1dJG5hbWUxPT0iIiwgTkEsIGFsdGVyTFtbaV1dJG5hbWUxKQ0KfQ0KDQojIGEgbWF0Y2hpbmcgbWF0cml4IGFsbG93ZWQgZWdvIHRvIG1hdGNoIG5hbWVzIHRoYXQgcmVmZXJyZWQgdG8gdGhlIHNhbWUgcGVyc29uLg0KIyBpbiBsaW1lc3VydmV5LCBpIGNvdWxkIG5vdCBsZXQgdGhlIG51bWJlciBvZiBjb2x1bW5zIGNvbmRpdGlvbg0KIyBvbiB0aGUgbnVtYmVyIG9mIGFsdGVycyBuYW1lZCBpbiB0aGUgbGF0ZXN0IGVnb25ldCwgc28gaSBtYWRlIDUgc2VwYXJhdGUgbWF0cmljZXMsDQojIGNvbmRpdGlvbmFsIG9uIG5ldHNpemUuDQojIGkgY2FsY3VsYXRlIG5ldHNpemUgZm9yIGVhY2ggbmV0DQp7DQogIG5ldDEgPC0gY2JpbmQoZGF0YSRlZ29uZXQxLlNRMDAxLixkYXRhJGVnb25ldDEuU1EwMDIuLCBkYXRhJGVnb25ldDEuU1EwMDMuLGRhdGEkZWdvbmV0MS5TUTAwNC4sIGRhdGEkZWdvbmV0MS5TUTAwNS4pDQogIG5ldDEgPC0gaWZlbHNlKG5ldDE9PSIiLCBOQSwgbmV0MSkNCiAgbnMxIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MSkpIHsNCiAgICBuczFbaV0gPC0gbGVuZ3RoKG5ldDFbaSxdW3doaWNoKCFpcy5uYShuZXQxW2ksXSkpXSkNCiAgfQ0KICBuZXQyIDwtIGNiaW5kKGRhdGEkZWdvbmV0Mi5TUTAwMS4sZGF0YSRlZ29uZXQyLlNRMDAyLiwgZGF0YSRlZ29uZXQyLlNRMDAzLixkYXRhJGVnb25ldDIuU1EwMDQuLCBkYXRhJGVnb25ldDIuU1EwMDUuKQ0KICBuZXQyIDwtIGlmZWxzZShuZXQyPT0iIiwgTkEsIG5ldDIpDQogIG5zMiA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDIpKSB7DQogICAgbnMyW2ldIDwtIGxlbmd0aChuZXQyW2ksXVt3aGljaCghaXMubmEobmV0MltpLF0pKV0pDQogIH0NCiAgbmV0MyA8LSBjYmluZChkYXRhJGVnb25ldDMuU1EwMDEuLGRhdGEkZWdvbmV0My5TUTAwMi4sIGRhdGEkZWdvbmV0My5TUTAwMy4sZGF0YSRlZ29uZXQzLlNRMDA0LiwgZGF0YSRlZ29uZXQzLlNRMDA1LikNCiAgbmV0MyA8LSBpZmVsc2UobmV0Mz09IiIsIE5BLCBuZXQzKQ0KICBuczMgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQzKSkgew0KICAgIG5zM1tpXSA8LSBsZW5ndGgobmV0M1tpLF1bd2hpY2goIWlzLm5hKG5ldDNbaSxdKSldKQ0KICB9DQogIG5ldDQgPC0gY2JpbmQoZGF0YSRlZ29uZXQ0LlNRMDAxLixkYXRhJGVnb25ldDQuU1EwMDIuLCBkYXRhJGVnb25ldDQuU1EwMDMuLGRhdGEkZWdvbmV0NC5TUTAwNC4sIGRhdGEkZWdvbmV0NC5TUTAwNS4pDQogIG5ldDQgPC0gaWZlbHNlKG5ldDQ9PSIiLCBOQSwgbmV0NCkNCiAgbnM0IDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0NCkpIHsNCiAgICBuczRbaV0gPC0gbGVuZ3RoKG5ldDRbaSxdW3doaWNoKCFpcy5uYShuZXQ0W2ksXSkpXSkNCiAgfQ0KfQ0KDQojIGkgY29uc3RydWN0IHRoZSBtYXRjaGluZyBtYXRyaWNlcywgMSAtIDUgKGNvbmRpdGlvbmFsIG9uIHRoZSBucyBvZiB0aGUgbGF0ZXN0IG5ldCkNCiMgcHV0IHRoZXNlIGluIGEgbGlzdCBhbmQgbGlzdCB0aGVzZSBhZ2FpbiwgZm9yIGVhY2ggcmVzcG9uZGVudCAoc28gYSBsaXN0IG9mIGxpc3RzLi4uKQ0KbWF0Y2hpbmdMaXN0IDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCiAgbWF0Y2hpbmdMIDwtIGxpc3QoKQ0KICAjIG1ha2UgNSBzZXBlcmF0ZSBtYXRjaGluZyBtYXRyaWNlcy4gbmF0dXJhbGx5LCBvbmx5IDEgaXMgcmVsZXZhbnQuLi4gYnV0IGkgd2lsbCBzZWxlY3QgdGhhdCBsYXRlci4NCiAgbWF0Y2hpbmdMW1sxXV0gPC0gY2JpbmQoZGF0YSRtYXRjaGluZzFOMS5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzFOMS5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzFOMS5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzFOMS5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzFOMS5TUTAwNV9TUTAwMS5baV0pDQogIG1hdGNoaW5nTFtbMl1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFOMi5TUTAwMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMi5TUTAwNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZ0xbWzNdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMy5baV0pKQ0KICBtYXRjaGluZ0xbWzRdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONC5TUTAwMV9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwNF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzFONC5TUTAwM19TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDA0LltpXSkpDQogIG1hdGNoaW5nTFtbNV1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONS5TUTAwMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzFONS5TUTAwMV9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNF9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDQuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwMl9TUTAwNS5baV0sIGRhdGEkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzFONS5TUTAwNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3RbW2ldXSA8LSBtYXRjaGluZ0wNCn0gIyBzby4uLiBtYXRjaGluZ0xbWzFdXVtbNV1dIGlzIG1hdGNoaW5nbWF0cml4IDUgKGkuZS4sIDUgYWx0ZXJzIG5hbWVkIGluIGVnb25ldDIpIGZvciBlZ28gMQ0KDQojIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgbWF0Y2hpbmcgbWF0cmljZXMgYW5kIHRoZSBuZXRzaXplcyBmb3IgZWdvIGFsbG93cyBtZSB0byBtYXRjaCB0aGUgbmFtZXMgbXlzZWxmLg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdCkpIHsgICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdFtbaV1dICAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QNCiAgbnMgPC0gbnMyW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQyDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQyW2ksXQ0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWUyW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PW1hdGNoZWRbLDJdKV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfSAjaWdub3JlIHdhcm5pbmcNCg0KI3JlcGVhdCBmb3IgdGhlIHNlY29uZCBtYXRjaGluZyBtYXRyaWNlcw0KIyAoaS5lLiwgbWF0Y2hpbmcgZWdvbmV0MyBhbHRlcnMgdG8gcHJldi4gYWx0ZXJzKTsNCm1hdGNoaW5nTGlzdDIgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzJMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzJMW1sxXV0gPC0gY2JpbmQoZGF0YSRtYXRjaGluZzJOMS5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMS5TUTAxMF9TUTAwMS5baV0pDQogIG1hdGNoaW5nMkxbWzJdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJOMi5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJOMi5TUTAxMF9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzJMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAzLltpXSkpDQogIG1hdGNoaW5nMkxbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk40LlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk40LlNRMDAxX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDAzX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA0X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA2X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA3X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDA5X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk40LlNRMDEwX1NRMDA0LltpXSkpDQogIG1hdGNoaW5nMkxbWzVdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJONS5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAyX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDAzX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA1X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA2X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA4X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDA5X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzJONS5TUTAwMV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwMl9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwM19TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNF9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwN19TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOF9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwNS5baV0sZGF0YSRtYXRjaGluZzJONS5TUTAxMF9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QyW1tpXV0gPC0gbWF0Y2hpbmcyTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MikpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0MltbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zM1tbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0Mw0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDNbaSxdDQogICAgDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTNbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KI2FuZCBmb3IgbWF0Y2hpbmcgbWF0cml4IDMgKGkuZS4sIG1hdGNoaW5nIGVnb25ldDQgd2l0aCBlZ29uZXRzIDEtMykNCm1hdGNoaW5nTGlzdDMgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzNMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzNMW1sxXV0gPC0gY2JpbmQoZGF0YSRtYXRjaGluZzNOMS5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMS5TUTAxMF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjEuU1EwMTFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04xLlNRMDEyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMS5TUTAxM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjEuU1EwMTRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04xLlNRMDE1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmczTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjIuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMTBfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDExX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTNfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDE0X1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjIuU1EwMDFfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDRfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDdfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjIuU1EwMTBfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDExX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjIuU1EwMTNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04yLlNRMDE0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzNMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNOMy5TUTAwMV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwN19TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMS5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAxMF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxM19TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNOMy5TUTAwMV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwN19TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMi5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAxMF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxM19TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YSRtYXRjaGluZzNOMy5TUTAwMV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwN19TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMy5baV0sZGF0YSRtYXRjaGluZzNOMy5TUTAxMF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNOMy5TUTAxM19TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nM0xbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM040LlNRMDAxX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAyX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA0X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA1X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA3X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA4X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAxLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDEwX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMV9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDEzX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNF9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM040LlNRMDAxX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAyX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA0X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA1X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA3X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA4X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAyLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDEwX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMV9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDEzX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNF9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM040LlNRMDAxX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA0X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA3X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDEwX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDEzX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM040LlNRMDAxX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA0X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA3X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDEwX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDEzX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhJG1hdGNoaW5nM040LlNRMDAxX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAyX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDAzX1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA0X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA1X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA2X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA3X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA4X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDA5X1NRMDA0LltpXSxkYXRhJG1hdGNoaW5nM040LlNRMDEwX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxMV9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDQuW2ldLCBkYXRhJG1hdGNoaW5nM040LlNRMDEzX1NRMDA0LltpXSwgZGF0YSRtYXRjaGluZzNONC5TUTAxNF9TUTAwNC5baV0sIGRhdGEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjUuU1EwMDFfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDRfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDdfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMTBfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDExX1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTNfU1EwMDEuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE0X1NRMDAxLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjUuU1EwMDFfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDRfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDdfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMTBfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDExX1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMi5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTNfU1EwMDIuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE0X1NRMDAyLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjUuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMTBfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjUuU1EwMDFfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDRfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDdfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMTBfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTNfU1EwMDMuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGEkbWF0Y2hpbmczTjUuU1EwMDFfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDRfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDdfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGEkbWF0Y2hpbmczTjUuU1EwMTBfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDExX1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwNS5baV0sIGRhdGEkbWF0Y2hpbmczTjUuU1EwMTNfU1EwMDUuW2ldLCBkYXRhJG1hdGNoaW5nM041LlNRMDE0X1NRMDA1LltpXSwgZGF0YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QzW1tpXV0gPC0gbWF0Y2hpbmczTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MykpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0M1tbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zNFtbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0NA0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDRbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTRbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KI2kgYWxzbyBjYWxjdWxhdGUgc3RydWN0dXJhbCBlbWJlZGRlZG5lc3MgKGFsdGVyLWxldmVsKSBwZXIgZWdvLW5ldC4NCg0KI2ZpcnN0IGkgZml4IHNvbWUgaXJyZWd1bGFyaXRpZXMgaW4gdGhlIGRhdGENCiMxLiBhIG1pc3Rha2Ugd2FzIG1hZGUgaW4gbGFiZWxpbmcgdGhlIGFkamFjZW5jeSBtYXRyaXggdmFyaWFibGVzIGZvciB0aGUgZnJpZW5kcyBuZXR3b3JrLCBzbyBpIGZpcnN0IHJlbGFiZWwgdGhlbSwgc28gdGhlIHNhbWUgc2NyaXB0IGJlbG93IGZvciBjb25zdHJ1Y3RpbmcgZGVuc2l0eSBzY29yZXMgY2FuIGJlIHVzZWQuDQojKEkgc3RhcnRlZCB3aXRoIE4xIGluc3RlYWQgb2YgTjIgKE4gZGVub3RlcyB0aGUgbnVtYmVyIG9mIG5hbWVkIGFsdGVyczsgd2hpY2ggc2hvdWxkIHN0YXJ0IGF0IDIsIGJlY2F1c2Ugb25seSBhdCBuZXRzaXplcyA+IDEsIEkgYXNrZWQgZm9yIGFsdGVyLXRpZXMpICkNCmRhdGEgPC0gZGF0YSAlPiUNCiAgcmVuYW1lIChhZGozTjJhLlNRMDAxLiA9IGFkajNOMWEuU1EwMDEuLCBhZGozTjNhLlNRMDAxLiA9IGFkajNOMmEuU1EwMDEuLGFkajNOM2EuU1EwMDIuID0gYWRqM04yYS5TUTAwMi4sYWRqM04zYi5TUTAwMS4gPSBhZGozTjJiLlNRMDAxLixhZGozTjRhLlNRMDAxLiA9IGFkajNOM2EuU1EwMDEuLGFkajNONGEuU1EwMDIuID0gYWRqM04zYS5TUTAwMi4sYWRqM040YS5TUTAwMy4gPSBhZGozTjNhLlNRMDAzLixhZGozTjRiLlNRMDAxLiA9IGFkajNOM2IuU1EwMDEuLGFkajNONGIuU1EwMDIuID0gYWRqM04zYi5TUTAwMi4sICAgYWRqM040Yy5TUTAwMS4gPSBhZGozTjNjLlNRMDAxLixhZGozTjVhLlNRMDAxLiA9IGFkajNONGEuU1EwMDEuLGFkajNONWEuU1EwMDIuID0gYWRqM040YS5TUTAwMi4sYWRqM041YS5TUTAwMy4gPSBhZGozTjRhLlNRMDAzLixhZGozTjVhLlNRMDA0LiA9IGFkajNONGEuU1EwMDQuLGFkajNONWIuU1EwMDEuID0gYWRqM040Yi5TUTAwMS4sYWRqM041Yi5TUTAwMi4gPSBhZGozTjRiLlNRMDAyLixhZGozTjViLlNRMDAzLiA9IGFkajNONGIuU1EwMDMuLGFkajNONWMuU1EwMDEuID0gYWRqM040Yy5TUTAwMS4sYWRqM041Yy5TUTAwMi4gPSBhZGozTjRjLlNRMDAyLixhZGozTjVkLlNRMDAxLiA9IGFkajNONGQuU1EwMDEuKQ0KDQojMi4gYSBsYWJlbGluZyBtaXN0YWtlOiBmb3IgdGhlIGFkamFjZW5jeSBtYXRyaXggZm9yIHNwb3J0cyB0aWVzLCB3aXRoIG5zPTMsIHRoZSBxdWVzdGlvbiBhYm91dCByZWxhdGlvbiBiZXR3ZWVuIGFsdGVyIDIgYW5kIDMgd2FzIGNvZGVkIHdyb25nbHkuIA0KZGF0YSRhZGo0TjNiLlNRMDAxLiA8LSBkYXRhJGFkajROM2IuU1EwMDIuDQojIw0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KDQogICNnZXQgbnVtYmVyIG9mIG5hbWVzIGxpc3RlZCBpbiB0aGUgZWdvbmV0cw0KICBubmFtZXNfY2RuIDwtIGxlbmd0aCh3aGljaChkYXRhW2ksYygiZWdvbmV0MS5TUTAwMS4iLCJlZ29uZXQxLlNRMDAyLiIsImVnb25ldDEuU1EwMDMuIiwiZWdvbmV0MS5TUTAwNC4iLCJlZ29uZXQxLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfc3R1ZHkgPC0gbGVuZ3RoKHdoaWNoKGRhdGFbaSxjKCJlZ29uZXQyLlNRMDAxLiIsImVnb25ldDIuU1EwMDIuIiwiZWdvbmV0Mi5TUTAwMy4iLCJlZ29uZXQyLlNRMDA0LiIsImVnb25ldDIuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19iZmYgPC0gbGVuZ3RoKHdoaWNoKGRhdGFbaSxjKCJlZ29uZXQzLlNRMDAxLiIsImVnb25ldDMuU1EwMDIuIiwiZWdvbmV0My5TUTAwMy4iLCJlZ29uZXQzLlNRMDA0LiIsImVnb25ldDMuU1EwMDUuIildIT0iIikpDQogIG5uYW1lc19jc24gPC0gbGVuZ3RoKHdoaWNoKGRhdGFbaSxjKCJlZ29uZXQ0LlNRMDAxLiIsImVnb25ldDQuU1EwMDIuIiwiZWdvbmV0NC5TUTAwMy4iLCJlZ29uZXQ0LlNRMDA0LiIsImVnb25ldDQuU1EwMDUuIildIT0iIikpDQogIA0KICAjQ0RODQogIA0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGEkYWRqMU4yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhJGFkajFOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGEkYWRqMU4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YSRhZGoxTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGEkYWRqMU40YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YSRhZGoxTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhJGFkajFONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGEkYWRqMU40Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YSRhZGoxTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhJGFkajFONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YSRhZGoxTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhJGFkajFONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGEkYWRqMU41YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YSRhZGoxTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhJGFkajFONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGEkYWRqMU41Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YSRhZGoxTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhJGFkajFONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGEkYWRqMU41Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YSRhZGoxTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2Nkbj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXM+MQ0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19jZG5dXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgDQogICNDRE46IDE6bm5hbWVzX0NETg0KICBhbHRlckxbW2ldXSRjZG5fZW1iZWQudDFbMTpubmFtZXNfY2RuXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgI1NUVURZDQoNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhJGFkajJOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YSRhZGoyTjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhJGFkajJOM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGEkYWRqMk4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhJGFkajJONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGEkYWRqMk40YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YSRhZGoyTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhJGFkajJONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGEkYWRqMk40Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YSRhZGoyTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGEkYWRqMk41YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YSRhZGoyTjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhJGFkajJONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGEkYWRqMk41YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YSRhZGoyTjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhJGFkajJONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGEkYWRqMk41Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YSRhZGoyTjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhJGFkajJONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGEkYWRqMk41ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19zdHVkeT4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfc3R1ZHldXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MVs2Oig1K25uYW1lc19zdHVkeSldIDwtIGVtYmVkIA0KICB9DQogIA0KICAjIEJFU1QgRlJJRU5EUw0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGEkYWRqM04yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhJGFkajNOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGEkYWRqM04zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YSRhZGozTjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGEkYWRqM040YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YSRhZGozTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhJGFkajNONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGEkYWRqM040Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YSRhZGozTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhJGFkajNONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YSRhZGozTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhJGFkajNONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGEkYWRqM041YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YSRhZGozTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhJGFkajNONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGEkYWRqM041Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YSRhZGozTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhJGFkajNONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGEkYWRqM041Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YSRhZGozTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2JmZj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfYmZmXV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQxWzExOigxMCtubmFtZXNfYmZmKV0gPC0gZW1iZWQgDQogIH0NCiAgDQogICMgU1BPUlRTIFBBUlRORVJTDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YSRhZGo0TjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGEkYWRqNE4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YSRhZGo0TjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhJGFkajROM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YSRhZGo0TjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhJGFkajRONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGEkYWRqNE40YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YSRhZGo0TjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhJGFkajRONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGEkYWRqNE40Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhJGFkajRONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGEkYWRqNE41YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YSRhZGo0TjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhJGFkajRONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGEkYWRqNE41Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YSRhZGo0TjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhJGFkajRONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGEkYWRqNE41Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YSRhZGo0TjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhJGFkajRONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfY3NuPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcw0KICAgICN0YWtlIHRoZSBtYXRyaXggY29ycmVzcG9uZGluZyB0aGUgbm5hbWVzDQogICAgbWF0IDwtIGFkakxbW25uYW1lc19jc25dXQ0KICAgIA0KICAgICN0aWVzIHRoYXQgYXJlICh2ZXJ5KSBjbG9zZSBhcmUgMQ0KICAgIG1hdFshaXMubmEobWF0KV0gPC0gaWZlbHNlKG1hdFshaXMubmEobWF0KV09PSJFcmcgaGVjaHQiIHwgbWF0WyFpcy5uYShtYXQpXT09IkhlY2h0IiwgMSwwKQ0KDQogICAgI2NhbGN1bGF0ZSBlbWJlZGRlZG5lc3MgZm9yIGVhY2ggYWx0ZXIvcm93Og0KICAgIGVtYmVkIDwtIGFwcGx5KG1hdCwgMSwgZnVuY3Rpb24ocm93KSB7DQogICAgbl9jb2xzIDwtIHN1bSghaXMubmEocm93KSkNCiAgICBuX29uZXMgPC0gc3VtKHJvdyA9PSAiMSIsIG5hLnJtID0gVFJVRSkNCiAgICByYXRpbyA8LSBuX29uZXMgLyBuX2NvbHMNCiAgICByZXR1cm4ocmF0aW8pDQogICAgfSkNCiAgICANCiAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDFbMTY6KDE1K25uYW1lc19jc24pXSA8LSBlbWJlZCANCiAgfQ0KfQ0KDQojYWx0ZXJzIGNvdWxkIGJlIG5hbWVkIGluIG11bHRpcGxlIG5hbWUgZ2VuZXJhdG9ycy4gZWFjaCBlbGVtZW50IG9mIGFsdGVyTCBjb250YWlucyByb3dzIGNvcnJlc3BvbmRpbmcgdG8gYWx0ZXJzIHRoYXQgbWF5IGJlICdkdXBsaWNhdGVzJy4NCiNpIG1hdGNoIHRoZSBzdHJ1Y3R1cmFsIGVtYmVkZGVkbmVzcyBtZWFzdXJlcw0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjZm9yIGVnbyBpIA0KICBmb3IgKGogaW4gMTpucm93KGFsdGVyTFtbaV1dKSkgeyAjZm9yIGFsdGVyIGoNCiAgICAgICAgDQogICAgI2lmIG5hbWUyIGlzIG5vdCBlbXB0eSwgYWx0ZXIgaiB3YXMgbWF0Y2hlZCB0byB0aGUgc3R1ZHkgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgc3R1ZHkgcGFydG5lciB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lMltqXQ0KICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQxW2pdIDwtIGlmZWxzZSghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTJbal0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDFbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTE9PWFsdGVyTFtbaV1dJG5hbWUyW2pdICYgIWlzLm5hKGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQxKSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MVtqXSkNCiAgICANCiAgICAjaWYgbmFtZTMgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBmcmllbmRzIG5ldHdvcms7IGFuZCBtb3JlIHByZWNpc2VseSwgdG8gdGhlIGZyaWVuZCB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lM1tqXQ0KICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MVtqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWUzW2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRiZmZfZW1iZWQudDFbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTE9PWFsdGVyTFtbaV1dJG5hbWUzW2pdICYgIWlzLm5hKGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MSkpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50MVtqXSkNCiAgICANCiAgICAjaWYgbmFtZTQgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBzcG9ydHMgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgc3BvcnRzIHBhcnRuZXIgd2l0aCBuYW1lMTogYWx0ZXJMW1tpXV0kbmFtZTRbal0NCiAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDFbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lNFtqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQxW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxPT1hbHRlckxbW2ldXSRuYW1lNFtqXSAmICFpcy5uYShhbHRlckxbW2ldXSRjc25fZW1iZWQudDEpKV0sICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MVtqXSApDQogIH0NCn0NCg0KIyBpIHVzZSB0aGUgbmFtZSBpbnRlcnByZXRlciBkYXRhIHRvIGFkZCAoc3RhYmxlKSBhbHRlciBjaGFyYWN0ZXJpc3RpY3MgKGUuZy4sIGdlbmRlcikNCiMgaW4gbmFtZS1pbnRlcnByZXRlciBxdWVzdGlvbnMsIG9ubHkgdW5pcXVlIChpLmUuLCBub24tbWF0Y2hlZCkgYWx0ZXJzIHdlcmUgbGlzdGVkLi4uIHRodXMsIGFsdGVyIGlkcyB3aXRob3V0IGEgZ2VuZGVyIGFzc2lnbmVkIHRvIHRoZW0gYXJlIG5vbi11bmlxdWVzLCBhbmQgY2FuIGxhdGVyIGJlIGZpbHRlcmVkIG91dC4NCmRmX2dlbmRlciA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YSRnZW5kZXIuU1EwMDEuLHAyID0gZGF0YSRnZW5kZXIuU1EwMDIuLHAzID0gZGF0YSRnZW5kZXIuU1EwMDMuLHA0ID0gZGF0YSRnZW5kZXIuU1EwMDQuLHA1ID0gZGF0YSRnZW5kZXIuU1EwMDUuLHA2ID0gZGF0YSRnZW5kZXIuU1EwMDYuLHA3ID0gZGF0YSRnZW5kZXIuU1EwMDcuLHA4ID0gZGF0YSRnZW5kZXIuU1EwMDguLHA5ID0gZGF0YSRnZW5kZXIuU1EwMDkuLHAxMD0gZGF0YSRnZW5kZXIuU1EwMTAuLHAxMT0gZGF0YSRnZW5kZXIuU1EwMTEuLHAxMj0gZGF0YSRnZW5kZXIuU1EwMTIuLHAxMz0gZGF0YSRnZW5kZXIuU1EwMTMuLHAxND0gZGF0YSRnZW5kZXIuU1EwMTQuLHAxNT0gZGF0YSRnZW5kZXIuU1EwMTUuLHAxNj0gZGF0YSRnZW5kZXIuU1EwMTYuLHAxNz0gZGF0YSRnZW5kZXIuU1EwMTcuLHAxOD0gZGF0YSRnZW5kZXIuU1EwMTguLHAxOT0gZGF0YSRnZW5kZXIuU1EwMTkuLHAyMD0gZGF0YSRnZW5kZXIuU1EwMjAuKQ0KDQojIHNhbWUgZm9yIGFnZS4uLg0KZGZfYWdlIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhJGFnZS5TUTAwMS4scDIgPSBkYXRhJGFnZS5TUTAwMi4scDMgPSBkYXRhJGFnZS5TUTAwMy4scDQgPSBkYXRhJGFnZS5TUTAwNC4scDUgPSBkYXRhJGFnZS5TUTAwNS4scDYgPSBkYXRhJGFnZS5TUTAwNi4scDcgPSBkYXRhJGFnZS5TUTAwNy4scDggPSBkYXRhJGFnZS5TUTAwOC4scDkgPSBkYXRhJGFnZS5TUTAwOS4scDEwPSBkYXRhJGFnZS5TUTAxMC4scDExPSBkYXRhJGFnZS5TUTAxMS4scDEyPSBkYXRhJGFnZS5TUTAxMi4scDEzPSBkYXRhJGFnZS5TUTAxMy4scDE0PSBkYXRhJGFnZS5TUTAxNC4scDE1PSBkYXRhJGFnZS5TUTAxNS4scDE2PSBkYXRhJGFnZS5TUTAxNi4scDE3PSBkYXRhJGFnZS5TUTAxNy4scDE4PSBkYXRhJGFnZS5TUTAxOC4scDE5PSBkYXRhJGFnZS5TUTAxOS4scDIwPSBkYXRhJGFnZS5TUTAyMC4pDQoNCiMga2luDQpkZl9raW4gPC0gZGF0YS5mcmFtZSggcDEgPSBkYXRhJGtpbi5TUTAwMS4scDIgPSBkYXRhJGtpbi5TUTAwMi4scDMgPSBkYXRhJGtpbi5TUTAwMy4scDQgPSBkYXRhJGtpbi5TUTAwNC4scDUgPSBkYXRhJGtpbi5TUTAwNS4scDYgPSBkYXRhJGtpbi5TUTAwNi4scDcgPSBkYXRhJGtpbi5TUTAwNy4scDggPSBkYXRhJGtpbi5TUTAwOC4scDkgPSBkYXRhJGtpbi5TUTAwOS4scDEwPSBkYXRhJGtpbi5TUTAxMC4scDExPSBkYXRhJGtpbi5TUTAxMS4scDEyPSBkYXRhJGtpbi5TUTAxMi4scDEzPSBkYXRhJGtpbi5TUTAxMy4scDE0PSBkYXRhJGtpbi5TUTAxNC4scDE1PSBkYXRhJGtpbi5TUTAxNS4scDE2PSBkYXRhJGtpbi5TUTAxNi4scDE3PSBkYXRhJGtpbi5TUTAxNy4scDE4PSBkYXRhJGtpbi5TUTAxOC4scDE5PSBkYXRhJGtpbi5TUTAxOS4scDIwPSBkYXRhJGtpbi5TUTAyMC4pDQoNCiNlZHVjYXRpb24NCmRmX2VkdWMgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkZWR1Yy5TUTAwMS4scDIgPSBkYXRhJGVkdWMuU1EwMDIuLHAzID0gZGF0YSRlZHVjLlNRMDAzLixwNCA9IGRhdGEkZWR1Yy5TUTAwNC4scDUgPSBkYXRhJGVkdWMuU1EwMDUuLHA2ID0gZGF0YSRlZHVjLlNRMDA2LixwNyA9IGRhdGEkZWR1Yy5TUTAwNy4scDggPSBkYXRhJGVkdWMuU1EwMDguLCBwOSA9IGRhdGEkZWR1Yy5TUTAwOS4scDEwPSBkYXRhJGVkdWMuU1EwMTAuLCBwMTE9IGRhdGEkZWR1Yy5TUTAxMS4sIHAxMj0gZGF0YSRlZHVjLlNRMDEyLiwgcDEzPSBkYXRhJGVkdWMuU1EwMTMuLCBwMTQ9IGRhdGEkZWR1Yy5TUTAxNC4sIHAxNT0gZGF0YSRlZHVjLlNRMDE1LiwgcDE2PSBkYXRhJGVkdWMuU1EwMTYuLCBwMTc9IGRhdGEkZWR1Yy5TUTAxNy4sIHAxOD0gZGF0YSRlZHVjLlNRMDE4LiwgcDE5PSBkYXRhJGVkdWMuU1EwMTkuLCBwMjA9IGRhdGEkZWR1Yy5TUTAyMC4pDQoNCiNhbHNvIGR5bmFtaWMgY2hhcmFjdGVyaXN0aWNzDQojY29tbXVuaWNhdGlvbiBmcmVxdWVuY3kNCmRmX2ZyZXEgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkZnJlcS5TUTAwMS4scDIgPSBkYXRhJGZyZXEuU1EwMDIuLHAzID0gZGF0YSRmcmVxLlNRMDAzLixwNCA9IGRhdGEkZnJlcS5TUTAwNC4scDUgPSBkYXRhJGZyZXEuU1EwMDUuLHA2ID0gZGF0YSRmcmVxLlNRMDA2LixwNyA9IGRhdGEkZnJlcS5TUTAwNy4scDggPSBkYXRhJGZyZXEuU1EwMDguLCBwOSA9IGRhdGEkZnJlcS5TUTAwOS4scDEwPSBkYXRhJGZyZXEuU1EwMTAuLCBwMTE9IGRhdGEkZnJlcS5TUTAxMS4sIHAxMj0gZGF0YSRmcmVxLlNRMDEyLiwgcDEzPSBkYXRhJGZyZXEuU1EwMTMuLCBwMTQ9IGRhdGEkZnJlcS5TUTAxNC4sIHAxNT0gZGF0YSRmcmVxLlNRMDE1LiwgcDE2PSBkYXRhJGZyZXEuU1EwMTYuLCBwMTc9IGRhdGEkZnJlcS5TUTAxNy4sIHAxOD0gZGF0YSRmcmVxLlNRMDE4LiwgcDE5PSBkYXRhJGZyZXEuU1EwMTkuLCBwMjA9IGRhdGEkZnJlcS5TUTAyMC4pDQoNCiNjbG9zZW5lc3MNCmRmX2Nsb3NlIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhJGNsb3NlLlNRMDAxLixwMiA9IGRhdGEkY2xvc2UuU1EwMDIuLHAzID0gZGF0YSRjbG9zZS5TUTAwMy4scDQgPSBkYXRhJGNsb3NlLlNRMDA0LixwNSA9IGRhdGEkY2xvc2UuU1EwMDUuLHA2ID0gZGF0YSRjbG9zZS5TUTAwNi4scDcgPSBkYXRhJGNsb3NlLlNRMDA3LixwOCA9IGRhdGEkY2xvc2UuU1EwMDguLCBwOSA9IGRhdGEkY2xvc2UuU1EwMDkuLHAxMD0gZGF0YSRjbG9zZS5TUTAxMC4sIHAxMT0gZGF0YSRjbG9zZS5TUTAxMS4sIHAxMj0gZGF0YSRjbG9zZS5TUTAxMi4sIHAxMz0gZGF0YSRjbG9zZS5TUTAxMy4sIHAxND0gZGF0YSRjbG9zZS5TUTAxNC4sIHAxNT0gZGF0YSRjbG9zZS5TUTAxNS4sIHAxNj0gZGF0YSRjbG9zZS5TUTAxNi4sIHAxNz0gZGF0YSRjbG9zZS5TUTAxNy4sIHAxOD0gZGF0YSRjbG9zZS5TUTAxOC4sIHAxOT0gZGF0YSRjbG9zZS5TUTAxOS4sIHAyMD0gZGF0YSRjbG9zZS5TUTAyMC4pDQoNCiNhbmQgb3RoZXIgZHlhZGljIGZlYXR1ZXJzDQojIGR1cmF0aW9uOw0KZGZfZHVyYXRpb24gPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkZHV1ci5TUTAwMS4scDIgPSBkYXRhJGR1dXIuU1EwMDIuLHAzID0gZGF0YSRkdXVyLlNRMDAzLixwNCA9IGRhdGEkZHV1ci5TUTAwNC4scDUgPSBkYXRhJGR1dXIuU1EwMDUuLHA2ID0gZGF0YSRkdXVyLlNRMDA2LixwNyA9IGRhdGEkZHV1ci5TUTAwNy4scDggPSBkYXRhJGR1dXIuU1EwMDguLCBwOSA9IGRhdGEkZHV1ci5TUTAwOS4scDEwPSBkYXRhJGR1dXIuU1EwMTAuLCBwMTE9IGRhdGEkZHV1ci5TUTAxMS4sIHAxMj0gZGF0YSRkdXVyLlNRMDEyLiwgcDEzPSBkYXRhJGR1dXIuU1EwMTMuLCBwMTQ9IGRhdGEkZHV1ci5TUTAxNC4sIHAxNT0gZGF0YSRkdXVyLlNRMDE1LiwgcDE2PSBkYXRhJGR1dXIuU1EwMTYuLCBwMTc9IGRhdGEkZHV1ci5TUTAxNy4sIHAxOD0gZGF0YSRkdXVyLlNRMDE4LiwgcDE5PSBkYXRhJGR1dXIuU1EwMTkuLCBwMjA9IGRhdGEkZHV1ci5TUTAyMC4pDQoNCiNnZW9ncmFwaGljYWwgcHJveGltaXR5DQpkZl9wcm94aW1pdHkgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkcHJveC5TUTAwMS4scDIgPSBkYXRhJHByb3guU1EwMDIuLHAzID0gZGF0YSRwcm94LlNRMDAzLixwNCA9IGRhdGEkcHJveC5TUTAwNC4scDUgPSBkYXRhJHByb3guU1EwMDUuLHA2ID0gZGF0YSRwcm94LlNRMDA2LixwNyA9IGRhdGEkcHJveC5TUTAwNy4scDggPSBkYXRhJHByb3guU1EwMDguLCBwOSA9IGRhdGEkcHJveC5TUTAwOS4scDEwPSBkYXRhJHByb3guU1EwMTAuLCBwMTE9IGRhdGEkcHJveC5TUTAxMS4sIHAxMj0gZGF0YSRwcm94LlNRMDEyLiwgcDEzPSBkYXRhJHByb3guU1EwMTMuLCBwMTQ9IGRhdGEkcHJveC5TUTAxNC4sIHAxNT0gZGF0YSRwcm94LlNRMDE1LiwgcDE2PSBkYXRhJHByb3guU1EwMTYuLCBwMTc9IGRhdGEkcHJveC5TUTAxNy4sIHAxOD0gZGF0YSRwcm94LlNRMDE4LiwgcDE5PSBkYXRhJHByb3guU1EwMTkuLCBwMjA9IGRhdGEkcHJveC5TUTAyMC4pDQoNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgDQogICNnZW5kZXINCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfZ2VuZGVyIDwtIA0KICAgIGlmZWxzZSh1bmxpc3QoZGZfZ2VuZGVyW2ksXSwgdXNlLm5hbWVzPUYpPT0iTWFuIiwgMCwgICMgbWFsZSA9IHJlZi4NCiAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9nZW5kZXJbaSxdLCB1c2UubmFtZXM9Rik9PSJWcm91dyIsIDEsDQogICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2dlbmRlcltpLF0sIHVzZS5uYW1lcz1GKT09IkFuZGVycyIsIDIsICIiKSkpDQogICNraW4gIA0KICBhbHRlckxbW2ldXSRraW4gPC0gDQogICAgaWZlbHNlKHVubGlzdChkZl9raW5baSxdLCB1c2UubmFtZXM9Rik9PSJKYSIsIDEsDQogICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfa2luW2ksXSwgdXNlLm5hbWVzPUYpPT0iTmVlIiwgMCwgIiIpKQ0KICAjYWdlICANCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfYWdlIDwtIA0KICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iSm9uZ2VyIGRhbiAxOCBqYWFyIiwgMTYsICM/Pz8NCiAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIxOCB0b3QgMjEgamFhciIsIDIwLA0KICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIyMiB0b3QgMjUgamFhciIsIDIzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMjYgdG90IDMwIGphYXIiLCAyOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIzMSB0b3QgNDAgamFhciIsIDM1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJPdWRlciBkYW4gNDAgamFhciIsIDQ1LCAjPz8/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJXZWV0IGlrIG5pZXQiLCBOQSwgIyBpIGRvbid0IGtub3cgPSBtaXNzaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9RikpKSkpKSkpDQogICNlZHVjYXRpb24NCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfZWR1YyA8LSBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09ImxhZ2VyZSBzY2hvb2wiLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0idm1ibywgbWF2byIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0ibWJvIiwgMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJoYXZvIiwgNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ2d28gLyBneW1uYXNpdW0iLCA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0iaGJvIiwgNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ1bml2ZXJzaXRlaXQiLCA3LCBOQSkpKSkpKSkgDQogICNmcmVxdWVuY3kNCiAgYWx0ZXJMW1tpXV0kZnJlcXVlbmN5LnQxIDwtIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iKEJpam5hKSBlbGtlIGRhZyIsIDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSIxLTIga2VlciBwZXIgd2VlayIsNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJBYW50YWwga2VlciBwZXIgbWFhbmQiLDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09Ik9uZy4gMSBrZWVyIHBlciBtYWFuZCIsNCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iQWFudGFsIGtlZXIgcGVyIGphYXIiLDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJPbmcuIDEga2VlciBwZXIgamFhciIsMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJOb29pdCIsMSwgTkEgKSkpKSkpKQ0KICAjY2xvc2VuZXNzDQogIGFsdGVyTFtbaV1dJGNsb3NlbmVzcy50MSA8LSBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJOaWV0IGhlY2h0IiwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iRW5pZ3N6aW5zIGhlY2h0IiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVjaHQiLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9jbG9zZVtpLF0sdXNlLm5hbWVzPUYpPT0iSGVlbCBlcmcgaGVjaHQiLCA0LCBOQSApKSkpDQogICNwcm94aW1pdHkNCiAgYWx0ZXJMW1tpXV0kcHJveGltaXR5IDwtIGlmZWxzZSh1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzPUZBTFNFKSA9PSAiSW4gaGV0emVsZmRlIGh1aXMiLCAicm9vbW1hdGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzID0gRkFMU0UpID09ICJJbiBkZXplbGZkZSBidXVydCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sdXNlLm5hbWVzPUYpPT0iSW4gZGV6ZWxmZGUgc3RyYWF0IiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZGZfcHJveGltaXR5W2ksXSx1c2UubmFtZXM9Rik9PSJJbiBkZXplbGZkZSBnZW1lZW50ZSIsICJjbG9zZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sIHVzZS5uYW1lcyA9IEZBTFNFKSA9PSAiSW4gaGV0emVsZmRlIGxhbmQiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9wcm94aW1pdHlbaSxdLCB1c2UubmFtZXMgPSBGQUxTRSkgPT0gIkluIGVlbiBhbmRlciBsYW5kIiwiZmFyIiwgTkEpKSkNCg0KICANCiAgICNkdXJhdGlvbjogIHRha2UgbWlkcG9pbnQgb24gc2NhbGUuDQogICBhbHRlckxbW2ldXSRkdXJhdGlvbiA8LSBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSJNaW5kZXIgZGFuIDEgamFhciIsIDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjEgdG90IDMgamFhciIsIDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjQgdG90IDggamFhciIsIDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSI5IHRvdCAxNSBqYWFyIiwgMTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9kdXJhdGlvbltpLF0sdXNlLm5hbWVzPUYpPT0iTWVlciBkYW4gMTUgamFhciIsIDE1LE5BICkpKSkpDQp9DQoNCiNmb3Igc3BvcnRzIHBhcnRuZXJzLCBob3cgZnJlcXVlbnQgdGhleSBwYXJ0aWNpcGF0ZSBhbmQgaG93IGNvbXBldGVudCB0aGV5IGFyZSBpbiB0aGUgc3BvcnQgdGhleSBkbyB3aXRoIGVnby4NCmRmX2FsdGZyZXEgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGEkYWx0ZnJlcTEsIHAyID0gZGF0YSRhbHRmcmVxMiwgcDMgPSBkYXRhJGFsdGZyZXEzLCBwNCA9IGRhdGEkYWx0ZnJlcTQsIHA1ID0gZGF0YSRhbHRmcmVxNSkNCmRmX2FsdGdyYWRlIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhJGdyYWRlMSwgcDIgPSBkYXRhJGdyYWRlMiwgcDMgPSBkYXRhJGdyYWRlMywgcDQgPSBkYXRhJGdyYWRlNCwgcDUgPSBkYXRhJGdyYWRlNSkNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgDQogIGFsdGVyTFtbaV1dJGFsdGVyX2ZyZXFbMTY6MjBdIDwtIHVubGlzdChkZl9hbHRmcmVxW2ksXSwgdXNlLm5hbWVzPVRSVUUpDQogIGFsdGVyTFtbaV1dJGFsdGVyX2dyYWRlWzE2OjIwXSA8LSB1bmxpc3QoZGZfYWx0Z3JhZGVbaSxdLCB1c2UubmFtZXM9VFJVRSkNCn0NCg0KIyBiZWZvcmUgd2UgY2FuIGNvbnN0cnVjdCBzaW1pbGFyaXR5IGluZGljZXMsIHdlIG11c3QgYWRkIGVnby1hdHRyaWJ1dGVzDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICAjICBnZW5kZXINCiAgYWx0ZXJMW1tpXV0kZWdvX2dlbmRlciA8LSBpZmVsc2UoZGF0YSRBMVtpXSA9PSAiTWFuIiwgMCxpZmVsc2UoZGF0YSRBMVtpXSA9PSAiVnJvdXciLCAxLGlmZWxzZShkYXRhJEExW2ldID09ICJPdmVyaWdlIiwgMixOQSkpKQ0KICANCiAgIyBlZHVjYXRpb24gDQogICMgdGhlc2Ugc2NvcmUgc2hvdWxkIGNvcnJlc3BvbmQgdG8gc2NvcmVzIGdpdmVuIHRvIGFsdGVyIGVkdWMuLi4NCiAgYWx0ZXJMW1tpXV0kZWdvX2VkdWMgPC0gaWZlbHNlKGRhdGEkVDFbaV0gPT0gImFhbiBkZSBIb2dlc2Nob29sIHZhbiBBcm5oZW0gZW4gTmlqbWVnZW4gKEhBTikiLCAiNiIsICI3IiApDQogDQogICMgYWdlDQogICMgY2FsY3VsYXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN1Ym1pc3Npb24gZGF0ZSBhbmQgYmlydGhkYXRlDQogICMgaW4geWVhcnMuDQogIGJpcnRoX2RhdGUgPC0gYXMuRGF0ZShkYXRhJEEyW2ldKQ0KICAjeF9kYXRlIDwtIGFzLkRhdGUoZGF0YSRzdWJtaXRkYXRlKSAjc3VibWlzc2lvbiBkYXRlIHdhcyBub3QgZGVwb3NpdGVkOyBzbywgdGFrZSAxLWphbiAyMDIzDQogIHhfZGF0ZSA8LSBhcy5EYXRlKCIyMDIzLTAxLTAxIikNCiAgYWx0ZXJMW1tpXV0kZWdvX2FnZSA8LSB0cnVuYygoYmlydGhfZGF0ZSAlLS0lIHhfZGF0ZSkgLyB5ZWFycygxKSkNCn0NCg0KIyBpIGFsc28gd2FudCB0byBrbm93IGVnbydzIHNwb3J0cyBmcmVxdWVuY3kgYW5kIHNraWxsDQojIHVsdGltYXRlbHksIGkgd2FudCB0byBtYWtlIGEgZHlhZGljIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIHNraWxsIGxldmVsIChkaWZmZXJlbmNlKSBvZiBlZ28gYW5kIGFsdGVyLCBpbiAqdGhlIHNwZWNpZmljIHNwb3J0cyB0aGF0IHRoZXkgZG8gdG9nZXRoZXIqDQojIGZvciBub3csIGkgd2lsbCBwdXQgZWdvJ3Mgc3BvcnRzIGZyZXF1ZW5jeSBhbmQgc2tpbGwsIHBlciBzcG9ydCwgaW4gYSBkYXRhZnJhbWUuIA0KIyBhbHNvLCB0aGUgc2V0dGluZyBlZ28gcGFydGljaXBhdGVzIGVhY2ggc3BvcnRzIGluIChlLmcuLCBhbG9uZSwgaW5mb3JtYWwsIGNsdWItb3JnYW5pemVkLCAuLi4pDQoNCiNmcmVxdWVuY3kNCmVnb3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFMzWC5TUTAwMS46UzNYLlNRMDE3LiwgUzNiWC5TUTAwMS46UzNiWC5TUTAxNy4gKQ0KZWdvc1tlZ29zID09ICJNaW5kZXIgZGFuIDEga2VlciBwZXIgbWFhbmQiXSA8LSAwLjEyNQ0KZWdvc1tlZ29zID09ICIxIGtlZXIgcGVyIG1hYW5kIiBdIDwtIDAuMjUNCmVnb3NbZWdvcyA9PSAiMiBrZWVyIHBlciBtYWFuZCIgXSA8LSAwLjUNCmVnb3NbZWdvcyA9PSAiMSBrZWVyIHBlciB3ZWVrIiBdIDwtIDENCg0KI2luIGNhc2VzIHdoZXJlIGVnbyBwYXJ0aWNpcGF0ZWQgbW9yZSB0aGFuIG9uY2UgYSB3ZWVrLCBnZXQgdGhlIGFuc3dlciB0byB0aGUgcXVlc3Rpbm8gaG93IG9mdGVuIHBlciB3ZWVrIGhlL3NoZSBwYXJ0aWNpcGF0ZWQNCmZvciAoaSBpbiAxOjE3KSB7DQogIGVnb3NbLGldIDwtIGlmZWxzZShlZ29zWyxpXSA9PSAiVmFrZXIgZGFuIDEga2VlciBwZXIgd2VlayIsIGdzdWIoIlxcRCIsICIiLCBlZ29zWywxNytpXSksIGVnb3NbLGldKQ0KfQ0KZWdvc1ssMToxN10gLT4gZWdvcw0KZWdvcyA8LSBtdXRhdGVfYWxsKGVnb3MsIGFzLm51bWVyaWMpDQoNCiNhbmQgc2tpbGwNCmVnb3MyIDwtIGRhdGEgJT4lDQogIHNlbGVjdChTMmIuU1EwMDEuOiBTMmIuU1EwMTcuKQ0KDQojYW5kIHNldHRpbmcNCmVnb3MzIDwtIGRhdGEgJT4lDQogIHNlbGVjdChTMmEuU1EwMDEuIDogUzJhLlNRMDE3LikNCmVnb3MzW2Vnb3MzID09ICJBbHMgbGlkIHZhbiBlZW4gY29tbWVyY2nDq2xlIHNwb3J0YWFuYmllZGVyIChiaWp2LiwgZml0bmVzc2NlbnRydW0pIl0gPC0gImd5bSINCmVnb3MzW2Vnb3MzID09ICJBbHMgbGlkIHZhbiBlZW4gc3BvcnR2ZXJlbmlnaW5nIl0gPC0gImNsdWIiDQplZ29zM1tlZ29zMyA9PSAiSW4gZ3JvZXBzdmVyYmFuZCwgZ2VvcmdhbmlzZWVyZCBkb29yIGplemVsZiwgZmFtaWxpZSwgdnJpZW5kZW4sIGVuL29mIGtlbm5pc3NlbiJdIDwtICJpbmZvcm1hbCINCmVnb3MzW2Vnb3MzID09ICJBbGxlZW4sIG9uZ2VvcmdhbmlzZWVyZCJdIDwtICJhbG9uZSINCg0KI2ZpcnN0LCBhbHNvIHNhdmUgZWdvJ3MgKHdlZWtseSkgc3BvcnRzIGZyZXF1ZW5jeSAoYXZlcmFnZWQgb3ZlciBzcG9ydHMgdHlwZXMpDQojYW5kIGVnbydzIGF2ZXJhZ2UvdG90YWwgc2tpbGwgKG92ZXIgc3BvcnRzIHR5cGVzKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kZWdvX21lYW5mcmVxIDwtIGlmZWxzZSggbGVuZ3RoKHdoaWNoKGlzLm5hKGVnb3NbaSxdKSkpIDwgMTcsIHJvd01lYW5zKGVnb3NbaSxdLCBuYS5ybT1UUlVFKSwgMCkgI3Rob3NlIHdpdGhvdXQgYSBzcG9ydHMgZ2V0IGEgMA0KICBhbHRlckxbW2ldXSRlZ29fbWVhbnNraWxsIDwtIHJvd01lYW5zKGVnb3MyW2ksXSwgbmEucm0gPSBUUlVFKQ0KICAjYW5kIGFsc28gc2F2ZSBudW1iZXIgb2Ygc3BvcnRzDQogIGFsdGVyTFtbaV1dJGVnb19uc3BvcnQgPC0gbGVuZ3RoKHdoaWNoKCFpcy5uYShlZ29zW2ksXSkpKQ0KfQ0KDQojbm93IGdldCBmb3IgZWFjaCBzcG9ydHMgcGFydG5lciBpbiB0aGUgbGlzdCBvZiBhbHRlcnMsIHRoZSBzcG9ydHMgZWdvIGRvZXMgd2l0aCB0aGVtDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbw0KDQogIGFsdGVyTFtbaV1dJHNwb3J0dG9nZXRoZXJbMTY6MjBdIDwtDQogICAgDQogICAgYyggaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGFbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU04xLlNRMDAxLjpzYW1lbkNTTjEuU1EwMTcuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YVtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjEuU1EwMDEuOnNhbWVuQ1NOMS5TUTAxNy4pID09ICJKYSIgKSwgTkEpLA0KICANCiAgaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGFbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU04yLlNRMDAxLjpzYW1lbkNTTjIuU1EwMTcuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YVtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjIuU1EwMDEuOnNhbWVuQ1NOMi5TUTAxNy4pID09ICJKYSIgKSwgTkEpLA0KICANCiAgaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGFbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU04zLlNRMDAxLjpzYW1lbkNTTjMuU1EwMTcuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YVtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjMuU1EwMDEuOnNhbWVuQ1NOMy5TUTAxNy4pID09ICJKYSIgKSwgTkEpLA0KICANCiAgaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGFbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU040LlNRMDAxLjpzYW1lbkNTTjQuU1EwMTcuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YVtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjQuU1EwMDEuOnNhbWVuQ1NONC5TUTAxNy4pID09ICJKYSIgKSwgTkEpLA0KICANCiAgaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGFbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU041LlNRMDAxLjpzYW1lbkNTTjUuU1EwMTcuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YVtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjUuU1EwMDEuOnNhbWVuQ1NONS5TUTAxNy4pID09ICJKYSIgKSwgTkEpDQogICkNCn0NCg0KIyBpIGZpbHRlciBvdXQgdGhlIHVuaXF1ZSwgbm9uLWR1cGxpY2F0ZSBhbHRlcnM7DQojIGJ5IGV4Y2x1ZGluZyBhbHRlcnMgd2l0aCBlbXB0eSBzdHJpbmdzIGZvciBnZW5kZXIgYXR0cmlidXRlDQoNCiNidXQgZmlyc3QsIG1hdGNoIHNwb3J0cyBhdHRyaWJ1dGVzLg0KI3RoYXQgaXMsIGZyb20gc3BvcnRzIHBhcnRuZXJzIChwMTYtcDIwKSB0byBvdGhlciBhbHRlcnMgd2hvIGNvcnJlc3BvbmQgdG8gc3BvcnRzIHBhcnRuZXJzIChuYW1lNCkNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgZm9yIChqIGluIHdoaWNoKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lNCkpKSB7DQogICAgYWx0ZXJMW1tpXV1baiwgYygiYWx0ZXJfZnJlcSIsICJhbHRlcl9ncmFkZSIsICJzcG9ydHRvZ2V0aGVyIildIDwtIGFsdGVyTFtbaV1dW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxID09IGFsdGVyTFtbaV1dJG5hbWU0W2pdKSwgYygiYWx0ZXJfZnJlcSIsICJhbHRlcl9ncmFkZSIsICJzcG9ydHRvZ2V0aGVyIildDQogIH0NCn0NCg0KI25vdyBkbyB0aGUgZmlsdGVyaW5nIG9uIGdlbmRlciwgdG8gZmlsdGVyIG91dCBkdXBsaWNhdGVzLg0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dIDwtIGFsdGVyTFtbaV1dW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyX2dlbmRlciE9IiIpLF0NCiAgIyBhbmQgcmVwbGFjZSB0aGUgYWx0ZXIgaWQ6IDEgOiBuby4gdW5pcXVlIGFsdGVycw0KICBhbHRlckxbW2ldXSRhbHRlcmlkIDwtIDE6bnJvdyhhbHRlckxbW2ldXSkNCn0NCg0KI2F0dGFjaCBlZ29fZ3JhZGUsIGVnbydzIHNlbGYtYXNzZXNzZWQgc2tpbGwgZm9yIHRoZSBzcG9ydHMgaGUvc2hlIGRvZXMgdG9nZXRoZXIgd2l0aCBhbHRlcg0KI2FuZCBlZ29fZnJlcSwgZWdvJ3Mgc3BvcnRzIGZyZXF1ZW5jeSBpbiB0aGlzIHNwb3J0cyBhY3Rpdml0eQ0KI2FuZCBlZ29fY29udGV4dCwgdGhlIHNvY2lhbCBzcG9ydGluZyBjb250ZXh0IGluIHdoaWNoIGVnbyBkb2VzIHRoaXMgYWN0aXZpdHkgKGFzc3VtZWRseSwgd2l0aCBhbHRlcikNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkNCiAgYWx0ZXJMW1tpXV0kZWdvX2dyYWRlIDwtIE5BDQogIGFsdGVyTFtbaV1dJGVnb19mcmVxIDwtIE5BDQogIGFsdGVyTFtbaV1dJGVnb19jb250ZXh0IDwtIE5BDQogIA0KICBmb3IgKGogaW4gd2hpY2goIWlzLm5hKGFsdGVyTFtbaV1dJHNwb3J0dG9nZXRoZXIpKSkgeyAjZm9yIGFsdGVycyB3aXRoIGEgdmFsdWUgb24gdGhlICdzcG9ydHRvZ2V0aGVyJyBhdHRyaWJ1dGUgKGkuZS4sIHdobyBiZWxvbmcgdG8gc3BvcnRuZXR3b3JrKQ0KICAgIA0KICAgICNhdHRhY2ggZWdvJ3Mgc2VsZi1hc3Nlc3NlZCBzcG9ydHMgc2tpbGwgZm9yIHRoZSBzcG9ydHMgaGUvc2hlIGRpZCB3aXRoIGFsdGVyIHdpdGggYWx0ZXJpZCBqDQogICAgYWx0ZXJMW1tpXV0kZWdvX2dyYWRlW2FsdGVyTFtbaV1dJGFsdGVyaWQgPT0gal0gPC0gZWdvczJbaSwgYWx0ZXJMW1tpXV0kc3BvcnR0b2dldGhlcltqXV0NCiAgICANCiAgICAjYW5kIGVnbydzIHNlbGYtYXNzZXNzZWQgc3BvcnRzIGZyZXF1ZW5jeSBmb3IgdGhpcyBzcG9ydHMgdHlwZQ0KICAgIGFsdGVyTFtbaV1dJGVnb19mcmVxW2FsdGVyTFtbaV1dJGFsdGVyaWQgPT0gal0gPC0gZWdvc1tpLCBhbHRlckxbW2ldXSRzcG9ydHRvZ2V0aGVyW2pdXQ0KICAgIA0KICAgICNhbmQgdGhlIHNldHRpbmcgaW4gd2hpY2ggZWdvIGVuZ2FnZWQgKHdpdGggYWx0ZXIpIGluIHRoaXMgc3BvcnRzIHR5cGUNCiAgICBhbHRlckxbW2ldXSRlZ29fY29udGV4dFthbHRlckxbW2ldXSRhbHRlcmlkID09IGpdIDwtIGVnb3MzW2ksIGFsdGVyTFtbaV1dJHNwb3J0dG9nZXRoZXJbal1dDQogICAgDQogIH0NCn0NCg0KI2Fsc28gYWRkIHdoZXRoZXIgZWdvIHdhcyBzdGlsbCBhY3RpdmUgaW4gdGhlIHNwb3J0cyB0eXBlIGhlL3NoZSBkaWQgd2l0aCBhbHRlciwgYXQgdCsxDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICANCiAgYWx0ZXJMW1tpXV0kZWdvX3F1aXQgPC0gTkENCiAgDQogIGZvciAoaiBpbiB3aGljaCghaXMubmEoYWx0ZXJMW1tpXV0kc3BvcnR0b2dldGhlcikpKSB7ICNmb3IgYWx0ZXJzIHdpdGggYSB2YWx1ZSBvbiB0aGUgJ3Nwb3J0dG9nZXRoZXInIGF0dHJpYnV0ZSAoaS5lLiwgd2hvIGJlbG9uZyB0byBzcG9ydG5ldHdvcmspDQogICAgDQogICAgI2dldCBzcG9ydHMgdHlwZSBvZiBlZ28gYW5kIGFsdGVyIGoNCiAgICBzaGFyZWRzcG9ydCA8LSBhbHRlckxbW2ldXVtqLCJzcG9ydHRvZ2V0aGVyIl0NCiAgICANCiAgICAjZ2V0IGVnbydzIGFjdGl2aXR5IGxldmVscyBvdmVyIHNwb3J0cyB0eXBlcw0KICAgIHNwb3J0c2VnbyA8LSBkYXRhNCAlPiUNCiAgICAgIHNlbGVjdChTMWEuU1EwMDEuOlMxYS5TUTAxNy4pICU+JSANCiAgICAgIGZpbHRlcihyb3dfbnVtYmVyKCkgPT0gaSkNCiAgICANCiAgICAjYW5kIGNoZWNrIHdoZXRoZXIgZWdvIHF1aXQgcGFydGljaXBhdGluZyBpbiBzcG9ydHMgdHlwZSBoZS9zaGUgZGlkIHdpdGggYWx0ZXIgajoNCiAgICBhbHRlckxbW2ldXSRlZ29fcXVpdFtqXSA8LSBpZmVsc2Uoc3BvcnRzZWdvWyxzaGFyZWRzcG9ydF0gPT0gIk5pZXQiLCAxLDApDQogIH0NCn0NCiAgDQojZHlhZGljIHNpbWlsYXJpdHkgbWVhc3VyZXMNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSAgeyAjIGZvciBlZ28gaQ0KICAjIGdldCBhdHRyaWJ1dGVzIG9mIGVnbw0KICBhZ2VpIDwtIGFsdGVyTFtbaV1dJGVnb19hZ2VbMV0NCiAgZ2VuZGVyaSA8LSBhbHRlckxbW2ldXSRlZ29fZ2VuZGVyWzFdDQogIGVkaSA8LSBhbHRlckxbW2ldXSRlZ29fZWR1Y1sxXQ0KICANCiAgZm9yIChqIGluIDE6bWF4KGFsdGVyTFtbaV1dJGFsdGVyaWQpKSB7ICMgZm9yIGFsdGVyIGoNCiAgICAjIGNhbGN1bGF0ZSAic2FtZSBnZW5kZXIiICgwLzEpDQogICAgZ2VuZGVyaiA8LSBhcy5udW1lcmljKGFsdGVyTFtbaV1dJGFsdGVyX2dlbmRlcltqXSkgIyBnZXQgYWx0ZXIgaiBnZW5kZXINCiAgICBzYW1lIDwtIGlmZWxzZShnZW5kZXJpPT1nZW5kZXJqLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJHNhbWVfZ2VuZGVyW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PWopXSA8LSBzYW1lDQogICAgDQogICAgI3NhbWUgZWR1Y2F0aW9uDQogICAgZWR1aiA8LSBhbHRlckxbW2ldXSRhbHRlcl9lZHVjW2pdDQogICAgc2FtZSA8LSBpZmVsc2UoZWR1aj09ZWRpLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJHNpbV9lZHVjW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PWopXSA8LSBzYW1lDQogICAgDQogICAgIyBjYWxjdWxhdGUgc2ltaWxhcml0eSBmb3IgYWdlIGFzIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYWx0ZXIgYW5kIGVnbyB2YWx1ZQ0KICAgICNnZXQgYWx0ZXIgaiBhdHRyaWJ1dGVzDQogICAgYWdlaiA8LSBhcy5udW1lcmljKGFsdGVyTFtbaV1dJGFsdGVyX2FnZVtqXSkNCiAgICAjZGlmZmVyZW5jZSBzY29yZQ0KICAgIGRpZmFnZSA8LSBhYnMoYWdlaSAtIGFnZWopDQogICAgDQogICAgIyBzbyBoaWdoZXIgdmFsdWVzIHJlcHJlc2VudCAqbGVzcyogc2ltaWxhcml0eQ0KICAgIGlmKCAhaXMubmEgKGFnZWopICkgeyAjIGFnZSBzaW1pbGFyaXR5IG9ubHkgY2FsY3VsYWJsZSBpZiB6X2ogaXMga25vd24hDQogICAgICAgIGFsdGVyTFtbaV1dJGRpZl9hZ2Vbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09aildIDwtIGRpZmFnZQ0KICAgICAgfSBlbHNlIHsgYWx0ZXJMW1tpXV0kZGlmX2FnZVt3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gTkF9DQogIH0NCn0NCg0KI2Jhc2VkIG9uIHRoaXMsIGkgbWFrZSBhIGxvbmcgZGF0YWZyYW1lIHdpdGggYWx0ZXJzIG5lc3RlZCBpbiBlZ28uDQojZmlyc3QsIGFkZCBhbiBlZ29faWQNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dJGVnbyA8LSBpDQogIGFsdGVyTFtbaV1dJHJlc3BuciA8LSBkYXRhJHJlc3BucltpXQ0KfQ0KDQojY29tYmluZSB1c2luZyByYmluZA0KZGYgPC0gZG8uY2FsbChyYmluZCxhbHRlckwpDQoNCiNvdGhlciBlZ28gdmFyaWFibGVzOg0KI3RyYW5zaXRpb25zDQojIHdlIG5lZWQgaW5mbyBvZiB3YXZlcyAxIGFuZCAyLCBzbyBpIG1lcmdlIHRoZW0NCmQgPC0gbWVyZ2UoZGF0YTMsIGRhdGE0LCBieT0icmVzcG5yIikNCmQgPC0gZGF0YS5mcmFtZShkW29yZGVyKGQkcmVzcG5yLCBkZWNyZWFzaW5nID0gRkFMU0UpLCBdKSAjIGFuZCBzb3J0IGJ5IHJlc3Bucg0KDQojMS4gcmVzaWRlbnRpYWwgdHJhbnNpdGlvbnMNCmRmJGhvdXNpbmcudDFhIDwtIE5BICN3YXZlIDEsIHByZS10cmFuc2l0aW9uDQpkZiRob3VzaW5nLnQxYiA8LSBOQSAjd2F2ZSAxLCBwb3N0LXRyYW5zaXRpb24NCmRmJGhvdXNpbmcudDIgPC0gTkEgI3dhdmUgMg0KZGYkaG91c2luZy50cmFuc2l0aW9uIDwtIE5BICNuby4gb2YgY2hhbmdlcyANCg0KI21ha2Ugc3VyZSBkZXNjcmlwdGlvbnMgb2YgbGl2aW5nIHNpdHVhdGlvbiBtYXRjaGVzIG92ZXIgd2F2ZXMNCmQkQTcgPC0gaWZlbHNlKGQkQTcgPT0gImlud29uZW5kIGJpaiBvdWRlcihzKS92ZXJ6b3JnZXIocykiLCAiaW53b25lbmQgYmlqIGplIG91ZGVyKHMpL3ZlcnpvcmdlcihzKSIsIGQkQTcpDQpkJEE0ZCA8LSBpZmVsc2UoZCRBNGQgPT0gImlud29uZW5kIGJpaiBvdWRlcihzKS92ZXJ6b3JnZXIocykiLCAiaW53b25lbmQgYmlqIGplIG91ZGVyKHMpL3ZlcnpvcmdlcihzKSIsIGQkQTRkKQ0KDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZGYkaG91c2luZy50MWFbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkJEE0LnhbaV0gIyB3MSwgaGFsZiB5ZWFyIHByaW9yIHRvIHRyYW5zaXRpb24NCiAgICANCiAgIyBpZiByZXNwb25kZW50IGhhZCBtb3ZlZCBhdCB0aGUgdGltZSBvZiB3MSwgZ2V0IGN1cnJlbnQgbGl2aW5nIHNpdHVhdGlvbg0KICBkZiRob3VzaW5nLnQxYlt3aGljaChkZiRlZ289PWkpXSA8LSBpZmVsc2UoZCRBNltpXSA9PSAiTmVlIiwgZCRBN1tpXSwgZGYkaG91c2luZy50MWFbd2hpY2goZGYkZWdvPT1pKV0pDQogIA0KICAjaWYgdGhleSBtb3ZlZCwgdGhpcyBpbmRpY2F0ZXMgYSB0cmFuc2l0aW9uDQogIHRyYW5zaXRpb24gPC0gaWZlbHNlKGQkQTZbaV09PSJOZWUiLCAxLCAwKQ0KICANCiAgIyBpZiByZXNwb25kZW50IGhhcyBtb3ZlZCBzaW5jZSB0aGVuIChpbiB3MiksIC4uLg0KICBkZiRob3VzaW5nLnQyW3doaWNoKGRmJGVnbz09aSldIDwtIGlmZWxzZShkJEE0LnlbaV0gPT0gIkphIiB8IGQkQTRiW2ldID09ICJKYSIgfCBkJEE0Y1tpXSA9PSAiSmEiLCBkJEE0ZFtpXSwgZGYkaG91c2luZy50MWJbd2hpY2goZGYkZWdvPT1pKV0pIA0KICANCiAgdHJhbnNpdGlvbiA8LSBpZmVsc2UoZCRBNC55W2ldID09ICJKYSIgfCBkJEE0YltpXSA9PSAiSmEiIHwgZCRBNGNbaV0gPT0gIkphIiwgdHJhbnNpdGlvbiArIDEsIHRyYW5zaXRpb24pDQogIA0KICAjIG5vLiBvZiBob3VzaW5nIHRyYW5zaXRpb24NCiAgZGYkaG91c2luZy50cmFuc2l0aW9uW3doaWNoKGRmJGVnbz09aSldIDwtIHRyYW5zaXRpb24NCn0NCg0KI2Fsc28gbWFrZSBpdCBiaW5hcnkgKHllcy9ubykNCmRmJGhvdXNpbmcudHJhbnNpdGlvbl9iaW4gPC0gaWZlbHNlKGRmJGhvdXNpbmcudHJhbnNpdGlvbiA+IDAsIDEsIDApDQoNCiMyLiB0cmFuc2l0aW9uIHRvIHVuaXZlcnNpdHkNCmRmJG9jY3VwYXRpb24udDEgPC0gTkENCmRmJG9jY3VwYXRpb24udDIgPC0gImhpZ2hlciIgI2V2ZXJ5Ym9keSBpcyBpbiBzY2hvb2wuLi4NCmRmJHN0dWR5LnllYXIgPC0gTkENCmRmJG9jY3VwYXRpb24udHJhbnNpdGlvbiA8LSBOQSANCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogIGRmJG9jY3VwYXRpb24udDFbd2hpY2goZGYkZWdvPT1pKV0gPC0gaWZlbHNlKGRhdGEkRTFbaV09PSJJayB6YXQgb3AgZGUgbWlkZGVsYmFyZSBzY2hvb2wiLCAic2Vjb25kYXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGEkRTFbaV09PSJJayBkZWVkIGVlbiBNQk8tLCBIQk8tIG9mIFdPLW9wbGVpZGluZyIsImhpZ2hlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGF0YSRFMVtpXT09IklrIHdlcmt0ZSIsIndvcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRhdGEkRTFbaV09PSJJayBoYWQgZWVuIHR1c3NlbmphYXIiLCJnYXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJEUxW2ldPT0iT3ZlcmlnZSIsIm90aGVyIixOQSkpKSkpDQoNCiAgZGYkc3R1ZHkueWVhclt3aGljaChkZiRlZ289PWkpXSA8LSBpZmVsc2UoZGF0YSRUM1tpXT09ImluIGhldCBlZXJzdGUgamFhciIsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJFQzW2ldPT0iaW4gaGV0IHR3ZWVkZSBqYWFyIiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkYXRhJFQzW2ldPT0iaW4gaGV0IGRlcmRlIGphYXIgb2YgaG9nZXIiLCAzLCBOQSkpKQ0KICANCiAgI3RyYW5zaXRpb24gPSAxIGZvciB0aG9zZSB3aG8gYXJlIGZpcnN0IHllYXJzIGFuZCB3aG8gY2FtZSBmcm9tIHNlY29uZGFyeSBzY2hvb2wvZ2FwIHllYXINCiAgdHJhbnNpdGlvbiA8LSBpZmVsc2UoIGRhdGEkVDNbaV09PSJpbiBoZXQgZWVyc3RlIGphYXIiICYgKGRhdGEkRTFbaV09PSJJayB6YXQgb3AgZGUgbWlkZGVsYmFyZSBzY2hvb2wiIHwgZGF0YSRFMltpXT09IklrIGhhZCBlZW4gdHVzc2VuamFhciIpLCAxLCAwKQ0KICANCiAgIyBkaWQgZWdvIGRyb3Agb3V0L3N0YXJ0IGEgbmV3IHN0dWR5Pw0KICB0cmFuc2l0aW9uIDwtIGlmZWxzZShkYXRhNCRHMDdROTBbaV09PSAiTmVlIiwgdHJhbnNpdGlvbiArIDEsIHRyYW5zaXRpb24pDQogIGRmJG9jY3VwYXRpb24udHJhbnNpdGlvblt3aGljaChkZiRlZ289PWkpXSA8LSB0cmFuc2l0aW9uDQp9DQoNCiNhbHNvIG1ha2UgYmluYXJ5DQpkZiRvY2N1cGF0aW9uLnRyYW5zaXRpb25fYmluIDwtIGlmZWxzZShkZiRvY2N1cGF0aW9uLnRyYW5zaXRpb24gPiAwLCAxLCAwKQ0KDQojcm9tYW50aWMgcmVsYXRpb25zaGlwIA0KZGYkcm9tYW50aWMgPC0gTkENCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICBkZiRyb21hbnRpY1t3aGljaChkZiRlZ289PWkpXSA8LSBpZmVsc2UoZGF0YSRSM1tpXSA9PSAiSmEiLCAxLDApDQp9DQoNCiNwc3ljaG9sb2dpY2FsL290aGVyIHZhcmlhYmxlcyAod2F2ZSAyKQ0KI2xvbmVsaW5lc3MgIA0KbCA8LSBjYmluZChkJHN0ZWxsaW5nZW4uU1EwMDEuLCBkJHN0ZWxsaW5nZW4uU1EwMDIuKQ0KbCA8LSBpZmVsc2UobD09IkhlbGVtYWFsIG9uZWVucyIsIDEsIGlmZWxzZShsPT0iTWVlIG9uZWVucyIsIDIsDQogICAgICAgICAgICAgICAgICAgIyBkbyBub3Qga25vdyA9IG5ldXRyYWwuLi4gdGhpcyBjYXRlZ29yeSB3YXMgc3BhcnNlbHkgcG9wdWxhdGVkIA0KICAgICAgICAgICAgICAgICAgIGlmZWxzZShsPT0iTmV1dHJhYWwiIHwgbD09IklrIHdlZXQgaGV0IG5pZXQiLCAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGw9PSJNZWUgZWVucyIsIDQsIGlmZWxzZShsPT0iSGVsZW1hYWwgZWVucyIsIDUsIGwpKSkpKQ0KIyB0dXJuIHRoZSBmaXJzdCBpbmRpY2F0b3IsIHNvIHRoYXQgaGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSAibW9yZSIgbG9uZWxpbmVzcy4NCmxbLDFdIDwtIDYtYXMubnVtZXJpYyhsWywxXSkNCg0KI2V4dHJhdmVyc2lvbg0KZSA8LSBjYmluZChkJHN0ZWxsaW5nZW4uU1EwMDMuLCBkJHN0ZWxsaW5nZW4uU1EwMDYuKQ0KZSA8LSBpZmVsc2UoZT09IkhlbGVtYWFsIG9uZWVucyIsIDEsDQogICAgICAgICAgICBpZmVsc2UoZT09Ik1lZSBvbmVlbnMiLCAyLA0KICAgICAgICAgICAgICAgICAgIGlmZWxzZShlPT0iTmV1dHJhYWwiIHwgZT09IklrIHdlZXQgaGV0IG5pZXQiLCAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGU9PSJNZWUgZWVucyIsIDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZT09IkhlbGVtYWFsIGVlbnMiLCA1LCBlKSkpKSkNCiMgdHVybiB0aGUgc2Vjb25kIGluZGljYXRvcg0KZVssMl0gPC0gNi1hcy5udW1lcmljKGVbLDJdKQ0KDQojIGNhbGN1bGF0ZSBhdmVyYWdlcy4NCmRmJGxvbmVsaW5lc3MgPC0gTkENCmRmJGV4dHJhdmVyc2lvbiA8LSBOQQ0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogIGxfc2NvcmVzIDwtIGFzLm51bWVyaWMobFtpLF0pDQogIGVfc2NvcmVzIDwtIGFzLm51bWVyaWMoZVtpLF0pDQogIGRmJGxvbmVsaW5lc3Nbd2hpY2goZGYkZWdvPT1pKV0gPC0gbWVhbihsX3Njb3JlcykNCiAgZGYkZXh0cmF2ZXJzaW9uW3doaWNoKGRmJGVnbz09aSldIDwtIG1lYW4oZV9zY29yZXMpDQp9DQoNCiMgZmluYW5jaWFsIHJlc3RyaWN0aW9ucyAoZm9yIHNvY2lhbCBpbnRlcmFjdGlvbikNCmRmJGZpbl9yZXN0ciA8LSBOQQ0KIyAwLiBuZXZlcjsgMS4gc29tZXRpbWVzOyAyLiBvZnRlbjsgMy4gYWx3YXlzDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZGYkZmluX3Jlc3RyW3doaWNoKGRmJGVnbz09aSldIDwtIGQkRzAxUTExMVtpXQ0KfQ0KZGYkZmluX3Jlc3RyIDwtIGlmZWxzZShkZiRmaW5fcmVzdHI9PSJOb29pdCIsMCwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRmJGZpbl9yZXN0cj09IlNvbXMiLDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGYkZmluX3Jlc3RyPT0iVmFhayIsMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGYkZmluX3Jlc3RyPT0iQWx0aWpkIiwzLCBOQSkpKSkNCg0KIyBhZGQgbmV0d29yayB2YXJpYWJsZXMNCiMgMS4gc2l6ZSAobm8uIG9mIHVuaXF1ZSBhbHRlcnMpDQpkZiRuZXRzaXplIDwtIE5BDQojIGFsc28gcGVyIGVnb25ldA0KZGYkY2RuLnNpemUgPC0gZGYkc3R1ZHkuc2l6ZSA8LSBkZiRjc24uc2l6ZSA8LSBkZiRiZmYuc2l6ZSA8LSAwDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICAjbm8uIG9mIHVuaXF1ZSBhbHRlcnMgaXMgc2ltcGx5IHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgZWdvDQogIGRmJG5ldHNpemVbd2hpY2goZGYkZWdvPT1pKV0gPC0gbnJvdyhkZlt3aGljaChkZiRlZ289PWkpLF0pDQogIA0KICAjc2l6ZSBvZiBlYWNoIGVnb25ldCBpcyB0aGUgbnVtYmVyIG9mIGFsdGVycyBuYW1lZCBpbiB0aGUgbmFtZSBnZW5lcmF0b3JzDQogICN0aHVzLCBpbmNsdWRpbmcgJ2R1cGxpY2F0ZXMnDQogIGRmJGNkbi5zaXplW3doaWNoKGRmJGVnbz09aSldIDwtIGxlbmd0aCh3aGljaCghZGZfbmFtZXNbaSxjKDE6NSldPT0iIikpDQogIGRmJHN0dWR5LnNpemVbd2hpY2goZGYkZWdvPT1pKV0gPC0gbGVuZ3RoKHdoaWNoKCFkZl9uYW1lc1tpLGMoNjoxMCldPT0iIikpDQogIGRmJGJmZi5zaXplW3doaWNoKGRmJGVnbz09aSldIDwtIGxlbmd0aCh3aGljaCghZGZfbmFtZXNbaSxjKDExOjE1KV09PSIiKSkNCiAgZGYkY3NuLnNpemVbd2hpY2goZGYkZWdvPT1pKV0gPC0gbGVuZ3RoKHdoaWNoKCFkZl9uYW1lc1tpLGMoMTY6MjApXT09IiIpKQ0KfQ0KDQojIDIuIGRlbnNpdHkuDQojIHRoaXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBwZXIgZWdvbmV0LCBhcyBvbmx5IGJldHdlZW4tYWx0ZXIgdGllcyB3aXRoaW4gZWdvbmV0IGFyZSBhc2tlZC4NCmRmJGNkbi5kZW5zaXR5IDwtIGRmJHN0dWR5LmRlbnNpdHkgPC0gZGYkY3NuLmRlbnNpdHkgPC0gZGYkYmZmLmRlbnNpdHkgPC0gTkENCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogICNhLiBDRE4NCiAgc2l6ZSA8LSBkZiRjZG4uc2l6ZVt3aGljaChkZiRlZ289PWkpXVsxXQ0KICAjbm8uIHBvc3NpYmxlIHRpZXMgYmV0d2VlbiBhbHRlcnMNCiAgcG9zIDwtIGlmZWxzZShzaXplPT0yLCAxLCBpZmVsc2Uoc2l6ZT09MywgMywgaWZlbHNlKHNpemU9PTQsIDYsIGlmZWxzZShzaXplPT01LCAxMCwgMCkpKSkNCiAgI2dldCBuby4gb2Ygb2JzZXJ2ZWQgdGllcw0KICAjb25seSBpZiBlZ28gbmFtZWQgYXQgbGVhc3QgMiBhbHRlcnMgaW4gdGhpcyBuYW1lIGdlbmVyYXRvcg0KICAjYmVjYXVzZSBvbmx5IHRoZW4gaSBjYW4gY2FsY3VsYXRlIGRlbnNpdHkNCiAgaWYoc2l6ZT4xKSB7DQogICAgI2dldCBhbHRlci1hbHRlciBhZGphY2VuY3kgbWF0cmljZXMgb2YgdGhpcyBwYXJ0aWN1bGFyIGVnb25ldA0KICAgIGFkamFjZW5jeSA8LSBkYXRhW2ksYygxMzozMildDQogICANCiAgICAjaSB3YW50IHRoZSBjb3JyZWN0IG9uZXMsIGdpdmVuIHRoZSBuby4gb2YgbGlzdGVkIGFsdGVycyBpbiB0aGlzIG5hbWUgZ2VuZXJhdG9yDQogICAgI2kgbGlzdCB0aGUgY29sdW1ucyBudW1iZXJzIG9mIHRoZSB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIG1hdGNoaW5nIG1hdHJpeCBzZXQsDQogICAgI2FuZCBzdWJzZXQgY29ycmVzcG9uZGluZyBjb2x1bW5zIGluIGBhZGphY2VuY3lgDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkY2RuLmRlbnNpdHlbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyAgfQ0KICANCiAgI2IuIHN0dWR5DQogIHNpemUgPC0gZGYkc3R1ZHkuc2l6ZVt3aGljaChkZiRlZ289PWkpXVsxXQ0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICBpZihzaXplPjEpIHsNCiAgICBhZGphY2VuY3kgPC0gZGF0YVtpLGMoNTM6NzIpXQ0KICAgIGFkaiA8LSBhZGphY2VuY3lbLGxpc3QoMCwxLGMoMjo0KSxjKDU6MTApLGMoMTE6MjApKVtzaXplXVtbMV1dXQ0KICANCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRzdHVkeS5kZW5zaXR5W3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgfQ0KICANCiAgI2MuIGZyaWVuZHMNCiAgc2l6ZSA8LSBkZiRiZmYuc2l6ZVt3aGljaChkZiRlZ289PWkpXVsxXQ0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICBpZihzaXplPjEpIHsNCiAgICBhZGphY2VuY3kgPC0gZGF0YVtpLGMoMTY5OjE4OCldDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkYmZmLmRlbnNpdHlbd2hpY2goZGYkZWdvPT1pKV0gPC0gb2JzL3BvcyB9DQoNCiAgI2QuIHNwb3J0cyBwYXJ0bmVycw0KICBzaXplIDwtIGRmJGNzbi5zaXplW3doaWNoKGRmJGVnbz09aSldWzFdDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogIGlmKHNpemU+MSkgew0KICAgIGFkamFjZW5jeSA8LSBkYXRhW2ksYyg0NDQ6NDYzKV0NCg0KICAgIGFkaiA8LSBhZGphY2VuY3lbLGxpc3QoMCwxLGMoMjo0KSxjKDU6MTApLGMoMTE6MjApKVtzaXplXVtbMV1dXQ0KICAgICNjb3VudCBudW1iZXIgb2YgdGllcyB0aGF0IGVnbyBkZXNjcmliZWQgYXMgKHZlcnkpIGNsb3NlICh2cy4gbm90IGNsb3NlIGJ1dCBubyBzdHJhbmdlcjsgc3RyYW5nZXJzKQ0KICAgIG9icyA8LSBsZW5ndGgod2hpY2goYWRqPT0iSGVjaHQifGFkaj09IkVyZyBoZWNodCIpKQ0KICAgIGRmJGNzbi5kZW5zaXR5W3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgfQ0KfQ0KDQojc2V0IE5BcyB0byAwLg0KZGYkY2RuLmRlbnNpdHlbaXMubmEoZGYkY2RuLmRlbnNpdHkpXSA8LSAwDQpkZiRzdHVkeS5kZW5zaXR5W2lzLm5hKGRmJHN0dWR5LmRlbnNpdHkpXSA8LSAwDQpkZiRiZmYuZGVuc2l0eVtpcy5uYShkZiRiZmYuZGVuc2l0eSldIDwtIDANCmRmJGNzbi5kZW5zaXR5W2lzLm5hKGRmJGNzbi5kZW5zaXR5KV0gPC0gMA0KDQojYmluYXJ5IGF0dHJpYnV0ZXMgaW5kaWNhdGluZyB3aGV0aGVyIGFsdGVycyBhcHBlYXJlZCBpbiBlYWNoIG9mIHRoZSBlZ28tbmV0cyBhdCB3MS4NCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgeyAgDQogICAgZm9yIChqIGluIDE6bnJvdyhkZlt3aGljaChkZiRlZ289PWkpLF0pKSB7ICMgZm9yIGFsdGVycyBuZXN0ZWQgaW4gZWdvDQoNCiAgICAjIGZpbmQgb3V0IGlmIGFsdGVyX2lkIGRlbm90aW5nIGFsdGVyIGogYXBwZWFyIGluIHRoZSA0IGVnb25ldHMNCiAgICBhbHRlciA8LSB1bmxpc3QoZGZbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aiksXVs1OjhdLCB1c2UubmFtZXMgPSBGQUxTRSkgIyBnZXQgbmFtZShzKSBvZiBhbHRlciBqDQogICAgYWx0ZXIgPC0gYWx0ZXJbIWlzLm5hKGFsdGVyKV0gIyBleGNsdWRlIE5Bcw0KICAgIA0KICAgIGNkbiA8LSBhbHRlciAlaW4lIG5ldDFbaSxdDQogICAgc3R1ZHkgPC0gYWx0ZXIgJWluJSBuZXQyW2ksXQ0KICAgIGJmZiA8LSBhbHRlciAlaW4lIG5ldDNbaSxdDQogICAgY3NuIDwtIGFsdGVyICVpbiUgbmV0NFtpLF0NCiAgICANCiAgICAjIGFuZCBpZiBzbywgZ2l2ZSBhbHRlciBqIHNjb3JlIDEgb24gaW5kaWNhdG9yczsgMCBvdGhlcndpc2UNCiAgICBkZiRjZG4xW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgIGRmJHN0dWR5MVt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIHN0dWR5LCAxLCAwKQ0KICAgIGRmJGJmZjFbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBiZmYsIDEsIDApDQogICAgZGYkY3NuMVt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgfQ0KfQ0KDQojY2FsY3VsYXRlIG11bHRpcGxleGl0eSBhcyBhbiBhbHRlci90aWUgYXR0cmlidXRlIChpLmUuLCBudW1iZXIgb2YgKmFkZGl0aW9uYWwqIG5ldHdvcmtzIGogYXBwZWFyZWQgaW4pDQojbmFtZXMoZGYpDQpkZiRtdWx0aXBsZXggPC0gcm93U3VtcyhkZlssYyg1OTo2MildKSAtIDEgI21pbnVzIG9uZSB0byByZWFjaCBhIG1lYW5pbmdmdWwgaW50ZXJjZXB0DQojcHN5Y2g6OmRlc2NyaWJlKGRmJG11bHRpcGxleCkgI009LjUxOyBTRD0uNzYNCg0KI25vdywgZmluZCBvdXQgd2hldGhlciB3MS1hbHRlcnMgd2VyZSBtYWludGFpbnRlZCBpbiB3Mi4NCmRmJHN1cnZpdmUgPC0gTkENCg0KIyBJbiB3YXZlIDIsIGFub3RoZXIgbWF0Y2hpbmcgcHJvY2VkdXJlIHdhcyB1c2VkOyBpbiByb3dzLCBhbHRlcnMgbmFtZWQgaW4gdzIgYXJlIGxpc3RlZDsgY29sdW1ucyBkZW5vdGUgKHVuaXF1ZSkgYWx0ZXJzIG9mIHcxLCBzbyB0aGUgc2FtZSBvbmUgYXMgb3VyIGRhdGEtZnJhbWUuDQojIGFnYWluLCBpIG1hZGUgbXVsdGlwbGUgbWF0cmljZXMsIGNvbmRpdGlvbmFsIG9uIHRoZSBuby4gb2YgdW5pcXVlIGFsdGVycyBvZiB3MSAoMTUsIHRvIGJlIHByZWNpc2UpDQojIGlmLCBpbiBvbmUgb2YgdGhlc2UgbWF0cmljZXMsIGNvbHVtbiBqIHdhcyBtYXJrZWQgYXMgY29ycmVzcG9uZGluZyB0byBhIG5hbWVkIGFsdGVyIGluIHcyLCB0aGVuIGFsdGVyIGogZGlkLCBpbmRlZWQsIHN1cnZpdmUNCg0KIyBzdWJzZXQgdzEtdzIgbWF0Y2hpbmcgbWF0cmljZXM7IGFuZCByZXNwbnINCncxdzIgPC0gZGF0YTRbLGMoNzU2OjExNTUsbGVuZ3RoKGRhdGE0KSldDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgeyAgIyBmb3IgZWdvIA0KICBtYXRjaGluZ0wgPC0gdmVjdG9yKCJsaXN0IiwgMjApICNwcmUtYWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBsZW5ndGggMjAsIHRvIHN0b3JlIG1hdGNoaW5nIG1hdHJpY2VzDQoNCiAgew0KICAgIG1hdGNoaW5nTFtbMV1dIDwtIHcxdzJbaSwxOjIwXQ0KICAgIG1hdGNoaW5nTFtbMl1dIDwtIHcxdzJbaSwyMTo0MF0NCiAgICBtYXRjaGluZ0xbWzNdXSA8LSB3MXcyW2ksNDE6NjBdDQogICAgbWF0Y2hpbmdMW1s0XV0gPC0gdzF3MltpLDYxOjgwXQ0KICAgIG1hdGNoaW5nTFtbNV1dIDwtIHcxdzJbaSw4MToxMDBdDQogICAgbWF0Y2hpbmdMW1s2XV0gPC0gdzF3MltpLDEwMToxMjBdDQogICAgbWF0Y2hpbmdMW1s3XV0gPC0gdzF3MltpLDEyMToxNDBdDQogICAgbWF0Y2hpbmdMW1s4XV0gPC0gdzF3MltpLDE0MToxNjBdDQogICAgbWF0Y2hpbmdMW1s5XV0gPC0gdzF3MltpLDE2MToxODBdDQogICAgbWF0Y2hpbmdMW1sxMF1dIDwtIHcxdzJbaSwxODE6MjAwXQ0KICAgIG1hdGNoaW5nTFtbMTFdXSA8LSB3MXcyW2ksMjAxOjIyMF0NCiAgICBtYXRjaGluZ0xbWzEyXV0gPC0gdzF3MltpLDIyMToyNDBdDQogICAgbWF0Y2hpbmdMW1sxM11dIDwtIHcxdzJbaSwyNDE6MjYwXQ0KICAgIG1hdGNoaW5nTFtbMTRdXSA8LSB3MXcyW2ksMjYxOjI4MF0NCiAgICBtYXRjaGluZ0xbWzE1XV0gPC0gdzF3MltpLDI4MTozMDBdDQogICAgbWF0Y2hpbmdMW1sxNl1dIDwtIHcxdzJbaSwzMDE6MzIwXQ0KICAgIG1hdGNoaW5nTFtbMTddXSA8LSB3MXcyW2ksMzIxOjM0MF0NCiAgICBtYXRjaGluZ0xbWzE4XV0gPC0gdzF3MltpLDM0MTozNjBdDQogICAgbWF0Y2hpbmdMW1sxOV1dIDwtIHcxdzJbaSwzNjE6MzgwXQ0KICAgIG1hdGNoaW5nTFtbMjBdXSA8LSB3MXcyW2ksMzgxOjQwMF0NCiAgfQ0KICANCiAgI2ZpbmQgdGhlICdyaWdodCcgbWF0Y2hpbmcgbWF0cml4IGluIHRoaXMgbGlzdCwgYnkgdGFraW5nIHRoZSBvbmUgdGhhdCBjb250YWlucyBhbnN3ZXJzDQogIGluZCA8LSBOVUxMDQogIGZvciAoaiBpbiBzZXFfYWxvbmcobWF0Y2hpbmdMKSkgew0KICAgICNjaGVjayBhbG9uZyB0aGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgaiBpbiB0aGUgbWF0Y2hpbmcgbWF0cml4IGxpc3QgaWYgdGhleSBhcmUgbm9uLWVtcHR5IGFuZCBub3QgTkENCiAgICBjaGVjayA8LSBGQUxTRQ0KICAgIGZvciAoY29sIGluIG1hdGNoaW5nTFtbal1dKSB7DQogICAgICBpZiAoIWFsbChpcy5uYShjb2wpKSAmJiBhbnkobmNoYXIoY29sKSA+IDApKSB7DQogICAgICAgIGNoZWNrIDwtIFRSVUUNCiAgICAgICAgYnJlYWsgIA0KICAgICAgfQ0KICAgICAgfQ0KICAgIGlmIChjaGVjaykgew0KICAgICAgaW5kIDwtIGoNCiAgICAgIGJyZWFrICANCiAgICB9DQogIH0NCiAgaWYobGVuZ3RoKGluZCk+MCkgew0KICAgICMgZ2V0IHRoZSAgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtbSA8LSBtYXRjaGluZ0xbW2luZF1dDQogICAgDQogICAgIyB1bmxpc3QgdGhlIGFuc3dlcnMgZ2l2ZW4NCiAgICBhbnMgPC0gdW5saXN0KG1tLCB1c2UubmFtZXMgPSBGQUxTRSkNCiAgICANCiAgICAjIHVzZSAnc3RyaW5ncicgdG8gZXh0cmFjdCBudW1iZXJzIGluIHRoZXNlIGFuc3dlcnMsDQogICAgIyB0aGV5IHJlZmVyIHRvIHRoZSBpZCBvZiAic3Vydml2ZWQiIGFsdGVycw0KICAgIGlkIDwtIHVubGlzdChzdHJpbmdyOjpzdHJfZXh0cmFjdF9hbGwoYW5zLCJcXCg/WzAtOSwuXStcXCk/IikpDQogICAgaWQgPC0gaWRbIWlzLm5hKGlkKV0gIyBleGNsdWRlIE5BDQogICAgDQogICAgIyBpZiBhbHRlciBpZCBvZiBlZ28gaSBjb3JyZXNwb25kcyB0byB0aGlzIGlkLCB0aGV5IGRpZCBpbmRlZWQgc3Vydml2ZToNCiAgICBkZiRzdXJ2aXZlW3doaWNoKGRmJGVnbz09aSldIDwtIGlmZWxzZShkZiRhbHRlcmlkW3doaWNoKGRmJGVnbz09aSldICVpbiUgaWQsIDEsIDApDQogIH0NCn0NCg0KIyBpbiB3aGljaCBlZ29uZXQgZGlkIHRoZXkgKHJlKWFwcGVhcj8NCmRmJGNkbjIgPC0gTkENCmRmJHN0dWR5MiA8LSBOQQ0KZGYkYmZmMiA8LSBOQQ0KZGYkY3NuMiA8LSBOQQ0KDQojIGkgdXNlIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBvZiB3Mjsgd2hlcmUgY29sdW1ucyByZWZlciB0byB1bmlxdWUgdzEgYWx0ZXJzICh0aG9zZSBvZiBvdXIgY29uc3RydWN0ZWQgZGF0YWZyYW1lKSBhbmQgcm93cyByZWZlcnJpbmcgdG8gdW5pcXVlIHcyIGFsdGVycw0KIyBzbywgaWYgdzEtYWx0ZXIvY29sdW1uIGogaXMgbWF0Y2hlZCB0byB3Mi1hbHRlci9yb3cgaSwgdGhlbiB3MS1hbHRlciBkaWQgc3Vydml2ZSAoYnV0IHdlIGFscmVhZHkga25ldyB0aGF0KTsgYnV0IG1vcmUgaW1wb3J0YW50bHksIGogd2FzIHRoZSBpXnRoIGFsdGVyIG1lbnRpb25lZA0KIyBhbmQgdGhpcyBhbGxvd3MgbWUgdG8gaW5mZXIgaW4gd2hhdCBuZXR3b3JrIGogKHJlLSlhcHBlYXJlZA0KIyBzaW5jZSBjZG4gPSAxLTU7IHN0dWR5ID0gNi0xMDsgYmZmID0gMTEtMTU7IGNzbiA9IDE2LTIwLg0KIyBob3dldmVyLCBzaW5jZSB0aGUgcm93cyBvbmx5IGluY2x1ZGUgbm9uLWR1cGxpY2F0ZSB3Mi1hbHRlcnM7DQojIGlmIGFsdGVyIGogYXQgdDEgd2FzIG5hbWVkIG1vcmUgdGhhbiBvbmNlIGF0IHQyLCBpIG9ubHkga25vdyB0aGUgZmlyc3QNCiMgZWdvbmV0IGluIHdoaWNoIGogd2FzIG5hbWVkLi4uDQojIHRodXMsIGJlZm9yZSBpIHByb2NlZWQsIGkgdXNlIHRoZSBtYXRjaGluZyBtYXRyaWNlcyB0aGF0IGFsbG93ZWQgZWdvIHRvIG1hdGNoIGFsdGVycyBmcm9tIGRpZmZlcmVudCBlZ29uZXRzIHRvIG1ha2UgYWx0ZXIgaWRzIGZvciB3MiBhbHRlcnM7IGFuZCBmaWd1cmUgb3V0IHRvIHdoaWNoIGVnb25ldHMgdGhleSBiZWxvbmdlZA0KDQojIGkgbWFrZSBhIGRhdGFmcmFtZSBvZiB3Mi1hbHRlcnMsIHdpdGggcG90ZW50aWFsIGR1cGxpY2F0ZXMuLi4NCmRmX25hbWVzIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRlZ29uZXQxLlNRMDAxLixwMiA9IGRhdGE0JGVnb25ldDEuU1EwMDIuLHAzID0gZGF0YTQkZWdvbmV0MS5TUTAwMy4scDQgPSBkYXRhNCRlZ29uZXQxLlNRMDA0LixwNSA9IGRhdGE0JGVnb25ldDEuU1EwMDUuLHA2ID0gZGF0YTQkZWdvbmV0Mi5TUTAwMS4scDcgPSBkYXRhNCRlZ29uZXQyLlNRMDAyLixwOCA9IGRhdGE0JGVnb25ldDIuU1EwMDMuLHA5ID0gZGF0YTQkZWdvbmV0Mi5TUTAwNC4scDEwPSBkYXRhNCRlZ29uZXQyLlNRMDA1LixwMTE9IGRhdGE0JGVnb25ldDMuU1EwMDEuLHAxMj0gZGF0YTQkZWdvbmV0My5TUTAwMi4scDEzPSBkYXRhNCRlZ29uZXQzLlNRMDAzLixwMTQ9IGRhdGE0JGVnb25ldDMuU1EwMDQuLHAxNT0gZGF0YTQkZWdvbmV0My5TUTAwNS4scDE2PSBkYXRhNCRlZ29uZXQ0LlNRMDAxLiwgcDE3PSBkYXRhNCRlZ29uZXQ0LlNRMDAyLiwgcDE4PSBkYXRhNCRlZ29uZXQ0LlNRMDAzLixwMTk9IGRhdGE0JGVnb25ldDQuU1EwMDQuLHAyMD0gZGF0YTQkZWdvbmV0NC5TUTAwNS4pDQoNCiNtYWxlcw0KZGZfZ2VuZGVyIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRtYWxlcy5TUTAwMS4scDIgPSBkYXRhNCRtYWxlcy5TUTAwMi4scDMgPSBkYXRhNCRtYWxlcy5TUTAwMy4scDQgPSBkYXRhNCRtYWxlcy5TUTAwNC4scDUgPSBkYXRhNCRtYWxlcy5TUTAwNS4scDYgPSBkYXRhNCRtYWxlcy5TUTAwNi4scDcgPSBkYXRhNCRtYWxlcy5TUTAwNy4scDggPSBkYXRhNCRtYWxlcy5TUTAwOC4scDkgPSBkYXRhNCRtYWxlcy5TUTAwOS4scDEwPSBkYXRhNCRtYWxlcy5TUTAxMC4scDExPSBkYXRhNCRtYWxlcy5TUTAxMS4scDEyPSBkYXRhNCRtYWxlcy5TUTAxMi4scDEzPSBkYXRhNCRtYWxlcy5TUTAxMy4scDE0PSBkYXRhNCRtYWxlcy5TUTAxNC4scDE1PSBkYXRhNCRtYWxlcy5TUTAxNS4scDE2PSBkYXRhNCRtYWxlcy5TUTAxNi4scDE3PSBkYXRhNCRtYWxlcy5TUTAxNy4scDE4PSBkYXRhNCRtYWxlcy5TUTAxOC4scDE5PSBkYXRhNCRtYWxlcy5TUTAxOS4scDIwPSBkYXRhNCRtYWxlcy5TUTAyMC4pDQoNCiMgbGlzdCBvZiBkYXRhZnJhbWVzIHBlciBlZ28gd2l0aCByb3dzIHJlZmxlY3RpbmcgYWx0ZXJzDQojIGFuZCBjb2x1bW5zIGluZGljYXRpbmcgdGhlIG5hbWUocykgb2YgdGhlIHBhcnRpY3VsYXIgYWx0ZXJzDQphbHRlckwgPC0gbGlzdCgpDQojIGxvb3Agb3ZlciBhbGwgZWdvcw0KZm9yICggaSBpbiAxOm5yb3coZGZfbmFtZXMpKSB7YWx0ZXJMW1tpXV0gPC0gZGF0YS5mcmFtZSgNCiAgICBhbHRlcmlkID0gMToyMCxuYW1lMSA9IE5BLG5hbWUyID0gTkEsIG5hbWUzID0gTkEsbmFtZTQgPSBOQSwgZ2VuZGVyPU5BLA0KICAgIGNkbl9lbWJlZC50MiA9IE5BLCBzdHVkeV9lbWJlZC50MiA9IE5BLCBiZmZfZW1iZWQudDIgPSBOQSwgY3NuX2VtYmVkLnQyID0gTkEpfQ0KDQojIGZpbGwgdGhlIG5hbWVzIGJhc2VkIG9uIHRoZSBuYW1lcyBkYXRhLWZyYW1lDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gdW5saXN0KGRmX25hbWVzW2ksIF0sIHVzZS5uYW1lcz1GKQ0KICBhbHRlckxbW2ldXSRuYW1lMSA8LSBpZmVsc2UoYWx0ZXJMW1tpXV0kbmFtZTE9PSIiLCBOQSwgYWx0ZXJMW1tpXV0kbmFtZTEpDQogIA0KICBhbHRlckxbW2ldXSRnZW5kZXIgPC0gdW5saXN0KGRmX2dlbmRlcltpLF0sIHVzZS5uYW1lcz1GKQ0KICBhbHRlckxbW2ldXSRnZW5kZXIgPC0gaWZlbHNlKGFsdGVyTFtbaV1dJGdlbmRlcj09IkphIiwgMCwgI21hbGUgPSByZWYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYWx0ZXJMW1tpXV0kZ2VuZGVyPT0iTmVlIiwgMSwgTkEpKQ0KICANCiAgfQ0KDQojIGNhbGN1bGF0ZSBuZXRzaXplIGZvciBlYWNoIG5ldCB0byBnZXQgdGhlIGNvcnJlY3QgbWF0Y2hpbmcgbWF0cml4DQp7DQogIG5ldDEgPC0gY2JpbmQoZGF0YTQkZWdvbmV0MS5TUTAwMS4sZGF0YTQkZWdvbmV0MS5TUTAwMi4sIGRhdGE0JGVnb25ldDEuU1EwMDMuLGRhdGE0JGVnb25ldDEuU1EwMDQuLCBkYXRhNCRlZ29uZXQxLlNRMDA1LikNCiAgbmV0MSA8LSBpZmVsc2UobmV0MT09IiIsIE5BLCBuZXQxKQ0KICBuczEgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQxKSkgew0KICAgIG5zMVtpXSA8LSBsZW5ndGgobmV0MVtpLF1bd2hpY2goIWlzLm5hKG5ldDFbaSxdKSldKQ0KICB9DQogIG5ldDIgPC0gY2JpbmQoZGF0YTQkZWdvbmV0Mi5TUTAwMS4sZGF0YTQkZWdvbmV0Mi5TUTAwMi4sIGRhdGE0JGVnb25ldDIuU1EwMDMuLGRhdGE0JGVnb25ldDIuU1EwMDQuLCBkYXRhNCRlZ29uZXQyLlNRMDA1LikNCiAgbmV0MiA8LSBpZmVsc2UobmV0Mj09IiIsIE5BLCBuZXQyKQ0KICBuczIgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQyKSkgew0KICAgIG5zMltpXSA8LSBsZW5ndGgobmV0MltpLF1bd2hpY2goIWlzLm5hKG5ldDJbaSxdKSldKQ0KICB9DQogIG5ldDMgPC0gY2JpbmQoZGF0YTQkZWdvbmV0My5TUTAwMS4sZGF0YTQkZWdvbmV0My5TUTAwMi4sIGRhdGE0JGVnb25ldDMuU1EwMDMuLGRhdGE0JGVnb25ldDMuU1EwMDQuLCBkYXRhNCRlZ29uZXQzLlNRMDA1LikNCiAgbmV0MyA8LSBpZmVsc2UobmV0Mz09IiIsIE5BLCBuZXQzKQ0KICBuczMgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQzKSkgew0KICAgIG5zM1tpXSA8LSBsZW5ndGgobmV0M1tpLF1bd2hpY2goIWlzLm5hKG5ldDNbaSxdKSldKQ0KICB9DQogIG5ldDQgPC0gY2JpbmQoZGF0YTQkZWdvbmV0NC5TUTAwMS4sZGF0YTQkZWdvbmV0NC5TUTAwMi4sIGRhdGE0JGVnb25ldDQuU1EwMDMuLGRhdGE0JGVnb25ldDQuU1EwMDQuLCBkYXRhNCRlZ29uZXQ0LlNRMDA1LikNCiAgbmV0NCA8LSBpZmVsc2UobmV0ND09IiIsIE5BLCBuZXQ0KQ0KICBuczQgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQ0KSkgew0KICAgIG5zNFtpXSA8LSBsZW5ndGgobmV0NFtpLF1bd2hpY2goIWlzLm5hKG5ldDRbaSxdKSldKQ0KICB9DQp9DQoNCiMgY29uc3RydWN0IHRoZSBtYXRjaGluZyBtYXRyaWNlcyBsaXN0IGZvciBlZ29uZXQxLTINCm1hdGNoaW5nTGlzdCA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIG1hdGNoaW5nTCA8LSBsaXN0KCkNCiAgbWF0Y2hpbmdMW1sxXV0gPC0gY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzFOMS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDA1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmdMW1syXV08LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMi5TUTAwMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZ0xbWzNdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMy5baV0pKQ0KICBtYXRjaGluZ0xbWzRdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONC5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmdMW1s1XV08LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3RbW2ldXSA8LSBtYXRjaGluZ0wNCn0gIyBzby4uLiBtYXRjaGluZ0xbWzFdXVtbNV1dIGlzIG1hdGNoaW5nbWF0cml4IDUgKGkuZS4sIDUgYWx0ZXJzIG5hbWVkIGluIGVnb25ldDIpIGZvciBlZ28gMQ0KDQojIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgbWF0Y2hpbmcgbWF0cmljZXMgYW5kIHRoZSBuZXRzaXplcyBmb3IgZWdvIGFsbG93cyBtZSB0byBtYXRjaCB0aGUgbmFtZXMgbXlzZWxmLg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdCkpIHsgICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdFtbaV1dICAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QNCiAgbnMgPC0gbnMyW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQyDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQyW2ksXQ0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWUyW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PW1hdGNoZWRbLDJdKV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfSNpZ25vcmUgd2FybmluZw0KDQojIGFnYWluLCBtYWtlIGEgbWF0Y2hpbmcgbGlzdCBmb3IgdGhlIHNlY29uZCBtYXRjaGluZyBtYXRyaWNlcw0KIyAoaS5lLiwgbWF0Y2hpbmcgZWdvbmV0MyBhbHRlcnMgdG8gcHJldi4gYWx0ZXJzKTsNCm1hdGNoaW5nTGlzdDIgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzJMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzJMW1sxXV0gPC0gY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMTBfU1EwMDEuW2ldKQ0KICBtYXRjaGluZzJMW1syXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMi5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAxMF9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzJMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAzLltpXSkpDQogIG1hdGNoaW5nMkxbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONC5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONC5TUTAwMV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAzX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA2X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwN19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA5X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAxMF9TUTAwNC5baV0pKQ0KICBtYXRjaGluZzJMW1s1XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDQuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QyW1tpXV0gPC0gbWF0Y2hpbmcyTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MikpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0MltbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zM1tbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0Mw0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDNbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTNbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KIyBzYW1lIGZvciBtYXRjaGluZyAzIChpLmUuLCBlZ29uZXQ0IHdpdGggZWdvbmV0cyAxLTMpDQptYXRjaGluZ0xpc3QzIDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCiAgbWF0Y2hpbmczTCA8LSBsaXN0KCkNCiAgbWF0Y2hpbmczTFtbMV1dIDwtIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04xLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxNV9TUTAwMS5baV0pDQogIG1hdGNoaW5nM0xbWzJdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTVfU1EwMDIuW2ldKSkNCiAgbWF0Y2hpbmczTFtbM11dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04zLlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNV9TUTAwMy5baV0pKQ0KICBtYXRjaGluZzNMW1s0XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAyX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwM19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA1X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA4X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwOV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxMV9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDEyX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxNF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE1X1NRMDA0LltpXSkpDQogIG1hdGNoaW5nM0xbWzVdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONS5TUTAwMV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDAzX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA2X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwN19TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA5X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAxMF9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDExX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTJfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxM19TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDE0X1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTVfU1EwMDUuW2ldKSkNCiAgbWF0Y2hpbmdMaXN0M1tbaV1dIDwtIG1hdGNoaW5nM0wNCn0NCg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdDMpKSB7ICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdDNbW2ldXSAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QgMg0KICBucyA8LSBuczRbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDQNCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQ0W2ksXQ0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWU0W21hdGNoZWRbLDJdXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9DQoNCiNsZXQgdXMgaGVyZSBhbHNvIGF0dGFjaCBzdHJ1Y3R1cmFsIGVtYmVkZGVkbmVzcy4gYmVjYXVzZSB0aGUgJ25ldHdvcmsgZW52aXJvbm1lbnQnIGZvciBtYWludGFpbmVkIGFsdGVycyBtYXkgY2hhbmdlIGluIHQyDQoNCiNhZ2FpbiwgZml4IHRoZSBpcnJlZ3VsYXJpdGllcyBpbiB0aGUgZGF0YS4NCmRhdGE0IDwtIGRhdGE0ICU+JQ0KICByZW5hbWUgKGFkajNOMmEuU1EwMDEuID0gYWRqM04xYS5TUTAwMS4sIGFkajNOM2EuU1EwMDEuID0gYWRqM04yYS5TUTAwMS4sYWRqM04zYS5TUTAwMi4gPSBhZGozTjJhLlNRMDAyLixhZGozTjNiLlNRMDAxLiA9IGFkajNOMmIuU1EwMDEuLGFkajNONGEuU1EwMDEuID0gYWRqM04zYS5TUTAwMS4sYWRqM040YS5TUTAwMi4gPSBhZGozTjNhLlNRMDAyLixhZGozTjRhLlNRMDAzLiA9IGFkajNOM2EuU1EwMDMuLGFkajNONGIuU1EwMDEuID0gYWRqM04zYi5TUTAwMS4sYWRqM040Yi5TUTAwMi4gPSBhZGozTjNiLlNRMDAyLiwgICBhZGozTjRjLlNRMDAxLiA9IGFkajNOM2MuU1EwMDEuLGFkajNONWEuU1EwMDEuID0gYWRqM040YS5TUTAwMS4sYWRqM041YS5TUTAwMi4gPSBhZGozTjRhLlNRMDAyLixhZGozTjVhLlNRMDAzLiA9IGFkajNONGEuU1EwMDMuLGFkajNONWEuU1EwMDQuID0gYWRqM040YS5TUTAwNC4sYWRqM041Yi5TUTAwMS4gPSBhZGozTjRiLlNRMDAxLixhZGozTjViLlNRMDAyLiA9IGFkajNONGIuU1EwMDIuLGFkajNONWIuU1EwMDMuID0gYWRqM040Yi5TUTAwMy4sYWRqM041Yy5TUTAwMS4gPSBhZGozTjRjLlNRMDAxLixhZGozTjVjLlNRMDAyLiA9IGFkajNONGMuU1EwMDIuLGFkajNONWQuU1EwMDEuID0gYWRqM040ZC5TUTAwMS4pDQoNCmRhdGE0JGFkajROM2IuU1EwMDEuIDwtIGRhdGE0JGFkajROM2IuU1EwMDIuDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQoNCiAgI2dldCBudW1iZXIgb2YgbmFtZXMgbGlzdGVkIGluIHRoZSBlZ29uZXRzDQogIG5uYW1lc19jZG4gPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0MS5TUTAwMS4iLCJlZ29uZXQxLlNRMDAyLiIsImVnb25ldDEuU1EwMDMuIiwiZWdvbmV0MS5TUTAwNC4iLCJlZ29uZXQxLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfc3R1ZHkgPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0Mi5TUTAwMS4iLCJlZ29uZXQyLlNRMDAyLiIsImVnb25ldDIuU1EwMDMuIiwiZWdvbmV0Mi5TUTAwNC4iLCJlZ29uZXQyLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfYmZmIDwtIGxlbmd0aCh3aGljaChkYXRhNFtpLGMoImVnb25ldDMuU1EwMDEuIiwiZWdvbmV0My5TUTAwMi4iLCJlZ29uZXQzLlNRMDAzLiIsImVnb25ldDMuU1EwMDQuIiwiZWdvbmV0My5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX2NzbiA8LSBsZW5ndGgod2hpY2goZGF0YTRbaSxjKCJlZ29uZXQ0LlNRMDAxLiIsImVnb25ldDQuU1EwMDIuIiwiZWdvbmV0NC5TUTAwMy4iLCJlZ29uZXQ0LlNRMDA0LiIsImVnb25ldDQuU1EwMDUuIildIT0iIikpDQogIA0KICAjQ0RODQogIA0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajFOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqMU4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqMU4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqMU4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGoxTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGoxTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGoxTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajFONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajFONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajFONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfY2RuPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcz4xDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nkbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICANCiAgI0NETjogMTpubmFtZXNfQ0RODQogIGFsdGVyTFtbaV1dJGNkbl9lbWJlZC50MlsxOm5uYW1lc19jZG5dIDwtIGVtYmVkIA0KICB9DQogIA0KICAjU1RVRFkNCg0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajJOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqMk4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqMk4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqMk4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGoyTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGoyTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGoyTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajJONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajJONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajJONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfc3R1ZHk+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX3N0dWR5XV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbNjooNStubmFtZXNfc3R1ZHkpXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgIyBCRVNUIEZSSUVORFMNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGozTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajNOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajNOM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajNOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqM040Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqM040Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqM040Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGozTjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGozTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGozTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2JmZj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfYmZmXV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyWzExOigxMCtubmFtZXNfYmZmKV0gPC0gZW1iZWQgDQogIH0NCiAgDQogICMgU1BPUlRTIFBBUlRORVJTDQogICNtYWtlIGxpc3Qgb2YgYWRqYWNlbmN5IG1hdHJpY2VzDQogIGFkakwgPC0gbGlzdCgpDQogIHsNCiAgIzIgYWx0ZXJzDQogIGFkakxbWzJdXSA8LSBtYXRyaXgoTkEsbmNvbD0yLG5yb3c9MikNCiAgYWRqTFtbMl1dWzEsMl0gPC0gYWRqTFtbMl1dWzIsMV0gPC0gZGF0YTQkYWRqNE4yYS5TUTAwMS5baV0NCg0KICAjMyBhbHRlcnMNCiAgYWRqTFtbM11dIDwtIG1hdHJpeChOQSxuY29sPTMsbnJvdz0zKQ0KICBhZGpMW1szXV1bMSwyXSA8LSBhZGpMW1szXV1bMiwxXSA8LSBkYXRhNCRhZGo0TjNhLlNRMDAxLltpXQ0KICBhZGpMW1szXV1bMSwzXSA8LSBhZGpMW1szXV1bMywxXSA8LSBkYXRhNCRhZGo0TjNhLlNRMDAyLltpXQ0KICBhZGpMW1szXV1bMiwzXSA8LSBhZGpMW1szXV1bMywyXSA8LSBkYXRhNCRhZGo0TjNiLlNRMDAxLltpXQ0KDQogICM0IGFsdGVycw0KICBhZGpMW1s0XV0gPC0gbWF0cml4KE5BLG5jb2w9NCxucm93PTQpDQogIGFkakxbWzRdXVsxLDJdIDwtIGFkakxbWzRdXVsyLDFdIDwtIGRhdGE0JGFkajRONGEuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsxLDNdIDwtIGFkakxbWzRdXVszLDFdIDwtIGRhdGE0JGFkajRONGEuU1EwMDIuW2ldDQogIGFkakxbWzRdXVsxLDRdIDwtIGFkakxbWzRdXVs0LDFdIDwtIGRhdGE0JGFkajRONGEuU1EwMDMuW2ldDQogIGFkakxbWzRdXVsyLDNdIDwtIGFkakxbWzRdXVszLDJdIDwtIGRhdGE0JGFkajRONGIuU1EwMDEuW2ldDQogIGFkakxbWzRdXVsyLDRdIDwtIGFkakxbWzRdXVs0LDJdIDwtIGRhdGE0JGFkajRONGIuU1EwMDIuW2ldDQogIGFkakxbWzRdXVszLDRdIDwtIGFkakxbWzRdXVs0LDNdIDwtIGRhdGE0JGFkajRONGMuU1EwMDEuW2ldDQoNCiAgIzUgYWx0ZXJzDQogIGFkakxbWzVdXSA8LSBtYXRyaXgoTkEsbmNvbD01LG5yb3c9NSkNCiAgYWRqTFtbNV1dWzEsMl0gPC0gYWRqTFtbNV1dWzIsMV0gPC0gZGF0YTQkYWRqNE41YS5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzEsM10gPC0gYWRqTFtbNV1dWzMsMV0gPC0gZGF0YTQkYWRqNE41YS5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzEsNF0gPC0gYWRqTFtbNV1dWzQsMV0gPC0gZGF0YTQkYWRqNE41YS5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzEsNV0gPC0gYWRqTFtbNV1dWzUsMV0gPC0gZGF0YTQkYWRqNE41YS5TUTAwNC5baV0NCiAgYWRqTFtbNV1dWzIsM10gPC0gYWRqTFtbNV1dWzMsMl0gPC0gZGF0YTQkYWRqNE41Yi5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzIsNF0gPC0gYWRqTFtbNV1dWzQsMl0gPC0gZGF0YTQkYWRqNE41Yi5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzIsNV0gPC0gYWRqTFtbNV1dWzUsMl0gPC0gZGF0YTQkYWRqNE41Yi5TUTAwMy5baV0NCiAgYWRqTFtbNV1dWzMsNF0gPC0gYWRqTFtbNV1dWzQsM10gPC0gZGF0YTQkYWRqNE41Yy5TUTAwMS5baV0NCiAgYWRqTFtbNV1dWzMsNV0gPC0gYWRqTFtbNV1dWzUsM10gPC0gZGF0YTQkYWRqNE41Yy5TUTAwMi5baV0NCiAgYWRqTFtbNV1dWzQsNV0gPC0gYWRqTFtbNV1dWzUsNF0gPC0gZGF0YTQkYWRqNE41ZC5TUTAwMS5baV0NCiAgfQ0KDQogIGlmKG5uYW1lc19jc24+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nzbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MlsxNjooMTUrbm5hbWVzX2NzbildIDwtIGVtYmVkIA0KICB9DQp9DQoNCiNhbHRlcnMgY291bGQgYmUgbmFtZWQgaW4gbXVsdGlwbGUgbmFtZSBnZW5lcmF0b3JzLiBlYWNoIGVsZW1lbnQgb2YgYWx0ZXJMIGNvbnRhaW5zIHJvd3MgY29ycmVzcG9uZGluZyB0byBhbHRlcnMgdGhhdCBtYXkgYmUgJ2R1cGxpY2F0ZXMnLg0KI2kgbWF0Y2ggdGhlIHN0cnVjdHVyYWwgZW1iZWRkZWRuZXNzIG1lYXN1cmVzDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkgDQogIGZvciAoaiBpbiAxOm5yb3coYWx0ZXJMW1tpXV0pKSB7ICNmb3IgYWx0ZXIgag0KICAgICAgICANCiAgICAjaWYgbmFtZTIgaXMgbm90IGVtcHR5LCBhbHRlciBqIHdhcyBtYXRjaGVkIHRvIHRoZSBzdHVkeSBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzdHVkeSBwYXJ0bmVyIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUyW2pdDQogICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbal0gPC0gaWZlbHNlKCFpcy5uYShhbHRlckxbW2ldXSRuYW1lMltqXSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50Mlt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTJbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDIpKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQyW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lMyBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIGZyaWVuZHMgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgZnJpZW5kIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUzW2pdDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW2pdIDwtIGlmZWxzZSghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTNbal0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50Mlt3aGljaChhbHRlckxbW2ldXSRuYW1lMT09YWx0ZXJMW1tpXV0kbmFtZTNbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyKSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lNCBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIHNwb3J0cyBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzcG9ydHMgcGFydG5lciB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lNFtqXQ0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MltqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWU0W2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDJbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTE9PWFsdGVyTFtbaV1dJG5hbWU0W2pdICYgIWlzLm5hKGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MikpXSwgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyW2pdICkNCiAgfQ0KfQ0KDQojIG1ha2UgbG9uZyBkZiB3aXRoIGFsdGVycyBpbiBlZ28sDQojIGFuZCBpbmRpY2F0b3JzIGZvciA0IGVnb25ldHM7DQpkZjIgPC0gZGF0YS5mcmFtZSgNCiAgZWdvPXJlcCgxOmxlbmd0aChhbHRlckwpLGVhY2g9MjApLGFsdGVyPXJlcCgxOjIwKSxjZG49TkEsIHN0dWR5PU5BLGJmZj1OQSxjc249TkEsDQogIGNkbl9lbWJlZC50Mj1OQSwgc3R1ZHlfZW1iZWQudDI9TkEsIGJmZl9lbWJlZC50Mj1OQSwgY3NuX2VtYmVkLnQyPU5BKQ0KDQpmb3IgKGkgaW4gdW5pcXVlKGRmMiRlZ28pKSB7ICANCiAgICAgIGZvciAoaiBpbiAxOjIwKSB7ICMgZm9yIGFsdGVycyBuZXN0ZWQgaW4gZWdvDQogICAgICAgICAgICAgICAgIA0KICAgICAgICAjIGZpbmQgb3V0IGlmIG5hbWVzIGRlbm90aW5nIGFsdGVyIGogYXBwZWFyIGluIHRoZSA0IGVnb25ldHMNCiAgICAgICAgYWx0ZXIgPC0gdW5saXN0KGFsdGVyTFtbaV1dW2osYygyOjUpXSwgdXNlLm5hbWVzID0gRkFMU0UpDQogICAgICAgIGFsdGVyIDwtIGFsdGVyWyFpcy5uYShhbHRlcildICMgZXhjbHVkZSBOQXMNCiAgICAgICAgDQogICAgICAgIGNkbiA8LSBhbHRlciAlaW4lIG5ldDFbaSxdDQogICAgICAgIHN0dWR5IDwtIGFsdGVyICVpbiUgbmV0MltpLF0NCiAgICAgICAgYmZmIDwtIGFsdGVyICVpbiUgbmV0M1tpLF0NCiAgICAgICAgY3NuIDwtIGFsdGVyICVpbiUgbmV0NFtpLF0NCiAgICAgICAgDQogICAgICAgICMgYW5kIGlmIHNvLCBnaXZlIGFsdGVyIGogc2NvcmUgMSBvbiBpbmRpY2F0b3JzOyAwIG90aGVyd2lzZQ0KICAgICAgICBkZjIkY2RuW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgICAgICBkZjIkc3R1ZHlbd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBzdHVkeSwgMSwgMCkNCiAgICAgICAgZGYyJGJmZlt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGJmZiwgMSwgMCkNCiAgICAgICAgZGYyJGNzblt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgICAgICAgDQogICAgICAgICNhbmQgYXR0YWNoIGVtYmVkZGVkbmVzcyB0MiBzY29yZXMNCiAgICAgICAgZGYyJGNkbl9lbWJlZC50Mlt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gYWx0ZXJMW1tpXV0kY2RuX2VtYmVkLnQyW2pdDQogICAgICAgIGRmMiRzdHVkeV9lbWJlZC50Mlt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbal0NCiAgICAgICAgZGYyJGJmZl9lbWJlZC50Mlt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW2pdDQogICAgICAgIGRmMiRjc25fZW1iZWQudDJbd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09aildIDwtIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MltqXQ0KICAgICAgfQ0KfQ0KDQojIG5vdyB0aGF0IGkgaGF2ZSwgZm9yIGVhY2ggYWx0ZXIgb2YgZWdvIChpbmNsdWRpbmcgZHVwbGljYXRlcykgYXQgdDIsDQojIHRoZSBuZXRzIHRvIHdoaWNoIHRoZXkgYmVsb25nLi4NCiMgaSBjb250aW51ZSB3aXRoIHRoZSB3MS13MiBtYXRjaGluZyBtYXRyaWNlcw0KDQojIHdlIGFscmVhZHkgc3Vic2V0dGVkIHRoZSBtYXRjaGluZyBtYXRyaWNlcyAoaW4gYHcxdzJgKQ0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7ICAjIGZvciBlZ28gaQ0KICANCiAgbWF0Y2hpbmdMIDwtIHZlY3RvcigibGlzdCIsIDIwKSAjcHJlLWFsbG9jYXRlIGVtcHR5IGxpc3Qgb2YgbGVuZ3RoIDE1LCB0byBzdG9yZSBtYXRjaGluZyBtYXRyaWNlcw0KICB7DQogICAgbWF0Y2hpbmdMW1sxXV0gPC0gdzF3MltpLDE6MjBdDQogICAgbWF0Y2hpbmdMW1syXV0gPC0gdzF3MltpLDIxOjQwXQ0KICAgIG1hdGNoaW5nTFtbM11dIDwtIHcxdzJbaSw0MTo2MF0NCiAgICBtYXRjaGluZ0xbWzRdXSA8LSB3MXcyW2ksNjE6ODBdDQogICAgbWF0Y2hpbmdMW1s1XV0gPC0gdzF3MltpLDgxOjEwMF0NCiAgICBtYXRjaGluZ0xbWzZdXSA8LSB3MXcyW2ksMTAxOjEyMF0NCiAgICBtYXRjaGluZ0xbWzddXSA8LSB3MXcyW2ksMTIxOjE0MF0NCiAgICBtYXRjaGluZ0xbWzhdXSA8LSB3MXcyW2ksMTQxOjE2MF0NCiAgICBtYXRjaGluZ0xbWzldXSA8LSB3MXcyW2ksMTYxOjE4MF0NCiAgICBtYXRjaGluZ0xbWzEwXV0gPC0gdzF3MltpLDE4MToyMDBdDQogICAgbWF0Y2hpbmdMW1sxMV1dIDwtIHcxdzJbaSwyMDE6MjIwXQ0KICAgIG1hdGNoaW5nTFtbMTJdXSA8LSB3MXcyW2ksMjIxOjI0MF0NCiAgICBtYXRjaGluZ0xbWzEzXV0gPC0gdzF3MltpLDI0MToyNjBdDQogICAgbWF0Y2hpbmdMW1sxNF1dIDwtIHcxdzJbaSwyNjE6MjgwXQ0KICAgIG1hdGNoaW5nTFtbMTVdXSA8LSB3MXcyW2ksMjgxOjMwMF0NCiAgICBtYXRjaGluZ0xbWzE2XV0gPC0gdzF3MltpLDMwMTozMjBdDQogICAgbWF0Y2hpbmdMW1sxN11dIDwtIHcxdzJbaSwzMjE6MzQwXQ0KICAgIG1hdGNoaW5nTFtbMThdXSA8LSB3MXcyW2ksMzQxOjM2MF0NCiAgICBtYXRjaGluZ0xbWzE5XV0gPC0gdzF3MltpLDM2MTozODBdDQogICAgbWF0Y2hpbmdMW1syMF1dIDwtIHcxdzJbaSwzODE6NDAwXQ0KICB9DQogIA0KICAjZmluZCB0aGUgJ3JpZ2h0JyBtYXRjaGluZyBtYXRyaXggaW4gdGhpcyBsaXN0LCBieSB0YWtpbmcgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGFuc3dlcnMNCiAgaW5kIDwtIE5VTEwNCiAgZm9yIChqIGluIHNlcV9hbG9uZyhtYXRjaGluZ0wpKSB7DQogICAgI2NoZWNrIGFsb25nIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBqIGluIHRoZSBtYXRjaGluZyBtYXRyaXggbGlzdCBpZiB0aGV5IGFyZSBub24tZW1wdHkgYW5kIG5vdCBOQQ0KICAgIGNoZWNrIDwtIEZBTFNFDQogICAgZm9yIChjb2wgaW4gbWF0Y2hpbmdMW1tqXV0pIHsNCiAgICAgIGlmICghYWxsKGlzLm5hKGNvbCkpICYmIGFueShuY2hhcihjb2wpID4gMCkpIHsNCiAgICAgICAgY2hlY2sgPC0gVFJVRQ0KICAgICAgICBicmVhayAgDQogICAgICB9DQogICAgICB9DQogICAgaWYgKGNoZWNrKSB7DQogICAgICBpbmQgPC0gag0KICAgICAgYnJlYWsgIA0KICAgIH0NCiAgfQ0KICANCiAgaWYobGVuZ3RoKGluZCk+MCkgew0KICAgICMgZ2V0IHRoZSAgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtbSA8LSBtYXRjaGluZ0xbW2luZF1dDQogICAgDQogICAgIyBleHRyYWN0IGFsdGVyIGlkcw0KICAgIGFucyA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdF9hbGwobW0sIlxcKD9bMC05LC5dK1xcKT8iKSANCiAgICAjIGhlcmUsIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSB3MS1hbHRlciBqOw0KICAgICMgYW5kIHRoZSBlbGVtZW50IGluZGljYXRvciBpbiB0aGUgbGlzdCByZWZlcnMgdG8gdGhlIHcyLWFsdGVyIA0KICAgIA0KICAgIGZvciAoaiBpbiB1bmlxdWUoZGYkYWx0ZXJpZFt3aGljaChkZiRlZ289PWkpXSkpIHsgIyBmb3IgdzEtYWx0ZXIgaiwNCiAgICAgIA0KICAgICAgIyB0byB3aGljaCByb3cvdzItYWx0ZXIgd2FzIGFsdGVyIGogbWF0Y2hlZD8NCiAgICAgIG1hdGNoIDwtIHdoaWNoKGFucz09aikNCiAgICAgICMgYW5kIGluIHdoaWNoIG5ldHdvcmtzIGRpZCB0aGlzIHcyLWFsdGVyIGJlbG9uZz8NCiAgICAgIG5ldHMgPC0gZGYyW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PW1hdGNoWzFdKSxdICNhZGQgWzFdIHRvIG1hdGNoLCBmb3IgdGhlIGZldyBjYXNlcyB3aGVyZSBtdWx0aXBsZSB3Mi1hbHRlcnMgd2VyZSBtYXRjaGVkIHRvIHRoZSBzYW1lIHcxLWFsdGVyIChpLmUuLCB3aGVuIGVnbyBkaWQgbm90IGNvcnJlY2x0eSBwZXJmb3JtIG1hdGNoIHcyIGFsdGVycyB0byBlYWNoIG90aGVyLikNCiAgICANCiAgICBpZihsZW5ndGgobWF0Y2gpPjApIHsgIyBpZiBqIHdhcyBtYXRjaGVkIHRvIHcyLWFsdGVycy4uLg0KICAgICAgIyBhc3NpZ24gdG8gYWx0ZXIgaiB0aGUgbmV0d29ya3MgaW4gd2hpY2ggaiByZWFwcGVhcmVkDQogICAgICBkZiRjZG4yW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJGNkblsxXQ0KICAgICAgZGYkc3R1ZHkyW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJHN0dWR5WzFdDQogICAgICBkZiRiZmYyW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJGJmZlsxXQ0KICAgICAgZGYkY3NuMlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gbmV0cyRjc25bMV0NCiAgICAgIA0KICAgICAgI2FuZCBhdHRhY2ggdGhlaXIgdDIgZW1iZWRkZWRuZXMgc2NvcmUNCiAgICAgIGRmJGNkbl9lbWJlZC50Mlt3aGljaChkZiRlZ289PWkgJiBkZiRhbHRlcmlkPT1qKV0gPC0gbmV0cyRjZG5fZW1iZWQudDJbMV0NCiAgICAgIGRmJHN0dWR5X2VtYmVkLnQyW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBuZXRzJHN0dWR5X2VtYmVkLnQyWzFdDQogICAgICBkZiRiZmZfZW1iZWQudDJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkYmZmX2VtYmVkLnQyWzFdDQogICAgICBkZiRjc25fZW1iZWQudDJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIG5ldHMkY3NuX2VtYmVkLnQyWzFdDQogICAgfQ0KICB9DQogIH0NCn0NCg0KIyBjdXJyZW50bHk7IGEgbG90IG9mIE5BcyBpbiB0aGUgYXR0cmlidXRlcyBpbmRpY2F0aW5nIHdoZXRoZXIgYWx0ZXIgaiB3YXMgbWVtYmVyIG9mIHRoZSByZXNwZWN0aXZlIG5ldHdvcmtzLg0KIyB0aG9zZSBhcmUgYWx0ZXJzIHRoYXQgd2VyZSBub3QgcmVuYW1lZCwgYW5kIHRodXMgaGF2ZSBubyAnY2hhbmNlJyB0byByZS1hcHBlYXIuIHNvLCAwcyBhcmUgYWx0ZXJzIHRoYXQgd2VyZSBvbmNlIHBhcnQgb2YgYSBzcGVjaWZpYyBuZXR3b3JrLCBidXQgcmUtYXBwZWFyZWQgbm90IGluIHRoYXQgcGFydGljdWxhciBuZXR3b3JrLg0KIyBuYXR1cmFsbHksIGZvciBhbmFseXNlcywgTkFzIGNhbiBiZSBzZXQgdG8gMC4NCg0KIyBhcyBhIHNlY29uZCB0aWUgY2hhbmdlIGluZGljYXRvciwgaSBsb29rIGF0IHdoZXRoZXIgKHVuLWxpc3RlZCkgYWx0ZXJzIGFuZCBlZ28gd2VyZSBzdGlsbCBpbiB0b3VjaA0KZGYkZnJlcXVlbmN5LnQyIDwtIE5BDQpkZiRjbG9zZW5lc3MudDIgPC0gTkENCg0KIyBzdWJzZXQgdzIgbmFtZSBpbnRlcnByZXRlcnMgb24gY29udGFjdCBmcmVxLiBvZiB3MSBhbHRlcnMgKHNxMDIxIC0gc3EwNDAhKQ0KZnJlcSA8LSBkYXRhNFssYygxMTc2OjExOTUpXQ0KIyBhbHNvIGNsb3NlbmVzcw0KY2xvc2UgPC0gZGF0YTRbLGMoMTIxNjoxMjM1KV0NCg0KIyByZWNvZGUgaW50byBudW1lcmljIHZhbHVlczsNCmZyZXEgPC0gaWZlbHNlKGZyZXE9PSIoQmlqbmEpIGVsa2UgZGFnIiw3LA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09IjEtMiBrZWVyIHBlciB3ZWVrIiw2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgbWFhbmQiLDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIG1hYW5kIiw0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgamFhciIsMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIGphYXIiLDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJOb29pdCIsMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICkpKSkpKSkNCmNsb3NlIDwtIGlmZWxzZShjbG9zZT09IkhlZWwgZXJnIGhlY2h0IiwgNCwgaWZlbHNlKGNsb3NlPT0iSGVjaHQiLCAzLCBpZmVsc2UoY2xvc2U9PSJFbmlnc3ppbnMgaGVjaHQiLDIsIGlmZWxzZShjbG9zZT09Ik5pZXQgaGVjaHQiLCAxLCBOQSkpKSkNCg0KZm9yIChpIGluIHVuaXF1ZShkZiRlZ28pKSB7DQogIGZvciAoaiBpbiB1bmlxdWUoZGYkYWx0ZXJpZFt3aGljaChkZiRlZ289PWkpXSkpIHsNCiAgICBkZiRmcmVxdWVuY3kudDJbd2hpY2goZGYkZWdvPT1pICYgZGYkYWx0ZXJpZD09aildIDwtIGZyZXFbaSxdWyFpcy5uYShmcmVxW2ksXSldW2pdDQogICAgZGYkY2xvc2VuZXNzLnQyW3doaWNoKGRmJGVnbz09aSAmIGRmJGFsdGVyaWQ9PWopXSA8LSBjbG9zZVtpLF1bIWlzLm5hKGNsb3NlW2ksXSldW2pdDQogIH0NCn0NCg0KIyBzaXplIG9mIGVhY2ggZWdvbmV0IGF0IHQyDQpkZiRjZG4uc2l6ZTIgPC0gTkENCmRmJHN0dWR5LnNpemUyIDwtIE5BDQpkZiRiZmYuc2l6ZTIgPC0gTkENCmRmJGNzbi5zaXplMiA8LSBOQQ0KDQpmb3IgKGkgaW4gdW5pcXVlKGRmJGVnbykpIHsNCiAgZGYkY2RuLnNpemUyW3doaWNoKGRmJGVnbz09aSldIDwtIHJvd1N1bXMoY2JpbmQoZGF0YTQkZWdvbmV0MS5TUTAwMS5baV0sZGF0YTQkZWdvbmV0MS5TUTAwMi5baV0sZGF0YTQkZWdvbmV0MS5TUTAwMy5baV0sZGF0YTQkZWdvbmV0MS5TUTAwNC5baV0sZGF0YTQkZWdvbmV0MS5TUTAwNS5baV0pIT0iIikNCiAgICBkZiRzdHVkeS5zaXplMlt3aGljaChkZiRlZ289PWkpXSA8LSByb3dTdW1zKGNiaW5kKGRhdGE0JGVnb25ldDIuU1EwMDEuW2ldLGRhdGE0JGVnb25ldDIuU1EwMDIuW2ldLGRhdGE0JGVnb25ldDIuU1EwMDMuW2ldLGRhdGE0JGVnb25ldDIuU1EwMDQuW2ldLGRhdGE0JGVnb25ldDIuU1EwMDUuW2ldKSE9IiIpDQogICAgZGYkYmZmLnNpemUyW3doaWNoKGRmJGVnbz09aSldIDwtIHJvd1N1bXMoY2JpbmQoZGF0YTQkZWdvbmV0My5TUTAwMS5baV0sZGF0YTQkZWdvbmV0My5TUTAwMi5baV0sZGF0YTQkZWdvbmV0My5TUTAwMy5baV0sZGF0YTQkZWdvbmV0My5TUTAwNC5baV0sZGF0YTQkZWdvbmV0My5TUTAwNS5baV0pIT0iIikNCiAgICBkZiRjc24uc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV0gPC0gcm93U3VtcyhjYmluZChkYXRhNCRlZ29uZXQ0LlNRMDAxLltpXSxkYXRhNCRlZ29uZXQ0LlNRMDAyLltpXSxkYXRhNCRlZ29uZXQ0LlNRMDAzLltpXSxkYXRhNCRlZ29uZXQ0LlNRMDA0LltpXSxkYXRhNCRlZ29uZXQ0LlNRMDA1LltpXSkhPSIiKSB9DQoNCiNhbmQgZGVuc2l0eSBhdCB0Mi4NCmRmJGNkbi5kZW5zaXR5MiA8LSBkZiRzdHVkeS5kZW5zaXR5MiA8LSBkZiRjc24uZGVuc2l0eTIgPC0gZGYkYmZmLmRlbnNpdHkyIDwtIE5BDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYkZWdvKSkgew0KICAjYS4gQ0RODQogIHNpemUgPC0gZGYkY2RuLnNpemUyW3doaWNoKGRmJGVnbz09aSldWzFdDQogICNuby4gcG9zc2libGUgdGllcyBiZXR3ZWVuIGFsdGVycw0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICAjZ2V0IG5vLiBvZiBvYnNlcnZlZCB0aWVzDQogICNvbmx5IGlmIGVnbyBuYW1lZCBhdCBsZWFzdCAyIGFsdGVycyBpbiB0aGlzIG5hbWUgZ2VuZXJhdG9yDQogICNiZWNhdXNlIG9ubHkgdGhlbiBpIGNhbiBjYWxjdWxhdGUgZGVuc2l0eQ0KICBpZihzaXplPjEpIHsNCiAgICAjZ2V0IGFsdGVyLWFsdGVyIGFkamFjZW5jeSBtYXRyaWNlcyBvZiB0aGlzIHBhcnRpY3VsYXIgZWdvbmV0DQogICAgYWRqYWNlbmN5IDwtIGRhdGE0W2ksYyg4OjI3KV0NCg0KICAgICNpIHdhbnQgdGhlIGNvcnJlY3Qgb25lcywgZ2l2ZW4gdGhlIG5vLiBvZiBsaXN0ZWQgYWx0ZXJzIGluIHRoaXMgbmFtZSBnZW5lcmF0b3INCiAgICAjaSBsaXN0IHRoZSBjb2x1bW5zIG51bWJlcnMgb2YgdGhlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbWF0Y2hpbmcgbWF0cml4IHNldCwNCiAgICAjYW5kIHN1YnNldCBjb3JyZXNwb25kaW5nIGNvbHVtbnMgaW4gYGFkamFjZW5jeWANCiAgICBhZGogPC0gYWRqYWNlbmN5WyxsaXN0KDAsMSxjKDI6NCksYyg1OjEwKSxjKDExOjIwKSlbc2l6ZV1bWzFdXV0NCiAgIA0KICAgICNjb3VudCBudW1iZXIgb2YgdGllcyB0aGF0IGVnbyBkZXNjcmliZWQgYXMgKHZlcnkpIGNsb3NlICh2cy4gbm90IGNsb3NlIGJ1dCBubyBzdHJhbmdlcjsgc3RyYW5nZXJzKQ0KICAgIG9icyA8LSBsZW5ndGgod2hpY2goYWRqPT0iSGVjaHQifGFkaj09IkVyZyBoZWNodCIpKQ0KICAgIGRmJGNkbi5kZW5zaXR5Mlt3aGljaChkZiRlZ289PWkpXSA8LSBvYnMvcG9zICB9DQogIA0KICAjYi4gc3R1ZHkNCiAgc2l6ZSA8LSBkZiRzdHVkeS5zaXplMlt3aGljaChkZiRlZ289PWkpXVsxXQ0KICBwb3MgPC0gaWZlbHNlKHNpemU9PTIsIDEsIGlmZWxzZShzaXplPT0zLCAzLCBpZmVsc2Uoc2l6ZT09NCwgNiwgaWZlbHNlKHNpemU9PTUsIDEwLCAwKSkpKQ0KICBpZihzaXplPjEpIHsNCiAgICBhZGphY2VuY3kgPC0gZGF0YTRbaSxjKDMzOjUyKV0NCiAgICAjcmVvcmRlciBjb2x1bW5zLi4uLiBtZXNzeSENCiAgICBhZGphY2VuY3kgPC0gYWRqYWNlbmN5WyxjKCJhZGoyTjJhLlNRMDAxLiIsICJhZGoyTjNhLlNRMDAxLiIsICJhZGoyTjNhLlNRMDAyLiIsICJhZGoyTjNiLlNRMDAxLiIsICJhZGoyTjRhLlNRMDAxLiIsICJhZGoyTjRhLlNRMDAyLiIsDQogICAgICAgICAgICAgICAgICAgICAgICJhZGoyTjRhLlNRMDAzLiIsICJhZGoyTjRiLlNRMDAxLiIsICJhZGoyTjRiLlNRMDAyLiIsICJhZGoyTjRjLlNRMDAxLiIsICJhZGoyTjVhLlNRMDAxLiIsICJhZGoyTjVhLlNRMDAyLiIsDQogICAgICAgICAgICAgICAgICAgICAgICJhZGoyTjVhLlNRMDAzLiIsICJhZGoyTjVhLlNRMDA0LiIsICJhZGoyTjViLlNRMDAxLiIsICJhZGoyTjViLlNRMDAyLiIsICJhZGoyTjViLlNRMDAzLiIsICJhZGoyTjVjLlNRMDAxLiIsDQogICAgICAgICAgICAgICAgICAgICAgICJhZGoyTjVjLlNRMDAyLiIsICJhZGoyTjVkLlNRMDAxLiIpXQ0KICAgIA0KICAgIGFkaiA8LSBhZGphY2VuY3lbLGxpc3QoMCwxLGMoMjo0KSxjKDU6MTApLGMoMTE6MjApKVtzaXplXVtbMV1dXQ0KICANCiAgICAjY291bnQgbnVtYmVyIG9mIHRpZXMgdGhhdCBlZ28gZGVzY3JpYmVkIGFzICh2ZXJ5KSBjbG9zZSAodnMuIG5vdCBjbG9zZSBidXQgbm8gc3RyYW5nZXI7IHN0cmFuZ2VycykNCiAgICBvYnMgPC0gbGVuZ3RoKHdoaWNoKGFkaj09IkhlY2h0InxhZGo9PSJFcmcgaGVjaHQiKSkNCiAgICBkZiRzdHVkeS5kZW5zaXR5Mlt3aGljaChkZiRlZ289PWkpXSA8LSBvYnMvcG9zIH0NCiAgDQogICNjLiBmcmllbmRzDQogIHNpemUgPC0gZGYkYmZmLnNpemUyW3doaWNoKGRmJGVnbz09aSldWzFdDQogIHBvcyA8LSBpZmVsc2Uoc2l6ZT09MiwgMSwgaWZlbHNlKHNpemU9PTMsIDMsIGlmZWxzZShzaXplPT00LCA2LCBpZmVsc2Uoc2l6ZT09NSwgMTAsIDApKSkpDQogIGlmKHNpemU+MSkgew0KICAgIGFkamFjZW5jeSA8LSBkYXRhNFtpLGMoMTU2OjE3NSldDQogICAgYWRqIDwtIGFkamFjZW5jeVssbGlzdCgwLDEsYygyOjQpLGMoNToxMCksYygxMToyMCkpW3NpemVdW1sxXV1dDQogICAgDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkYmZmLmRlbnNpdHkyW3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgfQ0KDQogICNkLiBzcG9ydHMgcGFydG5lcnMNCiAgc2l6ZSA8LSBkZiRjc24uc2l6ZTJbd2hpY2goZGYkZWdvPT1pKV1bMV0NCiAgcG9zIDwtIGlmZWxzZShzaXplPT0yLCAxLCBpZmVsc2Uoc2l6ZT09MywgMywgaWZlbHNlKHNpemU9PTQsIDYsIGlmZWxzZShzaXplPT01LCAxMCwgMCkpKSkNCiAgaWYoc2l6ZT4xKSB7DQogICAgYWRqYWNlbmN5IDwtIGRhdGE0W2ksYyg0MDE6NDIwKV0NCiAgICBhZGogPC0gYWRqYWNlbmN5WyxsaXN0KDAsMSxjKDI6NCksYyg1OjEwKSxjKDExOjIwKSlbc2l6ZV1bWzFdXV0NCiAgDQogICAgI2NvdW50IG51bWJlciBvZiB0aWVzIHRoYXQgZWdvIGRlc2NyaWJlZCBhcyAodmVyeSkgY2xvc2UgKHZzLiBub3QgY2xvc2UgYnV0IG5vIHN0cmFuZ2VyOyBzdHJhbmdlcnMpDQogICAgb2JzIDwtIGxlbmd0aCh3aGljaChhZGo9PSJIZWNodCJ8YWRqPT0iRXJnIGhlY2h0IikpDQogICAgZGYkY3NuLmRlbnNpdHkyW3doaWNoKGRmJGVnbz09aSldIDwtIG9icy9wb3MgfQ0KfQ0KDQojc2V0IE5BcyB0byAwLg0KZGYkY2RuLmRlbnNpdHkyW2lzLm5hKGRmJGNkbi5kZW5zaXR5MildIDwtIDANCmRmJHN0dWR5LmRlbnNpdHkyW2lzLm5hKGRmJHN0dWR5LmRlbnNpdHkyKV0gPC0gMA0KZGYkYmZmLmRlbnNpdHkyW2lzLm5hKGRmJGJmZi5kZW5zaXR5MildIDwtIDANCmRmJGNzbi5kZW5zaXR5Mltpcy5uYShkZiRjc24uZGVuc2l0eTIpXSA8LSAwDQoNCiNhZGQgV2F2ZSAyIHN0YXR1cw0KZGYkc3RhdHVzVzIgPC0gTkENCmRmJHN0YXR1c1cyIDwtIGlmZWxzZShkZiRzdXJ2aXZlPT0xLCAiTWFpbnRhaW5lZCIsICJEcm9wcGVkIikNCg0KZGZfbWFpbnRhaW5lZCA8LSBkZg0KI2ZpeChkZl9tYWludGFpbmVkKQ0KI3N0cihkZl9tYWludGFpbmVkKQ0KI2xhc3QgbWFrZSBnZW5kZXIgbnVtZXJpYy4uDQpkZl9tYWludGFpbmVkJGFsdGVyX2dlbmRlciA8LSBhcy5udW1lcmljKGRmX21haW50YWluZWQkYWx0ZXJfZ2VuZGVyKQ0KYGBgDQoNCjxicj4NCg0KIyMgd2F2ZSAyIGNyZWF0ZWQNCg0KYGBge3IsIGV2YWwgPSBGQUxTRX0NCiNjcmVhdGUgYSBuZXcgYWx0ZXIgTGlzdA0KYWx0ZXJMIDwtIHZlY3RvcigibGlzdCIsIG5yb3coZGF0YSkpDQoNCiMgbG9vcCBvdmVyIGFsbCBlZ29zDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgICBhbHRlckxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgICAgZWdvX2dlbmRlciA9IE5BLCBlZ29fYWdlID0gTkEsIGVnb19lZHVjID0gTkEsDQogICAgICBhbHRlcmlkID0gMToyMCwgbmFtZTEgPSBOQSwgbmFtZTIgPSBOQSwgbmFtZTMgPSBOQSwgbmFtZTQgPSBOQSwNCiAgICAgIGFsdGVyX2dlbmRlciA9IE5BLCBhbHRlcl9hZ2UgPSBOQSwgYWx0ZXJfZWR1Yz1OQSwNCiAgICAgIHNhbWVfZ2VuZGVyID0gTkEsIGRpZl9hZ2UgPSBOQSwgc2ltX2VkdWMgPSBOQSwNCiAgICAgIGNkbl9lbWJlZC50MiA9IE5BLCBzdHVkeV9lbWJlZC50MiA9IE5BLCBiZmZfZW1iZWQudDIgPSBOQSwgY3NuX2VtYmVkLnQyID0gTkEpDQp9DQoNCiNmaWxsIGluIG5hbWVzIGJhc2VkIG9uIG5hbWVzX2RmDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kbmFtZTEgPC0gdW5saXN0KGRmX25hbWVzW2ksIF0sIHVzZS5uYW1lcz1GQUxTRSkNCn0NCg0KIyByZXBsYWNlIGVtcHR5IHN0cmluZ3Mgd2l0aCA8TkE+DQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSRuYW1lMSA8LSBpZmVsc2UoYWx0ZXJMW1tpXV0kbmFtZTE9PSIiLCBOQSwgYWx0ZXJMW1tpXV0kbmFtZTEpDQp9DQoNCiNtYXRjaGluZw0Kew0KICBuZXQxIDwtIGNiaW5kKGRhdGE0JGVnb25ldDEuU1EwMDEuLGRhdGE0JGVnb25ldDEuU1EwMDIuLCBkYXRhNCRlZ29uZXQxLlNRMDAzLixkYXRhNCRlZ29uZXQxLlNRMDA0LiwgZGF0YTQkZWdvbmV0MS5TUTAwNS4pDQogIG5ldDEgPC0gaWZlbHNlKG5ldDE9PSIiLCBOQSwgbmV0MSkNCiAgbnMxIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MSkpIHsNCiAgICBuczFbaV0gPC0gbGVuZ3RoKG5ldDFbaSxdW3doaWNoKCFpcy5uYShuZXQxW2ksXSkpXSkNCiAgfQ0KICBuZXQyIDwtIGNiaW5kKGRhdGE0JGVnb25ldDIuU1EwMDEuLGRhdGE0JGVnb25ldDIuU1EwMDIuLCBkYXRhNCRlZ29uZXQyLlNRMDAzLixkYXRhNCRlZ29uZXQyLlNRMDA0LiwgZGF0YTQkZWdvbmV0Mi5TUTAwNS4pDQogIG5ldDIgPC0gaWZlbHNlKG5ldDI9PSIiLCBOQSwgbmV0MikNCiAgbnMyIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MikpIHsNCiAgICBuczJbaV0gPC0gbGVuZ3RoKG5ldDJbaSxdW3doaWNoKCFpcy5uYShuZXQyW2ksXSkpXSkNCiAgfQ0KICBuZXQzIDwtIGNiaW5kKGRhdGE0JGVnb25ldDMuU1EwMDEuLGRhdGE0JGVnb25ldDMuU1EwMDIuLCBkYXRhNCRlZ29uZXQzLlNRMDAzLixkYXRhNCRlZ29uZXQzLlNRMDA0LiwgZGF0YTQkZWdvbmV0My5TUTAwNS4pDQogIG5ldDMgPC0gaWZlbHNlKG5ldDM9PSIiLCBOQSwgbmV0MykNCiAgbnMzIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MykpIHsNCiAgICBuczNbaV0gPC0gbGVuZ3RoKG5ldDNbaSxdW3doaWNoKCFpcy5uYShuZXQzW2ksXSkpXSkNCiAgfQ0KICBuZXQ0IDwtIGNiaW5kKGRhdGE0JGVnb25ldDQuU1EwMDEuLGRhdGE0JGVnb25ldDQuU1EwMDIuLCBkYXRhNCRlZ29uZXQ0LlNRMDAzLixkYXRhNCRlZ29uZXQ0LlNRMDA0LiwgZGF0YTQkZWdvbmV0NC5TUTAwNS4pDQogIG5ldDQgPC0gaWZlbHNlKG5ldDQ9PSIiLCBOQSwgbmV0NCkNCiAgbnM0IDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0NCkpIHsNCiAgICBuczRbaV0gPC0gbGVuZ3RoKG5ldDRbaSxdW3doaWNoKCFpcy5uYShuZXQ0W2ksXSkpXSkNCiAgfQ0KfQ0KDQptYXRjaGluZ0xpc3QgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZ0wgPC0gbGlzdCgpDQogICMgbWFrZSA1IHNlcGVyYXRlIG1hdGNoaW5nIG1hdHJpY2VzLiBuYXR1cmFsbHksIG9ubHkgMSBpcyByZWxldmFudC4uLiBidXQgaSB3aWxsIHNlbGVjdCB0aGF0IGxhdGVyLg0KICBtYXRjaGluZ0xbWzFdXSA8LSBjYmluZChkYXRhNCRtYXRjaGluZzFOMS5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMU4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzFOMS5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcxTjEuU1EwMDVfU1EwMDEuW2ldKQ0KICBtYXRjaGluZ0xbWzJdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMi5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjIuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMi5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nTFtbM11dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFOMy5TUTAwMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjMuU1EwMDNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFOMy5TUTAwNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nTFtbNF1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU40LlNRMDAxX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONC5TUTAwMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDFfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwMl9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU40LlNRMDAzX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjQuU1EwMDRfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONC5TUTAwNV9TUTAwNC5baV0pKQ0KICBtYXRjaGluZ0xbWzVdXTwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMU41LlNRMDAxX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDVfU1EwMDQuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzFONS5TUTAwMV9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDAyX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmcxTjUuU1EwMDNfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzFONS5TUTAwNF9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nMU41LlNRMDA1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdFtbaV1dIDwtIG1hdGNoaW5nTA0KfQ0KDQojIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgbWF0Y2hpbmcgbWF0cmljZXMgYW5kIHRoZSBuZXRzaXplcyBmb3IgZWdvIGFsbG93cyBtZSB0byBtYXRjaCB0aGUgbmFtZXMgbXlzZWxmLg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdCkpIHsgICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdFtbaV1dICAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QNCiAgbnMgPC0gbnMyW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQyDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQyW2ksXQ0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWUyW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PW1hdGNoZWRbLDJdKV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQptYXRjaGluZ0xpc3QyIDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgIyBmb3IgZWdvIGkNCiAgbWF0Y2hpbmcyTCA8LSBsaXN0KCkNCiAgbWF0Y2hpbmcyTFtbMV1dIDwtIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4xLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjEuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4xLlNRMDEwX1NRMDAxLltpXSkNCiAgbWF0Y2hpbmcyTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4yLlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjIuU1EwMTBfU1EwMDIuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbM11dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJOMy5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjMuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJOMy5TUTAxMF9TUTAwMy5baV0pKQ0KICBtYXRjaGluZzJMW1s0XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONC5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk40LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDEwX1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDAyX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwM19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA1X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwNl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk40LlNRMDA4X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONC5TUTAwOV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjQuU1EwMTBfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzJONS5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nMk41LlNRMDAxX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwMl9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDNfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA0X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDZfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA3X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDlfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDEwX1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDFfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDAyX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwM19TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDRfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA1X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwNl9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMDdfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nMk41LlNRMDA4X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzJONS5TUTAwOV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmcyTjUuU1EwMTBfU1EwMDUuW2ldKSkNCiAgbWF0Y2hpbmdMaXN0MltbaV1dIDwtIG1hdGNoaW5nMkwNCn0NCg0KZm9yIChpIGluIDE6bGVuZ3RoKG1hdGNoaW5nTGlzdDIpKSB7ICAgICMgZm9yIGVnbyBpDQogIG1MIDwtIG1hdGNoaW5nTGlzdDJbW2ldXSAgICAgICAgICAgICAgIyBnZXQgdGhlIG1hdGNoaW5nIGxpc3QgMg0KICBucyA8LSBuczNbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDMNCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1hdHJpeA0KICAgIG1hdGNoZWQgPC0gd2hpY2gobW09PTEsIGFyci5pbmQ9VCkgICMgcmV0cmlldmUgYXJyYXkgaW5kaWNlcw0KICAgIG5ldCA8LSBuZXQzW2ksXQ0KICAgIA0KICAgIGlmKGxlbmd0aChtYXRjaGVkKT4wKSB7ICAgICAgICAgICAgICMgaWYgbWF0Y2hpbmcgd2FzIHBlcmZvcm1lZCENCiAgICAgIGFsdGVyTFtbaV1dJG5hbWUzW21hdGNoZWRbLDJdXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9DQoNCm1hdGNoaW5nTGlzdDMgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzNMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzNMW1sxXV0gPC0gY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04xLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMS5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjEuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMS5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04xLlNRMDE1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmczTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04yLlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM04yLlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMi5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04yLlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04yLlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjIuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzNMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDAyX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwM19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA1X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM04zLlNRMDA4X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxMV9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDEyX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjMuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNOMy5TUTAxNF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM04zLlNRMDE1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nM0xbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNCRtYXRjaGluZzNONC5TUTAwMV9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDJfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDAzX1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwNF9TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDVfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA2X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAwN19TUTAwNC5baV0sZGF0YTQkbWF0Y2hpbmczTjQuU1EwMDhfU1EwMDQuW2ldLGRhdGE0JG1hdGNoaW5nM040LlNRMDA5X1NRMDA0LltpXSxkYXRhNCRtYXRjaGluZzNONC5TUTAxMF9TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDExX1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDQuW2ldLCBkYXRhNCRtYXRjaGluZzNONC5TUTAxM19TUTAwNC5baV0sIGRhdGE0JG1hdGNoaW5nM040LlNRMDE0X1NRMDA0LltpXSwgZGF0YTQkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAxLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAxLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAyLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMi5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMi5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAyLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDAzLltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwMy5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDAzLltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE0JG1hdGNoaW5nM041LlNRMDAxX1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwMl9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA0X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwNV9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDA3X1NRMDA1LltpXSxkYXRhNCRtYXRjaGluZzNONS5TUTAwOF9TUTAwNS5baV0sZGF0YTQkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE0JG1hdGNoaW5nM041LlNRMDEwX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTFfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxMl9TUTAwNS5baV0sIGRhdGE0JG1hdGNoaW5nM041LlNRMDEzX1NRMDA1LltpXSwgZGF0YTQkbWF0Y2hpbmczTjUuU1EwMTRfU1EwMDUuW2ldLCBkYXRhNCRtYXRjaGluZzNONS5TUTAxNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QzW1tpXV0gPC0gbWF0Y2hpbmczTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MykpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0M1tbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zNFtbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0NA0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDRbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTRbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KI2kgYWxzbyBjYWxjdWxhdGUgc3RydWN0dXJhbCBlbWJlZGRlZG5lc3MgKGFsdGVyLWxldmVsKSBwZXIgZWdvLW5ldC4NCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQoNCiAgI2dldCBudW1iZXIgb2YgbmFtZXMgbGlzdGVkIGluIHRoZSBlZ29uZXRzDQogIG5uYW1lc19jZG4gPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0MS5TUTAwMS4iLCJlZ29uZXQxLlNRMDAyLiIsImVnb25ldDEuU1EwMDMuIiwiZWdvbmV0MS5TUTAwNC4iLCJlZ29uZXQxLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfc3R1ZHkgPC0gbGVuZ3RoKHdoaWNoKGRhdGE0W2ksYygiZWdvbmV0Mi5TUTAwMS4iLCJlZ29uZXQyLlNRMDAyLiIsImVnb25ldDIuU1EwMDMuIiwiZWdvbmV0Mi5TUTAwNC4iLCJlZ29uZXQyLlNRMDA1LiIpXSE9IiIpKQ0KICBubmFtZXNfYmZmIDwtIGxlbmd0aCh3aGljaChkYXRhNFtpLGMoImVnb25ldDMuU1EwMDEuIiwiZWdvbmV0My5TUTAwMi4iLCJlZ29uZXQzLlNRMDAzLiIsImVnb25ldDMuU1EwMDQuIiwiZWdvbmV0My5TUTAwNS4iKV0hPSIiKSkNCiAgbm5hbWVzX2NzbiA8LSBsZW5ndGgod2hpY2goZGF0YTRbaSxjKCJlZ29uZXQ0LlNRMDAxLiIsImVnb25ldDQuU1EwMDIuIiwiZWdvbmV0NC5TUTAwMy4iLCJlZ29uZXQ0LlNRMDA0LiIsImVnb25ldDQuU1EwMDUuIildIT0iIikpDQogIA0KICAjQ0RODQogIA0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajFOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqMU4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqMU4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqMU4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGoxTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGoxTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGoxTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGoxTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajFONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajFONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajFONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajFONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajFONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfY2RuPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcz4xDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nkbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICANCiAgI0NETjogMTpubmFtZXNfQ0RODQogIGFsdGVyTFtbaV1dJGNkbl9lbWJlZC50MlsxOm5uYW1lc19jZG5dIDwtIGVtYmVkIA0KICB9DQogIA0KICAjU1RVRFkNCg0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajJOMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqMk4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqMk4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqMk4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGoyTjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGoyTjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGoyTjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGoyTjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajJONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajJONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajJONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajJONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajJONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfc3R1ZHk+MSkgeyAjd2Ugb25seSBrbm93IGFsdGVyLWFsdGVyIHJlbGF0aW9ucyBmb3Igbm5hbWVzDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX3N0dWR5XV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kc3R1ZHlfZW1iZWQudDJbNjooNStubmFtZXNfc3R1ZHkpXSA8LSBlbWJlZCANCiAgfQ0KICANCiAgIyBCRVNUIEZSSUVORFMNCiAgI21ha2UgbGlzdCBvZiBhZGphY2VuY3kgbWF0cmljZXMNCiAgYWRqTCA8LSBsaXN0KCkNCiAgew0KICAjMiBhbHRlcnMNCiAgYWRqTFtbMl1dIDwtIG1hdHJpeChOQSxuY29sPTIsbnJvdz0yKQ0KICBhZGpMW1syXV1bMSwyXSA8LSBhZGpMW1syXV1bMiwxXSA8LSBkYXRhNCRhZGozTjJhLlNRMDAxLltpXQ0KDQogICMzIGFsdGVycw0KICBhZGpMW1szXV0gPC0gbWF0cml4KE5BLG5jb2w9Myxucm93PTMpDQogIGFkakxbWzNdXVsxLDJdIDwtIGFkakxbWzNdXVsyLDFdIDwtIGRhdGE0JGFkajNOM2EuU1EwMDEuW2ldDQogIGFkakxbWzNdXVsxLDNdIDwtIGFkakxbWzNdXVszLDFdIDwtIGRhdGE0JGFkajNOM2EuU1EwMDIuW2ldDQogIGFkakxbWzNdXVsyLDNdIDwtIGFkakxbWzNdXVszLDJdIDwtIGRhdGE0JGFkajNOM2IuU1EwMDEuW2ldDQoNCiAgIzQgYWx0ZXJzDQogIGFkakxbWzRdXSA8LSBtYXRyaXgoTkEsbmNvbD00LG5yb3c9NCkNCiAgYWRqTFtbNF1dWzEsMl0gPC0gYWRqTFtbNF1dWzIsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzEsM10gPC0gYWRqTFtbNF1dWzMsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzEsNF0gPC0gYWRqTFtbNF1dWzQsMV0gPC0gZGF0YTQkYWRqM040YS5TUTAwMy5baV0NCiAgYWRqTFtbNF1dWzIsM10gPC0gYWRqTFtbNF1dWzMsMl0gPC0gZGF0YTQkYWRqM040Yi5TUTAwMS5baV0NCiAgYWRqTFtbNF1dWzIsNF0gPC0gYWRqTFtbNF1dWzQsMl0gPC0gZGF0YTQkYWRqM040Yi5TUTAwMi5baV0NCiAgYWRqTFtbNF1dWzMsNF0gPC0gYWRqTFtbNF1dWzQsM10gPC0gZGF0YTQkYWRqM040Yy5TUTAwMS5baV0NCg0KICAjNSBhbHRlcnMNCiAgYWRqTFtbNV1dIDwtIG1hdHJpeChOQSxuY29sPTUsbnJvdz01KQ0KICBhZGpMW1s1XV1bMSwyXSA8LSBhZGpMW1s1XV1bMiwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMSwzXSA8LSBhZGpMW1s1XV1bMywxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMSw0XSA8LSBhZGpMW1s1XV1bNCwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMSw1XSA8LSBhZGpMW1s1XV1bNSwxXSA8LSBkYXRhNCRhZGozTjVhLlNRMDA0LltpXQ0KICBhZGpMW1s1XV1bMiwzXSA8LSBhZGpMW1s1XV1bMywyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMiw0XSA8LSBhZGpMW1s1XV1bNCwyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bMiw1XSA8LSBhZGpMW1s1XV1bNSwyXSA8LSBkYXRhNCRhZGozTjViLlNRMDAzLltpXQ0KICBhZGpMW1s1XV1bMyw0XSA8LSBhZGpMW1s1XV1bNCwzXSA8LSBkYXRhNCRhZGozTjVjLlNRMDAxLltpXQ0KICBhZGpMW1s1XV1bMyw1XSA8LSBhZGpMW1s1XV1bNSwzXSA8LSBkYXRhNCRhZGozTjVjLlNRMDAyLltpXQ0KICBhZGpMW1s1XV1bNCw1XSA8LSBhZGpMW1s1XV1bNSw0XSA8LSBkYXRhNCRhZGozTjVkLlNRMDAxLltpXQ0KICB9DQoNCiAgaWYobm5hbWVzX2JmZj4xKSB7ICN3ZSBvbmx5IGtub3cgYWx0ZXItYWx0ZXIgcmVsYXRpb25zIGZvciBubmFtZXMNCiAgICAjdGFrZSB0aGUgbWF0cml4IGNvcnJlc3BvbmRpbmcgdGhlIG5uYW1lcw0KICAgIG1hdCA8LSBhZGpMW1tubmFtZXNfYmZmXV0NCiAgICANCiAgICAjdGllcyB0aGF0IGFyZSAodmVyeSkgY2xvc2UgYXJlIDENCiAgICBtYXRbIWlzLm5hKG1hdCldIDwtIGlmZWxzZShtYXRbIWlzLm5hKG1hdCldPT0iRXJnIGhlY2h0IiB8IG1hdFshaXMubmEobWF0KV09PSJIZWNodCIsIDEsMCkNCg0KICAgICNjYWxjdWxhdGUgZW1iZWRkZWRuZXNzIGZvciBlYWNoIGFsdGVyL3JvdzoNCiAgICBlbWJlZCA8LSBhcHBseShtYXQsIDEsIGZ1bmN0aW9uKHJvdykgew0KICAgIG5fY29scyA8LSBzdW0oIWlzLm5hKHJvdykpDQogICAgbl9vbmVzIDwtIHN1bShyb3cgPT0gIjEiLCBuYS5ybSA9IFRSVUUpDQogICAgcmF0aW8gPC0gbl9vbmVzIC8gbl9jb2xzDQogICAgcmV0dXJuKHJhdGlvKQ0KICAgIH0pDQogICAgDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyWzExOigxMCtubmFtZXNfYmZmKV0gPC0gZW1iZWQgDQogIH0NCg0KICAjIFNQT1JUUyBQQVJUTkVSUw0KICAjbWFrZSBsaXN0IG9mIGFkamFjZW5jeSBtYXRyaWNlcw0KICBhZGpMIDwtIGxpc3QoKQ0KICB7DQogICMyIGFsdGVycw0KICBhZGpMW1syXV0gPC0gbWF0cml4KE5BLG5jb2w9Mixucm93PTIpDQogIGFkakxbWzJdXVsxLDJdIDwtIGFkakxbWzJdXVsyLDFdIDwtIGRhdGE0JGFkajROMmEuU1EwMDEuW2ldDQoNCiAgIzMgYWx0ZXJzDQogIGFkakxbWzNdXSA8LSBtYXRyaXgoTkEsbmNvbD0zLG5yb3c9MykNCiAgYWRqTFtbM11dWzEsMl0gPC0gYWRqTFtbM11dWzIsMV0gPC0gZGF0YTQkYWRqNE4zYS5TUTAwMS5baV0NCiAgYWRqTFtbM11dWzEsM10gPC0gYWRqTFtbM11dWzMsMV0gPC0gZGF0YTQkYWRqNE4zYS5TUTAwMi5baV0NCiAgYWRqTFtbM11dWzIsM10gPC0gYWRqTFtbM11dWzMsMl0gPC0gZGF0YTQkYWRqNE4zYi5TUTAwMS5baV0NCg0KICAjNCBhbHRlcnMNCiAgYWRqTFtbNF1dIDwtIG1hdHJpeChOQSxuY29sPTQsbnJvdz00KQ0KICBhZGpMW1s0XV1bMSwyXSA8LSBhZGpMW1s0XV1bMiwxXSA8LSBkYXRhNCRhZGo0TjRhLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMSwzXSA8LSBhZGpMW1s0XV1bMywxXSA8LSBkYXRhNCRhZGo0TjRhLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMSw0XSA8LSBhZGpMW1s0XV1bNCwxXSA8LSBkYXRhNCRhZGo0TjRhLlNRMDAzLltpXQ0KICBhZGpMW1s0XV1bMiwzXSA8LSBhZGpMW1s0XV1bMywyXSA8LSBkYXRhNCRhZGo0TjRiLlNRMDAxLltpXQ0KICBhZGpMW1s0XV1bMiw0XSA8LSBhZGpMW1s0XV1bNCwyXSA8LSBkYXRhNCRhZGo0TjRiLlNRMDAyLltpXQ0KICBhZGpMW1s0XV1bMyw0XSA8LSBhZGpMW1s0XV1bNCwzXSA8LSBkYXRhNCRhZGo0TjRjLlNRMDAxLltpXQ0KDQogICM1IGFsdGVycw0KICBhZGpMW1s1XV0gPC0gbWF0cml4KE5BLG5jb2w9NSxucm93PTUpDQogIGFkakxbWzVdXVsxLDJdIDwtIGFkakxbWzVdXVsyLDFdIDwtIGRhdGE0JGFkajRONWEuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsxLDNdIDwtIGFkakxbWzVdXVszLDFdIDwtIGRhdGE0JGFkajRONWEuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsxLDRdIDwtIGFkakxbWzVdXVs0LDFdIDwtIGRhdGE0JGFkajRONWEuU1EwMDMuW2ldDQogIGFkakxbWzVdXVsxLDVdIDwtIGFkakxbWzVdXVs1LDFdIDwtIGRhdGE0JGFkajRONWEuU1EwMDQuW2ldDQogIGFkakxbWzVdXVsyLDNdIDwtIGFkakxbWzVdXVszLDJdIDwtIGRhdGE0JGFkajRONWIuU1EwMDEuW2ldDQogIGFkakxbWzVdXVsyLDRdIDwtIGFkakxbWzVdXVs0LDJdIDwtIGRhdGE0JGFkajRONWIuU1EwMDIuW2ldDQogIGFkakxbWzVdXVsyLDVdIDwtIGFkakxbWzVdXVs1LDJdIDwtIGRhdGE0JGFkajRONWIuU1EwMDMuW2ldDQogIGFkakxbWzVdXVszLDRdIDwtIGFkakxbWzVdXVs0LDNdIDwtIGRhdGE0JGFkajRONWMuU1EwMDEuW2ldDQogIGFkakxbWzVdXVszLDVdIDwtIGFkakxbWzVdXVs1LDNdIDwtIGRhdGE0JGFkajRONWMuU1EwMDIuW2ldDQogIGFkakxbWzVdXVs0LDVdIDwtIGFkakxbWzVdXVs1LDRdIDwtIGRhdGE0JGFkajRONWQuU1EwMDEuW2ldDQogIH0NCg0KICBpZihubmFtZXNfY3NuPjEpIHsgI3dlIG9ubHkga25vdyBhbHRlci1hbHRlciByZWxhdGlvbnMgZm9yIG5uYW1lcz4yDQogICAgI3Rha2UgdGhlIG1hdHJpeCBjb3JyZXNwb25kaW5nIHRoZSBubmFtZXMNCiAgICBtYXQgPC0gYWRqTFtbbm5hbWVzX2Nzbl1dDQogICAgDQogICAgI3RpZXMgdGhhdCBhcmUgKHZlcnkpIGNsb3NlIGFyZSAxDQogICAgbWF0WyFpcy5uYShtYXQpXSA8LSBpZmVsc2UobWF0WyFpcy5uYShtYXQpXT09IkVyZyBoZWNodCIgfCBtYXRbIWlzLm5hKG1hdCldPT0iSGVjaHQiLCAxLDApDQoNCiAgICAjY2FsY3VsYXRlIGVtYmVkZGVkbmVzcyBmb3IgZWFjaCBhbHRlci9yb3c6DQogICAgZW1iZWQgPC0gYXBwbHkobWF0LCAxLCBmdW5jdGlvbihyb3cpIHsNCiAgICBuX2NvbHMgPC0gc3VtKCFpcy5uYShyb3cpKQ0KICAgIG5fb25lcyA8LSBzdW0ocm93ID09ICIxIiwgbmEucm0gPSBUUlVFKQ0KICAgIHJhdGlvIDwtIG5fb25lcyAvIG5fY29scw0KICAgIHJldHVybihyYXRpbykNCiAgICB9KQ0KICAgIA0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MlsxNjooMTUrbm5hbWVzX2NzbildIDwtIGVtYmVkIA0KICB9DQp9DQoNCiNhbHRlcnMgY291bGQgYmUgbmFtZWQgaW4gbXVsdGlwbGUgbmFtZSBnZW5lcmF0b3JzLiBlYWNoIGVsZW1lbnQgb2YgYWx0ZXJMIGNvbnRhaW5zIHJvd3MgY29ycmVzcG9uZGluZyB0byBhbHRlcnMgdGhhdCBtYXkgYmUgJ2R1cGxpY2F0ZXMnLg0KI2kgbWF0Y2ggdGhlIHN0cnVjdHVyYWwgZW1iZWRkZWRuZXNzIG1lYXN1cmVzDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkgDQogIGZvciAoaiBpbiAxOm5yb3coYWx0ZXJMW1tpXV0pKSB7ICNmb3IgYWx0ZXIgag0KIA0KICAgICNpZiBuYW1lMiBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIHN0dWR5IG5ldHdvcms7IGFuZCBtb3JlIHByZWNpc2VseSwgdG8gdGhlIHN0dWR5IHBhcnRuZXIgd2l0aCBuYW1lMTogYWx0ZXJMW1tpXV0kbmFtZTJbal0NCiAgICBhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MltqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWUyW2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQyW3doaWNoKGFsdGVyTFtbaV1dJG5hbWUxPT1hbHRlckxbW2ldXSRuYW1lMltqXSAmICFpcy5uYShhbHRlckxbW2ldXSRzdHVkeV9lbWJlZC50MikpXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJHN0dWR5X2VtYmVkLnQyW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lMyBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIGZyaWVuZHMgbmV0d29yazsgYW5kIG1vcmUgcHJlY2lzZWx5LCB0byB0aGUgZnJpZW5kIHdpdGggbmFtZTE6IGFsdGVyTFtbaV1dJG5hbWUzW2pdDQogICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW2pdIDwtIGlmZWxzZSghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTNbal0pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyTFtbaV1dJGJmZl9lbWJlZC50Mlt3aGljaChhbHRlckxbW2ldXSRuYW1lMSA9PSBhbHRlckxbW2ldXSRuYW1lM1tqXSAmICFpcy5uYShhbHRlckxbW2ldXSRiZmZfZW1iZWQudDIpKV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kYmZmX2VtYmVkLnQyW2pdKQ0KICAgIA0KICAgICNpZiBuYW1lNCBpcyBub3QgZW1wdHksIGFsdGVyIGogd2FzIG1hdGNoZWQgdG8gdGhlIHNwb3J0cyBuZXR3b3JrOyBhbmQgbW9yZSBwcmVjaXNlbHksIHRvIHRoZSBzcG9ydHMgcGFydG5lciB3aXRoIG5hbWUxOiBhbHRlckxbW2ldXSRuYW1lNFtqXQ0KICAgIGFsdGVyTFtbaV1dJGNzbl9lbWJlZC50MltqXSA8LSBpZmVsc2UoIWlzLm5hKGFsdGVyTFtbaV1dJG5hbWU0W2pdKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlckxbW2ldXSRjc25fZW1iZWQudDJbd2hpY2goYWx0ZXJMW1tpXV0kbmFtZTEgPT0gYWx0ZXJMW1tpXV0kbmFtZTRbal0gJiAhaXMubmEoYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyKSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJMW1tpXV0kY3NuX2VtYmVkLnQyW2pdICkNCg0KICB9DQp9DQoNCiN3aGlsZSBpbiB3YXZlIDEsIG9ubHkgdGhlIHVuaXF1ZSBhbHRlcnMgd2VyZSBsaXN0ZWQgaW4gdGhlIGdlbmRlci1uYW1lIGludGVycHJldGVycw0KI2luIHdhdmUgMiwgb25seSB0aGUgTkVXIGFsdGVycyB3ZXJlIGxpc3RlZCAoc2luY2UgaXQgaXMgYSBzdGFibGUgY2hhcmFjdGVyaXN0aWMpDQojc28gb25seSB0aGUgbm9uLW1hdGNoZWQgYWx0ZXJzIHRoYXQgZGlkIG5vdCBhcHBlYXIgaW4gdzENCiNpIGFza2VkIHJlc3BvbmRlbnRzIHRvICdjaGVjaycgbWFsZXMuDQoNCiNnZW5kZXINCmRmX21hbGVzIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRtYWxlcy5TUTAwMS4scDIgPSBkYXRhNCRtYWxlcy5TUTAwMi4scDMgPSBkYXRhNCRtYWxlcy5TUTAwMy4scDQgPSBkYXRhNCRtYWxlcy5TUTAwNC4scDUgPSBkYXRhNCRtYWxlcy5TUTAwNS4scDYgPSBkYXRhNCRtYWxlcy5TUTAwNi4scDcgPSBkYXRhNCRtYWxlcy5TUTAwNy4scDggPSBkYXRhNCRtYWxlcy5TUTAwOC4scDkgPSBkYXRhNCRtYWxlcy5TUTAwOS4scDEwPSBkYXRhNCRtYWxlcy5TUTAxMC4scDExPSBkYXRhNCRtYWxlcy5TUTAxMS4scDEyPSBkYXRhNCRtYWxlcy5TUTAxMi4scDEzPSBkYXRhNCRtYWxlcy5TUTAxMy4scDE0PSBkYXRhNCRtYWxlcy5TUTAxNC4scDE1PSBkYXRhNCRtYWxlcy5TUTAxNS4scDE2PSBkYXRhNCRtYWxlcy5TUTAxNi4scDE3PSBkYXRhNCRtYWxlcy5TUTAxNy4scDE4PSBkYXRhNCRtYWxlcy5TUTAxOC4scDE5PSBkYXRhNCRtYWxlcy5TUTAxOS4scDIwPSBkYXRhNCRtYWxlcy5TUTAyMC4pDQoNCiNraW4gDQpkZl9raW4gPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGtpbi5TUTAwMS4scDIgPSBkYXRhNCRraW4uU1EwMDIuLHAzID0gZGF0YTQka2luLlNRMDAzLixwNCA9IGRhdGE0JGtpbi5TUTAwNC4scDUgPSBkYXRhNCRraW4uU1EwMDUuLHA2ID0gZGF0YTQka2luLlNRMDA2LixwNyA9IGRhdGE0JGtpbi5TUTAwNy4scDggPSBkYXRhNCRraW4uU1EwMDguLHA5ID0gZGF0YTQka2luLlNRMDA5LiwgcDEwPSBkYXRhNCRraW4uU1EwMTAuLCBwMTE9IGRhdGE0JGtpbi5TUTAxMS4sIHAxMj0gZGF0YTQka2luLlNRMDEyLiwgcDEzPSBkYXRhNCRraW4uU1EwMTMuLCBwMTQ9IGRhdGE0JGtpbi5TUTAxNC4scDE1PSBkYXRhNCRraW4uU1EwMTUuLCBwMTY9IGRhdGE0JGtpbi5TUTAxNi4sIHAxNz0gZGF0YTQka2luLlNRMDE3LiwgcDE4PSBkYXRhNCRraW4uU1EwMTguLCBwMTk9IGRhdGE0JGtpbi5TUTAxOS4sIHAyMD0gZGF0YTQka2luLlNRMDIwLikNCg0KI2FnZSANCmRmX2FnZSA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkYWdlLlNRMDAxLixwMiA9IGRhdGE0JGFnZS5TUTAwMi4scDMgPSBkYXRhNCRhZ2UuU1EwMDMuLHA0ID0gZGF0YTQkYWdlLlNRMDA0LixwNSA9IGRhdGE0JGFnZS5TUTAwNS4scDYgPSBkYXRhNCRhZ2UuU1EwMDYuLHA3ID0gZGF0YTQkYWdlLlNRMDA3LixwOCA9IGRhdGE0JGFnZS5TUTAwOC4scDkgPSBkYXRhNCRhZ2UuU1EwMDkuLCBwMTA9IGRhdGE0JGFnZS5TUTAxMC4sIHAxMT0gZGF0YTQkYWdlLlNRMDExLiwgcDEyPSBkYXRhNCRhZ2UuU1EwMTIuLCBwMTM9IGRhdGE0JGFnZS5TUTAxMy4sIHAxND0gZGF0YTQkYWdlLlNRMDE0LixwMTU9IGRhdGE0JGFnZS5TUTAxNS4sIHAxNj0gZGF0YTQkYWdlLlNRMDE2LiwgcDE3PSBkYXRhNCRhZ2UuU1EwMTcuLCBwMTg9IGRhdGE0JGFnZS5TUTAxOC4sIHAxOT0gZGF0YTQkYWdlLlNRMDE5LiwgcDIwPSBkYXRhNCRhZ2UuU1EwMjAuKQ0KDQojZWR1YyANCmRmX2VkdWMgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGVkdWMuU1EwMDEuLHAyID0gZGF0YTQkZWR1Yy5TUTAwMi4scDMgPSBkYXRhNCRlZHVjLlNRMDAzLixwNCA9IGRhdGE0JGVkdWMuU1EwMDQuLHA1ID0gZGF0YTQkZWR1Yy5TUTAwNS4scDYgPSBkYXRhNCRlZHVjLlNRMDA2LixwNyA9IGRhdGE0JGVkdWMuU1EwMDcuLHA4ID0gZGF0YTQkZWR1Yy5TUTAwOC4scDkgPSBkYXRhNCRlZHVjLlNRMDA5LiwgcDEwPSBkYXRhNCRlZHVjLlNRMDEwLiwgcDExPSBkYXRhNCRlZHVjLlNRMDExLiwgcDEyPSBkYXRhNCRlZHVjLlNRMDEyLiwgcDEzPSBkYXRhNCRlZHVjLlNRMDEzLiwgcDE0PSBkYXRhNCRlZHVjLlNRMDE0LixwMTU9IGRhdGE0JGVkdWMuU1EwMTUuLCBwMTY9IGRhdGE0JGVkdWMuU1EwMTYuLCBwMTc9IGRhdGE0JGVkdWMuU1EwMTcuLCBwMTg9IGRhdGE0JGVkdWMuU1EwMTguLCBwMTk9IGRhdGE0JGVkdWMuU1EwMTkuLCBwMjA9IGRhdGE0JGVkdWMuU1EwMjAuKQ0KDQojZHVyYXRpb24gDQpkZl9kdXJhdGlvbiA8LSBkYXRhLmZyYW1lKHAxID0gZGF0YTQkZHV1ci5TUTAwMS4scDIgPSBkYXRhNCRkdXVyLlNRMDAyLixwMyA9IGRhdGE0JGR1dXIuU1EwMDMuLHA0ID0gZGF0YTQkZHV1ci5TUTAwNC4scDUgPSBkYXRhNCRkdXVyLlNRMDA1LixwNiA9IGRhdGE0JGR1dXIuU1EwMDYuLHA3ID0gZGF0YTQkZHV1ci5TUTAwNy4scDggPSBkYXRhNCRkdXVyLlNRMDA4LixwOSA9IGRhdGE0JGR1dXIuU1EwMDkuLHAxMD0gZGF0YTQkZHV1ci5TUTAxMC4scDExPSBkYXRhNCRkdXVyLlNRMDExLixwMTI9IGRhdGE0JGR1dXIuU1EwMTIuLHAxMz0gZGF0YTQkZHV1ci5TUTAxMy4scDE0PSBkYXRhNCRkdXVyLlNRMDE0LixwMTU9IGRhdGE0JGR1dXIuU1EwMTUuLHAxNj0gZGF0YTQkZHV1ci5TUTAxNi4scDE3PSBkYXRhNCRkdXVyLlNRMDE3LixwMTg9IGRhdGE0JGR1dXIuU1EwMTguLHAxOT0gZGF0YTQkZHV1ci5TUTAxOS4scDIwPSBkYXRhNCRkdXVyLlNRMDIwLikNCg0KI3Byb3hpbWl0eQ0KZGZfcHJveGltaXR5IDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRwcm94LlNRMDAxLixwMiA9IGRhdGE0JHByb3guU1EwMDIuLHAzID0gZGF0YTQkcHJveC5TUTAwMy4scDQgPSBkYXRhNCRwcm94LlNRMDA0LixwNSA9IGRhdGE0JHByb3guU1EwMDUuLHA2ID0gZGF0YTQkcHJveC5TUTAwNi4scDcgPSBkYXRhNCRwcm94LlNRMDA3LixwOCA9IGRhdGE0JHByb3guU1EwMDguLCBwOSA9IGRhdGE0JHByb3guU1EwMDkuLHAxMD0gZGF0YTQkcHJveC5TUTAxMC4sIHAxMT0gZGF0YTQkcHJveC5TUTAxMS4sIHAxMj0gZGF0YTQkcHJveC5TUTAxMi4sIHAxMz0gZGF0YTQkcHJveC5TUTAxMy4sIHAxND0gZGF0YTQkcHJveC5TUTAxNC4sIHAxNT0gZGF0YTQkcHJveC5TUTAxNS4sIHAxNj0gZGF0YTQkcHJveC5TUTAxNi4sIHAxNz0gZGF0YTQkcHJveC5TUTAxNy4sIHAxOD0gZGF0YTQkcHJveC5TUTAxOC4sIHAxOT0gZGF0YTQkcHJveC5TUTAxOS4sIHAyMD0gZGF0YTQkcHJveC5TUTAyMC4pDQoNCiNhbmQgZHluYW1pYw0KI2NvbW11bmljYXRpb24gZnJlcXVlbmN5DQpkZl9mcmVxIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRmcmVxLlNRMDAxLixwMiA9IGRhdGE0JGZyZXEuU1EwMDIuLHAzID0gZGF0YTQkZnJlcS5TUTAwMy4scDQgPSBkYXRhNCRmcmVxLlNRMDA0LixwNSA9IGRhdGE0JGZyZXEuU1EwMDUuLHA2ID0gZGF0YTQkZnJlcS5TUTAwNi4scDcgPSBkYXRhNCRmcmVxLlNRMDA3LixwOCA9IGRhdGE0JGZyZXEuU1EwMDguLCBwOSA9IGRhdGE0JGZyZXEuU1EwMDkuLHAxMD0gZGF0YTQkZnJlcS5TUTAxMC4sIHAxMT0gZGF0YTQkZnJlcS5TUTAxMS4sIHAxMj0gZGF0YTQkZnJlcS5TUTAxMi4sIHAxMz0gZGF0YTQkZnJlcS5TUTAxMy4sIHAxND0gZGF0YTQkZnJlcS5TUTAxNC4sIHAxNT0gZGF0YTQkZnJlcS5TUTAxNS4sIHAxNj0gZGF0YTQkZnJlcS5TUTAxNi4sIHAxNz0gZGF0YTQkZnJlcS5TUTAxNy4sIHAxOD0gZGF0YTQkZnJlcS5TUTAxOC4sIHAxOT0gZGF0YTQkZnJlcS5TUTAxOS4sIHAyMD0gZGF0YTQkZnJlcS5TUTAyMC4pDQoNCiNjbG9zZW5lc3MNCmRmX2Nsb3NlIDwtIGRhdGEuZnJhbWUocDEgPSBkYXRhNCRjbG9zZS5TUTAwMS4scDIgPSBkYXRhNCRjbG9zZS5TUTAwMi4scDMgPSBkYXRhNCRjbG9zZS5TUTAwMy4scDQgPSBkYXRhNCRjbG9zZS5TUTAwNC4scDUgPSBkYXRhNCRjbG9zZS5TUTAwNS4scDYgPSBkYXRhNCRjbG9zZS5TUTAwNi4scDcgPSBkYXRhNCRjbG9zZS5TUTAwNy4scDggPSBkYXRhNCRjbG9zZS5TUTAwOC4sIHA5ID0gZGF0YTQkY2xvc2UuU1EwMDkuLHAxMD0gZGF0YTQkY2xvc2UuU1EwMTAuLCBwMTE9IGRhdGE0JGNsb3NlLlNRMDExLiwgcDEyPSBkYXRhNCRjbG9zZS5TUTAxMi4sIHAxMz0gZGF0YTQkY2xvc2UuU1EwMTMuLCBwMTQ9IGRhdGE0JGNsb3NlLlNRMDE0LiwgcDE1PSBkYXRhNCRjbG9zZS5TUTAxNS4sIHAxNj0gZGF0YTQkY2xvc2UuU1EwMTYuLCBwMTc9IGRhdGE0JGNsb3NlLlNRMDE3LiwgcDE4PSBkYXRhNCRjbG9zZS5TUTAxOC4sIHAxOT0gZGF0YTQkY2xvc2UuU1EwMTkuLCBwMjA9IGRhdGE0JGNsb3NlLlNRMDIwLikNCg0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgDQogIGFsdGVyTFtbaV1dJGFsdGVyX2dlbmRlciA8LSBpZmVsc2UodW5saXN0KGRmX21hbGVzW2ksXSwgdXNlLm5hbWVzPUYpPT0iSmEiLCAwLCBpZmVsc2UodW5saXN0KGRmX21hbGVzW2ksXSwgdXNlLm5hbWVzPUYpPT0iTmVlIiwgMSwgTkEpKQ0KICANCiAgYWx0ZXJMW1tpXV0kYWx0ZXJfYWdlIDwtIA0KICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iSm9uZ2VyIGRhbiAxOCBqYWFyIiwgMTYsICM/Pz8NCiAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIxOCB0b3QgMjEgamFhciIsIDIwLA0KICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIyMiB0b3QgMjUgamFhciIsIDIzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfYWdlW2ksXSwgdXNlLm5hbWVzPUYpPT0iMjYgdG90IDMwIGphYXIiLCAyOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSIzMSB0b3QgNDAgamFhciIsIDM1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJPdWRlciBkYW4gNDAgamFhciIsIDQ1LCAjPz8/DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9Rik9PSJXZWV0IGlrIG5pZXQiLCBOQSwgIyBpIGRvbid0IGtub3cgPSBtaXNzaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9hZ2VbaSxdLCB1c2UubmFtZXM9RikpKSkpKSkpDQogIGFsdGVyTFtbaV1dJGtpbiA8LSBpZmVsc2UodW5saXN0KGRmX2tpbltpLF0sIHVzZS5uYW1lcz1GKT09IkphIiwgMSwgaWZlbHNlKHVubGlzdChkZl9raW5baSxdLCB1c2UubmFtZXM9Rik9PSJOZWUiLCAwLCAiIikpDQogIA0KICBhbHRlckxbW2ldXSRhbHRlcl9lZHVjIDwtIGlmZWxzZSh1bmxpc3QoZGZfZWR1Y1tpLF0sdXNlLm5hbWVzPUYpPT0ibGFnZXJlIHNjaG9vbCIsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJ2bWJvLCBtYXZvIiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJtYm8iLCAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09Imhhdm8iLCA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09InZ3byAvIGd5bW5hc2l1bSIsIDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9lZHVjW2ksXSx1c2UubmFtZXM9Rik9PSJoYm8iLCA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2VkdWNbaSxdLHVzZS5uYW1lcz1GKT09InVuaXZlcnNpdGVpdCIsIDcsIE5BKSkpKSkpKSANCiAgDQogIGFsdGVyTFtbaV1dJHByb3hpbWl0eSA8LSBpZmVsc2UodW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sIHVzZS5uYW1lcz1GQUxTRSkgPT0gIkluIGhldHplbGZkZSBodWlzIiwgInJvb21tYXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sIHVzZS5uYW1lcyA9IEZBTFNFKSA9PSAiSW4gZGV6ZWxmZGUgYnV1cnQiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdChkZl9wcm94aW1pdHlbaSxdLHVzZS5uYW1lcz1GKT09IkluIGRlemVsZmRlIHN0cmFhdCIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGRmX3Byb3hpbWl0eVtpLF0sdXNlLm5hbWVzPUYpPT0iSW4gZGV6ZWxmZGUgZ2VtZWVudGUiLCAiY2xvc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9wcm94aW1pdHlbaSxdLCB1c2UubmFtZXMgPSBGQUxTRSkgPT0gIkluIGhldHplbGZkZSBsYW5kIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZGZfcHJveGltaXR5W2ksXSwgdXNlLm5hbWVzID0gRkFMU0UpID09ICJJbiBlZW4gYW5kZXIgbGFuZCIsImZhciIsIE5BKSkpDQogIA0KICANCiAgDQogIGFsdGVyTFtbaV1dJGR1cmF0aW9uIDwtIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09Ik1pbmRlciBkYW4gMSBqYWFyIiwgMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9kdXJhdGlvbltpLF0sdXNlLm5hbWVzPUYpPT0iMSB0b3QgMyBqYWFyIiwgMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9kdXJhdGlvbltpLF0sdXNlLm5hbWVzPUYpPT0iNCB0b3QgOCBqYWFyIiwgNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZHVyYXRpb25baSxdLHVzZS5uYW1lcz1GKT09IjkgdG90IDE1IGphYXIiLCAxMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2R1cmF0aW9uW2ksXSx1c2UubmFtZXM9Rik9PSJNZWVyIGRhbiAxNSBqYWFyIiwgMTUsTkEgKSkpKSkNCiAgDQogIGFsdGVyTFtbaV1dJGZyZXF1ZW5jeS50MiA8LSBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09IihCaWpuYSkgZWxrZSBkYWciLCA3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iMS0yIGtlZXIgcGVyIHdlZWsiLDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iQWFudGFsIGtlZXIgcGVyIG1hYW5kIiw1LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHVubGlzdChkZl9mcmVxW2ksXSx1c2UubmFtZXM9Rik9PSJPbmcuIDEga2VlciBwZXIgbWFhbmQiLDQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2ZyZXFbaSxdLHVzZS5uYW1lcz1GKT09IkFhbnRhbCBrZWVyIHBlciBqYWFyIiwzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iT25nLiAxIGtlZXIgcGVyIGphYXIiLDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh1bmxpc3QoZGZfZnJlcVtpLF0sdXNlLm5hbWVzPUYpPT0iTm9vaXQiLDEsIE5BICkpKSkpKSkNCiAgYWx0ZXJMW1tpXV0kY2xvc2VuZXNzLnQyIDwtIGlmZWxzZSh1bmxpc3QoZGZfY2xvc2VbaSxdLHVzZS5uYW1lcz1GKT09Ik5pZXQgaGVjaHQiLCAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJFbmlnc3ppbnMgaGVjaHQiLCAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJIZWNodCIsIDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodW5saXN0KGRmX2Nsb3NlW2ksXSx1c2UubmFtZXM9Rik9PSJIZWVsIGVyZyBoZWNodCIsIDQsIE5BICkpKSkNCn0NCg0KI21hdGNoIGVnby1jb3ZhcnMgKGJhc2VkIG9uICdkZicuKSANCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dJGVnb19nZW5kZXIgPC0gZGYkZWdvX2dlbmRlclt3aGljaChkZiRlZ289PTEpXVsxXQ0KICBhbHRlckxbW2ldXSRlZ29fYWdlIDwtIGRmJGVnb19hZ2Vbd2hpY2goZGYkZWdvPT0xKV1bMV0NCiAgYWx0ZXJMW1tpXV0kZWdvX2VkdWMgPC0gZGYkZWdvX2VkdWNbd2hpY2goZGYkZWdvPT0xKV1bMV0NCn0NCg0KI3NhbWVuZXNzDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgIHsgIyBmb3IgZWdvIGkNCiAgIyBnZXQgYXR0cmlidXRlcyBvZiBlZ28NCiAgYWdlaSA8LSBhbHRlckxbW2ldXSRlZ29fYWdlWzFdDQogIGdlbmRlcmkgPC0gYWx0ZXJMW1tpXV0kZWdvX2dlbmRlclsxXQ0KICBlZGkgPC0gYWx0ZXJMW1tpXV0kZWdvX2VkdWNbMV0NCiAgDQogIGZvciAoaiBpbiAxOm1heChhbHRlckxbW2ldXSRhbHRlcmlkKSkgeyAjIGZvciBhbHRlciBqDQogICAgIyBjYWxjdWxhdGUgInNhbWUgZ2VuZGVyIiAoMC8xKQ0KICAgIGdlbmRlcmogPC0gYXMubnVtZXJpYyhhbHRlckxbW2ldXSRhbHRlcl9nZW5kZXJbal0pICMgZ2V0IGFsdGVyIGogZ2VuZGVyDQogICAgc2FtZSA8LSBpZmVsc2UoZ2VuZGVyaT09Z2VuZGVyaiwgMSwgMCkNCiAgICBhbHRlckxbW2ldXSRzYW1lX2dlbmRlclt3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gc2FtZQ0KICAgIA0KICAgICNzYW1lIGVkdWNhdGlvbg0KICAgIGVkdWogPC0gYWx0ZXJMW1tpXV0kYWx0ZXJfZWR1Y1tqXQ0KICAgIHNhbWUgPC0gaWZlbHNlKGVkdWo9PWVkaSwgMSwgMCkNCiAgICBhbHRlckxbW2ldXSRzaW1fZWR1Y1t3aGljaChhbHRlckxbW2ldXSRhbHRlcmlkPT1qKV0gPC0gc2FtZQ0KICAgIA0KICAgICMgY2FsY3VsYXRlIHNpbWlsYXJpdHkgZm9yIGFnZSBhcyB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFsdGVyIGFuZCBlZ28gdmFsdWUNCiAgICAjZ2V0IGFsdGVyIGogYXR0cmlidXRlcw0KICAgIGFnZWogPC0gYXMubnVtZXJpYyhhbHRlckxbW2ldXSRhbHRlcl9hZ2Vbal0pDQogICAgI2RpZmZlcmVuY2Ugc2NvcmUNCiAgICBkaWZhZ2UgPC0gYWJzKGFnZWkgLSBhZ2VqKQ0KICAgIA0KICAgICMgc28gaGlnaGVyIHZhbHVlcyByZXByZXNlbnQgKmxlc3MqIHNpbWlsYXJpdHkNCiAgICBpZiggIWlzLm5hIChhZ2VqKSApIHsgIyBhZ2Ugc2ltaWxhcml0eSBvbmx5IGNhbGN1bGFibGUgaWYgel9qIGlzIGtub3duIQ0KICAgICAgICBhbHRlckxbW2ldXSRkaWZfYWdlW3doaWNoKGFsdGVyTFtbaV1dJGFsdGVyaWQ9PWopXSA8LSBkaWZhZ2UNCiAgICAgIH0gZWxzZSB7IGFsdGVyTFtbaV1dJGRpZl9hZ2Vbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09aildIDwtIE5BfQ0KICB9DQp9DQoNCiNpbiB3aGljaCBlZ29uZXRzIGRpZCBhbHRlc3IgYXBwZWFyIGF0IHQyPw0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpICB7IA0KICBmb3IgKGogaW4gMTpucm93KGFsdGVyTFtbaV1dKSkgew0KICAgIA0KICAgICNnZXQgbmFtZShzKSBvZiBqDQogICAgYWx0ZXIgPC0gdW5saXN0KGFsdGVyTFtbaV1dW2osYyg1OjgpXSwgdXNlLm5hbWVzPUZBTFNFKQ0KICAgIGFsdGVyIDwtIGFsdGVyWyFpcy5uYShhbHRlcildICMgZXhjbHVkZSBOQXMNCiAgICANCiAgICAjZmluZCBvdXQgYWx0ZXIgaiBhcHBlYXJzIGluIHRoZSA0IGVnb25ldHMNCiAgICBjZG4gPC0gYWx0ZXIgJWluJSBuZXQxW2ksXQ0KICAgIHN0dWR5IDwtIGFsdGVyICVpbiUgbmV0MltpLF0NCiAgICBiZmYgPC0gYWx0ZXIgJWluJSBuZXQzW2ksXQ0KICAgIGNzbiA8LSBhbHRlciAlaW4lIG5ldDRbaSxdDQogICAgDQogICAgIyBhbmQgaWYgc28sIGdpdmUgYWx0ZXIgaiBzY29yZSAxIG9uIGluZGljYXRvcnM7IDAgb3RoZXJ3aXNlDQogICAgYWx0ZXJMW1tpXV0kY2RuMltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJHN0dWR5MltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgc3R1ZHksIDEsIDApDQogICAgYWx0ZXJMW1tpXV0kYmZmMltqXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgYmZmLCAxLCAwKQ0KICAgIGFsdGVyTFtbaV1dJGNzbjJbal0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgfQ0KfQ0KDQojY2FsY3VsYXRlIG11bHRpcGxleGl0eSBhcyBhbiBhbHRlci90aWUgYXR0cmlidXRlIChpLmUuLCBudW1iZXIgb2YgKmFkZGl0aW9uYWwqIG5ldHdvcmtzIGogYXBwZWFyZWQgaW4pDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgIHsNCiAgZm9yIChqIGluIDE6bnJvdyhhbHRlckxbW2ldXSkpIHsNCiAgICBhbHRlckxbW2ldXSRtdWx0aXBsZXgudDJbal0gPC0gcm93U3VtcyhhbHRlckxbW2ldXVtqLGMoMjQ6MjcpXSkgLSAxICNtaW51cyBvbmUgdG8gcmVhY2ggYSBtZWFuaW5nZnVsIGludGVyY2VwdA0KICB9DQp9DQoNCiNmb3Igc3BvcnRzIHBhcnRuZXJzLCBob3cgZnJlcXVlbnQgdGhleSBwYXJ0aWNpcGF0ZSBhbmQgaG93IGNvbXBldGVudCB0aGV5IGFyZSBpbiB0aGUgc3BvcnQgdGhleSBkbyB3aXRoIGVnby4NCmRmX2FsdGZyZXEgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGFsdGZyZXExLCBwMiA9IGRhdGE0JGFsdGZyZXEyLCBwMyA9IGRhdGE0JGFsdGZyZXEzLCBwNCA9IGRhdGE0JGFsdGZyZXE0LCBwNSA9IGRhdGE0JGFsdGZyZXE1KQ0KZGZfYWx0Z3JhZGUgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE0JGdyYWRlMSwgcDIgPSBkYXRhNCRncmFkZTIsIHAzID0gZGF0YTQkZ3JhZGUzLCBwNCA9IGRhdGE0JGdyYWRlNCwgcDUgPSBkYXRhNCRncmFkZTUpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7IA0KICBhbHRlckxbW2ldXSRhbHRlcl9mcmVxWzE2OjIwXSA8LSB1bmxpc3QoZGZfYWx0ZnJlcVtpLF0sIHVzZS5uYW1lcz1UUlVFKQ0KICBhbHRlckxbW2ldXSRhbHRlcl9ncmFkZVsxNjoyMF0gPC0gdW5saXN0KGRmX2FsdGdyYWRlW2ksXSwgdXNlLm5hbWVzPVRSVUUpDQp9DQoNCiMgaSBhbHNvIHdhbnQgdG8ga25vdyBlZ28ncyBzcG9ydHMgZnJlcXVlbmN5IGFuZCBza2lsbHMNCiMgdWx0aW1hdGVseSwgaSB3YW50IHRvIG1ha2UgYSBkeWFkaWMgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgc2tpbGwgbGV2ZWwgKGRpZmZlcmVuY2UpIG9mIGVnbyBhbmQgYWx0ZXIsIGluICp0aGUgc3BlY2lmaWMgc3BvcnRzIHRoYXQgdGhleSBkbyB0b2dldGhlcioNCiMgZm9yIG5vdywgaSB3aWxsIHB1dCBlZ28ncyBzcG9ydHMgZnJlcXVlbmN5IGFuZCBza2lsbCwgcGVyIHNwb3J0LCBpbiBhIGRhdGFmcmFtZS4gDQoNCiNpbiB3YXZlIDIsIGEgZGlmZmVyZW50IGFwcHJvYWNoIHRvIG1lYXN1cmluZyBlZ28gc3BvcnQgcGFydGljaXBhdGlvbg0KIzEuIHdlIGFza2VkIHJlc3BvbmRlbnRzIGhvdyBmcmVxdWVudGx5IHRoZXkgZW5nYWdlZCBpbiB0aGUgc3BvcnRzIGFjdGl2aXRpZXMgdGhleSByZXBvcnRlZCAqYXQgdzEqIChzMWEpDQojMi4gdGhleSBjb3VsZCBwcm92aWRlIGFuIGFkZGl0aW9uYWwgMyBzcG9ydHMgdGhleSBoYWQgZG9uZSBpbiB0aGUgcGFzdCBzZW1lbnN0ZXINCiN0aHVzIGluIHRvdGFsIG1heGltdW0gb2YgMjAgc3BvcnRzIHR5cGVzICgxNCBmcm9tIHcxICsgMyBvdGhlcnMgZnJvbSB3MSArIDMgbmV3IGluIHcyKQ0KDQplZ29zIDwtIGRhdGE0ICU+JQ0KICBzZWxlY3QoUzFhLlNRMDAxLjpTMWEuU1EwMTcuLCBTMi5TUTAwMS46UzIuU1EwMDMuLCBTMmIuU1EwMDEuOlMyYi5TUTAyMC4pDQoNCmVnb3NbZWdvcyA9PSAiTmlldCJdIDwtIDANCmVnb3NbZWdvcyA9PSAiTWluZGVyIGRhbiAxIGtlZXIgcGVyIG1hYW5kIl0gPC0gMC4xMjUNCmVnb3NbZWdvcyA9PSAiMSBrZWVyIHBlciBtYWFuZCIgXSA8LSAwLjI1DQplZ29zW2Vnb3MgPT0gIjIga2VlciBwZXIgbWFhbmQiIF0gPC0gMC41DQplZ29zW2Vnb3MgPT0gIjEga2VlciBwZXIgd2VlayIgXSA8LSAxDQoNCiNpbiBjYXNlcyB3aGVyZSBlZ28gcGFydGljaXBhdGVkIG1vcmUgdGhhbiBvbmNlIGEgd2VlaywgZ2V0IHRoZSBhbnN3ZXIgdG8gdGhlIHF1ZXN0aW5vIGhvdyBvZnRlbiBwZXIgd2VlayBoZS9zaGUgcGFydGljaXBhdGVkDQpmb3IgKGkgaW4gMToyMCkgew0KICBlZ29zWyxpXSA8LSBpZmVsc2UoZWdvc1ssaV0gPT0gIlZha2VyIGRhbiAxIGtlZXIgcGVyIHdlZWsiLCBnc3ViKCJcXEQiLCAiIiwgZWdvc1ssMjAraV0pLCBlZ29zWyxpXSkNCn0NCmVnb3NbLDE6MjBdIC0+IGVnb3MNCmVnb3MgPC0gbXV0YXRlX2FsbChlZ29zLCBhcy5udW1lcmljKQ0KDQojc2tpbGwNCmVnb3MyIDwtIGRhdGE0ICU+JQ0KICBzZWxlY3QoUzJ4LlNRMDAxLjogUzJ4LlNRMDIwLikNCg0KI2ZpcnN0LCBhbHNvIHNhdmUgZWdvJ3MgKHdlZWtseSkgc3BvcnRzIGZyZXF1ZW5jeSAoYXZlcmFnZWQgb3ZlciBzcG9ydHMgdHlwZXMpDQojYW5kIGVnbydzIGF2ZXJhZ2UvdG90YWwgc2tpbGwgKG92ZXIgc3BvcnRzIHR5cGVzKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgYWx0ZXJMW1tpXV0kZWdvX21lYW5mcmVxIDwtIGlmZWxzZSggbGVuZ3RoKHdoaWNoKGlzLm5hKGVnb3NbaSxdKSkpIDwgMjAsIHJvd01lYW5zKGVnb3NbaSxdLCBuYS5ybT1UUlVFKSwgMCkgI3Rob3NlIHdpdGhvdXQgYSBzcG9ydHMgZ2V0IGEgMA0KICBhbHRlckxbW2ldXSRlZ29fbWVhbnNraWxsIDwtIHJvd01lYW5zKGVnb3MyW2ksXSwgbmEucm0gPSBUUlVFKQ0KICAjYW5kIGFsc28gc2F2ZSBudW1iZXIgb2Ygc3BvcnRzDQogIGFsdGVyTFtbaV1dJGVnb19uc3BvcnQgPC0gbGVuZ3RoKHdoaWNoKCFpcy5uYShlZ29zW2ksXSkpKQ0KfQ0KDQojbm93IGdldCBmb3IgZWFjaCBzcG9ydHMgcGFydG5lciBpbiB0aGUgbGlzdCBvZiBhbHRlcnMsIHRoZSBzcG9ydHMgZWdvIGRvZXMgd2l0aCB0aGVtDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbw0KDQogIGFsdGVyTFtbaV1dJHNwb3J0dG9nZXRoZXJbMTY6MjBdIDwtDQogICAgDQogICAgYyggaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGE0W2ksXSAlPiUNCiAgc2VsZWN0KHNhbWVuQ1NOMS5TUTAwMS46c2FtZW5DU04xLlNRMDIwLikgPT0gIkphIiApKSA+IDAsDQogIHdoaWNoKGRhdGE0W2ksXSAlPiUgc2VsZWN0KHNhbWVuQ1NOMS5TUTAwMS46c2FtZW5DU04xLlNRMDIwLikgPT0gIkphIiApLCBOQSksDQogIA0KICBpZmVsc2UoIGxlbmd0aCh3aGljaCggZGF0YTRbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU04yLlNRMDAxLjpzYW1lbkNTTjIuU1EwMjAuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YTRbaSxdICU+JSBzZWxlY3Qoc2FtZW5DU04yLlNRMDAxLjpzYW1lbkNTTjIuU1EwMjAuKSA9PSAiSmEiICksIE5BKSwNCiAgDQogIGlmZWxzZSggbGVuZ3RoKHdoaWNoKCBkYXRhNFtpLF0gJT4lDQogIHNlbGVjdChzYW1lbkNTTjMuU1EwMDEuOnNhbWVuQ1NOMy5TUTAyMC4pID09ICJKYSIgKSkgPiAwLA0KICB3aGljaChkYXRhNFtpLF0gJT4lIHNlbGVjdChzYW1lbkNTTjMuU1EwMDEuOnNhbWVuQ1NOMy5TUTAyMC4pID09ICJKYSIgKSwgTkEpLA0KICANCiAgaWZlbHNlKCBsZW5ndGgod2hpY2goIGRhdGE0W2ksXSAlPiUNCiAgc2VsZWN0KHNhbWVuQ1NONC5TUTAwMS46c2FtZW5DU040LlNRMDIwLikgPT0gIkphIiApKSA+IDAsDQogIHdoaWNoKGRhdGE0W2ksXSAlPiUgc2VsZWN0KHNhbWVuQ1NONC5TUTAwMS46c2FtZW5DU040LlNRMDIwLikgPT0gIkphIiApLCBOQSksDQogIA0KICBpZmVsc2UoIGxlbmd0aCh3aGljaCggZGF0YTRbaSxdICU+JQ0KICBzZWxlY3Qoc2FtZW5DU041LlNRMDAxLjpzYW1lbkNTTjUuU1EwMjAuKSA9PSAiSmEiICkpID4gMCwNCiAgd2hpY2goZGF0YTRbaSxdICU+JSBzZWxlY3Qoc2FtZW5DU041LlNRMDAxLjpzYW1lbkNTTjUuU1EwMjAuKSA9PSAiSmEiICksIE5BKSkNCg0KfQ0KDQojbWF0Y2ggc3BvcnRzIGF0dHJpYnV0ZXMNCiN0aGF0IGlzLCBmcm9tIHNwb3J0cyBwYXJ0bmVycyAocDE2LXAyMCkgdG8gb3RoZXIgYWx0ZXJzIHdobyBjb3JyZXNwb25kIHRvIHNwb3J0cyBwYXJ0bmVycyAobmFtZTQpDQoNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGZvciAoaiBpbiB3aGljaCghaXMubmEoYWx0ZXJMW1tpXV0kbmFtZTQpKSkgew0KICAgIGFsdGVyTFtbaV1dW2osIGMoImFsdGVyX2ZyZXEiLCAiYWx0ZXJfZ3JhZGUiLCAic3BvcnR0b2dldGhlciIpXSA8LSBhbHRlckxbW2ldXVt3aGljaChhbHRlckxbW2ldXSRuYW1lMSA9PSBhbHRlckxbW2ldXSRuYW1lNFtqXSksIGMoImFsdGVyX2ZyZXEiLCAiYWx0ZXJfZ3JhZGUiLCAic3BvcnR0b2dldGhlciIpXQ0KICB9DQp9DQoNCiNhdHRhY2ggZWdvX2dyYWRlLCBlZ28ncyBzZWxmLWFzZXNzZWQgc2tpbGwgZm9yIHRoZSBzcG9ydHMgaGUvc2hlIGRvZXMgdG9nZXRoZXIgd2l0aCBhbHRlcg0KI2FuZCBlZ29fRnJlcSwgZWdvJ3Mgc3BvcnRzIGZyZXF1ZW5jeSBpbiB0aGlzIHNwb3J0cyBhY3Rpdml0eQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsgI2ZvciBlZ28gaQ0KICBhbHRlckxbW2ldXSRlZ29fZ3JhZGUgPC0gTkENCiAgYWx0ZXJMW1tpXV0kZWdvX2ZyZXEgPC0gTkENCiAgDQogIGZvciAoaiBpbiB3aGljaCghaXMubmEoYWx0ZXJMW1tpXV0kc3BvcnR0b2dldGhlcikpKSB7ICNmb3IgYWx0ZXJzIHdpdGggYSB2YWx1ZSBvbiB0aGUgJ3Nwb3J0dG9nZXRoZXInIGF0dHJpYnV0ZSAoaS5lLiwgd2hvIGJlbG9uZyB0byBzcG9ydG5ldHdvcmspDQogICAgDQogICAgI2F0dGFjaCBlZ28ncyBzZWxmLWFzc2Vzc2VkIHNwb3J0cyBza2lsbCBmb3IgdGhlIHNwb3J0cyBoZS9zaGUgZGlkIHdpdGggYWx0ZXIgd2l0aCBhbHRlcmlkIGoNCiAgICBhbHRlckxbW2ldXSRlZ29fZ3JhZGVbYWx0ZXJMW1tpXV0kYWx0ZXJpZCA9PSBqXSA8LSBlZ29zMltpLCBhbHRlckxbW2ldXSRzcG9ydHRvZ2V0aGVyW2pdXQ0KICAgIA0KICAgICNhbmQgZWdvJ3Mgc2VsZi1hc3Nlc3NlZCBzcG9ydHMgZnJlcXVlbmN5IGZvciB0aGlzIHNwb3J0cyB0eXBlDQogICAgYWx0ZXJMW1tpXV0kZWdvX2ZyZXFbYWx0ZXJMW1tpXV0kYWx0ZXJpZCA9PSBqXSA8LSBlZ29zW2ksIGFsdGVyTFtbaV1dJHNwb3J0dG9nZXRoZXJbal1dDQogICAgDQogIH0NCn0NCg0KI3Nwb3J0cyBhY3Rpdml0aWVzIHdlcmUgbm90IG1lYXN1cmVkIGluIHczLi4uDQojc28gdW5rbm93biB3aGV0aGVyIGVnbyB3YXMgc3RpbGwgYWN0aXZlIGluIHRoZSBzcG9ydHMgdHlwZSBoZS9zaGUgZGlkIHdpdGggYWx0ZXIgYXQgdDMuDQphbHRlckwgPC0gbGFwcGx5KGFsdGVyTCwgZnVuY3Rpb24oeCkgew0KICB4JGVnb19xdWl0IDwtIE5BDQogIHJldHVybih4KX0pDQoNCiNjb250ZXh0IGluIHdoaWNoIGVnbyBkaWQgc3BvcnRzIGFjdGl2aXRpZXMgaXMgbm90IG1lYXN1cmVkIGluIHcyLiBpIGFzc3VtZSB0aGF0LCBmb3IgdGhlIHNwb3J0cyBhY3Rpdml0aWVzIGVnbyBjb250aW51ZWQgaW50byB3MiwgdGhlIHNldHRpbmcgKGUuZy4sIGNsdWItb3JnYW5pemVkKSByZW1haW5zIHN0YWJsZS4NCg0KDQojIGkgZmlsdGVyIG91dCB0aGUgbWFpbnRhaW5lZCBhbHRlcnMNCiMgYnkgZXhjbHVkaW5nIGFsdGVycyB3aXRoIGVtcHR5IHN0cmluZ3MgZm9yIGdlbmRlciBhdHRyaWJ1dGUNCmZvciAoIGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgew0KICBhbHRlckxbW2ldXSA8LSBhbHRlckxbW2ldXVt3aGljaCghaXMubmEoYWx0ZXJMW1tpXV0kYWx0ZXJfZ2VuZGVyKSAmIGFsdGVyTFtbaV1dJGFsdGVyX2dlbmRlciE9IiIpLF0NCiAgDQogICAgaWYgKG5yb3coYWx0ZXJMW1tpXV0pPjApeyAjaWYgbm8uIG9mIGNyZWF0ZWQgYWx0ZXJzID4gMA0KICAgICAgIyByZXBsYWNlIHRoZSBhbHRlciBpZDogMSA6IG5vLiB1bmlxdWUgYWx0ZXJzDQogICAgICBhbHRlckxbW2ldXSRhbHRlcmlkIDwtIDE6bnJvdyhhbHRlckxbW2ldXSkNCiAgfQ0KfQ0KDQojYmFzZWQgb24gdGhpcywgaSBtYWtlIGEgbG9uZyBkYXRhZnJhbWUgd2l0aCBhbHRlcnMgbmVzdGVkIGluIGVnby4NCiNmaXJzdCwgYWRkIGFuIGVnb19pZA0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgaWYobnJvdyhhbHRlckxbW2ldXT4wKSkgew0KICAgIGFsdGVyTFtbaV1dJGVnbyA8LSBpDQogICAgYWx0ZXJMW1tpXV0kcmVzcG5yIDwtIGRhdGEkcmVzcG5yW2ldDQogICAgfQ0KfQ0KDQojY29tYmluZSB1c2luZyByYmluZA0KZGYgPC0gZG8uY2FsbChyYmluZCxhbHRlckwpDQoNCiNhZGQgbmV0d29yayB2YXJpYWJsZXM7IG1hdGNoIGJhc2VkIG9uIGRmX21haW50YWluZWQNCmRmJGNkbi5zaXplMiA8LSBkZiRzdHVkeS5zaXplMiA8LSBkZiRiZmYuc2l6ZTIgPC0gZGYkY3NuLnNpemUyIDwtIE5BDQpkZiRjZG4uZGVuc2l0eTIgPC0gZGYkc3R1ZHkuZGVuc2l0eTIgPC0gZGYkYmZmLmRlbnNpdHkyIDwtIGRmJGNzbi5kZW5zaXR5MiA8LSBOQQ0KDQpmb3IgKCBpIGluIHVuaXF1ZShkZiRlZ28pKSB7IA0KICBkZiRjZG4uc2l6ZTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGNkbi5zaXplMlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCiAgZGYkc3R1ZHkuc2l6ZTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJHN0dWR5LnNpemUyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRiZmYuc2l6ZTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGJmZi5zaXplMlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCiAgZGYkY3NuLnNpemUyW3doaWNoKGRmJGVnbyA9PSBpKV0gPC0gZGZfbWFpbnRhaW5lZCRjc24uc2l6ZTJbd2hpY2goZGZfbWFpbnRhaW5lZCRlZ28gPT0gaSldWzFdDQogIA0KICBkZiRjZG4uZGVuc2l0eTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGNkbi5kZW5zaXR5Mlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCiAgZGYkc3R1ZHkuZGVuc2l0eTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJHN0dWR5LmRlbnNpdHkyW3doaWNoKGRmX21haW50YWluZWQkZWdvID09IGkpXVsxXQ0KICBkZiRiZmYuZGVuc2l0eTJbd2hpY2goZGYkZWdvID09IGkpXSA8LSBkZl9tYWludGFpbmVkJGJmZi5kZW5zaXR5Mlt3aGljaChkZl9tYWludGFpbmVkJGVnbyA9PSBpKV1bMV0NCiAgZGYkY3NuLmRlbnNpdHkyW3doaWNoKGRmJGVnbyA9PSBpKV0gPC0gZGZfbWFpbnRhaW5lZCRjc24uZGVuc2l0eTJbd2hpY2goZGZfbWFpbnRhaW5lZCRlZ28gPT0gaSldWzFdDQp9DQoNCmRmJHN0YXR1c1cyIDwtICJDcmVhdGVkIg0KZGZfY3JlYXRlZCA8LSBkZg0KDQojc29tZSBlbXB0eSBuYW1lIGdlbmVyYXRvciBlbnRyaWVzIHdlcmUgc2F2ZWQsIGR1ZSB0byBhIGJ1Zy4NCiNlbXB0aWVzIDwtIHdoaWNoKGlzLm5hKGRmJG5hbWUxKSkgI2RvbmUgdXNpbmcgdGhlIGRhdGEgd2l0aCBuYW1lcyBpbnN0ZWFkIG9mIGFsdGVyX2lkcw0KI3NhdmUoZW1wdGllcyxmaWxlPSIuL2RhdGEvZW1wdHlfZW50cmllc19pbmRpY2F0b3JzLlJkYSIpDQplbXB0aWVzIDwtIGZsb2FkKCIuL2RhdGEgc2hhcmVkL2VtcHR5X2VudHJpZXNfaW5kaWNhdG9ycy5SZGEiKQ0KDQpkZl9jcmVhdGVkIDwtIGRmX2NyZWF0ZWRbLWVtcHRpZXMsXQ0KYGBgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojYmluZCB0aGVtIHRvZ2V0aGVyDQpkZl9hbHRlcnMgPC0gZHBseXI6OmJpbmRfcm93cyhkZl9tYWludGFpbmVkLGRmX2NyZWF0ZWQpDQoNCiNhcnJhbmdlLCBieSBlZ28sIGFuZCBzdGF0dXMNCmRmX2FsdGVycyA8LSBkZl9hbHRlcnMgJT4lIGFycmFuZ2UoZWdvLCBmYWN0b3Ioc3RhdHVzVzIsIGxldmVscz1jKCJNYWludGFpbmVkIiwgIkNyZWF0ZWQiLCAiRHJvcHBlZCIpKSkNCnJvdy5uYW1lcyhkZl9hbHRlcnMpIDwtIDE6bnJvdyhkZl9hbHRlcnMpDQpgYGAgDQoNCjxicj4NCg0KIyMgd2F2ZSAyIC0tPiB3YXZlIDMNCg0KTGV0J3Mgc2VlIHdoZXRoZXIgd2F2ZSAyIGFsdGVycyB3ZXJlIG1haW50YWluZWQgaW50byB3YXZlIDMuIA0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFfQ0KI2ZpcnN0IHN1YnNldCBmcm9tIGBkZl9hbHRlcnNgIHcyLW1haW50YWluZWQgb3IgdzItY3JlYXRlZCBhbHRlcnMNCnRlc3QgPC0gZGZfYWx0ZXJzW3doaWNoKGRmX2FsdGVycyRzdGF0dXNXMj09Ik1haW50YWluZWQiIHwgZGZfYWx0ZXJzJHN0YXR1c1cyPT0iQ3JlYXRlZCIpLCBdDQoNCiNtYWtlIHZhcmlhYmxlIGluZGljYXRpbmcgd2hldGhlciBhbHRlciB3YXMgKHJlLSluYW1lZCBpbiB3Mw0KdGVzdCRzdXJ2aXZlVzMgPC0gTkENCg0KI3NvbWUgYWx0ZXJzIGhhZCBubyAnY2hhbmNlJyB0byByZWFwcGVhciwgYmVjYXVzZSBlZ28gZGlkIGZpbGwgb3V0IHRoZSBsYXN0IHN1cnZleQ0KdGVzdCR3M3BhcnRpY2lwYXRpb24gPC0gTkENCmZvciAoaSBpbiB1bmlxdWUodGVzdCRyZXNwbnIpKSB7DQogIHRlc3QkdzNwYXJ0aWNpcGF0aW9uW3doaWNoKHRlc3QkcmVzcG5yPT1pKV0gPC0gaWZlbHNlKGkgJWluJSBkYXRhNSRyZXNwbnIsMSwwKQ0KfQ0KDQojZml4IGFsdGVyIGlkcywgMTpODQpmb3IgKGkgaW4gdW5pcXVlKHRlc3QkcmVzcG5yKSkgew0KICB0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRyZXNwbnI9PWkpXSA8LSAxOmxlbmd0aCh0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRyZXNwbnI9PWkpXSkNCn0NCg0KI3N1YnNldCB3YXZlIDUgbWF0Y2hpbmcgbWF0cml4IChtYXRjaGluZyB3YXZlIDMgYWx0ZXJzIHRvIHdhdmUgMiBhbHRlcnMgLSBlaXRoZXIgY3JlYXRlZCBvciBtYWludGFpbmVkICkNCiNhbHNvIGFkZCByZXNwbnINCncxdzIgPC0gZGF0YTVbLGMoNDg2Ojg4NSwgbmNvbChkYXRhNSkpXQ0KDQpmb3IgKCBpIGluIHVuaXF1ZSh0ZXN0JHJlc3BucikpIHsgIyBmb3IgYWxsIGVnb3MgKGJvdGggdGhvc2UgdGhhdCBwYXJ0aWNpcGF0ZWQgaW4gdzMsIGFuZCB0aG9zZSB0aGF0IGRpZG50KQ0KICANCiAgICBtYXRjaGluZ0wgPC0gdmVjdG9yKCJsaXN0IiwgMjApICNwcmUtYWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBsZW5ndGggMjAsIHRvIHN0b3JlIG1hdGNoaW5nIG1hdHJpY2VzDQogIHsNCiAgICBtYXRjaGluZ0xbWzFdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwgMToyMF0NCiAgICBtYXRjaGluZ0xbWzJdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwyMTo0MF0NCiAgICBtYXRjaGluZ0xbWzNdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSw0MTo2MF0NCiAgICBtYXRjaGluZ0xbWzRdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSw2MTo4MF0NCiAgICBtYXRjaGluZ0xbWzVdXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSw4MToxMDBdDQogICAgbWF0Y2hpbmdMW1s2XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMTAxOjEyMF0NCiAgICBtYXRjaGluZ0xbWzddXSA8LSB3MXcyW3doaWNoKHcxdzIkcmVzcG5yPT1pKSwxMjE6MTQwXQ0KICAgIG1hdGNoaW5nTFtbOF1dIDwtIHcxdzJbd2hpY2godzF3MiRyZXNwbnI9PWkpLDE0MToxNjBdDQogICAgbWF0Y2hpbmdMW1s5XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMTYxOjE4MF0NCiAgICBtYXRjaGluZ0xbWzEwXV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMTgxOjIwMF0NCiAgICBtYXRjaGluZ0xbWzExXV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMjAxOjIyMF0NCiAgICBtYXRjaGluZ0xbWzEyXV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMjIxOjI0MF0NCiAgICBtYXRjaGluZ0xbWzEzXV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMjQxOjI2MF0NCiAgICBtYXRjaGluZ0xbWzE0XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMjYxOjI4MF0NCiAgICBtYXRjaGluZ0xbWzE1XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMjgxOjMwMF0NCiAgICBtYXRjaGluZ0xbWzE2XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMzAxOjMyMF0NCiAgICBtYXRjaGluZ0xbWzE3XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMzIxOjM0MF0NCiAgICBtYXRjaGluZ0xbWzE4XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMzQxOjM2MF0NCiAgICBtYXRjaGluZ0xbWzE5XV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMzYxOjM4MF0NCiAgICBtYXRjaGluZ0xbWzIwXV0gPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3Bucj09aSksMzgxOjQwMF0NCiAgIH0NCiAgICNmaW5kIHRoZSAncmlnaHQnIG1hdGNoaW5nIG1hdHJpeCBpbiB0aGlzIGxpc3QsIGJ5IHRha2luZyB0aGUgb25lIHRoYXQgY29udGFpbnMgYW5zd2Vycw0KICBpbmQgPC0gTlVMTA0KICBmb3IgKGogaW4gc2VxX2Fsb25nKG1hdGNoaW5nTCkpIHsNCiAgICAjY2hlY2sgYWxvbmcgdGhlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGogaW4gdGhlIG1hdGNoaW5nIG1hdHJpeCBsaXN0IGlmIHRoZXkgYXJlIG5vbi1lbXB0eSBhbmQgbm90IE5BDQogICAgY2hlY2sgPC0gRkFMU0UNCiAgICBmb3IgKGNvbCBpbiBtYXRjaGluZ0xbW2pdXSkgew0KICAgICAgaWYgKCFhbGwoaXMubmEoY29sKSkgJiYgYW55KG5jaGFyKGNvbCkgPiAwKSkgew0KICAgICAgICBjaGVjayA8LSBUUlVFDQogICAgICAgIGJyZWFrICANCiAgICAgIH0NCiAgICAgIH0NCiAgICBpZiAoY2hlY2spIHsNCiAgICAgIGluZCA8LSBqDQogICAgICBicmVhayAgDQogICAgfQ0KICB9DQogIGlmKGxlbmd0aChpbmQpPjApIHsNCiAgICAjIGdldCB0aGUgIG1hdHJpeA0KICAgIG1tIDwtIG1hdGNoaW5nTFtbaW5kXV0NCiAgICAjdW5saXN0IHRoZSBhbnN3ZXJzIGdpdmVuDQogICAgYW5zIDwtIHVubGlzdChtbSwgdXNlLm5hbWVzPUZBTFNFKQ0KICAgICN1c2UgYHN0cmluZ3JgIHRvIGV4dHJhY3QgbnVtYmVycyBpbiB0aGVzZSBhbnN3ZXJzDQogICAgaWQgPC0gdW5saXN0KHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChhbnMsICJcXCg/WzAtOSwuXStcXCk/IikpDQogICAgaWQgPC0gaWRbIWlzLm5hKGlkKV0gI3JlbW92ZSBOQQ0KICAgIA0KICAgIGZvciAoayBpbiAxOmxlbmd0aCh3aGljaCh0ZXN0JHJlc3Bucj09aSkpKSB7DQogICAgICAjZm9yIHcyLWFsdGVycyBvZiBlZ28gaSwgd2l0aCBpZHMgMTprLA0KICAgICAgI2lmIGFsdGVyIHdhcyByZW5hbWVkLCBnaXZlIHNjb3JlIDEsDQogICAgICAjaWYgaGUvc2hlIHdhcyBub3QgcmVuYW1lZCBnaXZlIDAsDQogICAgICAjYWx0ZXJzIHdobyBoYWQgbm8gY2hhbmNlIHRvIHJlYXBwZWFyIGR1ZSB0byBlZ28gbm90IGZpbGxpbmcgb3V0IHRoZSBzdXJ2ZXkga2VlcCBOQS4NCiAgICAgIHRlc3Qkc3Vydml2ZVczW3doaWNoKHRlc3QkcmVzcG5yID09IGkgJiB0ZXN0JGFsdGVyaWQgPT0gayldIDwtIGlmZWxzZSh0ZXN0JGFsdGVyaWRbIHdoaWNoKHRlc3QkcmVzcG5yID09IGkgJiB0ZXN0JGFsdGVyaWQgPT0gayldICVpbiUgaWQsIDEsMCl9DQogIH0NCn0NCg0KIyByZW1haW5pbmcgTkFzIG9uIGBzdXJ2aXZldzNgIGFtb25nIGVnb3Mgd2hvIGRpZCBmaWxsIG91dCB3MywgYXJlIGR1ZSB0byBlZ28gbm90IGxpc3RpbmcgYW55IGFsdGVycy4uDQojYW55KHRlc3QkdzNwYXJ0aWNpcGF0aW9uPT0xICYgaXMubmEodGVzdCRzdXJ2aXZlVzMpKQ0KI3Rlc3QkcmVzcG5yW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uPT0xICYgaXMubmEodGVzdCRzdXJ2aXZlVzMpKV0NCiNzbywgc2V0IHRvIDAuLi4NCnRlc3Qkc3Vydml2ZVczW3doaWNoKGlzLm5hKHRlc3Qkc3Vydml2ZVczKSAmIHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSA8LSAwDQoNCiMgaW4gd2hpY2ggZWdvbmV0IGRpZCB0aGV5IChyZSlhcHBlYXI/DQp0ZXN0JGNkbjMgPC0gTkENCnRlc3Qkc3R1ZHkzIDwtIE5BDQp0ZXN0JGJmZjMgPC0gTkENCnRlc3QkY3NuMyA8LSBOQQ0KDQojIGkgdXNlIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBvZiB3Mzsgd2hlcmUgY29sdW1ucyByZWZlciB0byB1bmlxdWUgdzIgYWx0ZXJzIChtYWludGFpbmVkIGFuZCBjcmVhdGVkOyB0aG9zZSBvZiBvdXIgY29uc3RydWN0ZWQgZGF0YWZyYW1lKSBhbmQgcm93cyByZWZlcnJpbmcgdG8gdW5pcXVlIHczIGFsdGVycw0KIyBzbywgaWYgdzItYWx0ZXIvY29sdW1uIGogaXMgbWF0Y2hlZCB0byB3My1hbHRlci9yb3cgaSwgdGhlbiB3Mi1hbHRlciBkaWQgc3Vydml2ZSAoYnV0IHdlIGFscmVhZHkga25ldyB0aGF0KTsgYnV0IG1vcmUgaW1wb3J0YW50bHksIGogd2FzIHRoZSBpXnRoIGFsdGVyIG1lbnRpb25lZA0KIyBhbmQgdGhpcyBhbGxvd3MgbWUgdG8gaW5mZXIgaW4gd2hhdCBuZXR3b3JrIGogKHJlLSlhcHBlYXJlZA0KIyBzaW5jZSBjZG4gPSAxLTU7IHN0dWR5ID0gNi0xMDsgYmZmID0gMTEtMTU7IGNzbiA9IDE2LTIwLg0KIyBob3dldmVyLCBzaW5jZSB0aGUgcm93cyBvbmx5IGluY2x1ZGUgbm9uLWR1cGxpY2F0ZSB3My1hbHRlcnM7DQojIGlmIGFsdGVyIGogYXQgdDIgd2FzIG5hbWVkIG1vcmUgdGhhbiBvbmNlIGF0IHQzLCBpIG9ubHkga25vdyB0aGUgZmlyc3QNCiMgZWdvbmV0IGluIHdoaWNoIGogd2FzIG5hbWVkLi4uDQojIHRodXMsIGJlZm9yZSBpIHByb2NlZWQsIGkgdXNlIHRoZSBtYXRjaGluZyBtYXRyaWNlcyB0aGF0IGFsbG93ZWQgZWdvIHRvIG1hdGNoIGFsdGVycyBmcm9tIGRpZmZlcmVudCBlZ29uZXRzIHRvIG1ha2UgYWx0ZXIgaWRzIGZvciB3MyBhbHRlcnM7IGFuZCBmaWd1cmUgb3V0IHRvIHdoaWNoIGVnb25ldHMgdGhleSBiZWxvbmdlZA0KDQojZmlyc3QsIHN1YnNldCBkYXRhNSwgYmMgd2Ugb25seSB3YW50IG5hbWVzIGRhdGEgb2YgZWdvcyB3aXRoIHcxL3cyIGFsdGVycyB3aG8gcGFydGljaXBhdGVkIGluIHczDQpkYXRhNWEgPC0gZGF0YTVbd2hpY2goZGF0YTUkcmVzcG5yICVpbiUgdW5pcXVlKHRlc3QkcmVzcG5yW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uPT0xKV0pKSxdDQoNCiMgaSBtYWtlIGEgZGF0YWZyYW1lIG9mIHczLWFsdGVycywgd2l0aCBwb3RlbnRpYWwgZHVwbGljYXRlcy4uLg0KZGZfbmFtZXMgPC0gZGF0YS5mcmFtZShwMSA9IGRhdGE1YSRlZ29uZXQxLlNRMDAxLixwMiA9IGRhdGE1YSRlZ29uZXQxLlNRMDAyLixwMyA9IGRhdGE1YSRlZ29uZXQxLlNRMDAzLixwNCA9IGRhdGE1YSRlZ29uZXQxLlNRMDA0LixwNSA9IGRhdGE1YSRlZ29uZXQxLlNRMDA1LixwNiA9IGRhdGE1YSRlZ29uZXQyLlNRMDAxLixwNyA9IGRhdGE1YSRlZ29uZXQyLlNRMDAyLixwOCA9IGRhdGE1YSRlZ29uZXQyLlNRMDAzLixwOSA9IGRhdGE1YSRlZ29uZXQyLlNRMDA0LixwMTA9IGRhdGE1YSRlZ29uZXQyLlNRMDA1LixwMTE9IGRhdGE1YSRlZ29uZXQzLlNRMDAxLixwMTI9IGRhdGE1YSRlZ29uZXQzLlNRMDAyLixwMTM9IGRhdGE1YSRlZ29uZXQzLlNRMDAzLixwMTQ9IGRhdGE1YSRlZ29uZXQzLlNRMDA0LixwMTU9IGRhdGE1YSRlZ29uZXQzLlNRMDA1LixwMTY9IGRhdGE1YSRlZ29uZXQ0LlNRMDAxLiwgcDE3PSBkYXRhNWEkZWdvbmV0NC5TUTAwMi4sIHAxOD0gZGF0YTVhJGVnb25ldDQuU1EwMDMuLHAxOT0gZGF0YTVhJGVnb25ldDQuU1EwMDQuLHAyMD0gZGF0YTVhJGVnb25ldDQuU1EwMDUuKQ0KDQojIGxpc3Qgb2YgZGF0YWZyYW1lcyBwZXIgZWdvIHdpdGggcm93cyByZWZsZWN0aW5nIGFsdGVycw0KIyBhbmQgY29sdW1ucyBpbmRpY2F0aW5nIHRoZSBuYW1lKHMpIG9mIHRoZSBwYXJ0aWN1bGFyIGFsdGVycw0KYWx0ZXJMIDwtIGxpc3QoKQ0KIyBsb29wIG92ZXIgYWxsIGVnb3MsIHRoYXQgZmlsbGVkIG91dCB3Mw0KZm9yICggaSBpbiAxOm5yb3coZGF0YTVhKSkgew0KICBhbHRlckxbW2ldXSA8LSBkYXRhLmZyYW1lKA0KICAgIGFsdGVyaWQgPSAxOjIwLG5hbWUxID0gTkEsbmFtZTIgPSBOQSwgbmFtZTMgPSBOQSxuYW1lNCA9IE5BKX0NCg0KIyBmaWxsIHRoZSBuYW1lcyBiYXNlZCBvbiB0aGUgbmFtZXMgZGF0YS1mcmFtZQ0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7DQogIGFsdGVyTFtbaV1dJG5hbWUxIDwtIHVubGlzdChkZl9uYW1lc1tpLCBdLCB1c2UubmFtZXM9RkFMU0UpDQogIGFsdGVyTFtbaV1dJG5hbWUxIDwtIGlmZWxzZShhbHRlckxbW2ldXSRuYW1lMT09IiIsIE5BLCBhbHRlckxbW2ldXSRuYW1lMSkNCiAgfQ0KDQojIGNhbGN1bGF0ZSBuZXRzaXplIGZvciBlYWNoIG5ldCB0byBnZXQgdGhlIGNvcnJlY3QgbWF0Y2hpbmcgbWF0cml4DQp7DQogIG5ldDEgPC0gY2JpbmQoZGF0YTVhJGVnb25ldDEuU1EwMDEuLGRhdGE1YSRlZ29uZXQxLlNRMDAyLiwgZGF0YTVhJGVnb25ldDEuU1EwMDMuLGRhdGE1YSRlZ29uZXQxLlNRMDA0LiwgZGF0YTVhJGVnb25ldDEuU1EwMDUuKQ0KICBuZXQxIDwtIGlmZWxzZShuZXQxPT0iIiwgTkEsIG5ldDEpDQogIG5zMSA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDEpKSB7DQogICAgbnMxW2ldIDwtIGxlbmd0aChuZXQxW2ksXVt3aGljaCghaXMubmEobmV0MVtpLF0pKV0pDQogIH0NCiAgbmV0MiA8LSBjYmluZChkYXRhNWEkZWdvbmV0Mi5TUTAwMS4sZGF0YTVhJGVnb25ldDIuU1EwMDIuLCBkYXRhNWEkZWdvbmV0Mi5TUTAwMy4sZGF0YTVhJGVnb25ldDIuU1EwMDQuLCBkYXRhNWEkZWdvbmV0Mi5TUTAwNS4pDQogIG5ldDIgPC0gaWZlbHNlKG5ldDI9PSIiLCBOQSwgbmV0MikNCiAgbnMyIDwtIHZlY3RvcigpDQogIGZvciAoaSBpbiAxOm5yb3cobmV0MikpIHsNCiAgICBuczJbaV0gPC0gbGVuZ3RoKG5ldDJbaSxdW3doaWNoKCFpcy5uYShuZXQyW2ksXSkpXSkNCiAgfQ0KICBuZXQzIDwtIGNiaW5kKGRhdGE1YSRlZ29uZXQzLlNRMDAxLixkYXRhNWEkZWdvbmV0My5TUTAwMi4sIGRhdGE1YSRlZ29uZXQzLlNRMDAzLixkYXRhNWEkZWdvbmV0My5TUTAwNC4sIGRhdGE1YSRlZ29uZXQzLlNRMDA1LikNCiAgbmV0MyA8LSBpZmVsc2UobmV0Mz09IiIsIE5BLCBuZXQzKQ0KICBuczMgPC0gdmVjdG9yKCkNCiAgZm9yIChpIGluIDE6bnJvdyhuZXQzKSkgew0KICAgIG5zM1tpXSA8LSBsZW5ndGgobmV0M1tpLF1bd2hpY2goIWlzLm5hKG5ldDNbaSxdKSldKQ0KICB9DQogIG5ldDQgPC0gY2JpbmQoZGF0YTVhJGVnb25ldDQuU1EwMDEuLGRhdGE1YSRlZ29uZXQ0LlNRMDAyLiwgZGF0YTVhJGVnb25ldDQuU1EwMDMuLGRhdGE1YSRlZ29uZXQ0LlNRMDA0LiwgZGF0YTVhJGVnb25ldDQuU1EwMDUuKQ0KICBuZXQ0IDwtIGlmZWxzZShuZXQ0PT0iIiwgTkEsIG5ldDQpDQogIG5zNCA8LSB2ZWN0b3IoKQ0KICBmb3IgKGkgaW4gMTpucm93KG5ldDQpKSB7DQogICAgbnM0W2ldIDwtIGxlbmd0aChuZXQ0W2ksXVt3aGljaCghaXMubmEobmV0NFtpLF0pKV0pDQogIH0NCn0NCg0KIyBjb25zdHJ1Y3QgdGhlIG1hdGNoaW5nIG1hdHJpY2VzIGxpc3QgZm9yIGVnb25ldDEtMg0KbWF0Y2hpbmdMaXN0IDwtIGxpc3QoKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCiAgbWF0Y2hpbmdMIDwtIGxpc3QoKQ0KICBtYXRjaGluZ0xbWzFdXSA8LSBjYmluZChkYXRhNWEkbWF0Y2hpbmcxTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzFOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMU4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcxTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzFOMS5TUTAwNV9TUTAwMS5baV0pDQogIG1hdGNoaW5nTFtbMl1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4yLlNRMDA1X1NRMDAyLltpXSkpDQogIG1hdGNoaW5nTFtbM11dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU4zLlNRMDA1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nTFtbNF1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAxX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAyX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDAzX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA0X1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU40LlNRMDA1X1NRMDA0LltpXSkpDQogIG1hdGNoaW5nTFtbNV1dPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA0LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAxX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAyX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDAzX1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA0X1NRMDA1LltpXSwgZGF0YTVhJG1hdGNoaW5nMU41LlNRMDA1X1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdFtbaV1dIDwtIG1hdGNoaW5nTA0KfSAjIHNvLi4uIG1hdGNoaW5nTFtbMV1dW1s1XV0gaXMgbWF0Y2hpbmdtYXRyaXggNSAoaS5lLiwgNSBhbHRlcnMgbmFtZWQgaW4gZWdvbmV0MikgZm9yIGVnbyAxDQoNCiMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBtYXRjaGluZyBtYXRyaWNlcyBhbmQgdGhlIG5ldHNpemVzIGZvciBlZ28gYWxsb3dzIG1lIHRvIG1hdGNoIHRoZSBuYW1lcyBteXNlbGYuDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0KSkgeyAgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0W1tpXV0gICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdA0KICBucyA8LSBuczJbW2ldXSAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBzaXplIG9mIGVnb25ldDINCiAgaWYobnM+MCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5zPTAsIG5vIG1hdGNoaW5nIHdhcyBkb25lIQ0KICAgIG1tIDwtIGFzLm1hdHJpeChtTFtbbnNdXSkgICAgICAgICAgICMgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDJbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTJbd2hpY2goYWx0ZXJMW1tpXV0kYWx0ZXJpZD09bWF0Y2hlZFssMl0pXSA8LSBuZXRbbWF0Y2hlZFssMV1dDQogICAgfQ0KICB9DQp9I2lnbm9yZSB3YXJuaW5nDQoNCiMgYWdhaW4sIG1ha2UgYSBtYXRjaGluZyBsaXN0IGZvciB0aGUgc2Vjb25kIG1hdGNoaW5nIG1hdHJpY2VzDQojIChpLmUuLCBtYXRjaGluZyBlZ29uZXQzIGFsdGVycyB0byBwcmV2LiBhbHRlcnMpOw0KbWF0Y2hpbmdMaXN0MiA8LSBsaXN0KCkNCmZvciAoaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICMgZm9yIGVnbyBpDQogIG1hdGNoaW5nMkwgPC0gbGlzdCgpDQogIG1hdGNoaW5nMkxbWzFdXSA8LSBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMS5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4xLlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjEuU1EwMTBfU1EwMDEuW2ldKQ0KICBtYXRjaGluZzJMW1syXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjIuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMi5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4yLlNRMDEwX1NRMDAyLltpXSkpDQogIG1hdGNoaW5nMkxbWzNdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJOMy5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk4zLlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjMuU1EwMTBfU1EwMDMuW2ldKSkNCiAgbWF0Y2hpbmcyTFtbNF1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzJONC5TUTAwMV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDAyX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDNfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwNF9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA1X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDZfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAwN19TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk40LlNRMDA4X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjQuU1EwMDlfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONC5TUTAxMF9TUTAwNC5baV0pKQ0KICBtYXRjaGluZzJMW1s1XV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDAzLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA0LltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nMk41LlNRMDAxX1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDJfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwM19TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA0X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDVfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwNl9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDA3X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmcyTjUuU1EwMDhfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzJONS5TUTAwOV9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nMk41LlNRMDEwX1NRMDA1LltpXSkpDQogIG1hdGNoaW5nTGlzdDJbW2ldXSA8LSBtYXRjaGluZzJMDQp9DQoNCmZvciAoaSBpbiAxOmxlbmd0aChtYXRjaGluZ0xpc3QyKSkgeyAgICAjIGZvciBlZ28gaQ0KICBtTCA8LSBtYXRjaGluZ0xpc3QyW1tpXV0gICAgICAgICAgICAgICMgZ2V0IHRoZSBtYXRjaGluZyBsaXN0IDINCiAgbnMgPC0gbnMzW1tpXV0gICAgICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgc2l6ZSBvZiBlZ29uZXQzDQogIGlmKG5zPjApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBucz0wLCBubyBtYXRjaGluZyB3YXMgZG9uZSENCiAgICBtbSA8LSBhcy5tYXRyaXgobUxbW25zXV0pICAgICAgICAgICAjIGFuZCB0aGUgY29ycmVzcG9uZGluZyBtYXRyaXgNCiAgICBtYXRjaGVkIDwtIHdoaWNoKG1tPT0xLCBhcnIuaW5kPVQpICAjIHJldHJpZXZlIGFycmF5IGluZGljZXMNCiAgICBuZXQgPC0gbmV0M1tpLF0NCiAgICBpZihsZW5ndGgobWF0Y2hlZCk+MCkgeyAgICAgICAgICAgICAjIGlmIG1hdGNoaW5nIHdhcyBwZXJmb3JtZWQhDQogICAgICBhbHRlckxbW2ldXSRuYW1lM1ttYXRjaGVkWywyXV0gPC0gbmV0W21hdGNoZWRbLDFdXQ0KICAgIH0NCiAgfQ0KfQ0KDQojIHNhbWUgZm9yIG1hdGNoaW5nIDMgKGkuZS4sIGVnb25ldDQgd2l0aCBlZ29uZXRzIDEtMykNCm1hdGNoaW5nTGlzdDMgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjIGZvciBlZ28gaQ0KICBtYXRjaGluZzNMIDwtIGxpc3QoKQ0KICBtYXRjaGluZzNMW1sxXV0gPC0gY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04xLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjEuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMS5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEwX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDExX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDEzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDE0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04xLlNRMDE1X1NRMDAxLltpXSkNCiAgbWF0Y2hpbmczTFtbMl1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMV9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04yLlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjIuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMV9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxMl9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxM19TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNOMi5TUTAxNV9TUTAwMi5baV0pKQ0KICBtYXRjaGluZzNMW1szXV0gPC0gcmJpbmQoDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAxLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAxLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAyLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAyLltpXSksDQogICAgY2JpbmQoZGF0YTVhJG1hdGNoaW5nM04zLlNRMDAxX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDJfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwM19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA0X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDVfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwNl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDA3X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjMuU1EwMDhfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNOMy5TUTAwOV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEwX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDExX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEyX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDEzX1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE0X1NRMDAzLltpXSwgZGF0YTVhJG1hdGNoaW5nM04zLlNRMDE1X1NRMDAzLltpXSkpDQogIG1hdGNoaW5nM0xbWzRdXSA8LSByYmluZCgNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDEuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDEuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDIuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDIuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDMuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDMuW2ldKSwNCiAgICBjYmluZChkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDFfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwMl9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDAzX1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDRfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwNV9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA2X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMDdfU1EwMDQuW2ldLGRhdGE1YSRtYXRjaGluZzNONC5TUTAwOF9TUTAwNC5baV0sZGF0YTVhJG1hdGNoaW5nM040LlNRMDA5X1NRMDA0LltpXSxkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTBfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTFfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTJfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTNfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTRfU1EwMDQuW2ldLCBkYXRhNWEkbWF0Y2hpbmczTjQuU1EwMTVfU1EwMDQuW2ldKSkNCiAgbWF0Y2hpbmczTFtbNV1dIDwtIHJiaW5kKA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAxLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDEuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMS5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMi5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAyLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDIuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMi5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMi5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwMy5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDAzLltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDMuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwMy5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwMy5baV0pLA0KICAgIGNiaW5kKGRhdGE1YSRtYXRjaGluZzNONS5TUTAwMV9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDAyX1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDNfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwNF9TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA1X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDZfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAwN19TUTAwNS5baV0sZGF0YTVhJG1hdGNoaW5nM041LlNRMDA4X1NRMDA1LltpXSxkYXRhNWEkbWF0Y2hpbmczTjUuU1EwMDlfU1EwMDUuW2ldLGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMF9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMV9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxMl9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxM19TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNF9TUTAwNS5baV0sIGRhdGE1YSRtYXRjaGluZzNONS5TUTAxNV9TUTAwNS5baV0pKQ0KICBtYXRjaGluZ0xpc3QzW1tpXV0gPC0gbWF0Y2hpbmczTA0KfQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgobWF0Y2hpbmdMaXN0MykpIHsgICAgIyBmb3IgZWdvIGkNCiAgbUwgPC0gbWF0Y2hpbmdMaXN0M1tbaV1dICAgICAgICAgICAgICAjIGdldCB0aGUgbWF0Y2hpbmcgbGlzdCAyDQogIG5zIDwtIG5zNFtbaV1dICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHNpemUgb2YgZWdvbmV0NA0KICBpZihucz4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbnM9MCwgbm8gbWF0Y2hpbmcgd2FzIGRvbmUhDQogICAgbW0gPC0gYXMubWF0cml4KG1MW1tuc11dKSAgICAgICAgICAgIyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cml4DQogICAgbWF0Y2hlZCA8LSB3aGljaChtbT09MSwgYXJyLmluZD1UKSAgIyByZXRyaWV2ZSBhcnJheSBpbmRpY2VzDQogICAgbmV0IDwtIG5ldDRbaSxdDQogICAgaWYobGVuZ3RoKG1hdGNoZWQpPjApIHsgICAgICAgICAgICAgIyBpZiBtYXRjaGluZyB3YXMgcGVyZm9ybWVkIQ0KICAgICAgYWx0ZXJMW1tpXV0kbmFtZTRbbWF0Y2hlZFssMl1dIDwtIG5ldFttYXRjaGVkWywxXV0NCiAgICB9DQogIH0NCn0NCg0KIyBtYWtlIGxvbmcgZGYgd2l0aCB3MyBhbHRlcnMgaW4gZWdvLA0KIyBhbmQgaW5kaWNhdG9ycyBmb3IgNCBlZ29uZXRzOw0KZGYyIDwtIGRhdGEuZnJhbWUoZWdvPXJlcCgxOmxlbmd0aChhbHRlckwpLGVhY2g9MjApLGFsdGVyPXJlcCgxOjIwKSxjZG49TkEsIHN0dWR5PU5BLGJmZj1OQSxjc249TkEpDQoNCmZvciAoaSBpbiB1bmlxdWUoZGYyJGVnbykpIHsgIA0KICAgIGZvciAoaiBpbiAxOjIwKSB7ICMgZm9yIGFsdGVycyBuZXN0ZWQgaW4gZWdvDQogICAgIyBmaW5kIG91dCBpZiBuYW1lcyBkZW5vdGluZyBhbHRlciBqIGFwcGVhciBpbiB0aGUgNCBlZ29uZXRzDQogICAgYWx0ZXIgPC0gdW5saXN0KGFsdGVyTFtbaV1dW2osLTFdLCB1c2UubmFtZXMgPSBGKSAjIGdldCBuYW1lcyBhbHRlciBqDQogICAgYWx0ZXIgPC0gYWx0ZXJbIWlzLm5hKGFsdGVyKV0gIyBleGNsdWRlIE5Bcw0KICAgIGNkbiA8LSBhbHRlciAlaW4lIG5ldDFbaSxdDQogICAgc3R1ZHkgPC0gYWx0ZXIgJWluJSBuZXQyW2ksXQ0KICAgIGJmZiA8LSBhbHRlciAlaW4lIG5ldDNbaSxdDQogICAgY3NuIDwtIGFsdGVyICVpbiUgbmV0NFtpLF0NCiAgICAjIGFuZCBpZiBzbywgZ2l2ZSBhbHRlciBqIHNjb3JlIDEgb24gaW5kaWNhdG9yczsgMCBvdGhlcndpc2UNCiAgICBkZjIkY2RuW3doaWNoKGRmMiRlZ289PWkgJiBkZjIkYWx0ZXI9PWopXSA8LSBpZmVsc2UoIlRSVUUiICVpbiUgY2RuLCAxLCAwKQ0KICAgIGRmMiRzdHVkeVt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIHN0dWR5LCAxLCAwKQ0KICAgIGRmMiRiZmZbd2hpY2goZGYyJGVnbz09aSAmIGRmMiRhbHRlcj09aildIDwtIGlmZWxzZSgiVFJVRSIgJWluJSBiZmYsIDEsIDApDQogICAgZGYyJGNzblt3aGljaChkZjIkZWdvPT1pICYgZGYyJGFsdGVyPT1qKV0gPC0gaWZlbHNlKCJUUlVFIiAlaW4lIGNzbiwgMSwgMCkNCiAgfQ0KfQ0KDQojIG5vdyB0aGF0IGkgaGF2ZSwgZm9yIGVhY2ggYWx0ZXIgb2YgZWdvIChpbmNsdWRpbmcgZHVwbGljYXRlcykgYXQgdDIsDQojIHRoZSBuZXRzIHRvIHdoaWNoIHRoZXkgYmVsb25nLi4NCiMgaSBjb250aW51ZSB3aXRoIHRoZSB3MS13MiBtYXRjaGluZyBtYXRyaWNlcw0KDQojIHdlIGFscmVhZHkgc3Vic2V0dGVkIHRoZSBtYXRjaGluZyBtYXRyaWNlcyAoaW4gYHcxdzJgKSwgYnV0IG5vdyB3ZSB0YWtlIG9ubHkgdGhlIHJvd3MgY29ycmVzcG9uZGluZyB0byB3MyBlZ29zIHdobyBoYXZlIHcyIG1haW50YWluZWQvY3JlYXRlZCBhbHRlcnMNCncxdzIgPC0gdzF3Mlt3aGljaCh3MXcyJHJlc3BuciAlaW4lIHVuaXF1ZSh0ZXN0JHJlc3Buclt3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbj09MSldKSksXQ0KDQpmb3IgKCBpIGluIDE6bGVuZ3RoKGFsdGVyTCkpIHsNCg0KICBtYXRjaGluZ0wgPC0gdmVjdG9yKCJsaXN0IiwgMjApICNwcmUtYWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBsZW5ndGggMjAsIHRvIHN0b3JlIG1hdGNoaW5nIG1hdHJpY2VzDQogIHsNCiAgICBtYXRjaGluZ0xbWzFdXSA8LSB3MXcyW2ksIDE6MjBdDQogICAgbWF0Y2hpbmdMW1syXV0gPC0gdzF3MltpLCAyMTo0MF0NCiAgICBtYXRjaGluZ0xbWzNdXSA8LSB3MXcyW2ksNDE6NjBdDQogICAgbWF0Y2hpbmdMW1s0XV0gPC0gdzF3MltpICw2MTo4MF0NCiAgICBtYXRjaGluZ0xbWzVdXSA8LSB3MXcyW2kgLDgxOjEwMF0NCiAgICBtYXRjaGluZ0xbWzZdXSA8LSB3MXcyW2kgLDEwMToxMjBdDQogICAgbWF0Y2hpbmdMW1s3XV0gPC0gdzF3MltpICwxMjE6MTQwXQ0KICAgIG1hdGNoaW5nTFtbOF1dIDwtIHcxdzJbaSAsMTQxOjE2MF0NCiAgICBtYXRjaGluZ0xbWzldXSA8LSB3MXcyW2kgLDE2MToxODBdDQogICAgbWF0Y2hpbmdMW1sxMF1dIDwtIHcxdzJbaSAsMTgxOjIwMF0NCiAgICBtYXRjaGluZ0xbWzExXV0gPC0gdzF3MltpICwyMDE6MjIwXQ0KICAgIG1hdGNoaW5nTFtbMTJdXSA8LSB3MXcyW2kgLDIyMToyNDBdDQogICAgbWF0Y2hpbmdMW1sxM11dIDwtIHcxdzJbaSAsMjQxOjI2MF0NCiAgICBtYXRjaGluZ0xbWzE0XV0gPC0gdzF3MltpICwyNjE6MjgwXQ0KICAgIG1hdGNoaW5nTFtbMTVdXSA8LSB3MXcyW2kgLDI4MTozMDBdDQogICAgbWF0Y2hpbmdMW1sxNl1dIDwtIHcxdzJbaSAsMzAxOjMyMF0NCiAgICBtYXRjaGluZ0xbWzE3XV0gPC0gdzF3MltpICwzMjE6MzQwXQ0KICAgIG1hdGNoaW5nTFtbMThdXSA8LSB3MXcyW2kgLDM0MTozNjBdDQogICAgbWF0Y2hpbmdMW1sxOV1dIDwtIHcxdzJbaSAsMzYxOjM4MF0NCiAgICBtYXRjaGluZ0xbWzIwXV0gPC0gdzF3MltpICwzODE6NDAwXQ0KICB9DQogIA0KICAjZmluZCB0aGUgJ3JpZ2h0JyBtYXRjaGluZyBtYXRyaXggaW4gdGhpcyBsaXN0LCBieSB0YWtpbmcgdGhlIG9uZSB0aGF0IGNvbnRhaW5zIGFuc3dlcnMNCiAgaW5kIDwtIE5VTEwNCiAgZm9yIChqIGluIHNlcV9hbG9uZyhtYXRjaGluZ0wpKSB7DQogICAgI2NoZWNrIGFsb25nIHRoZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBqIGluIHRoZSBtYXRjaGluZyBtYXRyaXggbGlzdCBpZiB0aGV5IGFyZSBub24tZW1wdHkgYW5kIG5vdCBOQQ0KICAgIGNoZWNrIDwtIEZBTFNFDQogICAgZm9yIChjb2wgaW4gbWF0Y2hpbmdMW1tqXV0pIHsNCiAgICAgIGlmICghYWxsKGlzLm5hKGNvbCkpICYmIGFueShuY2hhcihjb2wpID4gMCkpIHsNCiAgICAgICAgY2hlY2sgPC0gVFJVRQ0KICAgICAgICBicmVhayAgDQogICAgICB9DQogICAgICB9DQogICAgaWYgKGNoZWNrKSB7DQogICAgICBpbmQgPC0gag0KICAgICAgYnJlYWsgIA0KICAgIH0NCiAgfQ0KICBpZihsZW5ndGgoaW5kKT4wKSB7DQogICAgIyBnZXQgdGhlICBtYXRyaXgNCiAgICBtbSA8LSBtYXRjaGluZ0xbW2luZF1dDQogICAgDQogICAgIyBleHRyYWN0IGFsdGVyIGlkcw0KICAgIGFucyA8LSBzdHJpbmdyOjpzdHJfZXh0cmFjdF9hbGwobW0sIlxcKD9bMC05LC5dK1xcKT8iKSANCiAgICAjIGhlcmUsIHRoZSBvYmplY3QgcmVmZXJzIHRvIHRoZSB3Mi1hbHRlciBqOw0KICAgICMgYW5kIHRoZSBlbGVtZW50IGluZGljYXRvciBpbiB0aGUgbGlzdCByZWZlcnMgdG8gdGhlIHczLWFsdGVyIA0KICAgICANCiAgICBmb3IgKGogaW4gdW5pcXVlKCB0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0pXSApKSB7ICMgZm9yIHdhdmUtMiBhbHRlciBqDQogICAgICANCiAgICAgICN0byB3aGljaCByb3cvdzMtYWx0ZXIgd2FzIGFsdGVyIGogbWF0Y2hlZD8NCiAgICAgIG1hdGNoIDwtIHdoaWNoKGFucyA9PSBqKQ0KDQogICAgICAjIGFuZCBpbiB3aGljaCBuZXR3b3JrcyBkaWQgdGhpcyB3My1hbHRlciBiZWxvbmc/DQogICAgICBuZXRzIDwtIGRmMlt3aGljaChkZjIkZWdvID09IGkgJiBkZjIkYWx0ZXIgPT0gbWF0Y2hbMV0pLF0NCiAgICAgIA0KICAgICAgaWYobGVuZ3RoKG1hdGNoKT4wKSB7ICMgaWYgaiB3YXMgbWF0Y2hlZCB0byB3My1hbHRlcnMuLi4NCiAgICAgICAgDQogICAgICAgICMgYXNzaWduIHRvIGFsdGVyIGogdGhlIG5ldHdvcmtzIGluIHdoaWNoIHRoZSB3My1hbHRlciBhcHBlYXJlZA0KICAgICAgICB0ZXN0JGNkbjNbIHdoaWNoKHRlc3QkZWdvID09IHVuaXF1ZSh0ZXN0JGVnb1t3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbiA9PSAxKV0pW2ldICYgdGVzdCRhbHRlcmlkID09IGopXSA8LSBuZXRzJGNkblsxXQ0KICAgICAgICB0ZXN0JHN0dWR5M1sgd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtIG5ldHMkc3R1ZHlbMV0NCiAgICAgICAgdGVzdCRiZmYzWyB3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSAmIHRlc3QkYWx0ZXJpZCA9PSBqKV0gPC0gbmV0cyRiZmZbMV0NCiAgICAgICAgdGVzdCRjc24zWyB3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSAmIHRlc3QkYWx0ZXJpZCA9PSBqKV0gPC0gbmV0cyRjc25bMV0NCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg0KI2Fsc28gYWRkIGR5bmFtaWMgcmVsYXRpb25hbCBpbmZvIG9uIGNsb3NlbmVzcyBhbmQgY29tbXVuaWNhdGlvbiBmcmVxdWVuY3kNCiNpbiB3MywgdGhpcyB3YXMgb25seSBhc2tlZCBmb3IgYWx0ZXJzIGZyb20gdzIgKHRob3NlIG1haW50YWluZWQgZnJvbSB3MSBvciB3Mi1jcmVhdGVkKSENCnRlc3QkZnJlcXVlbmN5LnQzIDwtIE5BDQp0ZXN0JGNsb3NlbmVzcy50MyA8LSBOQQ0KDQojIHN1YnNldCB3MyBuYW1lIGludGVycHJldGVycyBvbiBjb250YWN0IGZyZXEuIG9mIHcxIGFsdGVycyAoc3EwMjEgLSBzcTA0MCEpDQojdGFpbChuYW1lcyhkYXRhNWEpLDIzNCkNCmZyZXEgPC0gZGF0YTVhWyxjKDExMDY6MTEyNSldDQpjbG9zZSA8LSBkYXRhNWFbLGMoMTEyNjoxMTQ1KV0NCg0KIyByZWNvZGUgaW50byBudW1lcmljIHZhbHVlczsNCmZyZXEgPC0gaWZlbHNlKGZyZXE9PSIoQmlqbmEpIGVsa2UgZGFnIiw3LA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZnJlcT09IjEtMiBrZWVyIHBlciB3ZWVrIiw2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgbWFhbmQiLDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIG1hYW5kIiw0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJBYW50YWwga2VlciBwZXIgamFhciIsMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShmcmVxPT0iT25nLiAxIGtlZXIgcGVyIGphYXIiLDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGZyZXE9PSJOb29pdCIsMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICkpKSkpKSkNCmNsb3NlIDwtIGlmZWxzZShjbG9zZT09IkhlZWwgZXJnIGhlY2h0IiwgNCwgaWZlbHNlKGNsb3NlPT0iSGVjaHQiLCAzLCBpZmVsc2UoY2xvc2U9PSJFbmlnc3ppbnMgaGVjaHQiLDIsIGlmZWxzZShjbG9zZT09Ik5pZXQgaGVjaHQiLCAxLCBOQSkpKSkNCg0KZm9yICggaSBpbiAxOmxlbmd0aChhbHRlckwpKSB7ICNmb3IgZWdvIGkNCiAgIGZvciAoaiBpbiB1bmlxdWUoIHRlc3QkYWx0ZXJpZFt3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSldICkgKSB7ICMgZm9yIHdhdmUtMiBhbHRlciBqIA0KICAgICANCiAgICAgdGVzdCRmcmVxdWVuY3kudDNbIHdoaWNoKHRlc3QkZWdvID09IHVuaXF1ZSh0ZXN0JGVnb1t3aGljaCh0ZXN0JHczcGFydGljaXBhdGlvbiA9PSAxKV0pW2ldICYgdGVzdCRhbHRlcmlkID09IGopXSA8LQ0KICAgICAgIGZyZXFbaSxdWyFpcy5uYShmcmVxW2ksXSldW2pdDQogICAgIA0KICAgICB0ZXN0JGNsb3NlbmVzcy50M1sgd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtDQogICAgICAgY2xvc2VbaSxdWyFpcy5uYShjbG9zZVtpLF0pXVtqXQ0KICAgfQ0KfQ0KDQojbGFzdCwgYWRkIHJlc3Bub2RlbnQncyByZWFzb25zIGZvciBub3QgcmVuYW1pbmcgYSB3Mi1hbHRlci4NCiN0aGlzIHdhcyBvbmx5IGFza2VkIGZvciB3MiBhbHRlcnMgd2hvIHdlcmUgbm90IHJlbGlzdGVkDQp0ZXN0JHJlYXNvbiA8LSBOQQ0KDQojc3Vic2V0IHJlYXNvbnMgZ2l2ZW4gZm9yIG5vdCByZW5hbWluZyBhIHcyLWFsdGVyDQojdGFpbChuYW1lcyhkYXRhNWEpLDI0MykNCnJlYXNvbnMgPC0gZGF0YTVhWyxjKDExNDY6MTE2NSldDQojdW5pcXVlKHJlYXNvbnMkdmVyZ2V0ZW4uU1EwMDEuKQ0KIyBpZiwgYWNjb3JkaW5nIHRvIGVnbywgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIGFsdGVyIGNoYW5nZWQgKCJPbnplIHJlbGF0aWUgaXMgdmVyYW5kZXJkLiIpLCB3ZSBwcm9iZWQgZnVydGhlcg0KcmVhc29uczIgPC0gZGF0YTVhWyxjKDExODY6MTIwNSldDQoNCmZvciAoIGkgaW4gMTpsZW5ndGgoYWx0ZXJMKSkgeyAjZm9yIGVnbyBpDQoNCg0KICAjaWYgYW55IHcyLWFsdGVyIG9mIGkgd2VudCB1bmxpc3RlZCAodGh1cywgc2NvcmVkIDAgb24gYHN1cnZpdmVXM2ApLi4uDQogIA0KICBpZiAoIDAgJWluJSB0ZXN0JHN1cnZpdmVXM1t3aGljaCh0ZXN0JGVnbyA9PSB1bmlxdWUodGVzdCRlZ29bd2hpY2godGVzdCR3M3BhcnRpY2lwYXRpb24gPT0gMSldKVtpXSldICkgew0KICAgIA0KICAgICMgZm9yICpub24tcmVuYW1lZCogYWx0ZXIgag0KICAgICBmb3IgKGogaW4gdW5pcXVlKCB0ZXN0JGFsdGVyaWRbd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCRzdXJ2aXZlVzMgPT0gMCldKSkgew0KICAgICAgIA0KICAgICAgICNnZXQgcmVzcG9uZGVudCBpJ3MgcmVhc29uIGZvciBub3QgcmUtbmFtaW5nIGosDQogICAgICAgcmVhc29uaWogPC0gcmVhc29uc1tpLGpdDQogICAgICAgI2lmIGl0IHdhcyBkdWUgdG8gYSBjaGFuZ2UgaW4gcmVsYXRpb25zaGlwLCBwcm9iZSBmdXJ0aGVyDQogICAgICAgcmVhc29uaWogPC0gaWZlbHNlKHJlYXNvbmlqID09ICJPbnplIHJlbGF0aWUgaXMgdmVyYW5kZXJkLiIsIHJlYXNvbnMyW2ksal0sIHJlYXNvbmlqKQ0KICAgICAgICNhbmQgaWYgdGhlIHJlbGF0aW9uc2hpcCBjaGFuZ2VkIGluIG90aGVyIHdheXMgdGhhbiB3ZSBvZmZlcmVkIGFzIGNob2ljZXMsIGp1c3Qgc2V0IHRvICJvdGhlciINCiAgICAgICByZWFzb25paiA8LSBpZmVsc2UocmVhc29uaWogPT0gIkRlIHJlbGF0aWUgaXMgb3AgZWVuIGFuZGVyZSBtYW5pZXIgdmVyYW5kZXJkLiIsICJBbmRlcmUgcmVkZW4uIiwgcmVhc29uaWopDQogICAgICAgDQogICAgICAgdGVzdCRyZWFzb25bd2hpY2godGVzdCRlZ28gPT0gdW5pcXVlKHRlc3QkZWdvW3doaWNoKHRlc3QkdzNwYXJ0aWNpcGF0aW9uID09IDEpXSlbaV0gJiB0ZXN0JGFsdGVyaWQgPT0gaildIDwtDQogICAgICAgICByZWFzb25pag0KICAgICB9DQogIH0NCn0NCg0KI3JlY29kZS4uLg0KI3VuaXF1ZSh0ZXN0JHJlYXNvbikNCnRlc3QkcmVhc29uIDwtIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiQW5kZXJlIHJlZGVuLiIsICJtaXNjZWxsYW5lb3VzIiwNCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRlc3QkcmVhc29uID09ICJFciBpcyBnZWVuIGdlbGVnZW5oZWlkIGdld2Vlc3Qgdm9vciBvbnMgb20gY29udGFjdCB0ZSBoZWJiZW4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBvY2Nhc2lvbiB0byBnZXQgdG9nZXRoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRlc3QkcmVhc29uID09ICJFw6luIHZhbiBvbnMgaXMgdmVyaHVpc2QuIiwgInNvbWVvbmUgbW92ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGVzdCRyZWFzb24gPT0gIkXDqW4gdmFuIG9ucyBoZWVmdCBlZW4gYmVsYW5ncmlqa2UgdmVyYW5kZXJpbmcgZG9vcmdlbWFha3QgICh6b2FscyBoZXQgc3RvcHBlbiBtZXQgc3R1ZGVyZW4sIGhldCBhYW5nYWFuL2Jlw6tpbmRpZ2VuIHZhbiBlZW4gcmVsYXRpZSwgaGV0IGtyaWpnZW4gdmFuIGVlbiBraW5kLCBlbnpvdm9vcnQpLiIsICJvdGhlciBsaWZlIGV2ZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiRcOpbiB2YW4gb25zIGhlZWZ0IGdlem9uZGhlaWRzcHJvYmxlbWVuLiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciBsaWZlIGV2ZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodGVzdCRyZWFzb24gPT0gIldlIHppam4gdWl0IGVsa2FhciBnZWdyb2VpZC9kZSByZWxhdGllIGlzIHZlcndhdGVyZC4iLCAiZHJpZnRlZCBhcGFydCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSJXZSBoYWRkZW4gbWVuaW5nc3ZlcnNjaGlsbGVuIG9mIHJ1emllLiIsICJkaXNhZ3JlZW1lbnQgLyBjb25mbGljdCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0ZXN0JHJlYXNvbiA9PSAiSWsgYmVuIHNpbXBlbHdlZyB2ZXJnZXRlbiBvbSBkZXplIHBlcnNvb24gb3BuaWV1dyB0ZSBub2VtZW4uIiwgImZvcmdvdHRlbiIsIHRlc3QkcmVhc29uKSkpKSkpKSkNCiAgICANCmRhdGFfYWx0ZXJzMjMgPC0gdGVzdA0KYGBgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQojbm93ICdiaW5kIGJhY2sgdG9nZXRoZXInDQp0ZXN0IDwtIGRmX2FsdGVyc1t3aGljaChkZl9hbHRlcnMkc3RhdHVzVzI9PSJEcm9wcGVkIiksXQ0KZGZfYWx0ZXJzIDwtIGJpbmRfcm93cyh0ZXN0LCBkYXRhX2FsdGVyczIzKQ0KDQojcmVhcnJhbmdlLCBieSBlZ28sIGFuZCBzdGF0dXMNCmRmX2FsdGVycyA8LSBkZl9hbHRlcnMgJT4lIGFycmFuZ2UoZWdvLCBmYWN0b3Ioc3RhdHVzVzIsIGxldmVscz1jKCJNYWludGFpbmVkIiwgIkNyZWF0ZWQiLCAiRHJvcHBlZCIpKSkNCnJvdy5uYW1lcyhkZl9hbHRlcnMpIDwtIDE6bnJvdyhkZl9hbHRlcnMpDQoNCiNuZXcgYWx0ZXIgaWRzLCAxOm5fYWx0ZXINCmZvciAoaSBpbiB1bmlxdWUoZGZfYWx0ZXJzJGVnbykpIHsNCiAgZGZfYWx0ZXJzJGFsdGVyaWRbd2hpY2goZGZfYWx0ZXJzJGVnbyA9PSBpKV0gPC0gMTpsZW5ndGgoZGZfYWx0ZXJzJGFsdGVyaWRbd2hpY2goZGZfYWx0ZXJzJGVnbyA9PSBpKV0pDQp9DQoNCiNleGNsdWRlICduYW1lcycNCmRmX2FsdGVycy5ubiA8LSBkZl9hbHRlcnNbLC1jKDU6OCldDQoNCiNzYXZlIHRoZSByZXN1bHRpbmcgZGF0YWZyYW1lIChleGNsdWRlIG5hbWVzKQ0KZnNhdmUoZGZfYWx0ZXJzLm5uLCAidGllX21haW50ZW5hbmNlLlJEYSIpDQpgYGANCg0KPGJyPg0KDQoNCiMgbmV0d29ya2RhdGEuUkRhIA0KDQpXZSB0YWtlIGVnbydzIGFsdGVycyBhdCB0LCBhbmQgc2VlIHdobyBiZWNvbWVzIHNwb3J0cyBwYXJ0bmVyIGF0IHQrMS4gV2UgZG8gdGhpcyBib3RoIGZvciB3YXZlIDEgLS0+IHdhdmUgMiwgYW5kIHdhdmUgMiAtLT4gd2F2ZSAzLiANCg0KRmlyc3QsIHRpZHkgdXAgdGhlIGRhdGEtZnJhbWUgKGRlbGV0aW5nIHN0dWZmIHRoYXQgd2Ugd29uJ3QgbmVlZCArIHJlLW9yZGVyaW5nIGNvbHVtbnMpDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpkZiA8LSBmbG9hZCgiLi9kYXRhL3Byb2Nlc3NlZC8yMDI0MDcxN3RpZV9tYWludGVuYW5jZS5SRGEiKQ0KDQojc2V0IGdlbmRlciB0byBiaW5hcnkNCmRmJGVnb19mZW1hbGUgPC0gaWZlbHNlKGRmJGVnb19nZW5kZXI9PTIsMSxkZiRlZ29fZ2VuZGVyKQ0KZGYkYWx0ZXJfZmVtYWxlIDwtIGlmZWxzZShkZiRhbHRlcl9nZW5kZXI9PTIsMSxkZiRhbHRlcl9nZW5kZXIpDQoNCiNtdWx0aXBsZXggdDINCmRmJG11bHRpcGxleC50MiA8LSByb3dTdW1zKGRmWyxjKCJjZG4yIiwic3R1ZHkyIiwiYmZmMiIsImNzbjIiKV0pIC0gMQ0KYGBgDQoNCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiNpbiBhbmFseXppbmcgd2F2ZXMgMSBhbmQgMiwgd2UgbG9vayBhdCB3MSBhbHRlcnMgYW5kIHdoZXJlIHRoZXkgcmVhcHBlYXIgYXQgdzINCmRmMSA8LSBkZlstd2hpY2goZGYkc3RhdHVzVzIgPT0gIkNyZWF0ZWQiKSxdDQojbnJvdyhkZjEpICNuPTMxNzQNCg0KI21ha2UgdmFyaWFibGVzIHJlZmxlY3Rpbmcgd2hldGhlciBhbHRlcnMgYXJlIG1lbWJlciBvZiBlYWNoIG5ldHdvcmsgbGF5ZXIgYXQgdA0KZGYxJGNkbiA8LSBkZjEkY2RuMQ0KZGYxJGJmZiA8LSBkZjEkYmZmMQ0KZGYxJGNzbiA8LSBkZjEkY3NuMQ0KZGYxJHN0dWR5IDwtIGRmMSRzdHVkeTENCg0KI1k6IG5ldHdvcmsgYXQgdCsxDQpkZjEkWWNkbiA8LSBkZjEkY2RuMg0KZGYxJFljc24gPC0gZGYxJGNzbjINCmRmMSRZYmZmIDwtIGRmMSRiZmYyDQpkZjEkWXN0dWR5IDwtIGRmMSRzdHVkeTINCg0KI05BIChpLmUuLCAiZGlkIG5vdCByZWFwcGVhciBzbyBub3QgY2hhbmNlIHRvIGJlIG5hbWVkIGFnYWluIiksIHRvIDANCmRmMSRZY2RuW2lzLm5hKGRmMSRZY2RuKV0gPC0gMA0KZGYxJFljc25baXMubmEoZGYxJFljc24pXSA8LSAwDQpkZjEkWWJmZltpcy5uYShkZjEkWWJmZildIDwtIDANCmRmMSRZc3R1ZHlbaXMubmEoZGYxJFlzdHVkeSldIDwtIDANCg0KI2luIGFuYWx5emluZyB3YXZlcyAyIGFuZCAzLCB3ZSBsb29rIGF0IHcyLWFsdGVycyAobWFpbnRhaW5lZCAvIGNyZWF0ZWQpIGFuZCBzZWUgaWYgYW5kIHdoZXJlIHRoZXkgcmVhcHBlYXIgYXQgdzMuDQojc28sIGRyb3AgdzItZHJvcHBlZA0KI2FuZCBvbmx5IG9mIGVnb3Mgd2hvIHBhcnRpY2lwYXRlZCBpbiB3Mw0KZGYyIDwtIGRmWy13aGljaChkZiRzdGF0dXNXMiA9PSAiRHJvcHBlZCIpLF0NCmRmMiA8LSBkZjJbZGYyJHczcGFydGljaXBhdGlvbiA9PSAxLF0NCm5yb3coZGYyKQ0KDQojbWFrZSB2YXJpYWJsZXMgcmVmbGVjdGluZyB3aGV0aGVyIGFsdGVycyBhcmUgbWVtYmVyIG9mIGVhY2ggbmV0d29yayBsYXllciBhdCB0DQpkZjIkY2RuIDwtIGRmMiRjZG4yDQpkZjIkYmZmIDwtIGRmMiRiZmYyDQpkZjIkY3NuIDwtIGRmMiRjc24yDQpkZjIkc3R1ZHkgPC0gZGYyJHN0dWR5Mg0KDQojWTogbmV0d29yayBhdCB0KzENCmRmMiRZY2RuIDwtIGRmMiRjZG4zDQpkZjIkWWNzbiA8LSBkZjIkY3NuMw0KZGYyJFliZmYgPC0gZGYyJGJmZjMNCmRmMiRZc3R1ZHkgPC0gZGYyJHN0dWR5Mw0KDQojTkEgKGkuZS4sICJkaWQgbm90IHJlYXBwZWFyIHNvIG5vdCBjaGFuY2UgdG8gYmUgbmFtZWQgYWdhaW4iKSwgdG8gMA0KZGYyJFljZG5baXMubmEoZGYyJFljZG4pXSA8LSAwDQpkZjIkWWNzbltpcy5uYShkZjIkWWNzbildIDwtIDANCmRmMiRZYmZmW2lzLm5hKGRmMiRZYmZmKV0gPC0gMA0KZGYyJFlzdHVkeVtpcy5uYShkZjIkWXN0dWR5KV0gPC0gMA0KDQojc3Vic2V0IGNvbHVtbnMgb2YgaW50ZXJlc3QNCmNvbG5hbWVzKGRmMSlbYygzMSwgOTAsIDIsIDMsIDQsIDkxLCA2OjEwLCAxNjozMCwgMzksIDkyOjk5LCAzNiw0MSwgMTUgKV0NCmRmMSA8LSBkZjFbLGMoMzEsIDkwLCAyLCAzLCA0LCA5MSwgNjoxMCwgMTY6MzAsIDM5LCA5Mjo5OSwgMzYsNDEsIDE1ICldDQoNCmNvbG5hbWVzKGRmMSkgPC0gc3ViKCIxJCIsICIiLCBjb2xuYW1lcyhkZjEpKQ0KI25hbWVzKGRmMSlbbmFtZXMoZGYxKT09Im11bHRpcGxleCJdIDwtICJtdWx0aXBsZXgudCINCg0KY29sbmFtZXMoZGYyKVtjKDMxLCA5MCwgMiwgMywgNCwgOTEsIDY6MTAsIDY5OjcwLCAxODozMCwgMzksIDkyOjk5LCAzNiw0MSwgMTUgKV0NCmRmMiA8LSBkZjJbLGMoMzEsIDkwLCAyLCAzLCA0LCA5MSwgNjoxMCwgNjk6NzAsIDE4OjMwLCAzOSwgOTI6OTksIDM2LDQxLDE1KV0NCmNvbG5hbWVzKGRmMikgPC0gc3ViKCIyJCIsICIiLCBjb2xuYW1lcyhkZjIpKQ0KDQpkZjEkcGVyaW9kIDwtIDENCmRmMiRwZXJpb2QgPC0gMg0KDQojZmlsbCBOQSB2YWx1ZXMgb24gdHJhbnNpdGlvbnMgaW4gcGVyaW9kIDIgDQpmb3IgKGkgaW4gd2hpY2goaXMubmEoZGYyJGhvdXNpbmcudHJhbnNpdGlvbl9iaW4pKSkgew0KICBkZjIkaG91c2luZy50cmFuc2l0aW9uX2JpbltpXSA8LSBkZjEkaG91c2luZy50cmFuc2l0aW9uX2Jpblt3aGljaChkZjEkZWdvID09IGRmMiRlZ29baV0pXVsxXQ0KICBkZjIkb2NjdXBhdGlvbi50cmFuc2l0aW9uX2JpbltpXSA8LSBkZjEkb2NjdXBhdGlvbi50cmFuc2l0aW9uX2Jpblt3aGljaChkZjEkZWdvID09IGRmMiRlZ29baV0pXVsxXQ0KfQ0KDQojY29tYmluZQ0KZGF0YSA8LSByYmluZChkZjEsZGYyKQ0KYGBgDQoNCg0KPGJyPiANCg0KZnNhdmUNCg0KYGBge3IsZXZhbD1GQUxTRX0NCmZzYXZlKGRhdGEsICJuZXR3b3JrZGF0YS5SZGEiKQ0KYGBgDQoNCjxicj4NCg0KLS0tLQ0KDQoNCiMgUmVmZXJlbmNlcw0KDQoNCg==


Copyright © 2025 Rob Franken