Data Preparation

In this pre-registered study, we collected data from 174 participant. After filtering these participants with three attention check measures, we obtained analyzable data from 166 participants.

Loading Packages

Before running this chunk, please load “Study 1a.csv” into the R environment.

# packages should be loaded in the following order to avoid function conflicts
options(scipen = 99) # turns off scientific notation
library(psych) # for describing data
library(effsize) # for mean difference effect sizes
library(sjstats) # for eta-squared effect sizes
library(correlation) # for cleaner correlation test output
library(rmcorr) # for repeated-measures correlation tests
library(cocor) # for comparing dependent correlation coefficients
library(tidyverse) # for data manipulation and plotting

Attention Check

Participants were instructed to select zero (i.e., the middle option in the 9-point scale) as their response for three measures that followed a modified scenario. If a participant failed to select “0” as their response for any of the three measures, they would be excluded from the analyses.

# Experimental task attention check variable
Study_1a$AttChecks <- rowSums(Study_1a[, c("AttnCheck1", "AttnCheck2", "AttnCheck3")], na.rm = T)

# The exclusion of any sum (within the variable "AttChecks") that did not result in a zero
Study_1a <- Study_1a %>% 
  filter(Study_1a$AttChecks == 0)

Variable Creation

The original design provided by Berman & Small required virtuosity, honorability, and respectability measures to be averaged across for all participants. Moreover, since the study had a between-subjects design, it included an overall “Virtuosity Average”. For this replication, the within-subjects design does not allow to have an overall average, so there will be a moral and a non-moral average for each participant. Additionally, there will be a virtuosity average for each vignette.


# Create a variable for virtuosity average in the moral condition
Study_1a$MoralAverage <- rowMeans(Study_1a[, c("AdulteryVirtuous1", "AdulteryHonorable2", "AdulteryRespectable3", "OfficeVirtuous1", "OfficeHonorable2", "OfficeRespectable3", "KidneyVirtuous1", "KidneyHonorable2", "KidneyRespectable3", "AdulteryVirtuous2", "AdulteryHonorable3", "AdulteryRespectable1", "OfficeVirtuous2", "OfficeHonorable3", "OfficeRespectable1", "KidneyVirtuous2", "KidneyHonorable3", "KidneyRespectable1", "AdulteryVirtuous3", "AdulteryHonorable1", "AdulteryRespectable2", "OfficeVirtuous3", "OfficeHonorable1", "OfficeRespectable2", "KidneyVirtuous3", "KidneyHonorable1", "KidneyRespectable2" )], na.rm = T)

# Create a variable for virtuosity average in the non-moral condition
Study_1a$NonmoralAverage <- rowMeans(Study_1a[, c("DessertVirtuous1", "DessertHonorable2", "DessertRespectable3", "GymVirtuous1", "GymHonorable2", "GymRespectable3", "SchoolworkVirtuous1", "SchoolworkHonorable2", "SchoolworkRespctable3", "DessertVirtuous2", "DessertHonorable3", "DessertRespectable1", "GymVirtuous2", "GymHonorable3", "GymRespectable1", "SchoolworkVirtuous2", "SchoolworkHonorable3", "SchoolworkRespectable1", "DessertVirtuous3", "DessertHonorable1", "DessertRespectable2", "GymVirtuous3", "GymHonorable1", "GymRespectable2", "SchoolworkVirtuous3", "SchoolworkHonorable1", "SchoolworkRespectable2")], na.rm = T)

# Create a variable for virtuosity average in the Office Supplies scenario
Study_1a$OfficeAverage <- rowMeans(Study_1a[, c("OfficeVirtuous1", "OfficeHonorable2", "OfficeRespectable3", "OfficeVirtuous2", "OfficeHonorable3", "OfficeRespectable1", "OfficeVirtuous3", "OfficeHonorable1", "OfficeRespectable2" )], na.rm = T)

# Create a variable for virtuosity average in the Adultery scenario
Study_1a$AdulteryAverage <- rowMeans(Study_1a[, c("AdulteryVirtuous1", "AdulteryHonorable2", "AdulteryRespectable3", "AdulteryVirtuous2", "AdulteryHonorable3", "AdulteryRespectable1", "AdulteryVirtuous3", "AdulteryHonorable1", "AdulteryRespectable2" )], na.rm = T)

# Create a variable for virtuosity average in the Kidney scenario
Study_1a$KidneyAverage <- rowMeans(Study_1a[, c("KidneyVirtuous1", "KidneyHonorable2", "KidneyRespectable3", "KidneyVirtuous2", "KidneyHonorable3", "KidneyRespectable1", "KidneyVirtuous3", "KidneyHonorable1", "KidneyRespectable2")], na.rm = T)

# Create a variable for virtuosity average in the Dessert scenario
Study_1a$DessertAverage <- rowMeans(Study_1a[, c("DessertVirtuous1", "DessertHonorable2", "DessertRespectable3", "DessertVirtuous2", "DessertHonorable3", "DessertRespectable1", "DessertVirtuous3", "DessertHonorable1", "DessertRespectable2")], na.rm = T)

# Create a variable for virtuosity average in the Gym scenario
Study_1a$GymAverage <- rowMeans(Study_1a[, c("GymVirtuous1", "GymHonorable2", "GymRespectable3", "GymVirtuous2", "GymHonorable3", "GymRespectable1", "GymVirtuous3", "GymHonorable1", "GymRespectable2")], na.rm = T)

# Create a variable for virtuosity average in the Schoolwork scenario
Study_1a$SchoolworkAverage <- rowMeans(Study_1a[, c("SchoolworkVirtuous1", "SchoolworkHonorable2", "SchoolworkRespctable3", "SchoolworkVirtuous2", "SchoolworkHonorable3", "SchoolworkRespectable1","SchoolworkVirtuous3", "SchoolworkHonorable1", "SchoolworkRespectable2")], na.rm = T)


B&S (2018)’s Group-Lvl Analyses

Simple Effects

For all t-tests, we conduct both one-tailed and two-tailed tests. Our pre-registration specified directional hypotheses which therefore ought to be analyzed with one-tailed tests. However, in order for readers to know any estimate’s uncertainty in both directions, we also conduct two-tailed tests to get relevant CIs.

Non-Moral Vignettes

Overall

# Non-Moral t-test using person-level averages across Non-Moral vignettes
Study_1a_nonmoral_t <- t.test(Study_1a$NonmoralAverage, mu = 0, alternative = "less") 
## 'greater' is for one-tailed p-value because of the tempted > non-tempted hypothesis (negative numbers mean tempted > non-tempted)
print(Study_1a_nonmoral_t)

    One Sample t-test

data:  Study_1a$NonmoralAverage
t = -0.65805, df = 165, p-value = 0.2557
alternative hypothesis: true mean is less than 0
95 percent confidence interval:
       -Inf 0.09726628
sample estimates:
  mean of x 
-0.06425703 
Study_1a_nonmoral_t_2side <- t.test(Study_1a$NonmoralAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_nonmoral_t_2side)

    One Sample t-test

data:  Study_1a$NonmoralAverage
t = -0.65805, df = 165, p-value = 0.5114
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.2570574  0.1285433
sample estimates:
  mean of x 
