Goal

Final data preparation for RI-CLPM analysis.

Set up and data import

#load packages
library(tidyverse)
library(doParallel)
library(parallel)
library(data.table)

#disable the scientific notation in R (else all the id's will be in scientific notation)
options(scipen = 999)

#Data import
load("data/data-processed/lisscdn_cl-ready_240816.Rdata")

Declaration of functions used

#------------------------- Functions for recoding of data -------------------------# 
#function to recode education into education years 
feduc_ego <- function(x) {
  x2 <- ifelse(x == 1, 6, x)
  x3 <- ifelse(x == 2, 10, x2)
  x4 <- ifelse(x == 3, 11.5, x3)
  x5 <- ifelse(x == 4, 10.5, x4)
  x6 <- ifelse(x == 5, 15, x5)
  x7 <- ifelse(x == 6, 16, x6)
  x8 <- ifelse(x == 7, NA, x7)
  x9 <- ifelse(x == 8, 4, x8)
  x10 <- ifelse(x == 9, 0, x9)
  return(x10)
}

feduc_alter <- function(x) {
  x2 <- ifelse(x == 1, 4, x)
  x3 <- ifelse(x == 2, 6, x2)
  x4 <- ifelse(x == 3, 10, x3)
  x5 <- ifelse(x == 4, 11.5, x4)
  x6 <- ifelse(x == 5, 10.5, x5)
  x7 <- ifelse(x == 6, 15, x6)
  x8<- ifelse(x == 7, 16, x7)
  return(x8)
}

feduc_alter_orig <- function(x) {
  x1 <- ifelse(x == 4, 5, x)
  x2 <- ifelse(x == 5, 4, x1)
  return(x2)
}

#poltalk reverse code
fpoltalk <- function(x) {
  y <- 7 - x
  return(y)
}

#create function for similarity score (numerical variables) (see Rsiena Manual)
feduc_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/12)
  return(result)
}

#create function
fcat_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/1)
  return(result)
}

#recode the age of ego into the same categories as the confidant.
fage_rec <- function (x) {
  y <- ifelse(x < 16, 1, x)
  y <- ifelse(x > 15 & x < 21, 2, y)
  y <- ifelse(x > 20 & x < 26, 3, y)
  y <- ifelse(x > 25 & x < 31, 4, y)
  y <- ifelse(x > 30 & x < 36, 5, y)
  y <- ifelse(x > 35 & x < 41, 6, y)
  y <- ifelse(x > 40 & x < 46, 7, y)
  y <- ifelse(x > 45 & x < 51, 8, y)
  y <- ifelse(x > 50 & x < 56, 9, y)
  y <- ifelse(x > 55 & x < 61, 10, y)
  y <- ifelse(x > 60 & x < 66, 11, y)
  y <- ifelse(x > 65 & x < 71, 12, y)
  y <- ifelse(x > 70, 13, y)
  return(y)
}

#create function
fage_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/13)
  return(result)
}


#recode functions
forigin_rec_alter <- function(x) {
  y <- ifelse((x > 1) & (x < 8), 0, 1)
}

forigin_rec_ego <- function(x) {
  y <- ifelse(x == 0, 1, x)
  y <- ifelse(x == 201 | x == 101, 1, y)
  y <- ifelse(x == 102 | x == 202, 0, y)
}

#create function to recode talk alter. 
ftalk_rec <- function(x) {
  y <- ifelse(x == 5, NA, x)
  z <- 4 - y
  return(z)
}

#create function for similarity score (numerical variables) (see Rsiena Manual)
feduc_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/12)
  return(result)
}

#create distance function. I will subtract alter from ego. 
feduc_distance <- function(x,y) {
  z <- y - x
  return(z)
}

#create categorical similarity function
fcat_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/1)
  return(result)
}

#create function
fage_sim <- function (x,y) {
  result <- 1 - (abs(x - y)/13)
  return(result)
}

#age distance function. Subtract the score of x from y. So if y is lower the score is negative. 
fage_dis <- function(x,y){
  result <- y - x
  return(result)
}

#create function. 
#rl times reciprocal of n (number of waves respondent is in; more waves more chance for alter to pop up.
frl_normalize <- function(x,y) {
  z <- (1/x)*y
  return(z)
}

#work recode
fwork <- function(x){ 
  ifelse(x < 3, 1, 0)}


#Function for EI index of segregation. 
fEIindex <- function(x, y){(length(x[!is.na(x) & x == y]) - length(x[!is.na(x) & x!=y]))/length(x[!is.na(x)])}

Data preperation

Transform data

