# Set general settings for markdown file
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  comment = "",
  results = "hold")


# Clear environment
rm(list = ls())


# Enable/disable caching of time-consuming code chunks
knitr_cache_enabled = TRUE


# Load packages
library(dplyr)      # for data wrangling
library(knitr)      # for integrating computing and reporting in markdown
library(kableExtra) # for customizing appearance of tables
library(MASS)       # for boxcox function and contrast definition
library(lme4)       # for (G)LMMs
library(lmerTest)   # for LMM p values (Satterthwaite's method for approximating dfs for t and F tests)
library(sjPlot)     # for tab_model function to display (G)LMM results
library(emmeans)    # for pairwise comparisons


# Load functions
source("./functions/summarySEwithinO.R")  # Function provided by R-cookbook: http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/
source("./functions/my_table_template.R") # Function to create table template


# Turn off scientific notation
options(scipen = 999)


# Prepare labels for (G)LMM tables
labels <- c(
  "(Intercept)" = "Intercept",
  "gng_response_type2-1" = "FH – SH",
  "gng_response_type3-2" = "FA – FH",
  "gng_response_type4-3" = "IR – FA",
  "word_valence2-1" = "Valence (Pos – Neg)",
  "group2-1" = "Group (OCD – HC)",
  "gng_response_type2-1:word_valence2-1" = "FH – SH x Valence",
  "gng_response_type3-2:word_valence2-1" = "FA – FH x Valence",
  "gng_response_type4-3:word_valence2-1" = "IR – FA x Valence",
  "gng_response_type2-1:group2-1" = "FH – SH x Group",
  "gng_response_type3-2:group2-1" = "FA – FH x Group",
  "gng_response_type4-3:group2-1" = "IR – FA x Group",
  "word_valence2-1:group2-1" = "Valence x Group",
  "gng_response_type2-1:word_valence2-1:group2-1" = "FH – SH x Valence x Group",
  "gng_response_type3-2:word_valence2-1:group2-1" = "FA – FH x Valence x Group",
  "gng_response_type4-3:word_valence2-1:group2-1" = "IR – FA x Valence x Group",
  "MFN_standardized" = "ERP",
  "word_valence2-1:MFN_standardized" = "Valence x ERP",
  "group2-1:MFN_standardized" = "Group x ERP",
  "word_valence2-1:group2-1:MFN_standardized" = "Valence x Group x ERP",
  "FH_FH" = "FA – FH",
  "pos_neg" = "Valence (Pos – Neg)",
  "FA_FH:pos_neg" = "FA – FH x Valence",
  "oci_centered" = "OCI-R",
  "FA_FH:oci_centered" = "FA – FH x OCI-R",
  "pos_neg:oci_centered" = "Valence x OCI-R",
  "FA_FH:pos_neg:oci_centered" = "FA – FH x Valence x OCI-R",
  "stai_centered" = "STAI",
  "FA_FH:stai_centered" = "FA – FH x STAI",
  "pos_neg:stai_centered" = "Valence x STAI",
  "FA_FH:pos_neg:stai_centered" = "FA – FH x Valence x STAI",
  "pswq_centered" = "PSWQ",
  "FA_FH:pswq_centered" = "FA – FH x PSWQ",
  "pos_neg:pswq_centered" = "Valence x PSWQ",
  "FA_FH:pos_neg:pswq_centered" = "FA – FH x Valence x PSWQ",
  "session2-1" = "Session (2 – 1)",
  "gng_response_type2-1:session2-1" = "FH – SH x Session",
  "gng_response_type3-2:session2-1" = "FA – FH x Session",
  "gng_response_type4-3:session2-1" = "IR – FA x Session",
  "word_valence2-1:session2-1" = "Valence x Session",
  "group2-1:session2-1" = "Group x Session",
  "gng_response_type2-1:word_valence2-1:session2-1" = "FH – SH x Valence x Session",
  "gng_response_type3-2:word_valence2-1:session2-1" = "FA – FH x Valence x Session",
  "gng_response_type4-3:word_valence2-1:session2-1" = "IR – FA x Valence x Session",
  "gng_response_type2-1:group2-1:session2-1" = "FH – SH x Group x Session",
  "gng_response_type3-2:group2-1:session2-1" = "FA – FH x Group x Session",
  "gng_response_type4-3:group2-1:session2-1" = "IR – FA x Group x Session",
  "word_valence2-1:group2-1:session2-1" = "Valence x Group x Session",
  "gng_response_type2-1:word_valence2-1:group2-1:session2-1" = "FH – SH x Valence x Group x Session",
  "gng_response_type3-2:word_valence2-1:group2-1:session2-1" = "FA – FH x Valence x Group x Session",
  "gng_response_type4-3:word_valence2-1:group2-1:session2-1" = "IR – FA x Valence x Group x Session",
  "MFN_standardized:session2-1" = "ERP x Session",
  "word_valence2-1:MFN_standardized:session2-1" = "Valence x ERP x Session",
  "group2-1:MFN_standardized:session2-1" = "Group x ERP x Session",
  "word_valence2-1:group2-1:MFN_standardized:session2-1" = "Valence x Group x ERP x Session")


Data Cleaning


# Load data
load(file = "./data/Single_Trial_Data.rda")
load(file = "./data/Trait_Data.rda")


# Create numeric accuracy variable (1 = correct, 0 = incorrect)
single_trial_data <- single_trial_data %>%
  dplyr::mutate(word_accuracy_numeric = ifelse(word_accuracy == "correct", 1, 0))


# For RT analysis, exclude missing responses, responses with wrong key, RT outliers,
# incorrect word categorizations, and trials with ERP artifacts
single_trial_data_rt <- single_trial_data %>%
  dplyr::filter(
    gng_response_type != "miss" &
    gng_response_type != "wrong_key" &
    word_accuracy     == "correct" &
    (is.na(gng_rt_invalid)  | gng_rt_invalid  == FALSE) &
    (is.na(word_rt_outlier) | word_rt_outlier == FALSE) &
    stimulation == "sham" &
    MFN_artifact == FALSE)


# Calculate standardized MFN (based on trials with correct word categorization, as only
# these  will be used in the LMMs with ERP as predictor)
single_trial_data_rt <- single_trial_data_rt %>%
  dplyr::group_by(participant_id) %>%
  dplyr::mutate(MFN_standardized = scale(MFN_0_100_FCz, center = TRUE, scale = TRUE)) %>%
  dplyr::ungroup()


# Center trait variables within groups (will be used as predictors)
traits <- traits %>%
  dplyr::rename(oci = "OCI-R", pswq = "PSWQ", stai = "STAI trait") %>%  
  dplyr::mutate(group = as.factor(ifelse(substr(participant_id, 1, 1) == "C", "HC", "OCD"))) %>%
  dplyr::group_by(group) %>%
  dplyr::mutate(
    oci_centered  = scale(oci,  center = TRUE, scale = FALSE),
    pswq_centered = scale(pswq, center = TRUE, scale = FALSE),
    stai_centered = scale(stai, center = TRUE, scale = FALSE)) %>%
  dplyr::ungroup()


# Add trait variables to single trial data
single_trial_data_rt <- single_trial_data_rt %>%
  dplyr::left_join(., traits %>% dplyr::select(participant_id, oci_centered, pswq_centered,
    stai_centered), by = "participant_id")


# For accuracy analysis, exclude missing responses, responses with wrong key, RT outliers,
# and trials with ERP artifacts
single_trial_data_acc <- single_trial_data %>%
  dplyr::filter(
    gng_response_type != "miss" &
    gng_response_type != "wrong_key" &
    word_accuracy     != "miss" &
    word_accuracy     != "wrong_key" &
    (is.na(gng_rt_invalid)  | gng_rt_invalid  == FALSE) &
    (is.na(word_rt_outlier) | word_rt_outlier == FALSE) &
    stimulation == "sham" &
    MFN_artifact == FALSE)


# Calculate % of excluded trials (missing responses, responses with wrong key, RT outliers)
excluded_trials_per_participant <- single_trial_data %>%
  dplyr::filter(stimulation == "sham") %>%
  dplyr::group_by(participant_id) %>%
  dplyr::summarize(excluded = sum(
    gng_response_type == "miss" |
    gng_response_type == "wrong_key" |
    word_accuracy     == "miss" |
    word_accuracy     == "wrong_key" |
    (!is.na(gng_rt_invalid)  & gng_rt_invalid  != FALSE) |
    (!is.na(word_rt_outlier) & word_rt_outlier != FALSE)) / length(participant_id) * 100) %>%
  dplyr::ungroup() %>%
  dplyr::summarize(across(-c(participant_id), list(mean, sd)))


# Make categorical variables factors
single_trial_data_rt$gng_response_type  <- factor(single_trial_data_rt$gng_response_type,
  levels = c("SH", "FH", "FA", "IR"))
single_trial_data_rt$word_valence       <- factor(single_trial_data_rt$word_valence)
single_trial_data_rt$participant_id     <- factor(single_trial_data_rt$participant_id)
single_trial_data_rt$group              <- factor(single_trial_data_rt$group)
single_trial_data_rt$session            <- factor(single_trial_data_rt$session)
single_trial_data_acc$gng_response_type <- factor(single_trial_data_acc$gng_response_type,
  levels = c("SH", "FH", "FA", "IR"))
single_trial_data_acc$word_valence      <- factor(single_trial_data_acc$word_valence)
single_trial_data_acc$participant_id    <- factor(single_trial_data_acc$participant_id)
single_trial_data_acc$group             <- factor(single_trial_data_acc$group)
single_trial_data_acc$session           <- factor(single_trial_data_acc$session)


# Aggregate data per participant for plots
data_aggregated_rt <- single_trial_data_rt %>%
  dplyr::group_by(participant_id, group, gng_response_type, word_valence) %>%
  dplyr::summarize(word_rt = mean(word_rt, na.rm = TRUE)) %>%
  dplyr::ungroup()

data_aggregated_acc <- single_trial_data_acc %>%
  dplyr::group_by(participant_id, group, gng_response_type, word_valence) %>%
  dplyr::summarize(accuracy = mean(word_accuracy_numeric, na.rm = TRUE) * 100) %>%
  dplyr::ungroup()


# Save aggregated data for plots
save(data_aggregated_rt,  file = "./saved_objects_for_plots/data_aggregated_rt.Rda")
save(data_aggregated_acc, file = "./saved_objects_for_plots/data_aggregated_acc.Rda")

In the analysis of RT and accuracy in the word categorization task, trials were discarded (M = 8.72%, SD = 3.62) if RT in the go/no-go task was below 100 ms or above 800 ms, word categorization RT deviated more than three median absolute deviations from the individual condition-specific median, response was missing, or the response was made with a key not assigned to the current task. We further discarded trials containing artifacts in the EEG, i.e., a voltage difference exceeding 200 μV within an epoch or 50 μV between sample points. In the analysis of word categorization RT, we excluded incorrect categorizations.


Descriptive Statistics


This table corresponds to Table S2 in the supplemental material.

# Calculate descriptive statistics for RT
descriptive_statistics_rt <- summarySEwithinO(
  data          = single_trial_data_rt,
  measurevar    = "word_rt",
  withinvars    = c("gng_response_type", "word_valence"),
  betweenvars   = "group",
  idvar         = "participant_id",
  conf.interval = .95) %>%
  # Rename variable and select variables for subsequent merging
  dplyr::rename(mean = word_rt) %>%
  dplyr::select("group", "gng_response_type", "word_valence", "mean", "ci")


# Calculate descriptive statistics for accuracy
descriptive_statistics_acc <- summarySEwithinO(
  data          = single_trial_data_acc,
  measurevar    = "word_accuracy_numeric",
  withinvars    = c("gng_response_type", "word_valence"),
  betweenvars   = "group",
  idvar         = "participant_id",
  conf.interval = .95) %>%
  # Multiply numeric values by 100 to obtain values in percent
  dplyr::mutate_if(is.numeric, list(~ . * 100)) %>%
  # Rename variable and select variables for subsequent merging
  dplyr::rename(mean = word_accuracy_numeric) %>%
  dplyr::select("group", "gng_response_type", "word_valence", "mean", "ci")


# Combine measures
descriptive_statistics <- as.data.frame(rbind(descriptive_statistics_rt, descriptive_statistics_acc))


# Create column with format "M [CI]" for RT (round to 0 decimals)
descriptive_statistics$M_CI <- paste0(round(descriptive_statistics$mean, 0), " [",
  round(descriptive_statistics$mean - descriptive_statistics$ci, 0), ", ",
  round(descriptive_statistics$mean + descriptive_statistics$ci, 0), "]")


# Create column with format "M [CI]" for accuracy (round to 2 decimals)
descriptive_statistics[c(17:32), ]$M_CI <- paste0(
  format(round(descriptive_statistics[c(17:32), ]$mean, 2), nsmall = 2), " [",
  format(round(descriptive_statistics[c(17:32), ]$mean -
               descriptive_statistics[c(17:32), ]$ci,   2), nsmall = 2), ", ",
  format(round(descriptive_statistics[c(17:32), ]$mean +
               descriptive_statistics[c(17:32), ]$ci,   2), nsmall = 2), "]")


# Split and re-merge table to display both groups next to each other
descriptive_statistics <- split(descriptive_statistics, descriptive_statistics$group)
descriptive_statistics_display <- cbind(
  paste(descriptive_statistics$OCD$word_valence, "word after", descriptive_statistics$OCD$gng_response_type),
  descriptive_statistics$OCD[, "M_CI"], descriptive_statistics$HC[, "M_CI"])


# Display table (and rearrange rows)
my_table_template(descriptive_statistics_display[c(8, 7, 4, 3, 2, 1, 6, 5, 16, 15, 12, 11, 10, 9, 14, 13), ],
  caption = "Descriptive Statistics for Behavioral Performance in the Word Categorization Task",
  col_names = c("Measure", rep("M [95% CI]", 2)),
  header_above_config = c("", "Patients with OCD", "Healthy control participants")) %>%
  add_footnote("\n Note. CIs are adjusted for within-participant comparisons using the method described 
  by Morey (2008).", notation = "none") %>%
  pack_rows("Response time (ms)", 1, 8) %>%
  pack_rows("Accuracy (%)", 9, 16)
Descriptive Statistics for Behavioral Performance in the Word Categorization Task
Patients with OCD
Healthy control participants
Measure M [95% CI] M [95% CI]
Response time (ms)
pos word after SH 595 [590, 600] 573 [569, 578]
neg word after SH 621 [616, 625] 590 [585, 594]
pos word after FH 596 [589, 602] 584 [577, 592]
neg word after FH 635 [628, 642] 616 [608, 624]
pos word after FA 737 [713, 760] 763 [734, 792]
neg word after FA 675 [658, 692] 628 [613, 643]
pos word after IR 696 [688, 704] 702 [693, 711]
neg word after IR 689 [681, 698] 665 [657, 672]
Accuracy (%)
pos word after SH 94.86 [94.02, 95.70] 91.66 [90.63, 92.69]
neg word after SH 94.03 [93.12, 94.93] 90.64 [89.60, 91.68]
pos word after FH 94.18 [92.89, 95.47] 91.95 [90.40, 93.49]
neg word after FH 92.35 [90.86, 93.83] 91.23 [89.69, 92.77]
pos word after FA 79.21 [75.88, 82.55] 69.01 [65.23, 72.80]
neg word after FA 94.57 [92.59, 96.54] 96.71 [94.99, 98.44]
pos word after IR 96.43 [95.45, 97.42] 92.06 [90.68, 93.44]
neg word after IR 96.14 [95.10, 97.17] 96.52 [95.53, 97.51]

Note. CIs are adjusted for within-participant comparisons using the method described
by Morey (2008).



Analysis of Response Time


We performed a linear mixed model (LMM) on single-trial data. Word categorization RT was modeled using type of the preceding go/no-go response (slow hit, fast hit, false alarm, inhibited response), word valence, and group as fixed effects.

We used sliding difference contrasts for categorical fixed effects and started with the maximal random-effects structure for each model. In case of non-convergence, random effects were specified as uncorrelated. Using principal component analysis, we identified random effects explaining zero variance and removed these, as recommended by Bates, Kliegl, et al. (2015).

Main Model

Determine Data Transformation

RT was log-transformed to normalize residuals. This was determined using the Box–Cox procedure (Box & Cox, 1964).

# Arrange plots
par(mfrow = c(1, 5))


# Determine transformation by estimating optimal lambda using Box–Cox procedure
bc_rt <- boxcox(word_rt ~ 1, data = single_trial_data_rt)
optlambda_rt <- bc_rt$x[which.max(bc_rt$y)]


# Density plot for raw RT
plot(density(single_trial_data_rt$word_rt), main = "Raw RT: Density Plot")


# Q-q plot for raw RT
qqnorm(single_trial_data_rt$word_rt, main = "Raw RT: Q-Q Plot", pch = 1)


# Density plot for log RT
plot(density(single_trial_data_rt$word_rt_log), main = "Log RT: Density Plot")


# Q-q plot for log RT
qqnorm(single_trial_data_rt$word_rt_log, main = "Log RT: Q-Q Plot", pch = 1)

# Reset plot layout
par(mfrow = c(1, 1))

The optimal lambda is -0.3, suggesting that log transformation is appropriate.


LMM

# Define contrasts (sliding difference contrasts = effect coding for factors with 2 levels)
contrasts(single_trial_data_rt$gng_response_type) <- contr.sdif(4)
contrasts(single_trial_data_rt$word_valence)      <- contr.sdif(2)
contrasts(single_trial_data_rt$group)             <- contr.sdif(2)


# Add contrasts as numerical covariates via model matrix*
model_matrix <- model.matrix(~ gng_response_type * word_valence * group, single_trial_data_rt)


# Attach the model matrix (16 columns) to the dataframe
single_trial_data_rt[, (ncol(single_trial_data_rt) + 1):(ncol(single_trial_data_rt) + 16)] <- model_matrix


# Assign descriptive names to the contrasts
names(single_trial_data_rt)[(ncol(single_trial_data_rt) - 15):ncol(single_trial_data_rt)] <- c(
  "Grand Mean", "FH_SH", "FA_FH", "IR_FA", "pos_neg", "OCD_HC", "FH_SH:pos_neg", "FA_FH:pos_neg",
  "IR_FA:pos_neg", "FH_SH:OCD_HC", "FA_FH:OCD_HC", "IR_FA:OCD_HC", "pos_neg:OCD_HC",
  "FH_SH:pos_neg:OCD_HC", "FA_FH:pos_neg:OCD_HC", "IR_FA:pos_neg:OCD_HC")


# *Note: For the random effects, we needed to enter the separate random effect terms in the models to enable
# double-bar notation (||). This allows fitting a model that sets correlations of the random terms to zero.
# Run model with maximal random-effects structure
LMM_rt_max <- lmer(word_rt_log ~ gng_response_type * word_valence * group +
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg | participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FH_SH:OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC | word),
  data = single_trial_data_rt,
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output
summary(LMM_rt_max)    # Model does not converge
isSingular(LMM_rt_max) # Singular fit


# Run zero-correlation parameter model by using || syntax to reduce model complexity
LMM_rt_red1 <- lmer(word_rt_log ~ gng_response_type * word_valence * group +
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FH_SH:OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_rt,
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
summary(LMM_rt_red1)        # Model does converge
isSingular(LMM_rt_red1)     # Singular fit
summary(rePCA(LMM_rt_red1)) # For words there are 3 terms that do not explain variance (< 0.5%)
print(VarCorr(LMM_rt_red1), comp = "Variance") # It is IR_FA, FH_SH:OCD_HC, and FA_FH:OCD_HC for words

This table corresponds to Table 3 in the manuscript.

# Run final model without random terms explaining zero variance (use log(word_rt) not word_rt_log for plotting)
LMM_rt_final <- lmer(log(word_rt) ~ gng_response_type * word_valence * group + 
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_rt,
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_final)        # Model does converge
# isSingular(LMM_rt_final)     # No singular fit
# summary(rePCA(LMM_rt_final)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_final,
  dv.labels = "RT", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite",
  wrap.labels = 80, title = "LMM Results for Word Categorization RT")


# Display random effects
print("Random effects:")
print(VarCorr(LMM_rt_final), digits = 1, comp = "Std.Dev.")


# Save model output for plot
saveRDS(LMM_rt_final, file = "./saved_objects_for_plots/LMM_rt_final.rds")
LMM Results for Word Categorization RT
  RT
Fixed effects b 95 % CI t p
Intercept 6.44 6.39 – 6.49 272.84 <0.001
FH – SH -0.02 -0.03 – -0.01 -3.05 0.003
FA – FH 0.17 0.13 – 0.21 8.42 <0.001
IR – FA -0.02 -0.06 – 0.03 -0.75 0.457
Valence (Pos – Neg) 0.01 -0.02 – 0.04 0.83 0.410
Group (OCD – HC) 0.04 -0.05 – 0.13 0.85 0.402
FH – SH x Valence -0.02 -0.04 – -0.00 -2.13 0.038
FA – FH x Valence 0.18 0.13 – 0.22 8.15 <0.001
IR – FA x Valence -0.10 -0.14 – -0.06 -5.29 <0.001
FH – SH x Group 0.01 -0.01 – 0.03 1.11 0.272
FA – FH x Group -0.02 -0.09 – 0.06 -0.40 0.688
IR – FA x Group -0.03 -0.12 – 0.06 -0.57 0.569
Valence x Group -0.05 -0.09 – -0.00 -2.17 0.034
FH – SH x Valence x Group 0.00 -0.03 – 0.04 0.05 0.963
FA – FH x Valence x Group -0.08 -0.17 – 0.01 -1.87 0.067
IR – FA x Valence x Group 0.06 -0.02 – 0.13 1.52 0.134
Observations 24189
[1] "Random effects:"
 Groups           Name          Std.Dev.
 word             OCD_HC:IR_FA  0.010   
 word.1           OCD_HC        0.005   
 word.2           FA_FH         0.009   
 word.3           FH_SH         0.009   
 word.4           (Intercept)   0.030   
 participant_id   IR_FA:pos_neg 0.116   
 participant_id.1 FA_FH:pos_neg 0.140   
 participant_id.2 FH_SH:pos_neg 0.046   
 participant_id.3 pos_neg       0.078   
 participant_id.4 IR_FA         0.163   
 participant_id.5 FA_FH         0.141   
 participant_id.6 FH_SH         0.033   
 participant_id.7 (Intercept)   0.174   
 Residual                       0.176   


RT analysis yielded a main effect of response type. Participants across groups categorized words slower after false alarms than after fast hits, indicating post-error slowing. Moreover, word categorization after fast hits was faster than after slow hits. The analysis further revealed significant two-way interactions between group and word valence and between each response type contrast and word valence. Crucially, the significant two-way interactions were qualified by a statistical trend for a three-way interaction between the response type contrast false alarms compared to fast hits, word valence, and group.


Pairwise Comparisons

Significant and hypothesis-relevant interactions were followed up with post hoc comparisons using false discovery rate adjustment.

These tables correspond to Table 4 in the manuscript.

# Set emmeans options
emm_options(lmer.df = "Satterthwaite", lmerTest.limit = Inf)


#### 1) Get contrasts for effect of word valence within each response type
emms1 <- emmeans(LMM_rt_final, ~ word_valence | gng_response_type)
contrast_1 <- contrast(emms1, interaction = "revpairwise")


# Get CIs of estimates
contrast_1_ci <- confint(contrast_1, adjust = "none", level = 0.95)[c("lower.CL", "upper.CL")]


# Merge contrast and CI in one table
follow_up_1 <- cbind(contrast_1, contrast_1_ci)


# Add adjusted p values
follow_up_1$p.value_adj_fdr <- p.adjust(follow_up_1$p.value, method = "fdr")


# Display table
my_table_template(follow_up_1[, c(2, 1, 3, 8, 9, 6, 7, 10)],
  caption = "Follow-up effect of valence nested within response type",
  digits = c(0, 0, 2, 2, 2, 2, 3, 3))


#### 2) Get contrasts for resolving interaction group * valence nested within response type
emms2 <- emmeans(LMM_rt_final, ~ word_valence * group | gng_response_type)
contrast_2 <- contrast(emms2, interaction = "revpairwise")


# Get CIs of estimates
contrast_2_ci <- confint(contrast_2, adjust = "none", level = 0.95)[c("lower.CL", "upper.CL")]


# Put contrast and CI in one table (only for FH and FA)
follow_up_2 <- cbind(contrast_2[c(2, 3), ], contrast_2_ci[c(2, 3), ])


# Get adjusted p values
follow_up_2$p.value_adj_fdr <- p.adjust(follow_up_2$p.value, method = "fdr")


# Display table
my_table_template(follow_up_2[, c(3, 1, 2, 4, 9, 10, 7, 8, 11)],
  caption = "Follow-up interaction group * valence nested within response type",
  digits = c(0, 0, 0, 2, 2, 2, 2, 3, 3))


#### 3) Get contrasts for resolving effect of valence nested within group and response type
emms3 <- emmeans(LMM_rt_final, ~ word_valence | gng_response_type * group)
contrast_3 <- contrast(emms3, interaction = "revpairwise")


# Get CIs of estimates
contrast_3_ci <- confint(contrast_3, adjust = "none", level = 0.95)[c("lower.CL", "upper.CL")]


# Put contrast and CI in one table (only for FH and FA)
follow_up_3 <- cbind(contrast_3[c(2, 3, 6, 7), ], contrast_3_ci[c(2, 3, 6, 7), ])


# Get adjusted p values 
follow_up_3$p.value_adj_fdr <- p.adjust(follow_up_3$p.value, method = "fdr")


# Display table
my_table_template(follow_up_3[c(1, 3, 2, 4), c(2, 3, 1, 4, 9, 10, 7, 8, 11)],
  caption = "Follow-up effect of valence nested within group and response type",
  digits = c(0, 0, 0, 2, 2, 2, 2, 3, 3))
Follow-up effect of valence nested within response type
gng_response_type word_valence_revpairwise estimate lower.CL upper.CL t.ratio p.value p.value_adj_fdr
SH pos - neg -0.04 -0.07 0.00 -2.16 0.033 0.044
FH pos - neg -0.06 -0.09 -0.02 -3.30 0.001 0.002
FA pos - neg 0.12 0.08 0.16 6.29 0.000 0.000
IR pos - neg 0.02 -0.02 0.06 0.99 0.325 0.325
Follow-up interaction group * valence nested within response type
gng_response_type word_valence_revpairwise group_revpairwise estimate lower.CL upper.CL t.ratio p.value p.value_adj_fdr
FH pos - neg OCD - HC -0.02 -0.08 0.04 -0.67 0.502 0.502
FA pos - neg OCD - HC -0.10 -0.17 -0.03 -2.94 0.004 0.008
Follow-up effect of valence nested within group and response type
gng_response_type group word_valence_revpairwise estimate lower.CL upper.CL t.ratio p.value p.value_adj_fdr
FH HC pos - neg -0.05 -0.09 0.00 -2.00 0.047 0.047
FH OCD pos - neg -0.07 -0.11 -0.02 -2.92 0.004 0.008
FA HC pos - neg 0.17 0.12 0.22 6.61 0.000 0.000
FA OCD pos - neg 0.07 0.02 0.12 2.67 0.008 0.011


Post hoc comparisons indicated that after false alarms, participants across groups categorized negative words faster than positive words. After fast and slow hits, participants categorized positive words faster than negative words.

After false alarms, both groups categorized negative words faster than positive words, whereas after fast hits, they categorized positive words faster than negative words. Comparisons conducted to investigate hypothesized group differences yielded that this response facilitation to negative relative to positive words after false alarms was significantly smaller in patients with OCD than in the control group, indicating a reduced priming effect.


ERPs as Predictors

For testing brain–behavior relations, the single-trial within-participant z-standardized ERP was added as predictor. ERN amplitude and CRN amplitude were entered as z-standardized continuous predictors in the models including only false alarm and fast hit trials, respectively.

ERN

# Run model with maximal random-effects structure
LMM_rt_ern_max <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg + MFN_standardized + pos_neg:MFN_standardized | participant_id) +
  (1 + OCD_HC + MFN_standardized + OCD_HC:MFN_standardized | word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FA", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output
summary(LMM_rt_ern_max)    # Model does converge
isSingular(LMM_rt_ern_max) # Singular fit


# Run zero-correlation parameter model by using || syntax to reduce model complexity
LMM_rt_ern_red1 <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg + MFN_standardized + pos_neg:MFN_standardized || participant_id) +
  (1 + OCD_HC + MFN_standardized + OCD_HC:MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FA", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
summary(LMM_rt_ern_red1)        # Model does converge
isSingular(LMM_rt_ern_red1)     # Singular fit
summary(rePCA(LMM_rt_ern_red1)) # For words there is 1 term, for participants 2 terms that do not explain variance (< 0.5%)
print(VarCorr(LMM_rt_ern_red1), comp = "Variance") # It is OCD_HC:MFN for words; MFN and pos_neg:MFN for participants

This table corresponds to Table 6 in the manuscript.

# Run final model without random terms explaining zero variance
LMM_rt_ern_final <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg || participant_id) +
  (1 + OCD_HC + MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FA", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_ern_final)        # Model does converge
# isSingular(LMM_rt_ern_final)     # No singular fit
# summary(rePCA(LMM_rt_ern_final)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_ern_final,
  dv.labels = "RT", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", 
  wrap.labels = 80, title = "LMM Results for Word Categorization RT With ERN as Predictor")


# Display random effects
print("Random effects:")
print(VarCorr(LMM_rt_ern_final), digits = 1, comp = "Std.Dev.")
LMM Results for Word Categorization RT With ERN as Predictor
  RT
Fixed effects b 95 % CI t p
Intercept 6.52 6.46 – 6.59 197.70 <0.001
Valence (Pos – Neg) 0.12 0.07 – 0.18 4.50 <0.001
Group (OCD – HC) 0.05 -0.09 – 0.18 0.68 0.497
ERP 0.00 -0.01 – 0.01 0.46 0.646
Valence x Group -0.09 -0.20 – 0.01 -1.75 0.086
Valence x ERP 0.00 -0.02 – 0.02 0.25 0.807
Group x ERP 0.01 -0.01 – 0.03 1.17 0.243
Valence x Group x ERP 0.01 -0.03 – 0.05 0.57 0.571
Observations 1992
[1] "Random effects:"
 Groups           Name             Std.Dev.
 word             MFN_standardized 0.01    
 word.1           OCD_HC           0.02    
 word.2           (Intercept)      0.02    
 participant_id   pos_neg          0.17    
 participant_id.1 (Intercept)      0.24    
 Residual                          0.23    


