knitr::opts_chunk$set(echo = TRUE)
knitr::opts_chunk$set(warn = FALSE)
knitr::opts_chunk$set(include = TRUE)
knitr::opts_knit$set(root.dir = "/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/")
options(scipen=999)

rm(list = ls())

# load packages
library(emmeans)
library(dplyr)
library(ggplot2)
library(ggpubr)
library(ggthemes)
library(afex)

filter <- dplyr::filter
select <- dplyr::select
rename <- dplyr::rename
library(dplyr)
library(readr)
library(purrr)
library(readxl)
library(stringr)
# Define the path to the parent folder containing the subfolders
parent_folder_path <-
  "/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/volBrain/HIPS"

# List all CSV files in the parent folder and its subfolders
csv_files <- NULL
csv_files <-
  list.files(
    path = parent_folder_path,
    pattern = glob2rx("report*.csv"),
    recursive = TRUE,
    full.names = TRUE
  )

# Read each CSV file and store its data as a separate data frame in a list
data_list <-
  map(csv_files,
      ~ read.csv(
        .x,
        sep = ";",
        stringsAsFactors = FALSE,
        check.names = FALSE
      ))

# Combine all the data frames into a single data frame, stacking them vertically
volBrain_Combined_df <- bind_rows(data_list)

all_subject_ids <-
  read.csv(
    "/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/volBrain/HIPS/_volBrain HIPS log.csv",
    stringsAsFactors = FALSE
  )

# Extract the two columns you want to add, but only for the rows matching volBrain_Combined_df
record_id <- all_subject_ids[[5]]#[1:nrow(volBrain_Combined_df)]

# Add the new columns to the volBrain_Combined_df data frame as the first two columns
volBrain_Combined_df <- cbind(record_id, volBrain_Combined_df)

snt_data <-
  read_excel(
    "/Users/sarenseeley/Dropbox/Postdoc/mentoring/Isabella Fonseca/SNT/data/SNT_data/SNT-behavior_n80.xlsx"
  ) %>% rename(record_id = sub_id)
snt_data$record_id <-
  str_replace(snt_data$record_id, "nwtc", "NWTC-")

df <- full_join(volBrain_Combined_df, snt_data, by = "record_id")
df <-
  df %>% filter(!record_id == "NWTC-1172" & !record_id == "NWTC-034")
colnames(df) <- gsub(" ", "_", colnames(df))
colnames(df) <- gsub("%", "pc", colnames(df))


other <- readRDS("data/_cleaned/clean_v2_dataset_2024.rds")
grp <- read.csv("notes/_nwtc_bids_key.csv")[1:97, c(1:3)]
df <- left_join(df, other, by = "record_id")
df <- left_join(df, grp, by = "record_id")
df <-
  df %>% mutate(
    group.use = factor(
      group.use,
      levels = c("Resilient", "Low-exposed", "PTSD"),
      labels = c("Highly resilient", "Lower WTC-exposed", "PTSD"),
      ordered = FALSE
    ),
    health_meds_psych.cns_bin = if_else(health_meds_psych.cns == 0, 0, 1),
    ptsd = if_else(group.use == "PTSD", "PTSD", "NO_PTSD")
  ) %>% rename(meds_allPsych = health_meds_psych.cns,
               meds_allPsych_bin = health_meds_psych.cns_bin)
df$meds_allPsych_bin[df$bids_id == "sub-084"] <-
  1 # zolpidem night before 4pm scan

Group differences

Only valid SNT participants (n=73)

below_50_df <-
  readRDS(
    "/Users/sarenseeley/Dropbox/Postdoc/mentoring/Isabella Fonseca/SNT/isabella_r_scripts/below_50_df.rds"
  ) %>% rename(record_id = sub_id)
drop_ids <-
  c(below_50_df$record_id, "NWTC-034") #excludes NWTC-034 [lots of missing trials]
