cat("\014")     # clean terminal

rm(list = ls()) # clean workspace
try(dev.off(), silent = TRUE) # close all plots
library(afex)
library(emmeans)
library(ggplot2)
library(ggridges)
library(ggdist)
library(dplyr)
library(reshape2)
library(GGally)
library(forcats)
library(readxl)
library(tidyr)
exclude_bad_eeg <- TRUE
theme_set(
  theme_minimal()
)
a_posteriori <- function(afex_aov, sig_level = .05) {
  factors  <- as.list(rownames(afex_aov$anova_table))
  for (j in 1:length(factors)) {
    if (grepl(":", factors[[j]])) {
      factors[[j]] <- unlist(strsplit(factors[[j]], ":"))
    }
  }
  p_values <- afex_aov$anova_table$`Pr(>F)`
  for (i in 1:length(p_values)) {
    if (p_values[i] <= sig_level) {
      print(emmeans(afex_aov, factors[[i]], contr = "pairwise"))
      cat(rep("_", 100), '\n', sep = "")
    }
  }
}
eeg_check <- read_excel(file.path('..', 'bad channels words pemycrep 2022.xlsx'))
eeg_check <- eeg_check %>%
  mutate(badchan_num = ifelse(badchan == '0', 0, sapply(strsplit(badchan, " "), length)))
bad_eeg   <- eeg_check$name[eeg_check$commentary != 'ok']
data_dir  <- file.path('..', 'results')
words_name <- file.path(data_dir, 'average_voltage_300_to_500_pemycrep_words.txt')
words_data <- read.table(words_name, header = TRUE, strip.white = TRUE, sep = "\t")
names(words_data)[names(words_data) == "value"] <- "uvolts"
names(words_data)[names(words_data) == "binlabel"] <- "stimulus"
words_data$num_id <- readr::parse_number(words_data$ERPset)
words_data$vulnerability[ grepl("nVul", words_data$ERPset)] <- "Invulnerable"
words_data$vulnerability[!grepl("nVul", words_data$ERPset)] <- "Vulnerable"
words_data$belief[ grepl("nCr", words_data$ERPset)]         <- "Unbeliever"
words_data$belief[!grepl("nCr", words_data$ERPset)]         <- "Believer"
words_data$sex[ grepl("F", words_data$ERPset)]              <- "Female"
words_data$sex[!grepl("F", words_data$ERPset)]              <- "Male"
words_data$area[words_data$chlabel %in% c('FCz', 'E086', 'Fz')]            <- 'Fronto-central Line'
words_data$area[words_data$chlabel %in% c('E090', 'E091', 'E095', 'E096')] <- 'Left frontal'
words_data$num_id          <- factor(words_data$num_id)
words_data$vulnerability   <- factor(words_data$vulnerability)
words_data$sex             <- factor(words_data$sex)
words_data$belief          <- factor(words_data$belief)
words_data$stimulus        <- factor(words_data$stimulus)
words_data$area <- factor(words_data$area)
words_data <- words_data %>% separate(stimulus, c("word_type","congruency", "word_order"), sep = "_", remove = FALSE)
words_data$word_type  <- factor(words_data$word_type)
words_data$congruency <- factor(words_data$congruency)
words_data$word_order <- factor(words_data$word_order)
if (exclude_bad_eeg) {
  words_data <- words_data[!(words_data$ERPset %in% bad_eeg), ]
  }
write.csv(words_data,  file.path(data_dir, 'words_n400_data_clean.csv'),  row.names = FALSE)

subj_block <- unique(words_data[c("worklat", "mlabel", "ERPset", "num_id" ,"vulnerability" ,"belief" ,"sex")])
subj_block$RUT <- sub("_wrd.*", "", subj_block$ERPset)
subj_block$RUT <- sub(".*F", "", subj_block$RUT)
subj_block$RUT <- sub(".*M", "", subj_block$RUT)

N400_diff_LeftFrontal <- c()
N400_diff_Central     <- c()

for (subj in subj_block$ERPset) {
  subject_data <- subset(words_data, ERPset == subj)
  N400_diff_LeftFrontal <- c(N400_diff_LeftFrontal,
                                                                 mean(subject_data$uvolts[subject_data$area == "Left frontal" & subject_data$stimulus == "Religious_Incongruent_Target"]) -
                                                                   mean(subject_data$uvolts[subject_data$area == "Left frontal" & subject_data$stimulus == "Secular_Incongruent_Target"])
                                                                 )
  N400_diff_Central <- c(N400_diff_Central,
                                                                 mean(subject_data$uvolts[subject_data$area == "Fronto-central Line" & subject_data$stimulus == "Religious_Incongruent_Target"]) -
                                                                   mean(subject_data$uvolts[subject_data$area == "Fronto-central Line" & subject_data$stimulus == "Secular_Incongruent_Target"])
                                                                 )
}
N400_difference_by_subject <- data.frame(subj_block, N400_diff_LeftFrontal, N400_diff_Central)
write.csv(N400_difference_by_subject,  paste(data_dir, '/N400_difference_by_subject.csv', sep = ''),  row.names = FALSE)

1 Participants

options(width = 100)
mytable <- xtabs(~ sex + belief, data = words_data) / length(unique(words_data$chindex)) / length(unique(words_data$bini))
ftable(addmargins(mytable))
       belief Believer Unbeliever Sum
sex                                  
Female              22         25  47
Male                16         13  29
Sum                 38         38  76

2 ERP plots

2.1 Target and Standard:

2.2 Topographic layout:

Primer black, target red.

3 General description