Analysis of word categorization RT in false alarm trials with ERN as predictor yielded a main effect of word valence, again revealing the priming effect after false alarms, with negative words being categorized faster than positive words. Contrary to our prediction, we found no significant interaction between ERN and word valence. Hence, there was no evidence for a relation between error evaluation (indexed by the RT priming effect) and ERN. Further, there was no difference in this relation between groups.


CRN

# Run model with maximal random-effects structure
LMM_rt_crn_max <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg + MFN_standardized + pos_neg:MFN_standardized | participant_id) +
  (1 + OCD_HC + MFN_standardized + OCD_HC:MFN_standardized | word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FH", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output
summary(LMM_rt_crn_max)    # Model does converge
isSingular(LMM_rt_crn_max) # Singular fit


# Run zero-correlation parameter model by using || syntax to reduce model complexity
LMM_rt_crn_red1 <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg + MFN_standardized + pos_neg:MFN_standardized || participant_id) +
  (1 + OCD_HC + MFN_standardized + OCD_HC:MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FH", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
summary(LMM_rt_crn_red1)        # Model does converge
isSingular(LMM_rt_crn_red1)     # Singular fit
summary(rePCA(LMM_rt_crn_red1)) # For words and participants there are each 2 terms that do not explain variance (< 0.5%)
print(VarCorr(LMM_rt_crn_red1), comp = "Variance") # It is OCD_HC and OCD_HC:MFN for words and MFN and pos_neg:MFN for participants

This table corresponds to Table 6 in the manuscript.

# Run final model without random terms explaining zero variance
LMM_rt_crn_final <- lmer(word_rt_log ~ word_valence * group * MFN_standardized +
  (1 + pos_neg || participant_id) +
  (1 + MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FH", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_crn_final)        # Model does converge
# isSingular(LMM_rt_crn_final)     # No singular fit
# summary(rePCA(LMM_rt_crn_final)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_crn_final,
  dv.labels = "RT", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", 
  wrap.labels = 80, title = "LMM Results for Word Categorization RT With CRN as Predictor")


# Display random effects
print("Random effects:")
print(VarCorr(LMM_rt_crn_final), digits = 1, comp = "Std.Dev.")
LMM Results for Word Categorization RT With CRN as Predictor
  RT
Fixed effects b 95 % CI t p
Intercept 6.36 6.31 – 6.40 269.74 <0.001
Valence (Pos – Neg) -0.06 -0.08 – -0.03 -4.21 <0.001
Group (OCD – HC) 0.06 -0.04 – 0.15 1.25 0.216
ERP -0.01 -0.01 – -0.00 -2.04 0.046
Valence x Group -0.03 -0.07 – 0.02 -1.14 0.257
Valence x ERP -0.00 -0.02 – 0.01 -0.84 0.406
Group x ERP -0.01 -0.02 – 0.00 -1.58 0.115
Valence x Group x ERP 0.01 -0.01 – 0.03 1.10 0.269
Observations 5025
[1] "Random effects:"
 Groups           Name             Std.Dev.
 word             MFN_standardized 0.01    
 word.1           (Intercept)      0.03    
 participant_id   pos_neg          0.08    
 participant_id.1 (Intercept)      0.17    
 Residual                          0.17    


Analysis of word categorization RT in fast hit trials including CRN as predictor indicated a main effect of word valence. This again demonstrated the priming effect after fast hits, with positive words being categorized faster than negative words. Moreover, a main effect for CRN was found, with faster RT being related to smaller CRN amplitude. There were no significant interactions between CRN, word valence, and group. Thus, we found no evidence for a relation between action evaluation and CRN and no group difference in this relation.


Traits as Predictors

To explore effects of trait anxiety, worry, and OCD symptom severity on action evaluation, we included these OCD-related characteristics as predictors. Models were calculated separately for each group since otherwise effects of trait measures are confounded by group differences. Trait measures were group-mean centered.

This table corresponds to Table S5 in the supplemental material.

# OCI in HC: Run reduced final model
LMM_rt_oci_hc <- lmer(log(word_rt) ~ FA_FH * pos_neg * oci_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "HC", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_oci_hc)        # Model does converge
# isSingular(LMM_rt_oci_hc)     # No singular fit
# summary(rePCA(LMM_rt_oci_hc)) # All terms explain variance


# OCI in OCD: Run reduced final model
LMM_rt_oci_ocd <- lmer(log(word_rt) ~ FA_FH * pos_neg * oci_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "OCD", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_oci_ocd)        # Model does converge
# isSingular(LMM_rt_oci_ocd)     # No singular fit
# summary(rePCA(LMM_rt_oci_ocd)) # All terms explain variance


# STAI in HC: Run reduced final model
LMM_rt_stai_hc <- lmer(log(word_rt) ~ FA_FH * pos_neg * stai_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "HC", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_stai_hc)        # Model does converge
# isSingular(LMM_rt_stai_hc)     # No singular fit
# summary(rePCA(LMM_rt_stai_hc)) # All terms explain variance


# STAI in OCD: Run reduced final model
LMM_rt_stai_ocd <- lmer(log(word_rt) ~ FA_FH * pos_neg * stai_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "OCD", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_stai_ocd)        # Model does converge
# isSingular(LMM_rt_stai_ocd)     # No singular fit
# summary(rePCA(LMM_rt_stai_ocd)) # All terms explain variance


# PSWQ in HC: Run reduced final model
LMM_rt_pswq_hc <- lmer(log(word_rt) ~ FA_FH * pos_neg * pswq_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "HC", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_pswq_hc)        # Model does converge
# isSingular(LMM_rt_pswq_hc)     # No singular fit
# summary(rePCA(LMM_rt_pswq_hc)) # All terms explain variance


# PSWQ in OCD: Run reduced final model
LMM_rt_pswq_ocd <- lmer(log(word_rt) ~ FA_FH * pos_neg * pswq_centered +
  (1 + FA_FH + pos_neg + FA_FH:pos_neg || participant_id) +
  (1 + FA_FH || word),
  data = single_trial_data_rt[(single_trial_data_rt$gng_response_type == "FA" |
                               single_trial_data_rt$gng_response_type == "FH") &
                               single_trial_data_rt$group == "OCD", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_pswq_ocd)        # Model does converge
# isSingular(LMM_rt_pswq_ocd)     # No singular fit
# summary(rePCA(LMM_rt_pswq_ocd)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_oci_ocd, LMM_rt_oci_hc,
  dv.labels = c("RT: OCI-R as predictor in patients with OCD", "RT: OCI-R as predictor in control participants"),
  pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", wrap.labels = 80,
  title = "LMM Results for Word Categorization RT With OCD Symptom Severity (OCI-R) as Predictor")


tab_model(LMM_rt_stai_ocd, LMM_rt_stai_hc,
  dv.labels = c("RT: STAI as predictor in patients with OCD", "RT: STAI as predictor in control participants"),
  pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", wrap.labels = 80,
  title = "LMM Results for Word Categorization RT With Trait Anxiety (STAI) as Predictor")


tab_model(LMM_rt_pswq_ocd, LMM_rt_pswq_hc,
  dv.labels = c("RT: PSWQ as predictor in patients with OCD", "RT: PSWQ as predictor in control participants"),
  pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", wrap.labels = 80,
  title = "LMM Results for Word Categorization RT With Trait Worry (PSWQ) as Predictor")


# Save model output for plot
saveRDS(LMM_rt_oci_ocd,  file = "./saved_objects_for_plots/LMM_rt_oci_ocd.rds")
saveRDS(LMM_rt_stai_ocd, file = "./saved_objects_for_plots/LMM_rt_stai_ocd.rds")


# Note: For all models with traits as predictors, the reduced models were run
# (random effects were specified as uncorrelated due to non-convergence of the
# models with the maximal random-effects structure; random effects explaining
# zero variance [all random slopes of traits for words] were removed)
LMM Results for Word Categorization RT With OCD Symptom Severity (OCI-R) as Predictor
  RT: OCI-R as predictor in patients with OCD RT: OCI-R as predictor in control participants
Fixed effects b 95 % CI t p b 95 % CI t p
Intercept 6.46 6.39 – 6.53 193.95 <0.001 6.41 6.33 – 6.50 153.07 <0.001
FA_FH 0.16 0.10 – 0.21 6.06 <0.001 0.18 0.11 – 0.24 5.21 <0.001
Valence (Pos – Neg) 0.00 -0.04 – 0.04 0.01 0.996 0.06 0.01 – 0.11 2.50 0.018
OCI-R -0.00 -0.01 – 0.01 -0.49 0.628 -0.00 -0.02 – 0.01 -0.24 0.814
FA – FH x Valence 0.14 0.09 – 0.19 5.62 <0.001 0.22 0.13 – 0.30 5.19 <0.001
FA – FH x OCI-R -0.00 -0.01 – 0.00 -1.30 0.205 0.00 -0.01 – 0.02 0.52 0.607
Valence x OCI-R -0.00 -0.01 – 0.00 -0.87 0.391 -0.00 -0.01 – 0.01 -0.32 0.755
FA – FH x Valence x OCI-R -0.01 -0.01 – -0.00 -2.44 0.021 -0.00 -0.02 – 0.01 -0.08 0.934
Observations 3660 3357
LMM Results for Word Categorization RT With Trait Anxiety (STAI) as Predictor
  RT: STAI as predictor in patients with OCD RT: STAI as predictor in control participants
Fixed effects b 95 % CI t p b 95 % CI t p
Intercept 6.46 6.39 – 6.53 194.97 <0.001 6.41 6.33 – 6.49 163.54 <0.001
FA_FH 0.16 0.10 – 0.21 6.00 <0.001 0.18 0.11 – 0.24 5.27 <0.001
Valence (Pos – Neg) 0.00 -0.04 – 0.04 0.05 0.958 0.06 0.01 – 0.11 2.51 0.018
STAI 0.00 -0.00 – 0.01 0.68 0.505 0.01 -0.00 – 0.02 1.93 0.064
FA – FH x Valence 0.14 0.09 – 0.19 5.53 <0.001 0.22 0.13 – 0.30 5.20 <0.001
FA – FH x STAI -0.00 -0.01 – 0.00 -0.89 0.380 0.00 -0.01 – 0.01 0.86 0.399
Valence x STAI -0.00 -0.00 – 0.00 -0.62 0.539 0.00 -0.00 – 0.01 0.53 0.604
FA – FH x Valence x STAI -0.00 -0.01 – 0.00 -2.03 0.053 0.00 -0.01 – 0.01 0.46 0.653
Observations 3660 3357
LMM Results for Word Categorization RT With Trait Worry (PSWQ) as Predictor
  RT: PSWQ as predictor in patients with OCD RT: PSWQ as predictor in control participants
Fixed effects b 95 % CI t p b 95 % CI t p
Intercept 6.46 6.39 – 6.53 195.05 <0.001 6.41 6.33 – 6.50 153.40 <0.001
FA_FH 0.16 0.11 – 0.21 6.19 <0.001 0.18 0.11 – 0.24 5.22 <0.001
Valence (Pos – Neg) 0.00 -0.04 – 0.04 0.04 0.968 0.06 0.01 – 0.11 2.55 0.016
PSWQ -0.00 -0.01 – 0.00 -0.76 0.451 -0.00 -0.01 – 0.01 -0.35 0.731
FA – FH x Valence 0.14 0.09 – 0.19 5.25 <0.001 0.22 0.13 – 0.30 5.21 <0.001
FA – FH x PSWQ -0.00 -0.01 – 0.00 -1.51 0.142 -0.00 -0.01 – 0.01 -0.46 0.650
Valence x PSWQ 0.00 -0.00 – 0.00 0.38 0.704 0.00 -0.00 – 0.01 1.08 0.293
FA – FH x Valence x PSWQ -0.00 -0.01 – 0.00 -0.52 0.610 0.00 -0.01 – 0.01 0.09 0.930
Observations 3660 3357


Exploratory analyses on effects of trait anxiety, worry, and OCD symptom severity on action evaluation within both groups revealed an interaction between OCD symptom severity, word valence, and the response type contrast false alarms compared to fast hits in the patient group. Thus, higher symptom severity in patients was associated with a smaller overall priming effect after fast hits and false alarms. A trend for a similar relation was observed for trait anxiety. There was no significant effect of trait worry.


Correlations

The middle and lower tables correspond to Table S6 and S7 in the supplemental material.

# Calculate overall score for ERPs and priming
df_corr <- single_trial_data_rt %>%
  # Calculate mean per participant
  dplyr::group_by(participant_id) %>%
  dplyr::summarize(
    ERN              = mean(MFN_0_100_FCz[gng_response_type == "FA"], na.rm = TRUE),
    CRN              = mean(MFN_0_100_FCz[gng_response_type == "FH"], na.rm = TRUE),
    pos_after_FA     = mean(word_rt[gng_response_type == "FA" & word_valence == "pos"], na.rm = TRUE),
    neg_after_FA     = mean(word_rt[gng_response_type == "FA" & word_valence == "neg"], na.rm = TRUE),
    pos_after_FH     = mean(word_rt[gng_response_type == "FH" & word_valence == "pos"], na.rm = TRUE),
    neg_after_FH     = mean(word_rt[gng_response_type == "FH" & word_valence == "neg"], na.rm = TRUE),
    priming_after_FA = pos_after_FA - neg_after_FA,
    priming_after_FH = neg_after_FH - pos_after_FH,
    priming          = (pos_after_FA + neg_after_FH) - (neg_after_FA + pos_after_FH)) %>%
  dplyr::ungroup() %>%
  # Merge trait variables
  dplyr::left_join(., traits, by = "participant_id")


# Calculate correlations
corr_priming_FA_ERN   <- cor.test(df_corr$priming_after_FA, df_corr$ERN)
corr_priming_FH_CRN   <- cor.test(df_corr$priming_after_FH, df_corr$CRN)
corr_priming_oci_ocd  <- cor.test(df_corr[df_corr$group == "OCD",]$priming, df_corr[df_corr$group == "OCD",]$oci)
corr_priming_oci_hc   <- cor.test(df_corr[df_corr$group == "HC", ]$priming, df_corr[df_corr$group == "HC", ]$oci)
corr_priming_stai_ocd <- cor.test(df_corr[df_corr$group == "OCD",]$priming, df_corr[df_corr$group == "OCD",]$stai)
corr_priming_stai_hc  <- cor.test(df_corr[df_corr$group == "HC", ]$priming, df_corr[df_corr$group == "HC", ]$stai)
corr_priming_pswq_ocd <- cor.test(df_corr[df_corr$group == "OCD",]$priming, df_corr[df_corr$group == "OCD",]$pswq)
corr_priming_pswq_hc  <- cor.test(df_corr[df_corr$group == "HC", ]$priming, df_corr[df_corr$group == "HC", ]$pswq)
corr_oci_stai_ocd     <- cor.test(df_corr[df_corr$group == "OCD",]$oci,     df_corr[df_corr$group == "OCD",]$stai)
corr_oci_stai_hc      <- cor.test(df_corr[df_corr$group == "HC", ]$oci,     df_corr[df_corr$group == "HC", ]$stai)
corr_oci_pswq_ocd     <- cor.test(df_corr[df_corr$group == "OCD",]$oci,     df_corr[df_corr$group == "OCD",]$pswq)
corr_oci_pswq_hc      <- cor.test(df_corr[df_corr$group == "HC", ]$oci,     df_corr[df_corr$group == "HC", ]$pswq)
corr_stai_pswq_ocd    <- cor.test(df_corr[df_corr$group == "OCD",]$stai,    df_corr[df_corr$group == "OCD",]$pswq)
corr_stai_pswq_hc     <- cor.test(df_corr[df_corr$group == "HC", ]$stai,    df_corr[df_corr$group == "HC", ]$pswq)


# Write correlations priming & ERPs in data frame
corr_erp <- rbind(cbind(corr_priming_FA_ERN$estimate,    corr_priming_FA_ERN$conf.int[1], 
                        corr_priming_FA_ERN$conf.int[2], corr_priming_FA_ERN$p.value),
                  cbind(corr_priming_FH_CRN$estimate,    corr_priming_FH_CRN$conf.int[1], 
                        corr_priming_FH_CRN$conf.int[2], corr_priming_FH_CRN$p.value))


# Write correlations priming & traits in data frame
corr_trait <- rbind(cbind(corr_priming_oci_ocd$estimate,     corr_priming_oci_ocd$conf.int[1], 
                          corr_priming_oci_ocd$conf.int[2],  corr_priming_oci_ocd$p.value,
                          corr_priming_oci_hc$estimate,      corr_priming_oci_hc$conf.int[1], 
                          corr_priming_oci_hc$conf.int[2],   corr_priming_oci_hc$p.value),
                    cbind(corr_priming_stai_ocd$estimate,    corr_priming_stai_ocd$conf.int[1], 
                          corr_priming_stai_ocd$conf.int[2], corr_priming_stai_ocd$p.value,
                          corr_priming_stai_hc$estimate,     corr_priming_stai_hc$conf.int[1], 
                          corr_priming_stai_hc$conf.int[2],  corr_priming_stai_hc$p.value),
                    cbind(corr_priming_pswq_ocd$estimate,    corr_priming_pswq_ocd$conf.int[1], 
                          corr_priming_pswq_ocd$conf.int[2], corr_priming_pswq_ocd$p.value,
                          corr_priming_pswq_hc$estimate,     corr_priming_pswq_hc$conf.int[1], 
                          corr_priming_pswq_hc$conf.int[2],  corr_priming_pswq_hc$p.value))


# Write correlations between questionnaire scores in data frame
corr_quest <- rbind(cbind(corr_oci_stai_ocd$estimate,     corr_oci_stai_ocd$conf.int[1], 
                          corr_oci_stai_ocd$conf.int[2],  corr_oci_stai_ocd$p.value,
                          corr_oci_stai_hc$estimate,      corr_oci_stai_hc$conf.int[1], 
                          corr_oci_stai_hc$conf.int[2],   corr_oci_stai_hc$p.value),
                    cbind(corr_oci_pswq_ocd$estimate,     corr_oci_pswq_ocd$conf.int[1], 
                          corr_oci_pswq_ocd$conf.int[2],  corr_oci_pswq_ocd$p.value,
                          corr_oci_pswq_hc$estimate,      corr_oci_pswq_hc$conf.int[1], 
                          corr_oci_pswq_hc$conf.int[2],   corr_oci_pswq_hc$p.value),
                    cbind(corr_stai_pswq_ocd$estimate,    corr_stai_pswq_ocd$conf.int[1], 
                          corr_stai_pswq_ocd$conf.int[2], corr_stai_pswq_ocd$p.value,
                          corr_stai_pswq_hc$estimate,     corr_stai_pswq_hc$conf.int[1], 
                          corr_stai_pswq_hc$conf.int[2],  corr_stai_pswq_hc$p.value))


# Display correlations priming & ERPs
my_table_template(data.frame(c("ERN & priming after false alarms", "CRN & priming after fast hits"), corr_erp),
  col_names = c("", "r(54)", "LL", "UL", "p"),
  digits = c(0, 2, 2, 2, 3),
  header_above_config = c(" " = 2, "95% CI" = 2, " "),
  caption = "Correlations Between ERPs and the Priming Effect")


# Display correlations priming & traits
my_table_template(data.frame(c("Obsessive-compulsive symptoms (OCI-R)", "Trait anxiety (STAI trait)",
  "Trait worry (PSWQ)"), corr_trait),
  col_names = c("Characteristic", rep(c("r(26)", "LL", "UL", "p"), 2)),
  digits = c(0, 2, 2, 2, 3, 2, 2, 2, 3),
  header_above_config = c(" " = 2, "95% CI" = 2, " " = 2, "95% CI" = 2, " "),
  caption = "Correlations Between OCD-Related Characteristics and the Overall Priming Effect After False 
  Alarms and Fast Hits") %>%
  add_header_above(c("", "Patients with OCD" = 4, "Healthy control participants" = 4)) %>%
  add_footnote("\n Note. Pearson correlation coefficients are reported.", notation = "none")


# Display correlations between questionnaire scores
my_table_template(data.frame(c("OCI-R & STAI trait", "OCI-R & PSWQ", "STAI trait & PSWQ"), corr_quest),
  col_names = c("Questionnaire scores", rep(c("r(26)", "LL", "UL", "p"), 2)),
  digits = c(0, 2, 2, 2, 3, 2, 2, 2, 3),
  header_above_config = c(" " = 2, "95% CI" = 2, " " = 2, "95% CI" = 2, " "),
  caption = "Correlations Between Questionnaire Scores") %>%
  add_header_above(c("", "Patients with OCD" = 4, "Healthy control participants" = 4)) %>%
  add_footnote("\n Note. Pearson correlation coefficients are reported.", notation = "none")


# Save correlation dataframe for scatterplots
save(df_corr, file = "./saved_objects_for_plots/df_corr.Rda")
Correlations Between ERPs and the Priming Effect
95% CI
r(54) LL UL p
ERN & priming after false alarms -0.09 -0.34 0.18 0.525
CRN & priming after fast hits 0.15 -0.12 0.40 0.273
Correlations Between OCD-Related Characteristics and the Overall Priming Effect After False Alarms and Fast Hits
Patients with OCD
Healthy control participants
95% CI
95% CI
Characteristic r(26) LL UL p r(26) LL UL p
Obsessive-compulsive symptoms (OCI-R) -0.41 -0.68 -0.05 0.029 -0.05 -0.42 0.33 0.790
Trait anxiety (STAI trait) -0.34 -0.63 0.04 0.078 0.15 -0.24 0.49 0.459
Trait worry (PSWQ) -0.22 -0.55 0.17 0.264 0.02 -0.35 0.39 0.903

Note. Pearson correlation coefficients are reported.
Correlations Between Questionnaire Scores
Patients with OCD
Healthy control participants
95% CI
95% CI
Questionnaire scores r(26) LL UL p r(26) LL UL p
OCI-R & STAI trait 0.53 0.19 0.75 0.004 0.39 0.01 0.66 0.043
OCI-R & PSWQ 0.33 -0.05 0.62 0.091 0.40 0.03 0.67 0.034
STAI trait & PSWQ 0.62 0.32 0.81 0.000 0.42 0.06 0.69 0.025

Note. Pearson correlation coefficients are reported.


There was no correlation between the priming effect after false alarms and ERN across participants. Also no correlation was observed between the priming effect after fast hits and CRN across participants.

The correlation analysis revealed a negative correlation between the overall priming effect and symptom severity in patients. A trend for a similar relation was observed for trait anxiety.


Analysis of Accuracy


We performed a binomial generalized linear mixed model (GLMM) on single-trial data. Word categorization accuracy was modeled using type of the preceding go/no-go response (slow hit, fast hit, false alarm, inhibited response), word valence, and group as fixed effects.

We used sliding difference contrasts for categorical fixed effects and started with the maximal random-effects structure for each model. In case of non-convergence, random effects were specified as uncorrelated. Using principal component analysis, we identified random effects explaining zero variance and removed these, as recommended by Bates, Kliegl, et al. (2015).

GLMM

# Define contrasts (sliding difference contrasts = effect coding for factors with 2 levels)
contrasts(single_trial_data_acc$gng_response_type) <- contr.sdif(4)
contrasts(single_trial_data_acc$word_valence)      <- contr.sdif(2)
contrasts(single_trial_data_acc$group)             <- contr.sdif(2)


# Add contrasts as numerical covariates via model matrix*
model_matrix_2 <- model.matrix(~ gng_response_type * word_valence * group, single_trial_data_acc)


# Attach the model matrix (16 columns) to the dataframe
single_trial_data_acc[, (ncol(single_trial_data_acc) + 1):(ncol(single_trial_data_acc) + 16)] <- model_matrix_2


# Assign descriptive names to the contrasts
names(single_trial_data_acc)[(ncol(single_trial_data_acc) - 15):ncol(single_trial_data_acc)] <- c(
  "Grand Mean", "FH_SH", "FA_FH", "IR_FA", "pos_neg", "OCD_HC", "FH_SH:pos_neg", "FA_FH:pos_neg",
  "IR_FA:pos_neg", "FH_SH:OCD_HC", "FA_FH:OCD_HC", "IR_FA:OCD_HC", "pos_neg:OCD_HC",
  "FH_SH:pos_neg:OCD_HC", "FA_FH:pos_neg:OCD_HC", "IR_FA:pos_neg:OCD_HC")


# *Note: For the random effects, we needed to enter the separate random effect terms in the models to enable
# double-bar notation (||). This allows fitting a model that sets correlations of the random terms to zero.
# Run model with maximal random-effects structure
GLMM_acc_max <- glmer(word_accuracy_numeric ~ gng_response_type * word_valence * group +
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg | participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FH_SH:OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC | word),
  data = single_trial_data_acc,
  family = binomial,
  control = glmerControl(optimizer = "bobyqa"))


# Check model output
summary(GLMM_acc_max)    # Model does not converge
isSingular(GLMM_acc_max) # Singular fit


# Run zero-correlation parameter model by using || syntax to reduce model complexity
GLMM_acc_red1 <- glmer(word_accuracy_numeric ~ gng_response_type * word_valence * group +
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FH_SH:OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_acc,
  family = binomial,
  control = glmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
summary(GLMM_acc_red1)        # Model does converge
isSingular(GLMM_acc_red1)     # Singular fit
summary(rePCA(GLMM_acc_red1)) # For words there is 1 term, for participants 2 terms that do not explain variance (< 0.5%)
print(VarCorr(GLMM_acc_red1), comp = "Variance") # It is FH_SH:OCD_HC for words and FH_SH, FH_SH:pos_neg for participants

This table corresponds to Table 3 in the manuscript.

# Run final model without random terms explaining zero variance
GLMM_acc_final <- glmer(word_accuracy_numeric ~ gng_response_type * word_valence * group +
  (1 + FA_FH + IR_FA + pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_acc,
  family = binomial,
  control = glmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(GLMM_acc_final)        # Model does converge
# isSingular(GLMM_acc_final)     # No singular fit
# summary(rePCA(GLMM_acc_final)) # All terms explain variance


# Display results (fixed effects)
tab_model(GLMM_acc_final,
  dv.labels = "Accuracy", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "Odds ratio", string.stat = "z", string.ci = "95 % CI", wrap.labels = 80,
  title = "GLMM Results for Word Categorization Accuracy")


# Display random effects
print("Random effects:")
print(VarCorr(GLMM_acc_final), digits = 1, comp = "Std.Dev.")


# Save model output for plot
saveRDS(GLMM_acc_final, file = "./saved_objects_for_plots/GLMM_acc_final.rds")
GLMM Results for Word Categorization Accuracy
  Accuracy
Fixed effects Odds ratio 95 % CI z p
Intercept 21.38 16.82 – 27.18 25.02 <0.001
FH – SH 0.87 0.76 – 1.00 -1.92 0.055
FA – FH 0.68 0.52 – 0.88 -2.89 0.004
IR – FA 2.92 2.26 – 3.78 8.17 <0.001
Valence (Pos – Neg) 0.55 0.37 – 0.80 -3.13 0.002
Group (OCD – HC) 1.30 0.86 – 1.96 1.25 0.213
FH – SH x Valence 1.07 0.81 – 1.42 0.46 0.646
FA – FH x Valence 0.10 0.06 – 0.18 -7.75 <0.001
IR – FA x Valence 5.44 3.20 – 9.26 6.26 <0.001
FH – SH x Group 0.82 0.63 – 1.07 -1.45 0.147
FA – FH x Group 0.92 0.56 – 1.52 -0.34 0.737
IR – FA x Group 1.18 0.71 – 1.96 0.65 0.517
Valence x Group 1.90 1.05 – 3.43 2.13 0.033
FH – SH x Valence x Group 1.05 0.62 – 1.79 0.20 0.844
FA – FH x Valence x Group 1.89 0.62 – 5.77 1.12 0.262
IR – FA x Valence x Group 0.75 0.26 – 2.17 -0.53 0.599
Observations 26123
[1] "Random effects:"
 Groups           Name          Std.Dev.
 word             IR_FA:OCD_HC  0.15    
 word.1           FA_FH:OCD_HC  0.17    
 word.2           OCD_HC        0.33    
 word.3           IR_FA         0.09    
 word.4           FA_FH         0.33    
 word.5           FH_SH         0.19    
 word.6           (Intercept)   0.50    
 participant_id   IR_FA:pos_neg 1.08    
 participant_id.1 FA_FH:pos_neg 1.39    
 participant_id.2 pos_neg       0.94    
 participant_id.3 IR_FA         0.44    
 participant_id.4 FA_FH         0.53    
 participant_id.5 (Intercept)   0.72    


Analysis of categorization accuracy revealed main effects of response type and word valence, which were qualified by significant interactions between response type and word valence and between group and word valence.


Pairwise Comparisons

Significant and hypothesis-relevant interactions were followed up with post hoc comparisons using false discovery rate adjustment.

These tables correspond to Table 4 in the manuscript.

#### 1) Get contrasts for effect of word valence within each response type
emms1 <- emmeans(GLMM_acc_final, ~ word_valence | gng_response_type)
contrast_1 <- contrast(emms1, interaction = "revpairwise")


# Get CIs of estimates
contrast_1_ci <- confint(contrast_1, adjust = "none", level = 0.95)[c("asymp.LCL", "asymp.UCL")]


# Merge contrast and CI in one table
follow_up_1 <- cbind(contrast_1, contrast_1_ci)


# Add adjusted p values
follow_up_1$p.value_adj_fdr <- p.adjust(follow_up_1$p.value, method = "fdr")


# Here, estimates and CI are log odds ratios, not like in the other tables odds ratios.
# To get the odds ratios from the log odds ratios, we have to transform the values by using the exp() function
follow_up_1$estimate  <- exp(follow_up_1$estimate)
follow_up_1$asymp.LCL <- exp(follow_up_1$asymp.LCL)
follow_up_1$asymp.UCL <- exp(follow_up_1$asymp.UCL)


# Display table
my_table_template(follow_up_1[, c(2, 1, 3, 8, 9, 6, 7, 10)],
  caption = "Follow-up effect of valence nested within response type",
  digits = c(0, 0, 2, 2, 2, 2, 3, 3))


#### 2) Get contrasts for resolving interaction group * valence nested within response type
emms2 <- emmeans(GLMM_acc_final, ~ word_valence * group | gng_response_type)
contrast_2 <- contrast(emms2, interaction = "revpairwise")


# Get CIs of estimates
contrast_2_ci <- confint(contrast_2, adjust = "none", level = 0.95)[c("asymp.LCL", "asymp.UCL")]


# Put contrast and CI in one table (only for FH and FA)
follow_up_2 <- cbind(contrast_2[c(2, 3), ], contrast_2_ci[c(2, 3), ])


# Get adjusted p values
follow_up_2$p.value_adj_fdr <- p.adjust(follow_up_2$p.value, method = "fdr")


# Here, estimates and CI are log odds ratios, not like in the other tables odds ratios.
# To get the odds ratios from the log odds ratios, we have to transform the values by using the exp() function
follow_up_2$estimate  <- exp(follow_up_2$estimate)
follow_up_2$asymp.LCL <- exp(follow_up_2$asymp.LCL)
follow_up_2$asymp.UCL <- exp(follow_up_2$asymp.UCL)


# Display table
my_table_template(follow_up_2[, c(3, 1, 2, 4, 9, 10, 7, 8, 11)],
  caption = "Follow-up interaction group * valence nested within response type",
  digits = c(0, 0, 0, 2, 2, 2, 2, 3, 3))


#### 3) Get contrasts for resolving effect of valence nested within group and response type
emms3 <- emmeans(GLMM_acc_final, ~ word_valence | gng_response_type * group)
contrast_3 <- contrast(emms3, interaction = "revpairwise")


# Get CIs of estimates
contrast_3_ci <- confint(contrast_3, adjust = "none", level = 0.95)[c("asymp.LCL", "asymp.UCL")]


# Put contrast and CI in one table (only for FH and FA)
follow_up_3 <- cbind(contrast_3[c(2, 3, 6, 7), ], contrast_3_ci[c(2, 3, 6, 7), ])


# Get adjusted p values
follow_up_3$p.value_adj_fdr <- p.adjust(follow_up_3$p.value, method = "fdr")


# Here, estimates and CI are log odds ratios, not like in the other tables odds ratios.
# To get the odds ratios from the log odds ratios, we have to transform the values by using the exp() function
follow_up_3$estimate  <- exp(follow_up_3$estimate)
follow_up_3$asymp.LCL <- exp(follow_up_3$asymp.LCL)
follow_up_3$asymp.UCL <- exp(follow_up_3$asymp.UCL)


# Display table
my_table_template(follow_up_3[c(1, 3, 2, 4), c(2, 3, 1, 4, 9, 10, 7, 8, 11)],
  caption = "Follow-up effect of valence nested within group and response type",
  digits = c(0, 0, 0, 2, 2, 2, 2, 3, 3))
Follow-up effect of valence nested within response type
gng_response_type word_valence_revpairwise estimate asymp.LCL asymp.UCL z.ratio p.value p.value_adj_fdr
SH pos - neg 1.08 0.68 1.69 0.32 0.752 0.752
FH pos - neg 1.15 0.72 1.84 0.58 0.563 0.750
FA pos - neg 0.11 0.07 0.20 -7.79 0.000 0.000
IR pos - neg 0.63 0.36 1.08 -1.69 0.091 0.182
Follow-up interaction group * valence nested within response type
gng_response_type word_valence_revpairwise group_revpairwise estimate asymp.LCL asymp.UCL z.ratio p.value p.value_adj_fdr
FH pos - neg OCD - HC 1.50 0.68 3.33 1.01 0.315 0.315
FA pos - neg OCD - HC 2.84 1.08 7.46 2.12 0.034 0.067
Follow-up effect of valence nested within group and response type
gng_response_type group word_valence_revpairwise estimate asymp.LCL asymp.UCL z.ratio p.value p.value_adj_fdr
FH HC pos - neg 0.94 0.51 1.73 -0.21 0.836 0.836
FH OCD pos - neg 1.41 0.76 2.62 1.08 0.278 0.371
FA HC pos - neg 0.07 0.03 0.14 -7.09 0.000 0.000
FA OCD pos - neg 0.19 0.10 0.39 -4.52 0.000 0.000


Post hoc comparisons indicated that after false alarms, participants across and within groups categorized negative words more accurately than positive words. This response facilitation to negative relative to positive words after false alarms was smaller in patients with OCD compared to control participants at trend level.


Control Analysis


The study was part of a project comprising one session with active and one with placebo transcranial direct current stimulation in counterbalanced order, which preceded task performance. In the present study, data from the placebo session were analyzed. Thus, measurements of participants who completed the task for the first or second time were included. Importantly, control analyses indicated that task familiarity (i.e., session number) did not impact hypothesis-relevant results.

RT: Session as Cov.

This table corresponds to Table S10 in the supplemental material.

# Define contrasts (sliding difference contrasts = effect coding for factors with 2 levels)
contrasts(single_trial_data_rt$session) <- contr.sdif(2)


# Run reduced final model (we get same model when starting with all random effects & correlation parameters)
LMM_rt_session <- lmer(word_rt_log ~ gng_response_type * word_valence * group * session +
  (1 + FH_SH + FA_FH + IR_FA + pos_neg + FH_SH:pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_rt,
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_session)        # Model does converge
# isSingular(LMM_rt_session)     # No singular fit
# summary(rePCA(LMM_rt_session)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_session,
  dv.labels = "RT", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", wrap.labels = 80,
  title = "LMM Results for Word Categorization RT With Session Number as Covariate")
LMM Results for Word Categorization RT With Session Number as Covariate
  RT
Fixed effects b 95 % CI t p
Intercept 6.44 6.39 – 6.49 272.93 <0.001
FH – SH -0.02 -0.03 – -0.01 -3.09 0.003
FA – FH 0.17 0.13 – 0.21 8.31 <0.001
IR – FA -0.02 -0.06 – 0.03 -0.71 0.482
Valence (Pos – Neg) 0.01 -0.02 – 0.04 0.77 0.445
Group (OCD – HC) 0.03 -0.06 – 0.13 0.74 0.466
Session (2 – 1) -0.07 -0.16 – 0.02 -1.53 0.132
FH – SH x Valence -0.02 -0.04 – -0.00 -2.29 0.027
FA – FH x Valence 0.18 0.14 – 0.22 8.31 <0.001
IR – FA x Valence -0.10 -0.14 – -0.06 -5.41 <0.001
FH – SH x Group 0.01 -0.01 – 0.03 1.04 0.305
FA – FH x Group -0.02 -0.10 – 0.06 -0.42 0.675
IR – FA x Group -0.02 -0.12 – 0.07 -0.54 0.591
Valence x Group -0.04 -0.09 – -0.00 -2.10 0.041
FH – SH x Session -0.01 -0.03 – 0.02 -0.45 0.652
FA – FH x Session -0.02 -0.10 – 0.06 -0.60 0.551
IR – FA x Session 0.02 -0.07 – 0.11 0.45 0.654
Valence x Session 0.03 -0.01 – 0.08 1.60 0.116
Group x Session -0.01 -0.20 – 0.17 -0.16 0.875
FH – SH x Valence x Group -0.00 -0.04 – 0.03 -0.16 0.872
FA – FH x Valence x Group -0.08 -0.17 – 0.00 -1.94 0.058
IR – FA x Valence x Group 0.06 -0.01 – 0.14 1.68 0.100
FH – SH x Valence x Session -0.04 -0.08 – -0.01 -2.53 0.015
FA – FH x Valence x Session -0.03 -0.12 – 0.05 -0.77 0.443
IR – FA x Valence x Session 0.06 -0.02 – 0.13 1.58 0.120
FH – SH x Group x Session -0.02 -0.06 – 0.03 -0.87 0.389
FA – FH x Group x Session 0.01 -0.15 – 0.18 0.19 0.854
IR – FA x Group x Session 0.05 -0.13 – 0.24 0.60 0.552
Valence x Group x Session -0.03 -0.11 – 0.06 -0.60 0.550
FH – SH x Valence x Group x Session -0.02 -0.08 – 0.05 -0.46 0.647
FA – FH x Valence x Group x Session 0.15 -0.03 – 0.32 1.71 0.093
IR – FA x Valence x Group x Session -0.10 -0.25 – 0.05 -1.32 0.192
Observations 24189




RT with ERN & CRN: Session as Cov.

This table corresponds to Table S11 in the supplemental material.

# Define contrasts (sliding difference contrasts = effect coding for factors with 2 levels)
contrasts(single_trial_data_rt$session) <- contr.sdif(2)


# Run reduced final model on ERN (we get same model when starting with all random effects & correlation parameters)
LMM_rt_ern_session <- lmer(word_rt_log ~ word_valence * group * MFN_standardized * session +
  (1 + pos_neg || participant_id) +
  (1 + OCD_HC + MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FA", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_ern_session)        # Model does converge
# isSingular(LMM_rt_ern_session)     # No singular fit
# summary(rePCA(LMM_rt_ern_session)) # All terms explain variance


# Run reduced final model on CRN (we get same model when starting with all random effects & correlation parameters)
LMM_rt_crn_session <- lmer(word_rt_log ~ word_valence * group * MFN_standardized * session +
  (1 + pos_neg || participant_id) +
  (1 + MFN_standardized || word),
  data = single_trial_data_rt[single_trial_data_rt$gng_response_type == "FH", ],
  REML = TRUE,
  control = lmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(LMM_rt_crn_session)        # Model does converge
# isSingular(LMM_rt_crn_session)     # No singular fit
# summary(rePCA(LMM_rt_crn_session)) # All terms explain variance


# Display results (fixed effects)
tab_model(LMM_rt_ern_session, LMM_rt_crn_session,
  dv.labels = c("With ERN as predictor", "With CRN as predictor"), pred.labels = labels, show.stat = TRUE, 
  show.icc = FALSE, show.r2 = FALSE, show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", 
  string.pred = "Fixed effects", string.est = "b", string.stat = "t", string.ci = "95 % CI", p.val = "satterthwaite", 
  wrap.labels = 80, title = "LMM Results for Word Categorization RT With ERN and CRN as Predictor and Session Number 
  as Covariate")
LMM Results for Word Categorization RT With ERN and CRN as Predictor and Session Number as Covariate
  With ERN as predictor With CRN as predictor
Fixed effects b 95 % CI t p b 95 % CI t p
Intercept 6.52 6.46 – 6.59 197.06 <0.001 6.35 6.31 – 6.40 269.82 <0.001
Valence (Pos – Neg) 0.12 0.07 – 0.18 4.44 <0.001 -0.06 -0.08 – -0.03 -4.27 <0.001
Group (OCD – HC) 0.04 -0.09 – 0.17 0.59 0.555 0.05 -0.04 – 0.15 1.16 0.253
ERP 0.00 -0.01 – 0.01 0.43 0.665 -0.01 -0.01 – -0.00 -2.25 0.027
Session (2 – 1) -0.09 -0.22 – 0.04 -1.33 0.189 -0.06 -0.16 – 0.03 -1.35 0.182
Valence x Group -0.09 -0.20 – 0.01 -1.76 0.084 -0.03 -0.07 – 0.02 -1.10 0.274
Valence x ERP 0.00 -0.02 – 0.02 0.21 0.833 -0.01 -0.02 – 0.01 -0.93 0.357
Group x ERP 0.01 -0.01 – 0.03 1.20 0.229 -0.01 -0.02 – 0.00 -1.39 0.166
Valence x Session -0.01 -0.12 – 0.10 -0.19 0.851 0.02 -0.02 – 0.07 1.06 0.295
Group x Session -0.02 -0.29 – 0.24 -0.16 0.872 -0.05 -0.23 – 0.14 -0.49 0.627
ERP x Session 0.00 -0.02 – 0.02 0.30 0.764 -0.01 -0.02 – 0.00 -1.33 0.185
Valence x Group x ERP 0.01 -0.03 – 0.05 0.52 0.605 0.01 -0.01 – 0.03 0.61 0.541
Valence x Group x Session 0.06 -0.15 – 0.28 0.60 0.554 -0.07 -0.16 – 0.03 -1.44 0.156
Valence x ERP x Session 0.00 -0.03 – 0.04 0.20 0.840 -0.00 -0.02 – 0.02 -0.36 0.716
Group x ERP x Session -0.01 -0.04 – 0.03 -0.29 0.770 0.02 -0.01 – 0.04 1.43 0.153
Valence x Group x ERP x Session 0.01 -0.07 – 0.08 0.18 0.856 -0.04 -0.08 – 0.01 -1.71 0.088
Observations 1992 5025




Accuracy: Session as Cov.

This table corresponds to Table S10 in the supplemental material.

# Define contrasts (sliding difference contrasts = effect coding for factors with 2 levels)
contrasts(single_trial_data_acc$session) <- contr.sdif(2)


# Run reduced final model (we get same model when starting with all random effects & correlation parameters)
GLMM_acc_session <- glmer(word_accuracy_numeric ~ gng_response_type * word_valence * group * session +
  (1 + FA_FH + IR_FA + pos_neg + FA_FH:pos_neg + IR_FA:pos_neg || participant_id) +
  (1 + FH_SH + FA_FH + IR_FA + OCD_HC + FA_FH:OCD_HC + IR_FA:OCD_HC || word),
  data = single_trial_data_acc,
  family = binomial,
  control = glmerControl(optimizer = "bobyqa"))


# Check model output and PCA of random-effects variance-covariance estimates
# summary(GLMM_acc_session)        # Model does converge
# isSingular(GLMM_acc_session)     # No singular fit
# summary(rePCA(GLMM_acc_session)) # All terms explain variance


# Display results (fixed effects)
tab_model(GLMM_acc_session,
  dv.labels = "Accuracy", pred.labels = labels, show.stat = TRUE, show.icc = FALSE, show.r2 = FALSE,
  show.re.var = FALSE, show.ngroups = FALSE, minus.sign = "-", string.pred = "Fixed effects",
  string.est = "Odds ratio", string.stat = "z", string.ci = "95 % CI", wrap.labels = 80,
  title = "GLMM Results for Word Categorization Accuracy With Session Number as Covariate")
GLMM Results for Word Categorization Accuracy With Session Number as Covariate
  Accuracy
Fixed effects Odds ratio 95 % CI z p
Intercept 21.31 16.79 – 27.05 25.14 <0.001
FH – SH 0.86 0.75 – 1.00 -2.01 0.045
FA – FH 0.70 0.54 – 0.91 -2.66 0.008
IR – FA 2.83 2.19 – 3.65 7.95 <0.001
Valence (Pos – Neg) 0.55 0.38 – 0.79 -3.18 0.001
Group (OCD – HC) 1.27 0.85 – 1.91 1.15 0.248
Session (2 – 1) 0.88 0.59 – 1.31 -0.61 0.539
FH – SH x Valence 1.07 0.80 – 1.42 0.47 0.639
FA – FH x Valence 0.09 0.05 – 0.17 -8.12 <0.001
IR – FA x Valence 5.56 3.29 – 9.38 6.42 <0.001
FH – SH x Group 0.83 0.63 – 1.08 -1.38 0.167
FA – FH x Group 0.90 0.54 – 1.49 -0.41 0.683
IR – FA x Group 1.17 0.71 – 1.94 0.62 0.537
Valence x Group 1.87 1.06 – 3.30 2.15 0.031
FH – SH x Session 0.96 0.73 – 1.25 -0.32 0.752
FA – FH x Session 1.97 1.19 – 3.25 2.65 0.008
IR – FA x Session 0.49 0.30 – 0.81 -2.79 0.005
Valence x Session 0.49 0.29 – 0.84 -2.58 0.010
Group x Session 0.80 0.36 – 1.77 -0.56 0.578
FH – SH x Valence x Group 1.03 0.61 – 1.76 0.12 0.907
FA – FH x Valence x Group 2.29 0.77 – 6.80 1.49 0.136
IR – FA x Valence x Group 0.68 0.24 – 1.93 -0.73 0.466
FH – SH x Valence x Session 1.07 0.63 – 1.81 0.24 0.812
FA – FH x Valence x Session 0.48 0.16 – 1.41 -1.34 0.181
IR – FA x Valence x Session 2.58 0.91 – 7.34 1.78 0.075
FH – SH x Group x Session 1.44 0.84 – 2.45 1.34 0.181
FA – FH x Group x Session 0.48 0.18 – 1.30 -1.44 0.150
IR – FA x Group x Session 2.42 0.90 – 6.52 1.74 0.081
Valence x Group x Session 0.69 0.23 – 2.03 -0.68 0.498
FH – SH x Valence x Group x Session 0.58 0.20 – 1.66 -1.02 0.308
FA – FH x Valence x Group x Session 0.17 0.02 – 1.43 -1.63 0.103
IR – FA x Valence x Group x Session 2.27 0.29 – 17.67 0.78 0.435
Observations 26123




References


Bates, D., Kliegl, R., Vasishth, S., & Baayen, H. (2015). Parsimonious mixed models. arXiv. https://arxiv.org/abs/1506.04967v2

Box, G. E., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society: Series B (Methodological), 26(2), 211–243. https://doi.org/10.1111/j.2517-6161.1964.tb00553.x

Morey, R. (2008). Confidence intervals from normalized data: A correction to Cousineau (2005). Tutorials in Quantitative Methods for Psychology, 4(2), 61–64. https://doi.org/10.20982/tqmp.04.2.p061


Session Info


sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] plyr_1.8.7       emmeans_1.6.0    sjPlot_2.8.11    lmerTest_3.1-3  
 [5] lme4_1.1-25      Matrix_1.5-1     MASS_7.3-51.4    kableExtra_1.3.4
 [9] knitr_1.40       dplyr_1.0.10    

loaded via a namespace (and not attached):
 [1] httr_1.4.4          sass_0.4.0          tidyr_1.2.1        
 [4] jsonlite_1.8.3      viridisLite_0.4.1   splines_3.6.1      
 [7] modelr_0.1.9        bslib_0.4.0         datawizard_0.6.2   
[10] assertthat_0.2.1    statmod_1.4.37      highr_0.9          
[13] renv_0.12.0         yaml_2.2.1          bayestestR_0.13.0  
[16] numDeriv_2016.8-1.1 pillar_1.8.1        backports_1.4.1    
[19] lattice_0.20-45     glue_1.6.2          digest_0.6.30      
[22] rvest_1.0.3         minqa_1.2.4         colorspace_2.0-3   
[25] htmltools_0.5.3     pkgconfig_2.0.3     broom_1.0.1        
[28] purrr_0.3.5         xtable_1.8-4        mvtnorm_1.1-3      
[31] scales_1.2.1        webshot_0.5.4       svglite_2.1.0      
[34] tibble_3.1.8        generics_0.1.3      ggplot2_3.3.6      
[37] sjlabelled_1.2.0    cachem_1.0.4        withr_2.5.0        
[40] cli_3.4.1           magrittr_2.0.3      effectsize_0.7.0.5 
[43] estimability_1.4.1  evaluate_0.16       fansi_1.0.3        
[46] nlme_3.1-140        xml2_1.3.3          tools_3.6.1        
[49] lifecycle_1.0.3     stringr_1.4.1       munsell_0.5.0      
[52] ggeffects_1.1.3     compiler_3.6.1      jquerylib_0.1.4    
[55] systemfonts_1.0.4   rlang_1.0.6         grid_3.6.1         
[58] nloptr_1.2.2.2      parameters_0.19.0   rstudioapi_0.14    
[61] rmarkdown_2.16      boot_1.3-22         gtable_0.3.1       
[64] sjstats_0.18.1      DBI_1.1.3           sjmisc_2.8.9       
[67] R6_2.5.1            performance_0.10.0  fastmap_1.1.0      
[70] utf8_1.2.2          insight_0.18.4      stringi_1.6.1      
[73] Rcpp_1.0.9          vctrs_0.5.0         tidyselect_1.2.0   
[76] xfun_0.33          
LS0tDQp0aXRsZTogIldvcmQgQ2F0ZWdvcml6YXRpb24gRGF0YSAoJiBFUlBzKSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQo8IS0tIFNldCBnZW5lcmFsIHNldHRpbmdzIC0tPg0KDQpgYGB7ciBzZXR1cCwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9DQoNCiMgU2V0IGdlbmVyYWwgc2V0dGluZ3MgZm9yIG1hcmtkb3duIGZpbGUNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIGNvbW1lbnQgPSAiIiwNCiAgcmVzdWx0cyA9ICJob2xkIikNCg0KDQojIENsZWFyIGVudmlyb25tZW50DQpybShsaXN0ID0gbHMoKSkNCg0KDQojIEVuYWJsZS9kaXNhYmxlIGNhY2hpbmcgb2YgdGltZS1jb25zdW1pbmcgY29kZSBjaHVua3MNCmtuaXRyX2NhY2hlX2VuYWJsZWQgPSBUUlVFDQoNCg0KIyBMb2FkIHBhY2thZ2VzDQpsaWJyYXJ5KGRwbHlyKSAgICAgICMgZm9yIGRhdGEgd3JhbmdsaW5nDQpsaWJyYXJ5KGtuaXRyKSAgICAgICMgZm9yIGludGVncmF0aW5nIGNvbXB1dGluZyBhbmQgcmVwb3J0aW5nIGluIG1hcmtkb3duDQpsaWJyYXJ5KGthYmxlRXh0cmEpICMgZm9yIGN1c3RvbWl6aW5nIGFwcGVhcmFuY2Ugb2YgdGFibGVzDQpsaWJyYXJ5KE1BU1MpICAgICAgICMgZm9yIGJveGNveCBmdW5jdGlvbiBhbmQgY29udHJhc3QgZGVmaW5pdGlvbg0KbGlicmFyeShsbWU0KSAgICAgICAjIGZvciAoRylMTU1zDQpsaWJyYXJ5KGxtZXJUZXN0KSAgICMgZm9yIExNTSBwIHZhbHVlcyAoU2F0dGVydGh3YWl0ZSdzIG1ldGhvZCBmb3IgYXBwcm94aW1hdGluZyBkZnMgZm9yIHQgYW5kIEYgdGVzdHMpDQpsaWJyYXJ5KHNqUGxvdCkgICAgICMgZm9yIHRhYl9tb2RlbCBmdW5jdGlvbiB0byBkaXNwbGF5IChHKUxNTSByZXN1bHRzDQpsaWJyYXJ5KGVtbWVhbnMpICAgICMgZm9yIHBhaXJ3aXNlIGNvbXBhcmlzb25zDQoNCg0KIyBMb2FkIGZ1bmN0aW9ucw0Kc291cmNlKCIuL2Z1bmN0aW9ucy9zdW1tYXJ5U0V3aXRoaW5PLlIiKSAgIyBGdW5jdGlvbiBwcm92aWRlZCBieSBSLWNvb2tib29rOiBodHRwOi8vd3d3LmNvb2tib29rLXIuY29tL0dyYXBocy9QbG90dGluZ19tZWFuc19hbmRfZXJyb3JfYmFyc18oZ2dwbG90MikvDQpzb3VyY2UoIi4vZnVuY3Rpb25zL215X3RhYmxlX3RlbXBsYXRlLlIiKSAjIEZ1bmN0aW9uIHRvIGNyZWF0ZSB0YWJsZSB0ZW1wbGF0ZQ0KDQoNCiMgVHVybiBvZmYgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQoNCg0KIyBQcmVwYXJlIGxhYmVscyBmb3IgKEcpTE1NIHRhYmxlcw0KbGFiZWxzIDwtIGMoDQogICIoSW50ZXJjZXB0KSIgPSAiSW50ZXJjZXB0IiwNCiAgImduZ19yZXNwb25zZV90eXBlMi0xIiA9ICJGSCDigJMgU0giLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGUzLTIiID0gIkZBIOKAkyBGSCIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTQtMyIgPSAiSVIg4oCTIEZBIiwNCiAgIndvcmRfdmFsZW5jZTItMSIgPSAiVmFsZW5jZSAoUG9zIOKAkyBOZWcpIiwNCiAgImdyb3VwMi0xIiA9ICJHcm91cCAoT0NEIOKAkyBIQykiLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGUyLTE6d29yZF92YWxlbmNlMi0xIiA9ICJGSCDigJMgU0ggeCBWYWxlbmNlIiwNCiAgImduZ19yZXNwb25zZV90eXBlMy0yOndvcmRfdmFsZW5jZTItMSIgPSAiRkEg4oCTIEZIIHggVmFsZW5jZSIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTQtMzp3b3JkX3ZhbGVuY2UyLTEiID0gIklSIOKAkyBGQSB4IFZhbGVuY2UiLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGUyLTE6Z3JvdXAyLTEiID0gIkZIIOKAkyBTSCB4IEdyb3VwIiwNCiAgImduZ19yZXNwb25zZV90eXBlMy0yOmdyb3VwMi0xIiA9ICJGQSDigJMgRkggeCBHcm91cCIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTQtMzpncm91cDItMSIgPSAiSVIg4oCTIEZBIHggR3JvdXAiLA0KICAid29yZF92YWxlbmNlMi0xOmdyb3VwMi0xIiA9ICJWYWxlbmNlIHggR3JvdXAiLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGUyLTE6d29yZF92YWxlbmNlMi0xOmdyb3VwMi0xIiA9ICJGSCDigJMgU0ggeCBWYWxlbmNlIHggR3JvdXAiLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGUzLTI6d29yZF92YWxlbmNlMi0xOmdyb3VwMi0xIiA9ICJGQSDigJMgRkggeCBWYWxlbmNlIHggR3JvdXAiLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGU0LTM6d29yZF92YWxlbmNlMi0xOmdyb3VwMi0xIiA9ICJJUiDigJMgRkEgeCBWYWxlbmNlIHggR3JvdXAiLA0KICAiTUZOX3N0YW5kYXJkaXplZCIgPSAiRVJQIiwNCiAgIndvcmRfdmFsZW5jZTItMTpNRk5fc3RhbmRhcmRpemVkIiA9ICJWYWxlbmNlIHggRVJQIiwNCiAgImdyb3VwMi0xOk1GTl9zdGFuZGFyZGl6ZWQiID0gIkdyb3VwIHggRVJQIiwNCiAgIndvcmRfdmFsZW5jZTItMTpncm91cDItMTpNRk5fc3RhbmRhcmRpemVkIiA9ICJWYWxlbmNlIHggR3JvdXAgeCBFUlAiLA0KICAiRkhfRkgiID0gIkZBIOKAkyBGSCIsDQogICJwb3NfbmVnIiA9ICJWYWxlbmNlIChQb3Mg4oCTIE5lZykiLA0KICAiRkFfRkg6cG9zX25lZyIgPSAiRkEg4oCTIEZIIHggVmFsZW5jZSIsDQogICJvY2lfY2VudGVyZWQiID0gIk9DSS1SIiwNCiAgIkZBX0ZIOm9jaV9jZW50ZXJlZCIgPSAiRkEg4oCTIEZIIHggT0NJLVIiLA0KICAicG9zX25lZzpvY2lfY2VudGVyZWQiID0gIlZhbGVuY2UgeCBPQ0ktUiIsDQogICJGQV9GSDpwb3NfbmVnOm9jaV9jZW50ZXJlZCIgPSAiRkEg4oCTIEZIIHggVmFsZW5jZSB4IE9DSS1SIiwNCiAgInN0YWlfY2VudGVyZWQiID0gIlNUQUkiLA0KICAiRkFfRkg6c3RhaV9jZW50ZXJlZCIgPSAiRkEg4oCTIEZIIHggU1RBSSIsDQogICJwb3NfbmVnOnN0YWlfY2VudGVyZWQiID0gIlZhbGVuY2UgeCBTVEFJIiwNCiAgIkZBX0ZIOnBvc19uZWc6c3RhaV9jZW50ZXJlZCIgPSAiRkEg4oCTIEZIIHggVmFsZW5jZSB4IFNUQUkiLA0KICAicHN3cV9jZW50ZXJlZCIgPSAiUFNXUSIsDQogICJGQV9GSDpwc3dxX2NlbnRlcmVkIiA9ICJGQSDigJMgRkggeCBQU1dRIiwNCiAgInBvc19uZWc6cHN3cV9jZW50ZXJlZCIgPSAiVmFsZW5jZSB4IFBTV1EiLA0KICAiRkFfRkg6cG9zX25lZzpwc3dxX2NlbnRlcmVkIiA9ICJGQSDigJMgRkggeCBWYWxlbmNlIHggUFNXUSIsDQogICJzZXNzaW9uMi0xIiA9ICJTZXNzaW9uICgyIOKAkyAxKSIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTItMTpzZXNzaW9uMi0xIiA9ICJGSCDigJMgU0ggeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlMy0yOnNlc3Npb24yLTEiID0gIkZBIOKAkyBGSCB4IFNlc3Npb24iLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGU0LTM6c2Vzc2lvbjItMSIgPSAiSVIg4oCTIEZBIHggU2Vzc2lvbiIsDQogICJ3b3JkX3ZhbGVuY2UyLTE6c2Vzc2lvbjItMSIgPSAiVmFsZW5jZSB4IFNlc3Npb24iLA0KICAiZ3JvdXAyLTE6c2Vzc2lvbjItMSIgPSAiR3JvdXAgeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlMi0xOndvcmRfdmFsZW5jZTItMTpzZXNzaW9uMi0xIiA9ICJGSCDigJMgU0ggeCBWYWxlbmNlIHggU2Vzc2lvbiIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTMtMjp3b3JkX3ZhbGVuY2UyLTE6c2Vzc2lvbjItMSIgPSAiRkEg4oCTIEZIIHggVmFsZW5jZSB4IFNlc3Npb24iLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGU0LTM6d29yZF92YWxlbmNlMi0xOnNlc3Npb24yLTEiID0gIklSIOKAkyBGQSB4IFZhbGVuY2UgeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlMi0xOmdyb3VwMi0xOnNlc3Npb24yLTEiID0gIkZIIOKAkyBTSCB4IEdyb3VwIHggU2Vzc2lvbiIsDQogICJnbmdfcmVzcG9uc2VfdHlwZTMtMjpncm91cDItMTpzZXNzaW9uMi0xIiA9ICJGQSDigJMgRkggeCBHcm91cCB4IFNlc3Npb24iLA0KICAiZ25nX3Jlc3BvbnNlX3R5cGU0LTM6Z3JvdXAyLTE6c2Vzc2lvbjItMSIgPSAiSVIg4oCTIEZBIHggR3JvdXAgeCBTZXNzaW9uIiwNCiAgIndvcmRfdmFsZW5jZTItMTpncm91cDItMTpzZXNzaW9uMi0xIiA9ICJWYWxlbmNlIHggR3JvdXAgeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlMi0xOndvcmRfdmFsZW5jZTItMTpncm91cDItMTpzZXNzaW9uMi0xIiA9ICJGSCDigJMgU0ggeCBWYWxlbmNlIHggR3JvdXAgeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlMy0yOndvcmRfdmFsZW5jZTItMTpncm91cDItMTpzZXNzaW9uMi0xIiA9ICJGQSDigJMgRkggeCBWYWxlbmNlIHggR3JvdXAgeCBTZXNzaW9uIiwNCiAgImduZ19yZXNwb25zZV90eXBlNC0zOndvcmRfdmFsZW5jZTItMTpncm91cDItMTpzZXNzaW9uMi0xIiA9ICJJUiDigJMgRkEgeCBWYWxlbmNlIHggR3JvdXAgeCBTZXNzaW9uIiwNCiAgIk1GTl9zdGFuZGFyZGl6ZWQ6c2Vzc2lvbjItMSIgPSAiRVJQIHggU2Vzc2lvbiIsDQogICJ3b3JkX3ZhbGVuY2UyLTE6TUZOX3N0YW5kYXJkaXplZDpzZXNzaW9uMi0xIiA9ICJWYWxlbmNlIHggRVJQIHggU2Vzc2lvbiIsDQogICJncm91cDItMTpNRk5fc3RhbmRhcmRpemVkOnNlc3Npb24yLTEiID0gIkdyb3VwIHggRVJQIHggU2Vzc2lvbiIsDQogICJ3b3JkX3ZhbGVuY2UyLTE6Z3JvdXAyLTE6TUZOX3N0YW5kYXJkaXplZDpzZXNzaW9uMi0xIiA9ICJWYWxlbmNlIHggR3JvdXAgeCBFUlAgeCBTZXNzaW9uIikNCmBgYA0KPGJyPg0KDQojIyBEYXRhIENsZWFuaW5nDQoqKioNCg0KYGBge3IgbG9hZC1hbmQtY2xlYW4tZGF0YX0NCg0KIyBMb2FkIGRhdGENCmxvYWQoZmlsZSA9ICIuL2RhdGEvU2luZ2xlX1RyaWFsX0RhdGEucmRhIikNCmxvYWQoZmlsZSA9ICIuL2RhdGEvVHJhaXRfRGF0YS5yZGEiKQ0KDQoNCiMgQ3JlYXRlIG51bWVyaWMgYWNjdXJhY3kgdmFyaWFibGUgKDEgPSBjb3JyZWN0LCAwID0gaW5jb3JyZWN0KQ0Kc2luZ2xlX3RyaWFsX2RhdGEgPC0gc2luZ2xlX3RyaWFsX2RhdGEgJT4lDQogIGRwbHlyOjptdXRhdGUod29yZF9hY2N1cmFjeV9udW1lcmljID0gaWZlbHNlKHdvcmRfYWNjdXJhY3kgPT0gImNvcnJlY3QiLCAxLCAwKSkNCg0KDQojIEZvciBSVCBhbmFseXNpcywgZXhjbHVkZSBtaXNzaW5nIHJlc3BvbnNlcywgcmVzcG9uc2VzIHdpdGggd3Jvbmcga2V5LCBSVCBvdXRsaWVycywNCiMgaW5jb3JyZWN0IHdvcmQgY2F0ZWdvcml6YXRpb25zLCBhbmQgdHJpYWxzIHdpdGggRVJQIGFydGlmYWN0cw0Kc2luZ2xlX3RyaWFsX2RhdGFfcnQgPC0gc2luZ2xlX3RyaWFsX2RhdGEgJT4lDQogIGRwbHlyOjpmaWx0ZXIoDQogICAgZ25nX3Jlc3BvbnNlX3R5cGUgIT0gIm1pc3MiICYNCiAgICBnbmdfcmVzcG9uc2VfdHlwZSAhPSAid3Jvbmdfa2V5IiAmDQogICAgd29yZF9hY2N1cmFjeSAgICAgPT0gImNvcnJlY3QiICYNCiAgICAoaXMubmEoZ25nX3J0X2ludmFsaWQpICB8IGduZ19ydF9pbnZhbGlkICA9PSBGQUxTRSkgJg0KICAgIChpcy5uYSh3b3JkX3J0X291dGxpZXIpIHwgd29yZF9ydF9vdXRsaWVyID09IEZBTFNFKSAmDQogICAgc3RpbXVsYXRpb24gPT0gInNoYW0iICYNCiAgICBNRk5fYXJ0aWZhY3QgPT0gRkFMU0UpDQoNCg0KIyBDYWxjdWxhdGUgc3RhbmRhcmRpemVkIE1GTiAoYmFzZWQgb24gdHJpYWxzIHdpdGggY29ycmVjdCB3b3JkIGNhdGVnb3JpemF0aW9uLCBhcyBvbmx5DQojIHRoZXNlICB3aWxsIGJlIHVzZWQgaW4gdGhlIExNTXMgd2l0aCBFUlAgYXMgcHJlZGljdG9yKQ0Kc2luZ2xlX3RyaWFsX2RhdGFfcnQgPC0gc2luZ2xlX3RyaWFsX2RhdGFfcnQgJT4lDQogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudF9pZCkgJT4lDQogIGRwbHlyOjptdXRhdGUoTUZOX3N0YW5kYXJkaXplZCA9IHNjYWxlKE1GTl8wXzEwMF9GQ3osIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkpICU+JQ0KICBkcGx5cjo6dW5ncm91cCgpDQoNCg0KIyBDZW50ZXIgdHJhaXQgdmFyaWFibGVzIHdpdGhpbiBncm91cHMgKHdpbGwgYmUgdXNlZCBhcyBwcmVkaWN0b3JzKQ0KdHJhaXRzIDwtIHRyYWl0cyAlPiUNCiAgZHBseXI6OnJlbmFtZShvY2kgPSAiT0NJLVIiLCBwc3dxID0gIlBTV1EiLCBzdGFpID0gIlNUQUkgdHJhaXQiKSAlPiUgIA0KICBkcGx5cjo6bXV0YXRlKGdyb3VwID0gYXMuZmFjdG9yKGlmZWxzZShzdWJzdHIocGFydGljaXBhbnRfaWQsIDEsIDEpID09ICJDIiwgIkhDIiwgIk9DRCIpKSkgJT4lDQogIGRwbHlyOjpncm91cF9ieShncm91cCkgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgb2NpX2NlbnRlcmVkICA9IHNjYWxlKG9jaSwgIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gRkFMU0UpLA0KICAgIHBzd3FfY2VudGVyZWQgPSBzY2FsZShwc3dxLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IEZBTFNFKSwNCiAgICBzdGFpX2NlbnRlcmVkID0gc2NhbGUoc3RhaSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBGQUxTRSkpICU+JQ0KICBkcGx5cjo6dW5ncm91cCgpDQoNCg0KIyBBZGQgdHJhaXQgdmFyaWFibGVzIHRvIHNpbmdsZSB0cmlhbCBkYXRhDQpzaW5nbGVfdHJpYWxfZGF0YV9ydCA8LSBzaW5nbGVfdHJpYWxfZGF0YV9ydCAlPiUNCiAgZHBseXI6OmxlZnRfam9pbiguLCB0cmFpdHMgJT4lIGRwbHlyOjpzZWxlY3QocGFydGljaXBhbnRfaWQsIG9jaV9jZW50ZXJlZCwgcHN3cV9jZW50ZXJlZCwNCiAgICBzdGFpX2NlbnRlcmVkKSwgYnkgPSAicGFydGljaXBhbnRfaWQiKQ0KDQoNCiMgRm9yIGFjY3VyYWN5IGFuYWx5c2lzLCBleGNsdWRlIG1pc3NpbmcgcmVzcG9uc2VzLCByZXNwb25zZXMgd2l0aCB3cm9uZyBrZXksIFJUIG91dGxpZXJzLA0KIyBhbmQgdHJpYWxzIHdpdGggRVJQIGFydGlmYWN0cw0Kc2luZ2xlX3RyaWFsX2RhdGFfYWNjIDwtIHNpbmdsZV90cmlhbF9kYXRhICU+JQ0KICBkcGx5cjo6ZmlsdGVyKA0KICAgIGduZ19yZXNwb25zZV90eXBlICE9ICJtaXNzIiAmDQogICAgZ25nX3Jlc3BvbnNlX3R5cGUgIT0gIndyb25nX2tleSIgJg0KICAgIHdvcmRfYWNjdXJhY3kgICAgICE9ICJtaXNzIiAmDQogICAgd29yZF9hY2N1cmFjeSAgICAgIT0gIndyb25nX2tleSIgJg0KICAgIChpcy5uYShnbmdfcnRfaW52YWxpZCkgIHwgZ25nX3J0X2ludmFsaWQgID09IEZBTFNFKSAmDQogICAgKGlzLm5hKHdvcmRfcnRfb3V0bGllcikgfCB3b3JkX3J0X291dGxpZXIgPT0gRkFMU0UpICYNCiAgICBzdGltdWxhdGlvbiA9PSAic2hhbSIgJg0KICAgIE1GTl9hcnRpZmFjdCA9PSBGQUxTRSkNCg0KDQojIENhbGN1bGF0ZSAlIG9mIGV4Y2x1ZGVkIHRyaWFscyAobWlzc2luZyByZXNwb25zZXMsIHJlc3BvbnNlcyB3aXRoIHdyb25nIGtleSwgUlQgb3V0bGllcnMpDQpleGNsdWRlZF90cmlhbHNfcGVyX3BhcnRpY2lwYW50IDwtIHNpbmdsZV90cmlhbF9kYXRhICU+JQ0KICBkcGx5cjo6ZmlsdGVyKHN0aW11bGF0aW9uID09ICJzaGFtIikgJT4lDQogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudF9pZCkgJT4lDQogIGRwbHlyOjpzdW1tYXJpemUoZXhjbHVkZWQgPSBzdW0oDQogICAgZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIm1pc3MiIHwNCiAgICBnbmdfcmVzcG9uc2VfdHlwZSA9PSAid3Jvbmdfa2V5IiB8DQogICAgd29yZF9hY2N1cmFjeSAgICAgPT0gIm1pc3MiIHwNCiAgICB3b3JkX2FjY3VyYWN5ICAgICA9PSAid3Jvbmdfa2V5IiB8DQogICAgKCFpcy5uYShnbmdfcnRfaW52YWxpZCkgICYgZ25nX3J0X2ludmFsaWQgICE9IEZBTFNFKSB8DQogICAgKCFpcy5uYSh3b3JkX3J0X291dGxpZXIpICYgd29yZF9ydF9vdXRsaWVyICE9IEZBTFNFKSkgLyBsZW5ndGgocGFydGljaXBhbnRfaWQpICogMTAwKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShhY3Jvc3MoLWMocGFydGljaXBhbnRfaWQpLCBsaXN0KG1lYW4sIHNkKSkpDQoNCg0KIyBNYWtlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBmYWN0b3JzDQpzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSAgPC0gZmFjdG9yKHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlLA0KICBsZXZlbHMgPSBjKCJTSCIsICJGSCIsICJGQSIsICJJUiIpKQ0Kc2luZ2xlX3RyaWFsX2RhdGFfcnQkd29yZF92YWxlbmNlICAgICAgIDwtIGZhY3RvcihzaW5nbGVfdHJpYWxfZGF0YV9ydCR3b3JkX3ZhbGVuY2UpDQpzaW5nbGVfdHJpYWxfZGF0YV9ydCRwYXJ0aWNpcGFudF9pZCAgICAgPC0gZmFjdG9yKHNpbmdsZV90cmlhbF9kYXRhX3J0JHBhcnRpY2lwYW50X2lkKQ0Kc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ3JvdXAgICAgICAgICAgICAgIDwtIGZhY3RvcihzaW5nbGVfdHJpYWxfZGF0YV9ydCRncm91cCkNCnNpbmdsZV90cmlhbF9kYXRhX3J0JHNlc3Npb24gICAgICAgICAgICA8LSBmYWN0b3Ioc2luZ2xlX3RyaWFsX2RhdGFfcnQkc2Vzc2lvbikNCnNpbmdsZV90cmlhbF9kYXRhX2FjYyRnbmdfcmVzcG9uc2VfdHlwZSA8LSBmYWN0b3Ioc2luZ2xlX3RyaWFsX2RhdGFfYWNjJGduZ19yZXNwb25zZV90eXBlLA0KICBsZXZlbHMgPSBjKCJTSCIsICJGSCIsICJGQSIsICJJUiIpKQ0Kc2luZ2xlX3RyaWFsX2RhdGFfYWNjJHdvcmRfdmFsZW5jZSAgICAgIDwtIGZhY3RvcihzaW5nbGVfdHJpYWxfZGF0YV9hY2Mkd29yZF92YWxlbmNlKQ0Kc2luZ2xlX3RyaWFsX2RhdGFfYWNjJHBhcnRpY2lwYW50X2lkICAgIDwtIGZhY3RvcihzaW5nbGVfdHJpYWxfZGF0YV9hY2MkcGFydGljaXBhbnRfaWQpDQpzaW5nbGVfdHJpYWxfZGF0YV9hY2MkZ3JvdXAgICAgICAgICAgICAgPC0gZmFjdG9yKHNpbmdsZV90cmlhbF9kYXRhX2FjYyRncm91cCkNCnNpbmdsZV90cmlhbF9kYXRhX2FjYyRzZXNzaW9uICAgICAgICAgICA8LSBmYWN0b3Ioc2luZ2xlX3RyaWFsX2RhdGFfYWNjJHNlc3Npb24pDQoNCg0KIyBBZ2dyZWdhdGUgZGF0YSBwZXIgcGFydGljaXBhbnQgZm9yIHBsb3RzDQpkYXRhX2FnZ3JlZ2F0ZWRfcnQgPC0gc2luZ2xlX3RyaWFsX2RhdGFfcnQgJT4lDQogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudF9pZCwgZ3JvdXAsIGduZ19yZXNwb25zZV90eXBlLCB3b3JkX3ZhbGVuY2UpICU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKHdvcmRfcnQgPSBtZWFuKHdvcmRfcnQsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBkcGx5cjo6dW5ncm91cCgpDQoNCmRhdGFfYWdncmVnYXRlZF9hY2MgPC0gc2luZ2xlX3RyaWFsX2RhdGFfYWNjICU+JQ0KICBkcGx5cjo6Z3JvdXBfYnkocGFydGljaXBhbnRfaWQsIGdyb3VwLCBnbmdfcmVzcG9uc2VfdHlwZSwgd29yZF92YWxlbmNlKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShhY2N1cmFjeSA9IG1lYW4od29yZF9hY2N1cmFjeV9udW1lcmljLCBuYS5ybSA9IFRSVUUpICogMTAwKSAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQoNCiMgU2F2ZSBhZ2dyZWdhdGVkIGRhdGEgZm9yIHBsb3RzDQpzYXZlKGRhdGFfYWdncmVnYXRlZF9ydCwgIGZpbGUgPSAiLi9zYXZlZF9vYmplY3RzX2Zvcl9wbG90cy9kYXRhX2FnZ3JlZ2F0ZWRfcnQuUmRhIikNCnNhdmUoZGF0YV9hZ2dyZWdhdGVkX2FjYywgZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL2RhdGFfYWdncmVnYXRlZF9hY2MuUmRhIikNCmBgYA0KDQpJbiB0aGUgYW5hbHlzaXMgb2YgUlQgYW5kIGFjY3VyYWN5IGluIHRoZSB3b3JkIGNhdGVnb3JpemF0aW9uIHRhc2ssIHRyaWFscyB3ZXJlIGRpc2NhcmRlZCAoKk0qID0gYHIgcm91bmQoZXhjbHVkZWRfdHJpYWxzX3Blcl9wYXJ0aWNpcGFudCRleGNsdWRlZF8xLCBkaWdpdHMgPSAyKWAlLCAqU0QqID0gYHIgcm91bmQoZXhjbHVkZWRfdHJpYWxzX3Blcl9wYXJ0aWNpcGFudCRleGNsdWRlZF8yLCBkaWdpdHMgPSAyKWApIGlmIFJUIGluIHRoZSBnby9uby1nbyB0YXNrIHdhcyBiZWxvdyAxMDAgbXMgb3IgYWJvdmUgODAwIG1zLCB3b3JkIGNhdGVnb3JpemF0aW9uIFJUIGRldmlhdGVkIG1vcmUgdGhhbiB0aHJlZSBtZWRpYW4gYWJzb2x1dGUgZGV2aWF0aW9ucyBmcm9tIHRoZSBpbmRpdmlkdWFsIGNvbmRpdGlvbi1zcGVjaWZpYyBtZWRpYW4sIHJlc3BvbnNlIHdhcyBtaXNzaW5nLCBvciB0aGUgcmVzcG9uc2Ugd2FzIG1hZGUgd2l0aCBhIGtleSBub3QgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgdGFzay4gV2UgZnVydGhlciBkaXNjYXJkZWQgdHJpYWxzIGNvbnRhaW5pbmcgYXJ0aWZhY3RzIGluIHRoZSBFRUcsIGkuZS4sIGEgdm9sdGFnZSBkaWZmZXJlbmNlIGV4Y2VlZGluZyAyMDAgzrxWIHdpdGhpbiBhbiBlcG9jaCBvciA1MCDOvFYgYmV0d2VlbiBzYW1wbGUgcG9pbnRzLiBJbiB0aGUgYW5hbHlzaXMgb2Ygd29yZCBjYXRlZ29yaXphdGlvbiBSVCwgd2UgZXhjbHVkZWQgaW5jb3JyZWN0IGNhdGVnb3JpemF0aW9ucy4NCjxicj48YnI+PGJyPg0KDQojIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQoqKioNCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSBTMiBpbiB0aGUgc3VwcGxlbWVudGFsIG1hdGVyaWFsLiAgDQoNCmBgYHtyIGRlc2NyaXB0aXZlLXN0YXRpc3RpY3MtdGFibGV9DQoNCiMgQ2FsY3VsYXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIFJUDQpkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzX3J0IDwtIHN1bW1hcnlTRXdpdGhpbk8oDQogIGRhdGEgICAgICAgICAgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydCwNCiAgbWVhc3VyZXZhciAgICA9ICJ3b3JkX3J0IiwNCiAgd2l0aGludmFycyAgICA9IGMoImduZ19yZXNwb25zZV90eXBlIiwgIndvcmRfdmFsZW5jZSIpLA0KICBiZXR3ZWVudmFycyAgID0gImdyb3VwIiwNCiAgaWR2YXIgICAgICAgICA9ICJwYXJ0aWNpcGFudF9pZCIsDQogIGNvbmYuaW50ZXJ2YWwgPSAuOTUpICU+JQ0KICAjIFJlbmFtZSB2YXJpYWJsZSBhbmQgc2VsZWN0IHZhcmlhYmxlcyBmb3Igc3Vic2VxdWVudCBtZXJnaW5nDQogIGRwbHlyOjpyZW5hbWUobWVhbiA9IHdvcmRfcnQpICU+JQ0KICBkcGx5cjo6c2VsZWN0KCJncm91cCIsICJnbmdfcmVzcG9uc2VfdHlwZSIsICJ3b3JkX3ZhbGVuY2UiLCAibWVhbiIsICJjaSIpDQoNCg0KIyBDYWxjdWxhdGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgYWNjdXJhY3kNCmRlc2NyaXB0aXZlX3N0YXRpc3RpY3NfYWNjIDwtIHN1bW1hcnlTRXdpdGhpbk8oDQogIGRhdGEgICAgICAgICAgPSBzaW5nbGVfdHJpYWxfZGF0YV9hY2MsDQogIG1lYXN1cmV2YXIgICAgPSAid29yZF9hY2N1cmFjeV9udW1lcmljIiwNCiAgd2l0aGludmFycyAgICA9IGMoImduZ19yZXNwb25zZV90eXBlIiwgIndvcmRfdmFsZW5jZSIpLA0KICBiZXR3ZWVudmFycyAgID0gImdyb3VwIiwNCiAgaWR2YXIgICAgICAgICA9ICJwYXJ0aWNpcGFudF9pZCIsDQogIGNvbmYuaW50ZXJ2YWwgPSAuOTUpICU+JQ0KICAjIE11bHRpcGx5IG51bWVyaWMgdmFsdWVzIGJ5IDEwMCB0byBvYnRhaW4gdmFsdWVzIGluIHBlcmNlbnQNCiAgZHBseXI6Om11dGF0ZV9pZihpcy5udW1lcmljLCBsaXN0KH4gLiAqIDEwMCkpICU+JQ0KICAjIFJlbmFtZSB2YXJpYWJsZSBhbmQgc2VsZWN0IHZhcmlhYmxlcyBmb3Igc3Vic2VxdWVudCBtZXJnaW5nDQogIGRwbHlyOjpyZW5hbWUobWVhbiA9IHdvcmRfYWNjdXJhY3lfbnVtZXJpYykgJT4lDQogIGRwbHlyOjpzZWxlY3QoImdyb3VwIiwgImduZ19yZXNwb25zZV90eXBlIiwgIndvcmRfdmFsZW5jZSIsICJtZWFuIiwgImNpIikNCg0KDQojIENvbWJpbmUgbWVhc3VyZXMNCmRlc2NyaXB0aXZlX3N0YXRpc3RpY3MgPC0gYXMuZGF0YS5mcmFtZShyYmluZChkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzX3J0LCBkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzX2FjYykpDQoNCg0KIyBDcmVhdGUgY29sdW1uIHdpdGggZm9ybWF0ICJNIFtDSV0iIGZvciBSVCAocm91bmQgdG8gMCBkZWNpbWFscykNCmRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkTV9DSSA8LSBwYXN0ZTAocm91bmQoZGVzY3JpcHRpdmVfc3RhdGlzdGljcyRtZWFuLCAwKSwgIiBbIiwNCiAgcm91bmQoZGVzY3JpcHRpdmVfc3RhdGlzdGljcyRtZWFuIC0gZGVzY3JpcHRpdmVfc3RhdGlzdGljcyRjaSwgMCksICIsICIsDQogIHJvdW5kKGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkbWVhbiArIGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkY2ksIDApLCAiXSIpDQoNCg0KIyBDcmVhdGUgY29sdW1uIHdpdGggZm9ybWF0ICJNIFtDSV0iIGZvciBhY2N1cmFjeSAocm91bmQgdG8gMiBkZWNpbWFscykNCmRlc2NyaXB0aXZlX3N0YXRpc3RpY3NbYygxNzozMiksIF0kTV9DSSA8LSBwYXN0ZTAoDQogIGZvcm1hdChyb3VuZChkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzW2MoMTc6MzIpLCBdJG1lYW4sIDIpLCBuc21hbGwgPSAyKSwgIiBbIiwNCiAgZm9ybWF0KHJvdW5kKGRlc2NyaXB0aXZlX3N0YXRpc3RpY3NbYygxNzozMiksIF0kbWVhbiAtDQogICAgICAgICAgICAgICBkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzW2MoMTc6MzIpLCBdJGNpLCAgIDIpLCBuc21hbGwgPSAyKSwgIiwgIiwNCiAgZm9ybWF0KHJvdW5kKGRlc2NyaXB0aXZlX3N0YXRpc3RpY3NbYygxNzozMiksIF0kbWVhbiArDQogICAgICAgICAgICAgICBkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzW2MoMTc6MzIpLCBdJGNpLCAgIDIpLCBuc21hbGwgPSAyKSwgIl0iKQ0KDQoNCiMgU3BsaXQgYW5kIHJlLW1lcmdlIHRhYmxlIHRvIGRpc3BsYXkgYm90aCBncm91cHMgbmV4dCB0byBlYWNoIG90aGVyDQpkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzIDwtIHNwbGl0KGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MsIGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkZ3JvdXApDQpkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzX2Rpc3BsYXkgPC0gY2JpbmQoDQogIHBhc3RlKGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkT0NEJHdvcmRfdmFsZW5jZSwgIndvcmQgYWZ0ZXIiLCBkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzJE9DRCRnbmdfcmVzcG9uc2VfdHlwZSksDQogIGRlc2NyaXB0aXZlX3N0YXRpc3RpY3MkT0NEWywgIk1fQ0kiXSwgZGVzY3JpcHRpdmVfc3RhdGlzdGljcyRIQ1ssICJNX0NJIl0pDQoNCg0KIyBEaXNwbGF5IHRhYmxlIChhbmQgcmVhcnJhbmdlIHJvd3MpDQpteV90YWJsZV90ZW1wbGF0ZShkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzX2Rpc3BsYXlbYyg4LCA3LCA0LCAzLCAyLCAxLCA2LCA1LCAxNiwgMTUsIDEyLCAxMSwgMTAsIDksIDE0LCAxMyksIF0sDQogIGNhcHRpb24gPSAiRGVzY3JpcHRpdmUgU3RhdGlzdGljcyBmb3IgQmVoYXZpb3JhbCBQZXJmb3JtYW5jZSBpbiB0aGUgV29yZCBDYXRlZ29yaXphdGlvbiBUYXNrIiwNCiAgY29sX25hbWVzID0gYygiTWVhc3VyZSIsIHJlcCgiTSBbOTUlIENJXSIsIDIpKSwNCiAgaGVhZGVyX2Fib3ZlX2NvbmZpZyA9IGMoIiIsICJQYXRpZW50cyB3aXRoIE9DRCIsICJIZWFsdGh5IGNvbnRyb2wgcGFydGljaXBhbnRzIikpICU+JQ0KICBhZGRfZm9vdG5vdGUoIlxuIE5vdGUuIENJcyBhcmUgYWRqdXN0ZWQgZm9yIHdpdGhpbi1wYXJ0aWNpcGFudCBjb21wYXJpc29ucyB1c2luZyB0aGUgbWV0aG9kIGRlc2NyaWJlZCANCiAgYnkgTW9yZXkgKDIwMDgpLiIsIG5vdGF0aW9uID0gIm5vbmUiKSAlPiUNCiAgcGFja19yb3dzKCJSZXNwb25zZSB0aW1lIChtcykiLCAxLCA4KSAlPiUNCiAgcGFja19yb3dzKCJBY2N1cmFjeSAoJSkiLCA5LCAxNikNCmBgYA0KPGJyPjxicj4NCg0KIyMgQW5hbHlzaXMgb2YgUmVzcG9uc2UgVGltZQ0KKioqDQoNCldlIHBlcmZvcm1lZCBhIGxpbmVhciBtaXhlZCBtb2RlbCAoTE1NKSBvbiBzaW5nbGUtdHJpYWwgZGF0YS4gV29yZCBjYXRlZ29yaXphdGlvbiBSVCB3YXMgbW9kZWxlZCB1c2luZyB0eXBlIG9mIHRoZSBwcmVjZWRpbmcgZ28vbm8tZ28gcmVzcG9uc2UgKHNsb3cgaGl0LCBmYXN0IGhpdCwgZmFsc2UgYWxhcm0sIGluaGliaXRlZCByZXNwb25zZSksIHdvcmQgdmFsZW5jZSwgYW5kIGdyb3VwIGFzIGZpeGVkIGVmZmVjdHMuIA0KDQpXZSB1c2VkIHNsaWRpbmcgZGlmZmVyZW5jZSBjb250cmFzdHMgZm9yIGNhdGVnb3JpY2FsIGZpeGVkIGVmZmVjdHMgYW5kIHN0YXJ0ZWQgd2l0aCB0aGUgbWF4aW1hbCByYW5kb20tZWZmZWN0cyBzdHJ1Y3R1cmUgZm9yIGVhY2ggbW9kZWwuIEluIGNhc2Ugb2Ygbm9uLWNvbnZlcmdlbmNlLCByYW5kb20gZWZmZWN0cyB3ZXJlIHNwZWNpZmllZCBhcyB1bmNvcnJlbGF0ZWQuIFVzaW5nIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMsIHdlIGlkZW50aWZpZWQgcmFuZG9tIGVmZmVjdHMgZXhwbGFpbmluZyB6ZXJvIHZhcmlhbmNlIGFuZCByZW1vdmVkIHRoZXNlLCBhcyByZWNvbW1lbmRlZCBieSBCYXRlcywgS2xpZWdsLCBldCBhbC4gKDIwMTUpLiANCjxicj48YnI+DQoNCiMjIyBNYWluIE1vZGVsIHsudGFic2V0fQ0KDQojIyMjIERldGVybWluZSBEYXRhIFRyYW5zZm9ybWF0aW9uDQoNClJUIHdhcyBsb2ctdHJhbnNmb3JtZWQgdG8gbm9ybWFsaXplIHJlc2lkdWFscy4gVGhpcyB3YXMgZGV0ZXJtaW5lZCB1c2luZyB0aGUgQm944oCTQ294IHByb2NlZHVyZSAoQm94ICYgQ294LCAxOTY0KS4NCg0KYGBge3IgcnQtZGV0ZXJtaW5lLXRyYW5zZm9ybWF0aW9uLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDN9DQoNCiMgQXJyYW5nZSBwbG90cw0KcGFyKG1mcm93ID0gYygxLCA1KSkNCg0KDQojIERldGVybWluZSB0cmFuc2Zvcm1hdGlvbiBieSBlc3RpbWF0aW5nIG9wdGltYWwgbGFtYmRhIHVzaW5nIEJveOKAk0NveCBwcm9jZWR1cmUNCmJjX3J0IDwtIGJveGNveCh3b3JkX3J0IH4gMSwgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0KQ0Kb3B0bGFtYmRhX3J0IDwtIGJjX3J0JHhbd2hpY2gubWF4KGJjX3J0JHkpXQ0KDQoNCiMgRGVuc2l0eSBwbG90IGZvciByYXcgUlQNCnBsb3QoZGVuc2l0eShzaW5nbGVfdHJpYWxfZGF0YV9ydCR3b3JkX3J0KSwgbWFpbiA9ICJSYXcgUlQ6IERlbnNpdHkgUGxvdCIpDQoNCg0KIyBRLXEgcGxvdCBmb3IgcmF3IFJUDQpxcW5vcm0oc2luZ2xlX3RyaWFsX2RhdGFfcnQkd29yZF9ydCwgbWFpbiA9ICJSYXcgUlQ6IFEtUSBQbG90IiwgcGNoID0gMSkNCg0KDQojIERlbnNpdHkgcGxvdCBmb3IgbG9nIFJUDQpwbG90KGRlbnNpdHkoc2luZ2xlX3RyaWFsX2RhdGFfcnQkd29yZF9ydF9sb2cpLCBtYWluID0gIkxvZyBSVDogRGVuc2l0eSBQbG90IikNCg0KDQojIFEtcSBwbG90IGZvciBsb2cgUlQNCnFxbm9ybShzaW5nbGVfdHJpYWxfZGF0YV9ydCR3b3JkX3J0X2xvZywgbWFpbiA9ICJMb2cgUlQ6IFEtUSBQbG90IiwgcGNoID0gMSkNCg0KDQojIFJlc2V0IHBsb3QgbGF5b3V0DQpwYXIobWZyb3cgPSBjKDEsIDEpKQ0KYGBgDQpUaGUgb3B0aW1hbCBsYW1iZGEgaXMgYHIgcm91bmQob3B0bGFtYmRhX3J0LCBkaWdpdHMgPSAyKWAsIHN1Z2dlc3RpbmcgdGhhdCBsb2cgdHJhbnNmb3JtYXRpb24gaXMgYXBwcm9wcmlhdGUuIA0KPGJyPjxicj48YnI+DQoNCiMjIyMgTE1NIHsuYWN0aXZlfQ0KDQo8IS0tIENvbnRyYXN0IGNvZGluZyAtLT4NCg0KYGBge3IgbG1tLXJ0LWNvbnRyYXN0LWNvZGluZ30NCg0KIyBEZWZpbmUgY29udHJhc3RzIChzbGlkaW5nIGRpZmZlcmVuY2UgY29udHJhc3RzID0gZWZmZWN0IGNvZGluZyBmb3IgZmFjdG9ycyB3aXRoIDIgbGV2ZWxzKQ0KY29udHJhc3RzKHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlKSA8LSBjb250ci5zZGlmKDQpDQpjb250cmFzdHMoc2luZ2xlX3RyaWFsX2RhdGFfcnQkd29yZF92YWxlbmNlKSAgICAgIDwtIGNvbnRyLnNkaWYoMikNCmNvbnRyYXN0cyhzaW5nbGVfdHJpYWxfZGF0YV9ydCRncm91cCkgICAgICAgICAgICAgPC0gY29udHIuc2RpZigyKQ0KDQoNCiMgQWRkIGNvbnRyYXN0cyBhcyBudW1lcmljYWwgY292YXJpYXRlcyB2aWEgbW9kZWwgbWF0cml4Kg0KbW9kZWxfbWF0cml4IDwtIG1vZGVsLm1hdHJpeCh+IGduZ19yZXNwb25zZV90eXBlICogd29yZF92YWxlbmNlICogZ3JvdXAsIHNpbmdsZV90cmlhbF9kYXRhX3J0KQ0KDQoNCiMgQXR0YWNoIHRoZSBtb2RlbCBtYXRyaXggKDE2IGNvbHVtbnMpIHRvIHRoZSBkYXRhZnJhbWUNCnNpbmdsZV90cmlhbF9kYXRhX3J0WywgKG5jb2woc2luZ2xlX3RyaWFsX2RhdGFfcnQpICsgMSk6KG5jb2woc2luZ2xlX3RyaWFsX2RhdGFfcnQpICsgMTYpXSA8LSBtb2RlbF9tYXRyaXgNCg0KDQojIEFzc2lnbiBkZXNjcmlwdGl2ZSBuYW1lcyB0byB0aGUgY29udHJhc3RzDQpuYW1lcyhzaW5nbGVfdHJpYWxfZGF0YV9ydClbKG5jb2woc2luZ2xlX3RyaWFsX2RhdGFfcnQpIC0gMTUpOm5jb2woc2luZ2xlX3RyaWFsX2RhdGFfcnQpXSA8LSBjKA0KICAiR3JhbmQgTWVhbiIsICJGSF9TSCIsICJGQV9GSCIsICJJUl9GQSIsICJwb3NfbmVnIiwgIk9DRF9IQyIsICJGSF9TSDpwb3NfbmVnIiwgIkZBX0ZIOnBvc19uZWciLA0KICAiSVJfRkE6cG9zX25lZyIsICJGSF9TSDpPQ0RfSEMiLCAiRkFfRkg6T0NEX0hDIiwgIklSX0ZBOk9DRF9IQyIsICJwb3NfbmVnOk9DRF9IQyIsDQogICJGSF9TSDpwb3NfbmVnOk9DRF9IQyIsICJGQV9GSDpwb3NfbmVnOk9DRF9IQyIsICJJUl9GQTpwb3NfbmVnOk9DRF9IQyIpDQoNCg0KIyAqTm90ZTogRm9yIHRoZSByYW5kb20gZWZmZWN0cywgd2UgbmVlZGVkIHRvIGVudGVyIHRoZSBzZXBhcmF0ZSByYW5kb20gZWZmZWN0IHRlcm1zIGluIHRoZSBtb2RlbHMgdG8gZW5hYmxlDQojIGRvdWJsZS1iYXIgbm90YXRpb24gKHx8KS4gVGhpcyBhbGxvd3MgZml0dGluZyBhIG1vZGVsIHRoYXQgc2V0cyBjb3JyZWxhdGlvbnMgb2YgdGhlIHJhbmRvbSB0ZXJtcyB0byB6ZXJvLg0KYGBgDQoNCjwhLS0gTW9kZWwgc3BlY2lmaWNhdGlvbiAtLT4NCg0KYGBge3IgbG1tLXJ0LW1vZGVsLXNwZWNpZmljYXRpb24sIGV2YWwgPSBGQUxTRX0NCg0KIyBSdW4gbW9kZWwgd2l0aCBtYXhpbWFsIHJhbmRvbS1lZmZlY3RzIHN0cnVjdHVyZQ0KTE1NX3J0X21heCA8LSBsbWVyKHdvcmRfcnRfbG9nIH4gZ25nX3Jlc3BvbnNlX3R5cGUgKiB3b3JkX3ZhbGVuY2UgKiBncm91cCArDQogICgxICsgRkhfU0ggKyBGQV9GSCArIElSX0ZBICsgcG9zX25lZyArIEZIX1NIOnBvc19uZWcgKyBGQV9GSDpwb3NfbmVnICsgSVJfRkE6cG9zX25lZyB8IHBhcnRpY2lwYW50X2lkKSArDQogICgxICsgRkhfU0ggKyBGQV9GSCArIElSX0ZBICsgT0NEX0hDICsgRkhfU0g6T0NEX0hDICsgRkFfRkg6T0NEX0hDICsgSVJfRkE6T0NEX0hDIHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydCwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQNCnN1bW1hcnkoTE1NX3J0X21heCkgICAgIyBNb2RlbCBkb2VzIG5vdCBjb252ZXJnZQ0KaXNTaW5ndWxhcihMTU1fcnRfbWF4KSAjIFNpbmd1bGFyIGZpdA0KDQoNCiMgUnVuIHplcm8tY29ycmVsYXRpb24gcGFyYW1ldGVyIG1vZGVsIGJ5IHVzaW5nIHx8IHN5bnRheCB0byByZWR1Y2UgbW9kZWwgY29tcGxleGl0eQ0KTE1NX3J0X3JlZDEgPC0gbG1lcih3b3JkX3J0X2xvZyB+IGduZ19yZXNwb25zZV90eXBlICogd29yZF92YWxlbmNlICogZ3JvdXAgKw0KICAoMSArIEZIX1NIICsgRkFfRkggKyBJUl9GQSArIHBvc19uZWcgKyBGSF9TSDpwb3NfbmVnICsgRkFfRkg6cG9zX25lZyArIElSX0ZBOnBvc19uZWcgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGSF9TSCArIEZBX0ZIICsgSVJfRkEgKyBPQ0RfSEMgKyBGSF9TSDpPQ0RfSEMgKyBGQV9GSDpPQ0RfSEMgKyBJUl9GQTpPQ0RfSEMgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydCwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQgYW5kIFBDQSBvZiByYW5kb20tZWZmZWN0cyB2YXJpYW5jZS1jb3ZhcmlhbmNlIGVzdGltYXRlcw0Kc3VtbWFyeShMTU1fcnRfcmVkMSkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KaXNTaW5ndWxhcihMTU1fcnRfcmVkMSkgICAgICMgU2luZ3VsYXIgZml0DQpzdW1tYXJ5KHJlUENBKExNTV9ydF9yZWQxKSkgIyBGb3Igd29yZHMgdGhlcmUgYXJlIDMgdGVybXMgdGhhdCBkbyBub3QgZXhwbGFpbiB2YXJpYW5jZSAoPCAwLjUlKQ0KcHJpbnQoVmFyQ29ycihMTU1fcnRfcmVkMSksIGNvbXAgPSAiVmFyaWFuY2UiKSAjIEl0IGlzIElSX0ZBLCBGSF9TSDpPQ0RfSEMsIGFuZCBGQV9GSDpPQ0RfSEMgZm9yIHdvcmRzDQpgYGANCg0KPCEtLSBGaW5hbCBtb2RlbCAtLT4NCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSAzIGluIHRoZSBtYW51c2NyaXB0LiANCg0KYGBge3IgbG1tLXJ0LWZpbmFsLW1vZGVsLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWR9DQoNCiMgUnVuIGZpbmFsIG1vZGVsIHdpdGhvdXQgcmFuZG9tIHRlcm1zIGV4cGxhaW5pbmcgemVybyB2YXJpYW5jZSAodXNlIGxvZyh3b3JkX3J0KSBub3Qgd29yZF9ydF9sb2cgZm9yIHBsb3R0aW5nKQ0KTE1NX3J0X2ZpbmFsIDwtIGxtZXIobG9nKHdvcmRfcnQpIH4gZ25nX3Jlc3BvbnNlX3R5cGUgKiB3b3JkX3ZhbGVuY2UgKiBncm91cCArIA0KICAoMSArIEZIX1NIICsgRkFfRkggKyBJUl9GQSArIHBvc19uZWcgKyBGSF9TSDpwb3NfbmVnICsgRkFfRkg6cG9zX25lZyArIElSX0ZBOnBvc19uZWcgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGSF9TSCArIEZBX0ZIICsgT0NEX0hDICsgSVJfRkE6T0NEX0hDIHx8IHdvcmQpLA0KICBkYXRhID0gc2luZ2xlX3RyaWFsX2RhdGFfcnQsDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShMTU1fcnRfZmluYWwpICAgICAgICAjIE1vZGVsIGRvZXMgY29udmVyZ2UNCiMgaXNTaW5ndWxhcihMTU1fcnRfZmluYWwpICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9maW5hbCkpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIERpc3BsYXkgcmVzdWx0cyAoZml4ZWQgZWZmZWN0cykNCnRhYl9tb2RlbChMTU1fcnRfZmluYWwsDQogIGR2LmxhYmVscyA9ICJSVCIsIHByZWQubGFiZWxzID0gbGFiZWxzLCBzaG93LnN0YXQgPSBUUlVFLCBzaG93LmljYyA9IEZBTFNFLCBzaG93LnIyID0gRkFMU0UsDQogIHNob3cucmUudmFyID0gRkFMU0UsIHNob3cubmdyb3VwcyA9IEZBTFNFLCBtaW51cy5zaWduID0gIi0iLCBzdHJpbmcucHJlZCA9ICJGaXhlZCBlZmZlY3RzIiwNCiAgc3RyaW5nLmVzdCA9ICJiIiwgc3RyaW5nLnN0YXQgPSAidCIsIHN0cmluZy5jaSA9ICI5NSAlIENJIiwgcC52YWwgPSAic2F0dGVydGh3YWl0ZSIsDQogIHdyYXAubGFiZWxzID0gODAsIHRpdGxlID0gIkxNTSBSZXN1bHRzIGZvciBXb3JkIENhdGVnb3JpemF0aW9uIFJUIikNCg0KDQojIERpc3BsYXkgcmFuZG9tIGVmZmVjdHMNCnByaW50KCJSYW5kb20gZWZmZWN0czoiKQ0KcHJpbnQoVmFyQ29ycihMTU1fcnRfZmluYWwpLCBkaWdpdHMgPSAxLCBjb21wID0gIlN0ZC5EZXYuIikNCg0KDQojIFNhdmUgbW9kZWwgb3V0cHV0IGZvciBwbG90DQpzYXZlUkRTKExNTV9ydF9maW5hbCwgZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL0xNTV9ydF9maW5hbC5yZHMiKQ0KYGBgDQo8YnI+DQpSVCBhbmFseXNpcyB5aWVsZGVkIGEgbWFpbiBlZmZlY3Qgb2YgcmVzcG9uc2UgdHlwZS4gUGFydGljaXBhbnRzIGFjcm9zcyBncm91cHMgY2F0ZWdvcml6ZWQgd29yZHMgc2xvd2VyIGFmdGVyIGZhbHNlIGFsYXJtcyB0aGFuIGFmdGVyIGZhc3QgaGl0cywgaW5kaWNhdGluZyBwb3N0LWVycm9yIHNsb3dpbmcuIE1vcmVvdmVyLCB3b3JkIGNhdGVnb3JpemF0aW9uIGFmdGVyIGZhc3QgaGl0cyB3YXMgZmFzdGVyIHRoYW4gYWZ0ZXIgc2xvdyBoaXRzLiBUaGUgYW5hbHlzaXMgZnVydGhlciByZXZlYWxlZCBzaWduaWZpY2FudCB0d28td2F5IGludGVyYWN0aW9ucyBiZXR3ZWVuIGdyb3VwIGFuZCB3b3JkIHZhbGVuY2UgYW5kIGJldHdlZW4gZWFjaCByZXNwb25zZSB0eXBlIGNvbnRyYXN0IGFuZCB3b3JkIHZhbGVuY2UuIENydWNpYWxseSwgdGhlIHNpZ25pZmljYW50IHR3by13YXkgaW50ZXJhY3Rpb25zIHdlcmUgcXVhbGlmaWVkIGJ5IGEgc3RhdGlzdGljYWwgdHJlbmQgZm9yIGEgdGhyZWUtd2F5IGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHJlc3BvbnNlIHR5cGUgY29udHJhc3QgZmFsc2UgYWxhcm1zIGNvbXBhcmVkIHRvIGZhc3QgaGl0cywgd29yZCB2YWxlbmNlLCBhbmQgZ3JvdXAuIA0KPGJyPjxicj48YnI+DQoNCiMjIyMgUGFpcndpc2UgQ29tcGFyaXNvbnMNCg0KU2lnbmlmaWNhbnQgYW5kIGh5cG90aGVzaXMtcmVsZXZhbnQgaW50ZXJhY3Rpb25zIHdlcmUgZm9sbG93ZWQgdXAgd2l0aCBwb3N0IGhvYyBjb21wYXJpc29ucyB1c2luZyBmYWxzZSBkaXNjb3ZlcnkgcmF0ZSBhZGp1c3RtZW50LiA8YnI+PGJyPg0KVGhlc2UgdGFibGVzIGNvcnJlc3BvbmQgdG8gVGFibGUgNCBpbiB0aGUgbWFudXNjcmlwdC4gDQoNCmBgYHtyIGxtbS1ydC1wYWlyd2lzZS1jb21wYXJpc29uc30NCg0KIyBTZXQgZW1tZWFucyBvcHRpb25zDQplbW1fb3B0aW9ucyhsbWVyLmRmID0gIlNhdHRlcnRod2FpdGUiLCBsbWVyVGVzdC5saW1pdCA9IEluZikNCg0KDQojIyMjIDEpIEdldCBjb250cmFzdHMgZm9yIGVmZmVjdCBvZiB3b3JkIHZhbGVuY2Ugd2l0aGluIGVhY2ggcmVzcG9uc2UgdHlwZQ0KZW1tczEgPC0gZW1tZWFucyhMTU1fcnRfZmluYWwsIH4gd29yZF92YWxlbmNlIHwgZ25nX3Jlc3BvbnNlX3R5cGUpDQpjb250cmFzdF8xIDwtIGNvbnRyYXN0KGVtbXMxLCBpbnRlcmFjdGlvbiA9ICJyZXZwYWlyd2lzZSIpDQoNCg0KIyBHZXQgQ0lzIG9mIGVzdGltYXRlcw0KY29udHJhc3RfMV9jaSA8LSBjb25maW50KGNvbnRyYXN0XzEsIGFkanVzdCA9ICJub25lIiwgbGV2ZWwgPSAwLjk1KVtjKCJsb3dlci5DTCIsICJ1cHBlci5DTCIpXQ0KDQoNCiMgTWVyZ2UgY29udHJhc3QgYW5kIENJIGluIG9uZSB0YWJsZQ0KZm9sbG93X3VwXzEgPC0gY2JpbmQoY29udHJhc3RfMSwgY29udHJhc3RfMV9jaSkNCg0KDQojIEFkZCBhZGp1c3RlZCBwIHZhbHVlcw0KZm9sbG93X3VwXzEkcC52YWx1ZV9hZGpfZmRyIDwtIHAuYWRqdXN0KGZvbGxvd191cF8xJHAudmFsdWUsIG1ldGhvZCA9ICJmZHIiKQ0KDQoNCiMgRGlzcGxheSB0YWJsZQ0KbXlfdGFibGVfdGVtcGxhdGUoZm9sbG93X3VwXzFbLCBjKDIsIDEsIDMsIDgsIDksIDYsIDcsIDEwKV0sDQogIGNhcHRpb24gPSAiRm9sbG93LXVwIGVmZmVjdCBvZiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gcmVzcG9uc2UgdHlwZSIsDQogIGRpZ2l0cyA9IGMoMCwgMCwgMiwgMiwgMiwgMiwgMywgMykpDQoNCg0KIyMjIyAyKSBHZXQgY29udHJhc3RzIGZvciByZXNvbHZpbmcgaW50ZXJhY3Rpb24gZ3JvdXAgKiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gcmVzcG9uc2UgdHlwZQ0KZW1tczIgPC0gZW1tZWFucyhMTU1fcnRfZmluYWwsIH4gd29yZF92YWxlbmNlICogZ3JvdXAgfCBnbmdfcmVzcG9uc2VfdHlwZSkNCmNvbnRyYXN0XzIgPC0gY29udHJhc3QoZW1tczIsIGludGVyYWN0aW9uID0gInJldnBhaXJ3aXNlIikNCg0KDQojIEdldCBDSXMgb2YgZXN0aW1hdGVzDQpjb250cmFzdF8yX2NpIDwtIGNvbmZpbnQoY29udHJhc3RfMiwgYWRqdXN0ID0gIm5vbmUiLCBsZXZlbCA9IDAuOTUpW2MoImxvd2VyLkNMIiwgInVwcGVyLkNMIildDQoNCg0KIyBQdXQgY29udHJhc3QgYW5kIENJIGluIG9uZSB0YWJsZSAob25seSBmb3IgRkggYW5kIEZBKQ0KZm9sbG93X3VwXzIgPC0gY2JpbmQoY29udHJhc3RfMltjKDIsIDMpLCBdLCBjb250cmFzdF8yX2NpW2MoMiwgMyksIF0pDQoNCg0KIyBHZXQgYWRqdXN0ZWQgcCB2YWx1ZXMNCmZvbGxvd191cF8yJHAudmFsdWVfYWRqX2ZkciA8LSBwLmFkanVzdChmb2xsb3dfdXBfMiRwLnZhbHVlLCBtZXRob2QgPSAiZmRyIikNCg0KDQojIERpc3BsYXkgdGFibGUNCm15X3RhYmxlX3RlbXBsYXRlKGZvbGxvd191cF8yWywgYygzLCAxLCAyLCA0LCA5LCAxMCwgNywgOCwgMTEpXSwNCiAgY2FwdGlvbiA9ICJGb2xsb3ctdXAgaW50ZXJhY3Rpb24gZ3JvdXAgKiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gcmVzcG9uc2UgdHlwZSIsDQogIGRpZ2l0cyA9IGMoMCwgMCwgMCwgMiwgMiwgMiwgMiwgMywgMykpDQoNCg0KIyMjIyAzKSBHZXQgY29udHJhc3RzIGZvciByZXNvbHZpbmcgZWZmZWN0IG9mIHZhbGVuY2UgbmVzdGVkIHdpdGhpbiBncm91cCBhbmQgcmVzcG9uc2UgdHlwZQ0KZW1tczMgPC0gZW1tZWFucyhMTU1fcnRfZmluYWwsIH4gd29yZF92YWxlbmNlIHwgZ25nX3Jlc3BvbnNlX3R5cGUgKiBncm91cCkNCmNvbnRyYXN0XzMgPC0gY29udHJhc3QoZW1tczMsIGludGVyYWN0aW9uID0gInJldnBhaXJ3aXNlIikNCg0KDQojIEdldCBDSXMgb2YgZXN0aW1hdGVzDQpjb250cmFzdF8zX2NpIDwtIGNvbmZpbnQoY29udHJhc3RfMywgYWRqdXN0ID0gIm5vbmUiLCBsZXZlbCA9IDAuOTUpW2MoImxvd2VyLkNMIiwgInVwcGVyLkNMIildDQoNCg0KIyBQdXQgY29udHJhc3QgYW5kIENJIGluIG9uZSB0YWJsZSAob25seSBmb3IgRkggYW5kIEZBKQ0KZm9sbG93X3VwXzMgPC0gY2JpbmQoY29udHJhc3RfM1tjKDIsIDMsIDYsIDcpLCBdLCBjb250cmFzdF8zX2NpW2MoMiwgMywgNiwgNyksIF0pDQoNCg0KIyBHZXQgYWRqdXN0ZWQgcCB2YWx1ZXMgDQpmb2xsb3dfdXBfMyRwLnZhbHVlX2Fkal9mZHIgPC0gcC5hZGp1c3QoZm9sbG93X3VwXzMkcC52YWx1ZSwgbWV0aG9kID0gImZkciIpDQoNCg0KIyBEaXNwbGF5IHRhYmxlDQpteV90YWJsZV90ZW1wbGF0ZShmb2xsb3dfdXBfM1tjKDEsIDMsIDIsIDQpLCBjKDIsIDMsIDEsIDQsIDksIDEwLCA3LCA4LCAxMSldLA0KICBjYXB0aW9uID0gIkZvbGxvdy11cCBlZmZlY3Qgb2YgdmFsZW5jZSBuZXN0ZWQgd2l0aGluIGdyb3VwIGFuZCByZXNwb25zZSB0eXBlIiwNCiAgZGlnaXRzID0gYygwLCAwLCAwLCAyLCAyLCAyLCAyLCAzLCAzKSkNCmBgYA0KPGJyPg0KUG9zdCBob2MgY29tcGFyaXNvbnMgaW5kaWNhdGVkIHRoYXQgYWZ0ZXIgZmFsc2UgYWxhcm1zLCBwYXJ0aWNpcGFudHMgYWNyb3NzIGdyb3VwcyBjYXRlZ29yaXplZCBuZWdhdGl2ZSB3b3JkcyBmYXN0ZXIgdGhhbiBwb3NpdGl2ZSB3b3Jkcy4gQWZ0ZXIgZmFzdCBhbmQgc2xvdyBoaXRzLCBwYXJ0aWNpcGFudHMgY2F0ZWdvcml6ZWQgcG9zaXRpdmUgd29yZHMgZmFzdGVyIHRoYW4gbmVnYXRpdmUgd29yZHMuIDxicj48YnI+DQpBZnRlciBmYWxzZSBhbGFybXMsIGJvdGggZ3JvdXBzIGNhdGVnb3JpemVkIG5lZ2F0aXZlIHdvcmRzIGZhc3RlciB0aGFuIHBvc2l0aXZlIHdvcmRzLCB3aGVyZWFzIGFmdGVyIGZhc3QgaGl0cywgdGhleSBjYXRlZ29yaXplZCBwb3NpdGl2ZSB3b3JkcyBmYXN0ZXIgdGhhbiBuZWdhdGl2ZSB3b3Jkcy4gQ29tcGFyaXNvbnMgY29uZHVjdGVkIHRvIGludmVzdGlnYXRlIGh5cG90aGVzaXplZCBncm91cCBkaWZmZXJlbmNlcyB5aWVsZGVkIHRoYXQgdGhpcyByZXNwb25zZSBmYWNpbGl0YXRpb24gdG8gbmVnYXRpdmUgcmVsYXRpdmUgdG8gcG9zaXRpdmUgd29yZHMgYWZ0ZXIgZmFsc2UgYWxhcm1zIHdhcyBzaWduaWZpY2FudGx5IHNtYWxsZXIgaW4gcGF0aWVudHMgd2l0aCBPQ0QgdGhhbiBpbiB0aGUgY29udHJvbCBncm91cCwgaW5kaWNhdGluZyBhIHJlZHVjZWQgcHJpbWluZyBlZmZlY3QuIA0KPGJyPjxicj48YnI+DQoNCiMjIyBFUlBzIGFzIFByZWRpY3RvcnMgey50YWJzZXR9DQoNCkZvciB0ZXN0aW5nIGJyYWlu4oCTYmVoYXZpb3IgcmVsYXRpb25zLCB0aGUgc2luZ2xlLXRyaWFsIHdpdGhpbi1wYXJ0aWNpcGFudCAqeiotc3RhbmRhcmRpemVkIEVSUCB3YXMgYWRkZWQgYXMgcHJlZGljdG9yLiBFUk4gYW1wbGl0dWRlIGFuZCBDUk4gYW1wbGl0dWRlIHdlcmUgZW50ZXJlZCBhcyAqeiotc3RhbmRhcmRpemVkIGNvbnRpbnVvdXMgcHJlZGljdG9ycyBpbiB0aGUgbW9kZWxzIGluY2x1ZGluZyBvbmx5IGZhbHNlIGFsYXJtIGFuZCBmYXN0IGhpdCB0cmlhbHMsIHJlc3BlY3RpdmVseS4gDQo8YnI+PGJyPg0KDQojIyMjIEVSTiANCg0KPCEtLSBNb2RlbCBzcGVjaWZpY2F0aW9uIC0tPg0KDQpgYGB7ciBsbW0tcnQtZXJuLW1vZGVsLXNwZWNpZmljYXRpb24sIGV2YWwgPSBGQUxTRX0NCg0KIyBSdW4gbW9kZWwgd2l0aCBtYXhpbWFsIHJhbmRvbS1lZmZlY3RzIHN0cnVjdHVyZQ0KTE1NX3J0X2Vybl9tYXggPC0gbG1lcih3b3JkX3J0X2xvZyB+IHdvcmRfdmFsZW5jZSAqIGdyb3VwICogTUZOX3N0YW5kYXJkaXplZCArDQogICgxICsgcG9zX25lZyArIE1GTl9zdGFuZGFyZGl6ZWQgKyBwb3NfbmVnOk1GTl9zdGFuZGFyZGl6ZWQgfCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIE9DRF9IQyArIE1GTl9zdGFuZGFyZGl6ZWQgKyBPQ0RfSEM6TUZOX3N0YW5kYXJkaXplZCB8IHdvcmQpLA0KICBkYXRhID0gc2luZ2xlX3RyaWFsX2RhdGFfcnRbc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZBIiwgXSwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQNCnN1bW1hcnkoTE1NX3J0X2Vybl9tYXgpICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KaXNTaW5ndWxhcihMTU1fcnRfZXJuX21heCkgIyBTaW5ndWxhciBmaXQNCg0KDQojIFJ1biB6ZXJvLWNvcnJlbGF0aW9uIHBhcmFtZXRlciBtb2RlbCBieSB1c2luZyB8fCBzeW50YXggdG8gcmVkdWNlIG1vZGVsIGNvbXBsZXhpdHkNCkxNTV9ydF9lcm5fcmVkMSA8LSBsbWVyKHdvcmRfcnRfbG9nIH4gd29yZF92YWxlbmNlICogZ3JvdXAgKiBNRk5fc3RhbmRhcmRpemVkICsNCiAgKDEgKyBwb3NfbmVnICsgTUZOX3N0YW5kYXJkaXplZCArIHBvc19uZWc6TUZOX3N0YW5kYXJkaXplZCB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIE9DRF9IQyArIE1GTl9zdGFuZGFyZGl6ZWQgKyBPQ0RfSEM6TUZOX3N0YW5kYXJkaXplZCB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0W3NpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGQSIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCnN1bW1hcnkoTE1NX3J0X2Vybl9yZWQxKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQppc1Npbmd1bGFyKExNTV9ydF9lcm5fcmVkMSkgICAgICMgU2luZ3VsYXIgZml0DQpzdW1tYXJ5KHJlUENBKExNTV9ydF9lcm5fcmVkMSkpICMgRm9yIHdvcmRzIHRoZXJlIGlzIDEgdGVybSwgZm9yIHBhcnRpY2lwYW50cyAyIHRlcm1zIHRoYXQgZG8gbm90IGV4cGxhaW4gdmFyaWFuY2UgKDwgMC41JSkNCnByaW50KFZhckNvcnIoTE1NX3J0X2Vybl9yZWQxKSwgY29tcCA9ICJWYXJpYW5jZSIpICMgSXQgaXMgT0NEX0hDOk1GTiBmb3Igd29yZHM7IE1GTiBhbmQgcG9zX25lZzpNRk4gZm9yIHBhcnRpY2lwYW50cw0KYGBgDQoNCjwhLS0gRmluYWwgbW9kZWwgLS0+DQoNClRoaXMgdGFibGUgY29ycmVzcG9uZHMgdG8gVGFibGUgNiBpbiB0aGUgbWFudXNjcmlwdC4gDQoNCmBgYHtyIGxtbS1ydC1lcm4tZmluYWwtbW9kZWx9DQoNCiMgUnVuIGZpbmFsIG1vZGVsIHdpdGhvdXQgcmFuZG9tIHRlcm1zIGV4cGxhaW5pbmcgemVybyB2YXJpYW5jZQ0KTE1NX3J0X2Vybl9maW5hbCA8LSBsbWVyKHdvcmRfcnRfbG9nIH4gd29yZF92YWxlbmNlICogZ3JvdXAgKiBNRk5fc3RhbmRhcmRpemVkICsNCiAgKDEgKyBwb3NfbmVnIHx8IHBhcnRpY2lwYW50X2lkKSArDQogICgxICsgT0NEX0hDICsgTUZOX3N0YW5kYXJkaXplZCB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0W3NpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGQSIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShMTU1fcnRfZXJuX2ZpbmFsKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoTE1NX3J0X2Vybl9maW5hbCkgICAgICMgTm8gc2luZ3VsYXIgZml0DQojIHN1bW1hcnkocmVQQ0EoTE1NX3J0X2Vybl9maW5hbCkpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIERpc3BsYXkgcmVzdWx0cyAoZml4ZWQgZWZmZWN0cykNCnRhYl9tb2RlbChMTU1fcnRfZXJuX2ZpbmFsLA0KICBkdi5sYWJlbHMgPSAiUlQiLCBwcmVkLmxhYmVscyA9IGxhYmVscywgc2hvdy5zdGF0ID0gVFJVRSwgc2hvdy5pY2MgPSBGQUxTRSwgc2hvdy5yMiA9IEZBTFNFLA0KICBzaG93LnJlLnZhciA9IEZBTFNFLCBzaG93Lm5ncm91cHMgPSBGQUxTRSwgbWludXMuc2lnbiA9ICItIiwgc3RyaW5nLnByZWQgPSAiRml4ZWQgZWZmZWN0cyIsDQogIHN0cmluZy5lc3QgPSAiYiIsIHN0cmluZy5zdGF0ID0gInQiLCBzdHJpbmcuY2kgPSAiOTUgJSBDSSIsIHAudmFsID0gInNhdHRlcnRod2FpdGUiLCANCiAgd3JhcC5sYWJlbHMgPSA4MCwgdGl0bGUgPSAiTE1NIFJlc3VsdHMgZm9yIFdvcmQgQ2F0ZWdvcml6YXRpb24gUlQgV2l0aCBFUk4gYXMgUHJlZGljdG9yIikNCg0KDQojIERpc3BsYXkgcmFuZG9tIGVmZmVjdHMNCnByaW50KCJSYW5kb20gZWZmZWN0czoiKQ0KcHJpbnQoVmFyQ29ycihMTU1fcnRfZXJuX2ZpbmFsKSwgZGlnaXRzID0gMSwgY29tcCA9ICJTdGQuRGV2LiIpDQpgYGANCjxicj4NCkFuYWx5c2lzIG9mIHdvcmQgY2F0ZWdvcml6YXRpb24gUlQgaW4gZmFsc2UgYWxhcm0gdHJpYWxzIHdpdGggRVJOIGFzIHByZWRpY3RvciB5aWVsZGVkIGEgbWFpbiBlZmZlY3Qgb2Ygd29yZCB2YWxlbmNlLCBhZ2FpbiByZXZlYWxpbmcgdGhlIHByaW1pbmcgZWZmZWN0IGFmdGVyIGZhbHNlIGFsYXJtcywgd2l0aCBuZWdhdGl2ZSB3b3JkcyBiZWluZyBjYXRlZ29yaXplZCBmYXN0ZXIgdGhhbiBwb3NpdGl2ZSB3b3Jkcy4gQ29udHJhcnkgdG8gb3VyIHByZWRpY3Rpb24sIHdlIGZvdW5kIG5vIHNpZ25pZmljYW50IGludGVyYWN0aW9uIGJldHdlZW4gRVJOIGFuZCB3b3JkIHZhbGVuY2UuIEhlbmNlLCB0aGVyZSB3YXMgbm8gZXZpZGVuY2UgZm9yIGEgcmVsYXRpb24gYmV0d2VlbiBlcnJvciBldmFsdWF0aW9uIChpbmRleGVkIGJ5IHRoZSBSVCBwcmltaW5nIGVmZmVjdCkgYW5kIEVSTi4gRnVydGhlciwgdGhlcmUgd2FzIG5vIGRpZmZlcmVuY2UgaW4gdGhpcyByZWxhdGlvbiBiZXR3ZWVuIGdyb3Vwcy4gDQo8YnI+PGJyPjxicj4NCg0KIyMjIyBDUk4gDQoNCjwhLS0gTW9kZWwgc3BlY2lmaWNhdGlvbiAtLT4NCg0KYGBge3IgbG1tLXJ0LWNybi1tb2RlbC1zcGVjaWZpY2F0aW9uLCBldmFsID0gRkFMU0V9DQoNCiMgUnVuIG1vZGVsIHdpdGggbWF4aW1hbCByYW5kb20tZWZmZWN0cyBzdHJ1Y3R1cmUNCkxNTV9ydF9jcm5fbWF4IDwtIGxtZXIod29yZF9ydF9sb2cgfiB3b3JkX3ZhbGVuY2UgKiBncm91cCAqIE1GTl9zdGFuZGFyZGl6ZWQgKw0KICAoMSArIHBvc19uZWcgKyBNRk5fc3RhbmRhcmRpemVkICsgcG9zX25lZzpNRk5fc3RhbmRhcmRpemVkIHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBPQ0RfSEMgKyBNRk5fc3RhbmRhcmRpemVkICsgT0NEX0hDOk1GTl9zdGFuZGFyZGl6ZWQgfCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0W3NpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGSCIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0DQpzdW1tYXJ5KExNTV9ydF9jcm5fbWF4KSAgICAjIE1vZGVsIGRvZXMgY29udmVyZ2UNCmlzU2luZ3VsYXIoTE1NX3J0X2Nybl9tYXgpICMgU2luZ3VsYXIgZml0DQoNCg0KIyBSdW4gemVyby1jb3JyZWxhdGlvbiBwYXJhbWV0ZXIgbW9kZWwgYnkgdXNpbmcgfHwgc3ludGF4IHRvIHJlZHVjZSBtb2RlbCBjb21wbGV4aXR5DQpMTU1fcnRfY3JuX3JlZDEgPC0gbG1lcih3b3JkX3J0X2xvZyB+IHdvcmRfdmFsZW5jZSAqIGdyb3VwICogTUZOX3N0YW5kYXJkaXplZCArDQogICgxICsgcG9zX25lZyArIE1GTl9zdGFuZGFyZGl6ZWQgKyBwb3NfbmVnOk1GTl9zdGFuZGFyZGl6ZWQgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBPQ0RfSEMgKyBNRk5fc3RhbmRhcmRpemVkICsgT0NEX0hDOk1GTl9zdGFuZGFyZGl6ZWQgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydFtzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkgiLCBdLA0KICBSRU1MID0gVFJVRSwNCiAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQpzdW1tYXJ5KExNTV9ydF9jcm5fcmVkMSkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KaXNTaW5ndWxhcihMTU1fcnRfY3JuX3JlZDEpICAgICAjIFNpbmd1bGFyIGZpdA0Kc3VtbWFyeShyZVBDQShMTU1fcnRfY3JuX3JlZDEpKSAjIEZvciB3b3JkcyBhbmQgcGFydGljaXBhbnRzIHRoZXJlIGFyZSBlYWNoIDIgdGVybXMgdGhhdCBkbyBub3QgZXhwbGFpbiB2YXJpYW5jZSAoPCAwLjUlKQ0KcHJpbnQoVmFyQ29ycihMTU1fcnRfY3JuX3JlZDEpLCBjb21wID0gIlZhcmlhbmNlIikgIyBJdCBpcyBPQ0RfSEMgYW5kIE9DRF9IQzpNRk4gZm9yIHdvcmRzIGFuZCBNRk4gYW5kIHBvc19uZWc6TUZOIGZvciBwYXJ0aWNpcGFudHMNCmBgYA0KDQo8IS0tIEZpbmFsIG1vZGVsIC0tPg0KDQpUaGlzIHRhYmxlIGNvcnJlc3BvbmRzIHRvIFRhYmxlIDYgaW4gdGhlIG1hbnVzY3JpcHQuIA0KDQpgYGB7ciBsbW0tcnQtY3JuLWZpbmFsLW1vZGVsfQ0KDQojIFJ1biBmaW5hbCBtb2RlbCB3aXRob3V0IHJhbmRvbSB0ZXJtcyBleHBsYWluaW5nIHplcm8gdmFyaWFuY2UNCkxNTV9ydF9jcm5fZmluYWwgPC0gbG1lcih3b3JkX3J0X2xvZyB+IHdvcmRfdmFsZW5jZSAqIGdyb3VwICogTUZOX3N0YW5kYXJkaXplZCArDQogICgxICsgcG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIE1GTl9zdGFuZGFyZGl6ZWQgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydFtzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkgiLCBdLA0KICBSRU1MID0gVFJVRSwNCiAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQojIHN1bW1hcnkoTE1NX3J0X2Nybl9maW5hbCkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKExNTV9ydF9jcm5fZmluYWwpICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9jcm5fZmluYWwpKSAjIEFsbCB0ZXJtcyBleHBsYWluIHZhcmlhbmNlDQoNCg0KIyBEaXNwbGF5IHJlc3VsdHMgKGZpeGVkIGVmZmVjdHMpDQp0YWJfbW9kZWwoTE1NX3J0X2Nybl9maW5hbCwNCiAgZHYubGFiZWxzID0gIlJUIiwgcHJlZC5sYWJlbHMgPSBsYWJlbHMsIHNob3cuc3RhdCA9IFRSVUUsIHNob3cuaWNjID0gRkFMU0UsIHNob3cucjIgPSBGQUxTRSwNCiAgc2hvdy5yZS52YXIgPSBGQUxTRSwgc2hvdy5uZ3JvdXBzID0gRkFMU0UsIG1pbnVzLnNpZ24gPSAiLSIsIHN0cmluZy5wcmVkID0gIkZpeGVkIGVmZmVjdHMiLA0KICBzdHJpbmcuZXN0ID0gImIiLCBzdHJpbmcuc3RhdCA9ICJ0Iiwgc3RyaW5nLmNpID0gIjk1ICUgQ0kiLCBwLnZhbCA9ICJzYXR0ZXJ0aHdhaXRlIiwgDQogIHdyYXAubGFiZWxzID0gODAsIHRpdGxlID0gIkxNTSBSZXN1bHRzIGZvciBXb3JkIENhdGVnb3JpemF0aW9uIFJUIFdpdGggQ1JOIGFzIFByZWRpY3RvciIpDQoNCg0KIyBEaXNwbGF5IHJhbmRvbSBlZmZlY3RzDQpwcmludCgiUmFuZG9tIGVmZmVjdHM6IikNCnByaW50KFZhckNvcnIoTE1NX3J0X2Nybl9maW5hbCksIGRpZ2l0cyA9IDEsIGNvbXAgPSAiU3RkLkRldi4iKQ0KYGBgDQo8YnI+DQpBbmFseXNpcyBvZiB3b3JkIGNhdGVnb3JpemF0aW9uIFJUIGluIGZhc3QgaGl0IHRyaWFscyBpbmNsdWRpbmcgQ1JOIGFzIHByZWRpY3RvciBpbmRpY2F0ZWQgYSBtYWluIGVmZmVjdCBvZiB3b3JkIHZhbGVuY2UuIFRoaXMgYWdhaW4gZGVtb25zdHJhdGVkIHRoZSBwcmltaW5nIGVmZmVjdCBhZnRlciBmYXN0IGhpdHMsIHdpdGggcG9zaXRpdmUgd29yZHMgYmVpbmcgY2F0ZWdvcml6ZWQgZmFzdGVyIHRoYW4gbmVnYXRpdmUgd29yZHMuIE1vcmVvdmVyLCBhIG1haW4gZWZmZWN0IGZvciBDUk4gd2FzIGZvdW5kLCB3aXRoIGZhc3RlciBSVCBiZWluZyByZWxhdGVkIHRvIHNtYWxsZXIgQ1JOIGFtcGxpdHVkZS4gVGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgYmV0d2VlbiBDUk4sIHdvcmQgdmFsZW5jZSwgYW5kIGdyb3VwLiBUaHVzLCB3ZSBmb3VuZCBubyBldmlkZW5jZSBmb3IgYSByZWxhdGlvbiBiZXR3ZWVuIGFjdGlvbiBldmFsdWF0aW9uIGFuZCBDUk4gYW5kIG5vIGdyb3VwIGRpZmZlcmVuY2UgaW4gdGhpcyByZWxhdGlvbi4gDQo8YnI+PGJyPjxicj4NCg0KIyMjIFRyYWl0cyBhcyBQcmVkaWN0b3JzDQoNClRvIGV4cGxvcmUgZWZmZWN0cyBvZiB0cmFpdCBhbnhpZXR5LCB3b3JyeSwgYW5kIE9DRCBzeW1wdG9tIHNldmVyaXR5IG9uIGFjdGlvbiBldmFsdWF0aW9uLCB3ZSBpbmNsdWRlZCB0aGVzZSBPQ0QtcmVsYXRlZCBjaGFyYWN0ZXJpc3RpY3MgYXMgcHJlZGljdG9ycy4gTW9kZWxzIHdlcmUgY2FsY3VsYXRlZCBzZXBhcmF0ZWx5IGZvciBlYWNoIGdyb3VwIHNpbmNlIG90aGVyd2lzZSBlZmZlY3RzIG9mIHRyYWl0IG1lYXN1cmVzIGFyZSBjb25mb3VuZGVkIGJ5IGdyb3VwIGRpZmZlcmVuY2VzLiBUcmFpdCBtZWFzdXJlcyB3ZXJlIGdyb3VwLW1lYW4gY2VudGVyZWQuIDxicj48YnI+DQpUaGlzIHRhYmxlIGNvcnJlc3BvbmRzIHRvIFRhYmxlIFM1IGluIHRoZSBzdXBwbGVtZW50YWwgbWF0ZXJpYWwuIA0KDQpgYGB7ciBsbW0tcnQtdHJhaXRzLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWR9DQoNCiMgT0NJIGluIEhDOiBSdW4gcmVkdWNlZCBmaW5hbCBtb2RlbA0KTE1NX3J0X29jaV9oYyA8LSBsbWVyKGxvZyh3b3JkX3J0KSB+IEZBX0ZIICogcG9zX25lZyAqIG9jaV9jZW50ZXJlZCArDQogICgxICsgRkFfRkggKyBwb3NfbmVnICsgRkFfRkg6cG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIEZBX0ZIIHx8IHdvcmQpLA0KICBkYXRhID0gc2luZ2xlX3RyaWFsX2RhdGFfcnRbKHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGQSIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGSCIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdHJpYWxfZGF0YV9ydCRncm91cCA9PSAiSEMiLCBdLA0KICBSRU1MID0gVFJVRSwNCiAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQojIHN1bW1hcnkoTE1NX3J0X29jaV9oYykgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKExNTV9ydF9vY2lfaGMpICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9vY2lfaGMpKSAjIEFsbCB0ZXJtcyBleHBsYWluIHZhcmlhbmNlDQoNCg0KIyBPQ0kgaW4gT0NEOiBSdW4gcmVkdWNlZCBmaW5hbCBtb2RlbA0KTE1NX3J0X29jaV9vY2QgPC0gbG1lcihsb2cod29yZF9ydCkgfiBGQV9GSCAqIHBvc19uZWcgKiBvY2lfY2VudGVyZWQgKw0KICAoMSArIEZBX0ZIICsgcG9zX25lZyArIEZBX0ZIOnBvc19uZWcgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGQV9GSCB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0WyhzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkEiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkgiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ3JvdXAgPT0gIk9DRCIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShMTU1fcnRfb2NpX29jZCkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKExNTV9ydF9vY2lfb2NkKSAgICAgIyBObyBzaW5ndWxhciBmaXQNCiMgc3VtbWFyeShyZVBDQShMTU1fcnRfb2NpX29jZCkpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIFNUQUkgaW4gSEM6IFJ1biByZWR1Y2VkIGZpbmFsIG1vZGVsDQpMTU1fcnRfc3RhaV9oYyA8LSBsbWVyKGxvZyh3b3JkX3J0KSB+IEZBX0ZIICogcG9zX25lZyAqIHN0YWlfY2VudGVyZWQgKw0KICAoMSArIEZBX0ZIICsgcG9zX25lZyArIEZBX0ZIOnBvc19uZWcgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGQV9GSCB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0WyhzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkEiIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkgiKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ3JvdXAgPT0gIkhDIiwgXSwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQgYW5kIFBDQSBvZiByYW5kb20tZWZmZWN0cyB2YXJpYW5jZS1jb3ZhcmlhbmNlIGVzdGltYXRlcw0KIyBzdW1tYXJ5KExNTV9ydF9zdGFpX2hjKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoTE1NX3J0X3N0YWlfaGMpICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9zdGFpX2hjKSkgIyBBbGwgdGVybXMgZXhwbGFpbiB2YXJpYW5jZQ0KDQoNCiMgU1RBSSBpbiBPQ0Q6IFJ1biByZWR1Y2VkIGZpbmFsIG1vZGVsDQpMTU1fcnRfc3RhaV9vY2QgPC0gbG1lcihsb2cod29yZF9ydCkgfiBGQV9GSCAqIHBvc19uZWcgKiBzdGFpX2NlbnRlcmVkICsNCiAgKDEgKyBGQV9GSCArIHBvc19uZWcgKyBGQV9GSDpwb3NfbmVnIHx8IHBhcnRpY2lwYW50X2lkKSArDQogICgxICsgRkFfRkggfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydFsoc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZBIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZIIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV90cmlhbF9kYXRhX3J0JGdyb3VwID09ICJPQ0QiLCBdLA0KICBSRU1MID0gVFJVRSwNCiAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQojIHN1bW1hcnkoTE1NX3J0X3N0YWlfb2NkKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoTE1NX3J0X3N0YWlfb2NkKSAgICAgIyBObyBzaW5ndWxhciBmaXQNCiMgc3VtbWFyeShyZVBDQShMTU1fcnRfc3RhaV9vY2QpKSAjIEFsbCB0ZXJtcyBleHBsYWluIHZhcmlhbmNlDQoNCg0KIyBQU1dRIGluIEhDOiBSdW4gcmVkdWNlZCBmaW5hbCBtb2RlbA0KTE1NX3J0X3Bzd3FfaGMgPC0gbG1lcihsb2cod29yZF9ydCkgfiBGQV9GSCAqIHBvc19uZWcgKiBwc3dxX2NlbnRlcmVkICsNCiAgKDEgKyBGQV9GSCArIHBvc19uZWcgKyBGQV9GSDpwb3NfbmVnIHx8IHBhcnRpY2lwYW50X2lkKSArDQogICgxICsgRkFfRkggfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydFsoc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZBIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3RyaWFsX2RhdGFfcnQkZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZIIikgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV90cmlhbF9kYXRhX3J0JGdyb3VwID09ICJIQyIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShMTU1fcnRfcHN3cV9oYykgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKExNTV9ydF9wc3dxX2hjKSAgICAgIyBObyBzaW5ndWxhciBmaXQNCiMgc3VtbWFyeShyZVBDQShMTU1fcnRfcHN3cV9oYykpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIFBTV1EgaW4gT0NEOiBSdW4gcmVkdWNlZCBmaW5hbCBtb2RlbA0KTE1NX3J0X3Bzd3Ffb2NkIDwtIGxtZXIobG9nKHdvcmRfcnQpIH4gRkFfRkggKiBwb3NfbmVnICogcHN3cV9jZW50ZXJlZCArDQogICgxICsgRkFfRkggKyBwb3NfbmVnICsgRkFfRkg6cG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIEZBX0ZIIHx8IHdvcmQpLA0KICBkYXRhID0gc2luZ2xlX3RyaWFsX2RhdGFfcnRbKHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGQSIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGSCIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdHJpYWxfZGF0YV9ydCRncm91cCA9PSAiT0NEIiwgXSwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQgYW5kIFBDQSBvZiByYW5kb20tZWZmZWN0cyB2YXJpYW5jZS1jb3ZhcmlhbmNlIGVzdGltYXRlcw0KIyBzdW1tYXJ5KExNTV9ydF9wc3dxX29jZCkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKExNTV9ydF9wc3dxX29jZCkgICAgICMgTm8gc2luZ3VsYXIgZml0DQojIHN1bW1hcnkocmVQQ0EoTE1NX3J0X3Bzd3Ffb2NkKSkgIyBBbGwgdGVybXMgZXhwbGFpbiB2YXJpYW5jZQ0KDQoNCiMgRGlzcGxheSByZXN1bHRzIChmaXhlZCBlZmZlY3RzKQ0KdGFiX21vZGVsKExNTV9ydF9vY2lfb2NkLCBMTU1fcnRfb2NpX2hjLA0KICBkdi5sYWJlbHMgPSBjKCJSVDogT0NJLVIgYXMgcHJlZGljdG9yIGluIHBhdGllbnRzIHdpdGggT0NEIiwgIlJUOiBPQ0ktUiBhcyBwcmVkaWN0b3IgaW4gY29udHJvbCBwYXJ0aWNpcGFudHMiKSwNCiAgcHJlZC5sYWJlbHMgPSBsYWJlbHMsIHNob3cuc3RhdCA9IFRSVUUsIHNob3cuaWNjID0gRkFMU0UsIHNob3cucjIgPSBGQUxTRSwNCiAgc2hvdy5yZS52YXIgPSBGQUxTRSwgc2hvdy5uZ3JvdXBzID0gRkFMU0UsIG1pbnVzLnNpZ24gPSAiLSIsIHN0cmluZy5wcmVkID0gIkZpeGVkIGVmZmVjdHMiLA0KICBzdHJpbmcuZXN0ID0gImIiLCBzdHJpbmcuc3RhdCA9ICJ0Iiwgc3RyaW5nLmNpID0gIjk1ICUgQ0kiLCBwLnZhbCA9ICJzYXR0ZXJ0aHdhaXRlIiwgd3JhcC5sYWJlbHMgPSA4MCwNCiAgdGl0bGUgPSAiTE1NIFJlc3VsdHMgZm9yIFdvcmQgQ2F0ZWdvcml6YXRpb24gUlQgV2l0aCBPQ0QgU3ltcHRvbSBTZXZlcml0eSAoT0NJLVIpIGFzIFByZWRpY3RvciIpDQoNCg0KdGFiX21vZGVsKExNTV9ydF9zdGFpX29jZCwgTE1NX3J0X3N0YWlfaGMsDQogIGR2LmxhYmVscyA9IGMoIlJUOiBTVEFJIGFzIHByZWRpY3RvciBpbiBwYXRpZW50cyB3aXRoIE9DRCIsICJSVDogU1RBSSBhcyBwcmVkaWN0b3IgaW4gY29udHJvbCBwYXJ0aWNpcGFudHMiKSwNCiAgcHJlZC5sYWJlbHMgPSBsYWJlbHMsIHNob3cuc3RhdCA9IFRSVUUsIHNob3cuaWNjID0gRkFMU0UsIHNob3cucjIgPSBGQUxTRSwNCiAgc2hvdy5yZS52YXIgPSBGQUxTRSwgc2hvdy5uZ3JvdXBzID0gRkFMU0UsIG1pbnVzLnNpZ24gPSAiLSIsIHN0cmluZy5wcmVkID0gIkZpeGVkIGVmZmVjdHMiLA0KICBzdHJpbmcuZXN0ID0gImIiLCBzdHJpbmcuc3RhdCA9ICJ0Iiwgc3RyaW5nLmNpID0gIjk1ICUgQ0kiLCBwLnZhbCA9ICJzYXR0ZXJ0aHdhaXRlIiwgd3JhcC5sYWJlbHMgPSA4MCwNCiAgdGl0bGUgPSAiTE1NIFJlc3VsdHMgZm9yIFdvcmQgQ2F0ZWdvcml6YXRpb24gUlQgV2l0aCBUcmFpdCBBbnhpZXR5IChTVEFJKSBhcyBQcmVkaWN0b3IiKQ0KDQoNCnRhYl9tb2RlbChMTU1fcnRfcHN3cV9vY2QsIExNTV9ydF9wc3dxX2hjLA0KICBkdi5sYWJlbHMgPSBjKCJSVDogUFNXUSBhcyBwcmVkaWN0b3IgaW4gcGF0aWVudHMgd2l0aCBPQ0QiLCAiUlQ6IFBTV1EgYXMgcHJlZGljdG9yIGluIGNvbnRyb2wgcGFydGljaXBhbnRzIiksDQogIHByZWQubGFiZWxzID0gbGFiZWxzLCBzaG93LnN0YXQgPSBUUlVFLCBzaG93LmljYyA9IEZBTFNFLCBzaG93LnIyID0gRkFMU0UsDQogIHNob3cucmUudmFyID0gRkFMU0UsIHNob3cubmdyb3VwcyA9IEZBTFNFLCBtaW51cy5zaWduID0gIi0iLCBzdHJpbmcucHJlZCA9ICJGaXhlZCBlZmZlY3RzIiwNCiAgc3RyaW5nLmVzdCA9ICJiIiwgc3RyaW5nLnN0YXQgPSAidCIsIHN0cmluZy5jaSA9ICI5NSAlIENJIiwgcC52YWwgPSAic2F0dGVydGh3YWl0ZSIsIHdyYXAubGFiZWxzID0gODAsDQogIHRpdGxlID0gIkxNTSBSZXN1bHRzIGZvciBXb3JkIENhdGVnb3JpemF0aW9uIFJUIFdpdGggVHJhaXQgV29ycnkgKFBTV1EpIGFzIFByZWRpY3RvciIpDQoNCg0KIyBTYXZlIG1vZGVsIG91dHB1dCBmb3IgcGxvdA0Kc2F2ZVJEUyhMTU1fcnRfb2NpX29jZCwgIGZpbGUgPSAiLi9zYXZlZF9vYmplY3RzX2Zvcl9wbG90cy9MTU1fcnRfb2NpX29jZC5yZHMiKQ0Kc2F2ZVJEUyhMTU1fcnRfc3RhaV9vY2QsIGZpbGUgPSAiLi9zYXZlZF9vYmplY3RzX2Zvcl9wbG90cy9MTU1fcnRfc3RhaV9vY2QucmRzIikNCg0KDQojIE5vdGU6IEZvciBhbGwgbW9kZWxzIHdpdGggdHJhaXRzIGFzIHByZWRpY3RvcnMsIHRoZSByZWR1Y2VkIG1vZGVscyB3ZXJlIHJ1bg0KIyAocmFuZG9tIGVmZmVjdHMgd2VyZSBzcGVjaWZpZWQgYXMgdW5jb3JyZWxhdGVkIGR1ZSB0byBub24tY29udmVyZ2VuY2Ugb2YgdGhlDQojIG1vZGVscyB3aXRoIHRoZSBtYXhpbWFsIHJhbmRvbS1lZmZlY3RzIHN0cnVjdHVyZTsgcmFuZG9tIGVmZmVjdHMgZXhwbGFpbmluZw0KIyB6ZXJvIHZhcmlhbmNlIFthbGwgcmFuZG9tIHNsb3BlcyBvZiB0cmFpdHMgZm9yIHdvcmRzXSB3ZXJlIHJlbW92ZWQpDQpgYGANCjxicj4NCkV4cGxvcmF0b3J5IGFuYWx5c2VzIG9uIGVmZmVjdHMgb2YgdHJhaXQgYW54aWV0eSwgd29ycnksIGFuZCBPQ0Qgc3ltcHRvbSBzZXZlcml0eSBvbiBhY3Rpb24gZXZhbHVhdGlvbiB3aXRoaW4gYm90aCBncm91cHMgcmV2ZWFsZWQgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiBPQ0Qgc3ltcHRvbSBzZXZlcml0eSwgd29yZCB2YWxlbmNlLCBhbmQgdGhlIHJlc3BvbnNlIHR5cGUgY29udHJhc3QgZmFsc2UgYWxhcm1zIGNvbXBhcmVkIHRvIGZhc3QgaGl0cyBpbiB0aGUgcGF0aWVudCBncm91cC4gVGh1cywgaGlnaGVyIHN5bXB0b20gc2V2ZXJpdHkgaW4gcGF0aWVudHMgd2FzIGFzc29jaWF0ZWQgd2l0aCBhIHNtYWxsZXIgb3ZlcmFsbCBwcmltaW5nIGVmZmVjdCBhZnRlciBmYXN0IGhpdHMgYW5kIGZhbHNlIGFsYXJtcy4gQSB0cmVuZCBmb3IgYSBzaW1pbGFyIHJlbGF0aW9uIHdhcyBvYnNlcnZlZCBmb3IgdHJhaXQgYW54aWV0eS4gVGhlcmUgd2FzIG5vIHNpZ25pZmljYW50IGVmZmVjdCBvZiB0cmFpdCB3b3JyeS4NCjxicj48YnI+PGJyPg0KDQojIyMgQ29ycmVsYXRpb25zDQoNClRoZSBtaWRkbGUgYW5kIGxvd2VyIHRhYmxlcyBjb3JyZXNwb25kIHRvIFRhYmxlIFM2IGFuZCBTNyBpbiB0aGUgc3VwcGxlbWVudGFsIG1hdGVyaWFsLiAgDQoNCmBgYHtyIGNvcnJlbGF0aW9uc30NCg0KIyBDYWxjdWxhdGUgb3ZlcmFsbCBzY29yZSBmb3IgRVJQcyBhbmQgcHJpbWluZw0KZGZfY29yciA8LSBzaW5nbGVfdHJpYWxfZGF0YV9ydCAlPiUNCiAgIyBDYWxjdWxhdGUgbWVhbiBwZXIgcGFydGljaXBhbnQNCiAgZHBseXI6Omdyb3VwX2J5KHBhcnRpY2lwYW50X2lkKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZSgNCiAgICBFUk4gICAgICAgICAgICAgID0gbWVhbihNRk5fMF8xMDBfRkN6W2duZ19yZXNwb25zZV90eXBlID09ICJGQSJdLCBuYS5ybSA9IFRSVUUpLA0KICAgIENSTiAgICAgICAgICAgICAgPSBtZWFuKE1GTl8wXzEwMF9GQ3pbZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZIIl0sIG5hLnJtID0gVFJVRSksDQogICAgcG9zX2FmdGVyX0ZBICAgICA9IG1lYW4od29yZF9ydFtnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkEiICYgd29yZF92YWxlbmNlID09ICJwb3MiXSwgbmEucm0gPSBUUlVFKSwNCiAgICBuZWdfYWZ0ZXJfRkEgICAgID0gbWVhbih3b3JkX3J0W2duZ19yZXNwb25zZV90eXBlID09ICJGQSIgJiB3b3JkX3ZhbGVuY2UgPT0gIm5lZyJdLCBuYS5ybSA9IFRSVUUpLA0KICAgIHBvc19hZnRlcl9GSCAgICAgPSBtZWFuKHdvcmRfcnRbZ25nX3Jlc3BvbnNlX3R5cGUgPT0gIkZIIiAmIHdvcmRfdmFsZW5jZSA9PSAicG9zIl0sIG5hLnJtID0gVFJVRSksDQogICAgbmVnX2FmdGVyX0ZIICAgICA9IG1lYW4od29yZF9ydFtnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkgiICYgd29yZF92YWxlbmNlID09ICJuZWciXSwgbmEucm0gPSBUUlVFKSwNCiAgICBwcmltaW5nX2FmdGVyX0ZBID0gcG9zX2FmdGVyX0ZBIC0gbmVnX2FmdGVyX0ZBLA0KICAgIHByaW1pbmdfYWZ0ZXJfRkggPSBuZWdfYWZ0ZXJfRkggLSBwb3NfYWZ0ZXJfRkgsDQogICAgcHJpbWluZyAgICAgICAgICA9IChwb3NfYWZ0ZXJfRkEgKyBuZWdfYWZ0ZXJfRkgpIC0gKG5lZ19hZnRlcl9GQSArIHBvc19hZnRlcl9GSCkpICU+JQ0KICBkcGx5cjo6dW5ncm91cCgpICU+JQ0KICAjIE1lcmdlIHRyYWl0IHZhcmlhYmxlcw0KICBkcGx5cjo6bGVmdF9qb2luKC4sIHRyYWl0cywgYnkgPSAicGFydGljaXBhbnRfaWQiKQ0KDQoNCiMgQ2FsY3VsYXRlIGNvcnJlbGF0aW9ucw0KY29ycl9wcmltaW5nX0ZBX0VSTiAgIDwtIGNvci50ZXN0KGRmX2NvcnIkcHJpbWluZ19hZnRlcl9GQSwgZGZfY29yciRFUk4pDQpjb3JyX3ByaW1pbmdfRkhfQ1JOICAgPC0gY29yLnRlc3QoZGZfY29yciRwcmltaW5nX2FmdGVyX0ZILCBkZl9jb3JyJENSTikNCmNvcnJfcHJpbWluZ19vY2lfb2NkICA8LSBjb3IudGVzdChkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRwcmltaW5nLCBkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRvY2kpDQpjb3JyX3ByaW1pbmdfb2NpX2hjICAgPC0gY29yLnRlc3QoZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kcHJpbWluZywgZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kb2NpKQ0KY29ycl9wcmltaW5nX3N0YWlfb2NkIDwtIGNvci50ZXN0KGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiT0NEIixdJHByaW1pbmcsIGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiT0NEIixdJHN0YWkpDQpjb3JyX3ByaW1pbmdfc3RhaV9oYyAgPC0gY29yLnRlc3QoZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kcHJpbWluZywgZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kc3RhaSkNCmNvcnJfcHJpbWluZ19wc3dxX29jZCA8LSBjb3IudGVzdChkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRwcmltaW5nLCBkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRwc3dxKQ0KY29ycl9wcmltaW5nX3Bzd3FfaGMgIDwtIGNvci50ZXN0KGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiSEMiLCBdJHByaW1pbmcsIGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiSEMiLCBdJHBzd3EpDQpjb3JyX29jaV9zdGFpX29jZCAgICAgPC0gY29yLnRlc3QoZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJPQ0QiLF0kb2NpLCAgICAgZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJPQ0QiLF0kc3RhaSkNCmNvcnJfb2NpX3N0YWlfaGMgICAgICA8LSBjb3IudGVzdChkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIkhDIiwgXSRvY2ksICAgICBkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIkhDIiwgXSRzdGFpKQ0KY29ycl9vY2lfcHN3cV9vY2QgICAgIDwtIGNvci50ZXN0KGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiT0NEIixdJG9jaSwgICAgIGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiT0NEIixdJHBzd3EpDQpjb3JyX29jaV9wc3dxX2hjICAgICAgPC0gY29yLnRlc3QoZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kb2NpLCAgICAgZGZfY29ycltkZl9jb3JyJGdyb3VwID09ICJIQyIsIF0kcHN3cSkNCmNvcnJfc3RhaV9wc3dxX29jZCAgICA8LSBjb3IudGVzdChkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRzdGFpLCAgICBkZl9jb3JyW2RmX2NvcnIkZ3JvdXAgPT0gIk9DRCIsXSRwc3dxKQ0KY29ycl9zdGFpX3Bzd3FfaGMgICAgIDwtIGNvci50ZXN0KGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiSEMiLCBdJHN0YWksICAgIGRmX2NvcnJbZGZfY29yciRncm91cCA9PSAiSEMiLCBdJHBzd3EpDQoNCg0KIyBXcml0ZSBjb3JyZWxhdGlvbnMgcHJpbWluZyAmIEVSUHMgaW4gZGF0YSBmcmFtZQ0KY29ycl9lcnAgPC0gcmJpbmQoY2JpbmQoY29ycl9wcmltaW5nX0ZBX0VSTiRlc3RpbWF0ZSwgICAgY29ycl9wcmltaW5nX0ZBX0VSTiRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICBjb3JyX3ByaW1pbmdfRkFfRVJOJGNvbmYuaW50WzJdLCBjb3JyX3ByaW1pbmdfRkFfRVJOJHAudmFsdWUpLA0KICAgICAgICAgICAgICAgICAgY2JpbmQoY29ycl9wcmltaW5nX0ZIX0NSTiRlc3RpbWF0ZSwgICAgY29ycl9wcmltaW5nX0ZIX0NSTiRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICBjb3JyX3ByaW1pbmdfRkhfQ1JOJGNvbmYuaW50WzJdLCBjb3JyX3ByaW1pbmdfRkhfQ1JOJHAudmFsdWUpKQ0KDQoNCiMgV3JpdGUgY29ycmVsYXRpb25zIHByaW1pbmcgJiB0cmFpdHMgaW4gZGF0YSBmcmFtZQ0KY29ycl90cmFpdCA8LSByYmluZChjYmluZChjb3JyX3ByaW1pbmdfb2NpX29jZCRlc3RpbWF0ZSwgICAgIGNvcnJfcHJpbWluZ19vY2lfb2NkJGNvbmYuaW50WzFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9wcmltaW5nX29jaV9vY2QkY29uZi5pbnRbMl0sICBjb3JyX3ByaW1pbmdfb2NpX29jZCRwLnZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyX3ByaW1pbmdfb2NpX2hjJGVzdGltYXRlLCAgICAgIGNvcnJfcHJpbWluZ19vY2lfaGMkY29uZi5pbnRbMV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyX3ByaW1pbmdfb2NpX2hjJGNvbmYuaW50WzJdLCAgIGNvcnJfcHJpbWluZ19vY2lfaGMkcC52YWx1ZSksDQogICAgICAgICAgICAgICAgICAgIGNiaW5kKGNvcnJfcHJpbWluZ19zdGFpX29jZCRlc3RpbWF0ZSwgICAgY29ycl9wcmltaW5nX3N0YWlfb2NkJGNvbmYuaW50WzFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9wcmltaW5nX3N0YWlfb2NkJGNvbmYuaW50WzJdLCBjb3JyX3ByaW1pbmdfc3RhaV9vY2QkcC52YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9wcmltaW5nX3N0YWlfaGMkZXN0aW1hdGUsICAgICBjb3JyX3ByaW1pbmdfc3RhaV9oYyRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfcHJpbWluZ19zdGFpX2hjJGNvbmYuaW50WzJdLCAgY29ycl9wcmltaW5nX3N0YWlfaGMkcC52YWx1ZSksDQogICAgICAgICAgICAgICAgICAgIGNiaW5kKGNvcnJfcHJpbWluZ19wc3dxX29jZCRlc3RpbWF0ZSwgICAgY29ycl9wcmltaW5nX3Bzd3Ffb2NkJGNvbmYuaW50WzFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9wcmltaW5nX3Bzd3Ffb2NkJGNvbmYuaW50WzJdLCBjb3JyX3ByaW1pbmdfcHN3cV9vY2QkcC52YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9wcmltaW5nX3Bzd3FfaGMkZXN0aW1hdGUsICAgICBjb3JyX3ByaW1pbmdfcHN3cV9oYyRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfcHJpbWluZ19wc3dxX2hjJGNvbmYuaW50WzJdLCAgY29ycl9wcmltaW5nX3Bzd3FfaGMkcC52YWx1ZSkpDQoNCg0KIyBXcml0ZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBxdWVzdGlvbm5haXJlIHNjb3JlcyBpbiBkYXRhIGZyYW1lDQpjb3JyX3F1ZXN0IDwtIHJiaW5kKGNiaW5kKGNvcnJfb2NpX3N0YWlfb2NkJGVzdGltYXRlLCAgICAgY29ycl9vY2lfc3RhaV9vY2QkY29uZi5pbnRbMV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyX29jaV9zdGFpX29jZCRjb25mLmludFsyXSwgIGNvcnJfb2NpX3N0YWlfb2NkJHAudmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfb2NpX3N0YWlfaGMkZXN0aW1hdGUsICAgICAgY29ycl9vY2lfc3RhaV9oYyRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfb2NpX3N0YWlfaGMkY29uZi5pbnRbMl0sICAgY29ycl9vY2lfc3RhaV9oYyRwLnZhbHVlKSwNCiAgICAgICAgICAgICAgICAgICAgY2JpbmQoY29ycl9vY2lfcHN3cV9vY2QkZXN0aW1hdGUsICAgICBjb3JyX29jaV9wc3dxX29jZCRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfb2NpX3Bzd3Ffb2NkJGNvbmYuaW50WzJdLCAgY29ycl9vY2lfcHN3cV9vY2QkcC52YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9vY2lfcHN3cV9oYyRlc3RpbWF0ZSwgICAgICBjb3JyX29jaV9wc3dxX2hjJGNvbmYuaW50WzFdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9vY2lfcHN3cV9oYyRjb25mLmludFsyXSwgICBjb3JyX29jaV9wc3dxX2hjJHAudmFsdWUpLA0KICAgICAgICAgICAgICAgICAgICBjYmluZChjb3JyX3N0YWlfcHN3cV9vY2QkZXN0aW1hdGUsICAgIGNvcnJfc3RhaV9wc3dxX29jZCRjb25mLmludFsxXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfc3RhaV9wc3dxX29jZCRjb25mLmludFsyXSwgY29ycl9zdGFpX3Bzd3Ffb2NkJHAudmFsdWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJfc3RhaV9wc3dxX2hjJGVzdGltYXRlLCAgICAgY29ycl9zdGFpX3Bzd3FfaGMkY29uZi5pbnRbMV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyX3N0YWlfcHN3cV9oYyRjb25mLmludFsyXSwgIGNvcnJfc3RhaV9wc3dxX2hjJHAudmFsdWUpKQ0KDQoNCiMgRGlzcGxheSBjb3JyZWxhdGlvbnMgcHJpbWluZyAmIEVSUHMNCm15X3RhYmxlX3RlbXBsYXRlKGRhdGEuZnJhbWUoYygiRVJOICYgcHJpbWluZyBhZnRlciBmYWxzZSBhbGFybXMiLCAiQ1JOICYgcHJpbWluZyBhZnRlciBmYXN0IGhpdHMiKSwgY29ycl9lcnApLA0KICBjb2xfbmFtZXMgPSBjKCIiLCAicig1NCkiLCAiTEwiLCAiVUwiLCAicCIpLA0KICBkaWdpdHMgPSBjKDAsIDIsIDIsIDIsIDMpLA0KICBoZWFkZXJfYWJvdmVfY29uZmlnID0gYygiICIgPSAyLCAiOTUlIENJIiA9IDIsICIgIiksDQogIGNhcHRpb24gPSAiQ29ycmVsYXRpb25zIEJldHdlZW4gRVJQcyBhbmQgdGhlIFByaW1pbmcgRWZmZWN0IikNCg0KDQojIERpc3BsYXkgY29ycmVsYXRpb25zIHByaW1pbmcgJiB0cmFpdHMNCm15X3RhYmxlX3RlbXBsYXRlKGRhdGEuZnJhbWUoYygiT2JzZXNzaXZlLWNvbXB1bHNpdmUgc3ltcHRvbXMgKE9DSS1SKSIsICJUcmFpdCBhbnhpZXR5IChTVEFJIHRyYWl0KSIsDQogICJUcmFpdCB3b3JyeSAoUFNXUSkiKSwgY29ycl90cmFpdCksDQogIGNvbF9uYW1lcyA9IGMoIkNoYXJhY3RlcmlzdGljIiwgcmVwKGMoInIoMjYpIiwgIkxMIiwgIlVMIiwgInAiKSwgMikpLA0KICBkaWdpdHMgPSBjKDAsIDIsIDIsIDIsIDMsIDIsIDIsIDIsIDMpLA0KICBoZWFkZXJfYWJvdmVfY29uZmlnID0gYygiICIgPSAyLCAiOTUlIENJIiA9IDIsICIgIiA9IDIsICI5NSUgQ0kiID0gMiwgIiAiKSwNCiAgY2FwdGlvbiA9ICJDb3JyZWxhdGlvbnMgQmV0d2VlbiBPQ0QtUmVsYXRlZCBDaGFyYWN0ZXJpc3RpY3MgYW5kIHRoZSBPdmVyYWxsIFByaW1pbmcgRWZmZWN0IEFmdGVyIEZhbHNlIA0KICBBbGFybXMgYW5kIEZhc3QgSGl0cyIpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiIsICJQYXRpZW50cyB3aXRoIE9DRCIgPSA0LCAiSGVhbHRoeSBjb250cm9sIHBhcnRpY2lwYW50cyIgPSA0KSkgJT4lDQogIGFkZF9mb290bm90ZSgiXG4gTm90ZS4gUGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYXJlIHJlcG9ydGVkLiIsIG5vdGF0aW9uID0gIm5vbmUiKQ0KDQoNCiMgRGlzcGxheSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBxdWVzdGlvbm5haXJlIHNjb3Jlcw0KbXlfdGFibGVfdGVtcGxhdGUoZGF0YS5mcmFtZShjKCJPQ0ktUiAmIFNUQUkgdHJhaXQiLCAiT0NJLVIgJiBQU1dRIiwgIlNUQUkgdHJhaXQgJiBQU1dRIiksIGNvcnJfcXVlc3QpLA0KICBjb2xfbmFtZXMgPSBjKCJRdWVzdGlvbm5haXJlIHNjb3JlcyIsIHJlcChjKCJyKDI2KSIsICJMTCIsICJVTCIsICJwIiksIDIpKSwNCiAgZGlnaXRzID0gYygwLCAyLCAyLCAyLCAzLCAyLCAyLCAyLCAzKSwNCiAgaGVhZGVyX2Fib3ZlX2NvbmZpZyA9IGMoIiAiID0gMiwgIjk1JSBDSSIgPSAyLCAiICIgPSAyLCAiOTUlIENJIiA9IDIsICIgIiksDQogIGNhcHRpb24gPSAiQ29ycmVsYXRpb25zIEJldHdlZW4gUXVlc3Rpb25uYWlyZSBTY29yZXMiKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIiLCAiUGF0aWVudHMgd2l0aCBPQ0QiID0gNCwgIkhlYWx0aHkgY29udHJvbCBwYXJ0aWNpcGFudHMiID0gNCkpICU+JQ0KICBhZGRfZm9vdG5vdGUoIlxuIE5vdGUuIFBlYXJzb24gY29ycmVsYXRpb24gY29lZmZpY2llbnRzIGFyZSByZXBvcnRlZC4iLCBub3RhdGlvbiA9ICJub25lIikNCg0KDQojIFNhdmUgY29ycmVsYXRpb24gZGF0YWZyYW1lIGZvciBzY2F0dGVycGxvdHMNCnNhdmUoZGZfY29yciwgZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL2RmX2NvcnIuUmRhIikNCmBgYA0KPGJyPg0KVGhlcmUgd2FzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHByaW1pbmcgZWZmZWN0IGFmdGVyIGZhbHNlIGFsYXJtcyBhbmQgRVJOIGFjcm9zcyBwYXJ0aWNpcGFudHMuIEFsc28gbm8gY29ycmVsYXRpb24gd2FzIG9ic2VydmVkIGJldHdlZW4gdGhlIHByaW1pbmcgZWZmZWN0IGFmdGVyIGZhc3QgaGl0cyBhbmQgQ1JOIGFjcm9zcyBwYXJ0aWNpcGFudHMuDQoNClRoZSBjb3JyZWxhdGlvbiBhbmFseXNpcyByZXZlYWxlZCBhIG5lZ2F0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIG92ZXJhbGwgcHJpbWluZyBlZmZlY3QgYW5kIHN5bXB0b20gc2V2ZXJpdHkgaW4gcGF0aWVudHMuIEEgdHJlbmQgZm9yIGEgc2ltaWxhciByZWxhdGlvbiB3YXMgb2JzZXJ2ZWQgZm9yIHRyYWl0IGFueGlldHkuIA0KPGJyPjxicj48YnI+DQoNCiMjIEFuYWx5c2lzIG9mIEFjY3VyYWN5IHsudGFic2V0fQ0KKioqDQoNCldlIHBlcmZvcm1lZCBhIGJpbm9taWFsIGdlbmVyYWxpemVkIGxpbmVhciBtaXhlZCBtb2RlbCAoR0xNTSkgb24gc2luZ2xlLXRyaWFsIGRhdGEuIFdvcmQgY2F0ZWdvcml6YXRpb24gYWNjdXJhY3kgd2FzIG1vZGVsZWQgdXNpbmcgdHlwZSBvZiB0aGUgcHJlY2VkaW5nIGdvL25vLWdvIHJlc3BvbnNlIChzbG93IGhpdCwgZmFzdCBoaXQsIGZhbHNlIGFsYXJtLCBpbmhpYml0ZWQgcmVzcG9uc2UpLCB3b3JkIHZhbGVuY2UsIGFuZCBncm91cCBhcyBmaXhlZCBlZmZlY3RzLiANCg0KV2UgdXNlZCBzbGlkaW5nIGRpZmZlcmVuY2UgY29udHJhc3RzIGZvciBjYXRlZ29yaWNhbCBmaXhlZCBlZmZlY3RzIGFuZCBzdGFydGVkIHdpdGggdGhlIG1heGltYWwgcmFuZG9tLWVmZmVjdHMgc3RydWN0dXJlIGZvciBlYWNoIG1vZGVsLiBJbiBjYXNlIG9mIG5vbi1jb252ZXJnZW5jZSwgcmFuZG9tIGVmZmVjdHMgd2VyZSBzcGVjaWZpZWQgYXMgdW5jb3JyZWxhdGVkLiBVc2luZyBwcmluY2lwYWwgY29tcG9uZW50IGFuYWx5c2lzLCB3ZSBpZGVudGlmaWVkIHJhbmRvbSBlZmZlY3RzIGV4cGxhaW5pbmcgemVybyB2YXJpYW5jZSBhbmQgcmVtb3ZlZCB0aGVzZSwgYXMgcmVjb21tZW5kZWQgYnkgQmF0ZXMsIEtsaWVnbCwgZXQgYWwuICgyMDE1KS4gDQo8YnI+PGJyPg0KDQojIyMgR0xNTQ0KDQo8IS0tIENvbnRyYXN0IGNvZGluZyAtLT4NCg0KYGBge3IgZ2xtbS1hY2N1cmFjeS1jb250cmFzdC1jb2Rpbmd9DQoNCiMgRGVmaW5lIGNvbnRyYXN0cyAoc2xpZGluZyBkaWZmZXJlbmNlIGNvbnRyYXN0cyA9IGVmZmVjdCBjb2RpbmcgZm9yIGZhY3RvcnMgd2l0aCAyIGxldmVscykNCmNvbnRyYXN0cyhzaW5nbGVfdHJpYWxfZGF0YV9hY2MkZ25nX3Jlc3BvbnNlX3R5cGUpIDwtIGNvbnRyLnNkaWYoNCkNCmNvbnRyYXN0cyhzaW5nbGVfdHJpYWxfZGF0YV9hY2Mkd29yZF92YWxlbmNlKSAgICAgIDwtIGNvbnRyLnNkaWYoMikNCmNvbnRyYXN0cyhzaW5nbGVfdHJpYWxfZGF0YV9hY2MkZ3JvdXApICAgICAgICAgICAgIDwtIGNvbnRyLnNkaWYoMikNCg0KDQojIEFkZCBjb250cmFzdHMgYXMgbnVtZXJpY2FsIGNvdmFyaWF0ZXMgdmlhIG1vZGVsIG1hdHJpeCoNCm1vZGVsX21hdHJpeF8yIDwtIG1vZGVsLm1hdHJpeCh+IGduZ19yZXNwb25zZV90eXBlICogd29yZF92YWxlbmNlICogZ3JvdXAsIHNpbmdsZV90cmlhbF9kYXRhX2FjYykNCg0KDQojIEF0dGFjaCB0aGUgbW9kZWwgbWF0cml4ICgxNiBjb2x1bW5zKSB0byB0aGUgZGF0YWZyYW1lDQpzaW5nbGVfdHJpYWxfZGF0YV9hY2NbLCAobmNvbChzaW5nbGVfdHJpYWxfZGF0YV9hY2MpICsgMSk6KG5jb2woc2luZ2xlX3RyaWFsX2RhdGFfYWNjKSArIDE2KV0gPC0gbW9kZWxfbWF0cml4XzINCg0KDQojIEFzc2lnbiBkZXNjcmlwdGl2ZSBuYW1lcyB0byB0aGUgY29udHJhc3RzDQpuYW1lcyhzaW5nbGVfdHJpYWxfZGF0YV9hY2MpWyhuY29sKHNpbmdsZV90cmlhbF9kYXRhX2FjYykgLSAxNSk6bmNvbChzaW5nbGVfdHJpYWxfZGF0YV9hY2MpXSA8LSBjKA0KICAiR3JhbmQgTWVhbiIsICJGSF9TSCIsICJGQV9GSCIsICJJUl9GQSIsICJwb3NfbmVnIiwgIk9DRF9IQyIsICJGSF9TSDpwb3NfbmVnIiwgIkZBX0ZIOnBvc19uZWciLA0KICAiSVJfRkE6cG9zX25lZyIsICJGSF9TSDpPQ0RfSEMiLCAiRkFfRkg6T0NEX0hDIiwgIklSX0ZBOk9DRF9IQyIsICJwb3NfbmVnOk9DRF9IQyIsDQogICJGSF9TSDpwb3NfbmVnOk9DRF9IQyIsICJGQV9GSDpwb3NfbmVnOk9DRF9IQyIsICJJUl9GQTpwb3NfbmVnOk9DRF9IQyIpDQoNCg0KIyAqTm90ZTogRm9yIHRoZSByYW5kb20gZWZmZWN0cywgd2UgbmVlZGVkIHRvIGVudGVyIHRoZSBzZXBhcmF0ZSByYW5kb20gZWZmZWN0IHRlcm1zIGluIHRoZSBtb2RlbHMgdG8gZW5hYmxlDQojIGRvdWJsZS1iYXIgbm90YXRpb24gKHx8KS4gVGhpcyBhbGxvd3MgZml0dGluZyBhIG1vZGVsIHRoYXQgc2V0cyBjb3JyZWxhdGlvbnMgb2YgdGhlIHJhbmRvbSB0ZXJtcyB0byB6ZXJvLg0KYGBgDQoNCjwhLS0gTW9kZWwgc3BlY2lmaWNhdGlvbiAtLT4NCg0KYGBge3IgZ2xtbS1hY2N1cmFjeS1tb2RlbC1zcGVjaWZpY2F0aW9uLCBldmFsID0gRkFMU0V9DQoNCiMgUnVuIG1vZGVsIHdpdGggbWF4aW1hbCByYW5kb20tZWZmZWN0cyBzdHJ1Y3R1cmUNCkdMTU1fYWNjX21heCA8LSBnbG1lcih3b3JkX2FjY3VyYWN5X251bWVyaWMgfiBnbmdfcmVzcG9uc2VfdHlwZSAqIHdvcmRfdmFsZW5jZSAqIGdyb3VwICsNCiAgKDEgKyBGSF9TSCArIEZBX0ZIICsgSVJfRkEgKyBwb3NfbmVnICsgRkhfU0g6cG9zX25lZyArIEZBX0ZIOnBvc19uZWcgKyBJUl9GQTpwb3NfbmVnIHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGSF9TSCArIEZBX0ZIICsgSVJfRkEgKyBPQ0RfSEMgKyBGSF9TSDpPQ0RfSEMgKyBGQV9GSDpPQ0RfSEMgKyBJUl9GQTpPQ0RfSEMgfCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX2FjYywNCiAgZmFtaWx5ID0gYmlub21pYWwsDQogIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0DQpzdW1tYXJ5KEdMTU1fYWNjX21heCkgICAgIyBNb2RlbCBkb2VzIG5vdCBjb252ZXJnZQ0KaXNTaW5ndWxhcihHTE1NX2FjY19tYXgpICMgU2luZ3VsYXIgZml0DQoNCg0KIyBSdW4gemVyby1jb3JyZWxhdGlvbiBwYXJhbWV0ZXIgbW9kZWwgYnkgdXNpbmcgfHwgc3ludGF4IHRvIHJlZHVjZSBtb2RlbCBjb21wbGV4aXR5DQpHTE1NX2FjY19yZWQxIDwtIGdsbWVyKHdvcmRfYWNjdXJhY3lfbnVtZXJpYyB+IGduZ19yZXNwb25zZV90eXBlICogd29yZF92YWxlbmNlICogZ3JvdXAgKw0KICAoMSArIEZIX1NIICsgRkFfRkggKyBJUl9GQSArIHBvc19uZWcgKyBGSF9TSDpwb3NfbmVnICsgRkFfRkg6cG9zX25lZyArIElSX0ZBOnBvc19uZWcgfHwgcGFydGljaXBhbnRfaWQpICsNCiAgKDEgKyBGSF9TSCArIEZBX0ZIICsgSVJfRkEgKyBPQ0RfSEMgKyBGSF9TSDpPQ0RfSEMgKyBGQV9GSDpPQ0RfSEMgKyBJUl9GQTpPQ0RfSEMgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9hY2MsDQogIGZhbWlseSA9IGJpbm9taWFsLA0KICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQpzdW1tYXJ5KEdMTU1fYWNjX3JlZDEpICAgICAgICAjIE1vZGVsIGRvZXMgY29udmVyZ2UNCmlzU2luZ3VsYXIoR0xNTV9hY2NfcmVkMSkgICAgICMgU2luZ3VsYXIgZml0DQpzdW1tYXJ5KHJlUENBKEdMTU1fYWNjX3JlZDEpKSAjIEZvciB3b3JkcyB0aGVyZSBpcyAxIHRlcm0sIGZvciBwYXJ0aWNpcGFudHMgMiB0ZXJtcyB0aGF0IGRvIG5vdCBleHBsYWluIHZhcmlhbmNlICg8IDAuNSUpDQpwcmludChWYXJDb3JyKEdMTU1fYWNjX3JlZDEpLCBjb21wID0gIlZhcmlhbmNlIikgIyBJdCBpcyBGSF9TSDpPQ0RfSEMgZm9yIHdvcmRzIGFuZCBGSF9TSCwgRkhfU0g6cG9zX25lZyBmb3IgcGFydGljaXBhbnRzDQpgYGANCg0KPCEtLSBGaW5hbCBtb2RlbCAtLT4NCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSAzIGluIHRoZSBtYW51c2NyaXB0Lg0KDQpgYGB7ciBnbG1tLWFjY3VyYWN5LWZpbmFsLW1vZGVsLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWR9DQoNCiMgUnVuIGZpbmFsIG1vZGVsIHdpdGhvdXQgcmFuZG9tIHRlcm1zIGV4cGxhaW5pbmcgemVybyB2YXJpYW5jZQ0KR0xNTV9hY2NfZmluYWwgPC0gZ2xtZXIod29yZF9hY2N1cmFjeV9udW1lcmljIH4gZ25nX3Jlc3BvbnNlX3R5cGUgKiB3b3JkX3ZhbGVuY2UgKiBncm91cCArDQogICgxICsgRkFfRkggKyBJUl9GQSArIHBvc19uZWcgKyBGQV9GSDpwb3NfbmVnICsgSVJfRkE6cG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIEZIX1NIICsgRkFfRkggKyBJUl9GQSArIE9DRF9IQyArIEZBX0ZIOk9DRF9IQyArIElSX0ZBOk9DRF9IQyB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX2FjYywNCiAgZmFtaWx5ID0gYmlub21pYWwsDQogIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShHTE1NX2FjY19maW5hbCkgICAgICAgICMgTW9kZWwgZG9lcyBjb252ZXJnZQ0KIyBpc1Npbmd1bGFyKEdMTU1fYWNjX2ZpbmFsKSAgICAgIyBObyBzaW5ndWxhciBmaXQNCiMgc3VtbWFyeShyZVBDQShHTE1NX2FjY19maW5hbCkpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIERpc3BsYXkgcmVzdWx0cyAoZml4ZWQgZWZmZWN0cykNCnRhYl9tb2RlbChHTE1NX2FjY19maW5hbCwNCiAgZHYubGFiZWxzID0gIkFjY3VyYWN5IiwgcHJlZC5sYWJlbHMgPSBsYWJlbHMsIHNob3cuc3RhdCA9IFRSVUUsIHNob3cuaWNjID0gRkFMU0UsIHNob3cucjIgPSBGQUxTRSwNCiAgc2hvdy5yZS52YXIgPSBGQUxTRSwgc2hvdy5uZ3JvdXBzID0gRkFMU0UsIG1pbnVzLnNpZ24gPSAiLSIsIHN0cmluZy5wcmVkID0gIkZpeGVkIGVmZmVjdHMiLA0KICBzdHJpbmcuZXN0ID0gIk9kZHMgcmF0aW8iLCBzdHJpbmcuc3RhdCA9ICJ6Iiwgc3RyaW5nLmNpID0gIjk1ICUgQ0kiLCB3cmFwLmxhYmVscyA9IDgwLA0KICB0aXRsZSA9ICJHTE1NIFJlc3VsdHMgZm9yIFdvcmQgQ2F0ZWdvcml6YXRpb24gQWNjdXJhY3kiKQ0KDQoNCiMgRGlzcGxheSByYW5kb20gZWZmZWN0cw0KcHJpbnQoIlJhbmRvbSBlZmZlY3RzOiIpDQpwcmludChWYXJDb3JyKEdMTU1fYWNjX2ZpbmFsKSwgZGlnaXRzID0gMSwgY29tcCA9ICJTdGQuRGV2LiIpDQoNCg0KIyBTYXZlIG1vZGVsIG91dHB1dCBmb3IgcGxvdA0Kc2F2ZVJEUyhHTE1NX2FjY19maW5hbCwgZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL0dMTU1fYWNjX2ZpbmFsLnJkcyIpDQpgYGANCjxicj4NCkFuYWx5c2lzIG9mIGNhdGVnb3JpemF0aW9uIGFjY3VyYWN5IHJldmVhbGVkIG1haW4gZWZmZWN0cyBvZiByZXNwb25zZSB0eXBlIGFuZCB3b3JkIHZhbGVuY2UsIHdoaWNoIHdlcmUgcXVhbGlmaWVkIGJ5IHNpZ25pZmljYW50IGludGVyYWN0aW9ucyBiZXR3ZWVuIHJlc3BvbnNlIHR5cGUgYW5kIHdvcmQgdmFsZW5jZSBhbmQgYmV0d2VlbiBncm91cCBhbmQgd29yZCB2YWxlbmNlLg0KPGJyPjxicj48YnI+DQoNCiMjIyBQYWlyd2lzZSBDb21wYXJpc29ucw0KDQpTaWduaWZpY2FudCBhbmQgaHlwb3RoZXNpcy1yZWxldmFudCBpbnRlcmFjdGlvbnMgd2VyZSBmb2xsb3dlZCB1cCB3aXRoIHBvc3QgaG9jIGNvbXBhcmlzb25zIHVzaW5nIGZhbHNlIGRpc2NvdmVyeSByYXRlIGFkanVzdG1lbnQuIDxicj48YnI+DQpUaGVzZSB0YWJsZXMgY29ycmVzcG9uZCB0byBUYWJsZSA0IGluIHRoZSBtYW51c2NyaXB0LiAgDQoNCmBgYHtyIGdsbW0tYWNjdXJhY3ktcGFpcndpc2UtY29tcGFyaXNvbnN9DQoNCiMjIyMgMSkgR2V0IGNvbnRyYXN0cyBmb3IgZWZmZWN0IG9mIHdvcmQgdmFsZW5jZSB3aXRoaW4gZWFjaCByZXNwb25zZSB0eXBlDQplbW1zMSA8LSBlbW1lYW5zKEdMTU1fYWNjX2ZpbmFsLCB+IHdvcmRfdmFsZW5jZSB8IGduZ19yZXNwb25zZV90eXBlKQ0KY29udHJhc3RfMSA8LSBjb250cmFzdChlbW1zMSwgaW50ZXJhY3Rpb24gPSAicmV2cGFpcndpc2UiKQ0KDQoNCiMgR2V0IENJcyBvZiBlc3RpbWF0ZXMNCmNvbnRyYXN0XzFfY2kgPC0gY29uZmludChjb250cmFzdF8xLCBhZGp1c3QgPSAibm9uZSIsIGxldmVsID0gMC45NSlbYygiYXN5bXAuTENMIiwgImFzeW1wLlVDTCIpXQ0KDQoNCiMgTWVyZ2UgY29udHJhc3QgYW5kIENJIGluIG9uZSB0YWJsZQ0KZm9sbG93X3VwXzEgPC0gY2JpbmQoY29udHJhc3RfMSwgY29udHJhc3RfMV9jaSkNCg0KDQojIEFkZCBhZGp1c3RlZCBwIHZhbHVlcw0KZm9sbG93X3VwXzEkcC52YWx1ZV9hZGpfZmRyIDwtIHAuYWRqdXN0KGZvbGxvd191cF8xJHAudmFsdWUsIG1ldGhvZCA9ICJmZHIiKQ0KDQoNCiMgSGVyZSwgZXN0aW1hdGVzIGFuZCBDSSBhcmUgbG9nIG9kZHMgcmF0aW9zLCBub3QgbGlrZSBpbiB0aGUgb3RoZXIgdGFibGVzIG9kZHMgcmF0aW9zLg0KIyBUbyBnZXQgdGhlIG9kZHMgcmF0aW9zIGZyb20gdGhlIGxvZyBvZGRzIHJhdGlvcywgd2UgaGF2ZSB0byB0cmFuc2Zvcm0gdGhlIHZhbHVlcyBieSB1c2luZyB0aGUgZXhwKCkgZnVuY3Rpb24NCmZvbGxvd191cF8xJGVzdGltYXRlICA8LSBleHAoZm9sbG93X3VwXzEkZXN0aW1hdGUpDQpmb2xsb3dfdXBfMSRhc3ltcC5MQ0wgPC0gZXhwKGZvbGxvd191cF8xJGFzeW1wLkxDTCkNCmZvbGxvd191cF8xJGFzeW1wLlVDTCA8LSBleHAoZm9sbG93X3VwXzEkYXN5bXAuVUNMKQ0KDQoNCiMgRGlzcGxheSB0YWJsZQ0KbXlfdGFibGVfdGVtcGxhdGUoZm9sbG93X3VwXzFbLCBjKDIsIDEsIDMsIDgsIDksIDYsIDcsIDEwKV0sDQogIGNhcHRpb24gPSAiRm9sbG93LXVwIGVmZmVjdCBvZiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gcmVzcG9uc2UgdHlwZSIsDQogIGRpZ2l0cyA9IGMoMCwgMCwgMiwgMiwgMiwgMiwgMywgMykpDQoNCg0KIyMjIyAyKSBHZXQgY29udHJhc3RzIGZvciByZXNvbHZpbmcgaW50ZXJhY3Rpb24gZ3JvdXAgKiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gcmVzcG9uc2UgdHlwZQ0KZW1tczIgPC0gZW1tZWFucyhHTE1NX2FjY19maW5hbCwgfiB3b3JkX3ZhbGVuY2UgKiBncm91cCB8IGduZ19yZXNwb25zZV90eXBlKQ0KY29udHJhc3RfMiA8LSBjb250cmFzdChlbW1zMiwgaW50ZXJhY3Rpb24gPSAicmV2cGFpcndpc2UiKQ0KDQoNCiMgR2V0IENJcyBvZiBlc3RpbWF0ZXMNCmNvbnRyYXN0XzJfY2kgPC0gY29uZmludChjb250cmFzdF8yLCBhZGp1c3QgPSAibm9uZSIsIGxldmVsID0gMC45NSlbYygiYXN5bXAuTENMIiwgImFzeW1wLlVDTCIpXQ0KDQoNCiMgUHV0IGNvbnRyYXN0IGFuZCBDSSBpbiBvbmUgdGFibGUgKG9ubHkgZm9yIEZIIGFuZCBGQSkNCmZvbGxvd191cF8yIDwtIGNiaW5kKGNvbnRyYXN0XzJbYygyLCAzKSwgXSwgY29udHJhc3RfMl9jaVtjKDIsIDMpLCBdKQ0KDQoNCiMgR2V0IGFkanVzdGVkIHAgdmFsdWVzDQpmb2xsb3dfdXBfMiRwLnZhbHVlX2Fkal9mZHIgPC0gcC5hZGp1c3QoZm9sbG93X3VwXzIkcC52YWx1ZSwgbWV0aG9kID0gImZkciIpDQoNCg0KIyBIZXJlLCBlc3RpbWF0ZXMgYW5kIENJIGFyZSBsb2cgb2RkcyByYXRpb3MsIG5vdCBsaWtlIGluIHRoZSBvdGhlciB0YWJsZXMgb2RkcyByYXRpb3MuDQojIFRvIGdldCB0aGUgb2RkcyByYXRpb3MgZnJvbSB0aGUgbG9nIG9kZHMgcmF0aW9zLCB3ZSBoYXZlIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWVzIGJ5IHVzaW5nIHRoZSBleHAoKSBmdW5jdGlvbg0KZm9sbG93X3VwXzIkZXN0aW1hdGUgIDwtIGV4cChmb2xsb3dfdXBfMiRlc3RpbWF0ZSkNCmZvbGxvd191cF8yJGFzeW1wLkxDTCA8LSBleHAoZm9sbG93X3VwXzIkYXN5bXAuTENMKQ0KZm9sbG93X3VwXzIkYXN5bXAuVUNMIDwtIGV4cChmb2xsb3dfdXBfMiRhc3ltcC5VQ0wpDQoNCg0KIyBEaXNwbGF5IHRhYmxlDQpteV90YWJsZV90ZW1wbGF0ZShmb2xsb3dfdXBfMlssIGMoMywgMSwgMiwgNCwgOSwgMTAsIDcsIDgsIDExKV0sDQogIGNhcHRpb24gPSAiRm9sbG93LXVwIGludGVyYWN0aW9uIGdyb3VwICogdmFsZW5jZSBuZXN0ZWQgd2l0aGluIHJlc3BvbnNlIHR5cGUiLA0KICBkaWdpdHMgPSBjKDAsIDAsIDAsIDIsIDIsIDIsIDIsIDMsIDMpKQ0KDQoNCiMjIyMgMykgR2V0IGNvbnRyYXN0cyBmb3IgcmVzb2x2aW5nIGVmZmVjdCBvZiB2YWxlbmNlIG5lc3RlZCB3aXRoaW4gZ3JvdXAgYW5kIHJlc3BvbnNlIHR5cGUNCmVtbXMzIDwtIGVtbWVhbnMoR0xNTV9hY2NfZmluYWwsIH4gd29yZF92YWxlbmNlIHwgZ25nX3Jlc3BvbnNlX3R5cGUgKiBncm91cCkNCmNvbnRyYXN0XzMgPC0gY29udHJhc3QoZW1tczMsIGludGVyYWN0aW9uID0gInJldnBhaXJ3aXNlIikNCg0KDQojIEdldCBDSXMgb2YgZXN0aW1hdGVzDQpjb250cmFzdF8zX2NpIDwtIGNvbmZpbnQoY29udHJhc3RfMywgYWRqdXN0ID0gIm5vbmUiLCBsZXZlbCA9IDAuOTUpW2MoImFzeW1wLkxDTCIsICJhc3ltcC5VQ0wiKV0NCg0KDQojIFB1dCBjb250cmFzdCBhbmQgQ0kgaW4gb25lIHRhYmxlIChvbmx5IGZvciBGSCBhbmQgRkEpDQpmb2xsb3dfdXBfMyA8LSBjYmluZChjb250cmFzdF8zW2MoMiwgMywgNiwgNyksIF0sIGNvbnRyYXN0XzNfY2lbYygyLCAzLCA2LCA3KSwgXSkNCg0KDQojIEdldCBhZGp1c3RlZCBwIHZhbHVlcw0KZm9sbG93X3VwXzMkcC52YWx1ZV9hZGpfZmRyIDwtIHAuYWRqdXN0KGZvbGxvd191cF8zJHAudmFsdWUsIG1ldGhvZCA9ICJmZHIiKQ0KDQoNCiMgSGVyZSwgZXN0aW1hdGVzIGFuZCBDSSBhcmUgbG9nIG9kZHMgcmF0aW9zLCBub3QgbGlrZSBpbiB0aGUgb3RoZXIgdGFibGVzIG9kZHMgcmF0aW9zLg0KIyBUbyBnZXQgdGhlIG9kZHMgcmF0aW9zIGZyb20gdGhlIGxvZyBvZGRzIHJhdGlvcywgd2UgaGF2ZSB0byB0cmFuc2Zvcm0gdGhlIHZhbHVlcyBieSB1c2luZyB0aGUgZXhwKCkgZnVuY3Rpb24NCmZvbGxvd191cF8zJGVzdGltYXRlICA8LSBleHAoZm9sbG93X3VwXzMkZXN0aW1hdGUpDQpmb2xsb3dfdXBfMyRhc3ltcC5MQ0wgPC0gZXhwKGZvbGxvd191cF8zJGFzeW1wLkxDTCkNCmZvbGxvd191cF8zJGFzeW1wLlVDTCA8LSBleHAoZm9sbG93X3VwXzMkYXN5bXAuVUNMKQ0KDQoNCiMgRGlzcGxheSB0YWJsZQ0KbXlfdGFibGVfdGVtcGxhdGUoZm9sbG93X3VwXzNbYygxLCAzLCAyLCA0KSwgYygyLCAzLCAxLCA0LCA5LCAxMCwgNywgOCwgMTEpXSwNCiAgY2FwdGlvbiA9ICJGb2xsb3ctdXAgZWZmZWN0IG9mIHZhbGVuY2UgbmVzdGVkIHdpdGhpbiBncm91cCBhbmQgcmVzcG9uc2UgdHlwZSIsDQogIGRpZ2l0cyA9IGMoMCwgMCwgMCwgMiwgMiwgMiwgMiwgMywgMykpDQpgYGANCjxicj4NClBvc3QgaG9jIGNvbXBhcmlzb25zIGluZGljYXRlZCB0aGF0IGFmdGVyIGZhbHNlIGFsYXJtcywgcGFydGljaXBhbnRzIGFjcm9zcyBhbmQgd2l0aGluIGdyb3VwcyBjYXRlZ29yaXplZCBuZWdhdGl2ZSB3b3JkcyBtb3JlIGFjY3VyYXRlbHkgdGhhbiBwb3NpdGl2ZSB3b3Jkcy4gVGhpcyByZXNwb25zZSBmYWNpbGl0YXRpb24gdG8gbmVnYXRpdmUgcmVsYXRpdmUgdG8gcG9zaXRpdmUgd29yZHMgYWZ0ZXIgZmFsc2UgYWxhcm1zIHdhcyBzbWFsbGVyIGluIHBhdGllbnRzIHdpdGggT0NEIGNvbXBhcmVkIHRvIGNvbnRyb2wgcGFydGljaXBhbnRzIGF0IHRyZW5kIGxldmVsLiANCjxicj48YnI+PGJyPg0KDQojIyBDb250cm9sIEFuYWx5c2lzIHsudGFic2V0fQ0KKioqDQoNClRoZSBzdHVkeSB3YXMgcGFydCBvZiBhIHByb2plY3QgY29tcHJpc2luZyBvbmUgc2Vzc2lvbiB3aXRoIGFjdGl2ZSBhbmQgb25lIHdpdGggcGxhY2VibyB0cmFuc2NyYW5pYWwgZGlyZWN0IGN1cnJlbnQgc3RpbXVsYXRpb24gaW4gY291bnRlcmJhbGFuY2VkIG9yZGVyLCB3aGljaCBwcmVjZWRlZCB0YXNrIHBlcmZvcm1hbmNlLiBJbiB0aGUgcHJlc2VudCBzdHVkeSwgZGF0YSBmcm9tIHRoZSBwbGFjZWJvIHNlc3Npb24gd2VyZSBhbmFseXplZC4gVGh1cywgbWVhc3VyZW1lbnRzIG9mIHBhcnRpY2lwYW50cyB3aG8gY29tcGxldGVkIHRoZSB0YXNrIGZvciB0aGUgZmlyc3Qgb3Igc2Vjb25kIHRpbWUgd2VyZSBpbmNsdWRlZC4gSW1wb3J0YW50bHksIGNvbnRyb2wgYW5hbHlzZXMgaW5kaWNhdGVkIHRoYXQgdGFzayBmYW1pbGlhcml0eSAoaS5lLiwgc2Vzc2lvbiBudW1iZXIpIGRpZCBub3QgaW1wYWN0IGh5cG90aGVzaXMtcmVsZXZhbnQgcmVzdWx0cy4NCjxicj48YnI+DQoNCiMjIyBSVDogU2Vzc2lvbiBhcyBDb3YuIA0KDQpUaGlzIHRhYmxlIGNvcnJlc3BvbmRzIHRvIFRhYmxlIFMxMCBpbiB0aGUgc3VwcGxlbWVudGFsIG1hdGVyaWFsLiANCg0KYGBge3IgbG1tLXJ0LXNlc3Npb24sIGNhY2hlID0ga25pdHJfY2FjaGVfZW5hYmxlZH0NCg0KIyBEZWZpbmUgY29udHJhc3RzIChzbGlkaW5nIGRpZmZlcmVuY2UgY29udHJhc3RzID0gZWZmZWN0IGNvZGluZyBmb3IgZmFjdG9ycyB3aXRoIDIgbGV2ZWxzKQ0KY29udHJhc3RzKHNpbmdsZV90cmlhbF9kYXRhX3J0JHNlc3Npb24pIDwtIGNvbnRyLnNkaWYoMikNCg0KDQojIFJ1biByZWR1Y2VkIGZpbmFsIG1vZGVsICh3ZSBnZXQgc2FtZSBtb2RlbCB3aGVuIHN0YXJ0aW5nIHdpdGggYWxsIHJhbmRvbSBlZmZlY3RzICYgY29ycmVsYXRpb24gcGFyYW1ldGVycykNCkxNTV9ydF9zZXNzaW9uIDwtIGxtZXIod29yZF9ydF9sb2cgfiBnbmdfcmVzcG9uc2VfdHlwZSAqIHdvcmRfdmFsZW5jZSAqIGdyb3VwICogc2Vzc2lvbiArDQogICgxICsgRkhfU0ggKyBGQV9GSCArIElSX0ZBICsgcG9zX25lZyArIEZIX1NIOnBvc19uZWcgKyBGQV9GSDpwb3NfbmVnICsgSVJfRkE6cG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIEZIX1NIICsgRkFfRkggKyBPQ0RfSEMgKyBJUl9GQTpPQ0RfSEMgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydCwNCiAgUkVNTCA9IFRSVUUsDQogIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIikpDQoNCg0KIyBDaGVjayBtb2RlbCBvdXRwdXQgYW5kIFBDQSBvZiByYW5kb20tZWZmZWN0cyB2YXJpYW5jZS1jb3ZhcmlhbmNlIGVzdGltYXRlcw0KIyBzdW1tYXJ5KExNTV9ydF9zZXNzaW9uKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoTE1NX3J0X3Nlc3Npb24pICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9zZXNzaW9uKSkgIyBBbGwgdGVybXMgZXhwbGFpbiB2YXJpYW5jZQ0KDQoNCiMgRGlzcGxheSByZXN1bHRzIChmaXhlZCBlZmZlY3RzKQ0KdGFiX21vZGVsKExNTV9ydF9zZXNzaW9uLA0KICBkdi5sYWJlbHMgPSAiUlQiLCBwcmVkLmxhYmVscyA9IGxhYmVscywgc2hvdy5zdGF0ID0gVFJVRSwgc2hvdy5pY2MgPSBGQUxTRSwgc2hvdy5yMiA9IEZBTFNFLA0KICBzaG93LnJlLnZhciA9IEZBTFNFLCBzaG93Lm5ncm91cHMgPSBGQUxTRSwgbWludXMuc2lnbiA9ICItIiwgc3RyaW5nLnByZWQgPSAiRml4ZWQgZWZmZWN0cyIsDQogIHN0cmluZy5lc3QgPSAiYiIsIHN0cmluZy5zdGF0ID0gInQiLCBzdHJpbmcuY2kgPSAiOTUgJSBDSSIsIHAudmFsID0gInNhdHRlcnRod2FpdGUiLCB3cmFwLmxhYmVscyA9IDgwLA0KICB0aXRsZSA9ICJMTU0gUmVzdWx0cyBmb3IgV29yZCBDYXRlZ29yaXphdGlvbiBSVCBXaXRoIFNlc3Npb24gTnVtYmVyIGFzIENvdmFyaWF0ZSIpDQpgYGANCjxicj48YnI+PGJyPg0KDQojIyMgUlQgd2l0aCBFUk4gJiBDUk46IFNlc3Npb24gYXMgQ292LiANCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSBTMTEgaW4gdGhlIHN1cHBsZW1lbnRhbCBtYXRlcmlhbC4gDQoNCmBgYCB7ciBsbW0tcnQtZXJuLWNybi1zZXNzaW9ufQ0KDQojIERlZmluZSBjb250cmFzdHMgKHNsaWRpbmcgZGlmZmVyZW5jZSBjb250cmFzdHMgPSBlZmZlY3QgY29kaW5nIGZvciBmYWN0b3JzIHdpdGggMiBsZXZlbHMpDQpjb250cmFzdHMoc2luZ2xlX3RyaWFsX2RhdGFfcnQkc2Vzc2lvbikgPC0gY29udHIuc2RpZigyKQ0KDQoNCiMgUnVuIHJlZHVjZWQgZmluYWwgbW9kZWwgb24gRVJOICh3ZSBnZXQgc2FtZSBtb2RlbCB3aGVuIHN0YXJ0aW5nIHdpdGggYWxsIHJhbmRvbSBlZmZlY3RzICYgY29ycmVsYXRpb24gcGFyYW1ldGVycykNCkxNTV9ydF9lcm5fc2Vzc2lvbiA8LSBsbWVyKHdvcmRfcnRfbG9nIH4gd29yZF92YWxlbmNlICogZ3JvdXAgKiBNRk5fc3RhbmRhcmRpemVkICogc2Vzc2lvbiArDQogICgxICsgcG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIE9DRF9IQyArIE1GTl9zdGFuZGFyZGl6ZWQgfHwgd29yZCksDQogIGRhdGEgPSBzaW5nbGVfdHJpYWxfZGF0YV9ydFtzaW5nbGVfdHJpYWxfZGF0YV9ydCRnbmdfcmVzcG9uc2VfdHlwZSA9PSAiRkEiLCBdLA0KICBSRU1MID0gVFJVRSwNCiAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiKSkNCg0KDQojIENoZWNrIG1vZGVsIG91dHB1dCBhbmQgUENBIG9mIHJhbmRvbS1lZmZlY3RzIHZhcmlhbmNlLWNvdmFyaWFuY2UgZXN0aW1hdGVzDQojIHN1bW1hcnkoTE1NX3J0X2Vybl9zZXNzaW9uKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoTE1NX3J0X2Vybl9zZXNzaW9uKSAgICAgIyBObyBzaW5ndWxhciBmaXQNCiMgc3VtbWFyeShyZVBDQShMTU1fcnRfZXJuX3Nlc3Npb24pKSAjIEFsbCB0ZXJtcyBleHBsYWluIHZhcmlhbmNlDQoNCg0KIyBSdW4gcmVkdWNlZCBmaW5hbCBtb2RlbCBvbiBDUk4gKHdlIGdldCBzYW1lIG1vZGVsIHdoZW4gc3RhcnRpbmcgd2l0aCBhbGwgcmFuZG9tIGVmZmVjdHMgJiBjb3JyZWxhdGlvbiBwYXJhbWV0ZXJzKQ0KTE1NX3J0X2Nybl9zZXNzaW9uIDwtIGxtZXIod29yZF9ydF9sb2cgfiB3b3JkX3ZhbGVuY2UgKiBncm91cCAqIE1GTl9zdGFuZGFyZGl6ZWQgKiBzZXNzaW9uICsNCiAgKDEgKyBwb3NfbmVnIHx8IHBhcnRpY2lwYW50X2lkKSArDQogICgxICsgTUZOX3N0YW5kYXJkaXplZCB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX3J0W3NpbmdsZV90cmlhbF9kYXRhX3J0JGduZ19yZXNwb25zZV90eXBlID09ICJGSCIsIF0sDQogIFJFTUwgPSBUUlVFLA0KICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShMTU1fcnRfY3JuX3Nlc3Npb24pICAgICAgICAjIE1vZGVsIGRvZXMgY29udmVyZ2UNCiMgaXNTaW5ndWxhcihMTU1fcnRfY3JuX3Nlc3Npb24pICAgICAjIE5vIHNpbmd1bGFyIGZpdA0KIyBzdW1tYXJ5KHJlUENBKExNTV9ydF9jcm5fc2Vzc2lvbikpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIERpc3BsYXkgcmVzdWx0cyAoZml4ZWQgZWZmZWN0cykNCnRhYl9tb2RlbChMTU1fcnRfZXJuX3Nlc3Npb24sIExNTV9ydF9jcm5fc2Vzc2lvbiwNCiAgZHYubGFiZWxzID0gYygiV2l0aCBFUk4gYXMgcHJlZGljdG9yIiwgIldpdGggQ1JOIGFzIHByZWRpY3RvciIpLCBwcmVkLmxhYmVscyA9IGxhYmVscywgc2hvdy5zdGF0ID0gVFJVRSwgDQogIHNob3cuaWNjID0gRkFMU0UsIHNob3cucjIgPSBGQUxTRSwgc2hvdy5yZS52YXIgPSBGQUxTRSwgc2hvdy5uZ3JvdXBzID0gRkFMU0UsIG1pbnVzLnNpZ24gPSAiLSIsIA0KICBzdHJpbmcucHJlZCA9ICJGaXhlZCBlZmZlY3RzIiwgc3RyaW5nLmVzdCA9ICJiIiwgc3RyaW5nLnN0YXQgPSAidCIsIHN0cmluZy5jaSA9ICI5NSAlIENJIiwgcC52YWwgPSAic2F0dGVydGh3YWl0ZSIsIA0KICB3cmFwLmxhYmVscyA9IDgwLCB0aXRsZSA9ICJMTU0gUmVzdWx0cyBmb3IgV29yZCBDYXRlZ29yaXphdGlvbiBSVCBXaXRoIEVSTiBhbmQgQ1JOIGFzIFByZWRpY3RvciBhbmQgU2Vzc2lvbiBOdW1iZXIgDQogIGFzIENvdmFyaWF0ZSIpDQpgYGANCjxicj48YnI+PGJyPg0KDQojIyMgQWNjdXJhY3k6IFNlc3Npb24gYXMgQ292LiANCg0KVGhpcyB0YWJsZSBjb3JyZXNwb25kcyB0byBUYWJsZSBTMTAgaW4gdGhlIHN1cHBsZW1lbnRhbCBtYXRlcmlhbC4NCg0KYGBge3IgZ2xtbS1hY2N1cmFjeS1zZXNzaW9uLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWR9DQoNCiMgRGVmaW5lIGNvbnRyYXN0cyAoc2xpZGluZyBkaWZmZXJlbmNlIGNvbnRyYXN0cyA9IGVmZmVjdCBjb2RpbmcgZm9yIGZhY3RvcnMgd2l0aCAyIGxldmVscykNCmNvbnRyYXN0cyhzaW5nbGVfdHJpYWxfZGF0YV9hY2Mkc2Vzc2lvbikgPC0gY29udHIuc2RpZigyKQ0KDQoNCiMgUnVuIHJlZHVjZWQgZmluYWwgbW9kZWwgKHdlIGdldCBzYW1lIG1vZGVsIHdoZW4gc3RhcnRpbmcgd2l0aCBhbGwgcmFuZG9tIGVmZmVjdHMgJiBjb3JyZWxhdGlvbiBwYXJhbWV0ZXJzKQ0KR0xNTV9hY2Nfc2Vzc2lvbiA8LSBnbG1lcih3b3JkX2FjY3VyYWN5X251bWVyaWMgfiBnbmdfcmVzcG9uc2VfdHlwZSAqIHdvcmRfdmFsZW5jZSAqIGdyb3VwICogc2Vzc2lvbiArDQogICgxICsgRkFfRkggKyBJUl9GQSArIHBvc19uZWcgKyBGQV9GSDpwb3NfbmVnICsgSVJfRkE6cG9zX25lZyB8fCBwYXJ0aWNpcGFudF9pZCkgKw0KICAoMSArIEZIX1NIICsgRkFfRkggKyBJUl9GQSArIE9DRF9IQyArIEZBX0ZIOk9DRF9IQyArIElSX0ZBOk9DRF9IQyB8fCB3b3JkKSwNCiAgZGF0YSA9IHNpbmdsZV90cmlhbF9kYXRhX2FjYywNCiAgZmFtaWx5ID0gYmlub21pYWwsDQogIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIpKQ0KDQoNCiMgQ2hlY2sgbW9kZWwgb3V0cHV0IGFuZCBQQ0Egb2YgcmFuZG9tLWVmZmVjdHMgdmFyaWFuY2UtY292YXJpYW5jZSBlc3RpbWF0ZXMNCiMgc3VtbWFyeShHTE1NX2FjY19zZXNzaW9uKSAgICAgICAgIyBNb2RlbCBkb2VzIGNvbnZlcmdlDQojIGlzU2luZ3VsYXIoR0xNTV9hY2Nfc2Vzc2lvbikgICAgICMgTm8gc2luZ3VsYXIgZml0DQojIHN1bW1hcnkocmVQQ0EoR0xNTV9hY2Nfc2Vzc2lvbikpICMgQWxsIHRlcm1zIGV4cGxhaW4gdmFyaWFuY2UNCg0KDQojIERpc3BsYXkgcmVzdWx0cyAoZml4ZWQgZWZmZWN0cykNCnRhYl9tb2RlbChHTE1NX2FjY19zZXNzaW9uLA0KICBkdi5sYWJlbHMgPSAiQWNjdXJhY3kiLCBwcmVkLmxhYmVscyA9IGxhYmVscywgc2hvdy5zdGF0ID0gVFJVRSwgc2hvdy5pY2MgPSBGQUxTRSwgc2hvdy5yMiA9IEZBTFNFLA0KICBzaG93LnJlLnZhciA9IEZBTFNFLCBzaG93Lm5ncm91cHMgPSBGQUxTRSwgbWludXMuc2lnbiA9ICItIiwgc3RyaW5nLnByZWQgPSAiRml4ZWQgZWZmZWN0cyIsDQogIHN0cmluZy5lc3QgPSAiT2RkcyByYXRpbyIsIHN0cmluZy5zdGF0ID0gInoiLCBzdHJpbmcuY2kgPSAiOTUgJSBDSSIsIHdyYXAubGFiZWxzID0gODAsDQogIHRpdGxlID0gIkdMTU0gUmVzdWx0cyBmb3IgV29yZCBDYXRlZ29yaXphdGlvbiBBY2N1cmFjeSBXaXRoIFNlc3Npb24gTnVtYmVyIGFzIENvdmFyaWF0ZSIpDQpgYGANCjxicj48YnI+PGJyPg0KDQojIyBSZWZlcmVuY2VzDQoqKioNCkJhdGVzLCBELiwgS2xpZWdsLCBSLiwgVmFzaXNodGgsIFMuLCAmIEJhYXllbiwgSC4gKDIwMTUpLiAqUGFyc2ltb25pb3VzIG1peGVkIG1vZGVscy4qIGFyWGl2LiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTUwNi4wNDk2N3YyIDxicj48YnI+DQpCb3gsIEcuIEUuLCAmIENveCwgRC4gUi4gKDE5NjQpLiBBbiBhbmFseXNpcyBvZiB0cmFuc2Zvcm1hdGlvbnMuICpKb3VybmFsIG9mIHRoZSBSb3lhbCBTdGF0aXN0aWNhbCBTb2NpZXR5OiBTZXJpZXMgQiAoTWV0aG9kb2xvZ2ljYWwpLCAyNiooMiksIDIxMeKAkzI0My4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4yNTE3LTYxNjEuMTk2NC50YjAwNTUzLnggPGJyPjxicj4NCk1vcmV5LCBSLiAoMjAwOCkuIENvbmZpZGVuY2UgaW50ZXJ2YWxzIGZyb20gbm9ybWFsaXplZCBkYXRhOiBBIGNvcnJlY3Rpb24gdG8gQ291c2luZWF1ICgyMDA1KS4gKlR1dG9yaWFscyBpbiBRdWFudGl0YXRpdmUgTWV0aG9kcyBmb3IgUHN5Y2hvbG9neSwgNCooMiksIDYx4oCTNjQuIGh0dHBzOi8vZG9pLm9yZy8xMC4yMDk4Mi90cW1wLjA0LjIucDA2MSANCjxicj48YnI+PGJyPg0KDQojIyBTZXNzaW9uIEluZm8NCioqKg0KYGBge3Igc2Vzc2lvbi1pbmZvfQ0KDQpzZXNzaW9uSW5mbygpDQpgYGANCg==