Data Waves

As pre-registered, we sought to collect data to attain 200 analyzable responses for each between-subjects condition (i.e., 200 participants who passed all attention checks for each between-subjects condition, totalling 600 usable responses across the entire experiment).


On the first wave of data collection (N = 694), applying the pre-registered exclusion criteria led to adequate samples (i.e., Ns > 200) for two between-subjects datasets, but an inadequate sample (i.e., N = 195) for one between-subjects dataset (specifically, the Stranger and Sibling dataset). Therefore, we launched a small second wave (N = 10) to attain an adequate sample for the Stranger and Sibling dataset.


Data Cleaning

Before data were loaded into R (below), the following changes were made:

  1. Raw variable names from Qualtrics were renamed to be more descriptive.

  2. If there were any responses for the field “Bot_Catcher,” these cases were deleted. This field was designed to be an invisible question that only bots would answer (as human respondents would not see the field). However, 0 cases were detected.

  3. Duplicate IP addresses were removed. There was only 1 instance of a duplicate IP address, but it came from two different Prolific IDs (and both responses were removed for failing attention checks).

  4. All other identifying information was removed (e.g., IP addresses, longitude/latitude, etc.).


Loading Data/Packages

Before running this chunk, please load “E1_raw_data.csv” into the R environment.


# packages should be loaded in the following order to avoid function conflicts
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

Data Separation/Recombining

Data were separated into three distinct data sets (for each between-subjects condition). Then, a between-subjects variable was created within each between-subjects dataset. Last, all three datasets were recombined.


# creates dataset that only has partipants who made judgments of agents who helped strangers and cousins
E1_STRnCUZ <- E1_raw_data %>%
  filter(STRnCUZ_STR_m1 >= 0 | STRnCUZ_STR_m2 >= 0 | STRnCUZ_STR_m3 >= 0)

# creates dataset that only has partipants who made judgments of agents who helped strangers and siblings
E1_STRnSIB <- E1_raw_data %>%
  filter(STRnSIB_STR_m1 >= 0 | STRnSIB_STR_m2 >= 0 | STRnSIB_STR_m3 >= 0)

# creates dataset that only has partipants who made judgments of agents who helped cousins and siblings
E1_CUZnSIB <- E1_raw_data %>%
  filter(CUZnSIB_CUZ_m1 >= 0 | CUZnSIB_CUZ_m2 >= 0 | CUZnSIB_CUZ_m3 >= 0)

# create between-subjects condition variable
E1_STRnCUZ$BSs_cond <- rep("STR vs CUZ", nrow(E1_STRnCUZ))
E1_STRnSIB$BSs_cond <- rep("STR vs SIB", nrow(E1_STRnSIB))
E1_CUZnSIB$BSs_cond <- rep("CUZ vs SIB", nrow(E1_CUZnSIB))

# recombine between-subjects data
E1_all <- rbind(E1_STRnCUZ, E1_STRnSIB, E1_CUZnSIB)

Implementing Attention Checks

Based on our pre-registered criteria, participants who failed any of 3 attention checks were to be excluded from all analyses. This led to a final analyzable N = 611 (an 87% retention rate).


The first attention check was disguised as an experimental scenario; in the scenario text, participants were instructed to respond with the left-most option on the scale for all three pre-outcome measures (obligation, likelihood, and descriptive normativity). Participants who responded above a 10 on any of the three 100-point scales were excluded.


The second and third attention checks explicitly instructed participants to respond in a particular way on two individual difference measures. The second attention check instructed participants to respond “strongly agree” on the MAC’s 100 point scale; participants who responded below 90 were excluded. The third attention check instructed participants to respond “strongly disagree” on the MFQ’s scale; participants who responded anything other than “strongly disagree” (a 1 on the 6-point scale) were excluded.


# Experimental task attention check variables
E1_all$AC_oblig <- rowSums(E1_all[, c("AC_oblig1", "AC_oblig2", "AC_oblig3")], na.rm = T)
E1_all$AC_likely <- rowSums(E1_all[, c("AC_likely1", "AC_likely2", "AC_likely3")], na.rm = T)
E1_all$AC_dnorm <- rowSums(E1_all[, c("AC_dnorm1", "AC_dnorm2", "AC_dnorm3")], na.rm = T) # if any are > 10, exclude

# Individual difference attention check variables
E1_all$MAC_AC <- E1_all$MAC_Jud_4 # if < 90, exclude
E1_all$MFQ_AC <- E1_all$MFQ_Jud_4 # if != 1, exclude

# Create dataset that filters out inattentive participants
E1_all_clean <- E1_all %>%
  # excludes participants who were not paying attention during experimental task
    filter(AC_oblig <= 10 & AC_likely <= 10 & AC_dnorm <= 10) %>%
  # exclude participants who were not paying attention during MAC scale
    filter(MAC_AC >= 90) %>%
  # exclude participants who were not paying attention during MFQ scale
    filter(MFQ_AC == 1)

Creating Analysis Variables

# Main DVs
# create single column for each condition's variables that collapses across presentation order of DV

# e.g., STRnCUZ_STR_o1 = STR vs CUZ dataset, "No Choice" condition, STR obligation judgment, obligation judgment presented first
# to clarify, as noted in the Method section (and SOM), two other pre-outcome judgments were collected, equaling three different
# orders of presentation, each of which started with a different DV (these additional judgments are not included here)

E1_all_clean$NoChoice_STR_oblig  <- rowSums(E1_all_clean[, c("STRnCUZ_STR_o1", "STRnCUZ_STR_o2", "STRnCUZ_STR_o3", 
                                              "STRnSIB_STR_o1", "STRnSIB_STR_o2", "STRnSIB_STR_o3")], na.rm = T)
E1_all_clean$NoChoice_STR_moral  <- rowSums(E1_all_clean[, c("STRnCUZ_STR_m1", "STRnCUZ_STR_m2", "STRnCUZ_STR_m3", 
                                              "STRnSIB_STR_m1", "STRnSIB_STR_m2", "STRnSIB_STR_m3")], na.rm = T)


E1_all_clean$NoChoice_CUZ_oblig  <- rowSums(E1_all_clean[, c("STRnCUZ_CUZ_o1", "STRnCUZ_CUZ_o2", "STRnCUZ_CUZ_o3", 
                                              "CUZnSIB_CUZ_o1", "CUZnSIB_CUZ_o2", "CUZnSIB_CUZ_o3")], na.rm = T)
E1_all_clean$NoChoice_CUZ_moral  <- rowSums(E1_all_clean[, c("STRnCUZ_CUZ_m1", "STRnCUZ_CUZ_m2", "STRnCUZ_CUZ_m3", 
                                              "CUZnSIB_CUZ_m1", "CUZnSIB_CUZ_m2", "CUZnSIB_CUZ_m3")], na.rm = T)


E1_all_clean$NoChoice_SIB_oblig  <- rowSums(E1_all_clean[, c("STRnSIB_SIB_o1", "STRnSIB_SIB_o2", "STRnSIB_SIB_o3", 
                                              "CUZnSIB_SIB_o1", "CUZnSIB_SIB_o2", "CUZnSIB_SIB_o3")], na.rm = T)
E1_all_clean$NoChoice_SIB_moral  <- rowSums(E1_all_clean[, c("STRnSIB_SIB_m1", "STRnSIB_SIB_m2", "STRnSIB_SIB_m3", 
                                              "CUZnSIB_SIB_m1", "CUZnSIB_SIB_m2", "CUZnSIB_SIB_m3")], na.rm = T)


# e.g., STRoCUZ_STR_o11 = STR vs CUZ dataset, "Choice" condition, STR is eventually helped instead of CUZ,
# obligation judgments in general presented first (first 1), but obligation to STR presented before obligation to CUZ (second 1)
# to clarify, as noted in the Method section, two obligation judgments were collected in these conditions,
# one for each potential beneficiary (e.g., STR and CUZ)
E1_all_clean$STRoCUZ_STR_oblig <- rowSums(E1_all_clean[, c("STRoCUZ_STR_o11", "STRoCUZ_STR_o12", "STRoCUZ_STR_o31", 
                                                  "STRoCUZ_STR_o21", "STRoCUZ_STR_o22", "STRoCUZ_STR_o32")], na.rm = T) 
E1_all_clean$STRoCUZ_CUZ_oblig <- rowSums(E1_all_clean[, c("STRoCUZ_CUZ_o11", "STRoCUZ_CUZ_o12", "STRoCUZ_CUZ_o31", 
                                                  "STRoCUZ_CUZ_o21", "STRoCUZ_CUZ_o22", "STRoCUZ_CUZ_o32")], na.rm = T)
E1_all_clean$STRoCUZ_STR_moral <- rowSums(E1_all_clean[, c("STRoCUZ_STR_m11", "STRoCUZ_STR_m12", "STRoCUZ_STR_m31", 
                                                  "STRoCUZ_STR_m21", "STRoCUZ_STR_m22", "STRoCUZ_STR_m32")], na.rm = T) 

E1_all_clean$CUZoSTR_STR_oblig <- rowSums(E1_all_clean[, c("CUZoSTR_STR_o11", "CUZoSTR_STR_o12", "CUZoSTR_STR_o31", 
                                                  "CUZoSTR_STR_o21", "CUZoSTR_STR_o22", "CUZoSTR_STR_o32")], na.rm = T) 
E1_all_clean$CUZoSTR_CUZ_oblig <- rowSums(E1_all_clean[, c("CUZoSTR_CUZ_o11", "CUZoSTR_CUZ_o12", "CUZoSTR_CUZ_o31", 
                                                  "CUZoSTR_CUZ_o21", "CUZoSTR_CUZ_o22", "CUZoSTR_CUZ_o32")], na.rm = T) 
E1_all_clean$CUZoSTR_CUZ_moral <- rowSums(E1_all_clean[, c("CUZoSTR_CUZ_m11", "CUZoSTR_CUZ_m12", "CUZoSTR_CUZ_m31", 
                                                  "CUZoSTR_CUZ_m21", "CUZoSTR_CUZ_m22", "CUZoSTR_CUZ_m32")], na.rm = T) 

E1_all_clean$Choice_STRnCUZ_STR_oblig  <- (E1_all_clean$STRoCUZ_STR_oblig + E1_all_clean$CUZoSTR_STR_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_STRnCUZ_STR_moral  <- rowSums(E1_all_clean[, c(
                                                  "STRoCUZ_STR_m11", "STRoCUZ_STR_m12", "STRoCUZ_STR_m31", 
                                                  "STRoCUZ_STR_m21", "STRoCUZ_STR_m22", "STRoCUZ_STR_m32")], na.rm = T) # should be a duplicate of "STRoCUZ_STR_moral"

E1_all_clean$Choice_STRnCUZ_CUZ_oblig  <- (E1_all_clean$STRoCUZ_CUZ_oblig + E1_all_clean$CUZoSTR_CUZ_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_STRnCUZ_CUZ_moral  <- rowSums(E1_all_clean[, c(
                                                  "CUZoSTR_CUZ_m11", "CUZoSTR_CUZ_m12", "CUZoSTR_CUZ_m31", 
                                                  "CUZoSTR_CUZ_m21", "CUZoSTR_CUZ_m22", "CUZoSTR_CUZ_m32")], na.rm = T) # should be a duplicate of "CUZoSTR_CUZ_moral"


E1_all_clean$STRoSIB_STR_oblig <- rowSums(E1_all_clean[, c("STRoSIB_STR_o11", "STRoSIB_STR_o12", "STRoSIB_STR_o31", 
                                                  "STRoSIB_STR_o21", "STRoSIB_STR_o22", "STRoSIB_STR_o32")], na.rm = T) 
E1_all_clean$STRoSIB_SIB_oblig <- rowSums(E1_all_clean[, c("STRoSIB_SIB_o11", "STRoSIB_SIB_o12", "STRoSIB_SIB_o31", 
                                                  "STRoSIB_SIB_o21", "STRoSIB_SIB_o22", "STRoSIB_SIB_o32")], na.rm = T) 
E1_all_clean$STRoSIB_STR_moral <- rowSums(E1_all_clean[, c("STRoSIB_STR_m11", "STRoSIB_STR_m12", "STRoSIB_STR_m31", 
                                                  "STRoSIB_STR_m21", "STRoSIB_STR_m22", "STRoSIB_STR_m32")], na.rm = T) 

E1_all_clean$SIBoSTR_STR_oblig <- rowSums(E1_all_clean[, c("SIBoSTR_STR_o11", "SIBoSTR_STR_o12", "SIBoSTR_STR_o31", 
                                                  "SIBoSTR_STR_o21", "SIBoSTR_STR_o22", "SIBoSTR_STR_o32")], na.rm = T) 
E1_all_clean$SIBoSTR_SIB_oblig <- rowSums(E1_all_clean[, c("SIBoSTR_SIB_o11", "SIBoSTR_SIB_o12", "SIBoSTR_SIB_o31", 
                                                  "SIBoSTR_SIB_o21", "SIBoSTR_SIB_o22", "SIBoSTR_SIB_o32")], na.rm = T) 
E1_all_clean$SIBoSTR_SIB_moral <- rowSums(E1_all_clean[, c("SIBoSTR_SIB_m11", "SIBoSTR_SIB_m12", "SIBoSTR_SIB_m31", 
                                                  "SIBoSTR_SIB_m21", "SIBoSTR_SIB_m22", "SIBoSTR_SIB_m32")], na.rm = T) 

E1_all_clean$Choice_STRnSIB_STR_oblig  <- (E1_all_clean$STRoSIB_STR_oblig + E1_all_clean$SIBoSTR_STR_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_STRnSIB_STR_moral  <- rowSums(E1_all_clean[, c(
                                                  "STRoSIB_STR_m11", "STRoSIB_STR_m12", "STRoSIB_STR_m31", 
                                                  "STRoSIB_STR_m21", "STRoSIB_STR_m22", "STRoSIB_STR_m32")], na.rm = T) # should be a duplicate of "STRoSIB_STR_moral"

E1_all_clean$Choice_STRnSIB_SIB_oblig  <- (E1_all_clean$STRoSIB_SIB_oblig + E1_all_clean$SIBoSTR_SIB_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_STRnSIB_SIB_moral  <- rowSums(E1_all_clean[, c(
                                                  "SIBoSTR_SIB_m11", "SIBoSTR_SIB_m12", "SIBoSTR_SIB_m31", 
                                                  "SIBoSTR_SIB_m21", "SIBoSTR_SIB_m22", "SIBoSTR_SIB_m32")], na.rm = T) # should be a duplicate of "SIBoSTR_SIB_moral"


E1_all_clean$CUZoSIB_CUZ_oblig <- rowSums(E1_all_clean[, c("CUZoSIB_CUZ_o11", "CUZoSIB_CUZ_o12", "CUZoSIB_CUZ_o31", 
                                                  "CUZoSIB_CUZ_o21", "CUZoSIB_CUZ_o22", "CUZoSIB_CUZ_o32")], na.rm = T) 
E1_all_clean$CUZoSIB_SIB_oblig <- rowSums(E1_all_clean[, c("CUZoSIB_SIB_o11", "CUZoSIB_SIB_o12", "CUZoSIB_SIB_o31", 
                                                  "CUZoSIB_SIB_o21", "CUZoSIB_SIB_o22", "CUZoSIB_SIB_o32")], na.rm = T) 
E1_all_clean$CUZoSIB_CUZ_moral <- rowSums(E1_all_clean[, c("CUZoSIB_CUZ_m11", "CUZoSIB_CUZ_m12", "CUZoSIB_CUZ_m31", 
                                                  "CUZoSIB_CUZ_m21", "CUZoSIB_CUZ_m22", "CUZoSIB_CUZ_m32")], na.rm = T) 


E1_all_clean$SIBoCUZ_CUZ_oblig <- rowSums(E1_all_clean[, c("SIBoCUZ_CUZ_o11", "SIBoCUZ_CUZ_o12", "SIBoCUZ_CUZ_o31", 
                                                  "SIBoCUZ_CUZ_o21", "SIBoCUZ_CUZ_o22", "SIBoCUZ_CUZ_o32")], na.rm = T) 
E1_all_clean$SIBoCUZ_SIB_oblig <- rowSums(E1_all_clean[, c("SIBoCUZ_SIB_o11", "SIBoCUZ_SIB_o12", "SIBoCUZ_SIB_o31", 
                                                  "SIBoCUZ_SIB_o21", "SIBoCUZ_SIB_o22", "SIBoCUZ_SIB_o32")], na.rm = T) 
E1_all_clean$SIBoCUZ_SIB_moral <- rowSums(E1_all_clean[, c("SIBoCUZ_SIB_m11", "SIBoCUZ_SIB_m12", "SIBoCUZ_SIB_m31", 
                                                  "SIBoCUZ_SIB_m21", "SIBoCUZ_SIB_m22", "SIBoCUZ_SIB_m32")], na.rm = T) 

E1_all_clean$Choice_CUZnSIB_CUZ_oblig  <- (E1_all_clean$CUZoSIB_CUZ_oblig + E1_all_clean$SIBoCUZ_CUZ_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_CUZnSIB_CUZ_moral  <- rowSums(E1_all_clean[, c(
                                                  "CUZoSIB_CUZ_m11", "CUZoSIB_CUZ_m12", "CUZoSIB_CUZ_m31", 
                                                  "CUZoSIB_CUZ_m21", "CUZoSIB_CUZ_m22", "CUZoSIB_CUZ_m32")], na.rm = T) # should be a duplicate of "CUZoSIB_CUZ_moral"

E1_all_clean$Choice_CUZnSIB_SIB_oblig  <- (E1_all_clean$CUZoSIB_SIB_oblig + E1_all_clean$SIBoCUZ_SIB_oblig)/2 # creates pre-registered obligation index for mean comparisons
E1_all_clean$Choice_CUZnSIB_SIB_moral  <- rowSums(E1_all_clean[, c(
                                                  "SIBoCUZ_SIB_m11", "SIBoCUZ_SIB_m12", "SIBoCUZ_SIB_m31", 
                                                  "SIBoCUZ_SIB_m21", "SIBoCUZ_SIB_m22", "SIBoCUZ_SIB_m32")], na.rm = T) # should be a duplicate of "SIBoCUZ_SIB_moral"


# Difference Scores
# e.g., STR minus CUZ obligation within No Choice or Choice conditions (for diff score corrs and ind. diffs analyses)

# STR vs CUZ
E1_all_clean$NoChoice_STRminusCUZ_oblig <- E1_all_clean$NoChoice_STR_oblig - E1_all_clean$NoChoice_CUZ_oblig
E1_all_clean$NoChoice_STRminusCUZ_moral <- E1_all_clean$NoChoice_STR_moral - E1_all_clean$NoChoice_CUZ_moral

E1_all_clean$Choice_STRminusCUZ_oblig <- E1_all_clean$Choice_STRnCUZ_STR_oblig - E1_all_clean$Choice_STRnCUZ_CUZ_oblig
E1_all_clean$Choice_STRminusCUZ_moral <- E1_all_clean$Choice_STRnCUZ_STR_moral - E1_all_clean$Choice_STRnCUZ_CUZ_moral

# STR vs SIB
E1_all_clean$NoChoice_STRminusSIB_oblig <- E1_all_clean$NoChoice_STR_oblig - E1_all_clean$NoChoice_SIB_oblig
E1_all_clean$NoChoice_STRminusSIB_moral <- E1_all_clean$NoChoice_STR_moral - E1_all_clean$NoChoice_SIB_moral

E1_all_clean$Choice_STRminusSIB_oblig <- E1_all_clean$Choice_STRnSIB_STR_oblig - E1_all_clean$Choice_STRnSIB_SIB_oblig
E1_all_clean$Choice_STRminusSIB_moral <- E1_all_clean$Choice_STRnSIB_STR_moral - E1_all_clean$Choice_STRnSIB_SIB_moral

# CUZ vs SIB
E1_all_clean$NoChoice_CUZminusSIB_oblig <- E1_all_clean$NoChoice_CUZ_oblig - E1_all_clean$NoChoice_SIB_oblig
E1_all_clean$NoChoice_CUZminusSIB_moral <- E1_all_clean$NoChoice_CUZ_moral - E1_all_clean$NoChoice_SIB_moral

E1_all_clean$Choice_CUZminusSIB_oblig <- E1_all_clean$Choice_CUZnSIB_CUZ_oblig - E1_all_clean$Choice_CUZnSIB_SIB_oblig
E1_all_clean$Choice_CUZminusSIB_moral <- E1_all_clean$Choice_CUZnSIB_CUZ_moral - E1_all_clean$Choice_CUZnSIB_SIB_moral


# Individual Difference Measures (for ind. diffs analyses)

# MAC (Morality-as-Cooperation scale) composite
E1_all_clean$MAC_Fam_Combined <- ((E1_all_clean$MAC_Jud_1 + E1_all_clean$MAC_Jud_2 + E1_all_clean$MAC_Jud_3 +
                                       E1_all_clean$MAC_Rel_1 + E1_all_clean$MAC_Rel_2 + E1_all_clean$MAC_Rel_3)/6)
E1_all_clean$MAC_Fam_Jud <- ((E1_all_clean$MAC_Jud_1 + E1_all_clean$MAC_Jud_2 + E1_all_clean$MAC_Jud_3)/3)
E1_all_clean$MAC_Fam_Rel <- ((E1_all_clean$MAC_Rel_1 + E1_all_clean$MAC_Rel_2 + E1_all_clean$MAC_Rel_3)/3)

# MFQ (Moral Foundations Theory scale) composite
E1_all_clean$MFQ_Loyalty_Combined <- ((E1_all_clean$MFQ_Jud_1 + E1_all_clean$MFQ_Jud_2 + E1_all_clean$MFQ_Jud_3 +
                                       E1_all_clean$MFQ_Rel_1 + E1_all_clean$MFQ_Rel_2 + E1_all_clean$MFQ_Rel_3)/6)
E1_all_clean$MFQ_Loyalty_Jud <- ((E1_all_clean$MFQ_Jud_1 + E1_all_clean$MFQ_Jud_2 + E1_all_clean$MFQ_Jud_3)/3)
E1_all_clean$MFQ_Loyalty_Rel <- ((E1_all_clean$MFQ_Rel_1 + E1_all_clean$MFQ_Rel_2 + E1_all_clean$MFQ_Rel_3)/3)

# OUS (Oxford Utilitarianism Scale: Impartial Beneficence subscale) composite
E1_all_clean$OUS_IB <- ((E1_all_clean$OUS_IB1 + E1_all_clean$OUS_IB2 + E1_all_clean$OUS_IB3 +
                             E1_all_clean$OUS_IB4 + E1_all_clean$OUS_IB5)/5)

Creating Analyzable Between-Subjects Datasets

# STR vs CUZ
E1_STRnCUZ_clean <- E1_all_clean %>%
  filter(BSs_cond == 'STR vs CUZ') %>%
  # select only variables that are relevant to STRnCUZ
  select(
    ResponseId, # selects variable
    Age:Political_Overall, # selects demographic variables
    MAC_Jud_1:MAC_Jud_3, MAC_Rel_1:MAC_Rel_3, MFQ_Jud_1:MFQ_Jud_3, MFQ_Rel_1:MFQ_Rel_3, OUS_IB1:OUS_IB5, # selects raw ind. diff variables (for reliabilty check)
    MAC_Fam_Combined:OUS_IB, # selects composited ind. diff variables
    BSs_cond, # selects variable for between-subjects condition
    Dist_Scen:CloseODist_Scen, # selects within-subjects condition variable
    NoChoice_STR_oblig:NoChoice_CUZ_moral, # selects NoChoice DVs for STRnCUZ dataset
    Choice_STRnCUZ_STR_oblig:Choice_STRnCUZ_CUZ_moral, # selects Choice DVs for STRnCUZ dataset
    NoChoice_STRminusCUZ_oblig:Choice_STRminusCUZ_moral # selects difference score variables for STRnCUZ dataset
    )

# STR vs SIB
E1_STRnSIB_clean <- E1_all_clean %>%
  filter(BSs_cond == 'STR vs SIB') %>%
  # select only variables that are relevant to STRnCUZ
  select(
    ResponseId, # selects variable
    Age:Political_Overall, # selects demographic variables
    MAC_Jud_1:MAC_Jud_3, MAC_Rel_1:MAC_Rel_3, MFQ_Jud_1:MFQ_Jud_3, MFQ_Rel_1:MFQ_Rel_3, OUS_IB1:OUS_IB5, # selects raw ind. diff variables (for reliabilty check)
    MAC_Fam_Combined:OUS_IB, # selects composited ind. diff variables
    BSs_cond, # selects variable for between-subjects condition
    Dist_Scen:CloseODist_Scen, # sselects within-subjects condition variable
    NoChoice_STR_oblig:NoChoice_STR_moral, NoChoice_SIB_oblig:NoChoice_SIB_moral, # selects NoChoice DVs for STRnSIB dataset
    Choice_STRnSIB_STR_oblig:Choice_STRnSIB_SIB_moral, # selects Choice DVs for STRnSIB dataset
    NoChoice_STRminusSIB_oblig:Choice_STRminusSIB_moral # selects difference score variables for STRnSIB dataset
    )

# CUZ vs SIB
E1_CUZnSIB_clean <- E1_all_clean %>%
  filter(BSs_cond == 'CUZ vs SIB') %>%
  # select only variables that are relevant to STRnCUZ
  select(
    ResponseId, # selects variable
    Age:Political_Overall, # selects demographic variables
    MAC_Jud_1:MAC_Jud_3, MAC_Rel_1:MAC_Rel_3, MFQ_Jud_1:MFQ_Jud_3, MFQ_Rel_1:MFQ_Rel_3, OUS_IB1:OUS_IB5, # selects raw ind. diff variables (for reliabilty check)
    MAC_Fam_Combined:OUS_IB, # selects composited ind. diff variables
    BSs_cond, # selects variable for between-subjects condition
    Dist_Scen:CloseODist_Scen, # selects within-subjects condition variable
    NoChoice_CUZ_oblig:NoChoice_SIB_moral, # selects NoChoice DVs for CUZnSIB dataset
    Choice_CUZnSIB_CUZ_oblig:Choice_CUZnSIB_SIB_moral, # selects Choice DVs for CUZnSIB dataset
    NoChoice_CUZminusSIB_oblig:Choice_CUZminusSIB_moral # selects difference score variables for CUZnSIB dataset
    )

Tidying Data

# Convert data from wide to long format for obligation and moral character
# STRnCUZ
E1_STRnCUZ_cond_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen, DistOClose_Scen, CloseODist_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_STRnCUZ_oblig_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(NoChoice_STR_oblig, NoChoice_CUZ_oblig, Choice_STRnCUZ_STR_oblig, Choice_STRnCUZ_CUZ_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )


E1_STRnCUZ_moral_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(NoChoice_STR_moral, NoChoice_CUZ_moral, Choice_STRnCUZ_STR_moral, Choice_STRnCUZ_CUZ_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long STRnCUZ datasets, select plotting variables, and create condition variable for each factor (Relation + Choice Context)
E1_STRnCUZ_long <- cbind(E1_STRnCUZ_cond_long, E1_STRnCUZ_oblig_long, E1_STRnCUZ_moral_long)

E1_STRnCUZ_long <- E1_STRnCUZ_long[, !duplicated(colnames(E1_STRnCUZ_long))] %>% # get rid of duplicate columns
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(Relation = case_when(
    WSs_cond == "Dist_Scen" ~ "Distant",
    WSs_cond == "Close_Scen" ~ "Close",
    WSs_cond == "DistOClose_Scen" ~ "Distant",
    WSs_cond == "CloseODist_Scen" ~ "Close")) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "No Choice",
    WSs_cond == "DistOClose_Scen" ~ "Choice",
    WSs_cond == "CloseODist_Scen" ~ "Choice"))

# Reorder/rename condition and participant factors
E1_STRnCUZ_long$Relation <- as.factor(E1_STRnCUZ_long$Relation)
E1_STRnCUZ_long$Relation <- ordered(E1_STRnCUZ_long$Relation, levels = c("Distant", "Close"))
E1_STRnCUZ_long$`Choice Context` <- as.factor(E1_STRnCUZ_long$`Choice Context`)
E1_STRnCUZ_long$`Choice Context` <- ordered(E1_STRnCUZ_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_STRnCUZ_long$ResponseId <- as.factor(E1_STRnCUZ_long$ResponseId)


# Convert data from wide to long format for obligation and moral character
# STRnSIB
E1_STRnSIB_cond_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen, DistOClose_Scen, CloseODist_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_STRnSIB_oblig_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_STR_oblig, NoChoice_SIB_oblig, Choice_STRnSIB_STR_oblig, Choice_STRnSIB_SIB_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )


E1_STRnSIB_moral_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_STR_moral, NoChoice_SIB_moral, Choice_STRnSIB_STR_moral, Choice_STRnSIB_SIB_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long STRnSIB datasets, select plotting variables, and create condition variable for each factor (Relation + Choice Context)
E1_STRnSIB_long <- cbind(E1_STRnSIB_cond_long, E1_STRnSIB_oblig_long, E1_STRnSIB_moral_long)

E1_STRnSIB_long <- E1_STRnSIB_long[, !duplicated(colnames(E1_STRnSIB_long))] %>% # get rid of duplicate columns
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(Relation = case_when(
    WSs_cond == "Dist_Scen" ~ "Distant",
    WSs_cond == "Close_Scen" ~ "Close",
    WSs_cond == "DistOClose_Scen" ~ "Distant",
    WSs_cond == "CloseODist_Scen" ~ "Close")) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "No Choice",
    WSs_cond == "DistOClose_Scen" ~ "Choice",
    WSs_cond == "CloseODist_Scen" ~ "Choice"))

# Reorder/rename condition and participant factors
E1_STRnSIB_long$Relation <- as.factor(E1_STRnSIB_long$Relation)
E1_STRnSIB_long$Relation <- ordered(E1_STRnSIB_long$Relation, levels = c("Distant", "Close"))
E1_STRnSIB_long$`Choice Context` <- as.factor(E1_STRnSIB_long$`Choice Context`)
E1_STRnSIB_long$`Choice Context` <- ordered(E1_STRnSIB_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_STRnSIB_long$ResponseId <- as.factor(E1_STRnSIB_long$ResponseId)


# Convert data from wide to long format for obligation and moral character
# CUZnSIB
E1_CUZnSIB_cond_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen, DistOClose_Scen, CloseODist_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_CUZnSIB_oblig_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_CUZ_oblig, NoChoice_SIB_oblig, Choice_CUZnSIB_CUZ_oblig, Choice_CUZnSIB_SIB_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )


E1_CUZnSIB_moral_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_CUZ_moral, NoChoice_SIB_moral, Choice_CUZnSIB_CUZ_moral, Choice_CUZnSIB_SIB_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long CUZnSIB datasets, select plotting variables, and create condition variable for each factor (Relation + Choice Context)
E1_CUZnSIB_long <- cbind(E1_CUZnSIB_cond_long, E1_CUZnSIB_oblig_long, E1_CUZnSIB_moral_long)

E1_CUZnSIB_long <- E1_CUZnSIB_long[, !duplicated(colnames(E1_CUZnSIB_long))] %>% # get rid of duplicate columns
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(Relation = case_when(
    WSs_cond == "Dist_Scen" ~ "Distant",
    WSs_cond == "Close_Scen" ~ "Close",
    WSs_cond == "DistOClose_Scen" ~ "Distant",
    WSs_cond == "CloseODist_Scen" ~ "Close")) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "No Choice",
    WSs_cond == "DistOClose_Scen" ~ "Choice",
    WSs_cond == "CloseODist_Scen" ~ "Choice"))