Mean amplitude [300.0 500.0]

options(width = 100)
summary(words_data[c('uvolts', 'sex', 'vulnerability', 'belief', 'area', 'word_type', 'congruency', 'word_order', 'num_id')])
     uvolts            sex            vulnerability         belief                      area     
 Min.   :-29.505   Female:1974   Invulnerable:2604   Believer  :1596   Fronto-central Line:1368  
 1st Qu.: -7.487   Male  :1218   Vulnerable  : 588   Unbeliever:1596   Left frontal       :1824  
 Median : -3.885                                                                                 
 Mean   : -4.367                                                                                 
 3rd Qu.: -1.175                                                                                 
 Max.   : 12.840                                                                                 
                                                                                                 
     word_type          congruency    word_order       num_id    
 Magic    :1064   Congruent  :1596   Target:3192   1      :  42  
 Religious:1064   Incongruent:1596                 3      :  42  
 Secular  :1064                                    6      :  42  
                                                   15     :  42  
                                                   16     :  42  
                                                   20     :  42  
                                                   (Other):2940  

4 Fronto-central Line

4.1 Electrode FCz

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "FCz", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df   MSE      F   ges p.value
1                      belief        1, 74 86.47   0.01 <.001    .938
2                   word_type 1.95, 144.58  4.47   1.46  .002    .235
3            belief:word_type 1.95, 144.58  4.47 2.49 +  .003    .088
4                  congruency        1, 74  1.98   1.98 <.001    .163
5           belief:congruency        1, 74  1.98   2.33 <.001    .131
6        word_type:congruency 1.92, 141.85  2.65   0.05 <.001    .942
7 belief:word_type:congruency 1.92, 141.85  2.65   0.19 <.001    .819
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

4.2 Electrode E086

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E086", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df   MSE      F   ges p.value
1                      belief        1, 74 98.03   0.04 <.001    .840
2                   word_type 1.71, 126.89  7.42   1.61  .002    .208
3            belief:word_type 1.71, 126.89  7.42 2.50 +  .004    .095
4                  congruency        1, 74  2.27   1.71 <.001    .195
5           belief:congruency        1, 74  2.27   2.55 <.001    .114
6        word_type:congruency 1.92, 142.21  3.20   0.03 <.001    .964
7 belief:word_type:congruency 1.92, 142.21  3.20   0.30 <.001    .729
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

4.3 Electrode Fz

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "Fz", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE    F   ges p.value
1                      belief        1, 74 104.61 0.00 <.001    .951
2                   word_type 1.76, 130.26   7.55 1.86  .003    .165
3            belief:word_type 1.76, 130.26   7.55 2.36  .003    .105
4                  congruency        1, 74   2.47 1.65 <.001    .204
5           belief:congruency        1, 74   2.47 1.83 <.001    .180
6        word_type:congruency 1.91, 141.36   3.48 0.03 <.001    .965
7 belief:word_type:congruency 1.91, 141.36   3.48 0.66 <.001    .512
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5 Left frontal

5.1 Electrode E090

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E090", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 74 121.05   0.03 <.001    .858
2                   word_type 1.87, 138.63   8.20   0.66 <.001    .509
3            belief:word_type 1.87, 138.63   8.20 2.44 +  .003    .094
4                  congruency        1, 74   3.08   1.49 <.001    .226
5           belief:congruency        1, 74   3.08   0.91 <.001    .343
6        word_type:congruency 1.91, 141.18   3.63   0.03 <.001    .967
7 belief:word_type:congruency 1.91, 141.18   3.63   0.14 <.001    .860
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.2 Electrode E091

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E091", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE      F   ges p.value
1                      belief        1, 74 146.38   0.02 <.001    .877
2                   word_type 1.68, 124.61  13.14   0.91  .001    .389
3            belief:word_type 1.68, 124.61  13.14 3.04 +  .005    .060
4                  congruency        1, 74   3.76   2.01 <.001    .160
5           belief:congruency        1, 74   3.76   1.00 <.001    .320
6        word_type:congruency 1.87, 138.71   5.33   0.01 <.001    .993
7 belief:word_type:congruency 1.87, 138.71   5.33   0.06 <.001    .933
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.3 Electrode E095

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E095", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE    F   ges p.value
1                      belief        1, 74 151.47 0.05 <.001    .818
2                   word_type 1.90, 140.61  10.39 0.48 <.001    .610
3            belief:word_type 1.90, 140.61  10.39 2.16  .003    .121
4                  congruency        1, 74   4.27 1.40 <.001    .240
5           belief:congruency        1, 74   4.27 1.12 <.001    .293
6        word_type:congruency 1.89, 139.62   5.68 0.42 <.001    .647
7 belief:word_type:congruency 1.89, 139.62   5.68 0.78 <.001    .453
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

5.4 Electrode E096

options(width = 100)
electrode_data  <- words_data[words_data$chlabel == "E096", ]
words_rep_anova <- aov_ez("num_id", "uvolts", electrode_data, within = c("word_type", "congruency"), between = c("belief"))
Contrasts set to contr.sum for the following variables: belief
words_afex_plot <-
  afex_plot(
    words_rep_anova,
    x     = "word_type",
    trace = "congruency",
    panel = "belief",
    error = "within",
    error_arg = list(width = .1),
    dodge = -.5,
    mapping = c("color"),
    point_arg = list(size = 4)
  )
suppressWarnings(print(words_afex_plot))

nice(words_rep_anova)
Anova Table (Type 3 tests)

Response: uvolts
                       Effect           df    MSE    F   ges p.value