#Ego Control variables.
data_long <- data_long %>%
  mutate(female = gender - 1, #create female dummy
         work = ifelse(belbezig < 4, 1, 0), #create paidwork
         married = ifelse(burgstat == 1, 1, 0), #create married dummy
         educ_orig = educ, #save old education coding
         educ = feduc_ego(educ), #change educ coding
         inc_ln = log(inc_ln + 1), #log transform
         urban = 5 - urban, #reverse coding
         cult = 5 - cult_inc, #reverse coding
         eu = 5 - eu, #reverse coding
         inc_diff = inc_diff - 1,
         age_rec = fage_rec(age),
         origin = forigin_rec_ego(origin)) #reverse coding

#alter variables
data_long <- data_long %>%
  mutate(educ_orig_a.1 = educ_a.1,
         educ_orig_a.2 = educ_a.2,
         educ_orig_a.3 = educ_a.3,
         educ_orig_a.4 = educ_a.4,
         educ_orig_a.5 = educ_a.5,
         across(starts_with("educ_a"), ~ feduc_alter(.x)),
         across(starts_with("poltalk_a"), ~ fpoltalk(.x)),
         across(starts_with("educ_orig_a"), ~ feduc_alter_orig(.x)),)

#create net data long. With alters in survey ego combinations.
net_data_long <- data_long %>% 
  pivot_longer(col = contains("_a."),
               names_to = c("measure", "alter"),
               names_pattern = "(.+)\\.(.+)",
               values_to = "value"
  ) %>% 
  pivot_wider(names_from = measure,
              values_from = value)

Dyadic and Network data

# Create similarity scores for the alter variables
net_data_long <- net_data_long %>% 
  group_by(nomem_encr, wave) %>% 
  mutate(net_size = n()) %>% #create network size variable
  ungroup() %>% 
  mutate(g_a = g_a - 1, 
         orig_a = forigin_rec_alter(orig_a), #origin recode 
         talk_a = ftalk_rec(talk_a), #talk recode
         work_a = fwork(work_a), #work recode
         rln_a = frl_normalize(x = net_size, y = rl_a), #normalized rl var
         educ_sim = feduc_sim(x = educ, y = educ_a), #educ sim
         educ_dist = feduc_distance(x = educ, y = educ_a), #educ dist
         g_sim = fcat_sim(female, g_a), #gender sim
         age_sim = fage_sim(x = age_rec, y = age_a), #age sim
         age_dist = fage_dis(x = age_rec, y = age_a), #age distance
         orig_sim = fcat_sim(x = origin, y = orig_a), #origin sim
         ave_sim = (g_sim + age_sim)/2,
         rll_a = rl_a,
         rl_a = ifelse(rl_a == 1, 1, 0)) #ave sim

#Network measurs
net_data_list <- net_data_long %>% 
  group_split(nomem_encr, wave)

# paralellize the estimation
numCores <- detectCores()
registerDoParallel(core=numCores-1)

#output list
output <- list()
output <- foreach(i = 1:length(net_data_list),
        .packages = c("tidyverse"),
        .combine = rbind) %dopar% {#i =1 
    df <- net_data_list[[i]]
    
    #create ei index
    net <- as.vector(t(as.numeric(df$educ_a)))
    ego <- as.vector(t(df[1, 2]))
    
    output[[i]] <- df %>% 
      mutate(ei_educ = fEIindex(x = net, y = ego))
}
#stop parralellization
stopImplicitCluster()

#set all variables to numeric and reset labels.
net_data_result <- output

#extract ego data
ego_data <- net_data_result %>% 
  select(nomem_encr, 
         wave,
         educ,
         educ_orig,
         age,
         age_rec,
         female, 
         work,
         origin,
         inc_ln,
         inc_diff,
         burgstat,
         married,
         eu,
         cult_inc,
         cult,
         ei_educ) %>% 
  distinct()

#extract alter data
alter_data <- net_data_result %>% 
  mutate(across(.cols = 2:46,
                .fns = ~ as.numeric(x = .))) %>% 
  pivot_wider(id_cols = c("nomem_encr", "wave"),
              names_from = "alter",
              values_from = c(contains("_a"),
                              contains("_dist"),
                              contains("_sim")),
              names_sep = ".")


#combine ego and alter data
mlsem_data <- ego_data %>% 
  left_join(alter_data, by = c("nomem_encr", "wave"))

#create wide file
mlsem_data <- mlsem_data %>% 
  pivot_wider(id_cols = "nomem_encr",
              names_from = "wave",
              values_from = 3:117,
              names_sep = "_")

Household selection and data export

# Household ID selection
# Based on IDS that were selected using the following code. 
# CAVEAT: unfortunately the random generator I used did not respond to the set.seed() function
# #select 
# df <- data_long  %>% 
#   select(nomem_encr, nohouse_encr) %>% 
#   distinct() %>% 
#   na.omit() 
# 
# #rename collumn into x
# names(df)[2] <- "x"
# 
# #randomly select only one respondent per hh. 
# df$Chosen <- 0
# 
# #first set the seed so we can reproduce the outcomes.  
# set.seed(50)
# 
# #apply 
# df[-tapply(-seq_along(df$x),df$x, sample, size=1),]$Chosen <- 1
# 
# #so finally we select 6728 people.
# table(df$Chosen)