# Reorder/rename condition and participant factors
E1_CUZnSIB_long$Relation <- as.factor(E1_CUZnSIB_long$Relation)
E1_CUZnSIB_long$Relation <- ordered(E1_CUZnSIB_long$Relation, levels = c("Distant", "Close"))
E1_CUZnSIB_long$`Choice Context` <- as.factor(E1_CUZnSIB_long$`Choice Context`)
E1_CUZnSIB_long$`Choice Context` <- ordered(E1_CUZnSIB_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_CUZnSIB_long$ResponseId <- as.factor(E1_CUZnSIB_long$ResponseId)



# Combine into one dataset for later exploratory analyses
E1_all_long <- rbind(E1_STRnSIB_long, E1_STRnCUZ_long, E1_CUZnSIB_long)
# Reorder All_long BSs_cond
E1_all_long$BSs_cond <- as.factor(E1_all_long$BSs_cond)
E1_all_long$BSs_cond <- ordered(E1_all_long$BSs_cond, levels = c("STR vs SIB", "STR vs CUZ", "CUZ vs SIB")) # order is due to likely differences between datasets (largest to smallest - see pre-registration's "exploratory analysis" section)

Descriptive Statistics

Oblig

STRnSIB

describeBy(E1_STRnSIB_long$oblig, list(E1_STRnSIB_long$Relation, E1_STRnSIB_long$`Choice Context`), mat = T)

STRnCUZ

describeBy(E1_STRnCUZ_long$oblig, list(E1_STRnCUZ_long$Relation, E1_STRnCUZ_long$`Choice Context`), mat = T)

CUZnSIB

describeBy(E1_CUZnSIB_long$oblig, list(E1_CUZnSIB_long$Relation, E1_CUZnSIB_long$`Choice Context`), mat = T)

Moral

STRnSIB

describeBy(E1_STRnSIB_long$moral, list(E1_STRnSIB_long$Relation, E1_STRnSIB_long$`Choice Context`), mat = T)

STRnCUZ

describeBy(E1_STRnCUZ_long$moral, list(E1_STRnCUZ_long$Relation, E1_STRnCUZ_long$`Choice Context`), mat = T)

CUZnSIB

describeBy(E1_CUZnSIB_long$moral, list(E1_CUZnSIB_long$Relation, E1_CUZnSIB_long$`Choice Context`), mat = T)

Mean Difference Plots

# Set dodge for plotting crossed factors
dodge = position_dodge(width = 1) 

Oblig

STRnSIB

print(oblig_plot_STRnSIB <- ggplot(data = E1_STRnSIB_long, aes(x = `Choice Context`, y = oblig, fill = Relation)) +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Obligation Strength") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

STRnCUZ

print(oblig_plot_STRnCUZ <- ggplot(data = E1_STRnCUZ_long, aes(x = `Choice Context`, y = oblig, fill = Relation)) +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Obligation Strength") +  
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

CUZnSIB

print(oblig_plot_CUZnSIB <- ggplot(data = E1_CUZnSIB_long, aes(x = `Choice Context`, y = oblig, fill = Relation)) +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Obligation Strength") +  
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Combined

print(oblig_plot_combined <- ggplot(data = E1_all_long, aes(x = `Choice Context`, y = oblig, fill = Relation)) +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        facet_wrap(~BSs_cond, nrow = 3) +
        xlab("\nChoice Context") +
        ylab("Obligation Strength\n") +
        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("E1_oblig_plot.png")
Saving 14 x 9 in image

Moral

STRnSIB

print(moral_plot_STRnSIB <- ggplot(data = E1_STRnSIB_long, aes(x = `Choice Context`, y = moral, fill = Relation)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Moral Character") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

STRnCUZ

print(moral_plot_STRnCUZ <- ggplot(data = E1_STRnCUZ_long, aes(x = `Choice Context`, y = moral, fill = Relation)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Moral Character") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

CUZnSIB

print(moral_plot_CUZnSIB <- ggplot(data = E1_CUZnSIB_long, aes(x = `Choice Context`, y = moral, fill = Relation)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        xlab("Choice Context") +
        ylab("Moral Character") + 
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 14),
              legend.text = element_text(color = "black", size = 12)))

Combined

print(moral_plot_combined <- ggplot(data = E1_all_long, aes(x = `Choice Context`, y = moral, fill = Relation)) +
        geom_hline(yintercept = 50, linetype = "dashed", color = "black") +
        geom_violin(aes(fill = Relation), position = dodge) +
        geom_boxplot(width = 0.1, color = "black", outlier.shape = NA, position = dodge) +
        scale_fill_manual(values = c("lightskyblue3", "indianred3")) +
        stat_summary(fun = mean, geom = "point", shape = 18, color = "white", size = 3, position = dodge) +
        theme(legend.position = "right") +
        theme_classic() +
        facet_wrap(~BSs_cond, nrow = 3) +
        xlab("\nChoice Context") +
        ylab("Moral Character\n") + 
        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("E1_moral_plot.png")
Saving 14 x 9 in image

Mean Difference Tests


See our pre-registration (https://osf.io/6q4kr/?view_only=8033c65c9dfc41bcbc528fe94409e4e8) for our predictions related to obligation judgments and moral character judgments.


Oblig

STRnSIB

No Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -6.1598, df = 202, p-value = 3.873e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -22.86444 -11.77596
sample estimates:
mean of the differences 
               -17.3202 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.4323351 (small)
95 percent confidence interval:
     lower      upper 
-0.5766144 -0.2880559 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.5435963 (medium)
95 percent confidence interval:
     lower      upper 
-0.7294547 -0.3577378 
# returns correlation between variables
cor_test(data = E1_STRnSIB_clean, "NoChoice_STR_oblig", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(201) |       p
--------------------------------------------------------------------------------
NoChoice_STR_oblig | NoChoice_SIB_oblig | 0.21 | [0.07, 0.34] |   3.04 | 0.003**

Observations: 203

Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -11.476, df = 202, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -21.11008 -14.91947
sample estimates:
mean of the differences 
              -18.01478 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.8054442 (large)
95 percent confidence interval:
     lower      upper 
-0.9642286 -0.6466598 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.6748516 (medium)
95 percent confidence interval:
     lower      upper 
-0.8029442 -0.5467589 
# returns correlation between variables
cor_test(data = E1_STRnSIB_clean, "Choice_STRnSIB_STR_oblig", "Choice_STRnSIB_SIB_oblig", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(201) |         p
----------------------------------------------------------------------------------------------
Choice_STRnSIB_STR_oblig | Choice_STRnSIB_SIB_oblig | 0.65 | [0.56, 0.72] |  12.09 | < .001***

Observations: 203

STRnCUZ

No Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -6.28, df = 202, p-value = 2.037e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -23.97522 -12.51739
sample estimates:
mean of the differences 
              -18.24631 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.4407704 (small)
95 percent confidence interval:
     lower      upper 
-0.5852924 -0.2962484 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.5701483 (medium)
95 percent confidence interval:
     lower      upper 
-0.7625822 -0.3777145 
# returns correlation between variables
cor_test(data = E1_STRnCUZ_clean, "NoChoice_STR_oblig", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(201) |      p
-------------------------------------------------------------------------------
NoChoice_STR_oblig | NoChoice_CUZ_oblig | 0.16 | [0.03, 0.29] |   2.35 | 0.020*

Observations: 203

Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -10.245, df = 202, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -15.32575 -10.37869
sample estimates:
mean of the differences 
              -12.85222 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.7190697 (medium)
95 percent confidence interval:
     lower      upper 
-0.8738569 -0.5642825 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.491025 (small)
95 percent confidence interval:
    lower     upper 
-0.590761 -0.391289 
# returns correlation between variables
cor_test(data = E1_STRnCUZ_clean, "Choice_STRnCUZ_STR_oblig", "Choice_STRnCUZ_CUZ_oblig", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(201) |         p
----------------------------------------------------------------------------------------------
Choice_STRnCUZ_STR_oblig | Choice_STRnCUZ_CUZ_oblig | 0.77 | [0.70, 0.82] |  16.94 | < .001***

Observations: 203

CUZnSIB

No Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -2.4887, df = 204, p-value = 0.01362
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -11.688854  -1.355049
sample estimates:
mean of the differences 
              -6.521951 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.1738211 (negligible)
95 percent confidence interval:
      lower       upper 
-0.31215141 -0.03549085 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.1892702 (negligible)
95 percent confidence interval:
     lower      upper 
-0.3401031 -0.0384373 
# returns correlation between variables
cor_test(data = E1_CUZnSIB_clean, "NoChoice_CUZ_oblig", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(203) |         p
----------------------------------------------------------------------------------
NoChoice_CUZ_oblig | NoChoice_SIB_oblig | 0.41 | [0.29, 0.52] |   6.35 | < .001***

Observations: 205

Choice

# returns t-test results
t.test(oblig ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  oblig by Relation
t = -7.1341, df = 204, p-value = 1.666e-11
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -7.960208 -4.512963
sample estimates:
mean of the differences 
              -6.236585 
# returns dz effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.4982647 (small)
95 percent confidence interval:
     lower      upper 
-0.6438342 -0.3526952 
# returns d-av effect size and 95% CIs
effsize::cohen.d(oblig ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.2211563 (small)
95 percent confidence interval:
     lower      upper 
-0.2828367 -0.1594759 
# returns correlation between variables
cor_test(data = E1_CUZnSIB_clean, "Choice_CUZnSIB_CUZ_oblig", "Choice_CUZnSIB_SIB_oblig", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(203) |         p
----------------------------------------------------------------------------------------------
Choice_CUZnSIB_CUZ_oblig | Choice_CUZnSIB_SIB_oblig | 0.90 | [0.87, 0.92] |  29.68 | < .001***

Observations: 205

Moral

ANOVAs

STRnSIB

# returns 2 x 2 within-subject ANOVA results
aov_moral_STRnSIB <- aov(moral ~ Relation*`Choice Context` + Error(ResponseId/(Relation*`Choice Context`)), data = E1_STRnSIB_long)
summary(aov_moral_STRnSIB)

Error: ResponseId
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 202 101536   502.7               

Error: ResponseId:Relation
           Df Sum Sq Mean Sq F value  Pr(>F)    
Relation    1   2554  2553.7   12.22 0.00058 ***
Residuals 202  42199   208.9                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: ResponseId:`Choice Context`
                  Df Sum Sq Mean Sq F value Pr(>F)    
`Choice Context`   1  70237   70237   319.7 <2e-16 ***
Residuals        202  44384     220                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: ResponseId:Relation:`Choice Context`
                           Df Sum Sq Mean Sq F value   Pr(>F)    
Relation:`Choice Context`   1   8121    8121   44.26 2.65e-10 ***
Residuals                 202  37069     184                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# returns eta-sq effect size
eta_sq(aov_moral_STRnSIB, partial = TRUE)
'eta_sq' is deprecated.
Use 'effectsize::eta_squared()' instead.
See help("Deprecated")
Group                                |               Parameter | Eta2 (partial) |       90% CI
----------------------------------------------------------------------------------------------
ResponseId:Relation                  |                Relation |           0.06 | [0.02, 0.12]
ResponseId:`Choice Context`          |          Choice Context |           0.61 | [0.55, 0.67]
ResponseId:Relation:`Choice Context` | Relation:Choice Context |           0.18 | [0.11, 0.26]

STRnCUZ

# returns 2 x 2 within-subject ANOVA results
aov_moral_STRnCUZ <- aov(moral ~ Relation*`Choice Context` + Error(ResponseId/(Relation*`Choice Context`)), data = E1_STRnCUZ_long)
summary(aov_moral_STRnCUZ)

Error: ResponseId
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 202 115423   571.4               

Error: ResponseId:Relation
           Df Sum Sq Mean Sq F value Pr(>F)
Relation    1     99   98.63   0.445  0.505
Residuals 202  44764  221.60               

Error: ResponseId:`Choice Context`
                  Df Sum Sq Mean Sq F value Pr(>F)    
`Choice Context`   1  51060   51060   239.6 <2e-16 ***
Residuals        202  43042     213                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: ResponseId:Relation:`Choice Context`
                           Df Sum Sq Mean Sq F value   Pr(>F)    
Relation:`Choice Context`   1   2473  2472.8   13.14 0.000365 ***
Residuals                 202  38005   188.1                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# returns eta-sq effect size
eta_sq(aov_moral_STRnCUZ, partial = TRUE)
'eta_sq' is deprecated.
Use 'effectsize::eta_squared()' instead.
See help("Deprecated")
Group                                |               Parameter | Eta2 (partial) |       90% CI
----------------------------------------------------------------------------------------------
ResponseId:Relation                  |                Relation |       2.20e-03 | [0.00, 0.03]
ResponseId:`Choice Context`          |          Choice Context |           0.54 | [0.47, 0.60]
ResponseId:Relation:`Choice Context` | Relation:Choice Context |           0.06 | [0.02, 0.12]

CUZnSIB

# returns 2 x 2 within-subject ANOVA results
aov_moral_CUZnSIB <- aov(moral ~ Relation*`Choice Context` + Error(ResponseId/(Relation*`Choice Context`)), data = E1_CUZnSIB_long)
summary(aov_moral_CUZnSIB)

Error: ResponseId
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 204 114949   563.5               

Error: ResponseId:Relation
           Df Sum Sq Mean Sq F value   Pr(>F)    
Relation    1   2585    2585   14.77 0.000162 ***
Residuals 204  35699     175                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: ResponseId:`Choice Context`
                  Df Sum Sq Mean Sq F value Pr(>F)    
`Choice Context`   1  60167   60167   263.4 <2e-16 ***
Residuals        204  46603     228                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Error: ResponseId:Relation:`Choice Context`
                           Df Sum Sq Mean Sq F value   Pr(>F)    
Relation:`Choice Context`   1   3114  3114.2   21.49 6.35e-06 ***
Residuals                 204  29564   144.9                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# returns eta-sq effect size
eta_sq(aov_moral_CUZnSIB, partial = TRUE)
'eta_sq' is deprecated.
Use 'effectsize::eta_squared()' instead.
See help("Deprecated")
Group                                |               Parameter | Eta2 (partial) |       90% CI
----------------------------------------------------------------------------------------------
ResponseId:Relation                  |                Relation |           0.07 | [0.02, 0.13]
ResponseId:`Choice Context`          |          Choice Context |           0.56 | [0.49, 0.62]
ResponseId:Relation:`Choice Context` | Relation:Choice Context |           0.10 | [0.04, 0.16]

t-tests

STRnSIB

No Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = 2.6937, df = 202, p-value = 0.007661
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.7446009 4.8120494
sample estimates:
mean of the differences 
               2.778325 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: 0.1890605 (negligible)
95 percent confidence interval:
     lower      upper 
0.04985719 0.32826387 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: 0.185017 (negligible)
95 percent confidence interval:
     lower      upper 
0.04884148 0.32119244 
# returns correlation between variables
cor_test(data = E1_STRnSIB_clean, "NoChoice_STR_moral", "NoChoice_SIB_moral", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(201) |         p
----------------------------------------------------------------------------------
NoChoice_STR_moral | NoChoice_SIB_moral | 0.52 | [0.41, 0.61] |   8.66 | < .001***

Observations: 203
Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = -5.8971, df = 202, p-value = 1.535e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -13.172713  -6.571129
sample estimates:
mean of the differences 
              -9.871921 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.4138981 (small)
95 percent confidence interval:
     lower      upper 
-0.5576617 -0.2701344 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.5410311 (medium)
95 percent confidence interval:
     lower      upper 
-0.7341354 -0.3479268 
# returns correlation between variables
cor_test(data = E1_STRnSIB_clean, "Choice_STRnSIB_STR_moral", "Choice_STRnSIB_SIB_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(201) |      p
-------------------------------------------------------------------------------------------
Choice_STRnSIB_STR_moral | Choice_STRnSIB_SIB_moral | 0.15 | [0.01, 0.28] |   2.09 | 0.038*

Observations: 203

STRnCUZ

No Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = 2.771, df = 202, p-value = 0.00611
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.8055855 4.7806214
sample estimates:
mean of the differences 
               2.793103 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: 0.1944849 (negligible)
95 percent confidence interval:
     lower      upper 
0.05521042 0.33375932 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: 0.1761995 (negligible)
95 percent confidence interval:
     lower      upper 
0.05022958 0.30216940 
# returns correlation between variables
cor_test(data = E1_STRnCUZ_clean, "NoChoice_STR_moral", "NoChoice_CUZ_moral", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(201) |         p
----------------------------------------------------------------------------------
NoChoice_STR_moral | NoChoice_CUZ_moral | 0.59 | [0.49, 0.67] |  10.35 | < .001***

Observations: 203
Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = -2.4091, df = 202, p-value = 0.01689
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -7.6142845 -0.7600997
sample estimates:
mean of the differences 
              -4.187192 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.1690857 (negligible)
95 percent confidence interval:
      lower       upper 
-0.30804426 -0.03012719 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "STR vs CUZ") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.22502 (small)
95 percent confidence interval:
      lower       upper 
-0.41094859 -0.03909133 
# returns correlation between variables
cor_test(data = E1_STRnCUZ_clean, "Choice_STRnCUZ_STR_moral", "Choice_STRnCUZ_CUZ_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |        95% CI | t(201) |     p
-------------------------------------------------------------------------------------------
Choice_STRnCUZ_STR_moral | Choice_STRnCUZ_CUZ_moral | 0.11 | [-0.02, 0.25] |   1.63 | 0.104

Observations: 203

CUZnSIB

No Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = 0.34573, df = 204, p-value = 0.7299
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1.628815  2.321498
sample estimates:
mean of the differences 
              0.3463415 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: 0.02414673 (negligible)
95 percent confidence interval:
     lower      upper 
-0.1131704  0.1614638 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "No Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: 0.02173942 (negligible)
95 percent confidence interval:
     lower      upper 
-0.1018844  0.1453633 
# returns correlation between variables
cor_test(data = E1_CUZnSIB_clean, "NoChoice_CUZ_moral", "NoChoice_SIB_moral", method = "Pearson")
Parameter1         |         Parameter2 |    r |       95% CI | t(203) |         p
----------------------------------------------------------------------------------
NoChoice_CUZ_moral | NoChoice_SIB_moral | 0.59 | [0.50, 0.68] |  10.54 | < .001***

Observations: 205
Choice
# returns t-test results
t.test(moral ~ Relation, 
       data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
       paired = T)

    Paired t-test

data:  moral by Relation
t = -5.1188, df = 204, p-value = 7.088e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -10.317915  -4.579646
sample estimates:
mean of the differences 
               -7.44878 
# returns dz effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = F) # setting this to false ensures dz is calculated, using difference score

Cohen's d

d estimate: -0.3575111 (small)
95 percent confidence interval:
     lower      upper 
-0.4991274 -0.2158948 
# returns d-av effect size and 95% CIs
effsize::cohen.d(moral ~ Relation | Subject(ResponseId),
                 data = E1_all_long %>% filter(BSs_cond == "CUZ vs SIB") %>% filter(`Choice Context` == "Choice") %>% droplevels(), 
                 paired = T,
                 within = T) # setting this to true ensures d-av is calculated, using raw scores

Cohen's d

d estimate: -0.4281153 (small)
95 percent confidence interval:
     lower      upper 
-0.5998953 -0.2563353 
# returns correlation between variables
cor_test(data = E1_CUZnSIB_clean, "Choice_CUZnSIB_CUZ_moral", "Choice_CUZnSIB_SIB_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(203) |         p
----------------------------------------------------------------------------------------------
Choice_CUZnSIB_CUZ_moral | Choice_CUZnSIB_SIB_moral | 0.28 | [0.15, 0.40] |   4.20 | < .001***

Observations: 205

Moral Diff ~ Oblig Diff Plots

# Create difference score datasets for plotting of diff score correlations

# STRnCUZ
E1_diff_STRnCUZ_cond_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_diff_STRnCUZ_oblig_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(NoChoice_STRminusCUZ_oblig, Choice_STRminusCUZ_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )

E1_diff_STRnCUZ_moral_long <- E1_STRnCUZ_clean %>%
  pivot_longer(
    cols = c(NoChoice_STRminusCUZ_moral, Choice_STRminusCUZ_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long STRnCUZ datasets, select plotting variables, and create condition variable for `Choice Context` factor
E1_diff_STRnCUZ_long <- cbind(E1_diff_STRnCUZ_cond_long, E1_diff_STRnCUZ_oblig_long, E1_diff_STRnCUZ_moral_long)
E1_diff_STRnCUZ_long <- E1_diff_STRnCUZ_long[, !duplicated(colnames(E1_diff_STRnCUZ_long))] # get rid of duplicate columns

E1_diff_STRnCUZ_long <- E1_diff_STRnCUZ_long %>%
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "Choice"))

# Reorder/rename condition, and participant factors
E1_diff_STRnCUZ_long$`Choice Context` <- as.factor(E1_diff_STRnCUZ_long$`Choice Context`)
E1_diff_STRnCUZ_long$`Choice Context` <- ordered(E1_diff_STRnCUZ_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_diff_STRnCUZ_long$ResponseId <- as.factor(E1_diff_STRnCUZ_long$ResponseId)


# STRnSIB
E1_diff_STRnSIB_cond_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_diff_STRnSIB_oblig_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_STRminusSIB_oblig, Choice_STRminusSIB_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )

E1_diff_STRnSIB_moral_long <- E1_STRnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_STRminusSIB_moral, Choice_STRminusSIB_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long STRnSIB datasets, select plotting variables, and create condition variable for `Choice Context` factor
E1_diff_STRnSIB_long <- cbind(E1_diff_STRnSIB_cond_long, E1_diff_STRnSIB_oblig_long, E1_diff_STRnSIB_moral_long)
E1_diff_STRnSIB_long <- E1_diff_STRnSIB_long[, !duplicated(colnames(E1_diff_STRnSIB_long))] # get rid of duplicate columns

E1_diff_STRnSIB_long <- E1_diff_STRnSIB_long %>%
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "Choice"))

# Reorder/rename condition, and participant factors
E1_diff_STRnSIB_long$`Choice Context` <- as.factor(E1_diff_STRnSIB_long$`Choice Context`)
E1_diff_STRnSIB_long$`Choice Context` <- ordered(E1_diff_STRnSIB_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_diff_STRnSIB_long$ResponseId <- as.factor(E1_diff_STRnSIB_long$ResponseId)


# CUZnSIB
E1_diff_CUZnSIB_cond_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(Dist_Scen, Close_Scen),
    names_to = "WSs_cond",
    values_to = "Condition"
  )

E1_diff_CUZnSIB_oblig_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_CUZminusSIB_oblig, Choice_CUZminusSIB_oblig),
    names_to = "WSs_cond",
    values_to = "oblig"
  )

E1_diff_CUZnSIB_moral_long <- E1_CUZnSIB_clean %>%
  pivot_longer(
    cols = c(NoChoice_CUZminusSIB_moral, Choice_CUZminusSIB_moral),
    names_to = "WSs_cond",
    values_to = "moral"
  )

# Combine long CUZnSIB datasets, select plotting variables, and create condition variable for `Choice Context` factor
E1_diff_CUZnSIB_long <- cbind(E1_diff_CUZnSIB_cond_long, E1_diff_CUZnSIB_oblig_long, E1_diff_CUZnSIB_moral_long)
E1_diff_CUZnSIB_long <- E1_diff_CUZnSIB_long[, !duplicated(colnames(E1_diff_CUZnSIB_long))] # get rid of duplicate columns

E1_diff_CUZnSIB_long <- E1_diff_CUZnSIB_long %>%
  select(ResponseId,
         Age:OUS_IB,
         BSs_cond,
         WSs_cond,
         Condition,
         oblig, moral) %>%
  mutate(`Choice Context` = case_when(
    WSs_cond == "Dist_Scen" ~ "No Choice",
    WSs_cond == "Close_Scen" ~ "Choice"))

# Reorder/rename condition, and participant factors
E1_diff_CUZnSIB_long$`Choice Context` <- as.factor(E1_diff_CUZnSIB_long$`Choice Context`)
E1_diff_CUZnSIB_long$`Choice Context` <- ordered(E1_diff_CUZnSIB_long$`Choice Context`, levels = c("No Choice", "Choice"))
E1_diff_CUZnSIB_long$ResponseId <- as.factor(E1_diff_CUZnSIB_long$ResponseId)


# Combine into one dataset for plotting
E1_diff_all_long <- rbind(E1_diff_STRnSIB_long, E1_diff_STRnCUZ_long, E1_diff_CUZnSIB_long)
# Reorder All_long BSs_cond
E1_diff_all_long$BSs_cond <- as.factor(E1_diff_all_long$BSs_cond)
E1_diff_all_long$BSs_cond <- ordered(E1_diff_all_long$BSs_cond, levels = c("STR vs SIB", "STR vs CUZ", "CUZ vs SIB"))

STRnSIB

print(oblig_moral_diff_plot_STRnSIB <- ggplot(data = E1_diff_STRnSIB_long, aes(x = oblig, y = moral)) +
        geom_jitter(color = "darkorchid1", alpha = 0.5) +
        geom_smooth(method = 'lm', color = "darkorchid1") +
        facet_wrap(BSs_cond~`Choice Context`) +
        scale_x_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        scale_y_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        theme_classic() +
        xlab("Obligation Strength Difference (Distant - Close)") +
        ylab("Moral Character Difference (Distant - Close)") +
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12)))

STRnCUZ

print(oblig_moral_diff_plot_STRnCUZ <- ggplot(data = E1_diff_STRnCUZ_long, aes(x = oblig, y = moral)) +
        geom_jitter(color = "darkorchid1", alpha = 0.5) +
        geom_smooth(method = 'lm', color = "darkorchid1") +
        facet_wrap(BSs_cond~`Choice Context`) +
        scale_x_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        scale_y_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        theme_classic() +
        xlab("Obligation Strength Difference (Distant - Close)") +
        ylab("Moral Character Difference (Distant - Close)") +
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12)))

CUZnSIB

print(oblig_moral_diff_plot_CUZnSIB <- ggplot(data = E1_diff_CUZnSIB_long, aes(x = oblig, y = moral)) +
        geom_jitter(color = "darkorchid1", alpha = 0.5) +
        geom_smooth(method = 'lm', color = "darkorchid1") +
        facet_wrap(BSs_cond~`Choice Context`) +
        scale_x_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        scale_y_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        theme_classic() +
        xlab("Obligation Strength Difference (Distant - Close)") +
        ylab("Moral Character Difference (Distant - Close)") +
        theme(axis.title.x = element_text(size = 14), 
              axis.title.y = element_text(size = 14),
              axis.text.x = element_text(color = "black", size = 12), 
              axis.text.y = element_text(color = "black", size = 12)))

Combined

print(oblig_moral_diff_plot_combined <- ggplot(data = E1_diff_all_long, aes(x = oblig, y = moral)) +
        geom_jitter(color = "darkorchid1", alpha = 0.5) +
        geom_smooth(method = 'lm', color = "darkorchid1") +
        facet_wrap(BSs_cond~`Choice Context`, nrow = 3) +
        scale_x_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        scale_y_continuous(limits = c(-101,101), breaks = c(-100,-50,0,50,100)) +
        theme_classic() +
        xlab("\nObligation Strength Difference (Distant - Close)") +
        ylab("Moral Character Difference (Distant - Close)\n") +
        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)))


ggsave("E1_moral~oblig_plot.png")
Saving 14 x 9 in image

Moral Diff ~ Oblig Diff Tests


See our pre-registration (https://osf.io/6q4kr/?view_only=8033c65c9dfc41bcbc528fe94409e4e8) and manuscript for our predictions about the relationship between obligation differences and moral character differences.


STRnSIB

No Choice

# pearson's r
cor_test(E1_STRnSIB_clean, "NoChoice_STRminusSIB_oblig", "NoChoice_STRminusSIB_moral", method = "Pearson")
Parameter1                 |                 Parameter2 |    r |        95% CI | t(201) |     p
-----------------------------------------------------------------------------------------------
NoChoice_STRminusSIB_oblig | NoChoice_STRminusSIB_moral | 0.07 | [-0.07, 0.21] |   1.01 | 0.316

Observations: 203

Choice

# pearson's r
cor_test(E1_STRnSIB_clean, "Choice_STRminusSIB_oblig", "Choice_STRminusSIB_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(201) |       p
--------------------------------------------------------------------------------------------
Choice_STRminusSIB_oblig | Choice_STRminusSIB_moral | 0.18 | [0.05, 0.31] |   2.65 | 0.009**

Observations: 203

STRnCUZ

No Choice

# pearson's r
cor_test(E1_STRnCUZ_clean, "NoChoice_STRminusCUZ_oblig", "NoChoice_STRminusCUZ_moral", method = "Pearson")
Parameter1                 |                 Parameter2 |    r |        95% CI | t(201) |     p
-----------------------------------------------------------------------------------------------
NoChoice_STRminusCUZ_oblig | NoChoice_STRminusCUZ_moral | 0.03 | [-0.11, 0.16] |   0.38 | 0.702

Observations: 203

Choice

# pearson's r
cor_test(E1_STRnCUZ_clean, "Choice_STRminusCUZ_oblig", "Choice_STRminusCUZ_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(201) |         p
----------------------------------------------------------------------------------------------
Choice_STRminusCUZ_oblig | Choice_STRminusCUZ_moral | 0.39 | [0.27, 0.50] |   6.00 | < .001***

Observations: 203

CUZnSIB

No Choice

# pearson's r
cor_test(E1_CUZnSIB_clean, "NoChoice_CUZminusSIB_oblig", "NoChoice_CUZminusSIB_moral", method = "Pearson")
Parameter1                 |                 Parameter2 |     r |        95% CI | t(203) |     p
------------------------------------------------------------------------------------------------
NoChoice_CUZminusSIB_oblig | NoChoice_CUZminusSIB_moral | -0.03 | [-0.17, 0.10] |  -0.48 | 0.635

Observations: 205

Choice

# pearson's r
cor_test(E1_CUZnSIB_clean, "Choice_CUZminusSIB_oblig", "Choice_CUZminusSIB_moral", method = "Pearson")
Parameter1               |               Parameter2 |    r |       95% CI | t(203) |       p
--------------------------------------------------------------------------------------------
Choice_CUZminusSIB_oblig | Choice_CUZminusSIB_moral | 0.19 | [0.06, 0.32] |   2.78 | 0.006**

Observations: 205

Moral ~ Oblig R-M Plots

STRnSIB

No Choice

rmcorr_STRnSIB_NoChoice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "STR vs SIB") %>%
                                             filter(`Choice Context` == "No Choice"))
print(rmcorr_plot_STRnSIB_NoChoice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "STR vs SIB") %>% 
                                         filter(`Choice Context` == "No Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_STRnSIB_NoChoice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

Choice

rmcorr_STRnSIB_Choice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "STR vs SIB") %>%
                                             filter(`Choice Context` == "Choice"))
print(rmcorr_plot_STRnSIB_Choice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "STR vs SIB") %>% 
                                         filter(`Choice Context` == "Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_STRnSIB_Choice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

STRnCUZ

No Choice

rmcorr_STRnCUZ_NoChoice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "STR vs CUZ") %>%
                                             filter(`Choice Context` == "No Choice"))
print(rmcorr_plot_STRnCUZ_NoChoice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "STR vs CUZ") %>% 
                                         filter(`Choice Context` == "No Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_STRnCUZ_NoChoice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

Choice

rmcorr_STRnCUZ_Choice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "STR vs CUZ") %>%
                                             filter(`Choice Context` == "Choice"))
print(rmcorr_plot_STRnCUZ_Choice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "STR vs CUZ") %>% 
                                         filter(`Choice Context` == "Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_STRnCUZ_Choice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

CUZnSIB

No Choice

rmcorr_CUZnSIB_NoChoice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "CUZ vs SIB") %>%
                                             filter(`Choice Context` == "No Choice"))
print(rmcorr_plot_CUZnSIB_NoChoice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "CUZ vs SIB") %>% 
                                         filter(`Choice Context` == "No Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_CUZnSIB_NoChoice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

Choice

rmcorr_CUZnSIB_Choice <- rmcorr(participant = ResponseId, 
                                  measure1 = oblig, 
                                  measure2 = moral, 
                                  dataset = E1_all_long %>%
                                    filter(BSs_cond == "CUZ vs SIB") %>%
                                             filter(`Choice Context` == "Choice"))
print(rmcorr_plot_CUZnSIB_Choice <- ggplot(data = E1_all_long %>% 
                                         filter(BSs_cond == "CUZ vs SIB") %>% 
                                         filter(`Choice Context` == "Choice"),
                                       aes(x = oblig, y = moral, group = ResponseId, color = ResponseId)) +
                                         geom_point(aes(color = ResponseId)) +
                                         geom_line(aes(y = rmcorr_CUZnSIB_Choice$model$fitted.values), linetype = 1) +
                                         scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                         theme_classic() +
                                         xlab("Obligation Strength") +
                                         ylab("Moral Character") +
                                         theme(axis.title.x = element_text(size = 14), 
                                               axis.title.y = element_text(size = 14),
                                               axis.text.x = element_text(color = "black", size = 12), 
                                               axis.text.y = element_text(color = "black", size = 12),
                                               legend.position = "none"))

Moral ~ Oblig R-M Tests


See our manuscript for our predictions about the within-individual relationship between obligation judgments and moral character judgments.


STRnSIB

No Choice

print(rmcorr_STRnSIB_NoChoice)

Repeated measures correlation

r
-0.0102866

degrees of freedom
202

p-value
0.8839031

95% confidence interval
-0.1481273 0.1279461 

Choice

print(rmcorr_STRnSIB_Choice)

Repeated measures correlation

r
0.3726286

degrees of freedom
202

p-value
4.05481e-08

95% confidence interval
0.2472991 0.4856947 

STRnCUZ

No Choice

print(rmcorr_STRnCUZ_NoChoice)

Repeated measures correlation

r
-0.05309295

degrees of freedom
202

p-value
0.4507343

95% confidence interval
-0.1897531 0.08558536 

Choice

print(rmcorr_STRnCUZ_Choice)

Repeated measures correlation

r
0.4095764

degrees of freedom
202

p-value
1.18001e-09

95% confidence interval
0.2877982 0.5183203 

CUZnSIB

No Choice

print(rmcorr_CUZnSIB_NoChoice)

Repeated measures correlation

r
-0.03701313

degrees of freedom
204

p-value
0.5973697

95% confidence interval
-0.1735021 0.1008709 

Choice

print(rmcorr_CUZnSIB_Choice)

Repeated measures correlation

r
0.3122796

degrees of freedom
204

p-value
4.887046e-06

95% confidence interval
0.182748 0.431155 

Ind. Diff Internal Reliabilty Tests

MAC Family Values

STRnSIB

# create dataset with only MAC Family Values variables
E1_STRnSIB_clean_MAConly <- E1_STRnSIB_clean %>% select(MAC_Jud_1:MAC_Rel_3)

psych::alpha(E1_STRnSIB_clean_MAConly)
Number of categories should be increased  in order to count frequencies. 

Reliability analysis   
Call: psych::alpha(x = E1_STRnSIB_clean_MAConly)

 

 lower alpha upper     95% confidence boundaries
0.9 0.92 0.94 

 Reliability if an item is dropped:

 Item statistics 

STRnCUZ

# create dataset with only MAC Family Values variables
E1_STRnCUZ_clean_MAConly <- E1_STRnCUZ_clean %>% select(MAC_Jud_1:MAC_Rel_3)

psych::alpha(E1_STRnCUZ_clean_MAConly)
Number of categories should be increased  in order to count frequencies. 

Reliability analysis   
Call: psych::alpha(x = E1_STRnCUZ_clean_MAConly)

 

 lower alpha upper     95% confidence boundaries
0.9 0.92 0.93 

 Reliability if an item is dropped:

 Item statistics 

CUZnSIB

# create dataset with only MAC Family Values variables
E1_CUZnSIB_clean_MAConly <- E1_CUZnSIB_clean %>% select(MAC_Jud_1:MAC_Rel_3)

psych::alpha(E1_CUZnSIB_clean_MAConly)
Number of categories should be increased  in order to count frequencies. 

Reliability analysis   
Call: psych::alpha(x = E1_CUZnSIB_clean_MAConly)

 

 lower alpha upper     95% confidence boundaries
0.9 0.92 0.94 

 Reliability if an item is dropped:

 Item statistics 

MFT Ingroup Loyalty

STRnSIB

# create dataset with only MFQ Family Values variables
E1_STRnSIB_clean_MFQonly <- E1_STRnSIB_clean %>% select(MFQ_Jud_1:MFQ_Rel_3)

psych::alpha(E1_STRnSIB_clean_MFQonly)

Reliability analysis   
Call: psych::alpha(x = E1_STRnSIB_clean_MFQonly)

 

 lower alpha upper     95% confidence boundaries
0.76 0.8 0.84 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
             1    2    3    4    5    6 miss
MFQ_Jud_1 0.23 0.18 0.18 0.19 0.16 0.06    0
MFQ_Jud_2 0.20 0.23 0.23 0.19 0.13 0.03    0
MFQ_Jud_3 0.12 0.13 0.26 0.33 0.09 0.05    0
MFQ_Rel_1 0.33 0.30 0.17 0.15 0.05 0.01    0
MFQ_Rel_2 0.08 0.15 0.19 0.29 0.20 0.09    0
MFQ_Rel_3 0.08 0.11 0.26 0.30 0.20 0.05    0

STRnCUZ

# create dataset with only MFQ Family Values variables
E1_STRnCUZ_clean_MFQonly <- E1_STRnCUZ_clean %>% select(MFQ_Jud_1:MFQ_Rel_3)

psych::alpha(E1_STRnCUZ_clean_MFQonly)

Reliability analysis   
Call: psych::alpha(x = E1_STRnCUZ_clean_MFQonly)

 

 lower alpha upper     95% confidence boundaries
0.76 0.8 0.84 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
             1    2    3    4    5    6 miss
MFQ_Jud_1 0.18 0.17 0.17 0.24 0.12 0.12    0
MFQ_Jud_2 0.18 0.27 0.21 0.19 0.12 0.04    0
MFQ_Jud_3 0.07 0.21 0.31 0.24 0.15 0.03    0
MFQ_Rel_1 0.28 0.28 0.16 0.18 0.07 0.03    0
MFQ_Rel_2 0.06 0.15 0.19 0.28 0.23 0.09    0
MFQ_Rel_3 0.07 0.15 0.22 0.30 0.21 0.05    0

CUZnSIB

# create dataset with only MFQ Family Values variables
E1_CUZnSIB_clean_MFQonly <- E1_CUZnSIB_clean %>% select(MFQ_Jud_1:MFQ_Rel_3)

psych::alpha(E1_CUZnSIB_clean_MFQonly)

Reliability analysis   
Call: psych::alpha(x = E1_CUZnSIB_clean_MFQonly)

 

 lower alpha upper     95% confidence boundaries
0.68 0.73 0.79 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
             1    2    3    4    5    6 miss
MFQ_Jud_1 0.17 0.20 0.18 0.23 0.15 0.08    0
MFQ_Jud_2 0.17 0.16 0.31 0.19 0.15 0.02    0
MFQ_Jud_3 0.09 0.17 0.30 0.28 0.13 0.03    0
MFQ_Rel_1 0.27 0.27 0.14 0.20 0.08 0.03    0
MFQ_Rel_2 0.05 0.18 0.21 0.27 0.19 0.09    0
MFQ_Rel_3 0.06 0.16 0.18 0.32 0.19 0.09    0

OUS Impartial Beneficence

STRnSIB

# create dataset with only MFQ Family Values variables
E1_STRnSIB_clean_OUSonly <- E1_STRnSIB_clean %>% select(OUS_IB1:OUS_IB5)

psych::alpha(E1_STRnSIB_clean_OUSonly)

Reliability analysis   
Call: psych::alpha(x = E1_STRnSIB_clean_OUSonly)

 

 lower alpha upper     95% confidence boundaries
0.68 0.74 0.8 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
           1    2    3    4    5    6    7 miss
OUS_IB1 0.23 0.22 0.19 0.17 0.13 0.04 0.01    0
OUS_IB2 0.18 0.22 0.17 0.16 0.17 0.06 0.03    0
OUS_IB3 0.04 0.14 0.22 0.09 0.27 0.15 0.09    0
OUS_IB4 0.15 0.26 0.21 0.14 0.11 0.09 0.03    0
OUS_IB5 0.10 0.25 0.23 0.10 0.18 0.11 0.02    0

STRnCUZ

# create dataset with only MFQ Family Values variables
E1_STRnCUZ_clean_OUSonly <- E1_STRnCUZ_clean %>% select(OUS_IB1:OUS_IB5)

psych::alpha(E1_STRnCUZ_clean_OUSonly)

Reliability analysis   
Call: psych::alpha(x = E1_STRnCUZ_clean_OUSonly)

 

 lower alpha upper     95% confidence boundaries
0.73 0.78 0.83 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
           1    2    3    4    5    6    7 miss
OUS_IB1 0.24 0.22 0.14 0.18 0.14 0.06 0.02    0
OUS_IB2 0.18 0.18 0.17 0.15 0.19 0.11 0.02    0
OUS_IB3 0.08 0.13 0.15 0.15 0.19 0.19 0.10    0
OUS_IB4 0.15 0.24 0.21 0.12 0.18 0.06 0.05    0
OUS_IB5 0.14 0.21 0.19 0.14 0.19 0.07 0.05    0

CUZnSIB

# create dataset with only MFQ Family Values variables
E1_CUZnSIB_clean_OUSonly <- E1_CUZnSIB_clean %>% select(OUS_IB1:OUS_IB5)

psych::alpha(E1_CUZnSIB_clean_OUSonly)

Reliability analysis   
Call: psych::alpha(x = E1_CUZnSIB_clean_OUSonly)

 

 lower alpha upper     95% confidence boundaries
0.68 0.74 0.79 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
           1    2    3    4    5    6    7 miss
OUS_IB1 0.19 0.22 0.15 0.20 0.14 0.08 0.01    0
OUS_IB2 0.15 0.20 0.21 0.18 0.16 0.08 0.02    0
OUS_IB3 0.05 0.08 0.18 0.16 0.25 0.20 0.08    0
OUS_IB4 0.09 0.19 0.20 0.18 0.20 0.12 0.02    0
OUS_IB5 0.07 0.18 0.19 0.21 0.23 0.10 0.01    0

Oblig ~ Ind. Diff Plots

MAC Family Values

print(oblig_mac_comp_plot <- ggplot(data = E1_all_long, aes(x = MAC_Fam_Combined, y = oblig, color = Relation)) +
                                            geom_jitter(aes(color = Relation), alpha = 0.5) +
                                            scale_color_manual(values = c("lightskyblue3", "indianred3")) +
                                            geom_smooth(method = 'lm') +
                                            facet_wrap(BSs_cond~`Choice Context`, ncol = 2) +
                                            scale_x_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                            scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                            theme_classic() +
                                            xlab("\nMAC Family Values Composite") +
                                            ylab("Obligation Strength\n") +
                                                    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("E1_oblig~MAC_plot.png")
Saving 14 x 9 in image

MFT Ingroup Loyalty

print(oblig_mft_comp_plot <- ggplot(data = E1_all_long, aes(x = MFQ_Loyalty_Combined, y = oblig, color = Relation)) +
                                            geom_jitter(aes(color = Relation), alpha = 0.5) +
                                            scale_color_manual(values = c("lightskyblue3", "indianred3")) +
                                            geom_smooth(method = 'lm') +
                                            facet_wrap(BSs_cond~`Choice Context`, ncol = 2) +
                                            scale_x_continuous(limits = c(.5,6.5), breaks = c(1,2,3,4,5,6)) +
                                            scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                            theme_classic() +
                                            xlab("\nMFT Ingroup Loyalty Composite") +
                                            ylab("Obligation Strength\n") +
                                                    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("E1_oblig~MFT_plot.png")
Saving 14 x 9 in image

OUS Impartial Beneficence

print(oblig_ous_comp_plot <- ggplot(data = E1_all_long, aes(x = OUS_IB, y = oblig, color = Relation)) +
                                            geom_jitter(aes(color = Relation), alpha = 0.5) +
                                            scale_color_manual(values = c("lightskyblue3", "indianred3")) +
                                            geom_smooth(method = 'lm') +
                                            facet_wrap(BSs_cond~`Choice Context`, ncol = 2) +
                                            scale_x_continuous(limits = c(.5,7.5), breaks = c(1,2,3,4,5,6,7)) +
                                            scale_y_continuous(limits = c(-1,101), breaks = c(0,25,50,75,100)) +
                                            theme_classic() +
                                            xlab("\nOUS Impartial Beneficence Composite") +
                                            ylab("Obligation Strength\n") +
                                                    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("E1_oblig~OUS_plot.png")
Saving 14 x 9 in image

Oblig ~ Ind. Diff Tests


See our pre-registration (https://osf.io/6q4kr/?view_only=8033c65c9dfc41bcbc528fe94409e4e8) and manuscript for our predictions about the relationship between individual differences and obligation judgments.


MAC Family Values

STRnSIB

No Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "NoChoice_STR_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |       95% CI | t(201) |       p
------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_STR_oblig | 0.23 | [0.09, 0.36] |   3.33 | 0.001**

Observations: 203
# close pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_SIB_oblig | 0.35 | [0.23, 0.47] |   5.34 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "NoChoice_STRminusSIB_oblig", method = "Pearson")
Parameter1       |                 Parameter2 |     r |        95% CI | t(201) |     p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_STRminusSIB_oblig | -0.12 | [-0.25, 0.02] |  -1.74 | 0.084

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "Choice_STRnSIB_STR_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRnSIB_STR_oblig | 0.25 | [0.12, 0.38] |   3.73 | < .001***

Observations: 203
# distant pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "Choice_STRnSIB_SIB_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRnSIB_SIB_oblig | 0.43 | [0.31, 0.54] |   6.79 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "MAC_Fam_Combined", "Choice_STRminusSIB_oblig", method = "Pearson")
Parameter1       |               Parameter2 |     r |         95% CI | t(201) |         p
-----------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRminusSIB_oblig | -0.30 | [-0.42, -0.17] |  -4.40 | < .001***

Observations: 203

STRnCUZ

No Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "NoChoice_STR_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |        95% CI | t(201) |     p
-----------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_STR_oblig | 0.06 | [-0.07, 0.20] |   0.91 | 0.365

Observations: 203
# close pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |       95% CI | t(201) |       p
------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_CUZ_oblig | 0.22 | [0.08, 0.34] |   3.16 | 0.002**

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "NoChoice_STRminusCUZ_oblig", method = "Pearson")
Parameter1       |                 Parameter2 |     r |        95% CI | t(201) |     p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_STRminusCUZ_oblig | -0.14 | [-0.27, 0.00] |  -1.95 | 0.053

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "Choice_STRnCUZ_STR_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(201) |       p
------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRnCUZ_STR_oblig | 0.19 | [0.05, 0.32] |   2.68 | 0.008**

Observations: 203
# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "Choice_STRnCUZ_CUZ_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRnCUZ_CUZ_oblig | 0.36 | [0.24, 0.48] |   5.50 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "MAC_Fam_Combined", "Choice_STRminusCUZ_oblig", method = "Pearson")
Parameter1       |               Parameter2 |     r |         95% CI | t(201) |         p
-----------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_STRminusCUZ_oblig | -0.30 | [-0.42, -0.17] |  -4.51 | < .001***

Observations: 203

CUZnSIB

No Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_CUZ_oblig | 0.26 | [0.12, 0.38] |   3.78 | < .001***

Observations: 205
# close pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1       |         Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_SIB_oblig | 0.48 | [0.36, 0.58] |   7.75 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "NoChoice_CUZminusSIB_oblig", method = "Pearson")
Parameter1       |                 Parameter2 |     r |         95% CI | t(203) |       p
-----------------------------------------------------------------------------------------
MAC_Fam_Combined | NoChoice_CUZminusSIB_oblig | -0.21 | [-0.34, -0.08] |  -3.07 | 0.002**

Observations: 205

Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "Choice_CUZnSIB_CUZ_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_CUZnSIB_CUZ_oblig | 0.32 | [0.19, 0.44] |   4.86 | < .001***

Observations: 205
# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "Choice_CUZnSIB_SIB_oblig", method = "Pearson")
Parameter1       |               Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_CUZnSIB_SIB_oblig | 0.40 | [0.28, 0.51] |   6.23 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "MAC_Fam_Combined", "Choice_CUZminusSIB_oblig", method = "Pearson")
Parameter1       |               Parameter2 |     r |         95% CI | t(203) |         p
-----------------------------------------------------------------------------------------
MAC_Fam_Combined | Choice_CUZminusSIB_oblig | -0.23 | [-0.36, -0.10] |  -3.41 | < .001***

Observations: 205

MFT Ingroup Loyalty

STRnSIB

No Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_STR_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |       95% CI | t(201) |         p
------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_STR_oblig | 0.29 | [0.16, 0.41] |   4.34 | < .001***

Observations: 203
# close pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |       95% CI | t(201) |         p
------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_SIB_oblig | 0.32 | [0.19, 0.44] |   4.80 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_STRminusSIB_oblig", method = "Pearson")
Parameter1           |                 Parameter2 |     r |        95% CI | t(201) |     p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_STRminusSIB_oblig | -0.05 | [-0.18, 0.09] |  -0.67 | 0.505

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "Choice_STRnSIB_STR_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(201) |       p
----------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRnSIB_STR_oblig | 0.22 | [0.09, 0.35] |   3.26 | 0.001**

Observations: 203
# distant pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "Choice_STRnSIB_SIB_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(201) |         p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRnSIB_SIB_oblig | 0.36 | [0.24, 0.48] |   5.54 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "MFQ_Loyalty_Combined", "Choice_STRminusSIB_oblig", method = "Pearson")
Parameter1           |               Parameter2 |     r |         95% CI | t(201) |         p
---------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRminusSIB_oblig | -0.24 | [-0.37, -0.11] |  -3.50 | < .001***

Observations: 203

STRnCUZ

No Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "NoChoice_STR_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |        95% CI | t(201) |     p
---------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_STR_oblig | 0.04 | [-0.10, 0.18] |   0.59 | 0.555

Observations: 203
# close pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |       95% CI | t(201) |      p
---------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_CUZ_oblig | 0.16 | [0.02, 0.29] |   2.24 | 0.026*

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "NoChoice_STRminusCUZ_oblig", method = "Pearson")
Parameter1           |                 Parameter2 |     r |        95% CI | t(201) |     p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_STRminusCUZ_oblig | -0.10 | [-0.24, 0.04] |  -1.44 | 0.152

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "Choice_STRnCUZ_STR_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(201) |       p
----------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRnCUZ_STR_oblig | 0.22 | [0.08, 0.35] |   3.19 | 0.002**

Observations: 203
# distant pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "Choice_STRnCUZ_CUZ_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(201) |         p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRnCUZ_CUZ_oblig | 0.37 | [0.24, 0.48] |   5.60 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "MFQ_Loyalty_Combined", "Choice_STRminusCUZ_oblig", method = "Pearson")
Parameter1           |               Parameter2 |     r |         95% CI | t(201) |         p
---------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_STRminusCUZ_oblig | -0.27 | [-0.39, -0.13] |  -3.91 | < .001***

Observations: 203

CUZnSIB

No Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |       95% CI | t(203) |      p
---------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_CUZ_oblig | 0.17 | [0.03, 0.30] |   2.47 | 0.014*

Observations: 205
# close pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1           |         Parameter2 |    r |       95% CI | t(203) |         p
------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_SIB_oblig | 0.25 | [0.11, 0.37] |   3.64 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "NoChoice_CUZminusSIB_oblig", method = "Pearson")
Parameter1           |                 Parameter2 |     r |        95% CI | t(203) |     p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | NoChoice_CUZminusSIB_oblig | -0.07 | [-0.21, 0.06] |  -1.07 | 0.288

Observations: 205

Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "Choice_CUZnSIB_CUZ_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(203) |      p
---------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_CUZnSIB_CUZ_oblig | 0.16 | [0.02, 0.29] |   2.32 | 0.021*

Observations: 205
# distant pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "Choice_CUZnSIB_SIB_oblig", method = "Pearson")
Parameter1           |               Parameter2 |    r |       95% CI | t(203) |         p
------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_CUZnSIB_SIB_oblig | 0.24 | [0.10, 0.36] |   3.45 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "MFQ_Loyalty_Combined", "Choice_CUZminusSIB_oblig", method = "Pearson")
Parameter1           |               Parameter2 |     r |         95% CI | t(203) |       p
-------------------------------------------------------------------------------------------
MFQ_Loyalty_Combined | Choice_CUZminusSIB_oblig | -0.20 | [-0.33, -0.06] |  -2.88 | 0.004**

Observations: 205

OUS Impartial Beneficence

STRnSIB

No Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "NoChoice_STR_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |       95% CI | t(201) |      p
-----------------------------------------------------------------------
OUS_IB     | NoChoice_STR_oblig | 0.15 | [0.02, 0.29] |   2.22 | 0.027*

Observations: 203
# close pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |        95% CI | t(201) |     p
-----------------------------------------------------------------------
OUS_IB     | NoChoice_SIB_oblig | 0.08 | [-0.05, 0.22] |   1.21 | 0.228

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "NoChoice_STRminusSIB_oblig", method = "Pearson")
Parameter1 |                 Parameter2 |    r |        95% CI | t(201) |     p
-------------------------------------------------------------------------------
OUS_IB     | NoChoice_STRminusSIB_oblig | 0.05 | [-0.09, 0.18] |   0.65 | 0.515

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "Choice_STRnSIB_STR_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------
OUS_IB     | Choice_STRnSIB_STR_oblig | 0.31 | [0.18, 0.43] |   4.57 | < .001***

Observations: 203
# distant pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "Choice_STRnSIB_SIB_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(201) |       p
------------------------------------------------------------------------------
OUS_IB     | Choice_STRnSIB_SIB_oblig | 0.21 | [0.08, 0.34] |   3.08 | 0.002**

Observations: 203
# diff pearson's r
cor_test(E1_STRnSIB_clean, "OUS_IB", "Choice_STRminusSIB_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |        95% CI | t(201) |     p
-----------------------------------------------------------------------------
OUS_IB     | Choice_STRminusSIB_oblig | 0.04 | [-0.10, 0.18] |   0.58 | 0.560

Observations: 203

STRnCUZ

No Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "NoChoice_STR_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |       95% CI | t(201) |      p
-----------------------------------------------------------------------
OUS_IB     | NoChoice_STR_oblig | 0.17 | [0.03, 0.30] |   2.44 | 0.015*

Observations: 203
# close pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------
OUS_IB     | NoChoice_CUZ_oblig | 0.24 | [0.11, 0.37] |   3.52 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "NoChoice_STRminusCUZ_oblig", method = "Pearson")
Parameter1 |                 Parameter2 |     r |        95% CI | t(201) |     p
--------------------------------------------------------------------------------
OUS_IB     | NoChoice_STRminusCUZ_oblig | -0.08 | [-0.22, 0.06] |  -1.16 | 0.248

Observations: 203

Choice

# distant pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "Choice_STRnCUZ_STR_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------
OUS_IB     | Choice_STRnCUZ_STR_oblig | 0.42 | [0.30, 0.53] |   6.62 | < .001***

Observations: 203
# distant pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "Choice_STRnCUZ_CUZ_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(201) |         p
--------------------------------------------------------------------------------
OUS_IB     | Choice_STRnCUZ_CUZ_oblig | 0.46 | [0.34, 0.56] |   7.24 | < .001***

Observations: 203
# diff pearson's r
cor_test(E1_STRnCUZ_clean, "OUS_IB", "Choice_STRminusCUZ_oblig", method = "Pearson")
Parameter1 |               Parameter2 |     r |        95% CI | t(201) |     p
------------------------------------------------------------------------------
OUS_IB     | Choice_STRminusCUZ_oblig | -0.12 | [-0.26, 0.01] |  -1.77 | 0.078

Observations: 203

CUZnSIB

No Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "NoChoice_CUZ_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------
OUS_IB     | NoChoice_CUZ_oblig | 0.23 | [0.10, 0.36] |   3.38 | < .001***

Observations: 205
# close pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "NoChoice_SIB_oblig", method = "Pearson")
Parameter1 |         Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------
OUS_IB     | NoChoice_SIB_oblig | 0.38 | [0.25, 0.49] |   5.81 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "NoChoice_CUZminusSIB_oblig", method = "Pearson")
Parameter1 |                 Parameter2 |     r |         95% CI | t(203) |      p
----------------------------------------------------------------------------------
OUS_IB     | NoChoice_CUZminusSIB_oblig | -0.14 | [-0.27,  0.00] |  -2.02 | 0.044*

Observations: 205

Choice

# distant pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "Choice_CUZnSIB_CUZ_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------
OUS_IB     | Choice_CUZnSIB_CUZ_oblig | 0.36 | [0.24, 0.48] |   5.58 | < .001***

Observations: 205
# distant pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "Choice_CUZnSIB_SIB_oblig", method = "Pearson")
Parameter1 |               Parameter2 |    r |       95% CI | t(203) |         p
--------------------------------------------------------------------------------
OUS_IB     | Choice_CUZnSIB_SIB_oblig | 0.34 | [0.22, 0.46] |   5.19 | < .001***

Observations: 205
# diff pearson's r
cor_test(E1_CUZnSIB_clean, "OUS_IB", "Choice_CUZminusSIB_oblig", method = "Pearson")
Parameter1 |               Parameter2 |         r |        95% CI | t(203) |     p
----------------------------------------------------------------------------------
OUS_IB     | Choice_CUZminusSIB_oblig | -9.06e-03 | [-0.15, 0.13] |  -0.13 | 0.897

Observations: 205

Oblig ~ MAC Family Values vs MFT Ingroup Loyalty Tests


These analyses were only conducted within the CUZnSIB dataset due to potential confounding of moral values’ effects on obligation judgments in other datasets.


No Choice

# correlation values are taken from the oblig ~ ind. diffs analyses
## r.jk = oblig ~ family values corr; r.jh = oblig ~ ingroup loyalty corr; r.kh = family values ~ ingroup loyalty corr

# distant
cocor.dep.groups.overlap(r.jk = .26, r.jh = .17, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = 0.26 and r.jh = 0.17
Difference: r.jk - r.jh = 0.09
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = 1.5735, p-value = 0.1156
  Null hypothesis retained
# close
cocor.dep.groups.overlap(r.jk = .48, r.jh = .25, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = 0.48 and r.jh = 0.25
Difference: r.jk - r.jh = 0.23
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = 4.2898, p-value = 0.0000
  Null hypothesis rejected
# difference
cocor.dep.groups.overlap(r.jk = -.21, r.jh = -.07, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.21 and r.jh = -0.07
Difference: r.jk - r.jh = -0.14
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -2.4104, p-value = 0.0159
  Null hypothesis rejected

Choice

# correlation values are taken from the oblig ~ ind. diffs analyses
## r.jk = oblig ~ family values corr; r.jh = oblig ~ ingroup loyalty corr; r.kh = family values ~ ingroup loyalty corr

# distant
cocor.dep.groups.overlap(r.jk = .32, r.jh = .16, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = 0.32 and r.jh = 0.16
Difference: r.jk - r.jh = 0.16
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = 2.8229, p-value = 0.0048
  Null hypothesis rejected
# close
cocor.dep.groups.overlap(r.jk = .40, r.jh = .24, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = 0.4 and r.jh = 0.24
Difference: r.jk - r.jh = 0.16
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = 2.9080, p-value = 0.0036
  Null hypothesis rejected
# difference
cocor.dep.groups.overlap(r.jk = -.23, r.jh = -.20, r.kh = .65, 205, alternative = "two.sided",
                         test = "steiger1980", alpha = 0.05, conf.level = 0.95, null.value = 0)

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.23 and r.jh = -0.2
Difference: r.jk - r.jh = -0.03
Related correlation: r.kh = 0.65
Group size: n = 205
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -0.5241, p-value = 0.6002
  Null hypothesis retained
LS0tDQp0aXRsZTogIkV4cGVyaW1lbnQgMSINCmF1dGhvcjogIkJMSU5ERUQgRk9SIFBFRVIgUkVWSUVXIg0KZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgJw0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgdGhlbWU6IGRhcmtseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQo8YnI+DQoNCiMgRGF0YSBXYXZlcw0KDQpBcyBwcmUtcmVnaXN0ZXJlZCwgd2Ugc291Z2h0IHRvIGNvbGxlY3QgZGF0YSB0byBhdHRhaW4gMjAwIGFuYWx5emFibGUgcmVzcG9uc2VzIGZvciBlYWNoIGJldHdlZW4tc3ViamVjdHMgY29uZGl0aW9uIChpLmUuLCAyMDAgcGFydGljaXBhbnRzIHdobyBwYXNzZWQgYWxsIGF0dGVudGlvbiBjaGVja3MgZm9yIGVhY2ggYmV0d2Vlbi1zdWJqZWN0cyBjb25kaXRpb24sIHRvdGFsbGluZyA2MDAgdXNhYmxlIHJlc3BvbnNlcyBhY3Jvc3MgdGhlIGVudGlyZSBleHBlcmltZW50KS4gDQoNCjxicj4NCg0KT24gdGhlIGZpcnN0IHdhdmUgb2YgZGF0YSBjb2xsZWN0aW9uIChOID0gNjk0KSwgYXBwbHlpbmcgdGhlIHByZS1yZWdpc3RlcmVkIGV4Y2x1c2lvbiBjcml0ZXJpYSBsZWQgdG8gYWRlcXVhdGUgc2FtcGxlcyAoaS5lLiwgTnMgPiAyMDApIGZvciB0d28gYmV0d2Vlbi1zdWJqZWN0cyBkYXRhc2V0cywgYnV0IGFuIGluYWRlcXVhdGUgc2FtcGxlIChpLmUuLCBOID0gMTk1KSBmb3Igb25lIGJldHdlZW4tc3ViamVjdHMgZGF0YXNldCAoc3BlY2lmaWNhbGx5LCB0aGUgU3RyYW5nZXIgYW5kIFNpYmxpbmcgZGF0YXNldCkuIFRoZXJlZm9yZSwgd2UgbGF1bmNoZWQgYSBzbWFsbCBzZWNvbmQgd2F2ZSAoTiA9IDEwKSB0byBhdHRhaW4gYW4gYWRlcXVhdGUgc2FtcGxlIGZvciB0aGUgU3RyYW5nZXIgYW5kIFNpYmxpbmcgZGF0YXNldC4NCg0KPGJyPg0KDQojIERhdGEgQ2xlYW5pbmcNCg0KQmVmb3JlIGRhdGEgd2VyZSBsb2FkZWQgaW50byBSIChiZWxvdyksIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyB3ZXJlIG1hZGU6DQoNCigxKSBSYXcgdmFyaWFibGUgbmFtZXMgZnJvbSBRdWFsdHJpY3Mgd2VyZSByZW5hbWVkIHRvIGJlIG1vcmUgZGVzY3JpcHRpdmUuDQoNCigyKSBJZiB0aGVyZSB3ZXJlIGFueSByZXNwb25zZXMgZm9yIHRoZSBmaWVsZCAiQm90X0NhdGNoZXIsIiB0aGVzZSBjYXNlcyB3ZXJlIGRlbGV0ZWQuIFRoaXMgZmllbGQgd2FzIGRlc2lnbmVkIHRvIGJlIGFuIGludmlzaWJsZSBxdWVzdGlvbiB0aGF0IG9ubHkgYm90cyB3b3VsZCBhbnN3ZXIgKGFzIGh1bWFuIHJlc3BvbmRlbnRzIHdvdWxkIG5vdCBzZWUgdGhlIGZpZWxkKS4gSG93ZXZlciwgMCBjYXNlcyB3ZXJlIGRldGVjdGVkLg0KDQooMykgRHVwbGljYXRlIElQIGFkZHJlc3NlcyB3ZXJlIHJlbW92ZWQuIFRoZXJlIHdhcyBvbmx5IDEgaW5zdGFuY2Ugb2YgYSBkdXBsaWNhdGUgSVAgYWRkcmVzcywgYnV0IGl0IGNhbWUgZnJvbSB0d28gZGlmZmVyZW50IFByb2xpZmljIElEcyAoYW5kIGJvdGggcmVzcG9uc2VzIHdlcmUgcmVtb3ZlZCBmb3IgZmFpbGluZyBhdHRlbnRpb24gY2hlY2tzKS4NCg0KKDQpIEFsbCBvdGhlciBpZGVudGlmeWluZyBpbmZvcm1hdGlvbiB3YXMgcmVtb3ZlZCAoZS5nLiwgSVAgYWRkcmVzc2VzLCBsb25naXR1ZGUvbGF0aXR1ZGUsIGV0Yy4pLg0KDQo8YnI+DQoNCiMjIExvYWRpbmcgRGF0YS9QYWNrYWdlcw0KDQpCZWZvcmUgcnVubmluZyB0aGlzIGNodW5rLCBwbGVhc2UgbG9hZCAiRTFfcmF3X2RhdGEuY3N2IiBpbnRvIHRoZSBSIGVudmlyb25tZW50Lg0KDQo8YnI+DQpgYGB7cn0NCiMgcGFja2FnZXMgc2hvdWxkIGJlIGxvYWRlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIHRvIGF2b2lkIGZ1bmN0aW9uIGNvbmZsaWN0cw0KbGlicmFyeShwc3ljaCkgIyBmb3IgZGVzY3JpYmluZyBkYXRhDQpsaWJyYXJ5KGVmZnNpemUpICMgZm9yIG1lYW4gZGlmZmVyZW5jZSBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoc2pzdGF0cykgIyBmb3IgZXRhLXNxdWFyZWQgZWZmZWN0IHNpemVzDQpsaWJyYXJ5KGNvcnJlbGF0aW9uKSAjIGZvciBjbGVhbmVyIGNvcnJlbGF0aW9uIHRlc3Qgb3V0cHV0DQpsaWJyYXJ5KHJtY29ycikgIyBmb3IgcmVwZWF0ZWQtbWVhc3VyZXMgY29ycmVsYXRpb24gdGVzdHMNCmxpYnJhcnkoY29jb3IpICMgZm9yIGNvbXBhcmluZyBkZXBlbmRlbnQgY29ycmVsYXRpb24gY29lZmZpY2llbnRzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgZGF0YSBtYW5pcHVsYXRpb24gYW5kIHBsb3R0aW5nDQpgYGANCg0KIyMgRGF0YSBTZXBhcmF0aW9uL1JlY29tYmluaW5nDQoNCkRhdGEgd2VyZSBzZXBhcmF0ZWQgaW50byB0aHJlZSBkaXN0aW5jdCBkYXRhIHNldHMgKGZvciBlYWNoIGJldHdlZW4tc3ViamVjdHMgY29uZGl0aW9uKS4gVGhlbiwgYSBiZXR3ZWVuLXN1YmplY3RzIHZhcmlhYmxlIHdhcyBjcmVhdGVkIHdpdGhpbiBlYWNoIGJldHdlZW4tc3ViamVjdHMgZGF0YXNldC4gTGFzdCwgYWxsIHRocmVlIGRhdGFzZXRzIHdlcmUgcmVjb21iaW5lZC4NCg0KPGJyPg0KYGBge3J9DQojIGNyZWF0ZXMgZGF0YXNldCB0aGF0IG9ubHkgaGFzIHBhcnRpcGFudHMgd2hvIG1hZGUganVkZ21lbnRzIG9mIGFnZW50cyB3aG8gaGVscGVkIHN0cmFuZ2VycyBhbmQgY291c2lucw0KRTFfU1RSbkNVWiA8LSBFMV9yYXdfZGF0YSAlPiUNCiAgZmlsdGVyKFNUUm5DVVpfU1RSX20xID49IDAgfCBTVFJuQ1VaX1NUUl9tMiA+PSAwIHwgU1RSbkNVWl9TVFJfbTMgPj0gMCkNCg0KIyBjcmVhdGVzIGRhdGFzZXQgdGhhdCBvbmx5IGhhcyBwYXJ0aXBhbnRzIHdobyBtYWRlIGp1ZGdtZW50cyBvZiBhZ2VudHMgd2hvIGhlbHBlZCBzdHJhbmdlcnMgYW5kIHNpYmxpbmdzDQpFMV9TVFJuU0lCIDwtIEUxX3Jhd19kYXRhICU+JQ0KICBmaWx0ZXIoU1RSblNJQl9TVFJfbTEgPj0gMCB8IFNUUm5TSUJfU1RSX20yID49IDAgfCBTVFJuU0lCX1NUUl9tMyA+PSAwKQ0KDQojIGNyZWF0ZXMgZGF0YXNldCB0aGF0IG9ubHkgaGFzIHBhcnRpcGFudHMgd2hvIG1hZGUganVkZ21lbnRzIG9mIGFnZW50cyB3aG8gaGVscGVkIGNvdXNpbnMgYW5kIHNpYmxpbmdzDQpFMV9DVVpuU0lCIDwtIEUxX3Jhd19kYXRhICU+JQ0KICBmaWx0ZXIoQ1VablNJQl9DVVpfbTEgPj0gMCB8IENVWm5TSUJfQ1VaX20yID49IDAgfCBDVVpuU0lCX0NVWl9tMyA+PSAwKQ0KDQojIGNyZWF0ZSBiZXR3ZWVuLXN1YmplY3RzIGNvbmRpdGlvbiB2YXJpYWJsZQ0KRTFfU1RSbkNVWiRCU3NfY29uZCA8LSByZXAoIlNUUiB2cyBDVVoiLCBucm93KEUxX1NUUm5DVVopKQ0KRTFfU1RSblNJQiRCU3NfY29uZCA8LSByZXAoIlNUUiB2cyBTSUIiLCBucm93KEUxX1NUUm5TSUIpKQ0KRTFfQ1VablNJQiRCU3NfY29uZCA8LSByZXAoIkNVWiB2cyBTSUIiLCBucm93KEUxX0NVWm5TSUIpKQ0KDQojIHJlY29tYmluZSBiZXR3ZWVuLXN1YmplY3RzIGRhdGENCkUxX2FsbCA8LSByYmluZChFMV9TVFJuQ1VaLCBFMV9TVFJuU0lCLCBFMV9DVVpuU0lCKQ0KYGBgDQoNCiMjIEltcGxlbWVudGluZyBBdHRlbnRpb24gQ2hlY2tzDQoNCkJhc2VkIG9uIG91ciBwcmUtcmVnaXN0ZXJlZCBjcml0ZXJpYSwgcGFydGljaXBhbnRzIHdobyBmYWlsZWQgYW55IG9mIDMgYXR0ZW50aW9uIGNoZWNrcyB3ZXJlIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYWxsIGFuYWx5c2VzLiBUaGlzIGxlZCB0byBhIGZpbmFsIGFuYWx5emFibGUgTiA9IDYxMSAoYW4gODclIHJldGVudGlvbiByYXRlKS4NCg0KPGJyPg0KDQpUaGUgZmlyc3QgYXR0ZW50aW9uIGNoZWNrIHdhcyBkaXNndWlzZWQgYXMgYW4gZXhwZXJpbWVudGFsIHNjZW5hcmlvOyBpbiB0aGUgc2NlbmFyaW8gdGV4dCwgcGFydGljaXBhbnRzIHdlcmUgaW5zdHJ1Y3RlZCB0byByZXNwb25kIHdpdGggdGhlIGxlZnQtbW9zdCBvcHRpb24gb24gdGhlIHNjYWxlIGZvciBhbGwgdGhyZWUgcHJlLW91dGNvbWUgbWVhc3VyZXMgKG9ibGlnYXRpb24sIGxpa2VsaWhvb2QsIGFuZCBkZXNjcmlwdGl2ZSBub3JtYXRpdml0eSkuIFBhcnRpY2lwYW50cyB3aG8gcmVzcG9uZGVkIGFib3ZlIGEgMTAgb24gYW55IG9mIHRoZSB0aHJlZSAxMDAtcG9pbnQgc2NhbGVzIHdlcmUgZXhjbHVkZWQuIA0KDQo8YnI+DQoNClRoZSBzZWNvbmQgYW5kIHRoaXJkIGF0dGVudGlvbiBjaGVja3MgZXhwbGljaXRseSBpbnN0cnVjdGVkIHBhcnRpY2lwYW50cyB0byByZXNwb25kIGluIGEgcGFydGljdWxhciB3YXkgb24gdHdvIGluZGl2aWR1YWwgZGlmZmVyZW5jZSBtZWFzdXJlcy4gVGhlIHNlY29uZCBhdHRlbnRpb24gY2hlY2sgaW5zdHJ1Y3RlZCBwYXJ0aWNpcGFudHMgdG8gcmVzcG9uZCAic3Ryb25nbHkgYWdyZWUiIG9uIHRoZSBNQUMncyAxMDAgcG9pbnQgc2NhbGU7IHBhcnRpY2lwYW50cyB3aG8gcmVzcG9uZGVkIGJlbG93IDkwIHdlcmUgZXhjbHVkZWQuIFRoZSB0aGlyZCBhdHRlbnRpb24gY2hlY2sgaW5zdHJ1Y3RlZCBwYXJ0aWNpcGFudHMgdG8gcmVzcG9uZCAic3Ryb25nbHkgZGlzYWdyZWUiIG9uIHRoZSBNRlEncyBzY2FsZTsgcGFydGljaXBhbnRzIHdobyByZXNwb25kZWQgYW55dGhpbmcgb3RoZXIgdGhhbiAic3Ryb25nbHkgZGlzYWdyZWUiIChhIDEgb24gdGhlIDYtcG9pbnQgc2NhbGUpIHdlcmUgZXhjbHVkZWQuDQoNCjxicj4NCmBgYHtyfQ0KIyBFeHBlcmltZW50YWwgdGFzayBhdHRlbnRpb24gY2hlY2sgdmFyaWFibGVzDQpFMV9hbGwkQUNfb2JsaWcgPC0gcm93U3VtcyhFMV9hbGxbLCBjKCJBQ19vYmxpZzEiLCAiQUNfb2JsaWcyIiwgIkFDX29ibGlnMyIpXSwgbmEucm0gPSBUKQ0KRTFfYWxsJEFDX2xpa2VseSA8LSByb3dTdW1zKEUxX2FsbFssIGMoIkFDX2xpa2VseTEiLCAiQUNfbGlrZWx5MiIsICJBQ19saWtlbHkzIildLCBuYS5ybSA9IFQpDQpFMV9hbGwkQUNfZG5vcm0gPC0gcm93U3VtcyhFMV9hbGxbLCBjKCJBQ19kbm9ybTEiLCAiQUNfZG5vcm0yIiwgIkFDX2Rub3JtMyIpXSwgbmEucm0gPSBUKSAjIGlmIGFueSBhcmUgPiAxMCwgZXhjbHVkZQ0KDQojIEluZGl2aWR1YWwgZGlmZmVyZW5jZSBhdHRlbnRpb24gY2hlY2sgdmFyaWFibGVzDQpFMV9hbGwkTUFDX0FDIDwtIEUxX2FsbCRNQUNfSnVkXzQgIyBpZiA8IDkwLCBleGNsdWRlDQpFMV9hbGwkTUZRX0FDIDwtIEUxX2FsbCRNRlFfSnVkXzQgIyBpZiAhPSAxLCBleGNsdWRlDQoNCiMgQ3JlYXRlIGRhdGFzZXQgdGhhdCBmaWx0ZXJzIG91dCBpbmF0dGVudGl2ZSBwYXJ0aWNpcGFudHMNCkUxX2FsbF9jbGVhbiA8LSBFMV9hbGwgJT4lDQogICMgZXhjbHVkZXMgcGFydGljaXBhbnRzIHdobyB3ZXJlIG5vdCBwYXlpbmcgYXR0ZW50aW9uIGR1cmluZyBleHBlcmltZW50YWwgdGFzaw0KICAgIGZpbHRlcihBQ19vYmxpZyA8PSAxMCAmIEFDX2xpa2VseSA8PSAxMCAmIEFDX2Rub3JtIDw9IDEwKSAlPiUNCiAgIyBleGNsdWRlIHBhcnRpY2lwYW50cyB3aG8gd2VyZSBub3QgcGF5aW5nIGF0dGVudGlvbiBkdXJpbmcgTUFDIHNjYWxlDQogICAgZmlsdGVyKE1BQ19BQyA+PSA5MCkgJT4lDQogICMgZXhjbHVkZSBwYXJ0aWNpcGFudHMgd2hvIHdlcmUgbm90IHBheWluZyBhdHRlbnRpb24gZHVyaW5nIE1GUSBzY2FsZQ0KICAgIGZpbHRlcihNRlFfQUMgPT0gMSkNCmBgYA0KDQojIyBDcmVhdGluZyBBbmFseXNpcyBWYXJpYWJsZXMNCmBgYHtyfQ0KIyBNYWluIERWcw0KIyBjcmVhdGUgc2luZ2xlIGNvbHVtbiBmb3IgZWFjaCBjb25kaXRpb24ncyB2YXJpYWJsZXMgdGhhdCBjb2xsYXBzZXMgYWNyb3NzIHByZXNlbnRhdGlvbiBvcmRlciBvZiBEVg0KDQojIGUuZy4sIFNUUm5DVVpfU1RSX28xID0gU1RSIHZzIENVWiBkYXRhc2V0LCAiTm8gQ2hvaWNlIiBjb25kaXRpb24sIFNUUiBvYmxpZ2F0aW9uIGp1ZGdtZW50LCBvYmxpZ2F0aW9uIGp1ZGdtZW50IHByZXNlbnRlZCBmaXJzdA0KIyB0byBjbGFyaWZ5LCBhcyBub3RlZCBpbiB0aGUgTWV0aG9kIHNlY3Rpb24gKGFuZCBTT00pLCB0d28gb3RoZXIgcHJlLW91dGNvbWUganVkZ21lbnRzIHdlcmUgY29sbGVjdGVkLCBlcXVhbGluZyB0aHJlZSBkaWZmZXJlbnQNCiMgb3JkZXJzIG9mIHByZXNlbnRhdGlvbiwgZWFjaCBvZiB3aGljaCBzdGFydGVkIHdpdGggYSBkaWZmZXJlbnQgRFYgKHRoZXNlIGFkZGl0aW9uYWwganVkZ21lbnRzIGFyZSBub3QgaW5jbHVkZWQgaGVyZSkNCg0KRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NUUl9vYmxpZyAgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTVFJuQ1VaX1NUUl9vMSIsICJTVFJuQ1VaX1NUUl9vMiIsICJTVFJuQ1VaX1NUUl9vMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJuU0lCX1NUUl9vMSIsICJTVFJuU0lCX1NUUl9vMiIsICJTVFJuU0lCX1NUUl9vMyIpXSwgbmEucm0gPSBUKQ0KRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NUUl9tb3JhbCAgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTVFJuQ1VaX1NUUl9tMSIsICJTVFJuQ1VaX1NUUl9tMiIsICJTVFJuQ1VaX1NUUl9tMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJuU0lCX1NUUl9tMSIsICJTVFJuU0lCX1NUUl9tMiIsICJTVFJuU0lCX1NUUl9tMyIpXSwgbmEucm0gPSBUKQ0KDQoNCkUxX2FsbF9jbGVhbiROb0Nob2ljZV9DVVpfb2JsaWcgIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiU1RSbkNVWl9DVVpfbzEiLCAiU1RSbkNVWl9DVVpfbzIiLCAiU1RSbkNVWl9DVVpfbzMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1VablNJQl9DVVpfbzEiLCAiQ1VablNJQl9DVVpfbzIiLCAiQ1VablNJQl9DVVpfbzMiKV0sIG5hLnJtID0gVCkNCkUxX2FsbF9jbGVhbiROb0Nob2ljZV9DVVpfbW9yYWwgIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiU1RSbkNVWl9DVVpfbTEiLCAiU1RSbkNVWl9DVVpfbTIiLCAiU1RSbkNVWl9DVVpfbTMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1VablNJQl9DVVpfbTEiLCAiQ1VablNJQl9DVVpfbTIiLCAiQ1VablNJQl9DVVpfbTMiKV0sIG5hLnJtID0gVCkNCg0KDQpFMV9hbGxfY2xlYW4kTm9DaG9pY2VfU0lCX29ibGlnICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm5TSUJfU0lCX28xIiwgIlNUUm5TSUJfU0lCX28yIiwgIlNUUm5TSUJfU0lCX28zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm5TSUJfU0lCX28xIiwgIkNVWm5TSUJfU0lCX28yIiwgIkNVWm5TSUJfU0lCX28zIildLCBuYS5ybSA9IFQpDQpFMV9hbGxfY2xlYW4kTm9DaG9pY2VfU0lCX21vcmFsICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm5TSUJfU0lCX20xIiwgIlNUUm5TSUJfU0lCX20yIiwgIlNUUm5TSUJfU0lCX20zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm5TSUJfU0lCX20xIiwgIkNVWm5TSUJfU0lCX20yIiwgIkNVWm5TSUJfU0lCX20zIildLCBuYS5ybSA9IFQpDQoNCg0KIyBlLmcuLCBTVFJvQ1VaX1NUUl9vMTEgPSBTVFIgdnMgQ1VaIGRhdGFzZXQsICJDaG9pY2UiIGNvbmRpdGlvbiwgU1RSIGlzIGV2ZW50dWFsbHkgaGVscGVkIGluc3RlYWQgb2YgQ1VaLA0KIyBvYmxpZ2F0aW9uIGp1ZGdtZW50cyBpbiBnZW5lcmFsIHByZXNlbnRlZCBmaXJzdCAoZmlyc3QgMSksIGJ1dCBvYmxpZ2F0aW9uIHRvIFNUUiBwcmVzZW50ZWQgYmVmb3JlIG9ibGlnYXRpb24gdG8gQ1VaIChzZWNvbmQgMSkNCiMgdG8gY2xhcmlmeSwgYXMgbm90ZWQgaW4gdGhlIE1ldGhvZCBzZWN0aW9uLCB0d28gb2JsaWdhdGlvbiBqdWRnbWVudHMgd2VyZSBjb2xsZWN0ZWQgaW4gdGhlc2UgY29uZGl0aW9ucywNCiMgb25lIGZvciBlYWNoIHBvdGVudGlhbCBiZW5lZmljaWFyeSAoZS5nLiwgU1RSIGFuZCBDVVopDQpFMV9hbGxfY2xlYW4kU1RSb0NVWl9TVFJfb2JsaWcgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTVFJvQ1VaX1NUUl9vMTEiLCAiU1RSb0NVWl9TVFJfbzEyIiwgIlNUUm9DVVpfU1RSX28zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSb0NVWl9TVFJfbzIxIiwgIlNUUm9DVVpfU1RSX28yMiIsICJTVFJvQ1VaX1NUUl9vMzIiKV0sIG5hLnJtID0gVCkgDQpFMV9hbGxfY2xlYW4kU1RSb0NVWl9DVVpfb2JsaWcgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTVFJvQ1VaX0NVWl9vMTEiLCAiU1RSb0NVWl9DVVpfbzEyIiwgIlNUUm9DVVpfQ1VaX28zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSb0NVWl9DVVpfbzIxIiwgIlNUUm9DVVpfQ1VaX28yMiIsICJTVFJvQ1VaX0NVWl9vMzIiKV0sIG5hLnJtID0gVCkNCkUxX2FsbF9jbGVhbiRTVFJvQ1VaX1NUUl9tb3JhbCA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm9DVVpfU1RSX20xMSIsICJTVFJvQ1VaX1NUUl9tMTIiLCAiU1RSb0NVWl9TVFJfbTMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvQ1VaX1NUUl9tMjEiLCAiU1RSb0NVWl9TVFJfbTIyIiwgIlNUUm9DVVpfU1RSX20zMiIpXSwgbmEucm0gPSBUKSANCg0KRTFfYWxsX2NsZWFuJENVWm9TVFJfU1RSX29ibGlnIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiQ1Vab1NUUl9TVFJfbzExIiwgIkNVWm9TVFJfU1RSX28xMiIsICJDVVpvU1RSX1NUUl9vMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm9TVFJfU1RSX28yMSIsICJDVVpvU1RSX1NUUl9vMjIiLCAiQ1Vab1NUUl9TVFJfbzMyIildLCBuYS5ybSA9IFQpIA0KRTFfYWxsX2NsZWFuJENVWm9TVFJfQ1VaX29ibGlnIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiQ1Vab1NUUl9DVVpfbzExIiwgIkNVWm9TVFJfQ1VaX28xMiIsICJDVVpvU1RSX0NVWl9vMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm9TVFJfQ1VaX28yMSIsICJDVVpvU1RSX0NVWl9vMjIiLCAiQ1Vab1NUUl9DVVpfbzMyIildLCBuYS5ybSA9IFQpIA0KRTFfYWxsX2NsZWFuJENVWm9TVFJfQ1VaX21vcmFsIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiQ1Vab1NUUl9DVVpfbTExIiwgIkNVWm9TVFJfQ1VaX20xMiIsICJDVVpvU1RSX0NVWl9tMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm9TVFJfQ1VaX20yMSIsICJDVVpvU1RSX0NVWl9tMjIiLCAiQ1Vab1NUUl9DVVpfbTMyIildLCBuYS5ybSA9IFQpIA0KDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfU1RSX29ibGlnICA8LSAoRTFfYWxsX2NsZWFuJFNUUm9DVVpfU1RSX29ibGlnICsgRTFfYWxsX2NsZWFuJENVWm9TVFJfU1RSX29ibGlnKS8yICMgY3JlYXRlcyBwcmUtcmVnaXN0ZXJlZCBvYmxpZ2F0aW9uIGluZGV4IGZvciBtZWFuIGNvbXBhcmlzb25zDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfU1RSX21vcmFsICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvQ1VaX1NUUl9tMTEiLCAiU1RSb0NVWl9TVFJfbTEyIiwgIlNUUm9DVVpfU1RSX20zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSb0NVWl9TVFJfbTIxIiwgIlNUUm9DVVpfU1RSX20yMiIsICJTVFJvQ1VaX1NUUl9tMzIiKV0sIG5hLnJtID0gVCkgIyBzaG91bGQgYmUgYSBkdXBsaWNhdGUgb2YgIlNUUm9DVVpfU1RSX21vcmFsIg0KDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfQ1VaX29ibGlnICA8LSAoRTFfYWxsX2NsZWFuJFNUUm9DVVpfQ1VaX29ibGlnICsgRTFfYWxsX2NsZWFuJENVWm9TVFJfQ1VaX29ibGlnKS8yICMgY3JlYXRlcyBwcmUtcmVnaXN0ZXJlZCBvYmxpZ2F0aW9uIGluZGV4IGZvciBtZWFuIGNvbXBhcmlzb25zDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfQ1VaX21vcmFsICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVVpvU1RSX0NVWl9tMTEiLCAiQ1Vab1NUUl9DVVpfbTEyIiwgIkNVWm9TVFJfQ1VaX20zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1Vab1NUUl9DVVpfbTIxIiwgIkNVWm9TVFJfQ1VaX20yMiIsICJDVVpvU1RSX0NVWl9tMzIiKV0sIG5hLnJtID0gVCkgIyBzaG91bGQgYmUgYSBkdXBsaWNhdGUgb2YgIkNVWm9TVFJfQ1VaX21vcmFsIg0KDQoNCkUxX2FsbF9jbGVhbiRTVFJvU0lCX1NUUl9vYmxpZyA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm9TSUJfU1RSX28xMSIsICJTVFJvU0lCX1NUUl9vMTIiLCAiU1RSb1NJQl9TVFJfbzMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvU0lCX1NUUl9vMjEiLCAiU1RSb1NJQl9TVFJfbzIyIiwgIlNUUm9TSUJfU1RSX28zMiIpXSwgbmEucm0gPSBUKSANCkUxX2FsbF9jbGVhbiRTVFJvU0lCX1NJQl9vYmxpZyA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm9TSUJfU0lCX28xMSIsICJTVFJvU0lCX1NJQl9vMTIiLCAiU1RSb1NJQl9TSUJfbzMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvU0lCX1NJQl9vMjEiLCAiU1RSb1NJQl9TSUJfbzIyIiwgIlNUUm9TSUJfU0lCX28zMiIpXSwgbmEucm0gPSBUKSANCkUxX2FsbF9jbGVhbiRTVFJvU0lCX1NUUl9tb3JhbCA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIlNUUm9TSUJfU1RSX20xMSIsICJTVFJvU0lCX1NUUl9tMTIiLCAiU1RSb1NJQl9TVFJfbTMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvU0lCX1NUUl9tMjEiLCAiU1RSb1NJQl9TVFJfbTIyIiwgIlNUUm9TSUJfU1RSX20zMiIpXSwgbmEucm0gPSBUKSANCg0KRTFfYWxsX2NsZWFuJFNJQm9TVFJfU1RSX29ibGlnIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiU0lCb1NUUl9TVFJfbzExIiwgIlNJQm9TVFJfU1RSX28xMiIsICJTSUJvU1RSX1NUUl9vMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJQm9TVFJfU1RSX28yMSIsICJTSUJvU1RSX1NUUl9vMjIiLCAiU0lCb1NUUl9TVFJfbzMyIildLCBuYS5ybSA9IFQpIA0KRTFfYWxsX2NsZWFuJFNJQm9TVFJfU0lCX29ibGlnIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiU0lCb1NUUl9TSUJfbzExIiwgIlNJQm9TVFJfU0lCX28xMiIsICJTSUJvU1RSX1NJQl9vMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJQm9TVFJfU0lCX28yMSIsICJTSUJvU1RSX1NJQl9vMjIiLCAiU0lCb1NUUl9TSUJfbzMyIildLCBuYS5ybSA9IFQpIA0KRTFfYWxsX2NsZWFuJFNJQm9TVFJfU0lCX21vcmFsIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygiU0lCb1NUUl9TSUJfbTExIiwgIlNJQm9TVFJfU0lCX20xMiIsICJTSUJvU1RSX1NJQl9tMzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJQm9TVFJfU0lCX20yMSIsICJTSUJvU1RSX1NJQl9tMjIiLCAiU0lCb1NUUl9TSUJfbTMyIildLCBuYS5ybSA9IFQpIA0KDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5TSUJfU1RSX29ibGlnICA8LSAoRTFfYWxsX2NsZWFuJFNUUm9TSUJfU1RSX29ibGlnICsgRTFfYWxsX2NsZWFuJFNJQm9TVFJfU1RSX29ibGlnKS8yICMgY3JlYXRlcyBwcmUtcmVnaXN0ZXJlZCBvYmxpZ2F0aW9uIGluZGV4IGZvciBtZWFuIGNvbXBhcmlzb25zDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5TSUJfU1RSX21vcmFsICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFJvU0lCX1NUUl9tMTEiLCAiU1RSb1NJQl9TVFJfbTEyIiwgIlNUUm9TSUJfU1RSX20zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RSb1NJQl9TVFJfbTIxIiwgIlNUUm9TSUJfU1RSX20yMiIsICJTVFJvU0lCX1NUUl9tMzIiKV0sIG5hLnJtID0gVCkgIyBzaG91bGQgYmUgYSBkdXBsaWNhdGUgb2YgIlNUUm9TSUJfU1RSX21vcmFsIg0KDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5TSUJfU0lCX29ibGlnICA8LSAoRTFfYWxsX2NsZWFuJFNUUm9TSUJfU0lCX29ibGlnICsgRTFfYWxsX2NsZWFuJFNJQm9TVFJfU0lCX29ibGlnKS8yICMgY3JlYXRlcyBwcmUtcmVnaXN0ZXJlZCBvYmxpZ2F0aW9uIGluZGV4IGZvciBtZWFuIGNvbXBhcmlzb25zDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5TSUJfU0lCX21vcmFsICA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSUJvU1RSX1NJQl9tMTEiLCAiU0lCb1NUUl9TSUJfbTEyIiwgIlNJQm9TVFJfU0lCX20zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lCb1NUUl9TSUJfbTIxIiwgIlNJQm9TVFJfU0lCX20yMiIsICJTSUJvU1RSX1NJQl9tMzIiKV0sIG5hLnJtID0gVCkgIyBzaG91bGQgYmUgYSBkdXBsaWNhdGUgb2YgIlNJQm9TVFJfU0lCX21vcmFsIg0KDQoNCkUxX2FsbF9jbGVhbiRDVVpvU0lCX0NVWl9vYmxpZyA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIkNVWm9TSUJfQ1VaX28xMSIsICJDVVpvU0lCX0NVWl9vMTIiLCAiQ1Vab1NJQl9DVVpfbzMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVVpvU0lCX0NVWl9vMjEiLCAiQ1Vab1NJQl9DVVpfbzIyIiwgIkNVWm9TSUJfQ1VaX28zMiIpXSwgbmEucm0gPSBUKSANCkUxX2FsbF9jbGVhbiRDVVpvU0lCX1NJQl9vYmxpZyA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIkNVWm9TSUJfU0lCX28xMSIsICJDVVpvU0lCX1NJQl9vMTIiLCAiQ1Vab1NJQl9TSUJfbzMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVVpvU0lCX1NJQl9vMjEiLCAiQ1Vab1NJQl9TSUJfbzIyIiwgIkNVWm9TSUJfU0lCX28zMiIpXSwgbmEucm0gPSBUKSANCkUxX2FsbF9jbGVhbiRDVVpvU0lCX0NVWl9tb3JhbCA8LSByb3dTdW1zKEUxX2FsbF9jbGVhblssIGMoIkNVWm9TSUJfQ1VaX20xMSIsICJDVVpvU0lCX0NVWl9tMTIiLCAiQ1Vab1NJQl9DVVpfbTMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVVpvU0lCX0NVWl9tMjEiLCAiQ1Vab1NJQl9DVVpfbTIyIiwgIkNVWm9TSUJfQ1VaX20zMiIpXSwgbmEucm0gPSBUKSANCg0KDQpFMV9hbGxfY2xlYW4kU0lCb0NVWl9DVVpfb2JsaWcgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTSUJvQ1VaX0NVWl9vMTEiLCAiU0lCb0NVWl9DVVpfbzEyIiwgIlNJQm9DVVpfQ1VaX28zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lCb0NVWl9DVVpfbzIxIiwgIlNJQm9DVVpfQ1VaX28yMiIsICJTSUJvQ1VaX0NVWl9vMzIiKV0sIG5hLnJtID0gVCkgDQpFMV9hbGxfY2xlYW4kU0lCb0NVWl9TSUJfb2JsaWcgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTSUJvQ1VaX1NJQl9vMTEiLCAiU0lCb0NVWl9TSUJfbzEyIiwgIlNJQm9DVVpfU0lCX28zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lCb0NVWl9TSUJfbzIxIiwgIlNJQm9DVVpfU0lCX28yMiIsICJTSUJvQ1VaX1NJQl9vMzIiKV0sIG5hLnJtID0gVCkgDQpFMV9hbGxfY2xlYW4kU0lCb0NVWl9TSUJfbW9yYWwgPC0gcm93U3VtcyhFMV9hbGxfY2xlYW5bLCBjKCJTSUJvQ1VaX1NJQl9tMTEiLCAiU0lCb0NVWl9TSUJfbTEyIiwgIlNJQm9DVVpfU0lCX20zMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lCb0NVWl9TSUJfbTIxIiwgIlNJQm9DVVpfU0lCX20yMiIsICJTSUJvQ1VaX1NJQl9tMzIiKV0sIG5hLnJtID0gVCkgDQoNCkUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWcgIDwtIChFMV9hbGxfY2xlYW4kQ1Vab1NJQl9DVVpfb2JsaWcgKyBFMV9hbGxfY2xlYW4kU0lCb0NVWl9DVVpfb2JsaWcpLzIgIyBjcmVhdGVzIHByZS1yZWdpc3RlcmVkIG9ibGlnYXRpb24gaW5kZXggZm9yIG1lYW4gY29tcGFyaXNvbnMNCkUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9DVVpfbW9yYWwgIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNVWm9TSUJfQ1VaX20xMSIsICJDVVpvU0lCX0NVWl9tMTIiLCAiQ1Vab1NJQl9DVVpfbTMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDVVpvU0lCX0NVWl9tMjEiLCAiQ1Vab1NJQl9DVVpfbTIyIiwgIkNVWm9TSUJfQ1VaX20zMiIpXSwgbmEucm0gPSBUKSAjIHNob3VsZCBiZSBhIGR1cGxpY2F0ZSBvZiAiQ1Vab1NJQl9DVVpfbW9yYWwiDQoNCkUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9TSUJfb2JsaWcgIDwtIChFMV9hbGxfY2xlYW4kQ1Vab1NJQl9TSUJfb2JsaWcgKyBFMV9hbGxfY2xlYW4kU0lCb0NVWl9TSUJfb2JsaWcpLzIgIyBjcmVhdGVzIHByZS1yZWdpc3RlcmVkIG9ibGlnYXRpb24gaW5kZXggZm9yIG1lYW4gY29tcGFyaXNvbnMNCkUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9TSUJfbW9yYWwgIDwtIHJvd1N1bXMoRTFfYWxsX2NsZWFuWywgYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJQm9DVVpfU0lCX20xMSIsICJTSUJvQ1VaX1NJQl9tMTIiLCAiU0lCb0NVWl9TSUJfbTMxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSUJvQ1VaX1NJQl9tMjEiLCAiU0lCb0NVWl9TSUJfbTIyIiwgIlNJQm9DVVpfU0lCX20zMiIpXSwgbmEucm0gPSBUKSAjIHNob3VsZCBiZSBhIGR1cGxpY2F0ZSBvZiAiU0lCb0NVWl9TSUJfbW9yYWwiDQoNCg0KIyBEaWZmZXJlbmNlIFNjb3Jlcw0KIyBlLmcuLCBTVFIgbWludXMgQ1VaIG9ibGlnYXRpb24gd2l0aGluIE5vIENob2ljZSBvciBDaG9pY2UgY29uZGl0aW9ucyAoZm9yIGRpZmYgc2NvcmUgY29ycnMgYW5kIGluZC4gZGlmZnMgYW5hbHlzZXMpDQoNCiMgU1RSIHZzIENVWg0KRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NUUm1pbnVzQ1VaX29ibGlnIDwtIEUxX2FsbF9jbGVhbiROb0Nob2ljZV9TVFJfb2JsaWcgLSBFMV9hbGxfY2xlYW4kTm9DaG9pY2VfQ1VaX29ibGlnDQpFMV9hbGxfY2xlYW4kTm9DaG9pY2VfU1RSbWludXNDVVpfbW9yYWwgPC0gRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NUUl9tb3JhbCAtIEUxX2FsbF9jbGVhbiROb0Nob2ljZV9DVVpfbW9yYWwNCg0KRTFfYWxsX2NsZWFuJENob2ljZV9TVFJtaW51c0NVWl9vYmxpZyA8LSBFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfU1RSX29ibGlnIC0gRTFfYWxsX2NsZWFuJENob2ljZV9TVFJuQ1VaX0NVWl9vYmxpZw0KRTFfYWxsX2NsZWFuJENob2ljZV9TVFJtaW51c0NVWl9tb3JhbCA8LSBFMV9hbGxfY2xlYW4kQ2hvaWNlX1NUUm5DVVpfU1RSX21vcmFsIC0gRTFfYWxsX2NsZWFuJENob2ljZV9TVFJuQ1VaX0NVWl9tb3JhbA0KDQojIFNUUiB2cyBTSUINCkUxX2FsbF9jbGVhbiROb0Nob2ljZV9TVFJtaW51c1NJQl9vYmxpZyA8LSBFMV9hbGxfY2xlYW4kTm9DaG9pY2VfU1RSX29ibGlnIC0gRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NJQl9vYmxpZw0KRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NUUm1pbnVzU0lCX21vcmFsIDwtIEUxX2FsbF9jbGVhbiROb0Nob2ljZV9TVFJfbW9yYWwgLSBFMV9hbGxfY2xlYW4kTm9DaG9pY2VfU0lCX21vcmFsDQoNCkUxX2FsbF9jbGVhbiRDaG9pY2VfU1RSbWludXNTSUJfb2JsaWcgPC0gRTFfYWxsX2NsZWFuJENob2ljZV9TVFJuU0lCX1NUUl9vYmxpZyAtIEUxX2FsbF9jbGVhbiRDaG9pY2VfU1RSblNJQl9TSUJfb2JsaWcNCkUxX2FsbF9jbGVhbiRDaG9pY2VfU1RSbWludXNTSUJfbW9yYWwgPC0gRTFfYWxsX2NsZWFuJENob2ljZV9TVFJuU0lCX1NUUl9tb3JhbCAtIEUxX2FsbF9jbGVhbiRDaG9pY2VfU1RSblNJQl9TSUJfbW9yYWwNCg0KIyBDVVogdnMgU0lCDQpFMV9hbGxfY2xlYW4kTm9DaG9pY2VfQ1VabWludXNTSUJfb2JsaWcgPC0gRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX0NVWl9vYmxpZyAtIEUxX2FsbF9jbGVhbiROb0Nob2ljZV9TSUJfb2JsaWcNCkUxX2FsbF9jbGVhbiROb0Nob2ljZV9DVVptaW51c1NJQl9tb3JhbCA8LSBFMV9hbGxfY2xlYW4kTm9DaG9pY2VfQ1VaX21vcmFsIC0gRTFfYWxsX2NsZWFuJE5vQ2hvaWNlX1NJQl9tb3JhbA0KDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnIDwtIEUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWcgLSBFMV9hbGxfY2xlYW4kQ2hvaWNlX0NVWm5TSUJfU0lCX29ibGlnDQpFMV9hbGxfY2xlYW4kQ2hvaWNlX0NVWm1pbnVzU0lCX21vcmFsIDwtIEUxX2FsbF9jbGVhbiRDaG9pY2VfQ1VablNJQl9DVVpfbW9yYWwgLSBFMV9hbGxfY2xlYW4kQ2hvaWNlX0NVWm5TSUJfU0lCX21vcmFsDQoNCg0KIyBJbmRpdmlkdWFsIERpZmZlcmVuY2UgTWVhc3VyZXMgKGZvciBpbmQuIGRpZmZzIGFuYWx5c2VzKQ0KDQojIE1BQyAoTW9yYWxpdHktYXMtQ29vcGVyYXRpb24gc2NhbGUpIGNvbXBvc2l0ZQ0KRTFfYWxsX2NsZWFuJE1BQ19GYW1fQ29tYmluZWQgPC0gKChFMV9hbGxfY2xlYW4kTUFDX0p1ZF8xICsgRTFfYWxsX2NsZWFuJE1BQ19KdWRfMiArIEUxX2FsbF9jbGVhbiRNQUNfSnVkXzMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRTFfYWxsX2NsZWFuJE1BQ19SZWxfMSArIEUxX2FsbF9jbGVhbiRNQUNfUmVsXzIgKyBFMV9hbGxfY2xlYW4kTUFDX1JlbF8zKS82KQ0KRTFfYWxsX2NsZWFuJE1BQ19GYW1fSnVkIDwtICgoRTFfYWxsX2NsZWFuJE1BQ19KdWRfMSArIEUxX2FsbF9jbGVhbiRNQUNfSnVkXzIgKyBFMV9hbGxfY2xlYW4kTUFDX0p1ZF8zKS8zKQ0KRTFfYWxsX2NsZWFuJE1BQ19GYW1fUmVsIDwtICgoRTFfYWxsX2NsZWFuJE1BQ19SZWxfMSArIEUxX2FsbF9jbGVhbiRNQUNfUmVsXzIgKyBFMV9hbGxfY2xlYW4kTUFDX1JlbF8zKS8zKQ0KDQojIE1GUSAoTW9yYWwgRm91bmRhdGlvbnMgVGhlb3J5IHNjYWxlKSBjb21wb3NpdGUNCkUxX2FsbF9jbGVhbiRNRlFfTG95YWx0eV9Db21iaW5lZCA8LSAoKEUxX2FsbF9jbGVhbiRNRlFfSnVkXzEgKyBFMV9hbGxfY2xlYW4kTUZRX0p1ZF8yICsgRTFfYWxsX2NsZWFuJE1GUV9KdWRfMyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMV9hbGxfY2xlYW4kTUZRX1JlbF8xICsgRTFfYWxsX2NsZWFuJE1GUV9SZWxfMiArIEUxX2FsbF9jbGVhbiRNRlFfUmVsXzMpLzYpDQpFMV9hbGxfY2xlYW4kTUZRX0xveWFsdHlfSnVkIDwtICgoRTFfYWxsX2NsZWFuJE1GUV9KdWRfMSArIEUxX2FsbF9jbGVhbiRNRlFfSnVkXzIgKyBFMV9hbGxfY2xlYW4kTUZRX0p1ZF8zKS8zKQ0KRTFfYWxsX2NsZWFuJE1GUV9Mb3lhbHR5X1JlbCA8LSAoKEUxX2FsbF9jbGVhbiRNRlFfUmVsXzEgKyBFMV9hbGxfY2xlYW4kTUZRX1JlbF8yICsgRTFfYWxsX2NsZWFuJE1GUV9SZWxfMykvMykNCg0KIyBPVVMgKE94Zm9yZCBVdGlsaXRhcmlhbmlzbSBTY2FsZTogSW1wYXJ0aWFsIEJlbmVmaWNlbmNlIHN1YnNjYWxlKSBjb21wb3NpdGUNCkUxX2FsbF9jbGVhbiRPVVNfSUIgPC0gKChFMV9hbGxfY2xlYW4kT1VTX0lCMSArIEUxX2FsbF9jbGVhbiRPVVNfSUIyICsgRTFfYWxsX2NsZWFuJE9VU19JQjMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMV9hbGxfY2xlYW4kT1VTX0lCNCArIEUxX2FsbF9jbGVhbiRPVVNfSUI1KS81KQ0KYGBgDQoNCiMjIENyZWF0aW5nIEFuYWx5emFibGUgQmV0d2Vlbi1TdWJqZWN0cyBEYXRhc2V0cw0KYGBge3J9DQojIFNUUiB2cyBDVVoNCkUxX1NUUm5DVVpfY2xlYW4gPC0gRTFfYWxsX2NsZWFuICU+JQ0KICBmaWx0ZXIoQlNzX2NvbmQgPT0gJ1NUUiB2cyBDVVonKSAlPiUNCiAgIyBzZWxlY3Qgb25seSB2YXJpYWJsZXMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gU1RSbkNVWg0KICBzZWxlY3QoDQogICAgUmVzcG9uc2VJZCwgIyBzZWxlY3RzIHZhcmlhYmxlDQogICAgQWdlOlBvbGl0aWNhbF9PdmVyYWxsLCAjIHNlbGVjdHMgZGVtb2dyYXBoaWMgdmFyaWFibGVzDQogICAgTUFDX0p1ZF8xOk1BQ19KdWRfMywgTUFDX1JlbF8xOk1BQ19SZWxfMywgTUZRX0p1ZF8xOk1GUV9KdWRfMywgTUZRX1JlbF8xOk1GUV9SZWxfMywgT1VTX0lCMTpPVVNfSUI1LCAjIHNlbGVjdHMgcmF3IGluZC4gZGlmZiB2YXJpYWJsZXMgKGZvciByZWxpYWJpbHR5IGNoZWNrKQ0KICAgIE1BQ19GYW1fQ29tYmluZWQ6T1VTX0lCLCAjIHNlbGVjdHMgY29tcG9zaXRlZCBpbmQuIGRpZmYgdmFyaWFibGVzDQogICAgQlNzX2NvbmQsICMgc2VsZWN0cyB2YXJpYWJsZSBmb3IgYmV0d2Vlbi1zdWJqZWN0cyBjb25kaXRpb24NCiAgICBEaXN0X1NjZW46Q2xvc2VPRGlzdF9TY2VuLCAjIHNlbGVjdHMgd2l0aGluLXN1YmplY3RzIGNvbmRpdGlvbiB2YXJpYWJsZQ0KICAgIE5vQ2hvaWNlX1NUUl9vYmxpZzpOb0Nob2ljZV9DVVpfbW9yYWwsICMgc2VsZWN0cyBOb0Nob2ljZSBEVnMgZm9yIFNUUm5DVVogZGF0YXNldA0KICAgIENob2ljZV9TVFJuQ1VaX1NUUl9vYmxpZzpDaG9pY2VfU1RSbkNVWl9DVVpfbW9yYWwsICMgc2VsZWN0cyBDaG9pY2UgRFZzIGZvciBTVFJuQ1VaIGRhdGFzZXQNCiAgICBOb0Nob2ljZV9TVFJtaW51c0NVWl9vYmxpZzpDaG9pY2VfU1RSbWludXNDVVpfbW9yYWwgIyBzZWxlY3RzIGRpZmZlcmVuY2Ugc2NvcmUgdmFyaWFibGVzIGZvciBTVFJuQ1VaIGRhdGFzZXQNCiAgICApDQoNCiMgU1RSIHZzIFNJQg0KRTFfU1RSblNJQl9jbGVhbiA8LSBFMV9hbGxfY2xlYW4gJT4lDQogIGZpbHRlcihCU3NfY29uZCA9PSAnU1RSIHZzIFNJQicpICU+JQ0KICAjIHNlbGVjdCBvbmx5IHZhcmlhYmxlcyB0aGF0IGFyZSByZWxldmFudCB0byBTVFJuQ1VaDQogIHNlbGVjdCgNCiAgICBSZXNwb25zZUlkLCAjIHNlbGVjdHMgdmFyaWFibGUNCiAgICBBZ2U6UG9saXRpY2FsX092ZXJhbGwsICMgc2VsZWN0cyBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMNCiAgICBNQUNfSnVkXzE6TUFDX0p1ZF8zLCBNQUNfUmVsXzE6TUFDX1JlbF8zLCBNRlFfSnVkXzE6TUZRX0p1ZF8zLCBNRlFfUmVsXzE6TUZRX1JlbF8zLCBPVVNfSUIxOk9VU19JQjUsICMgc2VsZWN0cyByYXcgaW5kLiBkaWZmIHZhcmlhYmxlcyAoZm9yIHJlbGlhYmlsdHkgY2hlY2spDQogICAgTUFDX0ZhbV9Db21iaW5lZDpPVVNfSUIsICMgc2VsZWN0cyBjb21wb3NpdGVkIGluZC4gZGlmZiB2YXJpYWJsZXMNCiAgICBCU3NfY29uZCwgIyBzZWxlY3RzIHZhcmlhYmxlIGZvciBiZXR3ZWVuLXN1YmplY3RzIGNvbmRpdGlvbg0KICAgIERpc3RfU2NlbjpDbG9zZU9EaXN0X1NjZW4sICMgc3NlbGVjdHMgd2l0aGluLXN1YmplY3RzIGNvbmRpdGlvbiB2YXJpYWJsZQ0KICAgIE5vQ2hvaWNlX1NUUl9vYmxpZzpOb0Nob2ljZV9TVFJfbW9yYWwsIE5vQ2hvaWNlX1NJQl9vYmxpZzpOb0Nob2ljZV9TSUJfbW9yYWwsICMgc2VsZWN0cyBOb0Nob2ljZSBEVnMgZm9yIFNUUm5TSUIgZGF0YXNldA0KICAgIENob2ljZV9TVFJuU0lCX1NUUl9vYmxpZzpDaG9pY2VfU1RSblNJQl9TSUJfbW9yYWwsICMgc2VsZWN0cyBDaG9pY2UgRFZzIGZvciBTVFJuU0lCIGRhdGFzZXQNCiAgICBOb0Nob2ljZV9TVFJtaW51c1NJQl9vYmxpZzpDaG9pY2VfU1RSbWludXNTSUJfbW9yYWwgIyBzZWxlY3RzIGRpZmZlcmVuY2Ugc2NvcmUgdmFyaWFibGVzIGZvciBTVFJuU0lCIGRhdGFzZXQNCiAgICApDQoNCiMgQ1VaIHZzIFNJQg0KRTFfQ1VablNJQl9jbGVhbiA8LSBFMV9hbGxfY2xlYW4gJT4lDQogIGZpbHRlcihCU3NfY29uZCA9PSAnQ1VaIHZzIFNJQicpICU+JQ0KICAjIHNlbGVjdCBvbmx5IHZhcmlhYmxlcyB0aGF0IGFyZSByZWxldmFudCB0byBTVFJuQ1VaDQogIHNlbGVjdCgNCiAgICBSZXNwb25zZUlkLCAjIHNlbGVjdHMgdmFyaWFibGUNCiAgICBBZ2U6UG9saXRpY2FsX092ZXJhbGwsICMgc2VsZWN0cyBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMNCiAgICBNQUNfSnVkXzE6TUFDX0p1ZF8zLCBNQUNfUmVsXzE6TUFDX1JlbF8zLCBNRlFfSnVkXzE6TUZRX0p1ZF8zLCBNRlFfUmVsXzE6TUZRX1JlbF8zLCBPVVNfSUIxOk9VU19JQjUsICMgc2VsZWN0cyByYXcgaW5kLiBkaWZmIHZhcmlhYmxlcyAoZm9yIHJlbGlhYmlsdHkgY2hlY2spDQogICAgTUFDX0ZhbV9Db21iaW5lZDpPVVNfSUIsICMgc2VsZWN0cyBjb21wb3NpdGVkIGluZC4gZGlmZiB2YXJpYWJsZXMNCiAgICBCU3NfY29uZCwgIyBzZWxlY3RzIHZhcmlhYmxlIGZvciBiZXR3ZWVuLXN1YmplY3RzIGNvbmRpdGlvbg0KICAgIERpc3RfU2NlbjpDbG9zZU9EaXN0X1NjZW4sICMgc2VsZWN0cyB3aXRoaW4tc3ViamVjdHMgY29uZGl0aW9uIHZhcmlhYmxlDQogICAgTm9DaG9pY2VfQ1VaX29ibGlnOk5vQ2hvaWNlX1NJQl9tb3JhbCwgIyBzZWxlY3RzIE5vQ2hvaWNlIERWcyBmb3IgQ1VablNJQiBkYXRhc2V0DQogICAgQ2hvaWNlX0NVWm5TSUJfQ1VaX29ibGlnOkNob2ljZV9DVVpuU0lCX1NJQl9tb3JhbCwgIyBzZWxlY3RzIENob2ljZSBEVnMgZm9yIENVWm5TSUIgZGF0YXNldA0KICAgIE5vQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnOkNob2ljZV9DVVptaW51c1NJQl9tb3JhbCAjIHNlbGVjdHMgZGlmZmVyZW5jZSBzY29yZSB2YXJpYWJsZXMgZm9yIENVWm5TSUIgZGF0YXNldA0KICAgICkNCmBgYA0KDQojIyBUaWR5aW5nIERhdGENCmBgYHtyfQ0KIyBDb252ZXJ0IGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcgZm9ybWF0IGZvciBvYmxpZ2F0aW9uIGFuZCBtb3JhbCBjaGFyYWN0ZXINCiMgU1RSbkNVWg0KRTFfU1RSbkNVWl9jb25kX2xvbmcgPC0gRTFfU1RSbkNVWl9jbGVhbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBjKERpc3RfU2NlbiwgQ2xvc2VfU2NlbiwgRGlzdE9DbG9zZV9TY2VuLCBDbG9zZU9EaXN0X1NjZW4pLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAiQ29uZGl0aW9uIg0KICApDQoNCkUxX1NUUm5DVVpfb2JsaWdfbG9uZyA8LSBFMV9TVFJuQ1VaX2NsZWFuICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGMoTm9DaG9pY2VfU1RSX29ibGlnLCBOb0Nob2ljZV9DVVpfb2JsaWcsIENob2ljZV9TVFJuQ1VaX1NUUl9vYmxpZywgQ2hvaWNlX1NUUm5DVVpfQ1VaX29ibGlnKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm9ibGlnIg0KICApDQoNCg0KRTFfU1RSbkNVWl9tb3JhbF9sb25nIDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJfbW9yYWwsIE5vQ2hvaWNlX0NVWl9tb3JhbCwgQ2hvaWNlX1NUUm5DVVpfU1RSX21vcmFsLCBDaG9pY2VfU1RSbkNVWl9DVVpfbW9yYWwpLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAibW9yYWwiDQogICkNCg0KIyBDb21iaW5lIGxvbmcgU1RSbkNVWiBkYXRhc2V0cywgc2VsZWN0IHBsb3R0aW5nIHZhcmlhYmxlcywgYW5kIGNyZWF0ZSBjb25kaXRpb24gdmFyaWFibGUgZm9yIGVhY2ggZmFjdG9yIChSZWxhdGlvbiArIENob2ljZSBDb250ZXh0KQ0KRTFfU1RSbkNVWl9sb25nIDwtIGNiaW5kKEUxX1NUUm5DVVpfY29uZF9sb25nLCBFMV9TVFJuQ1VaX29ibGlnX2xvbmcsIEUxX1NUUm5DVVpfbW9yYWxfbG9uZykNCg0KRTFfU1RSbkNVWl9sb25nIDwtIEUxX1NUUm5DVVpfbG9uZ1ssICFkdXBsaWNhdGVkKGNvbG5hbWVzKEUxX1NUUm5DVVpfbG9uZykpXSAlPiUgIyBnZXQgcmlkIG9mIGR1cGxpY2F0ZSBjb2x1bW5zDQogIHNlbGVjdChSZXNwb25zZUlkLA0KICAgICAgICAgQWdlOk9VU19JQiwNCiAgICAgICAgIEJTc19jb25kLA0KICAgICAgICAgV1NzX2NvbmQsDQogICAgICAgICBDb25kaXRpb24sDQogICAgICAgICBvYmxpZywgbW9yYWwpICU+JQ0KICBtdXRhdGUoUmVsYXRpb24gPSBjYXNlX3doZW4oDQogICAgV1NzX2NvbmQgPT0gIkRpc3RfU2NlbiIgfiAiRGlzdGFudCIsDQogICAgV1NzX2NvbmQgPT0gIkNsb3NlX1NjZW4iIH4gIkNsb3NlIiwNCiAgICBXU3NfY29uZCA9PSAiRGlzdE9DbG9zZV9TY2VuIiB+ICJEaXN0YW50IiwNCiAgICBXU3NfY29uZCA9PSAiQ2xvc2VPRGlzdF9TY2VuIiB+ICJDbG9zZSIpKSAlPiUNCiAgbXV0YXRlKGBDaG9pY2UgQ29udGV4dGAgPSBjYXNlX3doZW4oDQogICAgV1NzX2NvbmQgPT0gIkRpc3RfU2NlbiIgfiAiTm8gQ2hvaWNlIiwNCiAgICBXU3NfY29uZCA9PSAiQ2xvc2VfU2NlbiIgfiAiTm8gQ2hvaWNlIiwNCiAgICBXU3NfY29uZCA9PSAiRGlzdE9DbG9zZV9TY2VuIiB+ICJDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJDbG9zZU9EaXN0X1NjZW4iIH4gIkNob2ljZSIpKQ0KDQojIFJlb3JkZXIvcmVuYW1lIGNvbmRpdGlvbiBhbmQgcGFydGljaXBhbnQgZmFjdG9ycw0KRTFfU1RSbkNVWl9sb25nJFJlbGF0aW9uIDwtIGFzLmZhY3RvcihFMV9TVFJuQ1VaX2xvbmckUmVsYXRpb24pDQpFMV9TVFJuQ1VaX2xvbmckUmVsYXRpb24gPC0gb3JkZXJlZChFMV9TVFJuQ1VaX2xvbmckUmVsYXRpb24sIGxldmVscyA9IGMoIkRpc3RhbnQiLCAiQ2xvc2UiKSkNCkUxX1NUUm5DVVpfbG9uZyRgQ2hvaWNlIENvbnRleHRgIDwtIGFzLmZhY3RvcihFMV9TVFJuQ1VaX2xvbmckYENob2ljZSBDb250ZXh0YCkNCkUxX1NUUm5DVVpfbG9uZyRgQ2hvaWNlIENvbnRleHRgIDwtIG9yZGVyZWQoRTFfU1RSbkNVWl9sb25nJGBDaG9pY2UgQ29udGV4dGAsIGxldmVscyA9IGMoIk5vIENob2ljZSIsICJDaG9pY2UiKSkNCkUxX1NUUm5DVVpfbG9uZyRSZXNwb25zZUlkIDwtIGFzLmZhY3RvcihFMV9TVFJuQ1VaX2xvbmckUmVzcG9uc2VJZCkNCg0KDQojIENvbnZlcnQgZGF0YSBmcm9tIHdpZGUgdG8gbG9uZyBmb3JtYXQgZm9yIG9ibGlnYXRpb24gYW5kIG1vcmFsIGNoYXJhY3Rlcg0KIyBTVFJuU0lCDQpFMV9TVFJuU0lCX2NvbmRfbG9uZyA8LSBFMV9TVFJuU0lCX2NsZWFuICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGMoRGlzdF9TY2VuLCBDbG9zZV9TY2VuLCBEaXN0T0Nsb3NlX1NjZW4sIENsb3NlT0Rpc3RfU2NlbiksDQogICAgbmFtZXNfdG8gPSAiV1NzX2NvbmQiLA0KICAgIHZhbHVlc190byA9ICJDb25kaXRpb24iDQogICkNCg0KRTFfU1RSblNJQl9vYmxpZ19sb25nIDwtIEUxX1NUUm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJfb2JsaWcsIE5vQ2hvaWNlX1NJQl9vYmxpZywgQ2hvaWNlX1NUUm5TSUJfU1RSX29ibGlnLCBDaG9pY2VfU1RSblNJQl9TSUJfb2JsaWcpLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAib2JsaWciDQogICkNCg0KDQpFMV9TVFJuU0lCX21vcmFsX2xvbmcgPC0gRTFfU1RSblNJQl9jbGVhbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBjKE5vQ2hvaWNlX1NUUl9tb3JhbCwgTm9DaG9pY2VfU0lCX21vcmFsLCBDaG9pY2VfU1RSblNJQl9TVFJfbW9yYWwsIENob2ljZV9TVFJuU0lCX1NJQl9tb3JhbCksDQogICAgbmFtZXNfdG8gPSAiV1NzX2NvbmQiLA0KICAgIHZhbHVlc190byA9ICJtb3JhbCINCiAgKQ0KDQojIENvbWJpbmUgbG9uZyBTVFJuU0lCIGRhdGFzZXRzLCBzZWxlY3QgcGxvdHRpbmcgdmFyaWFibGVzLCBhbmQgY3JlYXRlIGNvbmRpdGlvbiB2YXJpYWJsZSBmb3IgZWFjaCBmYWN0b3IgKFJlbGF0aW9uICsgQ2hvaWNlIENvbnRleHQpDQpFMV9TVFJuU0lCX2xvbmcgPC0gY2JpbmQoRTFfU1RSblNJQl9jb25kX2xvbmcsIEUxX1NUUm5TSUJfb2JsaWdfbG9uZywgRTFfU1RSblNJQl9tb3JhbF9sb25nKQ0KDQpFMV9TVFJuU0lCX2xvbmcgPC0gRTFfU1RSblNJQl9sb25nWywgIWR1cGxpY2F0ZWQoY29sbmFtZXMoRTFfU1RSblNJQl9sb25nKSldICU+JSAjIGdldCByaWQgb2YgZHVwbGljYXRlIGNvbHVtbnMNCiAgc2VsZWN0KFJlc3BvbnNlSWQsDQogICAgICAgICBBZ2U6T1VTX0lCLA0KICAgICAgICAgQlNzX2NvbmQsDQogICAgICAgICBXU3NfY29uZCwNCiAgICAgICAgIENvbmRpdGlvbiwNCiAgICAgICAgIG9ibGlnLCBtb3JhbCkgJT4lDQogIG11dGF0ZShSZWxhdGlvbiA9IGNhc2Vfd2hlbigNCiAgICBXU3NfY29uZCA9PSAiRGlzdF9TY2VuIiB+ICJEaXN0YW50IiwNCiAgICBXU3NfY29uZCA9PSAiQ2xvc2VfU2NlbiIgfiAiQ2xvc2UiLA0KICAgIFdTc19jb25kID09ICJEaXN0T0Nsb3NlX1NjZW4iIH4gIkRpc3RhbnQiLA0KICAgIFdTc19jb25kID09ICJDbG9zZU9EaXN0X1NjZW4iIH4gIkNsb3NlIikpICU+JQ0KICBtdXRhdGUoYENob2ljZSBDb250ZXh0YCA9IGNhc2Vfd2hlbigNCiAgICBXU3NfY29uZCA9PSAiRGlzdF9TY2VuIiB+ICJObyBDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJDbG9zZV9TY2VuIiB+ICJObyBDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJEaXN0T0Nsb3NlX1NjZW4iIH4gIkNob2ljZSIsDQogICAgV1NzX2NvbmQgPT0gIkNsb3NlT0Rpc3RfU2NlbiIgfiAiQ2hvaWNlIikpDQoNCiMgUmVvcmRlci9yZW5hbWUgY29uZGl0aW9uIGFuZCBwYXJ0aWNpcGFudCBmYWN0b3JzDQpFMV9TVFJuU0lCX2xvbmckUmVsYXRpb24gPC0gYXMuZmFjdG9yKEUxX1NUUm5TSUJfbG9uZyRSZWxhdGlvbikNCkUxX1NUUm5TSUJfbG9uZyRSZWxhdGlvbiA8LSBvcmRlcmVkKEUxX1NUUm5TSUJfbG9uZyRSZWxhdGlvbiwgbGV2ZWxzID0gYygiRGlzdGFudCIsICJDbG9zZSIpKQ0KRTFfU1RSblNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGAgPC0gYXMuZmFjdG9yKEUxX1NUUm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgKQ0KRTFfU1RSblNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGAgPC0gb3JkZXJlZChFMV9TVFJuU0lCX2xvbmckYENob2ljZSBDb250ZXh0YCwgbGV2ZWxzID0gYygiTm8gQ2hvaWNlIiwgIkNob2ljZSIpKQ0KRTFfU1RSblNJQl9sb25nJFJlc3BvbnNlSWQgPC0gYXMuZmFjdG9yKEUxX1NUUm5TSUJfbG9uZyRSZXNwb25zZUlkKQ0KDQoNCiMgQ29udmVydCBkYXRhIGZyb20gd2lkZSB0byBsb25nIGZvcm1hdCBmb3Igb2JsaWdhdGlvbiBhbmQgbW9yYWwgY2hhcmFjdGVyDQojIENVWm5TSUINCkUxX0NVWm5TSUJfY29uZF9sb25nIDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhEaXN0X1NjZW4sIENsb3NlX1NjZW4sIERpc3RPQ2xvc2VfU2NlbiwgQ2xvc2VPRGlzdF9TY2VuKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIkNvbmRpdGlvbiINCiAgKQ0KDQpFMV9DVVpuU0lCX29ibGlnX2xvbmcgPC0gRTFfQ1VablNJQl9jbGVhbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBjKE5vQ2hvaWNlX0NVWl9vYmxpZywgTm9DaG9pY2VfU0lCX29ibGlnLCBDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWcsIENob2ljZV9DVVpuU0lCX1NJQl9vYmxpZyksDQogICAgbmFtZXNfdG8gPSAiV1NzX2NvbmQiLA0KICAgIHZhbHVlc190byA9ICJvYmxpZyINCiAgKQ0KDQoNCkUxX0NVWm5TSUJfbW9yYWxfbG9uZyA8LSBFMV9DVVpuU0lCX2NsZWFuICU+JQ0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IGMoTm9DaG9pY2VfQ1VaX21vcmFsLCBOb0Nob2ljZV9TSUJfbW9yYWwsIENob2ljZV9DVVpuU0lCX0NVWl9tb3JhbCwgQ2hvaWNlX0NVWm5TSUJfU0lCX21vcmFsKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm1vcmFsIg0KICApDQoNCiMgQ29tYmluZSBsb25nIENVWm5TSUIgZGF0YXNldHMsIHNlbGVjdCBwbG90dGluZyB2YXJpYWJsZXMsIGFuZCBjcmVhdGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvciBlYWNoIGZhY3RvciAoUmVsYXRpb24gKyBDaG9pY2UgQ29udGV4dCkNCkUxX0NVWm5TSUJfbG9uZyA8LSBjYmluZChFMV9DVVpuU0lCX2NvbmRfbG9uZywgRTFfQ1VablNJQl9vYmxpZ19sb25nLCBFMV9DVVpuU0lCX21vcmFsX2xvbmcpDQoNCkUxX0NVWm5TSUJfbG9uZyA8LSBFMV9DVVpuU0lCX2xvbmdbLCAhZHVwbGljYXRlZChjb2xuYW1lcyhFMV9DVVpuU0lCX2xvbmcpKV0gJT4lICMgZ2V0IHJpZCBvZiBkdXBsaWNhdGUgY29sdW1ucw0KICBzZWxlY3QoUmVzcG9uc2VJZCwNCiAgICAgICAgIEFnZTpPVVNfSUIsDQogICAgICAgICBCU3NfY29uZCwNCiAgICAgICAgIFdTc19jb25kLA0KICAgICAgICAgQ29uZGl0aW9uLA0KICAgICAgICAgb2JsaWcsIG1vcmFsKSAlPiUNCiAgbXV0YXRlKFJlbGF0aW9uID0gY2FzZV93aGVuKA0KICAgIFdTc19jb25kID09ICJEaXN0X1NjZW4iIH4gIkRpc3RhbnQiLA0KICAgIFdTc19jb25kID09ICJDbG9zZV9TY2VuIiB+ICJDbG9zZSIsDQogICAgV1NzX2NvbmQgPT0gIkRpc3RPQ2xvc2VfU2NlbiIgfiAiRGlzdGFudCIsDQogICAgV1NzX2NvbmQgPT0gIkNsb3NlT0Rpc3RfU2NlbiIgfiAiQ2xvc2UiKSkgJT4lDQogIG11dGF0ZShgQ2hvaWNlIENvbnRleHRgID0gY2FzZV93aGVuKA0KICAgIFdTc19jb25kID09ICJEaXN0X1NjZW4iIH4gIk5vIENob2ljZSIsDQogICAgV1NzX2NvbmQgPT0gIkNsb3NlX1NjZW4iIH4gIk5vIENob2ljZSIsDQogICAgV1NzX2NvbmQgPT0gIkRpc3RPQ2xvc2VfU2NlbiIgfiAiQ2hvaWNlIiwNCiAgICBXU3NfY29uZCA9PSAiQ2xvc2VPRGlzdF9TY2VuIiB+ICJDaG9pY2UiKSkNCg0KIyBSZW9yZGVyL3JlbmFtZSBjb25kaXRpb24gYW5kIHBhcnRpY2lwYW50IGZhY3RvcnMNCkUxX0NVWm5TSUJfbG9uZyRSZWxhdGlvbiA8LSBhcy5mYWN0b3IoRTFfQ1VablNJQl9sb25nJFJlbGF0aW9uKQ0KRTFfQ1VablNJQl9sb25nJFJlbGF0aW9uIDwtIG9yZGVyZWQoRTFfQ1VablNJQl9sb25nJFJlbGF0aW9uLCBsZXZlbHMgPSBjKCJEaXN0YW50IiwgIkNsb3NlIikpDQpFMV9DVVpuU0lCX2xvbmckYENob2ljZSBDb250ZXh0YCA8LSBhcy5mYWN0b3IoRTFfQ1VablNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGApDQpFMV9DVVpuU0lCX2xvbmckYENob2ljZSBDb250ZXh0YCA8LSBvcmRlcmVkKEUxX0NVWm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgLCBsZXZlbHMgPSBjKCJObyBDaG9pY2UiLCAiQ2hvaWNlIikpDQpFMV9DVVpuU0lCX2xvbmckUmVzcG9uc2VJZCA8LSBhcy5mYWN0b3IoRTFfQ1VablNJQl9sb25nJFJlc3BvbnNlSWQpDQoNCg0KDQojIENvbWJpbmUgaW50byBvbmUgZGF0YXNldCBmb3IgbGF0ZXIgZXhwbG9yYXRvcnkgYW5hbHlzZXMNCkUxX2FsbF9sb25nIDwtIHJiaW5kKEUxX1NUUm5TSUJfbG9uZywgRTFfU1RSbkNVWl9sb25nLCBFMV9DVVpuU0lCX2xvbmcpDQojIFJlb3JkZXIgQWxsX2xvbmcgQlNzX2NvbmQNCkUxX2FsbF9sb25nJEJTc19jb25kIDwtIGFzLmZhY3RvcihFMV9hbGxfbG9uZyRCU3NfY29uZCkNCkUxX2FsbF9sb25nJEJTc19jb25kIDwtIG9yZGVyZWQoRTFfYWxsX2xvbmckQlNzX2NvbmQsIGxldmVscyA9IGMoIlNUUiB2cyBTSUIiLCAiU1RSIHZzIENVWiIsICJDVVogdnMgU0lCIikpICMgb3JkZXIgaXMgZHVlIHRvIGxpa2VseSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRhdGFzZXRzIChsYXJnZXN0IHRvIHNtYWxsZXN0IC0gc2VlIHByZS1yZWdpc3RyYXRpb24ncyAiZXhwbG9yYXRvcnkgYW5hbHlzaXMiIHNlY3Rpb24pDQpgYGANCg0KDQojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3Mgey50YWJzZXR9DQoNCiMjIE9ibGlnIHsudGFic2V0fQ0KDQojIyMgU1RSblNJQg0KYGBge3J9DQpkZXNjcmliZUJ5KEUxX1NUUm5TSUJfbG9uZyRvYmxpZywgbGlzdChFMV9TVFJuU0lCX2xvbmckUmVsYXRpb24sIEUxX1NUUm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgKSwgbWF0ID0gVCkNCmBgYA0KIyMjIFNUUm5DVVoNCmBgYHtyfQ0KZGVzY3JpYmVCeShFMV9TVFJuQ1VaX2xvbmckb2JsaWcsIGxpc3QoRTFfU1RSbkNVWl9sb25nJFJlbGF0aW9uLCBFMV9TVFJuQ1VaX2xvbmckYENob2ljZSBDb250ZXh0YCksIG1hdCA9IFQpDQpgYGANCiMjIyBDVVpuU0lCDQpgYGB7cn0NCmRlc2NyaWJlQnkoRTFfQ1VablNJQl9sb25nJG9ibGlnLCBsaXN0KEUxX0NVWm5TSUJfbG9uZyRSZWxhdGlvbiwgRTFfQ1VablNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGApLCBtYXQgPSBUKQ0KYGBgDQoNCiMjIE1vcmFsIHsudGFic2V0fQ0KDQojIyMgU1RSblNJQg0KYGBge3J9DQpkZXNjcmliZUJ5KEUxX1NUUm5TSUJfbG9uZyRtb3JhbCwgbGlzdChFMV9TVFJuU0lCX2xvbmckUmVsYXRpb24sIEUxX1NUUm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgKSwgbWF0ID0gVCkNCmBgYA0KIyMjIFNUUm5DVVoNCmBgYHtyfQ0KZGVzY3JpYmVCeShFMV9TVFJuQ1VaX2xvbmckbW9yYWwsIGxpc3QoRTFfU1RSbkNVWl9sb25nJFJlbGF0aW9uLCBFMV9TVFJuQ1VaX2xvbmckYENob2ljZSBDb250ZXh0YCksIG1hdCA9IFQpDQpgYGANCiMjIyBDVVpuU0lCDQpgYGB7cn0NCmRlc2NyaWJlQnkoRTFfQ1VablNJQl9sb25nJG1vcmFsLCBsaXN0KEUxX0NVWm5TSUJfbG9uZyRSZWxhdGlvbiwgRTFfQ1VablNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGApLCBtYXQgPSBUKQ0KYGBgDQoNCg0KIyBNZWFuIERpZmZlcmVuY2UgUGxvdHMgey50YWJzZXR9DQpgYGB7cn0NCiMgU2V0IGRvZGdlIGZvciBwbG90dGluZyBjcm9zc2VkIGZhY3RvcnMNCmRvZGdlID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSANCmBgYA0KDQojIyBPYmxpZyB7LnRhYnNldH0NCg0KIyMjIFNUUm5TSUINCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChvYmxpZ19wbG90X1NUUm5TSUIgPC0gZ2dwbG90KGRhdGEgPSBFMV9TVFJuU0lCX2xvbmcsIGFlcyh4ID0gYENob2ljZSBDb250ZXh0YCwgeSA9IG9ibGlnLCBmaWxsID0gUmVsYXRpb24pKSArDQogICAgICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gUmVsYXRpb24pLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLnNoYXBlID0gTkEsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDE4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiQ2hvaWNlIENvbnRleHQiKSArDQogICAgICAgIHlsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGgiKSArIA0KICAgICAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSkpDQpgYGANCiMjIyBTVFJuQ1VaDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQob2JsaWdfcGxvdF9TVFJuQ1VaIDwtIGdncGxvdChkYXRhID0gRTFfU1RSbkNVWl9sb25nLCBhZXMoeCA9IGBDaG9pY2UgQ29udGV4dGAsIHkgPSBvYmxpZywgZmlsbCA9IFJlbGF0aW9uKSkgKw0KICAgICAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IFJlbGF0aW9uKSwgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAgICAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwgb3V0bGllci5zaGFwZSA9IE5BLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0c2t5Ymx1ZTMiLCAiaW5kaWFucmVkMyIpKSArDQogICAgICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAxOCwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMywgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArDQogICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgIHhsYWIoIkNob2ljZSBDb250ZXh0IikgKw0KICAgICAgICB5bGFiKCJPYmxpZ2F0aW9uIFN0cmVuZ3RoIikgKyAgDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCmBgYA0KIyMjIENVWm5TSUINCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChvYmxpZ19wbG90X0NVWm5TSUIgPC0gZ2dwbG90KGRhdGEgPSBFMV9DVVpuU0lCX2xvbmcsIGFlcyh4ID0gYENob2ljZSBDb250ZXh0YCwgeSA9IG9ibGlnLCBmaWxsID0gUmVsYXRpb24pKSArDQogICAgICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gUmVsYXRpb24pLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLnNoYXBlID0gTkEsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDE4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiQ2hvaWNlIENvbnRleHQiKSArDQogICAgICAgIHlsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGgiKSArICANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQojIyMgQ29tYmluZWQNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChvYmxpZ19wbG90X2NvbWJpbmVkIDwtIGdncGxvdChkYXRhID0gRTFfYWxsX2xvbmcsIGFlcyh4ID0gYENob2ljZSBDb250ZXh0YCwgeSA9IG9ibGlnLCBmaWxsID0gUmVsYXRpb24pKSArDQogICAgICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gUmVsYXRpb24pLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLnNoYXBlID0gTkEsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDE4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgZmFjZXRfd3JhcCh+QlNzX2NvbmQsIG5yb3cgPSAzKSArDQogICAgICAgIHhsYWIoIlxuQ2hvaWNlIENvbnRleHQiKSArDQogICAgICAgIHlsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGhcbiIpICsNCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIkUxX29ibGlnX3Bsb3QucG5nIikNCmBgYA0KDQojIyBNb3JhbCB7LnRhYnNldH0NCg0KIyMjIFNUUm5TSUINCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChtb3JhbF9wbG90X1NUUm5TSUIgPC0gZ2dwbG90KGRhdGEgPSBFMV9TVFJuU0lCX2xvbmcsIGFlcyh4ID0gYENob2ljZSBDb250ZXh0YCwgeSA9IG1vcmFsLCBmaWxsID0gUmVsYXRpb24pKSArDQogICAgICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDUwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgICAgICAgZ2VvbV92aW9saW4oYWVzKGZpbGwgPSBSZWxhdGlvbiksIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgZ2VvbV9ib3hwbG90KHdpZHRoID0gMC4xLCBjb2xvciA9ICJibGFjayIsIG91dGxpZXIuc2hhcGUgPSBOQSwgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodHNreWJsdWUzIiwgImluZGlhbnJlZDMiKSkgKw0KICAgICAgICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJwb2ludCIsIHNoYXBlID0gMTgsIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDMsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB4bGFiKCJDaG9pY2UgQ29udGV4dCIpICsNCiAgICAgICAgeWxhYigiTW9yYWwgQ2hhcmFjdGVyIikgKyANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQojIyMgU1RSbkNVWg0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG1vcmFsX3Bsb3RfU1RSbkNVWiA8LSBnZ3Bsb3QoZGF0YSA9IEUxX1NUUm5DVVpfbG9uZywgYWVzKHggPSBgQ2hvaWNlIENvbnRleHRgLCB5ID0gbW9yYWwsIGZpbGwgPSBSZWxhdGlvbikpICsNCiAgICAgICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgICBnZW9tX3Zpb2xpbihhZXMoZmlsbCA9IFJlbGF0aW9uKSwgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAgICAgICBnZW9tX2JveHBsb3Qod2lkdGggPSAwLjEsIGNvbG9yID0gImJsYWNrIiwgb3V0bGllci5zaGFwZSA9IE5BLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0c2t5Ymx1ZTMiLCAiaW5kaWFucmVkMyIpKSArDQogICAgICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAxOCwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMywgcG9zaXRpb24gPSBkb2RnZSkgKw0KICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArDQogICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgIHhsYWIoIkNob2ljZSBDb250ZXh0IikgKw0KICAgICAgICB5bGFiKCJNb3JhbCBDaGFyYWN0ZXIiKSArIA0KICAgICAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSkpDQpgYGANCiMjIyBDVVpuU0lCDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQobW9yYWxfcGxvdF9DVVpuU0lCIDwtIGdncGxvdChkYXRhID0gRTFfQ1VablNJQl9sb25nLCBhZXMoeCA9IGBDaG9pY2UgQ29udGV4dGAsIHkgPSBtb3JhbCwgZmlsbCA9IFJlbGF0aW9uKSkgKw0KICAgICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gUmVsYXRpb24pLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLnNoYXBlID0gTkEsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDE4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiQ2hvaWNlIENvbnRleHQiKSArDQogICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciIpICsgDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCmBgYA0KIyMjIENvbWJpbmVkDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQobW9yYWxfcGxvdF9jb21iaW5lZCA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2FsbF9sb25nLCBhZXMoeCA9IGBDaG9pY2UgQ29udGV4dGAsIHkgPSBtb3JhbCwgZmlsbCA9IFJlbGF0aW9uKSkgKw0KICAgICAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA1MCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICAgICAgIGdlb21fdmlvbGluKGFlcyhmaWxsID0gUmVsYXRpb24pLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIGdlb21fYm94cGxvdCh3aWR0aCA9IDAuMSwgY29sb3IgPSAiYmxhY2siLCBvdXRsaWVyLnNoYXBlID0gTkEsIHBvc2l0aW9uID0gZG9kZ2UpICsNCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLCBzaGFwZSA9IDE4LCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAzLCBwb3NpdGlvbiA9IGRvZGdlKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgZmFjZXRfd3JhcCh+QlNzX2NvbmQsIG5yb3cgPSAzKSArDQogICAgICAgIHhsYWIoIlxuQ2hvaWNlIENvbnRleHQiKSArDQogICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlclxuIikgKyANCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIkUxX21vcmFsX3Bsb3QucG5nIikNCmBgYA0KDQoNCiMgTWVhbiBEaWZmZXJlbmNlIFRlc3RzIHsudGFic2V0fQ0KDQo8YnI+DQoNClNlZSBvdXIgcHJlLXJlZ2lzdHJhdGlvbiAoaHR0cHM6Ly9vc2YuaW8vNnE0a3IvP3ZpZXdfb25seT04MDMzYzY1YzlkZmM0MWJjYmM1MjhmZTk0NDA5ZTRlOCkgZm9yIG91ciBwcmVkaWN0aW9ucyByZWxhdGVkIHRvIG9ibGlnYXRpb24ganVkZ21lbnRzIGFuZCBtb3JhbCBjaGFyYWN0ZXIganVkZ21lbnRzLg0KDQo8YnI+DQoNCiMjIE9ibGlnIHsudGFic2V0fQ0KDQojIyMgU1RSblNJQiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuU0lCX2NsZWFuLCAiTm9DaG9pY2VfU1RSX29ibGlnIiwgIk5vQ2hvaWNlX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuU0lCX2NsZWFuLCAiQ2hvaWNlX1NUUm5TSUJfU1RSX29ibGlnIiwgIkNob2ljZV9TVFJuU0lCX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyMgU1RSbkNVWiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuQ1VaX2NsZWFuLCAiTm9DaG9pY2VfU1RSX29ibGlnIiwgIk5vQ2hvaWNlX0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuQ1VaX2NsZWFuLCAiQ2hvaWNlX1NUUm5DVVpfU1RSX29ibGlnIiwgIkNob2ljZV9TVFJuQ1VaX0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyMgQ1VablNJQiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9DVVpuU0lCX2NsZWFuLCAiTm9DaG9pY2VfQ1VaX29ibGlnIiwgIk5vQ2hvaWNlX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3Qob2JsaWcgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChvYmxpZyB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIkNob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQob2JsaWcgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9DVVpuU0lCX2NsZWFuLCAiQ2hvaWNlX0NVWm5TSUJfQ1VaX29ibGlnIiwgIkNob2ljZV9DVVpuU0lCX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQoNCiMjIE1vcmFsIHsudGFic2V0fQ0KDQojIyMgQU5PVkFzIHsudGFic2V0fQ0KDQojIyMjIFNUUm5TSUINCmBgYHtyfQ0KIyByZXR1cm5zIDIgeCAyIHdpdGhpbi1zdWJqZWN0IEFOT1ZBIHJlc3VsdHMNCmFvdl9tb3JhbF9TVFJuU0lCIDwtIGFvdihtb3JhbCB+IFJlbGF0aW9uKmBDaG9pY2UgQ29udGV4dGAgKyBFcnJvcihSZXNwb25zZUlkLyhSZWxhdGlvbipgQ2hvaWNlIENvbnRleHRgKSksIGRhdGEgPSBFMV9TVFJuU0lCX2xvbmcpDQpzdW1tYXJ5KGFvdl9tb3JhbF9TVFJuU0lCKQ0KDQojIHJldHVybnMgZXRhLXNxIGVmZmVjdCBzaXplDQpldGFfc3EoYW92X21vcmFsX1NUUm5TSUIsIHBhcnRpYWwgPSBUUlVFKQ0KYGBgDQoNCiMjIyMgU1RSbkNVWg0KYGBge3J9DQojIHJldHVybnMgMiB4IDIgd2l0aGluLXN1YmplY3QgQU5PVkEgcmVzdWx0cw0KYW92X21vcmFsX1NUUm5DVVogPC0gYW92KG1vcmFsIH4gUmVsYXRpb24qYENob2ljZSBDb250ZXh0YCArIEVycm9yKFJlc3BvbnNlSWQvKFJlbGF0aW9uKmBDaG9pY2UgQ29udGV4dGApKSwgZGF0YSA9IEUxX1NUUm5DVVpfbG9uZykNCnN1bW1hcnkoYW92X21vcmFsX1NUUm5DVVopDQoNCiMgcmV0dXJucyBldGEtc3EgZWZmZWN0IHNpemUNCmV0YV9zcShhb3ZfbW9yYWxfU1RSbkNVWiwgcGFydGlhbCA9IFRSVUUpDQpgYGANCg0KIyMjIyBDVVpuU0lCDQpgYGB7cn0NCiMgcmV0dXJucyAyIHggMiB3aXRoaW4tc3ViamVjdCBBTk9WQSByZXN1bHRzDQphb3ZfbW9yYWxfQ1VablNJQiA8LSBhb3YobW9yYWwgfiBSZWxhdGlvbipgQ2hvaWNlIENvbnRleHRgICsgRXJyb3IoUmVzcG9uc2VJZC8oUmVsYXRpb24qYENob2ljZSBDb250ZXh0YCkpLCBkYXRhID0gRTFfQ1VablNJQl9sb25nKQ0Kc3VtbWFyeShhb3ZfbW9yYWxfQ1VablNJQikNCg0KIyByZXR1cm5zIGV0YS1zcSBlZmZlY3Qgc2l6ZQ0KZXRhX3NxKGFvdl9tb3JhbF9DVVpuU0lCLCBwYXJ0aWFsID0gVFJVRSkNCmBgYA0KDQojIyMgdC10ZXN0cyB7LnRhYnNldH0NCg0KIyMjIyBTVFJuU0lCIHsudGFic2V0fQ0KDQojIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3QobW9yYWwgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChtb3JhbCB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuU0lCX2NsZWFuLCAiTm9DaG9pY2VfU1RSX21vcmFsIiwgIk5vQ2hvaWNlX1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgcmV0dXJucyB0LXRlc3QgcmVzdWx0cw0KdC50ZXN0KG1vcmFsIH4gUmVsYXRpb24sIA0KICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICBwYWlyZWQgPSBUKQ0KDQojIHJldHVybnMgZHogZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gRikgIyBzZXR0aW5nIHRoaXMgdG8gZmFsc2UgZW5zdXJlcyBkeiBpcyBjYWxjdWxhdGVkLCB1c2luZyBkaWZmZXJlbmNlIHNjb3JlDQoNCiMgcmV0dXJucyBkLWF2IGVmZmVjdCBzaXplIGFuZCA5NSUgQ0lzDQplZmZzaXplOjpjb2hlbi5kKG1vcmFsIH4gUmVsYXRpb24gfCBTdWJqZWN0KFJlc3BvbnNlSWQpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gRTFfYWxsX2xvbmcgJT4lIGZpbHRlcihCU3NfY29uZCA9PSAiU1RSIHZzIFNJQiIpICU+JSBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikgJT4lIGRyb3BsZXZlbHMoKSwgDQogICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFQpICMgc2V0dGluZyB0aGlzIHRvIHRydWUgZW5zdXJlcyBkLWF2IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIHJhdyBzY29yZXMNCg0KIyByZXR1cm5zIGNvcnJlbGF0aW9uIGJldHdlZW4gdmFyaWFibGVzDQpjb3JfdGVzdChkYXRhID0gRTFfU1RSblNJQl9jbGVhbiwgIkNob2ljZV9TVFJuU0lCX1NUUl9tb3JhbCIsICJDaG9pY2VfU1RSblNJQl9TSUJfbW9yYWwiLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KIyMjIyBTVFJuQ1VaIHsudGFic2V0fQ0KDQojIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3QobW9yYWwgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChtb3JhbCB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9TVFJuQ1VaX2NsZWFuLCAiTm9DaG9pY2VfU1RSX21vcmFsIiwgIk5vQ2hvaWNlX0NVWl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgcmV0dXJucyB0LXRlc3QgcmVzdWx0cw0KdC50ZXN0KG1vcmFsIH4gUmVsYXRpb24sIA0KICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICBwYWlyZWQgPSBUKQ0KDQojIHJldHVybnMgZHogZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gRikgIyBzZXR0aW5nIHRoaXMgdG8gZmFsc2UgZW5zdXJlcyBkeiBpcyBjYWxjdWxhdGVkLCB1c2luZyBkaWZmZXJlbmNlIHNjb3JlDQoNCiMgcmV0dXJucyBkLWF2IGVmZmVjdCBzaXplIGFuZCA5NSUgQ0lzDQplZmZzaXplOjpjb2hlbi5kKG1vcmFsIH4gUmVsYXRpb24gfCBTdWJqZWN0KFJlc3BvbnNlSWQpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gRTFfYWxsX2xvbmcgJT4lIGZpbHRlcihCU3NfY29uZCA9PSAiU1RSIHZzIENVWiIpICU+JSBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikgJT4lIGRyb3BsZXZlbHMoKSwgDQogICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFQpICMgc2V0dGluZyB0aGlzIHRvIHRydWUgZW5zdXJlcyBkLWF2IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIHJhdyBzY29yZXMNCg0KIyByZXR1cm5zIGNvcnJlbGF0aW9uIGJldHdlZW4gdmFyaWFibGVzDQpjb3JfdGVzdChkYXRhID0gRTFfU1RSbkNVWl9jbGVhbiwgIkNob2ljZV9TVFJuQ1VaX1NUUl9tb3JhbCIsICJDaG9pY2VfU1RSbkNVWl9DVVpfbW9yYWwiLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KIyMjIyBDVVpuU0lCIHsudGFic2V0fQ0KDQojIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyByZXR1cm5zIHQtdGVzdCByZXN1bHRzDQp0LnRlc3QobW9yYWwgfiBSZWxhdGlvbiwgDQogICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgIHBhaXJlZCA9IFQpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChtb3JhbCB+IFJlbGF0aW9uIHwgU3ViamVjdChSZXNwb25zZUlkKSwNCiAgICAgICAgICAgICAgICAgZGF0YSA9IEUxX2FsbF9sb25nICU+JSBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgZmlsdGVyKGBDaG9pY2UgQ29udGV4dGAgPT0gIk5vIENob2ljZSIpICU+JSBkcm9wbGV2ZWxzKCksIA0KICAgICAgICAgICAgICAgICBwYWlyZWQgPSBULA0KICAgICAgICAgICAgICAgICB3aXRoaW4gPSBGKSAjIHNldHRpbmcgdGhpcyB0byBmYWxzZSBlbnN1cmVzIGR6IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIGRpZmZlcmVuY2Ugc2NvcmUNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gVCkgIyBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSBlbnN1cmVzIGQtYXYgaXMgY2FsY3VsYXRlZCwgdXNpbmcgcmF3IHNjb3Jlcw0KDQojIHJldHVybnMgY29ycmVsYXRpb24gYmV0d2VlbiB2YXJpYWJsZXMNCmNvcl90ZXN0KGRhdGEgPSBFMV9DVVpuU0lCX2NsZWFuLCAiTm9DaG9pY2VfQ1VaX21vcmFsIiwgIk5vQ2hvaWNlX1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgcmV0dXJucyB0LXRlc3QgcmVzdWx0cw0KdC50ZXN0KG1vcmFsIH4gUmVsYXRpb24sIA0KICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICBwYWlyZWQgPSBUKQ0KDQojIHJldHVybnMgZHogZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQobW9yYWwgfiBSZWxhdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBFMV9hbGxfbG9uZyAlPiUgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJDaG9pY2UiKSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gRikgIyBzZXR0aW5nIHRoaXMgdG8gZmFsc2UgZW5zdXJlcyBkeiBpcyBjYWxjdWxhdGVkLCB1c2luZyBkaWZmZXJlbmNlIHNjb3JlDQoNCiMgcmV0dXJucyBkLWF2IGVmZmVjdCBzaXplIGFuZCA5NSUgQ0lzDQplZmZzaXplOjpjb2hlbi5kKG1vcmFsIH4gUmVsYXRpb24gfCBTdWJqZWN0KFJlc3BvbnNlSWQpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gRTFfYWxsX2xvbmcgJT4lIGZpbHRlcihCU3NfY29uZCA9PSAiQ1VaIHZzIFNJQiIpICU+JSBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikgJT4lIGRyb3BsZXZlbHMoKSwgDQogICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFQpICMgc2V0dGluZyB0aGlzIHRvIHRydWUgZW5zdXJlcyBkLWF2IGlzIGNhbGN1bGF0ZWQsIHVzaW5nIHJhdyBzY29yZXMNCg0KIyByZXR1cm5zIGNvcnJlbGF0aW9uIGJldHdlZW4gdmFyaWFibGVzDQpjb3JfdGVzdChkYXRhID0gRTFfQ1VablNJQl9jbGVhbiwgIkNob2ljZV9DVVpuU0lCX0NVWl9tb3JhbCIsICJDaG9pY2VfQ1VablNJQl9TSUJfbW9yYWwiLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KDQojIE1vcmFsIERpZmYgfiBPYmxpZyBEaWZmIFBsb3RzIHsudGFic2V0fSANCmBgYHtyfQ0KIyBDcmVhdGUgZGlmZmVyZW5jZSBzY29yZSBkYXRhc2V0cyBmb3IgcGxvdHRpbmcgb2YgZGlmZiBzY29yZSBjb3JyZWxhdGlvbnMNCg0KIyBTVFJuQ1VaDQpFMV9kaWZmX1NUUm5DVVpfY29uZF9sb25nIDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhEaXN0X1NjZW4sIENsb3NlX1NjZW4pLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAiQ29uZGl0aW9uIg0KICApDQoNCkUxX2RpZmZfU1RSbkNVWl9vYmxpZ19sb25nIDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJtaW51c0NVWl9vYmxpZywgQ2hvaWNlX1NUUm1pbnVzQ1VaX29ibGlnKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm9ibGlnIg0KICApDQoNCkUxX2RpZmZfU1RSbkNVWl9tb3JhbF9sb25nIDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJtaW51c0NVWl9tb3JhbCwgQ2hvaWNlX1NUUm1pbnVzQ1VaX21vcmFsKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm1vcmFsIg0KICApDQoNCiMgQ29tYmluZSBsb25nIFNUUm5DVVogZGF0YXNldHMsIHNlbGVjdCBwbG90dGluZyB2YXJpYWJsZXMsIGFuZCBjcmVhdGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvciBgQ2hvaWNlIENvbnRleHRgIGZhY3Rvcg0KRTFfZGlmZl9TVFJuQ1VaX2xvbmcgPC0gY2JpbmQoRTFfZGlmZl9TVFJuQ1VaX2NvbmRfbG9uZywgRTFfZGlmZl9TVFJuQ1VaX29ibGlnX2xvbmcsIEUxX2RpZmZfU1RSbkNVWl9tb3JhbF9sb25nKQ0KRTFfZGlmZl9TVFJuQ1VaX2xvbmcgPC0gRTFfZGlmZl9TVFJuQ1VaX2xvbmdbLCAhZHVwbGljYXRlZChjb2xuYW1lcyhFMV9kaWZmX1NUUm5DVVpfbG9uZykpXSAjIGdldCByaWQgb2YgZHVwbGljYXRlIGNvbHVtbnMNCg0KRTFfZGlmZl9TVFJuQ1VaX2xvbmcgPC0gRTFfZGlmZl9TVFJuQ1VaX2xvbmcgJT4lDQogIHNlbGVjdChSZXNwb25zZUlkLA0KICAgICAgICAgQWdlOk9VU19JQiwNCiAgICAgICAgIEJTc19jb25kLA0KICAgICAgICAgV1NzX2NvbmQsDQogICAgICAgICBDb25kaXRpb24sDQogICAgICAgICBvYmxpZywgbW9yYWwpICU+JQ0KICBtdXRhdGUoYENob2ljZSBDb250ZXh0YCA9IGNhc2Vfd2hlbigNCiAgICBXU3NfY29uZCA9PSAiRGlzdF9TY2VuIiB+ICJObyBDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJDbG9zZV9TY2VuIiB+ICJDaG9pY2UiKSkNCg0KIyBSZW9yZGVyL3JlbmFtZSBjb25kaXRpb24sIGFuZCBwYXJ0aWNpcGFudCBmYWN0b3JzDQpFMV9kaWZmX1NUUm5DVVpfbG9uZyRgQ2hvaWNlIENvbnRleHRgIDwtIGFzLmZhY3RvcihFMV9kaWZmX1NUUm5DVVpfbG9uZyRgQ2hvaWNlIENvbnRleHRgKQ0KRTFfZGlmZl9TVFJuQ1VaX2xvbmckYENob2ljZSBDb250ZXh0YCA8LSBvcmRlcmVkKEUxX2RpZmZfU1RSbkNVWl9sb25nJGBDaG9pY2UgQ29udGV4dGAsIGxldmVscyA9IGMoIk5vIENob2ljZSIsICJDaG9pY2UiKSkNCkUxX2RpZmZfU1RSbkNVWl9sb25nJFJlc3BvbnNlSWQgPC0gYXMuZmFjdG9yKEUxX2RpZmZfU1RSbkNVWl9sb25nJFJlc3BvbnNlSWQpDQoNCg0KIyBTVFJuU0lCDQpFMV9kaWZmX1NUUm5TSUJfY29uZF9sb25nIDwtIEUxX1NUUm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhEaXN0X1NjZW4sIENsb3NlX1NjZW4pLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAiQ29uZGl0aW9uIg0KICApDQoNCkUxX2RpZmZfU1RSblNJQl9vYmxpZ19sb25nIDwtIEUxX1NUUm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJtaW51c1NJQl9vYmxpZywgQ2hvaWNlX1NUUm1pbnVzU0lCX29ibGlnKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm9ibGlnIg0KICApDQoNCkUxX2RpZmZfU1RSblNJQl9tb3JhbF9sb25nIDwtIEUxX1NUUm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9TVFJtaW51c1NJQl9tb3JhbCwgQ2hvaWNlX1NUUm1pbnVzU0lCX21vcmFsKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm1vcmFsIg0KICApDQoNCiMgQ29tYmluZSBsb25nIFNUUm5TSUIgZGF0YXNldHMsIHNlbGVjdCBwbG90dGluZyB2YXJpYWJsZXMsIGFuZCBjcmVhdGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvciBgQ2hvaWNlIENvbnRleHRgIGZhY3Rvcg0KRTFfZGlmZl9TVFJuU0lCX2xvbmcgPC0gY2JpbmQoRTFfZGlmZl9TVFJuU0lCX2NvbmRfbG9uZywgRTFfZGlmZl9TVFJuU0lCX29ibGlnX2xvbmcsIEUxX2RpZmZfU1RSblNJQl9tb3JhbF9sb25nKQ0KRTFfZGlmZl9TVFJuU0lCX2xvbmcgPC0gRTFfZGlmZl9TVFJuU0lCX2xvbmdbLCAhZHVwbGljYXRlZChjb2xuYW1lcyhFMV9kaWZmX1NUUm5TSUJfbG9uZykpXSAjIGdldCByaWQgb2YgZHVwbGljYXRlIGNvbHVtbnMNCg0KRTFfZGlmZl9TVFJuU0lCX2xvbmcgPC0gRTFfZGlmZl9TVFJuU0lCX2xvbmcgJT4lDQogIHNlbGVjdChSZXNwb25zZUlkLA0KICAgICAgICAgQWdlOk9VU19JQiwNCiAgICAgICAgIEJTc19jb25kLA0KICAgICAgICAgV1NzX2NvbmQsDQogICAgICAgICBDb25kaXRpb24sDQogICAgICAgICBvYmxpZywgbW9yYWwpICU+JQ0KICBtdXRhdGUoYENob2ljZSBDb250ZXh0YCA9IGNhc2Vfd2hlbigNCiAgICBXU3NfY29uZCA9PSAiRGlzdF9TY2VuIiB+ICJObyBDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJDbG9zZV9TY2VuIiB+ICJDaG9pY2UiKSkNCg0KIyBSZW9yZGVyL3JlbmFtZSBjb25kaXRpb24sIGFuZCBwYXJ0aWNpcGFudCBmYWN0b3JzDQpFMV9kaWZmX1NUUm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgIDwtIGFzLmZhY3RvcihFMV9kaWZmX1NUUm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgKQ0KRTFfZGlmZl9TVFJuU0lCX2xvbmckYENob2ljZSBDb250ZXh0YCA8LSBvcmRlcmVkKEUxX2RpZmZfU1RSblNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGAsIGxldmVscyA9IGMoIk5vIENob2ljZSIsICJDaG9pY2UiKSkNCkUxX2RpZmZfU1RSblNJQl9sb25nJFJlc3BvbnNlSWQgPC0gYXMuZmFjdG9yKEUxX2RpZmZfU1RSblNJQl9sb25nJFJlc3BvbnNlSWQpDQoNCg0KIyBDVVpuU0lCDQpFMV9kaWZmX0NVWm5TSUJfY29uZF9sb25nIDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhEaXN0X1NjZW4sIENsb3NlX1NjZW4pLA0KICAgIG5hbWVzX3RvID0gIldTc19jb25kIiwNCiAgICB2YWx1ZXNfdG8gPSAiQ29uZGl0aW9uIg0KICApDQoNCkUxX2RpZmZfQ1VablNJQl9vYmxpZ19sb25nIDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9DVVptaW51c1NJQl9vYmxpZywgQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm9ibGlnIg0KICApDQoNCkUxX2RpZmZfQ1VablNJQl9tb3JhbF9sb25nIDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICBjb2xzID0gYyhOb0Nob2ljZV9DVVptaW51c1NJQl9tb3JhbCwgQ2hvaWNlX0NVWm1pbnVzU0lCX21vcmFsKSwNCiAgICBuYW1lc190byA9ICJXU3NfY29uZCIsDQogICAgdmFsdWVzX3RvID0gIm1vcmFsIg0KICApDQoNCiMgQ29tYmluZSBsb25nIENVWm5TSUIgZGF0YXNldHMsIHNlbGVjdCBwbG90dGluZyB2YXJpYWJsZXMsIGFuZCBjcmVhdGUgY29uZGl0aW9uIHZhcmlhYmxlIGZvciBgQ2hvaWNlIENvbnRleHRgIGZhY3Rvcg0KRTFfZGlmZl9DVVpuU0lCX2xvbmcgPC0gY2JpbmQoRTFfZGlmZl9DVVpuU0lCX2NvbmRfbG9uZywgRTFfZGlmZl9DVVpuU0lCX29ibGlnX2xvbmcsIEUxX2RpZmZfQ1VablNJQl9tb3JhbF9sb25nKQ0KRTFfZGlmZl9DVVpuU0lCX2xvbmcgPC0gRTFfZGlmZl9DVVpuU0lCX2xvbmdbLCAhZHVwbGljYXRlZChjb2xuYW1lcyhFMV9kaWZmX0NVWm5TSUJfbG9uZykpXSAjIGdldCByaWQgb2YgZHVwbGljYXRlIGNvbHVtbnMNCg0KRTFfZGlmZl9DVVpuU0lCX2xvbmcgPC0gRTFfZGlmZl9DVVpuU0lCX2xvbmcgJT4lDQogIHNlbGVjdChSZXNwb25zZUlkLA0KICAgICAgICAgQWdlOk9VU19JQiwNCiAgICAgICAgIEJTc19jb25kLA0KICAgICAgICAgV1NzX2NvbmQsDQogICAgICAgICBDb25kaXRpb24sDQogICAgICAgICBvYmxpZywgbW9yYWwpICU+JQ0KICBtdXRhdGUoYENob2ljZSBDb250ZXh0YCA9IGNhc2Vfd2hlbigNCiAgICBXU3NfY29uZCA9PSAiRGlzdF9TY2VuIiB+ICJObyBDaG9pY2UiLA0KICAgIFdTc19jb25kID09ICJDbG9zZV9TY2VuIiB+ICJDaG9pY2UiKSkNCg0KIyBSZW9yZGVyL3JlbmFtZSBjb25kaXRpb24sIGFuZCBwYXJ0aWNpcGFudCBmYWN0b3JzDQpFMV9kaWZmX0NVWm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgIDwtIGFzLmZhY3RvcihFMV9kaWZmX0NVWm5TSUJfbG9uZyRgQ2hvaWNlIENvbnRleHRgKQ0KRTFfZGlmZl9DVVpuU0lCX2xvbmckYENob2ljZSBDb250ZXh0YCA8LSBvcmRlcmVkKEUxX2RpZmZfQ1VablNJQl9sb25nJGBDaG9pY2UgQ29udGV4dGAsIGxldmVscyA9IGMoIk5vIENob2ljZSIsICJDaG9pY2UiKSkNCkUxX2RpZmZfQ1VablNJQl9sb25nJFJlc3BvbnNlSWQgPC0gYXMuZmFjdG9yKEUxX2RpZmZfQ1VablNJQl9sb25nJFJlc3BvbnNlSWQpDQoNCg0KIyBDb21iaW5lIGludG8gb25lIGRhdGFzZXQgZm9yIHBsb3R0aW5nDQpFMV9kaWZmX2FsbF9sb25nIDwtIHJiaW5kKEUxX2RpZmZfU1RSblNJQl9sb25nLCBFMV9kaWZmX1NUUm5DVVpfbG9uZywgRTFfZGlmZl9DVVpuU0lCX2xvbmcpDQojIFJlb3JkZXIgQWxsX2xvbmcgQlNzX2NvbmQNCkUxX2RpZmZfYWxsX2xvbmckQlNzX2NvbmQgPC0gYXMuZmFjdG9yKEUxX2RpZmZfYWxsX2xvbmckQlNzX2NvbmQpDQpFMV9kaWZmX2FsbF9sb25nJEJTc19jb25kIDwtIG9yZGVyZWQoRTFfZGlmZl9hbGxfbG9uZyRCU3NfY29uZCwgbGV2ZWxzID0gYygiU1RSIHZzIFNJQiIsICJTVFIgdnMgQ1VaIiwgIkNVWiB2cyBTSUIiKSkNCmBgYA0KDQojIyBTVFJuU0lCDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQob2JsaWdfbW9yYWxfZGlmZl9wbG90X1NUUm5TSUIgPC0gZ2dwbG90KGRhdGEgPSBFMV9kaWZmX1NUUm5TSUJfbG9uZywgYWVzKHggPSBvYmxpZywgeSA9IG1vcmFsKSkgKw0KICAgICAgICBnZW9tX2ppdHRlcihjb2xvciA9ICJkYXJrb3JjaGlkMSIsIGFscGhhID0gMC41KSArDQogICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIGNvbG9yID0gImRhcmtvcmNoaWQxIikgKw0KICAgICAgICBmYWNldF93cmFwKEJTc19jb25kfmBDaG9pY2UgQ29udGV4dGApICsNCiAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMSwxMDEpLCBicmVha3MgPSBjKC0xMDAsLTUwLDAsNTAsMTAwKSkgKw0KICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAxLDEwMSksIGJyZWFrcyA9IGMoLTEwMCwtNTAsMCw1MCwxMDApKSArDQogICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgIHhsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGggRGlmZmVyZW5jZSAoRGlzdGFudCAtIENsb3NlKSIpICsNCiAgICAgICAgeWxhYigiTW9yYWwgQ2hhcmFjdGVyIERpZmZlcmVuY2UgKERpc3RhbnQgLSBDbG9zZSkiKSArDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSkpDQpgYGANCiMjIFNUUm5DVVoNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChvYmxpZ19tb3JhbF9kaWZmX3Bsb3RfU1RSbkNVWiA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2RpZmZfU1RSbkNVWl9sb25nLCBhZXMoeCA9IG9ibGlnLCB5ID0gbW9yYWwpKSArDQogICAgICAgIGdlb21faml0dGVyKGNvbG9yID0gImRhcmtvcmNoaWQxIiwgYWxwaGEgPSAwLjUpICsNCiAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAiZGFya29yY2hpZDEiKSArDQogICAgICAgIGZhY2V0X3dyYXAoQlNzX2NvbmR+YENob2ljZSBDb250ZXh0YCkgKw0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAxLDEwMSksIGJyZWFrcyA9IGMoLTEwMCwtNTAsMCw1MCwxMDApKSArDQogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDEsMTAxKSwgYnJlYWtzID0gYygtMTAwLC01MCwwLDUwLDEwMCkpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiT2JsaWdhdGlvbiBTdHJlbmd0aCBEaWZmZXJlbmNlIChEaXN0YW50IC0gQ2xvc2UpIikgKw0KICAgICAgICB5bGFiKCJNb3JhbCBDaGFyYWN0ZXIgRGlmZmVyZW5jZSAoRGlzdGFudCAtIENsb3NlKSIpICsNCiAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpKSkNCmBgYA0KIyMgQ1VablNJQg0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG9ibGlnX21vcmFsX2RpZmZfcGxvdF9DVVpuU0lCIDwtIGdncGxvdChkYXRhID0gRTFfZGlmZl9DVVpuU0lCX2xvbmcsIGFlcyh4ID0gb2JsaWcsIHkgPSBtb3JhbCkpICsNCiAgICAgICAgZ2VvbV9qaXR0ZXIoY29sb3IgPSAiZGFya29yY2hpZDEiLCBhbHBoYSA9IDAuNSkgKw0KICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICJkYXJrb3JjaGlkMSIpICsNCiAgICAgICAgZmFjZXRfd3JhcChCU3NfY29uZH5gQ2hvaWNlIENvbnRleHRgKSArDQogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDEsMTAxKSwgYnJlYWtzID0gYygtMTAwLC01MCwwLDUwLDEwMCkpICsNCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEwMSwxMDEpLCBicmVha3MgPSBjKC0xMDAsLTUwLDAsNTAsMTAwKSkgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB4bGFiKCJPYmxpZ2F0aW9uIFN0cmVuZ3RoIERpZmZlcmVuY2UgKERpc3RhbnQgLSBDbG9zZSkiKSArDQogICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciBEaWZmZXJlbmNlIChEaXN0YW50IC0gQ2xvc2UpIikgKw0KICAgICAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMikpKQ0KYGBgDQojIyBDb21iaW5lZA0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG9ibGlnX21vcmFsX2RpZmZfcGxvdF9jb21iaW5lZCA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2RpZmZfYWxsX2xvbmcsIGFlcyh4ID0gb2JsaWcsIHkgPSBtb3JhbCkpICsNCiAgICAgICAgZ2VvbV9qaXR0ZXIoY29sb3IgPSAiZGFya29yY2hpZDEiLCBhbHBoYSA9IDAuNSkgKw0KICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICJkYXJrb3JjaGlkMSIpICsNCiAgICAgICAgZmFjZXRfd3JhcChCU3NfY29uZH5gQ2hvaWNlIENvbnRleHRgLCBucm93ID0gMykgKw0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTAxLDEwMSksIGJyZWFrcyA9IGMoLTEwMCwtNTAsMCw1MCwxMDApKSArDQogICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDEsMTAxKSwgYnJlYWtzID0gYygtMTAwLC01MCwwLDUwLDEwMCkpICsNCiAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgeGxhYigiXG5PYmxpZ2F0aW9uIFN0cmVuZ3RoIERpZmZlcmVuY2UgKERpc3RhbnQgLSBDbG9zZSkiKSArDQogICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciBEaWZmZXJlbmNlIChEaXN0YW50IC0gQ2xvc2UpXG4iKSArDQogICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQoNCmdnc2F2ZSgiRTFfbW9yYWx+b2JsaWdfcGxvdC5wbmciKQ0KYGBgDQoNCg0KIyBNb3JhbCBEaWZmIH4gT2JsaWcgRGlmZiBUZXN0cyB7LnRhYnNldH0NCg0KPGJyPg0KDQpTZWUgb3VyIHByZS1yZWdpc3RyYXRpb24gKGh0dHBzOi8vb3NmLmlvLzZxNGtyLz92aWV3X29ubHk9ODAzM2M2NWM5ZGZjNDFiY2JjNTI4ZmU5NDQwOWU0ZTgpIGFuZCBtYW51c2NyaXB0IGZvciBvdXIgcHJlZGljdGlvbnMgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG9ibGlnYXRpb24gZGlmZmVyZW5jZXMgYW5kIG1vcmFsIGNoYXJhY3RlciBkaWZmZXJlbmNlcy4NCg0KPGJyPg0KDQojIyBTVFJuU0lCIHsudGFic2V0fQ0KDQojIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJOb0Nob2ljZV9TVFJtaW51c1NJQl9vYmxpZyIsICJOb0Nob2ljZV9TVFJtaW51c1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQojIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuU0lCX2NsZWFuLCAiQ2hvaWNlX1NUUm1pbnVzU0lCX29ibGlnIiwgIkNob2ljZV9TVFJtaW51c1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyBTVFJuQ1VaIHsudGFic2V0fQ0KDQojIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJOb0Nob2ljZV9TVFJtaW51c0NVWl9vYmxpZyIsICJOb0Nob2ljZV9TVFJtaW51c0NVWl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQojIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuQ1VaX2NsZWFuLCAiQ2hvaWNlX1NUUm1pbnVzQ1VaX29ibGlnIiwgIkNob2ljZV9TVFJtaW51c0NVWl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyBDVVpuU0lCIHsudGFic2V0fQ0KDQojIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJOb0Nob2ljZV9DVVptaW51c1NJQl9vYmxpZyIsICJOb0Nob2ljZV9DVVptaW51c1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQojIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9DVVpuU0lCX2NsZWFuLCAiQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnIiwgIkNob2ljZV9DVVptaW51c1NJQl9tb3JhbCIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQoNCiMgTW9yYWwgfiBPYmxpZyBSLU0gUGxvdHMgey50YWJzZXR9DQoNCiMjIFNUUm5TSUIgey50YWJzZXR9DQoNCiMjIyBObyBDaG9pY2UNCmBgYHtyfQ0Kcm1jb3JyX1NUUm5TSUJfTm9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiTm8gQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9TVFJuU0lCX05vQ2hvaWNlIDwtIGdncGxvdChkYXRhID0gRTFfYWxsX2xvbmcgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBTSUIiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gb2JsaWcsIHkgPSBtb3JhbCwgZ3JvdXAgPSBSZXNwb25zZUlkLCBjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gUmVzcG9uc2VJZCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gcm1jb3JyX1NUUm5TSUJfTm9DaG9pY2UkbW9kZWwkZml0dGVkLnZhbHVlcyksIGxpbmV0eXBlID0gMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiKCJPYmxpZ2F0aW9uIFN0cmVuZ3RoIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiKCJNb3JhbCBDaGFyYWN0ZXIiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpybWNvcnJfU1RSblNJQl9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9TVFJuU0lCX0Nob2ljZSA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2FsbF9sb25nICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgU0lCIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IG9ibGlnLCB5ID0gbW9yYWwsIGdyb3VwID0gUmVzcG9uc2VJZCwgY29sb3IgPSBSZXNwb25zZUlkKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGluZShhZXMoeSA9IHJtY29ycl9TVFJuU0lCX0Nob2ljZSRtb2RlbCRmaXR0ZWQudmFsdWVzKSwgbGluZXR5cGUgPSAxKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGgiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKQ0KYGBgDQoNCiMjIFNUUm5DVVogey50YWJzZXR9DQoNCiMjIyBObyBDaG9pY2UNCmBgYHtyfQ0Kcm1jb3JyX1NUUm5DVVpfTm9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiTm8gQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9TVFJuQ1VaX05vQ2hvaWNlIDwtIGdncGxvdChkYXRhID0gRTFfYWxsX2xvbmcgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQlNzX2NvbmQgPT0gIlNUUiB2cyBDVVoiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gb2JsaWcsIHkgPSBtb3JhbCwgZ3JvdXAgPSBSZXNwb25zZUlkLCBjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gUmVzcG9uc2VJZCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gcm1jb3JyX1NUUm5DVVpfTm9DaG9pY2UkbW9kZWwkZml0dGVkLnZhbHVlcyksIGxpbmV0eXBlID0gMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiKCJPYmxpZ2F0aW9uIFN0cmVuZ3RoIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiKCJNb3JhbCBDaGFyYWN0ZXIiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpybWNvcnJfU1RSbkNVWl9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9TVFJuQ1VaX0Nob2ljZSA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2FsbF9sb25nICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJTVFIgdnMgQ1VaIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IG9ibGlnLCB5ID0gbW9yYWwsIGdyb3VwID0gUmVzcG9uc2VJZCwgY29sb3IgPSBSZXNwb25zZUlkKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGluZShhZXMoeSA9IHJtY29ycl9TVFJuQ1VaX0Nob2ljZSRtb2RlbCRmaXR0ZWQudmFsdWVzKSwgbGluZXR5cGUgPSAxKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGgiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKQ0KYGBgDQoNCiMjIENVWm5TSUIgey50YWJzZXR9DQoNCiMjIyBObyBDaG9pY2UNCmBgYHtyfQ0Kcm1jb3JyX0NVWm5TSUJfTm9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiTm8gQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9DVVpuU0lCX05vQ2hvaWNlIDwtIGdncGxvdChkYXRhID0gRTFfYWxsX2xvbmcgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQlNzX2NvbmQgPT0gIkNVWiB2cyBTSUIiKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihgQ2hvaWNlIENvbnRleHRgID09ICJObyBDaG9pY2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gb2JsaWcsIHkgPSBtb3JhbCwgZ3JvdXAgPSBSZXNwb25zZUlkLCBjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gUmVzcG9uc2VJZCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9saW5lKGFlcyh5ID0gcm1jb3JyX0NVWm5TSUJfTm9DaG9pY2UkbW9kZWwkZml0dGVkLnZhbHVlcyksIGxpbmV0eXBlID0gMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiKCJPYmxpZ2F0aW9uIFN0cmVuZ3RoIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bGFiKCJNb3JhbCBDaGFyYWN0ZXIiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpybWNvcnJfQ1VablNJQl9DaG9pY2UgPC0gcm1jb3JyKHBhcnRpY2lwYW50ID0gUmVzcG9uc2VJZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTEgPSBvYmxpZywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZTIgPSBtb3JhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9IEUxX2FsbF9sb25nICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIikpDQpgYGANCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChybWNvcnJfcGxvdF9DVVpuU0lCX0Nob2ljZSA8LSBnZ3Bsb3QoZGF0YSA9IEUxX2FsbF9sb25nICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEJTc19jb25kID09ICJDVVogdnMgU0lCIikgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoYENob2ljZSBDb250ZXh0YCA9PSAiQ2hvaWNlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IG9ibGlnLCB5ID0gbW9yYWwsIGdyb3VwID0gUmVzcG9uc2VJZCwgY29sb3IgPSBSZXNwb25zZUlkKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJlc3BvbnNlSWQpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fbGluZShhZXMoeSA9IHJtY29ycl9DVVpuU0lCX0Nob2ljZSRtb2RlbCRmaXR0ZWQudmFsdWVzKSwgbGluZXR5cGUgPSAxKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0xLDEwMSksIGJyZWFrcyA9IGMoMCwyNSw1MCw3NSwxMDApKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lX2NsYXNzaWMoKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIoIk9ibGlnYXRpb24gU3RyZW5ndGgiKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIoIk1vcmFsIENoYXJhY3RlciIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKQ0KYGBgDQoNCg0KIyBNb3JhbCB+IE9ibGlnIFItTSBUZXN0cyB7LnRhYnNldH0NCg0KPGJyPg0KDQpTZWUgb3VyIG1hbnVzY3JpcHQgZm9yIG91ciBwcmVkaWN0aW9ucyBhYm91dCB0aGUgd2l0aGluLWluZGl2aWR1YWwgcmVsYXRpb25zaGlwIGJldHdlZW4gb2JsaWdhdGlvbiBqdWRnbWVudHMgYW5kIG1vcmFsIGNoYXJhY3RlciBqdWRnbWVudHMuDQoNCjxicj4NCg0KIyMgU1RSblNJQiB7LnRhYnNldH0NCg0KIyMjIE5vIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfU1RSblNJQl9Ob0Nob2ljZSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfU1RSblNJQl9DaG9pY2UpDQpgYGANCg0KIyMgU1RSbkNVWiB7LnRhYnNldH0NCg0KIyMjIE5vIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfU1RSbkNVWl9Ob0Nob2ljZSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfU1RSbkNVWl9DaG9pY2UpDQpgYGANCg0KIyMgQ1VablNJQiB7LnRhYnNldH0NCg0KIyMjIE5vIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfQ1VablNJQl9Ob0Nob2ljZSkNCmBgYA0KIyMjIENob2ljZQ0KYGBge3J9DQpwcmludChybWNvcnJfQ1VablNJQl9DaG9pY2UpDQpgYGANCg0KDQojIEluZC4gRGlmZiBJbnRlcm5hbCBSZWxpYWJpbHR5IFRlc3RzIHsudGFic2V0fQ0KDQojIyBNQUMgRmFtaWx5IFZhbHVlcyB7LnRhYnNldH0NCg0KIyMjIFNUUm5TSUINCmBgYHtyfQ0KIyBjcmVhdGUgZGF0YXNldCB3aXRoIG9ubHkgTUFDIEZhbWlseSBWYWx1ZXMgdmFyaWFibGVzDQpFMV9TVFJuU0lCX2NsZWFuX01BQ29ubHkgPC0gRTFfU1RSblNJQl9jbGVhbiAlPiUgc2VsZWN0KE1BQ19KdWRfMTpNQUNfUmVsXzMpDQoNCnBzeWNoOjphbHBoYShFMV9TVFJuU0lCX2NsZWFuX01BQ29ubHkpDQpgYGANCiMjIyBTVFJuQ1VaDQpgYGB7cn0NCiMgY3JlYXRlIGRhdGFzZXQgd2l0aCBvbmx5IE1BQyBGYW1pbHkgVmFsdWVzIHZhcmlhYmxlcw0KRTFfU1RSbkNVWl9jbGVhbl9NQUNvbmx5IDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lIHNlbGVjdChNQUNfSnVkXzE6TUFDX1JlbF8zKQ0KDQpwc3ljaDo6YWxwaGEoRTFfU1RSbkNVWl9jbGVhbl9NQUNvbmx5KQ0KYGBgDQojIyMgQ1VablNJQg0KYGBge3J9DQojIGNyZWF0ZSBkYXRhc2V0IHdpdGggb25seSBNQUMgRmFtaWx5IFZhbHVlcyB2YXJpYWJsZXMNCkUxX0NVWm5TSUJfY2xlYW5fTUFDb25seSA8LSBFMV9DVVpuU0lCX2NsZWFuICU+JSBzZWxlY3QoTUFDX0p1ZF8xOk1BQ19SZWxfMykNCg0KcHN5Y2g6OmFscGhhKEUxX0NVWm5TSUJfY2xlYW5fTUFDb25seSkNCmBgYA0KDQojIyBNRlQgSW5ncm91cCBMb3lhbHR5IHsudGFic2V0fQ0KDQojIyMgU1RSblNJQg0KYGBge3J9DQojIGNyZWF0ZSBkYXRhc2V0IHdpdGggb25seSBNRlEgRmFtaWx5IFZhbHVlcyB2YXJpYWJsZXMNCkUxX1NUUm5TSUJfY2xlYW5fTUZRb25seSA8LSBFMV9TVFJuU0lCX2NsZWFuICU+JSBzZWxlY3QoTUZRX0p1ZF8xOk1GUV9SZWxfMykNCg0KcHN5Y2g6OmFscGhhKEUxX1NUUm5TSUJfY2xlYW5fTUZRb25seSkNCmBgYA0KIyMjIFNUUm5DVVoNCmBgYHtyfQ0KIyBjcmVhdGUgZGF0YXNldCB3aXRoIG9ubHkgTUZRIEZhbWlseSBWYWx1ZXMgdmFyaWFibGVzDQpFMV9TVFJuQ1VaX2NsZWFuX01GUW9ubHkgPC0gRTFfU1RSbkNVWl9jbGVhbiAlPiUgc2VsZWN0KE1GUV9KdWRfMTpNRlFfUmVsXzMpDQoNCnBzeWNoOjphbHBoYShFMV9TVFJuQ1VaX2NsZWFuX01GUW9ubHkpDQpgYGANCiMjIyBDVVpuU0lCDQpgYGB7cn0NCiMgY3JlYXRlIGRhdGFzZXQgd2l0aCBvbmx5IE1GUSBGYW1pbHkgVmFsdWVzIHZhcmlhYmxlcw0KRTFfQ1VablNJQl9jbGVhbl9NRlFvbmx5IDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lIHNlbGVjdChNRlFfSnVkXzE6TUZRX1JlbF8zKQ0KDQpwc3ljaDo6YWxwaGEoRTFfQ1VablNJQl9jbGVhbl9NRlFvbmx5KQ0KYGBgDQoNCiMjIE9VUyBJbXBhcnRpYWwgQmVuZWZpY2VuY2Ugey50YWJzZXR9DQoNCiMjIyBTVFJuU0lCDQpgYGB7cn0NCiMgY3JlYXRlIGRhdGFzZXQgd2l0aCBvbmx5IE1GUSBGYW1pbHkgVmFsdWVzIHZhcmlhYmxlcw0KRTFfU1RSblNJQl9jbGVhbl9PVVNvbmx5IDwtIEUxX1NUUm5TSUJfY2xlYW4gJT4lIHNlbGVjdChPVVNfSUIxOk9VU19JQjUpDQoNCnBzeWNoOjphbHBoYShFMV9TVFJuU0lCX2NsZWFuX09VU29ubHkpDQpgYGANCiMjIyBTVFJuQ1VaDQpgYGB7cn0NCiMgY3JlYXRlIGRhdGFzZXQgd2l0aCBvbmx5IE1GUSBGYW1pbHkgVmFsdWVzIHZhcmlhYmxlcw0KRTFfU1RSbkNVWl9jbGVhbl9PVVNvbmx5IDwtIEUxX1NUUm5DVVpfY2xlYW4gJT4lIHNlbGVjdChPVVNfSUIxOk9VU19JQjUpDQoNCnBzeWNoOjphbHBoYShFMV9TVFJuQ1VaX2NsZWFuX09VU29ubHkpDQpgYGANCiMjIyBDVVpuU0lCDQpgYGB7cn0NCiMgY3JlYXRlIGRhdGFzZXQgd2l0aCBvbmx5IE1GUSBGYW1pbHkgVmFsdWVzIHZhcmlhYmxlcw0KRTFfQ1VablNJQl9jbGVhbl9PVVNvbmx5IDwtIEUxX0NVWm5TSUJfY2xlYW4gJT4lIHNlbGVjdChPVVNfSUIxOk9VU19JQjUpDQoNCnBzeWNoOjphbHBoYShFMV9DVVpuU0lCX2NsZWFuX09VU29ubHkpDQpgYGANCg0KDQojIE9ibGlnIH4gSW5kLiBEaWZmIFBsb3RzIHsudGFic2V0fQ0KDQojIyBNQUMgRmFtaWx5IFZhbHVlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG9ibGlnX21hY19jb21wX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBFMV9hbGxfbG9uZywgYWVzKHggPSBNQUNfRmFtX0NvbWJpbmVkLCB5ID0gb2JsaWcsIGNvbG9yID0gUmVsYXRpb24pKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21faml0dGVyKGFlcyhjb2xvciA9IFJlbGF0aW9uKSwgYWxwaGEgPSAwLjUpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0c2t5Ymx1ZTMiLCAiaW5kaWFucmVkMyIpKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXRfd3JhcChCU3NfY29uZH5gQ2hvaWNlIENvbnRleHRgLCBuY29sID0gMikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMSwxMDEpLCBicmVha3MgPSBjKDAsMjUsNTAsNzUsMTAwKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiKCJcbk1BQyBGYW1pbHkgVmFsdWVzIENvbXBvc2l0ZSIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYigiT2JsaWdhdGlvbiBTdHJlbmd0aFxuIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIkUxX29ibGlnfk1BQ19wbG90LnBuZyIpDQpgYGANCg0KIyMgTUZUIEluZ3JvdXAgTG95YWx0eQ0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG9ibGlnX21mdF9jb21wX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBFMV9hbGxfbG9uZywgYWVzKHggPSBNRlFfTG95YWx0eV9Db21iaW5lZCwgeSA9IG9ibGlnLCBjb2xvciA9IFJlbGF0aW9uKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX2ppdHRlcihhZXMoY29sb3IgPSBSZWxhdGlvbiksIGFscGhhID0gMC41KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodHNreWJsdWUzIiwgImluZGlhbnJlZDMiKSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2V0X3dyYXAoQlNzX2NvbmR+YENob2ljZSBDb250ZXh0YCwgbmNvbCA9IDIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLjUsNi41KSwgYnJlYWtzID0gYygxLDIsMyw0LDUsNikpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMTAxKSwgYnJlYWtzID0gYygwLDI1LDUwLDc1LDEwMCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYigiXG5NRlQgSW5ncm91cCBMb3lhbHR5IENvbXBvc2l0ZSIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYigiT2JsaWdhdGlvbiBTdHJlbmd0aFxuIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIkUxX29ibGlnfk1GVF9wbG90LnBuZyIpDQpgYGANCg0KIyMgT1VTIEltcGFydGlhbCBCZW5lZmljZW5jZQ0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KG9ibGlnX291c19jb21wX3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBFMV9hbGxfbG9uZywgYWVzKHggPSBPVVNfSUIsIHkgPSBvYmxpZywgY29sb3IgPSBSZWxhdGlvbikpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG9yID0gUmVsYXRpb24pLCBhbHBoYSA9IDAuNSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMyIsICJpbmRpYW5yZWQzIikpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJykgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNldF93cmFwKEJTc19jb25kfmBDaG9pY2UgQ29udGV4dGAsIG5jb2wgPSAyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC41LDcuNSksIGJyZWFrcyA9IGMoMSwyLDMsNCw1LDYsNykpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsMTAxKSwgYnJlYWtzID0gYygwLDI1LDUwLDc1LDEwMCkpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfY2xhc3NpYygpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYigiXG5PVVMgSW1wYXJ0aWFsIEJlbmVmaWNlbmNlIENvbXBvc2l0ZSIpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYigiT2JsaWdhdGlvbiBTdHJlbmd0aFxuIikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KDQpnZ3NhdmUoIkUxX29ibGlnfk9VU19wbG90LnBuZyIpDQpgYGANCg0KIyBPYmxpZyB+IEluZC4gRGlmZiBUZXN0cyB7LnRhYnNldH0NCg0KPGJyPg0KDQpTZWUgb3VyIHByZS1yZWdpc3RyYXRpb24gKGh0dHBzOi8vb3NmLmlvLzZxNGtyLz92aWV3X29ubHk9ODAzM2M2NWM5ZGZjNDFiY2JjNTI4ZmU5NDQwOWU0ZTgpIGFuZCBtYW51c2NyaXB0IGZvciBvdXIgcHJlZGljdGlvbnMgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGluZGl2aWR1YWwgZGlmZmVyZW5jZXMgYW5kIG9ibGlnYXRpb24ganVkZ21lbnRzLg0KDQo8YnI+DQoNCiMjIE1BQyBGYW1pbHkgVmFsdWVzIHsudGFic2V0fQ0KDQojIyMgU1RSblNJQiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIk5vQ2hvaWNlX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJtaW51c1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJDaG9pY2VfU1RSblNJQl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk1BQ19GYW1fQ29tYmluZWQiLCAiQ2hvaWNlX1NUUm5TSUJfU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIkNob2ljZV9TVFJtaW51c1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyMgU1RSbkNVWiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuQ1VaX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIk5vQ2hvaWNlX0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuQ1VaX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJtaW51c0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuQ1VaX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJDaG9pY2VfU1RSbkNVWl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk1BQ19GYW1fQ29tYmluZWQiLCAiQ2hvaWNlX1NUUm5DVVpfQ1VaX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIkNob2ljZV9TVFJtaW51c0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQojIyMgQ1VablNJQiB7LnRhYnNldH0NCg0KIyMjIyBObyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9DVVpuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIk5vQ2hvaWNlX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9DVVpuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJOb0Nob2ljZV9DVVptaW51c1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KIyMjIyBDaG9pY2UNCmBgYHtyfQ0KIyBkaXN0YW50IHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9DVVpuU0lCX2NsZWFuLCAiTUFDX0ZhbV9Db21iaW5lZCIsICJDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk1BQ19GYW1fQ29tYmluZWQiLCAiQ2hvaWNlX0NVWm5TSUJfU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJNQUNfRmFtX0NvbWJpbmVkIiwgIkNob2ljZV9DVVptaW51c1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCmBgYA0KDQoNCiMjIE1GVCBJbmdyb3VwIExveWFsdHkgey50YWJzZXR9DQoNCiMjIyBTVFJuU0lCIHsudGFic2V0fQ0KDQojIyMjIE5vIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9TSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIk5vQ2hvaWNlX1NUUm1pbnVzU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQojIyMjIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJDaG9pY2VfU1RSblNJQl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIkNob2ljZV9TVFJuU0lCX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuU0lCX2NsZWFuLCAiTUZRX0xveWFsdHlfQ29tYmluZWQiLCAiQ2hvaWNlX1NUUm1pbnVzU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQoNCiMjIyBTVFJuQ1VaIHsudGFic2V0fQ0KDQojIyMjIE5vIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIk5vQ2hvaWNlX1NUUm1pbnVzQ1VaX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQojIyMjIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJDaG9pY2VfU1RSbkNVWl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIkNob2ljZV9TVFJuQ1VaX0NVWl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9TVFJuQ1VaX2NsZWFuLCAiTUZRX0xveWFsdHlfQ29tYmluZWQiLCAiQ2hvaWNlX1NUUm1pbnVzQ1VaX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQoNCiMjIyBDVVpuU0lCIHsudGFic2V0fQ0KDQojIyMjIE5vIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJOb0Nob2ljZV9TSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIk5vQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQojIyMjIENob2ljZQ0KYGBge3J9DQojIGRpc3RhbnQgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJNRlFfTG95YWx0eV9Db21iaW5lZCIsICJDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk1GUV9Mb3lhbHR5X0NvbWJpbmVkIiwgIkNob2ljZV9DVVpuU0lCX1NJQl9vYmxpZyIsIG1ldGhvZCA9ICJQZWFyc29uIikNCg0KIyBkaWZmIHBlYXJzb24ncyByDQpjb3JfdGVzdChFMV9DVVpuU0lCX2NsZWFuLCAiTUZRX0xveWFsdHlfQ29tYmluZWQiLCAiQ2hvaWNlX0NVWm1pbnVzU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KYGBgDQoNCg0KIyMgT1VTIEltcGFydGlhbCBCZW5lZmljZW5jZSB7LnRhYnNldH0NCg0KIyMjIFNUUm5TSUIgey50YWJzZXR9DQoNCiMjIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk9VU19JQiIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5TSUJfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfU1RSbWludXNTSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCiMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSblNJQl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSblNJQl9TSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSblNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSbWludXNTSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KIyMjIFNUUm5DVVogey50YWJzZXR9DQoNCiMjIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk9VU19JQiIsICJOb0Nob2ljZV9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfQ1VaX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX1NUUm5DVVpfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfU1RSbWludXNDVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCiMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSbkNVWl9TVFJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSbkNVWl9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfU1RSbkNVWl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfU1RSbWludXNDVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KIyMjIENVWm5TSUIgey50YWJzZXR9DQoNCiMjIyMgTm8gQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk9VU19JQiIsICJOb0Nob2ljZV9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgY2xvc2UgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfU0lCX29ibGlnIiwgbWV0aG9kID0gIlBlYXJzb24iKQ0KDQojIGRpZmYgcGVhcnNvbidzIHINCmNvcl90ZXN0KEUxX0NVWm5TSUJfY2xlYW4sICJPVVNfSUIiLCAiTm9DaG9pY2VfQ1VabWludXNTSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCiMjIyMgQ2hvaWNlDQpgYGB7cn0NCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfQ1VablNJQl9DVVpfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlzdGFudCBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfQ1VablNJQl9TSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQoNCiMgZGlmZiBwZWFyc29uJ3Mgcg0KY29yX3Rlc3QoRTFfQ1VablNJQl9jbGVhbiwgIk9VU19JQiIsICJDaG9pY2VfQ1VabWludXNTSUJfb2JsaWciLCBtZXRob2QgPSAiUGVhcnNvbiIpDQpgYGANCg0KDQojIE9ibGlnIH4gTUFDIEZhbWlseSBWYWx1ZXMgdnMgTUZUIEluZ3JvdXAgTG95YWx0eSBUZXN0cyB7LnRhYnNldH0NCg0KPGJyPg0KDQpUaGVzZSBhbmFseXNlcyB3ZXJlIG9ubHkgY29uZHVjdGVkIHdpdGhpbiB0aGUgQ1VablNJQiBkYXRhc2V0IGR1ZSB0byBwb3RlbnRpYWwgY29uZm91bmRpbmcgb2YgbW9yYWwgdmFsdWVzJyBlZmZlY3RzIG9uIG9ibGlnYXRpb24ganVkZ21lbnRzIGluIG90aGVyIGRhdGFzZXRzLg0KDQo8YnI+DQoNCiMjIE5vIENob2ljZQ0KYGBge3J9DQojIGNvcnJlbGF0aW9uIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB0aGUgb2JsaWcgfiBpbmQuIGRpZmZzIGFuYWx5c2VzDQojIyByLmprID0gb2JsaWcgfiBmYW1pbHkgdmFsdWVzIGNvcnI7IHIuamggPSBvYmxpZyB+IGluZ3JvdXAgbG95YWx0eSBjb3JyOyByLmtoID0gZmFtaWx5IHZhbHVlcyB+IGluZ3JvdXAgbG95YWx0eSBjb3JyDQoNCiMgZGlzdGFudA0KY29jb3IuZGVwLmdyb3Vwcy5vdmVybGFwKHIuamsgPSAuMjYsIHIuamggPSAuMTcsIHIua2ggPSAuNjUsIDIwNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInN0ZWlnZXIxOTgwIiwgYWxwaGEgPSAwLjA1LCBjb25mLmxldmVsID0gMC45NSwgbnVsbC52YWx1ZSA9IDApDQoNCiMgY2xvc2UNCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprID0gLjQ4LCByLmpoID0gLjI1LCByLmtoID0gLjY1LCAyMDUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICJzdGVpZ2VyMTk4MCIsIGFscGhhID0gMC4wNSwgY29uZi5sZXZlbCA9IDAuOTUsIG51bGwudmFsdWUgPSAwKQ0KDQojIGRpZmZlcmVuY2UNCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprID0gLS4yMSwgci5qaCA9IC0uMDcsIHIua2ggPSAuNjUsIDIwNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInN0ZWlnZXIxOTgwIiwgYWxwaGEgPSAwLjA1LCBjb25mLmxldmVsID0gMC45NSwgbnVsbC52YWx1ZSA9IDApDQpgYGANCiMjIENob2ljZQ0KYGBge3J9DQojIGNvcnJlbGF0aW9uIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB0aGUgb2JsaWcgfiBpbmQuIGRpZmZzIGFuYWx5c2VzDQojIyByLmprID0gb2JsaWcgfiBmYW1pbHkgdmFsdWVzIGNvcnI7IHIuamggPSBvYmxpZyB+IGluZ3JvdXAgbG95YWx0eSBjb3JyOyByLmtoID0gZmFtaWx5IHZhbHVlcyB+IGluZ3JvdXAgbG95YWx0eSBjb3JyDQoNCiMgZGlzdGFudA0KY29jb3IuZGVwLmdyb3Vwcy5vdmVybGFwKHIuamsgPSAuMzIsIHIuamggPSAuMTYsIHIua2ggPSAuNjUsIDIwNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInN0ZWlnZXIxOTgwIiwgYWxwaGEgPSAwLjA1LCBjb25mLmxldmVsID0gMC45NSwgbnVsbC52YWx1ZSA9IDApDQoNCiMgY2xvc2UNCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprID0gLjQwLCByLmpoID0gLjI0LCByLmtoID0gLjY1LCAyMDUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9ICJzdGVpZ2VyMTk4MCIsIGFscGhhID0gMC4wNSwgY29uZi5sZXZlbCA9IDAuOTUsIG51bGwudmFsdWUgPSAwKQ0KDQojIGRpZmZlcmVuY2UNCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprID0gLS4yMywgci5qaCA9IC0uMjAsIHIua2ggPSAuNjUsIDIwNSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gInN0ZWlnZXIxOTgwIiwgYWxwaGEgPSAwLjA1LCBjb25mLmxldmVsID0gMC45NSwgbnVsbC52YWx1ZSA9IDApDQpgYGANCg0K