1                      belief        1, 74 143.62 0.01 <.001    .921
2                   word_type 1.88, 139.27   9.78 0.38 <.001    .669
3            belief:word_type 1.88, 139.27   9.78 1.77  .002    .175
4                  congruency        1, 74   3.93 2.40 <.001    .126
5           belief:congruency        1, 74   3.93 1.16 <.001    .284
6        word_type:congruency 1.97, 145.85   5.20 0.29 <.001    .749
7 belief:word_type:congruency 1.97, 145.85   5.20 0.29 <.001    .742
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Sphericity correction method: GG 
a_posteriori(words_rep_anova)

6 Multivariate pattern analysis (decoding)

Fahrenfort, J. J., van Driel, J., van Gaal, S., & Olivers, C. N. L. (2018). From ERPs to MVPA using the Amsterdam Decoding and Modeling toolbox (ADAM). Frontiers in Neuroscience, 12(JUL), 351586. https://doi.org/10.3389/FNINS.2018.00368/BIBTEX

All channels, reference to infinite, 40 Hz low-pass
Dong, L., Li, F., Liu, Q., Wen, X., Lai, Y., Xu, P., & Yao, D. (2017). MATLAB Toolboxes for Reference Electrode Standardization Technique (REST) of Scalp EEG. Frontiers in Neuroscience, 11(OCT), 601. https://doi.org/10.3389/fnins.2017.00601

6.1 Topographic map

6.2 Central electrodes

6.3 Exemplar ERP on PO4 aprox.

6.4 ERP difference on PO4 aprox.

6.5 Decoding over time

6.6 Individual results, pretty shitty

6.7 Activation patterns

6.8 Temporal generalization plot

6.9 Temporal generalization over time

6.10 Group decoding differences