# long dataset
df_long <-
  df %>% select(
    record_id,
    group.use,
    Sex,
    Age,
    tot_ctq,
    tot_tleq_nonW,
    exposures_count,
    ptsd,
    (contains("_pc") |
       contains("_Asym") |
       contains("_cm3")) &
      !contains("scid")
  ) %>% filter(!record_id %in% drop_ids) #scid pcp shouldn't be included

df_long <- df_long %>%
  tidyr::pivot_longer(
    cols = -c(
      record_id,
      group.use,
      Sex,
      Age,
      tot_ctq,
      tot_tleq_nonW,
      exposures_count,
      ptsd,
      ICV_cm3
    ),
    names_to = "region",
    values_to = "value"
  )
df_long[12:14] <-
  str_split_fixed(df_long$region, "_", 3) # split column into 3 columns, by underscore
df_long <-
  df_long %>% select(!region) %>% rename(region = V1,
                                         lat = V2,
                                         measure = V3) # which subfield, which hemisphere, which metric (cm3, percent, asymmetry index)
df_long1 <-
  df_long %>% filter(!measure == "" &
                       !lat == "total" &
                       measure == "cm3" &
                       !region == "Hippocampus") # don't include total hippocampus
df_long2 <-
  df_long %>% filter(!measure == "" &
                       !lat == "total" &
                       measure == "pc" & !region == "Hippocampus")
df_long2b <-
  df_long %>% filter(!measure == "" &
                       lat == "total" &
                       measure == "pc" )#& !region == "Hippocampus") 
df_long3 <-
  df_long %>% filter(lat == "asymmetry" & !region == "Hippocampus")

Plot: Percent (aka normalized) volume for PTSD vs. No PTSD


ggplot(df_long2b, aes(ptsd, value, fill = region)) +
  stat_summary(
    geom = "col",
    fun = mean,
    position = "dodge",
    color = "black"
  ) +
  stat_summary(
    geom = "errorbar",
    fun.data = mean_se,
    position = position_dodge(.9),
    width = 0.25,
    color = "black"
  )   + theme_clean(base_size=16) + theme(axis.text.x=element_text(angle=45, hjust=1)) + geom_hline(yintercept = 0) + facet_wrap( ~ region, scales = "free") + labs(title =
                                                                                                     "Hippocampal volume (%): subfields and total in PTSD/no PTSD", fill="region")


ggplot(df_long2, aes(ptsd, value, fill = region)) +
  stat_summary(
    geom = "col",
    fun = mean,
    position = "dodge",
    color = "black"
  ) +
  stat_summary(
    geom = "errorbar",
    fun.data = mean_se,
    position = position_dodge(.9),
    width = 0.25,
    color = "black"
  )   + theme_clean(base_size = 10) + theme(axis.text.x=element_text(angle=45, hjust=1)) + geom_hline(yintercept = 0) + facet_wrap( ~ region*lat, scales = "free") + labs(title =
                                                                                                     "Normalized hippocampal volume (%) across subfields, hemispheres, and PTSD/No PTSD", fill="region")

NA
NA
NA

SNT relationships with hippocampal volume

Normalized volume (percent)

SUMMARY: Normalized hippocampal volume in the right CA2-CA3 subfield(s) was positively correlated with mean distance from self (pov_2d_dist_mean_mean and pov_3d_dist_mean_mean), as well as greater neu_2d_angle_mean_mean, r’s = .25-.26, p’s = .029-.032.

library(corrplot)
cordf <-
  df%>% filter(!record_id %in% drop_ids & !is.na(affil_mean_mean)) %>% select(contains("mean_mean"), ends_with("pc") &
                  !contains("scid")) 
cor_result <- Hmisc::rcorr(as.matrix(cordf))
cor_matrix <- cor_result$r  # Correlation matrix
p_matrix <- cor_result$P    # P-values matrix

significant_cor_matrix <- cor_matrix * (p_matrix <= 0.05)

corrplot(
  significant_cor_matrix,
  method = "color",
  tl.col = "black",
  outline = TRUE,
  addrect = TRUE,
  tl.cex = 1,
  title = "p <.05",
  tl.pos  = "ld",
  type = "lower"
)