# In order to exactly replicate the findings please load the ids_analysis.rds file.
load(file = "data/data-processed/ml_sem_data/ids_analysis.rds")

#complete data
mlsem_data_compl <- mlsem_data

#selection of data
mlsem_data <- mlsem_data %>%
  filter(nomem_encr %in% sample_ids$nomem_encr)

#save in list
mlsem_datafiles <- list(mlsem_data_compl,
     mlsem_data)

#export data
save(mlsem_datafiles,
     file = "data/data-processed/ml_sem_data/240816_lisscdn-mlsem-panel-data-cleaned.Rdata")
LS0tDQp0aXRsZTogIlJJQ0xQTSBkYXRhcHJlcCINCmF1dGhvcjogIlRoaWptZW4gSmVyb2Vuc2UiDQpkYXRlOiAiTGFzdCBjb21waWxlZCBvbiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNhY2hlID0gVFJVRSwNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIHJlc3VsdHMgPSAiYXNpcyIsDQogIGZpZy5hbGlnbiA9ICJjZW50ZXIiDQopDQpgYGANCg0KIyBHb2FsDQoNCkZpbmFsIGRhdGEgcHJlcGFyYXRpb24gZm9yIFJJLUNMUE0gYW5hbHlzaXMuIA0KDQojIFNldCB1cCBhbmQgZGF0YSBpbXBvcnQNCg0KYGBge3IgcGFja2FnZXMgYW5kIGRhdGF9DQojbG9hZCBwYWNrYWdlcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRvUGFyYWxsZWwpDQpsaWJyYXJ5KHBhcmFsbGVsKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KDQojZGlzYWJsZSB0aGUgc2NpZW50aWZpYyBub3RhdGlvbiBpbiBSIChlbHNlIGFsbCB0aGUgaWQncyB3aWxsIGJlIGluIHNjaWVudGlmaWMgbm90YXRpb24pDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCg0KI0RhdGEgaW1wb3J0DQpsb2FkKCJkYXRhL2RhdGEtcHJvY2Vzc2VkL2xpc3NjZG5fY2wtcmVhZHlfMjQwODE2LlJkYXRhIikNCmBgYA0KDQojIyBEZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdXNlZA0KDQpgYGB7ciBmdW5jdGlvbnN9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9ucyBmb3IgcmVjb2Rpbmcgb2YgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIyANCiNmdW5jdGlvbiB0byByZWNvZGUgZWR1Y2F0aW9uIGludG8gZWR1Y2F0aW9uIHllYXJzIA0KZmVkdWNfZWdvIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeDIgPC0gaWZlbHNlKHggPT0gMSwgNiwgeCkNCiAgeDMgPC0gaWZlbHNlKHggPT0gMiwgMTAsIHgyKQ0KICB4NCA8LSBpZmVsc2UoeCA9PSAzLCAxMS41LCB4MykNCiAgeDUgPC0gaWZlbHNlKHggPT0gNCwgMTAuNSwgeDQpDQogIHg2IDwtIGlmZWxzZSh4ID09IDUsIDE1LCB4NSkNCiAgeDcgPC0gaWZlbHNlKHggPT0gNiwgMTYsIHg2KQ0KICB4OCA8LSBpZmVsc2UoeCA9PSA3LCBOQSwgeDcpDQogIHg5IDwtIGlmZWxzZSh4ID09IDgsIDQsIHg4KQ0KICB4MTAgPC0gaWZlbHNlKHggPT0gOSwgMCwgeDkpDQogIHJldHVybih4MTApDQp9DQoNCmZlZHVjX2FsdGVyIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeDIgPC0gaWZlbHNlKHggPT0gMSwgNCwgeCkNCiAgeDMgPC0gaWZlbHNlKHggPT0gMiwgNiwgeDIpDQogIHg0IDwtIGlmZWxzZSh4ID09IDMsIDEwLCB4MykNCiAgeDUgPC0gaWZlbHNlKHggPT0gNCwgMTEuNSwgeDQpDQogIHg2IDwtIGlmZWxzZSh4ID09IDUsIDEwLjUsIHg1KQ0KICB4NyA8LSBpZmVsc2UoeCA9PSA2LCAxNSwgeDYpDQogIHg4PC0gaWZlbHNlKHggPT0gNywgMTYsIHg3KQ0KICByZXR1cm4oeDgpDQp9DQoNCmZlZHVjX2FsdGVyX29yaWcgPC0gZnVuY3Rpb24oeCkgew0KICB4MSA8LSBpZmVsc2UoeCA9PSA0LCA1LCB4KQ0KICB4MiA8LSBpZmVsc2UoeCA9PSA1LCA0LCB4MSkNCiAgcmV0dXJuKHgyKQ0KfQ0KDQojcG9sdGFsayByZXZlcnNlIGNvZGUNCmZwb2x0YWxrIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeSA8LSA3IC0geA0KICByZXR1cm4oeSkNCn0NCg0KI2NyZWF0ZSBmdW5jdGlvbiBmb3Igc2ltaWxhcml0eSBzY29yZSAobnVtZXJpY2FsIHZhcmlhYmxlcykgKHNlZSBSc2llbmEgTWFudWFsKQ0KZmVkdWNfc2ltIDwtIGZ1bmN0aW9uICh4LHkpIHsNCiAgcmVzdWx0IDwtIDEgLSAoYWJzKHggLSB5KS8xMikNCiAgcmV0dXJuKHJlc3VsdCkNCn0NCg0KI2NyZWF0ZSBmdW5jdGlvbg0KZmNhdF9zaW0gPC0gZnVuY3Rpb24gKHgseSkgew0KICByZXN1bHQgPC0gMSAtIChhYnMoeCAtIHkpLzEpDQogIHJldHVybihyZXN1bHQpDQp9DQoNCiNyZWNvZGUgdGhlIGFnZSBvZiBlZ28gaW50byB0aGUgc2FtZSBjYXRlZ29yaWVzIGFzIHRoZSBjb25maWRhbnQuDQpmYWdlX3JlYyA8LSBmdW5jdGlvbiAoeCkgew0KICB5IDwtIGlmZWxzZSh4IDwgMTYsIDEsIHgpDQogIHkgPC0gaWZlbHNlKHggPiAxNSAmIHggPCAyMSwgMiwgeSkNCiAgeSA8LSBpZmVsc2UoeCA+IDIwICYgeCA8IDI2LCAzLCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gMjUgJiB4IDwgMzEsIDQsIHkpDQogIHkgPC0gaWZlbHNlKHggPiAzMCAmIHggPCAzNiwgNSwgeSkNCiAgeSA8LSBpZmVsc2UoeCA+IDM1ICYgeCA8IDQxLCA2LCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gNDAgJiB4IDwgNDYsIDcsIHkpDQogIHkgPC0gaWZlbHNlKHggPiA0NSAmIHggPCA1MSwgOCwgeSkNCiAgeSA8LSBpZmVsc2UoeCA+IDUwICYgeCA8IDU2LCA5LCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gNTUgJiB4IDwgNjEsIDEwLCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gNjAgJiB4IDwgNjYsIDExLCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gNjUgJiB4IDwgNzEsIDEyLCB5KQ0KICB5IDwtIGlmZWxzZSh4ID4gNzAsIDEzLCB5KQ0KICByZXR1cm4oeSkNCn0NCg0KI2NyZWF0ZSBmdW5jdGlvbg0KZmFnZV9zaW0gPC0gZnVuY3Rpb24gKHgseSkgew0KICByZXN1bHQgPC0gMSAtIChhYnMoeCAtIHkpLzEzKQ0KICByZXR1cm4ocmVzdWx0KQ0KfQ0KDQoNCiNyZWNvZGUgZnVuY3Rpb25zDQpmb3JpZ2luX3JlY19hbHRlciA8LSBmdW5jdGlvbih4KSB7DQogIHkgPC0gaWZlbHNlKCh4ID4gMSkgJiAoeCA8IDgpLCAwLCAxKQ0KfQ0KDQpmb3JpZ2luX3JlY19lZ28gPC0gZnVuY3Rpb24oeCkgew0KICB5IDwtIGlmZWxzZSh4ID09IDAsIDEsIHgpDQogIHkgPC0gaWZlbHNlKHggPT0gMjAxIHwgeCA9PSAxMDEsIDEsIHkpDQogIHkgPC0gaWZlbHNlKHggPT0gMTAyIHwgeCA9PSAyMDIsIDAsIHkpDQp9DQoNCiNjcmVhdGUgZnVuY3Rpb24gdG8gcmVjb2RlIHRhbGsgYWx0ZXIuIA0KZnRhbGtfcmVjIDwtIGZ1bmN0aW9uKHgpIHsNCiAgeSA8LSBpZmVsc2UoeCA9PSA1LCBOQSwgeCkNCiAgeiA8LSA0IC0geQ0KICByZXR1cm4oeikNCn0NCg0KI2NyZWF0ZSBmdW5jdGlvbiBmb3Igc2ltaWxhcml0eSBzY29yZSAobnVtZXJpY2FsIHZhcmlhYmxlcykgKHNlZSBSc2llbmEgTWFudWFsKQ0KZmVkdWNfc2ltIDwtIGZ1bmN0aW9uICh4LHkpIHsNCiAgcmVzdWx0IDwtIDEgLSAoYWJzKHggLSB5KS8xMikNCiAgcmV0dXJuKHJlc3VsdCkNCn0NCg0KI2NyZWF0ZSBkaXN0YW5jZSBmdW5jdGlvbi4gSSB3aWxsIHN1YnRyYWN0IGFsdGVyIGZyb20gZWdvLiANCmZlZHVjX2Rpc3RhbmNlIDwtIGZ1bmN0aW9uKHgseSkgew0KICB6IDwtIHkgLSB4DQogIHJldHVybih6KQ0KfQ0KDQojY3JlYXRlIGNhdGVnb3JpY2FsIHNpbWlsYXJpdHkgZnVuY3Rpb24NCmZjYXRfc2ltIDwtIGZ1bmN0aW9uICh4LHkpIHsNCiAgcmVzdWx0IDwtIDEgLSAoYWJzKHggLSB5KS8xKQ0KICByZXR1cm4ocmVzdWx0KQ0KfQ0KDQojY3JlYXRlIGZ1bmN0aW9uDQpmYWdlX3NpbSA8LSBmdW5jdGlvbiAoeCx5KSB7DQogIHJlc3VsdCA8LSAxIC0gKGFicyh4IC0geSkvMTMpDQogIHJldHVybihyZXN1bHQpDQp9DQoNCiNhZ2UgZGlzdGFuY2UgZnVuY3Rpb24uIFN1YnRyYWN0IHRoZSBzY29yZSBvZiB4IGZyb20geS4gU28gaWYgeSBpcyBsb3dlciB0aGUgc2NvcmUgaXMgbmVnYXRpdmUuIA0KZmFnZV9kaXMgPC0gZnVuY3Rpb24oeCx5KXsNCiAgcmVzdWx0IDwtIHkgLSB4DQogIHJldHVybihyZXN1bHQpDQp9DQoNCiNjcmVhdGUgZnVuY3Rpb24uIA0KI3JsIHRpbWVzIHJlY2lwcm9jYWwgb2YgbiAobnVtYmVyIG9mIHdhdmVzIHJlc3BvbmRlbnQgaXMgaW47IG1vcmUgd2F2ZXMgbW9yZSBjaGFuY2UgZm9yIGFsdGVyIHRvIHBvcCB1cC4NCmZybF9ub3JtYWxpemUgPC0gZnVuY3Rpb24oeCx5KSB7DQogIHogPC0gKDEveCkqeQ0KICByZXR1cm4oeikNCn0NCg0KI3dvcmsgcmVjb2RlDQpmd29yayA8LSBmdW5jdGlvbih4KXsgDQogIGlmZWxzZSh4IDwgMywgMSwgMCl9DQoNCg0KI0Z1bmN0aW9uIGZvciBFSSBpbmRleCBvZiBzZWdyZWdhdGlvbi4gDQpmRUlpbmRleCA8LSBmdW5jdGlvbih4LCB5KXsobGVuZ3RoKHhbIWlzLm5hKHgpICYgeCA9PSB5XSkgLSBsZW5ndGgoeFshaXMubmEoeCkgJiB4IT15XSkpL2xlbmd0aCh4WyFpcy5uYSh4KV0pfQ0KDQpgYGANCg0KIyBEYXRhIHByZXBlcmF0aW9uDQoNCiMjIFRyYW5zZm9ybSBkYXRhDQoNCmBgYHtyIGRhdGEgdHJhbnNmb3JtYXRpb259DQojRWdvIENvbnRyb2wgdmFyaWFibGVzLg0KZGF0YV9sb25nIDwtIGRhdGFfbG9uZyAlPiUNCiAgbXV0YXRlKGZlbWFsZSA9IGdlbmRlciAtIDEsICNjcmVhdGUgZmVtYWxlIGR1bW15DQogICAgICAgICB3b3JrID0gaWZlbHNlKGJlbGJlemlnIDwgNCwgMSwgMCksICNjcmVhdGUgcGFpZHdvcmsNCiAgICAgICAgIG1hcnJpZWQgPSBpZmVsc2UoYnVyZ3N0YXQgPT0gMSwgMSwgMCksICNjcmVhdGUgbWFycmllZCBkdW1teQ0KICAgICAgICAgZWR1Y19vcmlnID0gZWR1YywgI3NhdmUgb2xkIGVkdWNhdGlvbiBjb2RpbmcNCiAgICAgICAgIGVkdWMgPSBmZWR1Y19lZ28oZWR1YyksICNjaGFuZ2UgZWR1YyBjb2RpbmcNCiAgICAgICAgIGluY19sbiA9IGxvZyhpbmNfbG4gKyAxKSwgI2xvZyB0cmFuc2Zvcm0NCiAgICAgICAgIHVyYmFuID0gNSAtIHVyYmFuLCAjcmV2ZXJzZSBjb2RpbmcNCiAgICAgICAgIGN1bHQgPSA1IC0gY3VsdF9pbmMsICNyZXZlcnNlIGNvZGluZw0KICAgICAgICAgZXUgPSA1IC0gZXUsICNyZXZlcnNlIGNvZGluZw0KICAgICAgICAgaW5jX2RpZmYgPSBpbmNfZGlmZiAtIDEsDQogICAgICAgICBhZ2VfcmVjID0gZmFnZV9yZWMoYWdlKSwNCiAgICAgICAgIG9yaWdpbiA9IGZvcmlnaW5fcmVjX2VnbyhvcmlnaW4pKSAjcmV2ZXJzZSBjb2RpbmcNCg0KI2FsdGVyIHZhcmlhYmxlcw0KZGF0YV9sb25nIDwtIGRhdGFfbG9uZyAlPiUNCiAgbXV0YXRlKGVkdWNfb3JpZ19hLjEgPSBlZHVjX2EuMSwNCiAgICAgICAgIGVkdWNfb3JpZ19hLjIgPSBlZHVjX2EuMiwNCiAgICAgICAgIGVkdWNfb3JpZ19hLjMgPSBlZHVjX2EuMywNCiAgICAgICAgIGVkdWNfb3JpZ19hLjQgPSBlZHVjX2EuNCwNCiAgICAgICAgIGVkdWNfb3JpZ19hLjUgPSBlZHVjX2EuNSwNCiAgICAgICAgIGFjcm9zcyhzdGFydHNfd2l0aCgiZWR1Y19hIiksIH4gZmVkdWNfYWx0ZXIoLngpKSwNCiAgICAgICAgIGFjcm9zcyhzdGFydHNfd2l0aCgicG9sdGFsa19hIiksIH4gZnBvbHRhbGsoLngpKSwNCiAgICAgICAgIGFjcm9zcyhzdGFydHNfd2l0aCgiZWR1Y19vcmlnX2EiKSwgfiBmZWR1Y19hbHRlcl9vcmlnKC54KSksKQ0KDQojY3JlYXRlIG5ldCBkYXRhIGxvbmcuIFdpdGggYWx0ZXJzIGluIHN1cnZleSBlZ28gY29tYmluYXRpb25zLg0KbmV0X2RhdGFfbG9uZyA8LSBkYXRhX2xvbmcgJT4lIA0KICBwaXZvdF9sb25nZXIoY29sID0gY29udGFpbnMoIl9hLiIpLA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSBjKCJtZWFzdXJlIiwgImFsdGVyIiksDQogICAgICAgICAgICAgICBuYW1lc19wYXR0ZXJuID0gIiguKylcXC4oLispIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJ2YWx1ZSINCiAgKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBtZWFzdXJlLA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHZhbHVlKQ0KYGBgDQoNCiMjIER5YWRpYyBhbmQgTmV0d29yayBkYXRhDQoNCmBgYHtyIGR5YWRpYyBhbmQgbmV0d29yayBkYXRhfQ0KDQojIENyZWF0ZSBzaW1pbGFyaXR5IHNjb3JlcyBmb3IgdGhlIGFsdGVyIHZhcmlhYmxlcw0KbmV0X2RhdGFfbG9uZyA8LSBuZXRfZGF0YV9sb25nICU+JSANCiAgZ3JvdXBfYnkobm9tZW1fZW5jciwgd2F2ZSkgJT4lIA0KICBtdXRhdGUobmV0X3NpemUgPSBuKCkpICU+JSAjY3JlYXRlIG5ldHdvcmsgc2l6ZSB2YXJpYWJsZQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoZ19hID0gZ19hIC0gMSwgDQogICAgICAgICBvcmlnX2EgPSBmb3JpZ2luX3JlY19hbHRlcihvcmlnX2EpLCAjb3JpZ2luIHJlY29kZSANCiAgICAgICAgIHRhbGtfYSA9IGZ0YWxrX3JlYyh0YWxrX2EpLCAjdGFsayByZWNvZGUNCiAgICAgICAgIHdvcmtfYSA9IGZ3b3JrKHdvcmtfYSksICN3b3JrIHJlY29kZQ0KICAgICAgICAgcmxuX2EgPSBmcmxfbm9ybWFsaXplKHggPSBuZXRfc2l6ZSwgeSA9IHJsX2EpLCAjbm9ybWFsaXplZCBybCB2YXINCiAgICAgICAgIGVkdWNfc2ltID0gZmVkdWNfc2ltKHggPSBlZHVjLCB5ID0gZWR1Y19hKSwgI2VkdWMgc2ltDQogICAgICAgICBlZHVjX2Rpc3QgPSBmZWR1Y19kaXN0YW5jZSh4ID0gZWR1YywgeSA9IGVkdWNfYSksICNlZHVjIGRpc3QNCiAgICAgICAgIGdfc2ltID0gZmNhdF9zaW0oZmVtYWxlLCBnX2EpLCAjZ2VuZGVyIHNpbQ0KICAgICAgICAgYWdlX3NpbSA9IGZhZ2Vfc2ltKHggPSBhZ2VfcmVjLCB5ID0gYWdlX2EpLCAjYWdlIHNpbQ0KICAgICAgICAgYWdlX2Rpc3QgPSBmYWdlX2Rpcyh4ID0gYWdlX3JlYywgeSA9IGFnZV9hKSwgI2FnZSBkaXN0YW5jZQ0KICAgICAgICAgb3JpZ19zaW0gPSBmY2F0X3NpbSh4ID0gb3JpZ2luLCB5ID0gb3JpZ19hKSwgI29yaWdpbiBzaW0NCiAgICAgICAgIGF2ZV9zaW0gPSAoZ19zaW0gKyBhZ2Vfc2ltKS8yLA0KICAgICAgICAgcmxsX2EgPSBybF9hLA0KICAgICAgICAgcmxfYSA9IGlmZWxzZShybF9hID09IDEsIDEsIDApKSAjYXZlIHNpbQ0KDQojTmV0d29yayBtZWFzdXJzDQpuZXRfZGF0YV9saXN0IDwtIG5ldF9kYXRhX2xvbmcgJT4lIA0KICBncm91cF9zcGxpdChub21lbV9lbmNyLCB3YXZlKQ0KDQojIHBhcmFsZWxsaXplIHRoZSBlc3RpbWF0aW9uDQpudW1Db3JlcyA8LSBkZXRlY3RDb3JlcygpDQpyZWdpc3RlckRvUGFyYWxsZWwoY29yZT1udW1Db3Jlcy0xKQ0KDQojb3V0cHV0IGxpc3QNCm91dHB1dCA8LSBsaXN0KCkNCm91dHB1dCA8LSBmb3JlYWNoKGkgPSAxOmxlbmd0aChuZXRfZGF0YV9saXN0KSwNCiAgICAgICAgLnBhY2thZ2VzID0gYygidGlkeXZlcnNlIiksDQogICAgICAgIC5jb21iaW5lID0gcmJpbmQpICVkb3BhciUgeyNpID0xIA0KICAgIGRmIDwtIG5ldF9kYXRhX2xpc3RbW2ldXQ0KICAgIA0KICAgICNjcmVhdGUgZWkgaW5kZXgNCiAgICBuZXQgPC0gYXMudmVjdG9yKHQoYXMubnVtZXJpYyhkZiRlZHVjX2EpKSkNCiAgICBlZ28gPC0gYXMudmVjdG9yKHQoZGZbMSwgMl0pKQ0KICAgIA0KICAgIG91dHB1dFtbaV1dIDwtIGRmICU+JSANCiAgICAgIG11dGF0ZShlaV9lZHVjID0gZkVJaW5kZXgoeCA9IG5ldCwgeSA9IGVnbykpDQp9DQojc3RvcCBwYXJyYWxlbGxpemF0aW9uDQpzdG9wSW1wbGljaXRDbHVzdGVyKCkNCg0KI3NldCBhbGwgdmFyaWFibGVzIHRvIG51bWVyaWMgYW5kIHJlc2V0IGxhYmVscy4NCm5ldF9kYXRhX3Jlc3VsdCA8LSBvdXRwdXQNCg0KI2V4dHJhY3QgZWdvIGRhdGENCmVnb19kYXRhIDwtIG5ldF9kYXRhX3Jlc3VsdCAlPiUgDQogIHNlbGVjdChub21lbV9lbmNyLCANCiAgICAgICAgIHdhdmUsDQogICAgICAgICBlZHVjLA0KICAgICAgICAgZWR1Y19vcmlnLA0KICAgICAgICAgYWdlLA0KICAgICAgICAgYWdlX3JlYywNCiAgICAgICAgIGZlbWFsZSwgDQogICAgICAgICB3b3JrLA0KICAgICAgICAgb3JpZ2luLA0KICAgICAgICAgaW5jX2xuLA0KICAgICAgICAgaW5jX2RpZmYsDQogICAgICAgICBidXJnc3RhdCwNCiAgICAgICAgIG1hcnJpZWQsDQogICAgICAgICBldSwNCiAgICAgICAgIGN1bHRfaW5jLA0KICAgICAgICAgY3VsdCwNCiAgICAgICAgIGVpX2VkdWMpICU+JSANCiAgZGlzdGluY3QoKQ0KDQojZXh0cmFjdCBhbHRlciBkYXRhDQphbHRlcl9kYXRhIDwtIG5ldF9kYXRhX3Jlc3VsdCAlPiUgDQogIG11dGF0ZShhY3Jvc3MoLmNvbHMgPSAyOjQ2LA0KICAgICAgICAgICAgICAgIC5mbnMgPSB+IGFzLm51bWVyaWMoeCA9IC4pKSkgJT4lIA0KICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygibm9tZW1fZW5jciIsICJ3YXZlIiksDQogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiYWx0ZXIiLA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoY29udGFpbnMoIl9hIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucygiX2Rpc3QiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zKCJfc2ltIikpLA0KICAgICAgICAgICAgICBuYW1lc19zZXAgPSAiLiIpDQoNCg0KI2NvbWJpbmUgZWdvIGFuZCBhbHRlciBkYXRhDQptbHNlbV9kYXRhIDwtIGVnb19kYXRhICU+JSANCiAgbGVmdF9qb2luKGFsdGVyX2RhdGEsIGJ5ID0gYygibm9tZW1fZW5jciIsICJ3YXZlIikpDQoNCiNjcmVhdGUgd2lkZSBmaWxlDQptbHNlbV9kYXRhIDwtIG1sc2VtX2RhdGEgJT4lIA0KICBwaXZvdF93aWRlcihpZF9jb2xzID0gIm5vbWVtX2VuY3IiLA0KICAgICAgICAgICAgICBuYW1lc19mcm9tID0gIndhdmUiLA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IDM6MTE3LA0KICAgICAgICAgICAgICBuYW1lc19zZXAgPSAiXyIpDQoNCmBgYA0KDQojIyBIb3VzZWhvbGQgc2VsZWN0aW9uIGFuZCBkYXRhIGV4cG9ydA0KDQpgYGB7ciBoaCBzZWwgYW5kIGV4cG9ydH0NCg0KIyBIb3VzZWhvbGQgSUQgc2VsZWN0aW9uDQojIEJhc2VkIG9uIElEUyB0aGF0IHdlcmUgc2VsZWN0ZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlLiANCiMgQ0FWRUFUOiB1bmZvcnR1bmF0ZWx5IHRoZSByYW5kb20gZ2VuZXJhdG9yIEkgdXNlZCBkaWQgbm90IHJlc3BvbmQgdG8gdGhlIHNldC5zZWVkKCkgZnVuY3Rpb24NCiMgI3NlbGVjdCANCiMgZGYgPC0gZGF0YV9sb25nICAlPiUgDQojICAgc2VsZWN0KG5vbWVtX2VuY3IsIG5vaG91c2VfZW5jcikgJT4lIA0KIyAgIGRpc3RpbmN0KCkgJT4lIA0KIyAgIG5hLm9taXQoKSANCiMgDQojICNyZW5hbWUgY29sbHVtbiBpbnRvIHgNCiMgbmFtZXMoZGYpWzJdIDwtICJ4Ig0KIyANCiMgI3JhbmRvbWx5IHNlbGVjdCBvbmx5IG9uZSByZXNwb25kZW50IHBlciBoaC4gDQojIGRmJENob3NlbiA8LSAwDQojIA0KIyAjZmlyc3Qgc2V0IHRoZSBzZWVkIHNvIHdlIGNhbiByZXByb2R1Y2UgdGhlIG91dGNvbWVzLiAgDQojIHNldC5zZWVkKDUwKQ0KIyANCiMgI2FwcGx5IA0KIyBkZlstdGFwcGx5KC1zZXFfYWxvbmcoZGYkeCksZGYkeCwgc2FtcGxlLCBzaXplPTEpLF0kQ2hvc2VuIDwtIDENCiMgDQojICNzbyBmaW5hbGx5IHdlIHNlbGVjdCA2NzI4IHBlb3BsZS4NCiMgdGFibGUoZGYkQ2hvc2VuKQ0KDQojIEluIG9yZGVyIHRvIGV4YWN0bHkgcmVwbGljYXRlIHRoZSBmaW5kaW5ncyBwbGVhc2UgbG9hZCB0aGUgaWRzX2FuYWx5c2lzLnJkcyBmaWxlLg0KbG9hZChmaWxlID0gImRhdGEvZGF0YS1wcm9jZXNzZWQvbWxfc2VtX2RhdGEvaWRzX2FuYWx5c2lzLnJkcyIpDQoNCiNjb21wbGV0ZSBkYXRhDQptbHNlbV9kYXRhX2NvbXBsIDwtIG1sc2VtX2RhdGENCg0KI3NlbGVjdGlvbiBvZiBkYXRhDQptbHNlbV9kYXRhIDwtIG1sc2VtX2RhdGEgJT4lDQogIGZpbHRlcihub21lbV9lbmNyICVpbiUgc2FtcGxlX2lkcyRub21lbV9lbmNyKQ0KDQojc2F2ZSBpbiBsaXN0DQptbHNlbV9kYXRhZmlsZXMgPC0gbGlzdChtbHNlbV9kYXRhX2NvbXBsLA0KICAgICBtbHNlbV9kYXRhKQ0KDQojZXhwb3J0IGRhdGENCnNhdmUobWxzZW1fZGF0YWZpbGVzLA0KICAgICBmaWxlID0gImRhdGEvZGF0YS1wcm9jZXNzZWQvbWxfc2VtX2RhdGEvMjQwODE2X2xpc3NjZG4tbWxzZW0tcGFuZWwtZGF0YS1jbGVhbmVkLlJkYXRhIikNCmBgYA0K


Copyright © 2024 Jeroense Thijmen