LS0tCnRpdGxlOiAiV29yZHMgTjQwMCwgUGVNeUNyZVAiCmF1dGhvcjogIkFsdmFybyBSaXZlcmEtUmVpIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGNlcnVsZWFuCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCiAgICAgIHNtb290aF9zY3JvbGw6IG5vCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKc3VidGl0bGU6IFJlZmVyZW5jZSBhdCBJbmZpbml0eSwgUkVTVCAoUmVmZXJlbmNlIEVsZWN0cm9kZSBTdGFuZGFyZGl6YXRpb24gVGVjaG5pcXVlKS4KLS0tCgpgYGB7ciBDbGVhbiBhbmQgTG9hZCBMaWJyYXJpZXN9CmNhdCgiXDAxNCIpICAgICAjIGNsZWFuIHRlcm1pbmFsCnJtKGxpc3QgPSBscygpKSAjIGNsZWFuIHdvcmtzcGFjZQp0cnkoZGV2Lm9mZigpLCBzaWxlbnQgPSBUUlVFKSAjIGNsb3NlIGFsbCBwbG90cwpsaWJyYXJ5KGFmZXgpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdncmlkZ2VzKQpsaWJyYXJ5KGdnZGlzdCkKbGlicmFyeShkcGx5cikKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShHR2FsbHkpCmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkodGlkeXIpCmBgYAoKYGBge3IgU2V0IERlZmF1bHRzfQpleGNsdWRlX2JhZF9lZWcgPC0gVFJVRQp0aGVtZV9zZXQoCiAgdGhlbWVfbWluaW1hbCgpCikKYV9wb3N0ZXJpb3JpIDwtIGZ1bmN0aW9uKGFmZXhfYW92LCBzaWdfbGV2ZWwgPSAuMDUpIHsKICBmYWN0b3JzICA8LSBhcy5saXN0KHJvd25hbWVzKGFmZXhfYW92JGFub3ZhX3RhYmxlKSkKICBmb3IgKGogaW4gMTpsZW5ndGgoZmFjdG9ycykpIHsKICAgIGlmIChncmVwbCgiOiIsIGZhY3RvcnNbW2pdXSkpIHsKICAgICAgZmFjdG9yc1tbal1dIDwtIHVubGlzdChzdHJzcGxpdChmYWN0b3JzW1tqXV0sICI6IikpCiAgICB9CiAgfQogIHBfdmFsdWVzIDwtIGFmZXhfYW92JGFub3ZhX3RhYmxlJGBQcig+RilgCiAgZm9yIChpIGluIDE6bGVuZ3RoKHBfdmFsdWVzKSkgewogICAgaWYgKHBfdmFsdWVzW2ldIDw9IHNpZ19sZXZlbCkgewogICAgICBwcmludChlbW1lYW5zKGFmZXhfYW92LCBmYWN0b3JzW1tpXV0sIGNvbnRyID0gInBhaXJ3aXNlIikpCiAgICAgIGNhdChyZXAoIl8iLCAxMDApLCAnXG4nLCBzZXAgPSAiIikKICAgIH0KICB9Cn0KYGBgCgpgYGB7ciBMb2FkIG9kZGJhbGwgZGF0YX0KZWVnX2NoZWNrIDwtIHJlYWRfZXhjZWwoZmlsZS5wYXRoKCcuLicsICdiYWQgY2hhbm5lbHMgd29yZHMgcGVteWNyZXAgMjAyMi54bHN4JykpCmVlZ19jaGVjayA8LSBlZWdfY2hlY2sgJT4lCiAgbXV0YXRlKGJhZGNoYW5fbnVtID0gaWZlbHNlKGJhZGNoYW4gPT0gJzAnLCAwLCBzYXBwbHkoc3Ryc3BsaXQoYmFkY2hhbiwgIiAiKSwgbGVuZ3RoKSkpCmJhZF9lZWcgICA8LSBlZWdfY2hlY2skbmFtZVtlZWdfY2hlY2skY29tbWVudGFyeSAhPSAnb2snXQpkYXRhX2RpciAgPC0gZmlsZS5wYXRoKCcuLicsICdyZXN1bHRzJykKd29yZHNfbmFtZSA8LSBmaWxlLnBhdGgoZGF0YV9kaXIsICdhdmVyYWdlX3ZvbHRhZ2VfMzAwX3RvXzUwMF9wZW15Y3JlcF93b3Jkcy50eHQnKQp3b3Jkc19kYXRhIDwtIHJlYWQudGFibGUod29yZHNfbmFtZSwgaGVhZGVyID0gVFJVRSwgc3RyaXAud2hpdGUgPSBUUlVFLCBzZXAgPSAiXHQiKQpuYW1lcyh3b3Jkc19kYXRhKVtuYW1lcyh3b3Jkc19kYXRhKSA9PSAidmFsdWUiXSA8LSAidXZvbHRzIgpuYW1lcyh3b3Jkc19kYXRhKVtuYW1lcyh3b3Jkc19kYXRhKSA9PSAiYmlubGFiZWwiXSA8LSAic3RpbXVsdXMiCndvcmRzX2RhdGEkbnVtX2lkIDwtIHJlYWRyOjpwYXJzZV9udW1iZXIod29yZHNfZGF0YSRFUlBzZXQpCndvcmRzX2RhdGEkdnVsbmVyYWJpbGl0eVsgZ3JlcGwoIm5WdWwiLCB3b3Jkc19kYXRhJEVSUHNldCldIDwtICJJbnZ1bG5lcmFibGUiCndvcmRzX2RhdGEkdnVsbmVyYWJpbGl0eVshZ3JlcGwoIm5WdWwiLCB3b3Jkc19kYXRhJEVSUHNldCldIDwtICJWdWxuZXJhYmxlIgp3b3Jkc19kYXRhJGJlbGllZlsgZ3JlcGwoIm5DciIsIHdvcmRzX2RhdGEkRVJQc2V0KV0gICAgICAgICA8LSAiVW5iZWxpZXZlciIKd29yZHNfZGF0YSRiZWxpZWZbIWdyZXBsKCJuQ3IiLCB3b3Jkc19kYXRhJEVSUHNldCldICAgICAgICAgPC0gIkJlbGlldmVyIgp3b3Jkc19kYXRhJHNleFsgZ3JlcGwoIkYiLCB3b3Jkc19kYXRhJEVSUHNldCldICAgICAgICAgICAgICA8LSAiRmVtYWxlIgp3b3Jkc19kYXRhJHNleFshZ3JlcGwoIkYiLCB3b3Jkc19kYXRhJEVSUHNldCldICAgICAgICAgICAgICA8LSAiTWFsZSIKd29yZHNfZGF0YSRhcmVhW3dvcmRzX2RhdGEkY2hsYWJlbCAlaW4lIGMoJ0ZDeicsICdFMDg2JywgJ0Z6JyldICAgICAgICAgICAgPC0gJ0Zyb250by1jZW50cmFsIExpbmUnCndvcmRzX2RhdGEkYXJlYVt3b3Jkc19kYXRhJGNobGFiZWwgJWluJSBjKCdFMDkwJywgJ0UwOTEnLCAnRTA5NScsICdFMDk2JyldIDwtICdMZWZ0IGZyb250YWwnCndvcmRzX2RhdGEkbnVtX2lkICAgICAgICAgIDwtIGZhY3Rvcih3b3Jkc19kYXRhJG51bV9pZCkKd29yZHNfZGF0YSR2dWxuZXJhYmlsaXR5ICAgPC0gZmFjdG9yKHdvcmRzX2RhdGEkdnVsbmVyYWJpbGl0eSkKd29yZHNfZGF0YSRzZXggICAgICAgICAgICAgPC0gZmFjdG9yKHdvcmRzX2RhdGEkc2V4KQp3b3Jkc19kYXRhJGJlbGllZiAgICAgICAgICA8LSBmYWN0b3Iod29yZHNfZGF0YSRiZWxpZWYpCndvcmRzX2RhdGEkc3RpbXVsdXMgICAgICAgIDwtIGZhY3Rvcih3b3Jkc19kYXRhJHN0aW11bHVzKQp3b3Jkc19kYXRhJGFyZWEgPC0gZmFjdG9yKHdvcmRzX2RhdGEkYXJlYSkKd29yZHNfZGF0YSA8LSB3b3Jkc19kYXRhICU+JSBzZXBhcmF0ZShzdGltdWx1cywgYygid29yZF90eXBlIiwiY29uZ3J1ZW5jeSIsICJ3b3JkX29yZGVyIiksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpCndvcmRzX2RhdGEkd29yZF90eXBlICA8LSBmYWN0b3Iod29yZHNfZGF0YSR3b3JkX3R5cGUpCndvcmRzX2RhdGEkY29uZ3J1ZW5jeSA8LSBmYWN0b3Iod29yZHNfZGF0YSRjb25ncnVlbmN5KQp3b3Jkc19kYXRhJHdvcmRfb3JkZXIgPC0gZmFjdG9yKHdvcmRzX2RhdGEkd29yZF9vcmRlcikKaWYgKGV4Y2x1ZGVfYmFkX2VlZykgewogIHdvcmRzX2RhdGEgPC0gd29yZHNfZGF0YVshKHdvcmRzX2RhdGEkRVJQc2V0ICVpbiUgYmFkX2VlZyksIF0KICB9CndyaXRlLmNzdih3b3Jkc19kYXRhLCAgZmlsZS5wYXRoKGRhdGFfZGlyLCAnd29yZHNfbjQwMF9kYXRhX2NsZWFuLmNzdicpLCAgcm93Lm5hbWVzID0gRkFMU0UpCgpzdWJqX2Jsb2NrIDwtIHVuaXF1ZSh3b3Jkc19kYXRhW2MoIndvcmtsYXQiLCAibWxhYmVsIiwgIkVSUHNldCIsICJudW1faWQiICwidnVsbmVyYWJpbGl0eSIgLCJiZWxpZWYiICwic2V4IildKQpzdWJqX2Jsb2NrJFJVVCA8LSBzdWIoIl93cmQuKiIsICIiLCBzdWJqX2Jsb2NrJEVSUHNldCkKc3Vial9ibG9jayRSVVQgPC0gc3ViKCIuKkYiLCAiIiwgc3Vial9ibG9jayRSVVQpCnN1YmpfYmxvY2skUlVUIDwtIHN1YigiLipNIiwgIiIsIHN1YmpfYmxvY2skUlVUKQoKTjQwMF9kaWZmX0xlZnRGcm9udGFsIDwtIGMoKQpONDAwX2RpZmZfQ2VudHJhbCAgICAgPC0gYygpCgpmb3IgKHN1YmogaW4gc3Vial9ibG9jayRFUlBzZXQpIHsKICBzdWJqZWN0X2RhdGEgPC0gc3Vic2V0KHdvcmRzX2RhdGEsIEVSUHNldCA9PSBzdWJqKQogIE40MDBfZGlmZl9MZWZ0RnJvbnRhbCA8LSBjKE40MDBfZGlmZl9MZWZ0RnJvbnRhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuKHN1YmplY3RfZGF0YSR1dm9sdHNbc3ViamVjdF9kYXRhJGFyZWEgPT0gIkxlZnQgZnJvbnRhbCIgJiBzdWJqZWN0X2RhdGEkc3RpbXVsdXMgPT0gIlJlbGlnaW91c19JbmNvbmdydWVudF9UYXJnZXQiXSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihzdWJqZWN0X2RhdGEkdXZvbHRzW3N1YmplY3RfZGF0YSRhcmVhID09ICJMZWZ0IGZyb250YWwiICYgc3ViamVjdF9kYXRhJHN0aW11bHVzID09ICJTZWN1bGFyX0luY29uZ3J1ZW50X1RhcmdldCJdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICBONDAwX2RpZmZfQ2VudHJhbCA8LSBjKE40MDBfZGlmZl9DZW50cmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4oc3ViamVjdF9kYXRhJHV2b2x0c1tzdWJqZWN0X2RhdGEkYXJlYSA9PSAiRnJvbnRvLWNlbnRyYWwgTGluZSIgJiBzdWJqZWN0X2RhdGEkc3RpbXVsdXMgPT0gIlJlbGlnaW91c19JbmNvbmdydWVudF9UYXJnZXQiXSkgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihzdWJqZWN0X2RhdGEkdXZvbHRzW3N1YmplY3RfZGF0YSRhcmVhID09ICJGcm9udG8tY2VudHJhbCBMaW5lIiAmIHN1YmplY3RfZGF0YSRzdGltdWx1cyA9PSAiU2VjdWxhcl9JbmNvbmdydWVudF9UYXJnZXQiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCn0KTjQwMF9kaWZmZXJlbmNlX2J5X3N1YmplY3QgPC0gZGF0YS5mcmFtZShzdWJqX2Jsb2NrLCBONDAwX2RpZmZfTGVmdEZyb250YWwsIE40MDBfZGlmZl9DZW50cmFsKQp3cml0ZS5jc3YoTjQwMF9kaWZmZXJlbmNlX2J5X3N1YmplY3QsICBwYXN0ZShkYXRhX2RpciwgJy9ONDAwX2RpZmZlcmVuY2VfYnlfc3ViamVjdC5jc3YnLCBzZXAgPSAnJyksICByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojIFBhcnRpY2lwYW50cwpgYGB7ciBwYXJ0aWNpcGFudHMsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQpteXRhYmxlIDwtIHh0YWJzKH4gc2V4ICsgYmVsaWVmLCBkYXRhID0gd29yZHNfZGF0YSkgLyBsZW5ndGgodW5pcXVlKHdvcmRzX2RhdGEkY2hpbmRleCkpIC8gbGVuZ3RoKHVuaXF1ZSh3b3Jkc19kYXRhJGJpbmkpKQpmdGFibGUoYWRkbWFyZ2lucyhteXRhYmxlKSkKYGBgCgojIEVSUCBwbG90cwojIyBUYXJnZXQgYW5kIFN0YW5kYXJkOgohW10ocGVteWNyZXBfd29yZHNfdGFyZ2V0cy5wbmcpCgojIyBUb3BvZ3JhcGhpYyBsYXlvdXQ6ClByaW1lciBibGFjaywgdGFyZ2V0IHJlZC4KIVtdKHBlbXljcmVwX3dvcmRzX3RvcG9ncmFwaHkucG5nKQoKIyBHZW5lcmFsIGRlc2NyaXB0aW9uCk1lYW4gYW1wbGl0dWRlIGByIHdvcmRzX2RhdGEkd29ya2xhdFsxXWAKYGBge3IgZ2VuZXJhbCwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCnN1bW1hcnkod29yZHNfZGF0YVtjKCd1dm9sdHMnLCAnc2V4JywgJ3Z1bG5lcmFiaWxpdHknLCAnYmVsaWVmJywgJ2FyZWEnLCAnd29yZF90eXBlJywgJ2NvbmdydWVuY3knLCAnd29yZF9vcmRlcicsICdudW1faWQnKV0pCmBgYAoKIyBGcm9udG8tY2VudHJhbCBMaW5lCgojIyBFbGVjdHJvZGUgRkN6CmBgYHtyIEZDeiwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmVsZWN0cm9kZV9kYXRhICA8LSB3b3Jkc19kYXRhW3dvcmRzX2RhdGEkY2hsYWJlbCA9PSAiRkN6IiwgXQp3b3Jkc19yZXBfYW5vdmEgPC0gYW92X2V6KCJudW1faWQiLCAidXZvbHRzIiwgZWxlY3Ryb2RlX2RhdGEsIHdpdGhpbiA9IGMoIndvcmRfdHlwZSIsICJjb25ncnVlbmN5IiksIGJldHdlZW4gPSBjKCJiZWxpZWYiKSkKd29yZHNfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgd29yZHNfcmVwX2Fub3ZhLAogICAgeCAgICAgPSAid29yZF90eXBlIiwKICAgIHRyYWNlID0gImNvbmdydWVuY3kiLAogICAgcGFuZWwgPSAiYmVsaWVmIiwKICAgIGVycm9yID0gIndpdGhpbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KHdvcmRzX2FmZXhfcGxvdCkpCm5pY2Uod29yZHNfcmVwX2Fub3ZhKQphX3Bvc3Rlcmlvcmkod29yZHNfcmVwX2Fub3ZhKQpgYGAKCiMjIEVsZWN0cm9kZSBFMDg2CmBgYHtyIEUwODYsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQplbGVjdHJvZGVfZGF0YSAgPC0gd29yZHNfZGF0YVt3b3Jkc19kYXRhJGNobGFiZWwgPT0gIkUwODYiLCBdCndvcmRzX3JlcF9hbm92YSA8LSBhb3ZfZXooIm51bV9pZCIsICJ1dm9sdHMiLCBlbGVjdHJvZGVfZGF0YSwgd2l0aGluID0gYygid29yZF90eXBlIiwgImNvbmdydWVuY3kiKSwgYmV0d2VlbiA9IGMoImJlbGllZiIpKQp3b3Jkc19hZmV4X3Bsb3QgPC0KICBhZmV4X3Bsb3QoCiAgICB3b3Jkc19yZXBfYW5vdmEsCiAgICB4ICAgICA9ICJ3b3JkX3R5cGUiLAogICAgdHJhY2UgPSAiY29uZ3J1ZW5jeSIsCiAgICBwYW5lbCA9ICJiZWxpZWYiLAogICAgZXJyb3IgPSAid2l0aGluIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQod29yZHNfYWZleF9wbG90KSkKbmljZSh3b3Jkc19yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaSh3b3Jkc19yZXBfYW5vdmEpCmBgYAoKIyMgRWxlY3Ryb2RlIEZ6CmBgYHtyIEZ6LCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKZWxlY3Ryb2RlX2RhdGEgIDwtIHdvcmRzX2RhdGFbd29yZHNfZGF0YSRjaGxhYmVsID09ICJGeiIsIF0Kd29yZHNfcmVwX2Fub3ZhIDwtIGFvdl9leigibnVtX2lkIiwgInV2b2x0cyIsIGVsZWN0cm9kZV9kYXRhLCB3aXRoaW4gPSBjKCJ3b3JkX3R5cGUiLCAiY29uZ3J1ZW5jeSIpLCBiZXR3ZWVuID0gYygiYmVsaWVmIikpCndvcmRzX2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIHdvcmRzX3JlcF9hbm92YSwKICAgIHggICAgID0gIndvcmRfdHlwZSIsCiAgICB0cmFjZSA9ICJjb25ncnVlbmN5IiwKICAgIHBhbmVsID0gImJlbGllZiIsCiAgICBlcnJvciA9ICJ3aXRoaW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludCh3b3Jkc19hZmV4X3Bsb3QpKQpuaWNlKHdvcmRzX3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKHdvcmRzX3JlcF9hbm92YSkKYGBgCgojIExlZnQgZnJvbnRhbAoKIyMgRWxlY3Ryb2RlIEUwOTAKYGBge3IgRTA5MCwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmVsZWN0cm9kZV9kYXRhICA8LSB3b3Jkc19kYXRhW3dvcmRzX2RhdGEkY2hsYWJlbCA9PSAiRTA5MCIsIF0Kd29yZHNfcmVwX2Fub3ZhIDwtIGFvdl9leigibnVtX2lkIiwgInV2b2x0cyIsIGVsZWN0cm9kZV9kYXRhLCB3aXRoaW4gPSBjKCJ3b3JkX3R5cGUiLCAiY29uZ3J1ZW5jeSIpLCBiZXR3ZWVuID0gYygiYmVsaWVmIikpCndvcmRzX2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIHdvcmRzX3JlcF9hbm92YSwKICAgIHggICAgID0gIndvcmRfdHlwZSIsCiAgICB0cmFjZSA9ICJjb25ncnVlbmN5IiwKICAgIHBhbmVsID0gImJlbGllZiIsCiAgICBlcnJvciA9ICJ3aXRoaW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludCh3b3Jkc19hZmV4X3Bsb3QpKQpuaWNlKHdvcmRzX3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKHdvcmRzX3JlcF9hbm92YSkKYGBgCgojIyBFbGVjdHJvZGUgRTA5MQpgYGB7ciBFMDkxLCBmaWcud2lkdGggPSAxMn0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkKZWxlY3Ryb2RlX2RhdGEgIDwtIHdvcmRzX2RhdGFbd29yZHNfZGF0YSRjaGxhYmVsID09ICJFMDkxIiwgXQp3b3Jkc19yZXBfYW5vdmEgPC0gYW92X2V6KCJudW1faWQiLCAidXZvbHRzIiwgZWxlY3Ryb2RlX2RhdGEsIHdpdGhpbiA9IGMoIndvcmRfdHlwZSIsICJjb25ncnVlbmN5IiksIGJldHdlZW4gPSBjKCJiZWxpZWYiKSkKd29yZHNfYWZleF9wbG90IDwtCiAgYWZleF9wbG90KAogICAgd29yZHNfcmVwX2Fub3ZhLAogICAgeCAgICAgPSAid29yZF90eXBlIiwKICAgIHRyYWNlID0gImNvbmdydWVuY3kiLAogICAgcGFuZWwgPSAiYmVsaWVmIiwKICAgIGVycm9yID0gIndpdGhpbiIsCiAgICBlcnJvcl9hcmcgPSBsaXN0KHdpZHRoID0gLjEpLAogICAgZG9kZ2UgPSAtLjUsCiAgICBtYXBwaW5nID0gYygiY29sb3IiKSwKICAgIHBvaW50X2FyZyA9IGxpc3Qoc2l6ZSA9IDQpCiAgKQpzdXBwcmVzc1dhcm5pbmdzKHByaW50KHdvcmRzX2FmZXhfcGxvdCkpCm5pY2Uod29yZHNfcmVwX2Fub3ZhKQphX3Bvc3Rlcmlvcmkod29yZHNfcmVwX2Fub3ZhKQpgYGAKCiMjIEVsZWN0cm9kZSBFMDk1CmBgYHtyIEUwOTUsIGZpZy53aWR0aCA9IDEyfQpvcHRpb25zKHdpZHRoID0gMTAwKQplbGVjdHJvZGVfZGF0YSAgPC0gd29yZHNfZGF0YVt3b3Jkc19kYXRhJGNobGFiZWwgPT0gIkUwOTUiLCBdCndvcmRzX3JlcF9hbm92YSA8LSBhb3ZfZXooIm51bV9pZCIsICJ1dm9sdHMiLCBlbGVjdHJvZGVfZGF0YSwgd2l0aGluID0gYygid29yZF90eXBlIiwgImNvbmdydWVuY3kiKSwgYmV0d2VlbiA9IGMoImJlbGllZiIpKQp3b3Jkc19hZmV4X3Bsb3QgPC0KICBhZmV4X3Bsb3QoCiAgICB3b3Jkc19yZXBfYW5vdmEsCiAgICB4ICAgICA9ICJ3b3JkX3R5cGUiLAogICAgdHJhY2UgPSAiY29uZ3J1ZW5jeSIsCiAgICBwYW5lbCA9ICJiZWxpZWYiLAogICAgZXJyb3IgPSAid2l0aGluIiwKICAgIGVycm9yX2FyZyA9IGxpc3Qod2lkdGggPSAuMSksCiAgICBkb2RnZSA9IC0uNSwKICAgIG1hcHBpbmcgPSBjKCJjb2xvciIpLAogICAgcG9pbnRfYXJnID0gbGlzdChzaXplID0gNCkKICApCnN1cHByZXNzV2FybmluZ3MocHJpbnQod29yZHNfYWZleF9wbG90KSkKbmljZSh3b3Jkc19yZXBfYW5vdmEpCmFfcG9zdGVyaW9yaSh3b3Jkc19yZXBfYW5vdmEpCmBgYAoKIyMgRWxlY3Ryb2RlIEUwOTYKYGBge3IgRTA5NiwgZmlnLndpZHRoID0gMTJ9Cm9wdGlvbnMod2lkdGggPSAxMDApCmVsZWN0cm9kZV9kYXRhICA8LSB3b3Jkc19kYXRhW3dvcmRzX2RhdGEkY2hsYWJlbCA9PSAiRTA5NiIsIF0Kd29yZHNfcmVwX2Fub3ZhIDwtIGFvdl9leigibnVtX2lkIiwgInV2b2x0cyIsIGVsZWN0cm9kZV9kYXRhLCB3aXRoaW4gPSBjKCJ3b3JkX3R5cGUiLCAiY29uZ3J1ZW5jeSIpLCBiZXR3ZWVuID0gYygiYmVsaWVmIikpCndvcmRzX2FmZXhfcGxvdCA8LQogIGFmZXhfcGxvdCgKICAgIHdvcmRzX3JlcF9hbm92YSwKICAgIHggICAgID0gIndvcmRfdHlwZSIsCiAgICB0cmFjZSA9ICJjb25ncnVlbmN5IiwKICAgIHBhbmVsID0gImJlbGllZiIsCiAgICBlcnJvciA9ICJ3aXRoaW4iLAogICAgZXJyb3JfYXJnID0gbGlzdCh3aWR0aCA9IC4xKSwKICAgIGRvZGdlID0gLS41LAogICAgbWFwcGluZyA9IGMoImNvbG9yIiksCiAgICBwb2ludF9hcmcgPSBsaXN0KHNpemUgPSA0KQogICkKc3VwcHJlc3NXYXJuaW5ncyhwcmludCh3b3Jkc19hZmV4X3Bsb3QpKQpuaWNlKHdvcmRzX3JlcF9hbm92YSkKYV9wb3N0ZXJpb3JpKHdvcmRzX3JlcF9hbm92YSkKYGBgCgojIE11bHRpdmFyaWF0ZSBwYXR0ZXJuIGFuYWx5c2lzIChkZWNvZGluZykKRmFocmVuZm9ydCwgSi4gSi4sIHZhbiBEcmllbCwgSi4sIHZhbiBHYWFsLCBTLiwgJiBPbGl2ZXJzLCBDLiBOLiBMLiAoMjAxOCkuIEZyb20gRVJQcyB0byBNVlBBIHVzaW5nIHRoZSBBbXN0ZXJkYW0gRGVjb2RpbmcgYW5kIE1vZGVsaW5nIHRvb2xib3ggKEFEQU0pLiBGcm9udGllcnMgaW4gTmV1cm9zY2llbmNlLCAxMihKVUwpLCAzNTE1ODYuIGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L0ZOSU5TLjIwMTguMDAzNjgvQklCVEVYCgoqKkFsbCBjaGFubmVscywgcmVmZXJlbmNlIHRvIGluZmluaXRlLCA0MCBIeiBsb3ctcGFzcyoqXApEb25nLCBMLiwgTGksIEYuLCBMaXUsIFEuLCBXZW4sIFguLCBMYWksIFkuLCBYdSwgUC4sICYgWWFvLCBELiAoMjAxNykuIE1BVExBQiBUb29sYm94ZXMgZm9yIFJlZmVyZW5jZSBFbGVjdHJvZGUgU3RhbmRhcmRpemF0aW9uIFRlY2huaXF1ZSAoUkVTVCkgb2YgU2NhbHAgRUVHLiBGcm9udGllcnMgaW4gTmV1cm9zY2llbmNlLCAxMShPQ1QpLCA2MDEuIGh0dHBzOi8vZG9pLm9yZy8xMC4zMzg5L2ZuaW5zLjIwMTcuMDA2MDEKCiMjIFRvcG9ncmFwaGljIG1hcAohW10oLi4vcmVzdWx0cy9wZW15Y3JlcF93b3Jkc190b3BvZ3JhcGh5X2FkYW0ucG5nKQoKIyMgQ2VudHJhbCBlbGVjdHJvZGVzCiFbXSguLi9yZXN1bHRzL3BlbXljcmVwX3dvcmRzX3ByaW1lcl93b3JkX2FkYW0ucG5nKQoKIyMgRXhlbXBsYXIgRVJQIG9uIFBPNCBhcHJveC4KIVtdKC4uLy4uL0FEQU0vUExPVFNfYWxsX2NoYW5zLzAxX2V4ZW1wbGFyX0VSUF9iZWxpZXZfUE80YS5wbmcpCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8wMl9leGVtcGxhcl9FUlBfdW52ZWxpZXZfUE80YS5wbmcpCgojIyBFUlAgZGlmZmVyZW5jZSBvbiBQTzQgYXByb3guCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8wM19leGVtcGxhcl9FUlBfZGlmZmVyZW5jZV9iZWxpZXZfUE80YS5wbmcpCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8wNF9leGVtcGxhcl9FUlBfZGlmZmVyZW5jZV91bmJlbGlldl9QTzRhLnBuZykKCiMjIERlY29kaW5nIG92ZXIgdGltZQohW10oLi4vLi4vQURBTS9QTE9UU19hbGxfY2hhbnMvMDVfZGVjb2Rpbmdfb3Zlcl90aW1lX2JlbGlldmUucG5nKQohW10oLi4vLi4vQURBTS9QTE9UU19hbGxfY2hhbnMvMDZfZGVjb2Rpbmdfb3Zlcl90aW1lX3VuYmVsaWV2ZS5wbmcpCgojIyBJbmRpdmlkdWFsIHJlc3VsdHMsIHByZXR0eSBzaGl0dHkKIVtdKC4uLy4uL0FEQU0vUExPVFNfYWxsX2NoYW5zLzA3X2RlY29kaW5nX2J5X3N1YmplY3RfYmVsaWV2ZS5wbmcpCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8wOF9kZWNvZGluZ19ieV9zdWJqZWN0X3VuYmVsaWV2ZS5wbmcpCgojIyBBY3RpdmF0aW9uIHBhdHRlcm5zCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8wOV9hY3RpdmF0aW9uX3BhdHRlcm5fYmVsaWV2LnBuZykKIVtdKC4uLy4uL0FEQU0vUExPVFNfYWxsX2NoYW5zLzEwX2FjdGl2YXRpb25fcGF0dGVybl91bmJlbGlldi5wbmcpCgojIyBUZW1wb3JhbCBnZW5lcmFsaXphdGlvbiBwbG90CiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8xMV90ZW1wb3JhbF9nZW5lcmFsaXphdGlvbl9tYXRyaXgucG5nKQoKIyMgVGVtcG9yYWwgZ2VuZXJhbGl6YXRpb24gb3ZlciB0aW1lCiFbXSguLi8uLi9BREFNL1BMT1RTX2FsbF9jaGFucy8xMl90ZW1wb3JhbF9nZW5lcmFsaXphdGlvbl9vdmVyX3RpbWVfdHJhaW5pbmdfMzAwXzUwMC5wbmcpCgojIyBHcm91cCBkZWNvZGluZyBkaWZmZXJlbmNlcwohW10oLi4vLi4vQURBTS9QTE9UU19hbGxfY2hhbnMvMTNfZ3JvdXBfZGVjb2RpbmdfZGlmZmVyZW5jZS5wbmcpCg==