ggplot(cordf, aes(y=`CA2-CA3_right_pc`, x=pov_2d_dist_mean_mean)) +
    geom_point(size = 1) + theme_clean() + geom_smooth(method = "lm") + labs(title="POV 2D distance mean mean")
`geom_smooth()` using formula = 'y ~ x'

#summary(lm(`CA2-CA3_right_pc` ~ pov_2d_dist_mean_mean,cordf))
cor.test(cordf$`CA2-CA3_right_pc`,cordf$pov_2d_dist_mean_mean)

    Pearson's product-moment correlation

data:  cordf$`CA2-CA3_right_pc` and cordf$pov_2d_dist_mean_mean
t = 2.1886, df = 71, p-value = 0.03192
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.02264018 0.45514063
sample estimates:
     cor 
0.251398 
ggplot(cordf, aes(y=`CA2-CA3_right_pc`, x=pov_3d_dist_mean_mean)) +
    geom_point(size = 1) + theme_clean() + geom_smooth(method = "lm") + labs(title="POV 3D distance mean mean")
`geom_smooth()` using formula = 'y ~ x'

#summary(lm(`CA2-CA3_right_pc` ~ pov_3d_dist_mean_mean,cordf))
cor.test(cordf$`CA2-CA3_right_pc`,cordf$pov_3d_dist_mean_mean)

    Pearson's product-moment correlation

data:  cordf$`CA2-CA3_right_pc` and cordf$pov_3d_dist_mean_mean
t = 2.2311, df = 71, p-value = 0.02883
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.02751381 0.45899852
sample estimates:
      cor 
0.2559608 
ggplot(cordf, aes(y=`CA2-CA3_right_pc`, x=neu_3d_angle_mean_mean)) +
    geom_point(size = 1) + theme_clean() + geom_smooth(method = "lm") + labs(title="Neutral 3D angle mean mean") 
`geom_smooth()` using formula = 'y ~ x'

#summary(lm(`CA2-CA3_right_pc` ~ neu_3d_angle_mean_mean,cordf))
cor.test(cordf$`CA2-CA3_right_pc`,cordf$neu_3d_angle_mean_mean)

    Pearson's product-moment correlation

data:  cordf$`CA2-CA3_right_pc` and cordf$neu_3d_angle_mean_mean
t = 2.2014, df = 71, p-value = 0.03096
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.02410572 0.45630244
sample estimates:
      cor 