-0.06425703 
# returns cohen's d
effsize::cohen.d(Study_1a$NonmoralAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: -0.05107448 (negligible)
Reference mu: 0
95 percent confidence interval:
     lower      upper 
-0.3576178  0.2554689 

Dessert Vignette

# Dessert vignette t-test
Study_1a_dessert_t <- t.test(Study_1a$DessertAverage, mu = 0, alternative = "less") 
## 'greater' is for one-tailed p-value because of the tempted > non-tempted hypothesis (negative numbers mean tempted > non-tempted)
print(Study_1a_dessert_t)

    One Sample t-test

data:  Study_1a$DessertAverage
t = -1.001, df = 165, p-value = 0.1591
alternative hypothesis: true mean is less than 0
95 percent confidence interval:
       -Inf 0.07206212
sample estimates:
 mean of x 
-0.1104418 
Study_1a_dessert_t_2side <- t.test(Study_1a$DessertAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_dessert_t_2side)

    One Sample t-test

data:  Study_1a$DessertAverage
t = -1.001, df = 165, p-value = 0.3183
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.3282854  0.1074018
sample estimates:
 mean of x 
-0.1104418 
# returns cohen's d
effsize::cohen.d(Study_1a$DessertAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: -0.07769261 (negligible)
Reference mu: 0
95 percent confidence interval:
     lower      upper 
-0.3843016  0.2289164 

Gym Vignette

# Gym vignette t-test
Study_1a_gym_t <- t.test(Study_1a$GymAverage, mu = 0, alternative = "less") 
## 'greater' is for one-tailed p-value because of the tempted > non-tempted hypothesis (negative numbers mean tempted > non-tempted)
print(Study_1a_gym_t)

    One Sample t-test

data:  Study_1a$GymAverage
t = -0.41237, df = 165, p-value = 0.3403
alternative hypothesis: true mean is less than 0
95 percent confidence interval:
      -Inf 0.1330292
sample estimates:
  mean of x 
-0.04417671 
Study_1a_gym_t_2side <- t.test(Study_1a$GymAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_gym_t_2side)

    One Sample t-test

data:  Study_1a$GymAverage
t = -0.41237, df = 165, p-value = 0.6806
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.2556964  0.1673430
sample estimates:
  mean of x 
-0.04417671 
# returns cohen's d
effsize::cohen.d(Study_1a$GymAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: -0.03200616 (negligible)
Reference mu: 0
95 percent confidence interval:
     lower      upper 
-0.3385192  0.2745069 

Schoolwork Vignette

# Schoolwork vignette t-test
Study_1a_schoolwork_t <- t.test(Study_1a$SchoolworkAverage, mu = 0, alternative = "less") 
## 'greater' is for one-tailed p-value because of the tempted > non-tempted hypothesis (negative numbers mean tempted > non-tempted)
print(Study_1a_schoolwork_t)

    One Sample t-test

data:  Study_1a$SchoolworkAverage
t = -0.32359, df = 165, p-value = 0.3733
alternative hypothesis: true mean is less than 0
95 percent confidence interval:
      -Inf 0.1568773
sample estimates:
  mean of x 
-0.03815261 
Study_1a_schoolwork_t_2side <- t.test(Study_1a$SchoolworkAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_schoolwork_t_2side)

    One Sample t-test

data:  Study_1a$SchoolworkAverage
t = -0.32359, df = 165, p-value = 0.7467
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.2709477  0.1946425
sample estimates:
  mean of x 
-0.03815261 
# returns cohen's d
effsize::cohen.d(Study_1a$SchoolworkAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: -0.02511548 (negligible)
Reference mu: 0
95 percent confidence interval:
    lower     upper 
-0.331621  0.281390 

Moral Vignettes

Overall

# Moral t-test using person-level averages across Moral vignettes
Study_1a_moral_t <- t.test(Study_1a$MoralAverage, mu = 0, alternative = "greater") 
## 'less' is for one-tailed p-value because of the non-tempted > tempted hypothesis (positive numbers mean non-tempted > tempted)
print(Study_1a_moral_t)

    One Sample t-test

data:  Study_1a$MoralAverage
t = 10.276, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 0.9861768       Inf
sample estimates:
mean of x 
 1.175368 
Study_1a_moral_t_2side <- t.test(Study_1a$MoralAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_moral_t_2side)

    One Sample t-test

data:  Study_1a$MoralAverage
t = 10.276, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.9495421 1.4011941
sample estimates:
mean of x 
 1.175368 
# returns cohen's d
effsize::cohen.d(Study_1a$MoralAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.797611 (medium)
Reference mu: 0
95 percent confidence interval:
   lower    upper 
0.479164 1.116058 

Office Vignette

# Office vignette t-test
Study_1a_office_t <- t.test(Study_1a$OfficeAverage, mu = 0, alternative = "greater") 
## 'less' is for one-tailed p-value because of the non-tempted > tempted hypothesis (positive numbers mean non-tempted > tempted)
print(Study_1a_office_t)

    One Sample t-test

data:  Study_1a$OfficeAverage
t = 9.568, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 1.091196      Inf
sample estimates:
mean of x 
 1.319277 
Study_1a_office_t_2side <- t.test(Study_1a$OfficeAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_office_t_2side)

    One Sample t-test

data:  Study_1a$OfficeAverage
t = 9.568, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 1.047031 1.591523
sample estimates:
mean of x 
 1.319277 
# returns cohen's d
effsize::cohen.d(Study_1a$OfficeAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.742618 (medium)
Reference mu: 0
95 percent confidence interval:
    lower     upper 
0.4257365 1.0594994 

Adultery Vignette

# Adultery vignette t-test
Study_1a_adultery_t <- t.test(Study_1a$AdulteryAverage, mu = 0, alternative = "greater") 
## 'less' is for one-tailed p-value because of the non-tempted > tempted hypothesis (positive numbers mean non-tempted > tempted)
print(Study_1a_adultery_t)

    One Sample t-test

data:  Study_1a$AdulteryAverage
t = 9.8834, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 1.141947      Inf
sample estimates:
mean of x 
 1.371486 
Study_1a_adultery_t_2side <- t.test(Study_1a$AdulteryAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_adultery_t_2side)

    One Sample t-test

data:  Study_1a$AdulteryAverage
t = 9.8834, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 1.097499 1.645473
sample estimates:
mean of x 
 1.371486 
# returns cohen's d
effsize::cohen.d(Study_1a$AdulteryAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.7671017 (medium)
Reference mu: 0
95 percent confidence interval:
    lower     upper 
0.4495362 1.0846673 

Kidney Vignette

# Kidney vignette t-test
Study_1a_kidney_t <- t.test(Study_1a$KidneyAverage, mu = 0, alternative = "greater") 
## 'less' is for one-tailed p-value because of the non-tempted > tempted hypothesis (positive numbers mean non-tempted > tempted)
print(Study_1a_kidney_t)

    One Sample t-test

data:  Study_1a$KidneyAverage
t = 6.0929, df = 165, p-value = 0.000000003781
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 0.6085589       Inf
sample estimates:
mean of x 
0.8353414 
Study_1a_kidney_t_2side <- t.test(Study_1a$KidneyAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_kidney_t_2side)

    One Sample t-test

data:  Study_1a$KidneyAverage
t = 6.0929, df = 165, p-value = 0.000000007561
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.5646451 1.1060376
sample estimates:
mean of x 
0.8353414 
# returns cohen's d
effsize::cohen.d(Study_1a$KidneyAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.4729039 (small)
Reference mu: 0
95 percent confidence interval:
    lower     upper 
0.1621561 0.7836518 

Interaction

Repeated-Measures ANOVA

The purpose of this test is to determine whether there is a difference in mean virtuosity depending on condition (i.e., non-moral vs moral).

# Prepare data by using pivot_longer on a new dataset
Study_1a_anova <- Study_1a %>%
  dplyr::select(c(ResponseId, MoralAverage, NonmoralAverage))%>% 
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(MoralAverage,NonmoralAverage)),
               names_to = "Condition",
               values_to = "VirtuosityAverage")

# Repeated-Meausures ANOVA
Study_1a_interaction_aov <- aov(VirtuosityAverage~Condition + Error(as.factor(ResponseId)), data = Study_1a_anova)
summary(Study_1a_interaction_aov)

Error: as.factor(ResponseId)
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 165  475.9   2.884               

Error: Within
           Df Sum Sq Mean Sq F value              Pr(>F)    
Condition   1  127.5  127.54   146.6 <0.0000000000000002 ***
Residuals 165  143.6    0.87                                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Paired-Samples t-Test

Replicates results of the repeated-measures ANOVA (Berman & Small used ANOVAs rather than paired-samples t-tests for the interaction test). These tests are statistically identical, but we conduct both in case researchers have preferences for one over the other.

Study_1a_interaction_t <- t.test(VirtuosityAverage ~ Condition, data = Study_1a_anova, alternative = "greater", paired = TRUE)
## 'less' is for one-tailed p-value because of the non-moral > moral hypothesis (positive numbers mean non-moral > moral)
Study_1a_interaction_t

    Paired t-test

data:  VirtuosityAverage by Condition
t = 12.107, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean difference is greater than 0
95 percent confidence interval:
 1.070262      Inf
sample estimates:
mean difference 
       1.239625 
Study_1a_interaction_t_2side <- t.test(VirtuosityAverage ~ Condition, data = Study_1a_anova, alternative = "two.sided", paired = TRUE) 
## 'two.sided' is to get uncertainty estimates in both directions
print(Study_1a_interaction_t_2side)

    Paired t-test

data:  VirtuosityAverage by Condition
t = 12.107, df = 165, p-value < 0.00000000000000022
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 1.037467 1.441784
sample estimates:
mean difference 
       1.239625 
# returns dz effect size and 95% CIs
effsize::cohen.d(VirtuosityAverage ~ Condition | Subject(ResponseId),
                 data = Study_1a_anova %>% droplevels(), 
                 paired = T,
                 within = F)

Cohen's d

d estimate: 0.9397003 (large)
95 percent confidence interval:
    lower     upper 
0.7563845 1.1230161 
# returns d-av effect size and 95% CIs
effsize::cohen.d(VirtuosityAverage ~ Condition | Subject(ResponseId),
                 data = Study_1a_anova %>% droplevels(), 
                 paired = T,
                 within = T)

Cohen's d

d estimate: 0.8981868 (large)
95 percent confidence interval:
    lower     upper 
0.7253034 1.0710701 

Person-Lvl Analyses

# Create person-level variables
Study_1a_plvl <- Study_1a %>% 
  mutate(fits_hypothesis_n = if_else(NonmoralAverage < 0, 1, 0)) %>% 
  mutate(fits_hypothesis_dessert = if_else(DessertAverage < 0, 1, 0)) %>% 
  mutate(fits_hypothesis_gym = if_else(GymAverage < 0, 1, 0)) %>% 
  mutate(fits_hypothesis_schoolwork = if_else(SchoolworkAverage < 0, 1, 0)) %>% 
  mutate(fits_hypothesis_m = if_else(MoralAverage > 0, 1, 0)) %>%
  mutate(fits_hypothesis_office = if_else(OfficeAverage > 0, 1, 0)) %>% 
  mutate(fits_hypothesis_adultery = if_else(AdulteryAverage > 0, 1, 0)) %>% 
  mutate(fits_hypothesis_kidney = if_else(KidneyAverage > 0, 1, 0))

# Create variable that indicates whether participants fit the full complex hypothesis or not 
Study_1a_plvl$number_of_hyp_fit <- rowSums(Study_1a_plvl[, c("fits_hypothesis_m", "fits_hypothesis_n")], na.rm = T)
Study_1a_plvl <- Study_1a_plvl %>% 
   mutate(fits_complex = if_else(number_of_hyp_fit == 2, "Yes", "No"))

Descriptive Pervasiveness

Non-Moral Vignettes

# How many participants fit hypothesis for Non-Moral vignettes
table(Study_1a_plvl$fits_hypothesis_n) # (0 = "no"; 1 = "yes")

 0  1 
97 69 

Moral Vignettes

# How many participants fit hypothesis for Moral vignettes
table(Study_1a_plvl$fits_hypothesis_m) # (0 = "no"; 1 = "yes")

  0   1 
 37 129 

Interaction

# How many participants fit complex interaction hypothesis (i.e., in Non-Moral vignettes: tempted > non-tempted; in Moral vignettes: non-tempted > tempted)
table(Study_1a_plvl$fits_complex) # (0 = "no"; 1 = "yes")

 No Yes 
115  51 

Randomization Test

This test is only possible for the complex interaction hypothesis, as randomly shuffling within-condition data would yield the same result across shufflings.

library(mosaic) # for randomly shuffling data

Study_1a_random <- Study_1a_plvl_all %>% 
  dplyr::select(c(ResponseId, MoralAverage, NonmoralAverage))

Study_1a_random <- Study_1a_random %>% 
  mutate("Interaction" = case_when(
    (MoralAverage == 0 & NonmoralAverage == 0) ~ "Zero, Zero, Zero",
    (MoralAverage == 0 & NonmoralAverage < 0) ~ "Zero, Neg, Pos",
    (MoralAverage == 0 & NonmoralAverage > 0) ~ "Zero, Pos, Neg",
    (MoralAverage < 0 & NonmoralAverage == 0) ~ "Neg, Zero, Neg",
    (MoralAverage < 0 & NonmoralAverage < 0 & MoralAverage == NonmoralAverage) ~ "Neg, Neg, Zero",
    (MoralAverage < 0 & NonmoralAverage > 0) ~ "Neg, Pos, Neg",
    (MoralAverage < 0 & NonmoralAverage < 0 & MoralAverage > NonmoralAverage) ~ "Neg, Neg, Pos",
    (MoralAverage < 0 & NonmoralAverage < 0 & MoralAverage < NonmoralAverage) ~ "Neg, Neg, Neg",
    (MoralAverage > 0 & NonmoralAverage == 0) ~ "Pos, Zero, Pos",
    (MoralAverage > 0 & NonmoralAverage < 0) ~ "Pos, Neg, Pos", # this is the predicted pattern
    (MoralAverage > 0 & NonmoralAverage > 0 & MoralAverage == NonmoralAverage) ~ "Pos, Pos, Zero",
    (MoralAverage > 0 & NonmoralAverage > 0 & MoralAverage < NonmoralAverage) ~ "Pos, Pos, Neg",
    (MoralAverage > 0 & NonmoralAverage > 0 & MoralAverage > NonmoralAverage) ~ "Pos, Pos, Pos"))

prop_Study_1a <- prop( ~ Interaction == "Pos, Neg, Pos", data = Study_1a_random) # create descriptive proportion of claimed pattern from Berman & Small
prop_Study_1a_dp <- unname(prop_Study_1a[1]) # get descriptive proportion proportion for interaction

nsim <- 1000 # number of random datasets to generate
nullprop_Study_1a <- rep(NA, nsim) # creating empty bin

for (i in 1:nsim) { # for loop to do random shuffling across nsim datasets and calculate proportions in those randomly shuffled datasets
  #permutation, size equal to number of observations for each condition
  Study_1a_random$NonmoralAverageR <- shuffle(Study_1a_random$NonmoralAverage) # shuffling 'Non-Moral' values  
  Study_1a_random$MoralAverageR <- shuffle(Study_1a_random$MoralAverage) # shuffling 'Moral' values
  
  ## Creating variable that distinguishes Ps who showed predicted (claimed) pattern from Ps who did not
  Study_1a_R <- Study_1a_random %>%
  mutate("InteractionR" = case_when(
    (MoralAverageR == 0 & NonmoralAverageR == 0) ~ "Zero, Zero, Zero",
    (MoralAverageR == 0 & NonmoralAverageR < 0) ~ "Zero, Neg, Pos",
    (MoralAverageR == 0 & NonmoralAverageR > 0) ~ "Zero, Pos, Neg",
    (MoralAverageR < 0 & NonmoralAverageR == 0) ~ "Neg, Zero, Neg",
    (MoralAverageR < 0 & NonmoralAverageR < 0 & MoralAverageR == NonmoralAverageR) ~ "Neg, Neg, Zero",
    (MoralAverageR < 0 & NonmoralAverageR > 0) ~ "Neg, Pos, Neg",
    (MoralAverageR < 0 & NonmoralAverageR < 0 & MoralAverageR > NonmoralAverageR) ~ "Neg, Neg, Pos",
    (MoralAverageR < 0 & NonmoralAverageR < 0 & MoralAverageR < NonmoralAverageR) ~ "Neg, Neg, Neg",
    (MoralAverageR > 0 & NonmoralAverageR == 0) ~ "Pos, Zero, Pos",
    (MoralAverageR > 0 & NonmoralAverageR < 0) ~ "Pos, Neg, Pos", # this is the predicted pattern
    (MoralAverageR > 0 & NonmoralAverageR > 0 & MoralAverageR == NonmoralAverageR) ~ "Pos, Pos, Zero",
    (MoralAverageR > 0 & NonmoralAverageR > 0 & MoralAverageR < NonmoralAverageR) ~ "Pos, Pos, Neg",
    (MoralAverageR > 0 & NonmoralAverageR > 0 & MoralAverageR > NonmoralAverageR) ~ "Pos, Pos, Pos"))

  
  nullprop_TF_Study_1a <-prop( ~ InteractionR == "Pos, Neg, Pos", data = Study_1a_R) # create proportion value of claimed direction 
  nullprop_Study_1a[i]<- unname(nullprop_TF_Study_1a[1]) # get claimed pattern proportion for randomly shuffled data and repeat for each nsim dataset
}

gf_histogram( ~ nullprop_Study_1a, fill = ~ (nullprop_Study_1a >= prop_Study_1a_dp)) # create histogram of how many randomly shuffled datasets lead to a prop value similar to or greater than empirical prop


#c(chance)-value for empirical proportion (similar to Grice's c-values computed in his OOM software)
prop( ~ nullprop_Study_1a >= prop_Study_1a_dp) # suggests that empirical interaction proportion is very likely to have occurred by chance
prop_TRUE 
    0.871 

Frequentist Prevalence

# CREATE NECESSARY FREQUENTIST FUNCTION (code adapted from Donhauser et al.'s (2018) MATLAB code)

prevalence_test <- function(observed, alpha_ind=0.05, beta_ind=1, alpha_group=0.05, gamma_0=0.5) {
  
  # Inputs:
  # observed    = vector of p-values OR vector with two values, e.g., 'c(positive cases, total cases)'
  # alpha_ind   = alpha threshold for person-level tests, if 'observed' = vector of p-values (typically set to .05)
  # beta_ind    = sensitivity of person-level tests (probably set to 1.00)
  # alpha_group = see "outputs"
  # gamma_0     = null gamma value for empirical prevalence to be tested against (defaults to majority null)
  
  # Outputs:
  # p_null      = p-value for majority null or whatever null you specify in the gamma_0 argument (e.g., to specify a global null set "gamma_0 = 0") 
  # gamma_0     = highest gamma_0 value that can be rejected at threshold of 'alpha_group' given positive cases. Note this output is not the same as the input argument
  if(sum(observed > 1) == 0) {
    pvals <- observed
  } else {
    pvals <- c(rep(0, observed[1]), rep(1, observed[2]-observed[1]))
  }
  
  n <- length(pvals)
  k_obs <- sum(pvals < alpha_ind)
  kvals <- 0:n
  dgamma <- 0.001
  gammavals <- seq(0, 1, dgamma)
  
  p_k_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  p_kk_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  
  for(iGam in 1:length(gammavals)) {
    p_pos <- gammavals[iGam] * beta_ind + (1 - gammavals[iGam]) * alpha_ind
    p_neg <- gammavals[iGam] * (1 - beta_ind) + (1 - gammavals[iGam]) * (1 - alpha_ind)
    for(iK in 1:length(kvals)) {
      k <- kvals[iK]
      tmp <- choose(n, k) * p_pos^k * p_neg^(n - k)
      p_k_gamma[iGam, iK] <- tmp
      p_kk_gamma[iGam, iK] <- 1 - sum(p_k_gamma[iGam, 1:iK]) + tmp
    }
  }
  
  iK <- which(kvals == k_obs)
  p_null <- p_kk_gamma[which(gammavals == gamma_0), iK]
  
  index <- sum(p_kk_gamma[, iK] < alpha_group)
  if(index != 0) {
    gamma_0 <- gammavals[index]
  } else {
    gamma_0 <- 0
  }
  
  return(list(p_null=p_null, gamma_0=gamma_0, p_kk_gamma=p_kk_gamma, gammavals=gammavals, p_k_gamma=p_k_gamma))
}

Non-Moral Vignettes


k <- 69  # number of persons matching hypothesized / group-level pattern
n <- 69+97 # total N
nonmoral_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
nonmoral_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.9981335
# Originally printed: 0.9981335

Moral Vignettes


k <- 129  # number of persons matching hypothesized / group-level pattern
n <- 129+37 # total N
moral_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
moral_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.00000000001652683
# Originally printed: 0.00000000001652683

Interaction


k <- 51  # number of persons matching hypothesized / group-level pattern
n <- 51+115 # total N
primary_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
primary_freqPrevalence$p_null # print p-value testing against majority null
[1] 1
# Originally printed: 0.9981335

Bayesian Prevalence

# CREATE NECESSARY BAYES FUNCTIONS (code from Ince et al., 2021)
library(nleqslv)

bayesprev_map <- function(k, n, a=0.05, b=1) {
  # Bayesian maximum a posteriori estimate of population prevalence gamma
  # under a uniform prior
  # 
  # Args:
  #  k: number of participants/tests significant out of 
  #  n: total number of participants/tests
  #  a: alpha value of within-participant test (default=0.05)
  #  b: sensitivity/beta of within-participant test (default=1)
  
  gm <- (k/n -a)/(b-a)
  if(gm <0) gm <- 0
  if(gm>1) gm <- 1
  return(gm)
} 

bayesprev_posterior <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior of population prevalence gamma under a uniform prior
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior density
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  theta <- a + (b-a)*x
  post <- (b -a)*dbeta(theta,m1, m2)
  post <- post/(pbeta(b, m1, m2) - pbeta(a, m1, m2))
  return(post)
}


bayesprev_bound <- function(p, k, n, a=0.05, b=1) {
  # Bayesian lower bound of population prevalence gamma under a uniform prior
  #
  # Args:
  #  p : density the lower bound should bound (e.g. 0.95)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  th_c <- qbeta( p*pbeta(a, m1, m2) + (1-p)*pbeta(b, m1, m2), m1, m2 )
  g_c <- (th_c -a)/(b-a)
  return(g_c)
}


bayesprev_hpdi <- function(p, k, n, a=0.05, b=1) {
  # Bayesian highest posterior density interval of population prevalence gamma
  # under a uniform prior
  #
  # Args:
  #  p : HPDI to return (e.g. 0.95 for 95%)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <- k+1
  m2 <- n-k+1
  
  if(m1 ==1) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(m2 ==1) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  if(k<= n*a) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(k>= n*b) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  
  g <- function(x, m1, m2, a, b, p ) {
    y <- numeric(2)
    y[1] <-  pbeta(x[2], m1, m2) - pbeta(x[1], m1, m2) - p*(pbeta(b, m1, m2) - pbeta(a, m1, m2))
    y[2] <- log(dbeta(x[2], m1, m2)) - log(dbeta(x[1], m1, m2))
    return(y)
  }
  
  x_init <- numeric(2)
  
  p1 <- (1-p)/2 
  p2 <- (1 +p)/2
  
  x_init[1] <- qbeta( (1 -p1)*pbeta(a, m1, m2) + p1* pbeta(b, m1, m2), m1, m2 )
  x_init[2] <- qbeta( (1 -p2)*pbeta(a, m1, m2) + p2* pbeta(b, m1, m2), m1, m2 )
  
  opt <- nleqslv(x_init, g, method ="Newton", control=list(maxit=1000), m1=m1, m2=m2, a=a, b=b, p=p)
  
  if (opt$termcd ==1)  print("convergence achieved") 
  if (opt$termcd != 1)  print("failed to converge") 
  
  temp <- opt$x
  if (temp[1] <a) {
    temp[1] <- a
    temp[2] <- qbeta( (1 -p)*pbeta(a, m1, m2) + p* pbeta(b, m1, m2), m1, m2 )
  }
  if (temp[2] > b) {
    temp[1] <- qbeta( p*pbeta(a, m1, m2) + (1-p)* pbeta(b, m1, m2), m1, m2 )
    temp[2] <- b
  }
  endpts <- (temp -a)/(b-a)
  return(endpts) 
}


bayesprev_posteriorprob <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior probability in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior probability
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  return(p)
  
}

bayesprev_posteriorlogodds <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior log-odds in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : log-odds threshold
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  lo<- log(p / (1 - p))
  return(lo)
  
}

Non-Moral Vignettes


k <- 69  # number of persons matching hypothesized / group-level pattern
n <- 69+97 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.3045692 0.3849081 0.4682054
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 0.002422369
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1
# ORIGINALLY PRINTED: 0.3045692 0.3849081 0.4682054

Moral Vignettes


k <- 129  # number of persons matching hypothesized / group-level pattern
n <- 129+37 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.6912801 0.7653773 0.8297420
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 1
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1
# ORIGINALLY PRINTED: 0.6912801 0.7653773 0.8297420

Interaction


k <- 51  # number of persons matching hypothesized / group-level pattern
n <- 51+115 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.1975061 0.2707673 0.3507936
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 0.000000007825034
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1
# ORIGINALLY PRINTED: 0.1975061 0.2707673 0.3507936

Primary Plots

# set breaks for histograms
breaks_seezero <- c(-4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, -0.01, 0.01, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4)

Non-Moral Vignettes

print(S1a_nonmoral <- ggplot(Study_1a_plvl, aes(x = NonmoralAverage)) +
  geom_histogram(breaks = breaks_seezero,
                 color = "grey30", fill = c("#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "black",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335")) +
  scale_x_continuous(limits = c(-4.1,4.1), breaks = c(-4,-3,-2,-1,0,1,2,3,4)) +
  scale_y_continuous(limits = c(-0.1,50.1), breaks = c(0, 10, 20, 30, 40, 50)) +
  xlab("\nGlobal Virtuosity Judgment") +
  ylab("Number of Participants\n") +
  theme_classic() +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S1a_nonmoral_plot.png")
Saving 14.1 x 9.04 in image

Moral Vignettes

print(S1a_moral <- ggplot(Study_1a_plvl, aes(x = MoralAverage)) +
  geom_histogram(breaks = breaks_seezero,
                 color = "grey30", fill = c("#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "black",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335",
                                           "#CEA335", "#CEA335", "#CEA335", "#CEA335")) +
  scale_x_continuous(limits = c(-4.1,4.1), breaks = c(-4,-3,-2,-1,0,1,2,3,4)) +
  scale_y_continuous(limits = c(-0.1,50.1), breaks = c(0, 10, 20, 30, 40, 50)) +
  xlab("\nGlobal Virtuosity Judgment") +
  ylab("Number of Participants\n") +
  theme_classic() +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S1a_moral_plot.png")
Saving 14.1 x 9.04 in image

Interaction

Berman & Small predicted an interaction such that tempted agents would be judged as more virtuous in non-moral contexts, but less virtuous in moral contexts. Therefore, this interaction plot shows how many participants’ responses mirrored that nuanced prediction.

print(S1a_int <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  scale_y_continuous(limits = c(-0.1,151.1), breaks = c(0, 25, 50, 75, 100, 125, 150)) +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

    
ggsave("S1a_int_plot.png")
Saving 14.1 x 9.04 in image

Robustness Plots

Here, we investigate the number of participants matching predicted effects by demographics in order to catalog the generality (or lack thereof) of these effects across levels of various the demographics that we collected.

# create yes/no variable for simple hypotheses
Study_1a_plvl <- Study_1a_plvl %>%
  mutate(fits_nonmoral = if_else(fits_hypothesis_n == 1, "Yes", "No"))

# create yes/no variable for simple hypotheses
Study_1a_plvl <- Study_1a_plvl %>%
  mutate(fits_moral = if_else(fits_hypothesis_m == 1, "Yes", "No"))

Education

Non-Moral Vignettes

print(S1a_nonmoral_educ <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_educ <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_educ <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Political Party

Non-Moral Vignettes

print(S1a_nonmoral_pol <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Political_Party) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_pol <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Political_Party) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_pol <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Political_Party) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Religiosity

Non-Moral Vignettes

print(S1a_nonmoral_relig <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_relig <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_relig <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Urban vs Rural

Non-Moral Vignettes

print(S1a_nonmoral_urb <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~UrbanRural) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_urb <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~UrbanRural) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_urb <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~UrbanRural) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Gender

Non-Moral Vignettes

print(S1a_nonmoral_gender <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_gender <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_gender <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Race

# make race one variable
Study_1a_plvl <- Study_1a_plvl %>%
  mutate(Race = coalesce(Race_1, Race_2, Race_3, Race_4, Race_5, Race_6, Race_7, Race_8))

Non-Moral Vignettes

print(S1a_nonmoral_race <- ggplot(Study_1a_plvl, aes(x = fits_nonmoral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Non-Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Moral Vignettes

print(S1a_moral_race <- ggplot(Study_1a_plvl, aes(x = fits_moral)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Moral Vignette Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S1a_int_race <- ggplot(Study_1a_plvl, aes(x = fits_complex)) +
  geom_bar(fill = "#CEA335") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

LS0tDQp0aXRsZTogIlN0dWR5IDFhOiAxc3QgVy1TcyBSZXBsaWNhdGlvbiBvZiBCZXJtYW4gJiBTbWFsbCAoMjAxOCkncyBTdHVkeSAyIg0KYXV0aG9yOiAiSGVsZW4gUGFkaWxsYSBGb25nICYgUnlhbiBNLiBNY01hbnVzIg0KZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgJw0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgdGhlbWU6IGRhcmtseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQojIERhdGEgUHJlcGFyYXRpb24gey50YWJzZXR9DQoNCkluIHRoaXMgcHJlLXJlZ2lzdGVyZWQgc3R1ZHksIHdlIGNvbGxlY3RlZCBkYXRhIGZyb20gMTc0IHBhcnRpY2lwYW50LiBBZnRlciBmaWx0ZXJpbmcgdGhlc2UgcGFydGljaXBhbnRzIHdpdGggdGhyZWUgYXR0ZW50aW9uIGNoZWNrIG1lYXN1cmVzLCB3ZSBvYnRhaW5lZCBhbmFseXphYmxlIGRhdGEgZnJvbSAxNjYgcGFydGljaXBhbnRzLg0KDQojIyBMb2FkaW5nIFBhY2thZ2VzDQoNCkJlZm9yZSBydW5uaW5nIHRoaXMgY2h1bmssIHBsZWFzZSBsb2FkICJTdHVkeSAxYS5jc3YiIGludG8gdGhlIFIgZW52aXJvbm1lbnQuDQoNCmBgYHtyfQ0KIyBwYWNrYWdlcyBzaG91bGQgYmUgbG9hZGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgdG8gYXZvaWQgZnVuY3Rpb24gY29uZmxpY3RzDQpvcHRpb25zKHNjaXBlbiA9IDk5KSAjIHR1cm5zIG9mZiBzY2llbnRpZmljIG5vdGF0aW9uDQpsaWJyYXJ5KHBzeWNoKSAjIGZvciBkZXNjcmliaW5nIGRhdGENCmxpYnJhcnkoZWZmc2l6ZSkgIyBmb3IgbWVhbiBkaWZmZXJlbmNlIGVmZmVjdCBzaXplcw0KbGlicmFyeShzanN0YXRzKSAjIGZvciBldGEtc3F1YXJlZCBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoY29ycmVsYXRpb24pICMgZm9yIGNsZWFuZXIgY29ycmVsYXRpb24gdGVzdCBvdXRwdXQNCmxpYnJhcnkocm1jb3JyKSAjIGZvciByZXBlYXRlZC1tZWFzdXJlcyBjb3JyZWxhdGlvbiB0ZXN0cw0KbGlicmFyeShjb2NvcikgIyBmb3IgY29tcGFyaW5nIGRlcGVuZGVudCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMNCmxpYnJhcnkodGlkeXZlcnNlKSAjIGZvciBkYXRhIG1hbmlwdWxhdGlvbiBhbmQgcGxvdHRpbmcNCmBgYA0KDQojIyBBdHRlbnRpb24gQ2hlY2sNCg0KUGFydGljaXBhbnRzIHdlcmUgaW5zdHJ1Y3RlZCB0byBzZWxlY3QgemVybyAoaS5lLiwgdGhlIG1pZGRsZSBvcHRpb24gaW4gdGhlIDktcG9pbnQgc2NhbGUpIGFzIHRoZWlyIHJlc3BvbnNlIGZvciB0aHJlZSBtZWFzdXJlcyB0aGF0IGZvbGxvd2VkIGEgbW9kaWZpZWQgc2NlbmFyaW8uIElmIGEgcGFydGljaXBhbnQgZmFpbGVkIHRvIHNlbGVjdCAiMCIgYXMgdGhlaXIgcmVzcG9uc2UgZm9yIGFueSBvZiB0aGUgdGhyZWUgbWVhc3VyZXMsIHRoZXkgd291bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgYW5hbHlzZXMuDQoNCmBgYHtyfQ0KIyBFeHBlcmltZW50YWwgdGFzayBhdHRlbnRpb24gY2hlY2sgdmFyaWFibGUNClN0dWR5XzFhJEF0dENoZWNrcyA8LSByb3dTdW1zKFN0dWR5XzFhWywgYygiQXR0bkNoZWNrMSIsICJBdHRuQ2hlY2syIiwgIkF0dG5DaGVjazMiKV0sIG5hLnJtID0gVCkNCg0KIyBUaGUgZXhjbHVzaW9uIG9mIGFueSBzdW0gKHdpdGhpbiB0aGUgdmFyaWFibGUgIkF0dENoZWNrcyIpIHRoYXQgZGlkIG5vdCByZXN1bHQgaW4gYSB6ZXJvDQpTdHVkeV8xYSA8LSBTdHVkeV8xYSAlPiUgDQogIGZpbHRlcihTdHVkeV8xYSRBdHRDaGVja3MgPT0gMCkNCmBgYA0KDQojIyBWYXJpYWJsZSBDcmVhdGlvbg0KDQpUaGUgb3JpZ2luYWwgZGVzaWduIHByb3ZpZGVkIGJ5IEJlcm1hbiAmIFNtYWxsIHJlcXVpcmVkIHZpcnR1b3NpdHksIGhvbm9yYWJpbGl0eSwgYW5kIHJlc3BlY3RhYmlsaXR5IG1lYXN1cmVzIHRvIGJlIGF2ZXJhZ2VkIGFjcm9zcyBmb3IgYWxsIHBhcnRpY2lwYW50cy4gTW9yZW92ZXIsIHNpbmNlIHRoZSBzdHVkeSBoYWQgYSBiZXR3ZWVuLXN1YmplY3RzIGRlc2lnbiwgaXQgaW5jbHVkZWQgYW4gb3ZlcmFsbCAiVmlydHVvc2l0eSBBdmVyYWdlIi4gRm9yIHRoaXMgcmVwbGljYXRpb24sIHRoZSB3aXRoaW4tc3ViamVjdHMgZGVzaWduIGRvZXMgbm90IGFsbG93IHRvIGhhdmUgYW4gb3ZlcmFsbCBhdmVyYWdlLCBzbyB0aGVyZSB3aWxsIGJlIGEgbW9yYWwgYW5kIGEgbm9uLW1vcmFsIGF2ZXJhZ2UgZm9yIGVhY2ggcGFydGljaXBhbnQuIEFkZGl0aW9uYWxseSwgdGhlcmUgd2lsbCBiZSBhIHZpcnR1b3NpdHkgYXZlcmFnZSBmb3IgZWFjaCB2aWduZXR0ZS4NCg0KYGBge3J9DQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgZm9yIHZpcnR1b3NpdHkgYXZlcmFnZSBpbiB0aGUgbW9yYWwgY29uZGl0aW9uDQpTdHVkeV8xYSRNb3JhbEF2ZXJhZ2UgPC0gcm93TWVhbnMoU3R1ZHlfMWFbLCBjKCJBZHVsdGVyeVZpcnR1b3VzMSIsICJBZHVsdGVyeUhvbm9yYWJsZTIiLCAiQWR1bHRlcnlSZXNwZWN0YWJsZTMiLCAiT2ZmaWNlVmlydHVvdXMxIiwgIk9mZmljZUhvbm9yYWJsZTIiLCAiT2ZmaWNlUmVzcGVjdGFibGUzIiwgIktpZG5leVZpcnR1b3VzMSIsICJLaWRuZXlIb25vcmFibGUyIiwgIktpZG5leVJlc3BlY3RhYmxlMyIsICJBZHVsdGVyeVZpcnR1b3VzMiIsICJBZHVsdGVyeUhvbm9yYWJsZTMiLCAiQWR1bHRlcnlSZXNwZWN0YWJsZTEiLCAiT2ZmaWNlVmlydHVvdXMyIiwgIk9mZmljZUhvbm9yYWJsZTMiLCAiT2ZmaWNlUmVzcGVjdGFibGUxIiwgIktpZG5leVZpcnR1b3VzMiIsICJLaWRuZXlIb25vcmFibGUzIiwgIktpZG5leVJlc3BlY3RhYmxlMSIsICJBZHVsdGVyeVZpcnR1b3VzMyIsICJBZHVsdGVyeUhvbm9yYWJsZTEiLCAiQWR1bHRlcnlSZXNwZWN0YWJsZTIiLCAiT2ZmaWNlVmlydHVvdXMzIiwgIk9mZmljZUhvbm9yYWJsZTEiLCAiT2ZmaWNlUmVzcGVjdGFibGUyIiwgIktpZG5leVZpcnR1b3VzMyIsICJLaWRuZXlIb25vcmFibGUxIiwgIktpZG5leVJlc3BlY3RhYmxlMiIgKV0sIG5hLnJtID0gVCkNCg0KIyBDcmVhdGUgYSB2YXJpYWJsZSBmb3IgdmlydHVvc2l0eSBhdmVyYWdlIGluIHRoZSBub24tbW9yYWwgY29uZGl0aW9uDQpTdHVkeV8xYSROb25tb3JhbEF2ZXJhZ2UgPC0gcm93TWVhbnMoU3R1ZHlfMWFbLCBjKCJEZXNzZXJ0VmlydHVvdXMxIiwgIkRlc3NlcnRIb25vcmFibGUyIiwgIkRlc3NlcnRSZXNwZWN0YWJsZTMiLCAiR3ltVmlydHVvdXMxIiwgIkd5bUhvbm9yYWJsZTIiLCAiR3ltUmVzcGVjdGFibGUzIiwgIlNjaG9vbHdvcmtWaXJ0dW91czEiLCAiU2Nob29sd29ya0hvbm9yYWJsZTIiLCAiU2Nob29sd29ya1Jlc3BjdGFibGUzIiwgIkRlc3NlcnRWaXJ0dW91czIiLCAiRGVzc2VydEhvbm9yYWJsZTMiLCAiRGVzc2VydFJlc3BlY3RhYmxlMSIsICJHeW1WaXJ0dW91czIiLCAiR3ltSG9ub3JhYmxlMyIsICJHeW1SZXNwZWN0YWJsZTEiLCAiU2Nob29sd29ya1ZpcnR1b3VzMiIsICJTY2hvb2x3b3JrSG9ub3JhYmxlMyIsICJTY2hvb2x3b3JrUmVzcGVjdGFibGUxIiwgIkRlc3NlcnRWaXJ0dW91czMiLCAiRGVzc2VydEhvbm9yYWJsZTEiLCAiRGVzc2VydFJlc3BlY3RhYmxlMiIsICJHeW1WaXJ0dW91czMiLCAiR3ltSG9ub3JhYmxlMSIsICJHeW1SZXNwZWN0YWJsZTIiLCAiU2Nob29sd29ya1ZpcnR1b3VzMyIsICJTY2hvb2x3b3JrSG9ub3JhYmxlMSIsICJTY2hvb2x3b3JrUmVzcGVjdGFibGUyIildLCBuYS5ybSA9IFQpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgZm9yIHZpcnR1b3NpdHkgYXZlcmFnZSBpbiB0aGUgT2ZmaWNlIFN1cHBsaWVzIHNjZW5hcmlvDQpTdHVkeV8xYSRPZmZpY2VBdmVyYWdlIDwtIHJvd01lYW5zKFN0dWR5XzFhWywgYygiT2ZmaWNlVmlydHVvdXMxIiwgIk9mZmljZUhvbm9yYWJsZTIiLCAiT2ZmaWNlUmVzcGVjdGFibGUzIiwgIk9mZmljZVZpcnR1b3VzMiIsICJPZmZpY2VIb25vcmFibGUzIiwgIk9mZmljZVJlc3BlY3RhYmxlMSIsICJPZmZpY2VWaXJ0dW91czMiLCAiT2ZmaWNlSG9ub3JhYmxlMSIsICJPZmZpY2VSZXNwZWN0YWJsZTIiICldLCBuYS5ybSA9IFQpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgZm9yIHZpcnR1b3NpdHkgYXZlcmFnZSBpbiB0aGUgQWR1bHRlcnkgc2NlbmFyaW8NClN0dWR5XzFhJEFkdWx0ZXJ5QXZlcmFnZSA8LSByb3dNZWFucyhTdHVkeV8xYVssIGMoIkFkdWx0ZXJ5VmlydHVvdXMxIiwgIkFkdWx0ZXJ5SG9ub3JhYmxlMiIsICJBZHVsdGVyeVJlc3BlY3RhYmxlMyIsICJBZHVsdGVyeVZpcnR1b3VzMiIsICJBZHVsdGVyeUhvbm9yYWJsZTMiLCAiQWR1bHRlcnlSZXNwZWN0YWJsZTEiLCAiQWR1bHRlcnlWaXJ0dW91czMiLCAiQWR1bHRlcnlIb25vcmFibGUxIiwgIkFkdWx0ZXJ5UmVzcGVjdGFibGUyIiApXSwgbmEucm0gPSBUKQ0KDQojIENyZWF0ZSBhIHZhcmlhYmxlIGZvciB2aXJ0dW9zaXR5IGF2ZXJhZ2UgaW4gdGhlIEtpZG5leSBzY2VuYXJpbw0KU3R1ZHlfMWEkS2lkbmV5QXZlcmFnZSA8LSByb3dNZWFucyhTdHVkeV8xYVssIGMoIktpZG5leVZpcnR1b3VzMSIsICJLaWRuZXlIb25vcmFibGUyIiwgIktpZG5leVJlc3BlY3RhYmxlMyIsICJLaWRuZXlWaXJ0dW91czIiLCAiS2lkbmV5SG9ub3JhYmxlMyIsICJLaWRuZXlSZXNwZWN0YWJsZTEiLCAiS2lkbmV5VmlydHVvdXMzIiwgIktpZG5leUhvbm9yYWJsZTEiLCAiS2lkbmV5UmVzcGVjdGFibGUyIildLCBuYS5ybSA9IFQpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgZm9yIHZpcnR1b3NpdHkgYXZlcmFnZSBpbiB0aGUgRGVzc2VydCBzY2VuYXJpbw0KU3R1ZHlfMWEkRGVzc2VydEF2ZXJhZ2UgPC0gcm93TWVhbnMoU3R1ZHlfMWFbLCBjKCJEZXNzZXJ0VmlydHVvdXMxIiwgIkRlc3NlcnRIb25vcmFibGUyIiwgIkRlc3NlcnRSZXNwZWN0YWJsZTMiLCAiRGVzc2VydFZpcnR1b3VzMiIsICJEZXNzZXJ0SG9ub3JhYmxlMyIsICJEZXNzZXJ0UmVzcGVjdGFibGUxIiwgIkRlc3NlcnRWaXJ0dW91czMiLCAiRGVzc2VydEhvbm9yYWJsZTEiLCAiRGVzc2VydFJlc3BlY3RhYmxlMiIpXSwgbmEucm0gPSBUKQ0KDQojIENyZWF0ZSBhIHZhcmlhYmxlIGZvciB2aXJ0dW9zaXR5IGF2ZXJhZ2UgaW4gdGhlIEd5bSBzY2VuYXJpbw0KU3R1ZHlfMWEkR3ltQXZlcmFnZSA8LSByb3dNZWFucyhTdHVkeV8xYVssIGMoIkd5bVZpcnR1b3VzMSIsICJHeW1Ib25vcmFibGUyIiwgIkd5bVJlc3BlY3RhYmxlMyIsICJHeW1WaXJ0dW91czIiLCAiR3ltSG9ub3JhYmxlMyIsICJHeW1SZXNwZWN0YWJsZTEiLCAiR3ltVmlydHVvdXMzIiwgIkd5bUhvbm9yYWJsZTEiLCAiR3ltUmVzcGVjdGFibGUyIildLCBuYS5ybSA9IFQpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgZm9yIHZpcnR1b3NpdHkgYXZlcmFnZSBpbiB0aGUgU2Nob29sd29yayBzY2VuYXJpbw0KU3R1ZHlfMWEkU2Nob29sd29ya0F2ZXJhZ2UgPC0gcm93TWVhbnMoU3R1ZHlfMWFbLCBjKCJTY2hvb2x3b3JrVmlydHVvdXMxIiwgIlNjaG9vbHdvcmtIb25vcmFibGUyIiwgIlNjaG9vbHdvcmtSZXNwY3RhYmxlMyIsICJTY2hvb2x3b3JrVmlydHVvdXMyIiwgIlNjaG9vbHdvcmtIb25vcmFibGUzIiwgIlNjaG9vbHdvcmtSZXNwZWN0YWJsZTEiLCJTY2hvb2x3b3JrVmlydHVvdXMzIiwgIlNjaG9vbHdvcmtIb25vcmFibGUxIiwgIlNjaG9vbHdvcmtSZXNwZWN0YWJsZTIiKV0sIG5hLnJtID0gVCkNCg0KYGBgDQoNCjxicj4NCg0KIyBCJlMgKDIwMTgpJ3MgR3JvdXAtTHZsIEFuYWx5c2VzIHsudGFic2V0fQ0KDQojIyBTaW1wbGUgRWZmZWN0cyB7LnRhYnNldH0NCg0KRm9yIGFsbCB0LXRlc3RzLCB3ZSBjb25kdWN0IGJvdGggb25lLXRhaWxlZCBhbmQgdHdvLXRhaWxlZCB0ZXN0cy4gT3VyIHByZS1yZWdpc3RyYXRpb24gc3BlY2lmaWVkIGRpcmVjdGlvbmFsIGh5cG90aGVzZXMgd2hpY2ggdGhlcmVmb3JlIG91Z2h0IHRvIGJlIGFuYWx5emVkIHdpdGggb25lLXRhaWxlZCB0ZXN0cy4gSG93ZXZlciwgaW4gb3JkZXIgZm9yIHJlYWRlcnMgdG8ga25vdyBhbnkgZXN0aW1hdGUncyB1bmNlcnRhaW50eSBpbiBib3RoIGRpcmVjdGlvbnMsIHdlIGFsc28gY29uZHVjdCB0d28tdGFpbGVkIHRlc3RzIHRvIGdldCByZWxldmFudCBDSXMuDQoNCiMjIyBOb24tTW9yYWwgVmlnbmV0dGVzIHsudGFic2V0fQ0KDQojIyMjIE92ZXJhbGwNCmBgYHtyfQ0KIyBOb24tTW9yYWwgdC10ZXN0IHVzaW5nIHBlcnNvbi1sZXZlbCBhdmVyYWdlcyBhY3Jvc3MgTm9uLU1vcmFsIHZpZ25ldHRlcw0KU3R1ZHlfMWFfbm9ubW9yYWxfdCA8LSB0LnRlc3QoU3R1ZHlfMWEkTm9ubW9yYWxBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImxlc3MiKSANCiMjICdncmVhdGVyJyBpcyBmb3Igb25lLXRhaWxlZCBwLXZhbHVlIGJlY2F1c2Ugb2YgdGhlIHRlbXB0ZWQgPiBub24tdGVtcHRlZCBoeXBvdGhlc2lzIChuZWdhdGl2ZSBudW1iZXJzIG1lYW4gdGVtcHRlZCA+IG5vbi10ZW1wdGVkKQ0KcHJpbnQoU3R1ZHlfMWFfbm9ubW9yYWxfdCkNCg0KU3R1ZHlfMWFfbm9ubW9yYWxfdF8yc2lkZSA8LSB0LnRlc3QoU3R1ZHlfMWEkTm9ubW9yYWxBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFN0dWR5XzFhX25vbm1vcmFsX3RfMnNpZGUpDQoNCiMgcmV0dXJucyBjb2hlbidzIGQNCmVmZnNpemU6OmNvaGVuLmQoU3R1ZHlfMWEkTm9ubW9yYWxBdmVyYWdlLA0KICAgICAgICAgICAgICAgICBmID0gTkEsDQogICAgICAgICAgICAgICAgIG11ID0gMCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpDQpgYGANCiMjIyMgRGVzc2VydCBWaWduZXR0ZQ0KYGBge3J9DQojIERlc3NlcnQgdmlnbmV0dGUgdC10ZXN0DQpTdHVkeV8xYV9kZXNzZXJ0X3QgPC0gdC50ZXN0KFN0dWR5XzFhJERlc3NlcnRBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImxlc3MiKSANCiMjICdncmVhdGVyJyBpcyBmb3Igb25lLXRhaWxlZCBwLXZhbHVlIGJlY2F1c2Ugb2YgdGhlIHRlbXB0ZWQgPiBub24tdGVtcHRlZCBoeXBvdGhlc2lzIChuZWdhdGl2ZSBudW1iZXJzIG1lYW4gdGVtcHRlZCA+IG5vbi10ZW1wdGVkKQ0KcHJpbnQoU3R1ZHlfMWFfZGVzc2VydF90KQ0KDQpTdHVkeV8xYV9kZXNzZXJ0X3RfMnNpZGUgPC0gdC50ZXN0KFN0dWR5XzFhJERlc3NlcnRBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFN0dWR5XzFhX2Rlc3NlcnRfdF8yc2lkZSkNCg0KIyByZXR1cm5zIGNvaGVuJ3MgZA0KZWZmc2l6ZTo6Y29oZW4uZChTdHVkeV8xYSREZXNzZXJ0QXZlcmFnZSwNCiAgICAgICAgICAgICAgICAgZiA9IE5BLA0KICAgICAgICAgICAgICAgICBtdSA9IDAsDQogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KYGBgDQojIyMjIEd5bSBWaWduZXR0ZQ0KYGBge3J9DQojIEd5bSB2aWduZXR0ZSB0LXRlc3QNClN0dWR5XzFhX2d5bV90IDwtIHQudGVzdChTdHVkeV8xYSRHeW1BdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImxlc3MiKSANCiMjICdncmVhdGVyJyBpcyBmb3Igb25lLXRhaWxlZCBwLXZhbHVlIGJlY2F1c2Ugb2YgdGhlIHRlbXB0ZWQgPiBub24tdGVtcHRlZCBoeXBvdGhlc2lzIChuZWdhdGl2ZSBudW1iZXJzIG1lYW4gdGVtcHRlZCA+IG5vbi10ZW1wdGVkKQ0KcHJpbnQoU3R1ZHlfMWFfZ3ltX3QpDQoNClN0dWR5XzFhX2d5bV90XzJzaWRlIDwtIHQudGVzdChTdHVkeV8xYSRHeW1BdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFN0dWR5XzFhX2d5bV90XzJzaWRlKQ0KDQojIHJldHVybnMgY29oZW4ncyBkDQplZmZzaXplOjpjb2hlbi5kKFN0dWR5XzFhJEd5bUF2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCmBgYA0KIyMjIyBTY2hvb2x3b3JrIFZpZ25ldHRlDQpgYGB7cn0NCiMgU2Nob29sd29yayB2aWduZXR0ZSB0LXRlc3QNClN0dWR5XzFhX3NjaG9vbHdvcmtfdCA8LSB0LnRlc3QoU3R1ZHlfMWEkU2Nob29sd29ya0F2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAibGVzcyIpIA0KIyMgJ2dyZWF0ZXInIGlzIGZvciBvbmUtdGFpbGVkIHAtdmFsdWUgYmVjYXVzZSBvZiB0aGUgdGVtcHRlZCA+IG5vbi10ZW1wdGVkIGh5cG90aGVzaXMgKG5lZ2F0aXZlIG51bWJlcnMgbWVhbiB0ZW1wdGVkID4gbm9uLXRlbXB0ZWQpDQpwcmludChTdHVkeV8xYV9zY2hvb2x3b3JrX3QpDQoNClN0dWR5XzFhX3NjaG9vbHdvcmtfdF8yc2lkZSA8LSB0LnRlc3QoU3R1ZHlfMWEkU2Nob29sd29ya0F2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikgDQojIyAndHdvLnNpZGVkJyBpcyB0byBnZXQgdW5jZXJ0YWludHkgZXN0aW1hdGVzIGluIGJvdGggZGlyZWN0aW9ucw0KcHJpbnQoU3R1ZHlfMWFfc2Nob29sd29ya190XzJzaWRlKQ0KDQojIHJldHVybnMgY29oZW4ncyBkDQplZmZzaXplOjpjb2hlbi5kKFN0dWR5XzFhJFNjaG9vbHdvcmtBdmVyYWdlLA0KICAgICAgICAgICAgICAgICBmID0gTkEsDQogICAgICAgICAgICAgICAgIG11ID0gMCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpDQpgYGANCg0KIyMjIE1vcmFsIFZpZ25ldHRlcyB7LnRhYnNldH0NCg0KIyMjIyBPdmVyYWxsDQpgYGB7cn0NCiMgTW9yYWwgdC10ZXN0IHVzaW5nIHBlcnNvbi1sZXZlbCBhdmVyYWdlcyBhY3Jvc3MgTW9yYWwgdmlnbmV0dGVzDQpTdHVkeV8xYV9tb3JhbF90IDwtIHQudGVzdChTdHVkeV8xYSRNb3JhbEF2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpIA0KIyMgJ2xlc3MnIGlzIGZvciBvbmUtdGFpbGVkIHAtdmFsdWUgYmVjYXVzZSBvZiB0aGUgbm9uLXRlbXB0ZWQgPiB0ZW1wdGVkIGh5cG90aGVzaXMgKHBvc2l0aXZlIG51bWJlcnMgbWVhbiBub24tdGVtcHRlZCA+IHRlbXB0ZWQpDQpwcmludChTdHVkeV8xYV9tb3JhbF90KQ0KDQpTdHVkeV8xYV9tb3JhbF90XzJzaWRlIDwtIHQudGVzdChTdHVkeV8xYSRNb3JhbEF2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikgDQojIyAndHdvLnNpZGVkJyBpcyB0byBnZXQgdW5jZXJ0YWludHkgZXN0aW1hdGVzIGluIGJvdGggZGlyZWN0aW9ucw0KcHJpbnQoU3R1ZHlfMWFfbW9yYWxfdF8yc2lkZSkNCg0KIyByZXR1cm5zIGNvaGVuJ3MgZA0KZWZmc2l6ZTo6Y29oZW4uZChTdHVkeV8xYSRNb3JhbEF2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCmBgYA0KIyMjIyBPZmZpY2UgVmlnbmV0dGUNCmBgYHtyfQ0KIyBPZmZpY2UgdmlnbmV0dGUgdC10ZXN0DQpTdHVkeV8xYV9vZmZpY2VfdCA8LSB0LnRlc3QoU3R1ZHlfMWEkT2ZmaWNlQXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikgDQojIyAnbGVzcycgaXMgZm9yIG9uZS10YWlsZWQgcC12YWx1ZSBiZWNhdXNlIG9mIHRoZSBub24tdGVtcHRlZCA+IHRlbXB0ZWQgaHlwb3RoZXNpcyAocG9zaXRpdmUgbnVtYmVycyBtZWFuIG5vbi10ZW1wdGVkID4gdGVtcHRlZCkNCnByaW50KFN0dWR5XzFhX29mZmljZV90KQ0KDQpTdHVkeV8xYV9vZmZpY2VfdF8yc2lkZSA8LSB0LnRlc3QoU3R1ZHlfMWEkT2ZmaWNlQXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSANCiMjICd0d28uc2lkZWQnIGlzIHRvIGdldCB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgaW4gYm90aCBkaXJlY3Rpb25zDQpwcmludChTdHVkeV8xYV9vZmZpY2VfdF8yc2lkZSkNCg0KIyByZXR1cm5zIGNvaGVuJ3MgZA0KZWZmc2l6ZTo6Y29oZW4uZChTdHVkeV8xYSRPZmZpY2VBdmVyYWdlLA0KICAgICAgICAgICAgICAgICBmID0gTkEsDQogICAgICAgICAgICAgICAgIG11ID0gMCwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEpDQpgYGANCiMjIyMgQWR1bHRlcnkgVmlnbmV0dGUNCmBgYHtyfQ0KIyBBZHVsdGVyeSB2aWduZXR0ZSB0LXRlc3QNClN0dWR5XzFhX2FkdWx0ZXJ5X3QgPC0gdC50ZXN0KFN0dWR5XzFhJEFkdWx0ZXJ5QXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikgDQojIyAnbGVzcycgaXMgZm9yIG9uZS10YWlsZWQgcC12YWx1ZSBiZWNhdXNlIG9mIHRoZSBub24tdGVtcHRlZCA+IHRlbXB0ZWQgaHlwb3RoZXNpcyAocG9zaXRpdmUgbnVtYmVycyBtZWFuIG5vbi10ZW1wdGVkID4gdGVtcHRlZCkNCnByaW50KFN0dWR5XzFhX2FkdWx0ZXJ5X3QpDQoNClN0dWR5XzFhX2FkdWx0ZXJ5X3RfMnNpZGUgPC0gdC50ZXN0KFN0dWR5XzFhJEFkdWx0ZXJ5QXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSANCiMjICd0d28uc2lkZWQnIGlzIHRvIGdldCB1bmNlcnRhaW50eSBlc3RpbWF0ZXMgaW4gYm90aCBkaXJlY3Rpb25zDQpwcmludChTdHVkeV8xYV9hZHVsdGVyeV90XzJzaWRlKQ0KDQojIHJldHVybnMgY29oZW4ncyBkDQplZmZzaXplOjpjb2hlbi5kKFN0dWR5XzFhJEFkdWx0ZXJ5QXZlcmFnZSwNCiAgICAgICAgICAgICAgICAgZiA9IE5BLA0KICAgICAgICAgICAgICAgICBtdSA9IDAsDQogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KYGBgDQojIyMjIEtpZG5leSBWaWduZXR0ZQ0KYGBge3J9DQojIEtpZG5leSB2aWduZXR0ZSB0LXRlc3QNClN0dWR5XzFhX2tpZG5leV90IDwtIHQudGVzdChTdHVkeV8xYSRLaWRuZXlBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSANCiMjICdsZXNzJyBpcyBmb3Igb25lLXRhaWxlZCBwLXZhbHVlIGJlY2F1c2Ugb2YgdGhlIG5vbi10ZW1wdGVkID4gdGVtcHRlZCBoeXBvdGhlc2lzIChwb3NpdGl2ZSBudW1iZXJzIG1lYW4gbm9uLXRlbXB0ZWQgPiB0ZW1wdGVkKQ0KcHJpbnQoU3R1ZHlfMWFfa2lkbmV5X3QpDQoNClN0dWR5XzFhX2tpZG5leV90XzJzaWRlIDwtIHQudGVzdChTdHVkeV8xYSRLaWRuZXlBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFN0dWR5XzFhX2tpZG5leV90XzJzaWRlKQ0KDQojIHJldHVybnMgY29oZW4ncyBkDQplZmZzaXplOjpjb2hlbi5kKFN0dWR5XzFhJEtpZG5leUF2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCmBgYA0KDQojIyBJbnRlcmFjdGlvbiB7LnRhYnNldH0NCg0KIyMjIFJlcGVhdGVkLU1lYXN1cmVzIEFOT1ZBDQoNClRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdCBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gbWVhbiB2aXJ0dW9zaXR5IGRlcGVuZGluZyBvbiBjb25kaXRpb24gKGkuZS4sIG5vbi1tb3JhbCB2cyBtb3JhbCkuDQpgYGB7cn0NCiMgUHJlcGFyZSBkYXRhIGJ5IHVzaW5nIHBpdm90X2xvbmdlciBvbiBhIG5ldyBkYXRhc2V0DQpTdHVkeV8xYV9hbm92YSA8LSBTdHVkeV8xYSAlPiUNCiAgZHBseXI6OnNlbGVjdChjKFJlc3BvbnNlSWQsIE1vcmFsQXZlcmFnZSwgTm9ubW9yYWxBdmVyYWdlKSklPiUgDQogIGdyb3VwX2J5KFJlc3BvbnNlSWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IChjKE1vcmFsQXZlcmFnZSxOb25tb3JhbEF2ZXJhZ2UpKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmlydHVvc2l0eUF2ZXJhZ2UiKQ0KDQojIFJlcGVhdGVkLU1lYXVzdXJlcyBBTk9WQQ0KU3R1ZHlfMWFfaW50ZXJhY3Rpb25fYW92IDwtIGFvdihWaXJ0dW9zaXR5QXZlcmFnZX5Db25kaXRpb24gKyBFcnJvcihhcy5mYWN0b3IoUmVzcG9uc2VJZCkpLCBkYXRhID0gU3R1ZHlfMWFfYW5vdmEpDQpzdW1tYXJ5KFN0dWR5XzFhX2ludGVyYWN0aW9uX2FvdikNCmBgYA0KIyMjIFBhaXJlZC1TYW1wbGVzIHQtVGVzdA0KDQpSZXBsaWNhdGVzIHJlc3VsdHMgb2YgdGhlIHJlcGVhdGVkLW1lYXN1cmVzIEFOT1ZBIChCZXJtYW4gJiBTbWFsbCB1c2VkIEFOT1ZBcyByYXRoZXIgdGhhbiBwYWlyZWQtc2FtcGxlcyB0LXRlc3RzIGZvciB0aGUgaW50ZXJhY3Rpb24gdGVzdCkuIFRoZXNlIHRlc3RzIGFyZSBzdGF0aXN0aWNhbGx5IGlkZW50aWNhbCwgYnV0IHdlIGNvbmR1Y3QgYm90aCBpbiBjYXNlIHJlc2VhcmNoZXJzIGhhdmUgcHJlZmVyZW5jZXMgZm9yIG9uZSBvdmVyIHRoZSBvdGhlci4NCmBgYHtyfQ0KU3R1ZHlfMWFfaW50ZXJhY3Rpb25fdCA8LSB0LnRlc3QoVmlydHVvc2l0eUF2ZXJhZ2UgfiBDb25kaXRpb24sIGRhdGEgPSBTdHVkeV8xYV9hbm92YSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsIHBhaXJlZCA9IFRSVUUpDQojIyAnbGVzcycgaXMgZm9yIG9uZS10YWlsZWQgcC12YWx1ZSBiZWNhdXNlIG9mIHRoZSBub24tbW9yYWwgPiBtb3JhbCBoeXBvdGhlc2lzIChwb3NpdGl2ZSBudW1iZXJzIG1lYW4gbm9uLW1vcmFsID4gbW9yYWwpDQpTdHVkeV8xYV9pbnRlcmFjdGlvbl90DQoNClN0dWR5XzFhX2ludGVyYWN0aW9uX3RfMnNpZGUgPC0gdC50ZXN0KFZpcnR1b3NpdHlBdmVyYWdlIH4gQ29uZGl0aW9uLCBkYXRhID0gU3R1ZHlfMWFfYW5vdmEsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFN0dWR5XzFhX2ludGVyYWN0aW9uX3RfMnNpZGUpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChWaXJ0dW9zaXR5QXZlcmFnZSB+IENvbmRpdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBTdHVkeV8xYV9hbm92YSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gRikNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQoVmlydHVvc2l0eUF2ZXJhZ2UgfiBDb25kaXRpb24gfCBTdWJqZWN0KFJlc3BvbnNlSWQpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gU3R1ZHlfMWFfYW5vdmEgJT4lIGRyb3BsZXZlbHMoKSwgDQogICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFQpDQpgYGANCg0KDQojIFBlcnNvbi1MdmwgQW5hbHlzZXMgey50YWJzZXR9DQpgYGB7cn0NCiMgQ3JlYXRlIHBlcnNvbi1sZXZlbCB2YXJpYWJsZXMNClN0dWR5XzFhX3BsdmwgPC0gU3R1ZHlfMWEgJT4lIA0KICBtdXRhdGUoZml0c19oeXBvdGhlc2lzX24gPSBpZl9lbHNlKE5vbm1vcmFsQXZlcmFnZSA8IDAsIDEsIDApKSAlPiUgDQogIG11dGF0ZShmaXRzX2h5cG90aGVzaXNfZGVzc2VydCA9IGlmX2Vsc2UoRGVzc2VydEF2ZXJhZ2UgPCAwLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoZml0c19oeXBvdGhlc2lzX2d5bSA9IGlmX2Vsc2UoR3ltQXZlcmFnZSA8IDAsIDEsIDApKSAlPiUgDQogIG11dGF0ZShmaXRzX2h5cG90aGVzaXNfc2Nob29sd29yayA9IGlmX2Vsc2UoU2Nob29sd29ya0F2ZXJhZ2UgPCAwLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoZml0c19oeXBvdGhlc2lzX20gPSBpZl9lbHNlKE1vcmFsQXZlcmFnZSA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGZpdHNfaHlwb3RoZXNpc19vZmZpY2UgPSBpZl9lbHNlKE9mZmljZUF2ZXJhZ2UgPiAwLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoZml0c19oeXBvdGhlc2lzX2FkdWx0ZXJ5ID0gaWZfZWxzZShBZHVsdGVyeUF2ZXJhZ2UgPiAwLCAxLCAwKSkgJT4lIA0KICBtdXRhdGUoZml0c19oeXBvdGhlc2lzX2tpZG5leSA9IGlmX2Vsc2UoS2lkbmV5QXZlcmFnZSA+IDAsIDEsIDApKQ0KDQojIENyZWF0ZSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHBhcnRpY2lwYW50cyBmaXQgdGhlIGZ1bGwgY29tcGxleCBoeXBvdGhlc2lzIG9yIG5vdCANClN0dWR5XzFhX3BsdmwkbnVtYmVyX29mX2h5cF9maXQgPC0gcm93U3VtcyhTdHVkeV8xYV9wbHZsWywgYygiZml0c19oeXBvdGhlc2lzX20iLCAiZml0c19oeXBvdGhlc2lzX24iKV0sIG5hLnJtID0gVCkNClN0dWR5XzFhX3BsdmwgPC0gU3R1ZHlfMWFfcGx2bCAlPiUgDQogICBtdXRhdGUoZml0c19jb21wbGV4ID0gaWZfZWxzZShudW1iZXJfb2ZfaHlwX2ZpdCA9PSAyLCAiWWVzIiwgIk5vIikpDQpgYGANCg0KIyMgRGVzY3JpcHRpdmUgUGVydmFzaXZlbmVzcyB7LnRhYnNldH0NCg0KIyMjIE5vbi1Nb3JhbCBWaWduZXR0ZXMNCmBgYHtyfQ0KIyBIb3cgbWFueSBwYXJ0aWNpcGFudHMgZml0IGh5cG90aGVzaXMgZm9yIE5vbi1Nb3JhbCB2aWduZXR0ZXMNCnRhYmxlKFN0dWR5XzFhX3BsdmwkZml0c19oeXBvdGhlc2lzX24pICMgKDAgPSAibm8iOyAxID0gInllcyIpDQpgYGANCiMjIyBNb3JhbCBWaWduZXR0ZXMNCmBgYHtyfQ0KIyBIb3cgbWFueSBwYXJ0aWNpcGFudHMgZml0IGh5cG90aGVzaXMgZm9yIE1vcmFsIHZpZ25ldHRlcw0KdGFibGUoU3R1ZHlfMWFfcGx2bCRmaXRzX2h5cG90aGVzaXNfbSkgIyAoMCA9ICJubyI7IDEgPSAieWVzIikNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7cn0NCiMgSG93IG1hbnkgcGFydGljaXBhbnRzIGZpdCBjb21wbGV4IGludGVyYWN0aW9uIGh5cG90aGVzaXMgKGkuZS4sIGluIE5vbi1Nb3JhbCB2aWduZXR0ZXM6IHRlbXB0ZWQgPiBub24tdGVtcHRlZDsgaW4gTW9yYWwgdmlnbmV0dGVzOiBub24tdGVtcHRlZCA+IHRlbXB0ZWQpDQp0YWJsZShTdHVkeV8xYV9wbHZsJGZpdHNfY29tcGxleCkgIyAoMCA9ICJubyI7IDEgPSAieWVzIikNCmBgYA0KDQojIyBSYW5kb21pemF0aW9uIFRlc3QNClRoaXMgdGVzdCBpcyBvbmx5IHBvc3NpYmxlIGZvciB0aGUgY29tcGxleCBpbnRlcmFjdGlvbiBoeXBvdGhlc2lzLCBhcyByYW5kb21seSBzaHVmZmxpbmcgd2l0aGluLWNvbmRpdGlvbiBkYXRhIHdvdWxkIHlpZWxkIHRoZSBzYW1lIHJlc3VsdCBhY3Jvc3Mgc2h1ZmZsaW5ncy4NCmBgYHtyfQ0KbGlicmFyeShtb3NhaWMpICMgZm9yIHJhbmRvbWx5IHNodWZmbGluZyBkYXRhDQoNClN0dWR5XzFhX3JhbmRvbSA8LSBTdHVkeV8xYV9wbHZsICU+JSANCiAgZHBseXI6OnNlbGVjdChjKFJlc3BvbnNlSWQsIE1vcmFsQXZlcmFnZSwgTm9ubW9yYWxBdmVyYWdlKSkNCg0KU3R1ZHlfMWFfcmFuZG9tIDwtIFN0dWR5XzFhX3JhbmRvbSAlPiUgDQogIG11dGF0ZSgiSW50ZXJhY3Rpb24iID0gY2FzZV93aGVuKA0KICAgIChNb3JhbEF2ZXJhZ2UgPT0gMCAmIE5vbm1vcmFsQXZlcmFnZSA9PSAwKSB+ICJaZXJvLCBaZXJvLCBaZXJvIiwNCiAgICAoTW9yYWxBdmVyYWdlID09IDAgJiBOb25tb3JhbEF2ZXJhZ2UgPCAwKSB+ICJaZXJvLCBOZWcsIFBvcyIsDQogICAgKE1vcmFsQXZlcmFnZSA9PSAwICYgTm9ubW9yYWxBdmVyYWdlID4gMCkgfiAiWmVybywgUG9zLCBOZWciLA0KICAgIChNb3JhbEF2ZXJhZ2UgPCAwICYgTm9ubW9yYWxBdmVyYWdlID09IDApIH4gIk5lZywgWmVybywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlIDwgMCAmIE5vbm1vcmFsQXZlcmFnZSA8IDAgJiBNb3JhbEF2ZXJhZ2UgPT0gTm9ubW9yYWxBdmVyYWdlKSB+ICJOZWcsIE5lZywgWmVybyIsDQogICAgKE1vcmFsQXZlcmFnZSA8IDAgJiBOb25tb3JhbEF2ZXJhZ2UgPiAwKSB+ICJOZWcsIFBvcywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlIDwgMCAmIE5vbm1vcmFsQXZlcmFnZSA8IDAgJiBNb3JhbEF2ZXJhZ2UgPiBOb25tb3JhbEF2ZXJhZ2UpIH4gIk5lZywgTmVnLCBQb3MiLA0KICAgIChNb3JhbEF2ZXJhZ2UgPCAwICYgTm9ubW9yYWxBdmVyYWdlIDwgMCAmIE1vcmFsQXZlcmFnZSA8IE5vbm1vcmFsQXZlcmFnZSkgfiAiTmVnLCBOZWcsIE5lZyIsDQogICAgKE1vcmFsQXZlcmFnZSA+IDAgJiBOb25tb3JhbEF2ZXJhZ2UgPT0gMCkgfiAiUG9zLCBaZXJvLCBQb3MiLA0KICAgIChNb3JhbEF2ZXJhZ2UgPiAwICYgTm9ubW9yYWxBdmVyYWdlIDwgMCkgfiAiUG9zLCBOZWcsIFBvcyIsICMgdGhpcyBpcyB0aGUgcHJlZGljdGVkIHBhdHRlcm4NCiAgICAoTW9yYWxBdmVyYWdlID4gMCAmIE5vbm1vcmFsQXZlcmFnZSA+IDAgJiBNb3JhbEF2ZXJhZ2UgPT0gTm9ubW9yYWxBdmVyYWdlKSB+ICJQb3MsIFBvcywgWmVybyIsDQogICAgKE1vcmFsQXZlcmFnZSA+IDAgJiBOb25tb3JhbEF2ZXJhZ2UgPiAwICYgTW9yYWxBdmVyYWdlIDwgTm9ubW9yYWxBdmVyYWdlKSB+ICJQb3MsIFBvcywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlID4gMCAmIE5vbm1vcmFsQXZlcmFnZSA+IDAgJiBNb3JhbEF2ZXJhZ2UgPiBOb25tb3JhbEF2ZXJhZ2UpIH4gIlBvcywgUG9zLCBQb3MiKSkNCg0KcHJvcF9TdHVkeV8xYSA8LSBwcm9wKCB+IEludGVyYWN0aW9uID09ICJQb3MsIE5lZywgUG9zIiwgZGF0YSA9IFN0dWR5XzFhX3JhbmRvbSkgIyBjcmVhdGUgZGVzY3JpcHRpdmUgcHJvcG9ydGlvbiBvZiBjbGFpbWVkIHBhdHRlcm4gZnJvbSBCZXJtYW4gJiBTbWFsbA0KcHJvcF9TdHVkeV8xYV9kcCA8LSB1bm5hbWUocHJvcF9TdHVkeV8xYVsxXSkgIyBnZXQgZGVzY3JpcHRpdmUgcHJvcG9ydGlvbiBwcm9wb3J0aW9uIGZvciBpbnRlcmFjdGlvbg0KDQpuc2ltIDwtIDEwMDAgIyBudW1iZXIgb2YgcmFuZG9tIGRhdGFzZXRzIHRvIGdlbmVyYXRlDQpudWxscHJvcF9TdHVkeV8xYSA8LSByZXAoTkEsIG5zaW0pICMgY3JlYXRpbmcgZW1wdHkgYmluDQoNCmZvciAoaSBpbiAxOm5zaW0pIHsgIyBmb3IgbG9vcCB0byBkbyByYW5kb20gc2h1ZmZsaW5nIGFjcm9zcyBuc2ltIGRhdGFzZXRzIGFuZCBjYWxjdWxhdGUgcHJvcG9ydGlvbnMgaW4gdGhvc2UgcmFuZG9tbHkgc2h1ZmZsZWQgZGF0YXNldHMNCiAgI3Blcm11dGF0aW9uLCBzaXplIGVxdWFsIHRvIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgZm9yIGVhY2ggY29uZGl0aW9uDQogIFN0dWR5XzFhX3JhbmRvbSROb25tb3JhbEF2ZXJhZ2VSIDwtIHNodWZmbGUoU3R1ZHlfMWFfcmFuZG9tJE5vbm1vcmFsQXZlcmFnZSkgIyBzaHVmZmxpbmcgJ05vbi1Nb3JhbCcgdmFsdWVzICANCiAgU3R1ZHlfMWFfcmFuZG9tJE1vcmFsQXZlcmFnZVIgPC0gc2h1ZmZsZShTdHVkeV8xYV9yYW5kb20kTW9yYWxBdmVyYWdlKSAjIHNodWZmbGluZyAnTW9yYWwnIHZhbHVlcw0KICANCiAgIyMgQ3JlYXRpbmcgdmFyaWFibGUgdGhhdCBkaXN0aW5ndWlzaGVzIFBzIHdobyBzaG93ZWQgcHJlZGljdGVkIChjbGFpbWVkKSBwYXR0ZXJuIGZyb20gUHMgd2hvIGRpZCBub3QNCiAgU3R1ZHlfMWFfUiA8LSBTdHVkeV8xYV9yYW5kb20gJT4lDQogIG11dGF0ZSgiSW50ZXJhY3Rpb25SIiA9IGNhc2Vfd2hlbigNCiAgICAoTW9yYWxBdmVyYWdlUiA9PSAwICYgTm9ubW9yYWxBdmVyYWdlUiA9PSAwKSB+ICJaZXJvLCBaZXJvLCBaZXJvIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA9PSAwICYgTm9ubW9yYWxBdmVyYWdlUiA8IDApIH4gIlplcm8sIE5lZywgUG9zIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA9PSAwICYgTm9ubW9yYWxBdmVyYWdlUiA+IDApIH4gIlplcm8sIFBvcywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA8IDAgJiBOb25tb3JhbEF2ZXJhZ2VSID09IDApIH4gIk5lZywgWmVybywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA8IDAgJiBOb25tb3JhbEF2ZXJhZ2VSIDwgMCAmIE1vcmFsQXZlcmFnZVIgPT0gTm9ubW9yYWxBdmVyYWdlUikgfiAiTmVnLCBOZWcsIFplcm8iLA0KICAgIChNb3JhbEF2ZXJhZ2VSIDwgMCAmIE5vbm1vcmFsQXZlcmFnZVIgPiAwKSB+ICJOZWcsIFBvcywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA8IDAgJiBOb25tb3JhbEF2ZXJhZ2VSIDwgMCAmIE1vcmFsQXZlcmFnZVIgPiBOb25tb3JhbEF2ZXJhZ2VSKSB+ICJOZWcsIE5lZywgUG9zIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA8IDAgJiBOb25tb3JhbEF2ZXJhZ2VSIDwgMCAmIE1vcmFsQXZlcmFnZVIgPCBOb25tb3JhbEF2ZXJhZ2VSKSB+ICJOZWcsIE5lZywgTmVnIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA+IDAgJiBOb25tb3JhbEF2ZXJhZ2VSID09IDApIH4gIlBvcywgWmVybywgUG9zIiwNCiAgICAoTW9yYWxBdmVyYWdlUiA+IDAgJiBOb25tb3JhbEF2ZXJhZ2VSIDwgMCkgfiAiUG9zLCBOZWcsIFBvcyIsICMgdGhpcyBpcyB0aGUgcHJlZGljdGVkIHBhdHRlcm4NCiAgICAoTW9yYWxBdmVyYWdlUiA+IDAgJiBOb25tb3JhbEF2ZXJhZ2VSID4gMCAmIE1vcmFsQXZlcmFnZVIgPT0gTm9ubW9yYWxBdmVyYWdlUikgfiAiUG9zLCBQb3MsIFplcm8iLA0KICAgIChNb3JhbEF2ZXJhZ2VSID4gMCAmIE5vbm1vcmFsQXZlcmFnZVIgPiAwICYgTW9yYWxBdmVyYWdlUiA8IE5vbm1vcmFsQXZlcmFnZVIpIH4gIlBvcywgUG9zLCBOZWciLA0KICAgIChNb3JhbEF2ZXJhZ2VSID4gMCAmIE5vbm1vcmFsQXZlcmFnZVIgPiAwICYgTW9yYWxBdmVyYWdlUiA+IE5vbm1vcmFsQXZlcmFnZVIpIH4gIlBvcywgUG9zLCBQb3MiKSkNCg0KICANCiAgbnVsbHByb3BfVEZfU3R1ZHlfMWEgPC1wcm9wKCB+IEludGVyYWN0aW9uUiA9PSAiUG9zLCBOZWcsIFBvcyIsIGRhdGEgPSBTdHVkeV8xYV9SKSAjIGNyZWF0ZSBwcm9wb3J0aW9uIHZhbHVlIG9mIGNsYWltZWQgZGlyZWN0aW9uIA0KICBudWxscHJvcF9TdHVkeV8xYVtpXTwtIHVubmFtZShudWxscHJvcF9URl9TdHVkeV8xYVsxXSkgIyBnZXQgY2xhaW1lZCBwYXR0ZXJuIHByb3BvcnRpb24gZm9yIHJhbmRvbWx5IHNodWZmbGVkIGRhdGEgYW5kIHJlcGVhdCBmb3IgZWFjaCBuc2ltIGRhdGFzZXQNCn0NCg0KZ2ZfaGlzdG9ncmFtKCB+IG51bGxwcm9wX1N0dWR5XzFhLCBmaWxsID0gfiAobnVsbHByb3BfU3R1ZHlfMWEgPj0gcHJvcF9TdHVkeV8xYV9kcCkpICMgY3JlYXRlIGhpc3RvZ3JhbSBvZiBob3cgbWFueSByYW5kb21seSBzaHVmZmxlZCBkYXRhc2V0cyBsZWFkIHRvIGEgcHJvcCB2YWx1ZSBzaW1pbGFyIHRvIG9yIGdyZWF0ZXIgdGhhbiBlbXBpcmljYWwgcHJvcA0KDQojYyhjaGFuY2UpLXZhbHVlIGZvciBlbXBpcmljYWwgcHJvcG9ydGlvbiAoc2ltaWxhciB0byBHcmljZSdzIGMtdmFsdWVzIGNvbXB1dGVkIGluIGhpcyBPT00gc29mdHdhcmUpDQpwcm9wKCB+IG51bGxwcm9wX1N0dWR5XzFhID49IHByb3BfU3R1ZHlfMWFfZHApICMgc3VnZ2VzdHMgdGhhdCBlbXBpcmljYWwgaW50ZXJhY3Rpb24gcHJvcG9ydGlvbiBpcyB2ZXJ5IGxpa2VseSB0byBoYXZlIG9jY3VycmVkIGJ5IGNoYW5jZQ0KYGBgDQoNCg0KIyMgRnJlcXVlbnRpc3QgUHJldmFsZW5jZSB7LnRhYnNldH0NCmBgYHtyfQ0KIyBDUkVBVEUgTkVDRVNTQVJZIEZSRVFVRU5USVNUIEZVTkNUSU9OIChjb2RlIGFkYXB0ZWQgZnJvbSBEb25oYXVzZXIgZXQgYWwuJ3MgKDIwMTgpIE1BVExBQiBjb2RlKQ0KDQpwcmV2YWxlbmNlX3Rlc3QgPC0gZnVuY3Rpb24ob2JzZXJ2ZWQsIGFscGhhX2luZD0wLjA1LCBiZXRhX2luZD0xLCBhbHBoYV9ncm91cD0wLjA1LCBnYW1tYV8wPTAuNSkgew0KICANCiAgIyBJbnB1dHM6DQogICMgb2JzZXJ2ZWQgICAgPSB2ZWN0b3Igb2YgcC12YWx1ZXMgT1IgdmVjdG9yIHdpdGggdHdvIHZhbHVlcywgZS5nLiwgJ2MocG9zaXRpdmUgY2FzZXMsIHRvdGFsIGNhc2VzKScNCiAgIyBhbHBoYV9pbmQgICA9IGFscGhhIHRocmVzaG9sZCBmb3IgcGVyc29uLWxldmVsIHRlc3RzLCBpZiAnb2JzZXJ2ZWQnID0gdmVjdG9yIG9mIHAtdmFsdWVzICh0eXBpY2FsbHkgc2V0IHRvIC4wNSkNCiAgIyBiZXRhX2luZCAgICA9IHNlbnNpdGl2aXR5IG9mIHBlcnNvbi1sZXZlbCB0ZXN0cyAocHJvYmFibHkgc2V0IHRvIDEuMDApDQogICMgYWxwaGFfZ3JvdXAgPSBzZWUgIm91dHB1dHMiDQogICMgZ2FtbWFfMCAgICAgPSBudWxsIGdhbW1hIHZhbHVlIGZvciBlbXBpcmljYWwgcHJldmFsZW5jZSB0byBiZSB0ZXN0ZWQgYWdhaW5zdCAoZGVmYXVsdHMgdG8gbWFqb3JpdHkgbnVsbCkNCiAgDQogICMgT3V0cHV0czoNCiAgIyBwX251bGwgICAgICA9IHAtdmFsdWUgZm9yIG1ham9yaXR5IG51bGwgb3Igd2hhdGV2ZXIgbnVsbCB5b3Ugc3BlY2lmeSBpbiB0aGUgZ2FtbWFfMCBhcmd1bWVudCAoZS5nLiwgdG8gc3BlY2lmeSBhIGdsb2JhbCBudWxsIHNldCAiZ2FtbWFfMCA9IDAiKSANCiAgIyBnYW1tYV8wICAgICA9IGhpZ2hlc3QgZ2FtbWFfMCB2YWx1ZSB0aGF0IGNhbiBiZSByZWplY3RlZCBhdCB0aHJlc2hvbGQgb2YgJ2FscGhhX2dyb3VwJyBnaXZlbiBwb3NpdGl2ZSBjYXNlcy4gTm90ZSB0aGlzIG91dHB1dCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGlucHV0IGFyZ3VtZW50DQogIGlmKHN1bShvYnNlcnZlZCA+IDEpID09IDApIHsNCiAgICBwdmFscyA8LSBvYnNlcnZlZA0KICB9IGVsc2Ugew0KICAgIHB2YWxzIDwtIGMocmVwKDAsIG9ic2VydmVkWzFdKSwgcmVwKDEsIG9ic2VydmVkWzJdLW9ic2VydmVkWzFdKSkNCiAgfQ0KICANCiAgbiA8LSBsZW5ndGgocHZhbHMpDQogIGtfb2JzIDwtIHN1bShwdmFscyA8IGFscGhhX2luZCkNCiAga3ZhbHMgPC0gMDpuDQogIGRnYW1tYSA8LSAwLjAwMQ0KICBnYW1tYXZhbHMgPC0gc2VxKDAsIDEsIGRnYW1tYSkNCiAgDQogIHBfa19nYW1tYSA8LSBtYXRyaXgoMCwgbnJvdz1sZW5ndGgoZ2FtbWF2YWxzKSwgbmNvbD1sZW5ndGgoa3ZhbHMpKQ0KICBwX2trX2dhbW1hIDwtIG1hdHJpeCgwLCBucm93PWxlbmd0aChnYW1tYXZhbHMpLCBuY29sPWxlbmd0aChrdmFscykpDQogIA0KICBmb3IoaUdhbSBpbiAxOmxlbmd0aChnYW1tYXZhbHMpKSB7DQogICAgcF9wb3MgPC0gZ2FtbWF2YWxzW2lHYW1dICogYmV0YV9pbmQgKyAoMSAtIGdhbW1hdmFsc1tpR2FtXSkgKiBhbHBoYV9pbmQNCiAgICBwX25lZyA8LSBnYW1tYXZhbHNbaUdhbV0gKiAoMSAtIGJldGFfaW5kKSArICgxIC0gZ2FtbWF2YWxzW2lHYW1dKSAqICgxIC0gYWxwaGFfaW5kKQ0KICAgIGZvcihpSyBpbiAxOmxlbmd0aChrdmFscykpIHsNCiAgICAgIGsgPC0ga3ZhbHNbaUtdDQogICAgICB0bXAgPC0gY2hvb3NlKG4sIGspICogcF9wb3NeayAqIHBfbmVnXihuIC0gaykNCiAgICAgIHBfa19nYW1tYVtpR2FtLCBpS10gPC0gdG1wDQogICAgICBwX2trX2dhbW1hW2lHYW0sIGlLXSA8LSAxIC0gc3VtKHBfa19nYW1tYVtpR2FtLCAxOmlLXSkgKyB0bXANCiAgICB9DQogIH0NCiAgDQogIGlLIDwtIHdoaWNoKGt2YWxzID09IGtfb2JzKQ0KICBwX251bGwgPC0gcF9ra19nYW1tYVt3aGljaChnYW1tYXZhbHMgPT0gZ2FtbWFfMCksIGlLXQ0KICANCiAgaW5kZXggPC0gc3VtKHBfa2tfZ2FtbWFbLCBpS10gPCBhbHBoYV9ncm91cCkNCiAgaWYoaW5kZXggIT0gMCkgew0KICAgIGdhbW1hXzAgPC0gZ2FtbWF2YWxzW2luZGV4XQ0KICB9IGVsc2Ugew0KICAgIGdhbW1hXzAgPC0gMA0KICB9DQogIA0KICByZXR1cm4obGlzdChwX251bGw9cF9udWxsLCBnYW1tYV8wPWdhbW1hXzAsIHBfa2tfZ2FtbWE9cF9ra19nYW1tYSwgZ2FtbWF2YWxzPWdhbW1hdmFscywgcF9rX2dhbW1hPXBfa19nYW1tYSkpDQp9DQoNCmBgYA0KDQojIyMgTm9uLU1vcmFsIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gNjkgICMgbnVtYmVyIG9mIHBlcnNvbnMgbWF0Y2hpbmcgaHlwb3RoZXNpemVkIC8gZ3JvdXAtbGV2ZWwgcGF0dGVybg0KbiA8LSA2OSs5NyAjIHRvdGFsIE4NCm5vbm1vcmFsX2ZyZXFQcmV2YWxlbmNlIDwtIHByZXZhbGVuY2VfdGVzdChjKGssIG4pKSAjIHNwZWNpZnkgcG9zaXRpdmUgY2FzZXMgb3V0IG9mIHRvdGFsIGNhc2VzIGZvciBwcmV2IHRlc3QgZnVuY3Rpb24NCm5vbm1vcmFsX2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCiMgT3JpZ2luYWxseSBwcmludGVkOiAwLjk5ODEzMzUNCmBgYA0KIyMjIE1vcmFsIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gMTI5ICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTI5KzM3ICMgdG90YWwgTg0KbW9yYWxfZnJlcVByZXZhbGVuY2UgPC0gcHJldmFsZW5jZV90ZXN0KGMoaywgbikpICMgc3BlY2lmeSBwb3NpdGl2ZSBjYXNlcyBvdXQgb2YgdG90YWwgY2FzZXMgZm9yIHByZXYgdGVzdCBmdW5jdGlvbg0KbW9yYWxfZnJlcVByZXZhbGVuY2UkcF9udWxsICMgcHJpbnQgcC12YWx1ZSB0ZXN0aW5nIGFnYWluc3QgbWFqb3JpdHkgbnVsbA0KIyBPcmlnaW5hbGx5IHByaW50ZWQ6IDAuMDAwMDAwMDAwMDE2NTI2ODMNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7cn0NCg0KayA8LSA1MSAgIyBudW1iZXIgb2YgcGVyc29ucyBtYXRjaGluZyBoeXBvdGhlc2l6ZWQgLyBncm91cC1sZXZlbCBwYXR0ZXJuDQpuIDwtIDUxKzExNSAjIHRvdGFsIE4NCnByaW1hcnlfZnJlcVByZXZhbGVuY2UgPC0gcHJldmFsZW5jZV90ZXN0KGMoaywgbikpICMgc3BlY2lmeSBwb3NpdGl2ZSBjYXNlcyBvdXQgb2YgdG90YWwgY2FzZXMgZm9yIHByZXYgdGVzdCBmdW5jdGlvbg0KcHJpbWFyeV9mcmVxUHJldmFsZW5jZSRwX251bGwgIyBwcmludCBwLXZhbHVlIHRlc3RpbmcgYWdhaW5zdCBtYWpvcml0eSBudWxsDQojIE9yaWdpbmFsbHkgcHJpbnRlZDogMC45OTgxMzM1DQpgYGANCg0KIyMgQmF5ZXNpYW4gUHJldmFsZW5jZSB7LnRhYnNldH0NCmBgYHtyfQ0KIyBDUkVBVEUgTkVDRVNTQVJZIEJBWUVTIEZVTkNUSU9OUyAoY29kZSBmcm9tIEluY2UgZXQgYWwuLCAyMDIxKQ0KbGlicmFyeShubGVxc2x2KQ0KDQpiYXllc3ByZXZfbWFwIDwtIGZ1bmN0aW9uKGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gbWF4aW11bSBhIHBvc3RlcmlvcmkgZXN0aW1hdGUgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hDQogICMgdW5kZXIgYSB1bmlmb3JtIHByaW9yDQogICMgDQogICMgQXJnczoNCiAgIyAgazogbnVtYmVyIG9mIHBhcnRpY2lwYW50cy90ZXN0cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgIG46IHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMvdGVzdHMNCiAgIyAgYTogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyAgYjogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgZ20gPC0gKGsvbiAtYSkvKGItYSkNCiAgaWYoZ20gPDApIGdtIDwtIDANCiAgaWYoZ20+MSkgZ20gPC0gMQ0KICByZXR1cm4oZ20pDQp9IA0KDQpiYXllc3ByZXZfcG9zdGVyaW9yIDwtIGZ1bmN0aW9uKHgsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gcG9zdGVyaW9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBnYW1tYSB1bmRlciBhIHVuaWZvcm0gcHJpb3INCiAgIw0KICAjIEFyZ3M6DQogICMgeCA6IHZhbHVlcyBvZiBnYW1tYSBhdCB3aGljaCB0byBldmFsdWF0ZSB0aGUgcG9zdGVyaW9yIGRlbnNpdHkNCiAgIyBrIDogbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgbiA6IHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMNCiAgIyBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyBiIDogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgbTEgPC0gIGsgKyAxDQogIG0yIDwtIG4gLSBrICsgMQ0KICB0aGV0YSA8LSBhICsgKGItYSkqeA0KICBwb3N0IDwtIChiIC1hKSpkYmV0YSh0aGV0YSxtMSwgbTIpDQogIHBvc3QgPC0gcG9zdC8ocGJldGEoYiwgbTEsIG0yKSAtIHBiZXRhKGEsIG0xLCBtMikpDQogIHJldHVybihwb3N0KQ0KfQ0KDQoNCmJheWVzcHJldl9ib3VuZCA8LSBmdW5jdGlvbihwLCBrLCBuLCBhPTAuMDUsIGI9MSkgew0KICAjIEJheWVzaWFuIGxvd2VyIGJvdW5kIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBnYW1tYSB1bmRlciBhIHVuaWZvcm0gcHJpb3INCiAgIw0KICAjIEFyZ3M6DQogICMgIHAgOiBkZW5zaXR5IHRoZSBsb3dlciBib3VuZCBzaG91bGQgYm91bmQgKGUuZy4gMC45NSkNCiAgIyAgayA6IG51bWJlciBvZiBwYXJ0aWNpcGFudHMgc2lnbmlmaWNhbnQgb3V0IG9mIA0KICAjICBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjICBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyAgYiA6IHNlbnNpdGl2aXR5L2JldGEgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MSkNCiAgDQogIG0xIDwtICBrICsgMQ0KICBtMiA8LSBuIC0gayArIDENCiAgdGhfYyA8LSBxYmV0YSggcCpwYmV0YShhLCBtMSwgbTIpICsgKDEtcCkqcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgZ19jIDwtICh0aF9jIC1hKS8oYi1hKQ0KICByZXR1cm4oZ19jKQ0KfQ0KDQoNCmJheWVzcHJldl9ocGRpIDwtIGZ1bmN0aW9uKHAsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gaGlnaGVzdCBwb3N0ZXJpb3IgZGVuc2l0eSBpbnRlcnZhbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWENCiAgIyB1bmRlciBhIHVuaWZvcm0gcHJpb3INCiAgIw0KICAjIEFyZ3M6DQogICMgIHAgOiBIUERJIHRvIHJldHVybiAoZS5nLiAwLjk1IGZvciA5NSUpDQogICMgIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyAgbiA6IHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMNCiAgIyAgYSA6IGFscGhhIHZhbHVlIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTAuMDUpDQogICMgIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICBtMSA8LSBrKzENCiAgbTIgPC0gbi1rKzENCiAgDQogIGlmKG0xID09MSkgew0KICAgIGVuZHB0cyA8LSBjKGEsIHFiZXRhKCAoMSAtcCkqcGJldGEoYSwgbTEsIG0yKSArIHAqcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkgKSANCiAgICByZXR1cm4oKGVuZHB0cyAtYSkvKGItYSkpDQogIH0NCiAgDQogIGlmKG0yID09MSkgew0KICAgIGVuZHB0cyA8LSBjKCBxYmV0YSggcCpwYmV0YShhLCBtMSwgbTIpICsgKDEtIHApKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSAsIGIpIA0KICAgIHJldHVybiggKGVuZHB0cy1hKS8oYi1hKSkNCiAgfQ0KICANCiAgaWYoazw9IG4qYSkgew0KICAgIGVuZHB0cyA8LSBjKGEsIHFiZXRhKCAoMSAtcCkqcGJldGEoYSwgbTEsIG0yKSArIHAqcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkgKSANCiAgICByZXR1cm4oKGVuZHB0cyAtYSkvKGItYSkpDQogIH0NCiAgDQogIGlmKGs+PSBuKmIpIHsNCiAgICBlbmRwdHMgPC0gYyggcWJldGEoIHAqcGJldGEoYSwgbTEsIG0yKSArICgxLSBwKSogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkgLCBiKSANCiAgICByZXR1cm4oIChlbmRwdHMtYSkvKGItYSkpDQogIH0NCiAgDQogIA0KICBnIDwtIGZ1bmN0aW9uKHgsIG0xLCBtMiwgYSwgYiwgcCApIHsNCiAgICB5IDwtIG51bWVyaWMoMikNCiAgICB5WzFdIDwtICBwYmV0YSh4WzJdLCBtMSwgbTIpIC0gcGJldGEoeFsxXSwgbTEsIG0yKSAtIHAqKHBiZXRhKGIsIG0xLCBtMikgLSBwYmV0YShhLCBtMSwgbTIpKQ0KICAgIHlbMl0gPC0gbG9nKGRiZXRhKHhbMl0sIG0xLCBtMikpIC0gbG9nKGRiZXRhKHhbMV0sIG0xLCBtMikpDQogICAgcmV0dXJuKHkpDQogIH0NCiAgDQogIHhfaW5pdCA8LSBudW1lcmljKDIpDQogIA0KICBwMSA8LSAoMS1wKS8yIA0KICBwMiA8LSAoMSArcCkvMg0KICANCiAgeF9pbml0WzFdIDwtIHFiZXRhKCAoMSAtcDEpKnBiZXRhKGEsIG0xLCBtMikgKyBwMSogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgeF9pbml0WzJdIDwtIHFiZXRhKCAoMSAtcDIpKnBiZXRhKGEsIG0xLCBtMikgKyBwMiogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgDQogIG9wdCA8LSBubGVxc2x2KHhfaW5pdCwgZywgbWV0aG9kID0iTmV3dG9uIiwgY29udHJvbD1saXN0KG1heGl0PTEwMDApLCBtMT1tMSwgbTI9bTIsIGE9YSwgYj1iLCBwPXApDQogIA0KICBpZiAob3B0JHRlcm1jZCA9PTEpICBwcmludCgiY29udmVyZ2VuY2UgYWNoaWV2ZWQiKSANCiAgaWYgKG9wdCR0ZXJtY2QgIT0gMSkgIHByaW50KCJmYWlsZWQgdG8gY29udmVyZ2UiKSANCiAgDQogIHRlbXAgPC0gb3B0JHgNCiAgaWYgKHRlbXBbMV0gPGEpIHsNCiAgICB0ZW1wWzFdIDwtIGENCiAgICB0ZW1wWzJdIDwtIHFiZXRhKCAoMSAtcCkqcGJldGEoYSwgbTEsIG0yKSArIHAqIHBiZXRhKGIsIG0xLCBtMiksIG0xLCBtMiApDQogIH0NCiAgaWYgKHRlbXBbMl0gPiBiKSB7DQogICAgdGVtcFsxXSA8LSBxYmV0YSggcCpwYmV0YShhLCBtMSwgbTIpICsgKDEtcCkqIHBiZXRhKGIsIG0xLCBtMiksIG0xLCBtMiApDQogICAgdGVtcFsyXSA8LSBiDQogIH0NCiAgZW5kcHRzIDwtICh0ZW1wIC1hKS8oYi1hKQ0KICByZXR1cm4oZW5kcHRzKSANCn0NCg0KDQpiYXllc3ByZXZfcG9zdGVyaW9ycHJvYiA8LSBmdW5jdGlvbih4LCBrLCBuLCBhPTAuMDUsIGI9MSkgew0KICAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvdXIgb2YgdGhlIHBvcHVsYXRpb24gcHJldmFsZW5jZSBnYW1tYSBiZWluZyBncmVhdGVyIHRoYW4geA0KICAjDQogICMgQXJnczoNCiAgIyB4IDogdmFsdWVzIG9mIGdhbW1hIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCiAgIyBrIDogbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgbiA6IHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMNCiAgIyBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyBiIDogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgdGhldGEgPC0gYSArIChiLWEpKngNCiAgbTEgPC0gIGsgKyAxDQogIG0yIDwtIG4gLSBrICsgMQ0KICBwIDwtIChwYmV0YShiLG0xLG0yKS1wYmV0YSh0aGV0YSxtMSxtMikpIC8gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKGEsbTEsbTIpKQ0KICByZXR1cm4ocCkNCiAgDQp9DQoNCmJheWVzcHJldl9wb3N0ZXJpb3Jsb2dvZGRzIDwtIGZ1bmN0aW9uKHgsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gcG9zdGVyaW9yIGxvZy1vZGRzIGluIGZhdm91ciBvZiB0aGUgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGJlaW5nIGdyZWF0ZXIgdGhhbiB4DQogICMNCiAgIyBBcmdzOg0KICAjIHggOiBsb2ctb2RkcyB0aHJlc2hvbGQNCiAgIyBrIDogbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgbiA6IHRvdGFsIG51bWJlciBvZiBwYXJ0aWNpcGFudHMNCiAgIyBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyBiIDogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgdGhldGEgPC0gYSArIChiLWEpKngNCiAgbTEgPC0gIGsgKyAxDQogIG0yIDwtIG4gLSBrICsgMQ0KICBwIDwtIChwYmV0YShiLG0xLG0yKS1wYmV0YSh0aGV0YSxtMSxtMikpIC8gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKGEsbTEsbTIpKQ0KICBsbzwtIGxvZyhwIC8gKDEgLSBwKSkNCiAgcmV0dXJuKGxvKQ0KICANCn0NCmBgYA0KDQojIyMgTm9uLU1vcmFsIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gNjkgICMgbnVtYmVyIG9mIHBlcnNvbnMgbWF0Y2hpbmcgaHlwb3RoZXNpemVkIC8gZ3JvdXAtbGV2ZWwgcGF0dGVybg0KbiA8LSA2OSs5NyAjIHRvdGFsIE4NCnggPC0gMC41MCAjIG1pbm9yaXR5IGN1dC1vZmYgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCnhfMCA8LSAwLjAwICMgZ2xvYmFsIG51bGwgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCm1hcCA9IGJheWVzcHJldl9tYXAoaywgbikgIyBnZXQgbWF4aW11bSBhIHBvc3RlcmlvcmkgKE1BUCkgZXN0aW1hdGUgKGkuZS4sIHRoZSBsaWtlbGllc3QgcGVyc29uLWxldmVsIHByZXZhbGVuY2UgcG9wdWxhdGlvbiB2YWx1ZSkNCmludCA9IGJheWVzcHJldl9ocGRpKDAuOTYsIGssIG4pICMgZ2V0IDk2JSBIUERJcw0KaTEgPSBpbnRbMV0gIyBnZXQgbG93ZXIgOTYlIEhQREkNCmkyID0gaW50WzJdICMgZ2V0IHVwcGVyIDk2JSBIUERJDQpwcmludChjKGkxLCBtYXAgLGkyKSkgIyBwcmludCBsb3dlciA5NiBIUERJLCBtYXAgZXN0aW1hdGUsIGFuZCB1cHBlciA5NiBIUERJDQpiYXllc3ByZXZfcG9zdGVyaW9ycHJvYih4LCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHgNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHhfMCwgaywgbikgIyBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgaW4gZmF2b3Igb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGJlaW5nIGdyZWF0ZXIgdGhhbiB4XzANCg0KIyBPUklHSU5BTExZIFBSSU5URUQ6IDAuMzA0NTY5MiAwLjM4NDkwODEgMC40NjgyMDU0DQoNCmBgYA0KIyMjIE1vcmFsIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gMTI5ICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTI5KzM3ICMgdG90YWwgTg0KeCA8LSAwLjUwICMgbWlub3JpdHkgY3V0LW9mZiBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KeF8wIDwtIDAuMDAgIyBnbG9iYWwgbnVsbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KbWFwID0gYmF5ZXNwcmV2X21hcChrLCBuKSAjIGdldCBtYXhpbXVtIGEgcG9zdGVyaW9yaSAoTUFQKSBlc3RpbWF0ZSAoaS5lLiwgdGhlIGxpa2VsaWVzdCBwZXJzb24tbGV2ZWwgcHJldmFsZW5jZSBwb3B1bGF0aW9uIHZhbHVlKQ0KaW50ID0gYmF5ZXNwcmV2X2hwZGkoMC45NiwgaywgbikgIyBnZXQgOTYlIEhQRElzDQppMSA9IGludFsxXSAjIGdldCBsb3dlciA5NiUgSFBESQ0KaTIgPSBpbnRbMl0gIyBnZXQgdXBwZXIgOTYlIEhQREkNCnByaW50KGMoaTEsIG1hcCAsaTIpKSAjIHByaW50IGxvd2VyIDk2IEhQREksIG1hcCBlc3RpbWF0ZSwgYW5kIHVwcGVyIDk2IEhQREkNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHgsIGssIG4pICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBiZWluZyBncmVhdGVyIHRoYW4geA0KYmF5ZXNwcmV2X3Bvc3RlcmlvcnByb2IoeF8wLCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHhfMA0KDQojIE9SSUdJTkFMTFkgUFJJTlRFRDogMC42OTEyODAxIDAuNzY1Mzc3MyAwLjgyOTc0MjANCg0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyfQ0KDQprIDwtIDUxICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gNTErMTE1ICMgdG90YWwgTg0KeCA8LSAwLjUwICMgbWlub3JpdHkgY3V0LW9mZiBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KeF8wIDwtIDAuMDAgIyBnbG9iYWwgbnVsbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KbWFwID0gYmF5ZXNwcmV2X21hcChrLCBuKSAjIGdldCBtYXhpbXVtIGEgcG9zdGVyaW9yaSAoTUFQKSBlc3RpbWF0ZSAoaS5lLiwgdGhlIGxpa2VsaWVzdCBwZXJzb24tbGV2ZWwgcHJldmFsZW5jZSBwb3B1bGF0aW9uIHZhbHVlKQ0KaW50ID0gYmF5ZXNwcmV2X2hwZGkoMC45NiwgaywgbikgIyBnZXQgOTYlIEhQRElzDQppMSA9IGludFsxXSAjIGdldCBsb3dlciA5NiUgSFBESQ0KaTIgPSBpbnRbMl0gIyBnZXQgdXBwZXIgOTYlIEhQREkNCnByaW50KGMoaTEsIG1hcCAsaTIpKSAjIHByaW50IGxvd2VyIDk2IEhQREksIG1hcCBlc3RpbWF0ZSwgYW5kIHVwcGVyIDk2IEhQREkNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHgsIGssIG4pICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBiZWluZyBncmVhdGVyIHRoYW4geA0KYmF5ZXNwcmV2X3Bvc3RlcmlvcnByb2IoeF8wLCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHhfMA0KDQojIE9SSUdJTkFMTFkgUFJJTlRFRDogMC4xOTc1MDYxIDAuMjcwNzY3MyAwLjM1MDc5MzYNCg0KYGBgDQoNCg0KIyBQcmltYXJ5IFBsb3RzIHsudGFic2V0fQ0KYGBge3J9DQojIHNldCBicmVha3MgZm9yIGhpc3RvZ3JhbXMgLyBncm91cHMgZm9yIGhpc3RvZ3JhbSB2YWx1ZXMNCmJyZWFrc19zZWV6ZXJvIDwtIGMoLTQsIC0zLjUsIC0zLCAtMi41LCAtMiwgLTEuNSwgLTEsIC0wLjUsIC0wLjAxLCAwLjAxLCAwLjUsIDEsIDEuNSwgMiwgMi41LCAzLCAzLjUsIDQpDQpgYGANCiMjIE5vbi1Nb3JhbCBWaWduZXR0ZXMgey50YWJzZXR9DQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX25vbm1vcmFsIDwtIGdncGxvdChTdHVkeV8xYV9wbHZsLCBhZXMoeCA9IE5vbm1vcmFsQXZlcmFnZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gYnJlYWtzX3NlZXplcm8sDQogICAgICAgICAgICAgICAgIGNvbG9yID0gImdyZXkzMCIsIGZpbGwgPSBjKCIjQ0VBMzM1IiwgIiNDRUEzMzUiLCAiI0NFQTMzNSIsICIjQ0VBMzM1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiLCAiI0NFQTMzNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiLCAiI0NFQTMzNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNDRUEzMzUiLCAiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtNC4xLDQuMSksIGJyZWFrcyA9IGMoLTQsLTMsLTIsLTEsMCwxLDIsMyw0KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4xLDUwLjEpLCBicmVha3MgPSBjKDAsIDEwLCAyMCwgMzAsIDQwLCA1MCkpICsNCiAgeGxhYigiXG5HbG9iYWwgVmlydHVvc2l0eSBKdWRnbWVudCIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQoNCmdnc2F2ZSgiUzFhX25vbm1vcmFsX3Bsb3QucG5nIikNCmBgYA0KIyMgTW9yYWwgVmlnbmV0dGVzIHsudGFic2V0fQ0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMxYV9tb3JhbCA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBNb3JhbEF2ZXJhZ2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJyZWFrcyA9IGJyZWFrc19zZWV6ZXJvLA0KICAgICAgICAgICAgICAgICBjb2xvciA9ICJncmV5MzAiLCBmaWxsID0gYygiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiLCAiI0NFQTMzNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNDRUEzMzUiLCAiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJibGFjayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNDRUEzMzUiLCAiI0NFQTMzNSIsICIjQ0VBMzM1IiwgIiNDRUEzMzUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQ0VBMzM1IiwgIiNDRUEzMzUiLCAiI0NFQTMzNSIsICIjQ0VBMzM1IikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTQuMSw0LjEpLCBicmVha3MgPSBjKC00LC0zLC0yLC0xLDAsMSwyLDMsNCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuMSw1MC4xKSwgYnJlYWtzID0gYygwLCAxMCwgMjAsIDMwLCA0MCwgNTApKSArDQogIHhsYWIoIlxuR2xvYmFsIFZpcnR1b3NpdHkgSnVkZ21lbnQiKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIlMxYV9tb3JhbF9wbG90LnBuZyIpDQpgYGANCiMjIEludGVyYWN0aW9uIHsudGFic2V0fQ0KQmVybWFuICYgU21hbGwgcHJlZGljdGVkIGFuIGludGVyYWN0aW9uIHN1Y2ggdGhhdCB0ZW1wdGVkIGFnZW50cyB3b3VsZCBiZSBqdWRnZWQgYXMgbW9yZSB2aXJ0dW91cyBpbiBub24tbW9yYWwgY29udGV4dHMsIGJ1dCBsZXNzIHZpcnR1b3VzIGluIG1vcmFsIGNvbnRleHRzLiBUaGVyZWZvcmUsIHRoaXMgaW50ZXJhY3Rpb24gcGxvdCBzaG93cyBob3cgbWFueSBwYXJ0aWNpcGFudHMnIHJlc3BvbnNlcyBtaXJyb3JlZCB0aGF0IG51YW5jZWQgcHJlZGljdGlvbi4NCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfaW50IDwtIGdncGxvdChTdHVkeV8xYV9wbHZsLCBhZXMoeCA9IGZpdHNfY29tcGxleCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMC4xLDE1MS4xKSwgYnJlYWtzID0gYygwLCAyNSwgNTAsIDc1LCAxMDAsIDEyNSwgMTUwKSkgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIEludGVyYWN0aW9uIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KICAgIA0KZ2dzYXZlKCJTMWFfaW50X3Bsb3QucG5nIikNCmBgYA0KDQojIFJvYnVzdG5lc3MgUGxvdHMgey50YWJzZXR9DQpIZXJlLCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBtYXRjaGluZyBwcmVkaWN0ZWQgZWZmZWN0cyBieSBkZW1vZ3JhcGhpY3MgaW4gb3JkZXIgdG8gY2F0YWxvZyB0aGUgZ2VuZXJhbGl0eSAob3IgbGFjayB0aGVyZW9mKSBvZiB0aGVzZSBlZmZlY3RzIGFjcm9zcyBsZXZlbHMgb2YgdmFyaW91cyB0aGUgZGVtb2dyYXBoaWNzIHRoYXQgd2UgY29sbGVjdGVkLg0KYGBge3J9DQojIGNyZWF0ZSB5ZXMvbm8gdmFyaWFibGUgZm9yIHNpbXBsZSBoeXBvdGhlc2VzDQpTdHVkeV8xYV9wbHZsIDwtIFN0dWR5XzFhX3BsdmwgJT4lDQogIG11dGF0ZShmaXRzX25vbm1vcmFsID0gaWZfZWxzZShmaXRzX2h5cG90aGVzaXNfbiA9PSAxLCAiWWVzIiwgIk5vIikpDQoNCiMgY3JlYXRlIHllcy9ubyB2YXJpYWJsZSBmb3Igc2ltcGxlIGh5cG90aGVzZXMNClN0dWR5XzFhX3BsdmwgPC0gU3R1ZHlfMWFfcGx2bCAlPiUNCiAgbXV0YXRlKGZpdHNfbW9yYWwgPSBpZl9lbHNlKGZpdHNfaHlwb3RoZXNpc19tID09IDEsICJZZXMiLCAiTm8iKSkNCmBgYA0KDQojIyBFZHVjYXRpb24gey50YWJzZXR9DQoNCiMjIyBOb24tTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX25vbm1vcmFsX2VkdWMgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19ub25tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE5vbi1Nb3JhbCBWaWduZXR0ZSBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAofkVkdWNhdGlvbikgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBNb3JhbCBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfbW9yYWxfZWR1YyA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX21vcmFsKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgTW9yYWwgVmlnbmV0dGUgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5FZHVjYXRpb24pICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfaW50X2VkdWMgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19jb21wbGV4KSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5FZHVjYXRpb24pICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFBvbGl0aWNhbCBQYXJ0eSB7LnRhYnNldH0NCg0KIyMjIE5vbi1Nb3JhbCBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfbm9ubW9yYWxfcG9sIDwtIGdncGxvdChTdHVkeV8xYV9wbHZsLCBhZXMoeCA9IGZpdHNfbm9ubW9yYWwpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI0NFQTMzNSIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBOb24tTW9yYWwgVmlnbmV0dGUgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5Qb2xpdGljYWxfUGFydHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX21vcmFsX3BvbCA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX21vcmFsKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgTW9yYWwgVmlnbmV0dGUgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5Qb2xpdGljYWxfUGFydHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfaW50X3BvbCA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX2NvbXBsZXgpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI0NFQTMzNSIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBJbnRlcmFjdGlvbiBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflBvbGl0aWNhbF9QYXJ0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0KIyMgUmVsaWdpb3NpdHkgey50YWJzZXR9DQoNCiMjIyBOb24tTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX25vbm1vcmFsX3JlbGlnIDwtIGdncGxvdChTdHVkeV8xYV9wbHZsLCBhZXMoeCA9IGZpdHNfbm9ubW9yYWwpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI0NFQTMzNSIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBOb24tTW9yYWwgVmlnbmV0dGUgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5SZWxpZ2lvc2l0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBNb3JhbCBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfbW9yYWxfcmVsaWcgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE1vcmFsIFZpZ25ldHRlIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmVsaWdpb3NpdHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTMWFfaW50X3JlbGlnIDwtIGdncGxvdChTdHVkeV8xYV9wbHZsLCBhZXMoeCA9IGZpdHNfY29tcGxleCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIEludGVyYWN0aW9uIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmVsaWdpb3NpdHkpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFVyYmFuIHZzIFJ1cmFsIHsudGFic2V0fQ0KDQojIyMgTm9uLU1vcmFsIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMxYV9ub25tb3JhbF91cmIgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19ub25tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE5vbi1Nb3JhbCBWaWduZXR0ZSBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflVyYmFuUnVyYWwpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX21vcmFsX3VyYiA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX21vcmFsKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgTW9yYWwgVmlnbmV0dGUgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5VcmJhblJ1cmFsKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX2ludF91cmIgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19jb21wbGV4KSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5VcmJhblJ1cmFsKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KDQojIyBHZW5kZXIgey50YWJzZXR9DQoNCiMjIyBOb24tTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX25vbm1vcmFsX2dlbmRlciA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX25vbm1vcmFsKSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgTm9uLU1vcmFsIFZpZ25ldHRlIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+R2VuZGVyKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIE1vcmFsIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMxYV9tb3JhbF9nZW5kZXIgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE1vcmFsIFZpZ25ldHRlIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+R2VuZGVyKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX2ludF9nZW5kZXIgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19jb21wbGV4KSkgKw0KICBnZW9tX2JhcihmaWxsID0gIiNDRUEzMzUiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5HZW5kZXIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFJhY2Ugey50YWJzZXR9DQoNCmBgYHtyfQ0KIyBtYWtlIHJhY2Ugb25lIHZhcmlhYmxlDQpTdHVkeV8xYV9wbHZsIDwtIFN0dWR5XzFhX3BsdmwgJT4lDQogIG11dGF0ZShSYWNlID0gY29hbGVzY2UoUmFjZV8xLCBSYWNlXzIsIFJhY2VfMywgUmFjZV80LCBSYWNlXzUsIFJhY2VfNiwgUmFjZV83LCBSYWNlXzgpKQ0KYGBgDQoNCiMjIyBOb24tTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX25vbm1vcmFsX3JhY2UgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19ub25tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE5vbi1Nb3JhbCBWaWduZXR0ZSBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflJhY2UpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgTW9yYWwgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzFhX21vcmFsX3JhY2UgPC0gZ2dwbG90KFN0dWR5XzFhX3BsdmwsIGFlcyh4ID0gZml0c19tb3JhbCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICIjQ0VBMzM1IikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIE1vcmFsIFZpZ25ldHRlIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+UmFjZSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBJbnRlcmFjdGlvbg0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMxYV9pbnRfcmFjZSA8LSBnZ3Bsb3QoU3R1ZHlfMWFfcGx2bCwgYWVzKHggPSBmaXRzX2NvbXBsZXgpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiI0NFQTMzNSIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBJbnRlcmFjdGlvbiBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflJhY2UpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCg0K