0.2527711 
LS0tCnRpdGxlOiAiSGlwcG9jYW1wYWwgdm9sdW1lIgphdXRob3I6ICJTYXJlbiBILiBTZWVsZXkiCmRhdGU6ICcnCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPVRSVUV9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm4gPSBGQUxTRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGluY2x1ZGUgPSBUUlVFKQprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9Qb3N0ZG9jL253dGNfc3R1ZHkvIikKb3B0aW9ucyhzY2lwZW49OTk5KQoKcm0obGlzdCA9IGxzKCkpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGFmZXgpCgpmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdApyZW5hbWUgPC0gZHBseXI6OnJlbmFtZQpgYGAKCmBgYHtyLCBlcnJvcj1GQUxTRSxlY2hvPVRSVUV9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHN0cmluZ3IpCiMgRGVmaW5lIHRoZSBwYXRoIHRvIHRoZSBwYXJlbnQgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIHN1YmZvbGRlcnMKcGFyZW50X2ZvbGRlcl9wYXRoIDwtCiAgIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L1Bvc3Rkb2Mvbnd0Y19zdHVkeS9kYXRhL3ZvbEJyYWluL0hJUFMiCgojIExpc3QgYWxsIENTViBmaWxlcyBpbiB0aGUgcGFyZW50IGZvbGRlciBhbmQgaXRzIHN1YmZvbGRlcnMKY3N2X2ZpbGVzIDwtIE5VTEwKY3N2X2ZpbGVzIDwtCiAgbGlzdC5maWxlcygKICAgIHBhdGggPSBwYXJlbnRfZm9sZGVyX3BhdGgsCiAgICBwYXR0ZXJuID0gZ2xvYjJyeCgicmVwb3J0Ki5jc3YiKSwKICAgIHJlY3Vyc2l2ZSA9IFRSVUUsCiAgICBmdWxsLm5hbWVzID0gVFJVRQogICkKCiMgUmVhZCBlYWNoIENTViBmaWxlIGFuZCBzdG9yZSBpdHMgZGF0YSBhcyBhIHNlcGFyYXRlIGRhdGEgZnJhbWUgaW4gYSBsaXN0CmRhdGFfbGlzdCA8LQogIG1hcChjc3ZfZmlsZXMsCiAgICAgIH4gcmVhZC5jc3YoCiAgICAgICAgLngsCiAgICAgICAgc2VwID0gIjsiLAogICAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSwKICAgICAgICBjaGVjay5uYW1lcyA9IEZBTFNFCiAgICAgICkpCgojIENvbWJpbmUgYWxsIHRoZSBkYXRhIGZyYW1lcyBpbnRvIGEgc2luZ2xlIGRhdGEgZnJhbWUsIHN0YWNraW5nIHRoZW0gdmVydGljYWxseQp2b2xCcmFpbl9Db21iaW5lZF9kZiA8LSBiaW5kX3Jvd3MoZGF0YV9saXN0KQoKYWxsX3N1YmplY3RfaWRzIDwtCiAgcmVhZC5jc3YoCiAgICAiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvUG9zdGRvYy9ud3RjX3N0dWR5L2RhdGEvdm9sQnJhaW4vSElQUy9fdm9sQnJhaW4gSElQUyBsb2cuY3N2IiwKICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQogICkKCiMgRXh0cmFjdCB0aGUgdHdvIGNvbHVtbnMgeW91IHdhbnQgdG8gYWRkLCBidXQgb25seSBmb3IgdGhlIHJvd3MgbWF0Y2hpbmcgdm9sQnJhaW5fQ29tYmluZWRfZGYKcmVjb3JkX2lkIDwtIGFsbF9zdWJqZWN0X2lkc1tbNV1dI1sxOm5yb3codm9sQnJhaW5fQ29tYmluZWRfZGYpXQoKIyBBZGQgdGhlIG5ldyBjb2x1bW5zIHRvIHRoZSB2b2xCcmFpbl9Db21iaW5lZF9kZiBkYXRhIGZyYW1lIGFzIHRoZSBmaXJzdCB0d28gY29sdW1ucwp2b2xCcmFpbl9Db21iaW5lZF9kZiA8LSBjYmluZChyZWNvcmRfaWQsIHZvbEJyYWluX0NvbWJpbmVkX2RmKQoKc250X2RhdGEgPC0KICByZWFkX2V4Y2VsKAogICAgIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L1Bvc3Rkb2MvbWVudG9yaW5nL0lzYWJlbGxhIEZvbnNlY2EvU05UL2RhdGEvU05UX2RhdGEvU05ULWJlaGF2aW9yX244MC54bHN4IgogICkgJT4lIHJlbmFtZShyZWNvcmRfaWQgPSBzdWJfaWQpCnNudF9kYXRhJHJlY29yZF9pZCA8LQogIHN0cl9yZXBsYWNlKHNudF9kYXRhJHJlY29yZF9pZCwgIm53dGMiLCAiTldUQy0iKQoKZGYgPC0gZnVsbF9qb2luKHZvbEJyYWluX0NvbWJpbmVkX2RmLCBzbnRfZGF0YSwgYnkgPSAicmVjb3JkX2lkIikKZGYgPC0KICBkZiAlPiUgZmlsdGVyKCFyZWNvcmRfaWQgPT0gIk5XVEMtMTE3MiIgJiAhcmVjb3JkX2lkID09ICJOV1RDLTAzNCIpCmNvbG5hbWVzKGRmKSA8LSBnc3ViKCIgIiwgIl8iLCBjb2xuYW1lcyhkZikpCmNvbG5hbWVzKGRmKSA8LSBnc3ViKCIlIiwgInBjIiwgY29sbmFtZXMoZGYpKQoKCm90aGVyIDwtIHJlYWRSRFMoImRhdGEvX2NsZWFuZWQvY2xlYW5fdjJfZGF0YXNldF8yMDI0LnJkcyIpCmdycCA8LSByZWFkLmNzdigibm90ZXMvX253dGNfYmlkc19rZXkuY3N2IilbMTo5NywgYygxOjMpXQpkZiA8LSBsZWZ0X2pvaW4oZGYsIG90aGVyLCBieSA9ICJyZWNvcmRfaWQiKQpkZiA8LSBsZWZ0X2pvaW4oZGYsIGdycCwgYnkgPSAicmVjb3JkX2lkIikKZGYgPC0KICBkZiAlPiUgbXV0YXRlKAogICAgZ3JvdXAudXNlID0gZmFjdG9yKAogICAgICBncm91cC51c2UsCiAgICAgIGxldmVscyA9IGMoIlJlc2lsaWVudCIsICJMb3ctZXhwb3NlZCIsICJQVFNEIiksCiAgICAgIGxhYmVscyA9IGMoIkhpZ2hseSByZXNpbGllbnQiLCAiTG93ZXIgV1RDLWV4cG9zZWQiLCAiUFRTRCIpLAogICAgICBvcmRlcmVkID0gRkFMU0UKICAgICksCiAgICBoZWFsdGhfbWVkc19wc3ljaC5jbnNfYmluID0gaWZfZWxzZShoZWFsdGhfbWVkc19wc3ljaC5jbnMgPT0gMCwgMCwgMSksCiAgICBwdHNkID0gaWZfZWxzZShncm91cC51c2UgPT0gIlBUU0QiLCAiUFRTRCIsICJOT19QVFNEIikKICApICU+JSByZW5hbWUobWVkc19hbGxQc3ljaCA9IGhlYWx0aF9tZWRzX3BzeWNoLmNucywKICAgICAgICAgICAgICAgbWVkc19hbGxQc3ljaF9iaW4gPSBoZWFsdGhfbWVkc19wc3ljaC5jbnNfYmluKQpkZiRtZWRzX2FsbFBzeWNoX2JpbltkZiRiaWRzX2lkID09ICJzdWItMDg0Il0gPC0KICAxICMgem9scGlkZW0gbmlnaHQgYmVmb3JlIDRwbSBzY2FuCgpgYGAKCgojIEdyb3VwIGRpZmZlcmVuY2VzCgoKIyMgT25seSB2YWxpZCBTTlQgcGFydGljaXBhbnRzIChuPTczKQoKYGBge3J9CmJlbG93XzUwX2RmIDwtCiAgcmVhZFJEUygKICAgICIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9Qb3N0ZG9jL21lbnRvcmluZy9Jc2FiZWxsYSBGb25zZWNhL1NOVC9pc2FiZWxsYV9yX3NjcmlwdHMvYmVsb3dfNTBfZGYucmRzIgogICkgJT4lIHJlbmFtZShyZWNvcmRfaWQgPSBzdWJfaWQpCmRyb3BfaWRzIDwtCiAgYyhiZWxvd181MF9kZiRyZWNvcmRfaWQsICJOV1RDLTAzNCIpICNleGNsdWRlcyBOV1RDLTAzNCBbbG90cyBvZiBtaXNzaW5nIHRyaWFsc10KIyBsb25nIGRhdGFzZXQKZGZfbG9uZyA8LQogIGRmICU+JSBzZWxlY3QoCiAgICByZWNvcmRfaWQsCiAgICBncm91cC51c2UsCiAgICBTZXgsCiAgICBBZ2UsCiAgICB0b3RfY3RxLAogICAgdG90X3RsZXFfbm9uVywKICAgIGV4cG9zdXJlc19jb3VudCwKICAgIHB0c2QsCiAgICAoY29udGFpbnMoIl9wYyIpIHwKICAgICAgIGNvbnRhaW5zKCJfQXN5bSIpIHwKICAgICAgIGNvbnRhaW5zKCJfY20zIikpICYKICAgICAgIWNvbnRhaW5zKCJzY2lkIikKICApICU+JSBmaWx0ZXIoIXJlY29yZF9pZCAlaW4lIGRyb3BfaWRzKSAjc2NpZCBwY3Agc2hvdWxkbid0IGJlIGluY2x1ZGVkCgpkZl9sb25nIDwtIGRmX2xvbmcgJT4lCiAgdGlkeXI6OnBpdm90X2xvbmdlcigKICAgIGNvbHMgPSAtYygKICAgICAgcmVjb3JkX2lkLAogICAgICBncm91cC51c2UsCiAgICAgIFNleCwKICAgICAgQWdlLAogICAgICB0b3RfY3RxLAogICAgICB0b3RfdGxlcV9ub25XLAogICAgICBleHBvc3VyZXNfY291bnQsCiAgICAgIHB0c2QsCiAgICAgIElDVl9jbTMKICAgICksCiAgICBuYW1lc190byA9ICJyZWdpb24iLAogICAgdmFsdWVzX3RvID0gInZhbHVlIgogICkKZGZfbG9uZ1sxMjoxNF0gPC0KICBzdHJfc3BsaXRfZml4ZWQoZGZfbG9uZyRyZWdpb24sICJfIiwgMykgIyBzcGxpdCBjb2x1bW4gaW50byAzIGNvbHVtbnMsIGJ5IHVuZGVyc2NvcmUKZGZfbG9uZyA8LQogIGRmX2xvbmcgJT4lIHNlbGVjdCghcmVnaW9uKSAlPiUgcmVuYW1lKHJlZ2lvbiA9IFYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdCA9IFYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUgPSBWMykgIyB3aGljaCBzdWJmaWVsZCwgd2hpY2ggaGVtaXNwaGVyZSwgd2hpY2ggbWV0cmljIChjbTMsIHBlcmNlbnQsIGFzeW1tZXRyeSBpbmRleCkKZGZfbG9uZzEgPC0KICBkZl9sb25nICU+JSBmaWx0ZXIoIW1lYXN1cmUgPT0gIiIgJgogICAgICAgICAgICAgICAgICAgICAgICFsYXQgPT0gInRvdGFsIiAmCiAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZSA9PSAiY20zIiAmCiAgICAgICAgICAgICAgICAgICAgICAgIXJlZ2lvbiA9PSAiSGlwcG9jYW1wdXMiKSAjIGRvbid0IGluY2x1ZGUgdG90YWwgaGlwcG9jYW1wdXMKZGZfbG9uZzIgPC0KICBkZl9sb25nICU+JSBmaWx0ZXIoIW1lYXN1cmUgPT0gIiIgJgogICAgICAgICAgICAgICAgICAgICAgICFsYXQgPT0gInRvdGFsIiAmCiAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZSA9PSAicGMiICYgIXJlZ2lvbiA9PSAiSGlwcG9jYW1wdXMiKQpkZl9sb25nMmIgPC0KICBkZl9sb25nICU+JSBmaWx0ZXIoIW1lYXN1cmUgPT0gIiIgJgogICAgICAgICAgICAgICAgICAgICAgIGxhdCA9PSAidG90YWwiICYKICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlID09ICJwYyIgKSMmICFyZWdpb24gPT0gIkhpcHBvY2FtcHVzIikgCmRmX2xvbmczIDwtCiAgZGZfbG9uZyAlPiUgZmlsdGVyKGxhdCA9PSAiYXN5bW1ldHJ5IiAmICFyZWdpb24gPT0gIkhpcHBvY2FtcHVzIikKYGBgCgoKCiMjIFBsb3Q6IFBlcmNlbnQgKGFrYSBub3JtYWxpemVkKSB2b2x1bWUgZm9yIFBUU0QgdnMuIE5vIFBUU0QKCmBgYHtyfQoKZ2dwbG90KGRmX2xvbmcyYiwgYWVzKHB0c2QsIHZhbHVlLCBmaWxsID0gcmVnaW9uKSkgKwogIHN0YXRfc3VtbWFyeSgKICAgIGdlb20gPSAiY29sIiwKICAgIGZ1biA9IG1lYW4sCiAgICBwb3NpdGlvbiA9ICJkb2RnZSIsCiAgICBjb2xvciA9ICJibGFjayIKICApICsKICBzdGF0X3N1bW1hcnkoCiAgICBnZW9tID0gImVycm9yYmFyIiwKICAgIGZ1bi5kYXRhID0gbWVhbl9zZSwKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoLjkpLAogICAgd2lkdGggPSAwLjI1LAogICAgY29sb3IgPSAiYmxhY2siCiAgKSAgICsgdGhlbWVfY2xlYW4oYmFzZV9zaXplPTE2KSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyBmYWNldF93cmFwKCB+IHJlZ2lvbiwgc2NhbGVzID0gImZyZWUiKSArIGxhYnModGl0bGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaXBwb2NhbXBhbCB2b2x1bWUgKCUpOiBzdWJmaWVsZHMgYW5kIHRvdGFsIGluIFBUU0Qvbm8gUFRTRCIsIGZpbGw9InJlZ2lvbiIpCgpnZ3Bsb3QoZGZfbG9uZzIsIGFlcyhwdHNkLCB2YWx1ZSwgZmlsbCA9IHJlZ2lvbikpICsKICBzdGF0X3N1bW1hcnkoCiAgICBnZW9tID0gImNvbCIsCiAgICBmdW4gPSBtZWFuLAogICAgcG9zaXRpb24gPSAiZG9kZ2UiLAogICAgY29sb3IgPSAiYmxhY2siCiAgKSArCiAgc3RhdF9zdW1tYXJ5KAogICAgZ2VvbSA9ICJlcnJvcmJhciIsCiAgICBmdW4uZGF0YSA9IG1lYW5fc2UsCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKC45KSwKICAgIHdpZHRoID0gMC4yNSwKICAgIGNvbG9yID0gImJsYWNrIgogICkgICArIHRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDEwKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyBmYWNldF93cmFwKCB+IHJlZ2lvbipsYXQsIHNjYWxlcyA9ICJmcmVlIikgKyBsYWJzKHRpdGxlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ybWFsaXplZCBoaXBwb2NhbXBhbCB2b2x1bWUgKCUpIGFjcm9zcyBzdWJmaWVsZHMsIGhlbWlzcGhlcmVzLCBhbmQgUFRTRC9ObyBQVFNEIiwgZmlsbD0icmVnaW9uIikKCgoKYGBgCgoKCiMgU05UIHJlbGF0aW9uc2hpcHMgd2l0aCBoaXBwb2NhbXBhbCB2b2x1bWUKCiMjIE5vcm1hbGl6ZWQgdm9sdW1lIChwZXJjZW50KQoKPioqU1VNTUFSWSoqOiBOb3JtYWxpemVkIGhpcHBvY2FtcGFsIHZvbHVtZSBpbiB0aGUgcmlnaHQgQ0EyLUNBMyBzdWJmaWVsZChzKSB3YXMgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggbWVhbiBkaXN0YW5jZSBmcm9tIHNlbGYgKGBwb3ZfMmRfZGlzdF9tZWFuX21lYW5gIGFuZCBgcG92XzNkX2Rpc3RfbWVhbl9tZWFuYCksIGFzIHdlbGwgYXMgZ3JlYXRlciBgbmV1XzJkX2FuZ2xlX21lYW5fbWVhbmAsIHIncyA9IC4yNS0uMjYsIHAncyA9IC4wMjktLjAzMi4KCgpgYGB7cn0KbGlicmFyeShjb3JycGxvdCkKY29yZGYgPC0KICBkZiU+JSBmaWx0ZXIoIXJlY29yZF9pZCAlaW4lIGRyb3BfaWRzICYgIWlzLm5hKGFmZmlsX21lYW5fbWVhbikpICU+JSBzZWxlY3QoY29udGFpbnMoIm1lYW5fbWVhbiIpLCBlbmRzX3dpdGgoInBjIikgJgogICAgICAgICAgICAgICAgICAhY29udGFpbnMoInNjaWQiKSkgCmNvcl9yZXN1bHQgPC0gSG1pc2M6OnJjb3JyKGFzLm1hdHJpeChjb3JkZikpCmNvcl9tYXRyaXggPC0gY29yX3Jlc3VsdCRyICAjIENvcnJlbGF0aW9uIG1hdHJpeApwX21hdHJpeCA8LSBjb3JfcmVzdWx0JFAgICAgIyBQLXZhbHVlcyBtYXRyaXgKCnNpZ25pZmljYW50X2Nvcl9tYXRyaXggPC0gY29yX21hdHJpeCAqIChwX21hdHJpeCA8PSAwLjA1KQoKY29ycnBsb3QoCiAgc2lnbmlmaWNhbnRfY29yX21hdHJpeCwKICBtZXRob2QgPSAiY29sb3IiLAogIHRsLmNvbCA9ICJibGFjayIsCiAgb3V0bGluZSA9IFRSVUUsCiAgYWRkcmVjdCA9IFRSVUUsCiAgdGwuY2V4ID0gMSwKICB0aXRsZSA9ICJwIDwuMDUiLAogIHRsLnBvcyAgPSAibGQiLAogIHR5cGUgPSAibG93ZXIiCikKCmdncGxvdChjb3JkZiwgYWVzKHk9YENBMi1DQTNfcmlnaHRfcGNgLCB4PXBvdl8yZF9kaXN0X21lYW5fbWVhbikpICsKICAgIGdlb21fcG9pbnQoc2l6ZSA9IDEpICsgdGhlbWVfY2xlYW4oKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgbGFicyh0aXRsZT0iUE9WIDJEIGRpc3RhbmNlIG1lYW4gbWVhbiIpCiNzdW1tYXJ5KGxtKGBDQTItQ0EzX3JpZ2h0X3BjYCB+IHBvdl8yZF9kaXN0X21lYW5fbWVhbixjb3JkZikpCmNvci50ZXN0KGNvcmRmJGBDQTItQ0EzX3JpZ2h0X3BjYCxjb3JkZiRwb3ZfMmRfZGlzdF9tZWFuX21lYW4pCgoKZ2dwbG90KGNvcmRmLCBhZXMoeT1gQ0EyLUNBM19yaWdodF9wY2AsIHg9cG92XzNkX2Rpc3RfbWVhbl9tZWFuKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMSkgKyB0aGVtZV9jbGVhbigpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPSJQT1YgM0QgZGlzdGFuY2UgbWVhbiBtZWFuIikKI3N1bW1hcnkobG0oYENBMi1DQTNfcmlnaHRfcGNgIH4gcG92XzNkX2Rpc3RfbWVhbl9tZWFuLGNvcmRmKSkKY29yLnRlc3QoY29yZGYkYENBMi1DQTNfcmlnaHRfcGNgLGNvcmRmJHBvdl8zZF9kaXN0X21lYW5fbWVhbikKCgpnZ3Bsb3QoY29yZGYsIGFlcyh5PWBDQTItQ0EzX3JpZ2h0X3BjYCwgeD1uZXVfM2RfYW5nbGVfbWVhbl9tZWFuKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMSkgKyB0aGVtZV9jbGVhbigpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPSJOZXV0cmFsIDNEIGFuZ2xlIG1lYW4gbWVhbiIpIAojc3VtbWFyeShsbShgQ0EyLUNBM19yaWdodF9wY2AgfiBuZXVfM2RfYW5nbGVfbWVhbl9tZWFuLGNvcmRmKSkKY29yLnRlc3QoY29yZGYkYENBMi1DQTNfcmlnaHRfcGNgLGNvcmRmJG5ldV8zZF9hbmdsZV9tZWFuX21lYW4pCgpgYGAK