NOTE: This document extends the poster presented at the Annual Psychonomics Society Meeting (2021).

Abstract

We explored the universality of category learning by using an online platform to test typical category learning behaviour. The goal of this project was to investigate whether typical category learning in a previously explored population can be seen using an online platform rather than an in-person/lab method. Participants learned one of the six classification tasks first described by Shepard et al. (1961) which tested the reliance on single feature rules, disjunctive rules, and family resemblance, and they completed a measure of their thinking style (analytic vs. holistic). We hypothesized that categories that can be learned using a single strategy would be learned more easily by those with an analytic thinking style, whereas concepts that can be acquired in more than one way will show a preference for holistic thinking style. We found that participants with a preference for holistic cognition learned family resemblance concepts more easily than participants with a preference for analytic cognition. This project provides valuable insights to the category learning literature by demonstrating how an online platform can provide a new gateway to better and more representative data.

Presenters:

  • Ana Ruiz Pardo, MSc, Western University,
  • Neha Khemani, Western University

Keywords: Analytic Thinking, Category Learning, Holistic Thinking

Analysis Prep

Load Required Libraries

The following packages were used to complete the analyses, visualizations, etc. in this document. (click to expand)
library(tibble)
library(plyr) # for data wrangling
library(tidyverse) # for data wrangling
library(ggplot2) # to plot figures
library(psych) # for stats, describe, etc.
library(Hmisc) # for descriptive stats
library(knitr)
library(kableExtra) # to show tables
library(RColorBrewer) # to customize the color palettes of different visualizations 
library("ggpubr") # for correlation visualizations
library(stats) # to run correlation analyses
library(gridExtra) # to display multiple plots together
library(ggpubr) # to add custom text to figures
library(dplyr) # for data wrangling

Additional Functions

Rounding p-values

This rounding function was adapted from Dr. E. Nielsen’s Rpubs. The function (“p_round(x)”) was created to assess and print p-values. If \(p \ge .005\), the function will display “$p = $” and the value rounded to two decimal places. If $ .0005 p <.005\(, the function will display “\)p = $” and the value rounded to three decimal places. If \(p < .0005\), the function will display “\(p < .001\)”. (click to expand)

p_round <- function(x){
  if(x > .005)
    {x1 = (paste("= ", gsub("0\\.","\\.", round(x, digits = 2)), sep = ''))
  }  
  else if(x == .005){x1 = (paste("=", gsub("0\\.","\\.", 0.01)))
  }
  else if(x > .0005 & x < .005)
    {x1 = (paste("= ", gsub("0\\.","\\.", round(x, digits = 3)), sep = ''))
  }  
  else if(x == .0005){x1 = (paste("=", gsub("0\\.","\\.", 0.001)))
  }
  else{x1 = (paste("<", gsub("0\\.","\\.", 0.001)))
  } 
  (x1)
}

Raw Data

There are two raw data files that were imported for the present study (see the Import Raw Data section).

Task Data

  1. SHJ Raw Data
    • psychopy excel files
    • Note: raw data was extracted from multiple excel files into one file (see the Import Raw Data section)

Survey Measures

  1. Demographic & AHS Raw Data
    • csv file exported from Qualtrics

Import Raw Data

1. SHJ Raw Data

The SHJ Raw Data was collected using Psychopy (version: 2021.1.2). Each participant’s data was stored in a separate excel file. The following code imports and re-organized the raw data into a single wide format (i.e., “SHJ_W”) and long format (i.e., “SHJ_L”) of the data as a tibble. (click to see descriptions)

ADD A DESCRIPTION HERE

This code imported and organized the SHJ raw data in a wide format including the variables: ID, task, type, subtype, date, OS, frameRate, accuracy per block (e.g., “accuracyB1”…“accuracyB10”), accuracy per trial (e.g., “acc1”…“acc80”), RT per block (e.g., “RTB1”…“RTB10”), RT per trial (e.g., “RT1”…“RT80”). Each participant’s performance is represented by a single row. (click to expand)

#---WIDE DATA FRAME---"SHJ_W"  

#--This code completes the following tasks:
# (1) Create a function that extracts any required information from all psychopy files at once
# (2) Create a list of all the directory paths to each individual file 
# (3) Apply the function to the files 
# (4) Create a tibble of the result of the function on the files

#--The FINAL OUTPUT = a wide format of the raw SHJ data including:
# ID, task, type, subtype, date, OS, frameRate, accuracy per block (e.g., "accuracyB1"..."accuracyB10"), accuracy per trial (e.g., "acc1"..."acc80"), RT per block (e.g., "RTB1"..."RTB10"), RT per trial (e.g., "RT1"..."RT80")

#--NOTES:

# Step (3) will give warnings if there is any missing data that the function was not specified how to handle
# example: Any participant that did not respond to an item or during all trials will have an "NA" response in the data

# Individual participant files do not stay in chronological order 
# (they are re-ordered so that all ps that start with the digit "1" go first, then the "2"...)

#--(1) Create a function that extracts any required information from all psychopy folders at once

# create a function that extracts all the required information from each excel file
# details for what is extracted in this function is found within it, 
# to use it to extract any other &/ additional information, edit within the function itself

# temp_data <- readr::read_csv('/Users/anaceciliaruizpardo/RStudio/Concepts, Categories, and Cultural Universals/SHJ Pilot - UWO Sample (04:20:21)/SHJ_test.csv')

extract_shj_W = function(data) {
  # temp_data = readr::read_csv(data)
  
  #if temp_data
  if (file.size(data) > 14) {
        temp_data <- read_csv(data)
  
  
  # transpose data so that each trial is an individual column for: (1) accuracy & (2) RT
    accuracy <- as_tibble(rbind(temp_data$trial_resp.corr))
      # add prefix to columns
      names(accuracy) <- gsub("V", "acc", names(accuracy))  
    
    RT <- as_tibble(rbind(temp_data$trial_resp.rt))
      # add prefix to columns
      names(RT) <- gsub("V", "RT", names(RT))  
    
  # create a tibble with the variables in question
  temp_tibble <- as_tibble(cbind(
                        # unique ID
                        temp_data[1,"Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*"],
                        # task
                        temp_data[1,"task"], 
                        
                        # type
                        temp_data[1,"type"], 
                        
                        # subtype
                        temp_data[1, "subtype"], 
                        
                        # date
                        temp_data[1, "date"],
                        
                        # OS
                        temp_data[1, "OS"],
                        
                        # frameRate
                        temp_data[1, "frameRate"], 
                        
                        # Block 1 average accuracy (i.e., trials 1-8)
                        accuracyB1  = sum(accuracy[,1:8]),
                        
                        # Block 2 average accuracy (i.e., trials 9-16)
                        accuracyB2  = sum(accuracy[,9:16]),
                        
                        # Block 3 average accuracy (i.e., trials 17-24)
                        accuracyB3  = sum(accuracy[,17:24]),
                        
                        # Block 4 average accuracy (i.e., trials 25-32)
                        accuracyB4  = sum(accuracy[,25:32]),
                        
                        # Block 5 average accuracy (i.e., trials 33-40)
                        accuracyB5  = sum(accuracy[,33:40]),
                        
                        # Block 6 average accuracy (i.e., trials 41-48)
                        accuracyB6  = sum(accuracy[,41:48]),
                        
                        # Block 7 average accuracy (i.e., trials 49-56)
                        accuracyB7  = sum(accuracy[,49:56]),
                        
                        # Block 8 average accuracy (i.e., trials 57-64)
                        accuracyB8  = sum(accuracy[,57:64]),
                        
                        # Block 9 average accuracy (i.e., trials 65-72)
                        accuracyB9  = sum(accuracy[,65:72]),
                        
                        # Block 10 average accuracy (i.e., trials 73-80)
                        accuracyB10  = sum(accuracy[,73:80]),
                        
                        # accuracy (for trial 1-80)
                        accuracy, 
                        
                        # Block 1 average RT (i.e., trials 1-8)
                        RTB1  = rowMeans(RT[,1:8]),
                        
                        # Block 2 average RT (i.e., trials 9-16)
                        RTB2  = rowMeans(RT[,9:16]),
                        
                        # Block 3 average RT (i.e., trials 17-24)
                        RTB3  = rowMeans(RT[,17:24]),
                        
                        # Block 4 average RT (i.e., trials 25-32)
                        RTB4  = rowMeans(RT[,25:32]),
                        
                        # Block 5 average RT (i.e., trials 33-40)
                        RTB5  = rowMeans(RT[,33:40]),
                        
                        # Block 6 average RT (i.e., trials 41-48)
                        RTB6  = rowMeans(RT[,41:48]),
                        
                        # Block 7 average RT (i.e., trials 49-56)
                        RTB7  = rowMeans(RT[,49:56]),
                        
                        # Block 8 average RT (i.e., trials 57-64)
                        RTB8  = rowMeans(RT[,57:64]),
                        
                        # Block 9 average RT (i.e., trials 65-72)
                        RTB9  = rowMeans(RT[,65:72]),
                        
                        # Block 10 average RT (i.e., trials 73-80)
                        RTB10  = rowMeans(RT[,73:80]),
                        
                        # RT (for trial 1-80)
                        RT
                        ))
    # rename columns
    colnames(temp_tibble)[colnames(temp_tibble) == 'Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*'] <- 'ID'  

  # export the created tibble 
    temp_tibble
  }
}

#--(2) Create a list of all the directory paths to each individual file 

# Find the location of each excel (.xlsx) files
# the folders containing the files should be in 1 folder (e.g. "" in this case)
# this returns a list of each file's location
# Note: the pattern is set to ignore any hidden / temporary files by adding the start of each file name (e.g. "^PARTICIPANT_CU_SHJ_pilot")

files_psychopy = dir("/Users/anaceciliaruizpardo/RStudio/Concepts, Categories, and Cultural Universals/SHJ Pilot - UWO Sample (04:20:21)/Data/SHJ_raw", recursive = TRUE, full.names = TRUE, pattern = "^PARTICIPANT_CU_SHJ_pilot(.*)csv$")

#--(3) Apply the function to the files 

# Apply the function to all excel files
result_W = lapply(files_psychopy, extract_shj_W)

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.


── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_double(),
  StimSet = col_character(),
  ready_resp.keys = col_character(),
  trial_resp.keys = col_character(),
  category = col_character(),
  CorrectAns = col_character(),
  colFS = col_logical(),
  colFT = col_logical(),
  colLS = col_logical(),
  colLT = col_logical(),
  description = col_character(),
  `Enter your UNIQUE ID (The last two digits of your phone number, the last two digits of your birth year, and the first two letters of the street on which you live)*` = col_character(),
  date = col_character(),
  expName = col_character(),
  psychopyVersion = col_character(),
  OS = col_character()
)
ℹ Use `spec()` for the full column specifications.
#--(4) Create a tibble of the result of the function on the files

# take the lists of the extracted data and turn it into a tibble
SHJ_W = as_tibble(Reduce(rbind, result_W)) # alternative method: x = data.frame(t(sapply(result,c)))

# # remove row names to avoid confusion
# rownames(SHJ_W) = NULL

# # reorganize rows so that the data is ordered by the participant number (e.g. 1, 2, 3, 4...)
# SHJ_W = dplyr::arrange(SHJ_W, ID)

# display SHJ_L
SHJ_W
This code imported and organized the SHJ raw data in a long format including the variables: ID, task, type, subtype, stimN, trialN, block, trial_within, category, date, OS, frameRate, accuracy, RT. Each participant’s performance is represented by 80 rows. (click to expand)

2. Demographic & AHS Raw Data

The Demographic & AHS Raw Data was collected using Qualtrics. This raw data was imported as a tibble (“survey_raw”) and included the following: (click to see description)

Demographic Information and Exploratory Measures
Demographic Information: (click to expand)

ADD A DESCRIPTION HERE

Exploratory Measures: (click to expand)

ADD A DESCRIPTION HERE

The Analysis-Holism Scale (AHS)
The purpose of the AHS was to measure participants’ analytic versus holistic thinking tendency. The AHS was created by Choi et al (2007) and consisted 24 items on a 7-point likert scale ranging from 1 (“Strongly Disagree”) to 7 (“Strongly Agree”) (click to expand).
code 1 2 3 4 5 6 7
response Strongly
Disagree
Disagree Somewhat
Disagree
Neutral Somewhat
Agree
Agree Strongly
Agree
  • AHS_1: Everything in the universe is somehow related to each other.

  • AHS_2: Nothing is unrelated.

  • AHS_3: Everything in the world is intertwined in a causal relationship.

  • AHS_4: Even a small change in any element of the universe can lead to significant alterations in other elements.

  • AHS_5: Any phenomenon has numerous numbers of causes, although some of the causes are not known.

  • AHS_6: Any phenomenon entails a numerous number of consequences, although some of them may not be known.

  • AHS_7: It is more desirable to take the middle ground than go to extremes.

  • AHS_8: When disagreement exists among people, they should search for ways to compromise and embrace everyone’s opinions.

  • AHS_9: It is more important to find a point of compromise than to debate who is right/wrong, when one’s opinions conflict with other’s opinions.

  • AHS_10: It is desirable to be in harmony, rather than in discord, with others of different opinions than one’s own.

  • AHS_11: Choosing a middle ground in an argument should be avoided.*

  • AHS_12: We should avoid going to extremes.

  • AHS_13: Every phenomenon in the world moves in predictable directions.*

  • AHS_14: A person who is currently living a successful life will continue to stay successful.*

  • AHS_15: An individual who is currently honest will stay honest in the future.*

  • AHS_16: If an event is moving toward a certain direction, it will continue to move toward that direction.*

  • AHS_17: Current situations can change at any time.

  • AHS_18: Future events are predictable based on present situations.*

  • AHS_19: The whole, rather than its parts, should be considered in order to understand a phenomenon.

  • AHS_20: It is more important to pay attention to the whole than its parts.

  • AHS_21: The whole is greater than the sum of its parts.

  • AHS_22: It is more important to pay attention to the whole context rather than the details.

  • AHS_23: It is not possible to understand the parts without considering the whole picture.

  • AHS_24: We should consider the situation a person is faced with, as well as his/her personality, in order to understand one’s behavior.

  • reverse-coded item

This code imports and organizes the Demographic, Exploratory, and AHS raw data. (click to expand)

First, import the raw survey data.

survey_raw = readr::read_csv("survey_data_raw.csv")

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  .default = col_character()
)
ℹ Use `spec()` for the full column specifications.
# # reorganize rows so that the data is ordered by the participant number (e.g. 1, 2, 3, 4...)
# survey_raw = dplyr::arrange(survey_raw, id)
# remove row that show no data
survey_raw <- 
  survey_raw %>% 
  slice(3:nrow(survey_raw)) # remove row 1 & 2 - not data

# change class for most variables... 
  # since row 1 & 2 exports chr class from Qualtrics, the entire tibble will be class chr
  
  # change Progress, Duration, LocationLatitude, LocationLongitude, `S3.2_First Click`, `S3.2_Last Click`, `S3.2_Page Submit`, `S3.2_Click Count`-`S4.2_Click Count`, S7.1_age, S8.1_AHS_1 - S8.1_AHS_24 to numeric
  survey_raw <- 
    survey_raw %>% 
      mutate_at(c(which(colnames(survey_raw) == "Progress"),which(colnames(survey_raw) == "Duration (in seconds)"),
                  which(colnames(survey_raw) == "LocationLatitude"), which(colnames(survey_raw) == "LocationLongitude"),
                  which(colnames(survey_raw) == "S3.2_First Click"):which(colnames(survey_raw) == "S4.2_Click Count"), 
                  which(colnames(survey_raw) == "S7.1_age"),
                  which(colnames(survey_raw) == "S8.1_AHS_1"):which(colnames(survey_raw) == "S8.1_AHS_24")),
                as.numeric)
  # change Finished, `S1.2_LOI/C`, S6.2_recruited, S7.2_gender, S7.4_lang, S7.6_prof, S7.7_live to factor
  survey_raw <- 
    survey_raw %>% 
      mutate(Finished = factor(Finished, levels = c(1, 0), labels = c("yes", "no"))) %>% 
      mutate(`S1.2_LOI/C` = factor(`S1.2_LOI/C`, levels = c(1, 2), labels = c("yes", "no"))) %>% 
      mutate(S6.2_recruited = factor(S6.2_recruited, levels = c(1:4), labels = c("SONA", "Mturk", "Prolific", "Other"))) %>% 
      mutate(S7.2_gender = factor(S7.2_gender, levels = c(1:4), labels = c("Male", "Female", "Self-Identify", "Prefer not to say"))) %>% 
      mutate(S7.4_lang = factor(S7.4_lang, levels = c(1:8), labels = c("English", "Spanish", "Portuguese", "French", 
                                                                       "Mandarin", "Arabic", "Other", "Prefer not to say"))) %>% 
      mutate(S7.6_prof = factor(S7.6_prof, levels = c(1:3), labels = c("Low", "Moderate", "High"))) %>% 
      mutate(S7.7_live = factor(S7.7_live, levels = c(1:11), labels = c("North_America", "Central_America", "South America", 
                                                                        "Europe", "Africa", "Asia", "Australia", "Pacific Islander", 
                                                                        "Caribbean Islands", "other", "Prefer not to say"))) %>% 
      mutate(S9.2_finish = factor(S9.2_finish, levels = c(1), labels = c("yes")))

# clean data from unnecessary rows/columns
survey_raw <- 
  survey_raw %>% 
  slice(3:nrow(survey_raw)) %>% # remove row 1 & 2 - not data
  #filter(StartDate >= as.Date("2020-12-03 12:35")) %>% # remove pilot data (i.e., include data on and after 2020-12-03 12:35) # not needed right now
  filter(Finished == "yes") %>%  # remove ps who did not complete the study
  filter(`S1.2_LOI/C`== "yes") %>%  # remove ps who did not consent
  filter(!is.na(S7.1_age)) %>% # remove ps without age 
  # add filter for gender?
  filter(Q7.9_AC1 %in% c("TIME"," TIME", "TIME ")) %>% # remove ps who did not pass the first attention check question
  filter(S8.2_AC2 %in% c("SOME"," SOME", "SOME ")) %>% # remove ps who did not pass the SECOND attention check question
  select(-c(Status:IPAddress, ResponseId:ExternalReference, DistributionChannel:UserLanguage, SC0:id)) # remove unnecessary columns

# display survey_raw
survey_raw

Construct Working Dataframes

In order to complete the present study’s analyses, two data frames were created.

1. All Data Wide

All the data from the present study in one tibble presented in WIDE FORMAT: “dataW” (click to see more)
This code organized the raw data into one tibble. (click to expand)
# start by removing any duplicates from the SHJ and survey raw data - to prevent confusion with original data files, these will each have a the suffix "_temp"
SHJ_W_temp <- 
  SHJ_W %>% 
  distinct(ID, .keep_all = T)

survey_raw_temp <- 
  survey_raw %>% 
  distinct(S2.1_ID, .keep_all = T) %>% 
  distinct(S5.1_ID, .keep_all = T)

# some ps reported different ID's during the survey, so the data was first divided into two: (1) Ps with matching IDs in the survey and (2) Ps with mismatched IDs in the survey
survey_match <- 
  survey_raw_temp %>% 
  filter(S2.1_ID == S5.1_ID)

survey_mismatch <- 
  survey_raw_temp %>% 
  filter(S2.1_ID != S5.1_ID)

# edit survey_match columns to merge
survey_match <- 
  survey_match %>% 
  # remove excess participant ID column
  select(-S5.1_ID) %>% 
  # rename remaining ID column to merge
  dplyr::rename(ID = S2.1_ID)

# merge the matched survey data with the SHJ data 
dataW_match <- merge(SHJ_W_temp, survey_match, by = "ID")
 

# merge the mismatched survey data with the SHJ data  
  # which rows in the 1st ID response match b/w the SHJ and survey data?
    ID1 <- SHJ_W_temp$ID[SHJ_W_temp$ID %in% survey_mismatch$S2.1_ID]
    # check which row in survey_mismatch these belong to... 
    ID1_row <- c(which(survey_mismatch$S2.1_ID == SHJ_W_temp$ID[SHJ_W_temp$ID %in% survey_mismatch$S2.1_ID][1]), 
                 which(survey_mismatch$S2.1_ID == SHJ_W_temp$ID[SHJ_W_temp$ID %in% survey_mismatch$S2.1_ID][2]))
    
  # which rows in the 2nd ID response match b/w the SHJ and survey data?
    ID2 <- SHJ_W_temp$ID[SHJ_W_temp$ID %in% survey_mismatch$S5.1_ID]
  
  # check if any rows are the same b/w ID1 & ID2...
    # intersect(ID1, ID2) #commented out for now so nothing returned... 
      # since this value is 0, no duplicates b/w ID1 & ID2 would be gathered if both are included in final data set 
    
    
dataW_mismatch <- bind_rows(merge(SHJ_W_temp, dplyr::rename(select(survey_mismatch, -S5.1_ID), ID = S2.1_ID), by = "ID"), 
                             merge(SHJ_W_temp, dplyr::rename(select(survey_mismatch, -S2.1_ID), ID = S5.1_ID), by = "ID")
                            )

# Merge matched & mismatched data into 1 data frame -- this can be done now that the checks above were completed
dataW <- tibble(bind_rows(dataW_match, dataW_mismatch))
  # rename ID to numerals to remove custom IDs created by ps from any futher analysis (i.e., fully anonymize the data)
  dataW$ID <- 1:nrow(dataW)

# show dataW
dataW


# to export the data as a csv file, use the following:
# write_excel_csv(dataW, "dataW(May10).csv")

Interpreting the Data

The following analyses were completed based on a registered project on OSF (view registration: https://osf.io/2yutr/?view_only=e0bb214218a249e2911da3109529d23f). The analyses explored two main effects in the present study: (1) Rank order effects and (2) Correlation relationships. Each analysis contains a description, and required assumption tests, and visualizations.

Rank Order Differences

To investigate if the present study found the same rank order differences as in previous studies (e.g., Smith, Minda, and Washburn, 2004), participant performance across SHJ types was observed. This was done across all blocks and by block of each SHJ type.

First, we charted the data in a table. This shows the percent of correct responses during each block and across all 10 blocks for each category type and collapsed across all category types. (click to see code)
# subset data for only the data we want: B1-10 percent of correct for each category type 
per_byblock_bytype <- 
  dataW %>% 
  group_by(type) %>%
  dplyr::summarise(n = n(), PerB1 = (sum(accuracyB1)/(n()*8) *100), PerB2 = (sum(accuracyB2)/(n()*8) *100), 
            PerB3 = (sum(accuracyB3)/(n()*8) *100), PerB4 = (sum(accuracyB4)/(n()*8) *100), 
            PerB5 = (sum(accuracyB5)/(n()*8) *100), PerB6 = (sum(accuracyB6)/(n()*8) *100), 
            PerB7 = (sum(accuracyB7)/(n()*8) *100), PerB8 = (sum(accuracyB8)/(n()*8) *100), 
            PerB9 = (sum(accuracyB9)/(n()*8) *100), PerB10 = (sum(accuracyB10)/(n()*8) *100)
            )
  per_byblock_bytype$type <- as.character(per_byblock_bytype$type)

per_byblock <- 
  bind_cols(tibble(type = "All"), 
            dataW %>% 
            dplyr::summarise(n = n(), PerB1 = (sum(accuracyB1)/(n()*8) *100), PerB2 = (sum(accuracyB2)/(n()*8) *100), 
                      PerB3 = (sum(accuracyB3)/(n()*8) *100), PerB4 = (sum(accuracyB4)/(n()*8) *100), 
                      PerB5 = (sum(accuracyB5)/(n()*8) *100), PerB6 = (sum(accuracyB6)/(n()*8) *100), 
                      PerB7 = (sum(accuracyB7)/(n()*8) *100), PerB8 = (sum(accuracyB8)/(n()*8) *100), 
                      PerB9 = (sum(accuracyB9)/(n()*8) *100), PerB10 = (sum(accuracyB10)/(n()*8) *100), 
                      All = (sum(accuracyB1, accuracyB2, accuracyB3, accuracyB4, accuracyB5, accuracyB6, accuracyB7, accuracyB8, accuracyB9, accuracyB10)/(n()*80))*100)
            )
  per_byblock$type <- as.character(per_byblock$type)


per_bytype <- 
  dataW %>% 
  group_by(type) %>% 
  dplyr::summarise(All = (sum(accuracyB1, accuracyB2, accuracyB3, accuracyB4, accuracyB5, 
                       accuracyB6, accuracyB7, accuracyB8, accuracyB9, accuracyB10)/(n()*80))*100
            )
  per_bytype$type <- as.character(per_bytype$type)

per_resp <- 
  bind_rows(per_byblock, 
            left_join(per_byblock_bytype, per_bytype, by = "type"))
Percent of Correct Responses During Each Block & Across All Blocks Grouped by SHJ Task Type
Block
Type n 1 2 3 4 5 6 7 8 9 10 All
1 All 119 48.32 60.50 64.60 65.23 66.28 68.91 68.49 71.11 70.27 68.91 65.26
2 1 19 62.50 90.13 93.42 94.08 95.39 90.79 94.08 96.05 94.08 93.42 90.39
3 2 19 36.18 55.26 65.13 67.76 65.13 69.08 65.79 75.00 71.05 71.05 64.14
4 3 28 55.36 59.38 61.16 59.82 60.71 65.18 62.05 66.52 66.96 66.07 62.32
5 4 19 54.61 53.95 54.61 57.89 61.18 69.74 63.16 65.13 69.08 63.16 61.25
6 5 16 42.97 58.59 57.81 53.91 60.94 62.50 61.72 61.72 64.06 63.28 58.75
7 6 18 33.33 45.14 55.56 58.33 55.56 56.25 65.97 62.50 56.25 56.25 54.51
Note:
Performance is summarized across the 6 task types in Row 1.



For comparison, here is the table from Smith, Minda, and Washburn (2004):

Table 3 from Smith et al. (2004)


Overall Rank Order Performance

Now that we have looked at the data, we plotted the data. First, we used a histogram to depict participant average performance in percent correct across each SHJ type.

Figure depicting the percent of correct responses for each SHJ type across all 10 blocks. (click to see code)
# from table per corr table
per_bytype_forfig <- per_bytype %>% 
  # change col names to make fig
  rename(percent = All) %>% 
  # add rounded col for goem_text in fig
  mutate(rounded_per = round(percent, 2))
  
# show data
glimpse(per_bytype_forfig)
Rows: 6
Columns: 3
$ type        <chr> "1", "2", "3", "4", "5", "6"
$ percent     <dbl> 90.39474, 64.14474, 62.32143, 61.25000, 58.75000, 54.51389
$ rounded_per <dbl> 90.39, 64.14, 62.32, 61.25, 58.75, 54.51

The figure shows that, as predicted, type 1 had the best performance. Type 2-6 did not show the same differences as seen in the past. However, there was a downward trend, where performance became lower for higher SHJ types. This trend, although not large, did fit our predictions. The very small differences in performance suggest that although the rank order differences may occur, our sample was not sufficient to show the differences. A larger sample is needed to explore this further.

Rank Order Performance by Block

Now that we have seen the overall differences, we plotted the data using a line graph.

This figure depicts the percent of correct responses during each block for each SHJ type. (click to see code)
# get data for line figure
per_resp_forfig <- 
  per_byblock_bytype %>% 
  select(-n) %>% 
  gather(key = block, value = error, PerB1:PerB10) %>% 
  rename(Type = type)

# show data
glimpse(per_resp_forfig)
Rows: 60
Columns: 3
$ Type  <chr> "1", "2", "3", "4", "5", "6", "1", "2", "3", "4", "5", "6", "1", "2", "3", "4", "5", "6", "1", "2", "3", "4", "5", "6", "1", "2", "3…
$ block <chr> "PerB1", "PerB1", "PerB1", "PerB1", "PerB1", "PerB1", "PerB2", "PerB2", "PerB2", "PerB2", "PerB2", "PerB2", "PerB3", "PerB3", "PerB3…
$ error <dbl> 62.50000, 36.18421, 55.35714, 54.60526, 42.96875, 33.33333, 90.13158, 55.26316, 59.37500, 53.94737, 58.59375, 45.13889, 93.42105, 65…

Overall, type 1 was the easiest and fastest SHJ type learned, which fit with our predictions. This was not surprising as it is based on a single-dimensional rule and is considered the easiest to learn. The rest of the SHJ types were not as clearly ranked as in previous studies. That is, there was a mixture of which type was the easiest to learn when you consider the first and middle blocks. When comparing the last block of performance only, a trend depicted the predicted rank order difference: type 1 was the easiest for participants to learn, followed by type 2, then type 3, then type 4 and 5 tied, and lastly was type 6. However, the data was not very clearly ranked, again showing the potential need for a larger sample size.

Correlation Analysis

Setting Up the Data

Click here to see analysis prep (e.g., setting up the data).

For this correlation analysis, we were interested in comparing the performance (i.e., percentage correct) with AHS score for each category type (i.e., type 1-6). This comparison was explored for the first block (i.e., block 1), middle block (i.e., block 5), last block (i.e., block 10), and collapsed across all blocks.

First, we created a data frame with the variables we are interested in (“data_corrs”): SHJ type, accuracy (B1-10), and AHS raw data. (click to see code)
# make new data frame from dataW
data_corrs <- 
  dataW %>% 
  # select the wanted variables: ID, task, type, AHS items, accuracy, RT
  select(c(ID, task, type, accuracyB1:accuracyB10, S8.1_AHS_1:S8.1_AHS_24)) %>% 
  # add re-coded variables for the reverse-coded AHS items (i.e., items 11, 13, 14, 15, 16, & 18)
  mutate(S8.1_AHS_11R = as.numeric(dplyr::recode(S8.1_AHS_11, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1')),
         S8.1_AHS_13R = as.numeric(dplyr::recode(S8.1_AHS_13, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1')), 
         S8.1_AHS_14R = as.numeric(dplyr::recode(S8.1_AHS_14, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1')), 
         S8.1_AHS_15R = as.numeric(dplyr::recode(S8.1_AHS_15, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1')),
         S8.1_AHS_16R = as.numeric(dplyr::recode(S8.1_AHS_16, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1')), 
         S8.1_AHS_18R = as.numeric(dplyr::recode(S8.1_AHS_18, '1' = '7', '2' = '6', '3' = '5', '4' = '4', '5' = '3', '6' = '2', '7' = '1'))
         ) %>% 
  # for each participant... 
  rowwise() %>% 
  # add score for AHS (i.e., sum of items 1-24 for each participant)
    # higher score corresponds to greater holism
  mutate(AHS_score = (sum(S8.1_AHS_1, S8.1_AHS_2, S8.1_AHS_3, S8.1_AHS_4, S8.1_AHS_5, S8.1_AHS_6, S8.1_AHS_7, S8.1_AHS_8, S8.1_AHS_9, S8.1_AHS_10, S8.1_AHS_11R, S8.1_AHS_12, S8.1_AHS_13R, S8.1_AHS_14R, S8.1_AHS_15R, S8.1_AHS_16R, S8.1_AHS_17, S8.1_AHS_18R, S8.1_AHS_19, S8.1_AHS_20, S8.1_AHS_21, S8.1_AHS_22, S8.1_AHS_23, S8.1_AHS_24))/24) %>% 
  # add variable for percent performance for each block
  mutate(per_accB1 = (sum(accuracyB1)/8)*100, per_accB2 = (sum(accuracyB2)/8)*100, 
         per_accB3 = (sum(accuracyB3)/8)*100, per_accB4 = (sum(accuracyB4)/8)*100, 
         per_accB5 = (sum(accuracyB5)/8)*100, per_accB6 = (sum(accuracyB6)/8)*100, 
         per_accB7 = (sum(accuracyB7)/8)*100, per_accB8 = (sum(accuracyB8)/8)*100,
         per_accB9 = (sum(accuracyB9)/8)*100, per_accB10 = (sum(accuracyB10)/8)*100, 
         per_acc_all = (sum(accuracyB1, accuracyB2, accuracyB3, accuracyB4, accuracyB5, 
                            accuracyB6, accuracyB7, accuracyB8, accuracyB9, accuracyB10)/80)*100) %>% 
  # add variables for the 4 learning times of interest: early learning (i.e., block 1-3), middle learning (i.e., block 4-7), late learning (i.e., block 8-10), and collapsed across all blocks (i.e., block 1-10)
  mutate(per_early_acc = (sum(accuracyB1, accuracyB2, accuracyB3)/(8*3))*100, 
         per_mid_acc = (sum(accuracyB4, accuracyB5, accuracyB6, accuracyB7)/(8*4))*100, 
         per_late_acc = (sum(accuracyB8, accuracyB9, accuracyB10)/(8*3))*100)
  
Next, we made subsets of the data for each category type (i.e., type 1-6) for the analysis. The result is a data frame for each SHJ type (i.e., “perAHS_t1-perAHS_t6”) and collapsed across all SHJ types (i.e., “perAHS_tall”) (click to see code)
# subset data for each category type
# for type 1
perAHS_t1 <- 
  data_corrs %>% 
  filter(type == 1) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# for type 2
perAHS_t2 <- 
  data_corrs %>% 
  filter(type == 2) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# for type 3
perAHS_t3 <- 
  data_corrs %>% 
  filter(type == 3) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# for type 4
perAHS_t4 <- 
  data_corrs %>% 
  filter(type == 4) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# for type 5
perAHS_t5 <- 
  data_corrs %>% 
  filter(type == 5) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# for type 6
perAHS_t6 <- 
  data_corrs %>% 
  filter(type == 6) %>% # only select ps that completed one type
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

# collpased across type 1-6
perAHS_tall <-
  data_corrs %>%
  select(c(AHS_score, per_early_acc, per_mid_acc, per_late_acc, per_acc_all)) # select the columns needed for analysis

Assumption Tests

All assumptions were met for the correlation analysis. Click here to see the assumption tests.

The assumptions for a correlation analysis were tested. There were two assumptions: (1) Linearity and (2) Normality.

  1. Linearity was visually inspected from the scatter plots (see plots in the “Figures: Scatter Plots” section).

  2. Normality was tested using (a) the Shapiro-Wilk normality test and (b) visually inspected using a normality plot.

    • The Shapiro-Wilk normality test will show two values (i.e., W and p) and each test uses the following hypotheses: HN: the data are normally distributed and HA: the data are not normally distributed.
    • The normality plots used were Q-Q plots (quantile-quantile plots), which draw the correlation between a given sample and the theoretical normal distribution.

(a) Shapiro-Wilk Normality Test

The table depicts the results of the Shapiro-Wilks normality test for each measure. (click to see code)
# create a table to show results of all normality tests
corrs_norm_test <- 
  tibble(Statistic = rep(c("W", "p-value"), 5), 
         All = c(shapiro.test(perAHS_tall$per_early_acc)$statistic, shapiro.test(perAHS_tall$per_early_acc)$p.value, # W & p-value for block 1-3
                 shapiro.test(perAHS_tall$per_mid_acc)$statistic, shapiro.test(perAHS_tall$per_mid_acc)$p.value, # W & p-value for block 4-7
                 shapiro.test(perAHS_tall$per_late_acc)$statistic, shapiro.test(perAHS_tall$per_late_acc)$p.value, # W & p-value for block 8-10
                 shapiro.test(perAHS_tall$per_acc_all)$statistic, shapiro.test(perAHS_tall$per_acc_all)$p.value, # W & p-value for block all
                 shapiro.test(perAHS_tall$AHS_score)$statistic, shapiro.test(perAHS_tall$AHS_score)$p.value), # W & p-value for AHS_score
         Type1 = c(shapiro.test(perAHS_t1$per_early_acc)$statistic, shapiro.test(perAHS_t1$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t1$per_mid_acc)$statistic, shapiro.test(perAHS_t1$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t1$per_late_acc)$statistic, shapiro.test(perAHS_t1$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t1$per_acc_all)$statistic, shapiro.test(perAHS_t1$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t1$AHS_score)$statistic, shapiro.test(perAHS_t1$AHS_score)$p.value),
         Type2 = c(shapiro.test(perAHS_t2$per_early_acc)$statistic, shapiro.test(perAHS_t2$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t2$per_mid_acc)$statistic, shapiro.test(perAHS_t2$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t2$per_late_acc)$statistic, shapiro.test(perAHS_t2$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t2$per_acc_all)$statistic, shapiro.test(perAHS_t2$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t2$AHS_score)$statistic, shapiro.test(perAHS_t2$AHS_score)$p.value),
         Type3 = c(shapiro.test(perAHS_t3$per_early_acc)$statistic, shapiro.test(perAHS_t3$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t3$per_mid_acc)$statistic, shapiro.test(perAHS_t3$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t3$per_late_acc)$statistic, shapiro.test(perAHS_t3$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t3$per_acc_all)$statistic, shapiro.test(perAHS_t3$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t3$AHS_score)$statistic, shapiro.test(perAHS_t3$AHS_score)$p.value), 
         Type4 = c(shapiro.test(perAHS_t4$per_early_acc)$statistic, shapiro.test(perAHS_t4$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t4$per_mid_acc)$statistic, shapiro.test(perAHS_t4$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t4$per_late_acc)$statistic, shapiro.test(perAHS_t4$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t4$per_acc_all)$statistic, shapiro.test(perAHS_t4$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t4$AHS_score)$statistic, shapiro.test(perAHS_t4$AHS_score)$p.value), 
         Type5 = c(shapiro.test(perAHS_t5$per_early_acc)$statistic, shapiro.test(perAHS_t5$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t5$per_mid_acc)$statistic, shapiro.test(perAHS_t5$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t5$per_late_acc)$statistic, shapiro.test(perAHS_t5$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t5$per_acc_all)$statistic, shapiro.test(perAHS_t5$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t5$AHS_score)$statistic, shapiro.test(perAHS_t5$AHS_score)$p.value), 
         Type6 = c(shapiro.test(perAHS_t6$per_early_acc)$statistic, shapiro.test(perAHS_t6$per_early_acc)$p.value, 
                      shapiro.test(perAHS_t6$per_mid_acc)$statistic, shapiro.test(perAHS_t6$per_mid_acc)$p.value, 
                      shapiro.test(perAHS_t6$per_late_acc)$statistic, shapiro.test(perAHS_t6$per_late_acc)$p.value, 
                      shapiro.test(perAHS_t6$per_acc_all)$statistic, shapiro.test(perAHS_t6$per_acc_all)$p.value, 
                      shapiro.test(perAHS_t6$AHS_score)$statistic, shapiro.test(perAHS_t6$AHS_score)$p.value)
         )
# count how many p-values were sig. (i.e., less than 0.05)
corrs_norm_test_sig <- 
  length(which(corrs_norm_test$All [c(2, 4, 6, 8 ,10)] < .05)) + # for all SHJ types
  length(which(corrs_norm_test$Type1[c(2, 4, 6, 8 ,10)] < .05)) + # for type 1
  length(which(corrs_norm_test$Type2[c(2, 4, 6, 8 ,10)] < .05)) + # for type 2
  length(which(corrs_norm_test$Type3[c(2, 4, 6, 8 ,10)] < .05)) + # for type 3
  length(which(corrs_norm_test$Type4[c(2, 4, 6, 8 ,10)] < .05)) + # for type 4
  length(which(corrs_norm_test$Type5[c(2, 4, 6, 8 ,10)] < .05)) + # for type 5
  length(which(corrs_norm_test$Type6[c(2, 4, 6, 8 ,10)] < .05)) # for type 6
  
- As seen in the table, 43.33% of the measures showed significant p-values and therefore violated the assumption of normality. It should be noted that, for each SHJ type and when collapsed across all SHJ types, the AHS score was normally distributed. This score will be correlated with task performance during different blocks, which were not normally distributed. The visual inspection of the Q-Q plots was completed next.
Shapiro-Wilks Normality Test for All Correlation Measures Grouped by SHJ Task Type
All Type 1 Type 2 Type 3 type 4 Type 5 Type 6
Early Performance
W 0.96 0.85 0.94 0.97 0.97 0.96 0.89
p-value 0.00 0.01 0.21 0.57 0.79 0.65 0.04
Middle Performance
W 0.94 0.57 0.90 0.99 0.98 0.90 0.94
p-value 0.00 0.00 0.05 0.96 0.96 0.08 0.31
Late Performance
W 0.93 0.60 0.86 0.96 0.93 0.86 0.99
p-value 0.00 0.00 0.01 0.42 0.17 0.02 0.99
B1-10 Performance
W 0.94 0.61 0.85 0.96 0.99 0.92 0.98
p-value 0.00 0.00 0.01 0.33 0.99 0.18 0.91
AHS Score
W 0.98 0.96 0.93 0.96 0.92 0.98 0.96
p-value 0.06 0.52 0.15 0.30 0.13 0.93 0.67
Note:
Normality is met for non-significant p-values (i.e., greater than 0.05).

(b) Q-Q Plots

Overall, the Q-Q plots show the data for all variables (i.e., block 1, 5, 10, 1-10 performance, and AHS score) did fall along or close to the line. Therefore, normality was met for all variables at each SHJ category type, excluding: (click to see code)

AHS Score, which is mostly falling along the line. Additionally, the plots across all SHJ types (i.e., as opposed to for different types) are also closer to depicting normality. This was not surprising since the sample size (\(N_{all}\) = 119) is much larger for this group. Overall, the Shapiro-Wilk test and the visual inspection of the Q-Q plots demonstrate that normality was not met. Additionally, the sample sizes for the different SHJ type’s data were small (i.e., \(N_{Type 1}\) = 19, \(N_{Type 2}\) = 19, \(N_{Type 3}\) = 28, \(N_{Type 4}\) = 19, \(N_{Type 5}\) = 16, \(N_{Type 6}\) = 18). (click to see code)

# Collapsed across type 1-6
grid.arrange(ggqqplot(perAHS_tall$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_tall$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_tall$per_late_acc, ylab = "Late Performance"),
             ggqqplot(perAHS_tall$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_tall$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For All SHJ Types", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
# For Type 1
grid.arrange(ggqqplot(perAHS_t1$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_t1$per_mid_acc, ylab = "Middle Performance*"),
             ggqqplot(perAHS_t1$per_late_acc, ylab = "Late Performance*"),
             ggqqplot(perAHS_t1$per_acc_all, ylab = "B1-10 Performance*"),
             ggqqplot(perAHS_t1$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 1", 
                             face = "bold"), # show text in bold
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", # show text in italics
                                x = 0.05, # specify orientation on x-axis (bottom L = 0) (NOTE: use both x & hjust)
                                hjust = 0) # specify horizontal justification (NOTE: use both x & hjust)
             )
# For Type 2
grid.arrange(ggqqplot(perAHS_t2$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_t2$per_mid_acc, ylab = "Middle Performance*"),
             ggqqplot(perAHS_t2$per_late_acc, ylab = "Late Performance*"),
             ggqqplot(perAHS_t2$per_acc_all, ylab = "B1-10 Performance*"),
             ggqqplot(perAHS_t2$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 2", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
# For Type 3
grid.arrange(ggqqplot(perAHS_t3$per_early_acc, ylab = "Early Performance*"),
             ggqqplot(perAHS_t3$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_t3$per_late_acc, ylab = "Late Performance*"),
             ggqqplot(perAHS_t3$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_t3$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 3", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-Ws p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
# For Type 4
grid.arrange(ggqqplot(perAHS_t4$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_t4$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_t4$per_late_acc, ylab = "Late Performance"),
             ggqqplot(perAHS_t4$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_t4$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 4", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
# For Type 5
grid.arrange(ggqqplot(perAHS_t5$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_t5$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_t5$per_late_acc, ylab = "Late Performance"),
             ggqqplot(perAHS_t5$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_t5$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 5", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
# For Type 6
grid.arrange(ggqqplot(perAHS_t6$per_early_acc, ylab = "Early Performance*"),
             ggqqplot(perAHS_t6$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_t6$per_late_acc, ylab = "Late Performance"),
             ggqqplot(perAHS_t6$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_t6$AHS_score, ylab = "AHS Score"),
             nrow = 2,
             top = text_grob("Q-Q Plots For Type 6", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )
Collapsed across SHJ types, the data for all variables followed along or close to the line, suggesting normality. B1-10 Performance was moderately-tailed and the other variables were light-tailed. This was contradictory to the Shapiro-Wilks normality test, which indicated that all variables (excluding the AHS score) were non-normal. However, this data has a large sample size (\(N_{all}\) = 119) and, overall, the data are distributed along the line. Therefore, a Pearson correlation was completed for Early Performance, Middle Performance, B1-10 Performance, and AHS Score followed along for this group. (click to see qq plots)
# Collapsed across type 1-6
grid.arrange(ggqqplot(perAHS_tall$per_early_acc, ylab = "Early Performance"),
             ggqqplot(perAHS_tall$per_mid_acc, ylab = "Middle Performance"),
             ggqqplot(perAHS_tall$per_late_acc, ylab = "Late Performance"),
             ggqqplot(perAHS_tall$per_acc_all, ylab = "B1-10 Performance"),
             ggqqplot(perAHS_tall$AHS_score, ylab = "AHS Score"),
             heights = c(.5, .5),
             # nrow = 1,
             top = text_grob("Q-Q Plots For All SHJ Types", 
                             face = "bold"), 
             bottom = text_grob("Normality is met for plots were data falls along or close to the line. * S-W p < .05", 
                                face = "italic", 
                                x = 0.05, 
                                hjust = 0)
             )

For Type 1, the data for the variables Early Performance, B1-10 Performance, and AHS Score followed along or close to the line, suggesting normality. Early Performance and AHS score are light tailed, and B1-10 Performance is heavy-tailed with a possible outlier. The variables B5 Performance and B10 Performance did not closely follow along the line and suggested non-normal data. B5 Performance was heavily concentrated, left skewed, and had some possible outliers. B10 Performance had gaps between two sets of concentrated data and was slightly left skewed. These results were consistent with the Shapiro-Wilk normality test with the exception of B1-10 Performance, which indicated non-normality. However, since the overall distribution for B1-10 Performance was along the straight line, it was considered normally distributed. Therefore, a Pearson correlation was completed for Early Performance, B1-10 Performance, and AHS Score followed along for this group. Since both normality tests showed non-normal data, a Kendall correlation (i.e., non-parametric correlation; see “Kendall’s \(\tau_{b}\) Rank-Order Correlations” section for more details) was completed for B5 Performance and B10 Performance for this group. (click to see qq plots) *

For Type 2, the data for the variables B5 Performance, B10 Performance, and B1-10 Performance followed along or close to the line, suggesting normality. B5 Performance, B10 Performance, and B1-10 Performance were heavy-tailed. The variables Early Performance and AHS Score did not closely follow along the line and suggested non-normal data. Early Performance was heavily concentrated, left skewed, and had some possible outliers. AHS Score was heavy-tailed with most data falling on the line. Interestingly, these results were opposite to the Shapiro-Wilk normality test. However, overall the data mostly followed along the straight line and was considered normally distributed. Therefore, a Pearson correlation was completed for Early Performance, B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along for this group. (click to see qq plots)

For Type 3, the data for the variables B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along or close to the line, suggesting normality. All variables except B1-10 Performance were light-tailed and B5 Performance, and B10 Performance had some concentrated chunks within the distribution along the line. Early Performance did not closely follow along the line and suggested non-normal data: it was heavy-tailed and had some concentrated chunks within the distribution. These results were partially aligned with the Shapiro-Wilk normality test, where Early Performance and B10 Performance results indicated non-normality. For B10 Performance the data mostly followed along the straight line and was considered normally distributed. Therefore, a Pearson correlation was completed for B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along for this group. Since both normality tests showed non-normal data, a Kendall correlation (i.e., non-parametric correlation; see “Kendall’s \(\tau_{b}\) Rank-Order Correlations” section for more details) was completed for Early Performance for this group. (click to see qq plots) *

For Type 4,

the data for the variables B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along or close to the line, suggesting normality. B5 Performance, B10 Performance, and AHS Score were light-tailed and B5 Performance had some concentrated chunks within the distribution along the line. Early Performance did not closely follow along the line and suggested non-normal data: it was heavy-tailed and had some concentrated chunks within the distribution. These results were contrary to the Shapiro-Wilk normality test, where Early Performance results indicated normality, W = 0.97, p = = .79. Although Early Performance was heavy-tailed, the majority of the data mostly followed along the straight line and was considered normally distributed. Therefore, a Pearson correlation was completed for Early Performance, B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along for this group. (click to see qq plots) *

For Type 5,

the data for the variables Early Performance, B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along or close to the line, suggesting normality. Early Performance, B1-10 Performance were heavy-tailed. AHS Score was light-tailed. These results were aligned with the Shapiro-Wilk normality test results, where all variables inidcated normality, W > 0.86, p > 0.02. Overall, the data mostly followed along the straight line and was considered normally distributed. Therefore, a Pearson correlation was completed for Early Performance, B5 Performance, B10 Performance, B1-10 Performance, and AHS Score followed along for this group. (click to see qq plots) *

For Type 6, the data for the variables Early Performance, B1-10 Performance, and AHS Score followed along or close to the line, suggesting normality. Therefore, a correlation is appropriate for these variables. The variables B5 Performance and B10 Performance did not follow the straight line and suggested non-normal data. Therefore, a non-parametric correlation is needed for these variables. (click to see qq plots) *

Pearson Correlation Analyses

The following shows the pearson correlations between AHS score (average) and SHJ task performance (i.e., early, middle, late, and overall learning).

corrs_P <- 
  tibble("AHS Score vs." = c("Early Performance", "Middle Performance", "Late Performance", "B1-10 Performance"), 
         # collapsed across SHJ types
         rA = c(cor.test(x = perAHS_tall$per_early_acc, y = perAHS_tall$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_tall$per_mid_acc, y = perAHS_tall$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_tall$per_late_acc, y = perAHS_tall$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_tall$per_acc_all, y = perAHS_tall$AHS_score, method = "pearson")$estimate), 
         pA = c(cor.test(x = perAHS_tall$per_early_acc, y = perAHS_tall$AHS_score, method = "pearson")$p.value,
                        cor.test(x = perAHS_tall$per_mid_acc, y = perAHS_tall$AHS_score, method = "pearson")$p.value, 
                        cor.test(x = perAHS_tall$per_late_acc, y = perAHS_tall$AHS_score, method = "pearson")$p.value, 
                        cor.test(x = perAHS_tall$per_acc_all, y = perAHS_tall$AHS_score, method = "pearson")$p.value), 
         # type 1
         r1 = c(cor.test(x = perAHS_t1$per_early_acc, y = perAHS_t1$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t1$per_mid_acc, y = perAHS_t1$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t1$per_late_acc, y = perAHS_t1$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t1$per_acc_all, y = perAHS_t1$AHS_score, method = "pearson")$estimate), 
         p1 = c(cor.test(x = perAHS_t1$per_early_acc, y = perAHS_t1$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t1$per_mid_acc, y = perAHS_t1$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t1$per_late_acc, y = perAHS_t1$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t1$per_acc_all, y = perAHS_t1$AHS_score, method = "pearson")$p.value), 
         # type 2
         r2 = c(cor.test(x = perAHS_t2$per_early_acc, y = perAHS_t2$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t2$per_mid_acc, y = perAHS_t2$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t2$per_late_acc, y = perAHS_t2$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t2$per_acc_all, y = perAHS_t2$AHS_score, method = "pearson")$estimate), 
         p2 = c(cor.test(x = perAHS_t2$per_early_acc, y = perAHS_t2$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t2$per_mid_acc, y = perAHS_t2$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t2$per_late_acc, y = perAHS_t2$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t2$per_acc_all, y = perAHS_t2$AHS_score, method = "pearson")$p.value), 
         # type 3
         r3 = c(cor.test(x = perAHS_t3$per_early_acc, y = perAHS_t3$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t3$per_mid_acc, y = perAHS_t3$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t3$per_late_acc, y = perAHS_t3$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t3$per_acc_all, y = perAHS_t3$AHS_score, method = "pearson")$estimate), 
         p3 = c(cor.test(x = perAHS_t3$per_early_acc, y = perAHS_t3$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t3$per_mid_acc, y = perAHS_t3$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t3$per_late_acc, y = perAHS_t3$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t3$per_acc_all, y = perAHS_t3$AHS_score, method = "pearson")$p.value), 
         # type 4
         r4 = c(cor.test(x = perAHS_t4$per_early_acc, y = perAHS_t4$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t4$per_mid_acc, y = perAHS_t4$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t4$per_late_acc, y = perAHS_t4$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t4$per_acc_all, y = perAHS_t4$AHS_score, method = "pearson")$estimate), 
         p4 = c(cor.test(x = perAHS_t4$per_early_acc, y = perAHS_t4$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t4$per_mid_acc, y = perAHS_t4$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t4$per_late_acc, y = perAHS_t4$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t4$per_acc_all, y = perAHS_t4$AHS_score, method = "pearson")$p.value), 
         # type 5
         r5 = c(cor.test(x = perAHS_t5$per_early_acc, y = perAHS_t5$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t5$per_mid_acc, y = perAHS_t5$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t5$per_late_acc, y = perAHS_t5$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t5$per_acc_all, y = perAHS_t5$AHS_score, method = "pearson")$estimate), 
         p5 = c(cor.test(x = perAHS_t5$per_early_acc, y = perAHS_t5$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t5$per_mid_acc, y = perAHS_t5$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t5$per_late_acc, y = perAHS_t5$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t5$per_acc_all, y = perAHS_t5$AHS_score, method = "pearson")$p.value), 
         # type 6
         r6 = c(cor.test(x = perAHS_t6$per_early_acc, y = perAHS_t6$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t6$per_mid_acc, y = perAHS_t6$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t6$per_late_acc, y = perAHS_t6$AHS_score, method = "pearson")$estimate, 
                  cor.test(x = perAHS_t6$per_acc_all, y = perAHS_t6$AHS_score, method = "pearson")$estimate), 
         p6 = c(cor.test(x = perAHS_t6$per_early_acc, y = perAHS_t6$AHS_score, method = "pearson")$p.value,
                  cor.test(x = perAHS_t6$per_mid_acc, y = perAHS_t6$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t6$per_late_acc, y = perAHS_t6$AHS_score, method = "pearson")$p.value, 
                  cor.test(x = perAHS_t6$per_acc_all, y = perAHS_t6$AHS_score, method = "pearson")$p.value)
            )

Correlation Table

Below, the correlation table depicts the correlations between AHS score and SHJ performance (percent correct) for each SHJ type (1-6) for Early (B1-B3), Middle (B4-B7), Late (B8-B10), and Overall (B1-B10).

  • Collapsed across SHJ types, there were no significant or strong correlations, r = -0.02 to r = 0.14, p = .14 to p = .85.
  • For Type 1, there were no significant correlations, r = -0.37, p = .12. Therefore, better performance during block 1 was associated with a more analytic thinking style.
  • For Type 2, there were no significant or strong correlations, r = -0.17 to r = -0.04, p = .49 to p = .86.
  • For Type 3, there was a significant, strong, positive correlation between AHS score and middle (i.e., block 4-7) performance, r = 0.4, p = .04. Therefore, better performance during block 5 was associated with a more holistic thinking style.
  • For Type 4, there was a significant, strong, positive correlation between AHS score and early (i.e., block 1-3), r = 0.5, p = .03, middle (i.e., block 4-7), r = 0.7, p = .001, and overall block performance (i.e., block 1-10), r = 0.61, p = .01. Therefore, better performance during early, middle, and overall performance was associated with a more holistic thinking style.
  • For Type 5, there were no significant or strong correlations, r = -0.16 to r = 0.22, p = .42 to p = .92.
  • For Type 6, there were no significant or strong correlations, r = -0.09 to r = 0.43, p = .08 to p = .73.
Pearson Correlations between AHS Score and SHJ Task Performance Grouped by SHJ Task Type
All
Type 1
Type 2
Type 3
Type 4
Type 5
Type 6
AHS Score vs. r p-value r p-value r p-value r p-value r p-value r p-value r p-value
Early Performance -0.02 0.85 -0.37 0.12 -0.04 0.86 0.06 0.75 0.50 0.03 -0.06 0.84 0.09 0.73
Middle Performance 0.14 0.14 -0.21 0.40 -0.17 0.49 0.40 0.04 0.70 0.00 0.22 0.42 -0.09 0.72
Late Performance 0.05 0.57 0.06 0.81 -0.15 0.55 0.12 0.53 0.28 0.25 -0.16 0.56 0.43 0.08
B1-10 Performance 0.08 0.41 -0.24 0.31 -0.14 0.57 0.28 0.15 0.61 0.01 0.03 0.92 0.25 0.32
Note:
Early Performance = B1-B3; Middle Performance = B4-B7, Late Performance = B8-B10.

Now that we have seen the correlation table, the results were visualized using a scatter plot.

Main: Across All Blocks

We visualized each comparison from above using scatter plots of the raw data. This was done for each SHJ category type (i.e., Type 1-6). Some things to keep in mind about the variables: - AHS score: - measures participant’s thinking style using 24 items on a 7-point likert scale: higher score depicts more holistic thinking - possible range: 0 - 168 - shown on the x-axis of all plots - SHJ performance: - measures percent correct for given block(s): Early (first block), B5 (middle block), B10 (last block), and B1-10 (collapsed across blocks) - possible range: 0% - 100% - shown on the y-axis of all plots - blocks

There was significant positive correlation between AHS score and type 4 performance across all blocks. So, more holistic thinking style was associated with better type 4 performance. No other correlation between AHS score and performance for each SHJ type was significant. Although not significant, it can be noted that the trend for the rule-based types (i.e., type 1-2) was trending in the correct direction, where lower AHS score (i.e., more analytic thinking style) was associated with higher performance. This partially supported our predictions.

# gather plots for each type, with overall bloack per corr perforance (B1-B10)

# Type 1
psych_scat1_all = 
    perAHS_t1 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[1], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    scale_y_continuous(limits = c(50, 100), breaks = seq(50, 100, length.out = 6)) +
    # scale_x_continuous(limits = c(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score)), 
                       # breaks = seq(round(min(perAHS_t1$AHS_score)), round(max(perAHS_t1$AHS_score)), .5)) +
    # scale_y_continuous(limits = c(30, 100), 
    #                  breaks = c(seq(30, 100, 20))) +
    # scale_colour_manual(values = my_palette) + # does not add anything yet... 
    labs(# add all labels
       title = "Type 1",
       subtitle = expression(~italic(r)~'(117) = -.24,' ~italic(p)~'= .31'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
        # the "\n" here denote that you want a new line formed in the text
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))
# 
# theme(plot.title = element_text(color = "black", size = 14, face = "bold"), 
#         plot.subtitle = element_text(color = "black", size = 13), 
#         plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
#         legend.position = "none",
#         text = element_text(size = 25, color = "black"), 
#         axis.ticks.x = element_blank(), 
#         axis.text = element_text(color = "black"), 
#         axis.line = element_line(color = "black")
#         )

# Type 2
psych_scat2_all = 
    perAHS_t2 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[2], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    # scale_y_continuous(limits = c(40,100), breaks = seq(40, 100, length.out = 6)) +
    # scale_x_continuous(limits = c(3, 6), breaks = seq(3, 6, 1)) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t2$AHS_score), max(perAHS_t2$AHS_score)),
    #                    breaks = seq(min(perAHS_t2$AHS_score), max(perAHS_t2$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t2$per_acc_all), max(perAHS_t2$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t2$per_acc_all), max(perAHS_t2$per_acc_all), by = 10)) +
    labs(# add all labels
       title = "Type 2",
       subtitle = expression(~italic(r)~'(117) = -.14,' ~italic(p)~'= .57'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))

# Type 3
psych_scat3_all = 
    perAHS_t3 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[3], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    # scale_y_continuous(limits = c(40, 90), breaks = seq(40, 90, length.out = 6)) +
    # scale_x_continuous(limits = c(3, 6), breaks = seq(3, 6, 1)) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score)), 
    #                    breaks = seq(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t3$per_acc_all), max(perAHS_t3$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t3$per_acc_all), max(perAHS_t3$per_acc_all), by = 5)) +
    labs(# add all labels
       title = "Type 3",
       subtitle = expression(~italic(r)~'(117) = .28,' ~italic(p)~'= .15'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))

# Type 4
psych_scat4_all = 
    perAHS_t4 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[4], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    # scale_y_continuous(limits = c(30, 90), breaks = seq(30, 90, length.out = 6)) +
    # scale_x_continuous(limits = c(3, 6), breaks = seq(3, 6, 1)) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score)), 
    #                    breaks = seq(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1-10*", 
    #                    limits = c(min(perAHS_t4$per_acc_all), max(perAHS_t4$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t4$per_acc_all), max(perAHS_t4$per_acc_all), by = 10)) +
    labs(# add all labels
       title = "Type 4*",
       subtitle = expression(~italic(r)~'(117) = .61,' ~italic(p)~'= .01'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))

# Type 5
psych_scat5_all = 
    perAHS_t5 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[5], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    # scale_y_continuous(limits = c(40, 90), breaks = seq(40, 90, length.out = 6)) +
    # scale_x_continuous(limits = c(3, 6), breaks = seq(3, 6, 1)) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score)), 
    #                    breaks = seq(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t5$per_acc_all), max(perAHS_t5$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t5$per_acc_all), max(perAHS_t5$per_acc_all), by = 10)) +
    labs(# add all labels
       title = "Type 5",
       subtitle = expression(~italic(r)~'(117) = .03,' ~italic(p)~'= .92'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))

# Type 6
psych_scat6_all = 
    perAHS_t6 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_smooth(method = lm, color = my_palette[6], size = 1.5) + # Add linear regression line
    geom_point(stat = "identity", shape = 16, size = 1.5, show.legend = F) +
    # scale_y_continuous(limits = c(40, 70), breaks = seq(40, 70, length.out = 6)) +
    # scale_x_continuous(limits = c(3, 6), breaks = seq(3, 6, 1)) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score)), 
    #                    breaks = seq(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t6$per_acc_all), max(perAHS_t6$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t6$per_acc_all), max(perAHS_t6$per_acc_all), by = 5)) +
    labs(# add all labels
       title = "Type 6",
       subtitle = expression(~italic(r)~'(117) = .25,' ~italic(p)~'= .32'),
       # caption = "Note: ",
       x = "AHS Score",
       y = "Performance (%)") +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13, color = "black"), 
          axis.ticks = element_line(color = "black"), 
          axis.line = element_line(color = "black"), 
          axis.text = element_text(color = "black"))

# create figure caption
scatall_note = "Note: Performance across 10 blocks on Shepard, Hovland, and Jenkins (SHJ; 1961) types is measured in percent correct. Higher Analysis-Holism Scale (AHS) score depicts a more holistic thinking style. The coloured lines depict linear relationship. The shaded area represents a 95% confidence region. * p < .05"
scatall_note = paste0(strwrap(scatall_note, width = 90), collapse = "\n")

# display all scatter plots together - grouped by SHJ Type
psych_scats_all <- 
  grid.arrange(psych_scat1_all, psych_scat2_all, psych_scat3_all, psych_scat4_all, psych_scat5_all, psych_scat6_all,
               nrow = 2,
               top = text_grob("AHS Score vs. Performance by SHJ Type",
                               face = "bold", size = 20), # show text in bold
               bottom = text_grob(scatall_note,
                                  hjust = 0, # specify horizontal justification
                                  x = 0.05, # specify orientation on x-axis (bottom L = 0)
                                  face = "italic") # show text in italics
               )
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

# show plot
psych_scats_all
TableGrob (4 x 3) "arrange": 8 grobs
# export plot
  # title & caption removed
# ggsave(filename="scatter_fig_oct13-final", plot = psych_scats_all, device = "jpeg", height = 5, width = 8, units = "in", dpi = 1000)

Supplemental: Early, Middle, Late, and Across All Blocks

Lastly, we explored the data further by visualizing each comparison from above using scatter plots of the raw data. This was done for each SHJ category type (i.e., Type 1-6) for Early (B1-B3), Middle (B4-B7), Late (B8-B10), and Overall (B1-B10). Some things to keep in mind about the variables: - AHS score: - measures participant’s thinking style using 24 items on a 7-point likert scale: higher score depicts more holistic thinking - possible range: 0 - 168 - shown on the x-axis of all plots - SHJ performance: - measures percent correct for given block(s): Early (first block), B5 (middle block), B10 (last block), and B1-10 (collapsed across blocks) - possible range: 0% - 100% - shown on the y-axis of all plots - blocks

TYPE 1
(click to see code)
# For Type 1
  # EARLY performance vs. AHS score
  scat1_early = 
    perAHS_t1 %>%
    ggplot(aes(y = per_early_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # labs(title = "Performance on Block 1 versus AHS Score", # add if want to export fig alone
    #      subtitle = "\u03C4 = -.40, p = .02", 
    #      x = "Early Performance (%)", 
    #      y = "AHS Score", 
    #      caption = "Note: Performance is measured in percent correct. Higher AHS score depicts a \nmore holistic thinking style. Blue line depicts linear relationship. The shaded area \nrepresents a 95% confidence region."
    #      ) +
    # scale_x_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score)), 
    #                    breaks = seq(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score), by = 6)) +
    # scale_y_continuous(name = "Early (B1-3)", 
    #                    limits = c(min(perAHS_t1$per_early_acc), max(perAHS_t1$per_early_acc)), 
    #                    breaks = seq(min(perAHS_t1$per_early_acc), max(perAHS_t1$per_early_acc), by = 20)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # MIDDLE performance vs. AHS score
  scat1_middle = 
    perAHS_t1 %>%
    ggplot(aes(y = per_mid_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_x_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score)), 
    #                    breaks = seq(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score), by = 6)) +
    # scale_y_continuous(name = "Middle (B4-7)", 
    #                    limits = c(min(perAHS_t1$per_mid_acc), max(perAHS_t1$per_mid_acc)), 
                       # breaks = seq(min(perAHS_t1$per_mid_acc), max(perAHS_t1$per_mid_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # LATE performance vs. AHS score
  scat1_late = 
    perAHS_t1 %>%
    ggplot(aes(y = per_late_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_x_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score)), 
    #                    breaks = seq(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score), by = 6)) +
    # scale_y_continuous(name = "Late (B8-10)", 
    #                    limits = c(min(perAHS_t1$per_late_acc), max(perAHS_t1$per_late_acc)), 
    #                    breaks = seq(min(perAHS_t1$per_late_acc), max(perAHS_t1$per_late_acc), by = 5)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B1-10 performance vs. AHS score
  scat1_all2 = 
    perAHS_t1 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_x_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score)), 
    #                    breaks = seq(min(perAHS_t1$AHS_score), max(perAHS_t1$AHS_score), by = 6)) +
    # scale_y_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t1$per_acc_all), max(perAHS_t1$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t1$per_acc_all), max(perAHS_t1$per_acc_all), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

TYPE 2
(click to see code)
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

TYPE 3
(click to see code)
# For Type 3
  # Early performance vs. AHS score
  scat3_early = 
    perAHS_t3 %>%
    ggplot(aes(y = per_early_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # labs(title = "Performance on Block 1 versus AHS Score", # add if want to export fig alone
    #      subtitle = "\u03C4 = -.40, p = .02", 
    #      x = "Early Performance (%)", 
    #      y = "AHS Score", 
    #      caption = "Note: Performance is measured in percent correct. Higher AHS score depicts a \nmore holistic thinking style. Blue line depicts linear relationship. The shaded area \nrepresents a 95% confidence region."
    #      ) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score)), 
    #                    breaks = seq(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1", 
    #                    limits = c(min(perAHS_t3$per_early_acc), max(perAHS_t3$per_early_acc)), 
    #                    breaks = seq(min(perAHS_t3$per_early_acc), max(perAHS_t3$per_early_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B5 performance vs. AHS score
  scat3_middle = 
    perAHS_t3 %>%
    ggplot(aes(y = per_mid_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score)), 
    #                    breaks = seq(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score), by = 10)) +
    # scale_x_continuous(name = "Middle*", 
    #                    limits = c(min(perAHS_t3$per_mid_acc), max(perAHS_t3$per_mid_acc)), 
    #                    breaks = seq(min(perAHS_t3$per_mid_acc), max(perAHS_t3$per_mid_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B10 performance vs. AHS score
  scat3_late = 
    perAHS_t3 %>%
    ggplot(aes(y = per_late_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score)), 
    #                    breaks = seq(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score), by = 10)) +
    # scale_x_continuous(name = "Late", 
    #                    limits = c(min(perAHS_t3$per_late_acc), max(perAHS_t3$per_late_acc)), 
    #                    breaks = seq(min(perAHS_t3$per_late_acc), max(perAHS_t3$per_late_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B1-10 performance vs. AHS score
  scat3_all = 
    perAHS_t3 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score)), 
    #                    breaks = seq(min(perAHS_t3$AHS_score), max(perAHS_t3$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t3$per_acc_all), max(perAHS_t3$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t3$per_acc_all), max(perAHS_t3$per_acc_all), by = 5)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

TYPE 4
(click to see code)
# For Type 4
  # Early performance vs. AHS score
  scat4_early = 
    perAHS_t4 %>%
    ggplot(aes(y = per_early_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # labs(title = "Performance on Block 1 versus AHS Score", # add if want to export fig alone
    #      subtitle = "\u03C4 = -.40, p = .02", 
    #      x = "Early Performance (%)", 
    #      y = "AHS Score", 
    #      caption = "Note: Performance is measured in percent correct. Higher AHS score depicts a \nmore holistic thinking style. Blue line depicts linear relationship. The shaded area \nrepresents a 95% confidence region."
    #      ) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score)), 
    #                    breaks = seq(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1", 
    #                    limits = c(min(perAHS_t4$per_early_acc), max(perAHS_t4$per_early_acc)), 
    #                    breaks = seq(min(perAHS_t4$per_early_acc), max(perAHS_t4$per_early_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B5 performance vs. AHS score
  scat4_middle = 
    perAHS_t4 %>%
    ggplot(aes(y = per_mid_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score)), 
    #                    breaks = seq(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score), by = 10)) +
    # scale_x_continuous(name = "Middle", 
    #                    limits = c(min(perAHS_t4$per_mid_acc), max(perAHS_t4$per_mid_acc)), 
    #                    breaks = seq(min(perAHS_t4$per_mid_acc), max(perAHS_t4$per_mid_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B10 performance vs. AHS score
  scat4_late = 
    perAHS_t4 %>%
    ggplot(aes(y = per_late_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score)), 
    #                    breaks = seq(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score), by = 10)) +
    # scale_x_continuous(name = "Late", 
    #                    limits = c(min(perAHS_t4$per_late_acc), max(perAHS_t4$per_late_acc)), 
    #                    breaks = seq(min(perAHS_t4$per_late_acc), max(perAHS_t4$per_late_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B1-10 performance vs. AHS score
  scat4_all = 
    perAHS_t4 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score)), 
    #                    breaks = seq(min(perAHS_t4$AHS_score), max(perAHS_t4$AHS_score), by = 10)) +
    # scale_x_continuous(name = "B1-10*", 
    #                    limits = c(min(perAHS_t4$per_acc_all), max(perAHS_t4$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t4$per_acc_all), max(perAHS_t4$per_acc_all), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

TYPE 5
(click to see code)
# For Type 5
  # Early performance vs. AHS score
  scat5_early = 
    perAHS_t5 %>%
    ggplot(aes(y = per_early_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # labs(title = "Performance on Block 1 versus AHS Score", # add if want to export fig alone
    #      subtitle = "\u03C4 = -.40, p = .02", 
    #      x = "Early Performance (%)", 
    #      y = "AHS Score", 
    #      caption = "Note: Performance is measured in percent correct. Higher AHS score depicts a \nmore holistic thinking style. Blue line depicts linear relationship. The shaded area \nrepresents a 95% confidence region."
    #      ) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score)), 
    #                    breaks = seq(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1", 
    #                    limits = c(min(perAHS_t5$per_early_acc), max(perAHS_t5$per_early_acc)), 
    #                    breaks = seq(min(perAHS_t5$per_early_acc), max(perAHS_t5$per_early_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B5 performance vs. AHS score
  scat5_middle = 
    perAHS_t5 %>%
    ggplot(aes(y = per_mid_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score)), 
    #                    breaks = seq(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score), by = 6)) +
    # scale_x_continuous(name = "Middle", 
    #                    limits = c(min(perAHS_t5$per_mid_acc), max(perAHS_t5$per_mid_acc)), 
    #                    breaks = seq(min(perAHS_t5$per_mid_acc), max(perAHS_t5$per_mid_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B10 performance vs. AHS score
  scat5_late = 
    perAHS_t5 %>%
    ggplot(aes(y = per_late_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score)), 
    #                    breaks = seq(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score), by = 6)) +
    # scale_x_continuous(name = "Late", 
    #                    limits = c(min(perAHS_t5$per_late_acc), max(perAHS_t5$per_late_acc)), 
    #                    breaks = seq(min(perAHS_t5$per_late_acc), max(perAHS_t5$per_late_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B1-10 performance vs. AHS score
  scat5_all = 
    perAHS_t5 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score)), 
    #                    breaks = seq(min(perAHS_t5$AHS_score), max(perAHS_t5$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t5$per_acc_all), max(perAHS_t5$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t5$per_acc_all), max(perAHS_t5$per_acc_all), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

TYPE 6
(click to see code)
# For Type 6
  # Early performance vs. AHS score
  scat6_early = 
    perAHS_t6 %>%
    ggplot(aes(y = per_early_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # labs(title = "Performance on Block 1 versus AHS Score", # add if want to export fig alone
    #      subtitle = "\u03C4 = -.40, p = .02", 
    #      x = "Early Performance (%)", 
    #      y = "AHS Score", 
    #      caption = "Note: Performance is measured in percent correct. Higher AHS score depicts a \nmore holistic thinking style. Blue line depicts linear relationship. The shaded area \nrepresents a 95% confidence region."
    #      ) +
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score)), 
    #                    breaks = seq(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1", 
    #                    limits = c(min(perAHS_t6$per_early_acc), max(perAHS_t6$per_early_acc)), 
    #                    breaks = seq(min(perAHS_t6$per_early_acc), max(perAHS_t6$per_early_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B5 performance vs. AHS score
  scat6_middle =
    perAHS_t6 %>%
    ggplot(aes(y = per_mid_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score)), 
    #                    breaks = seq(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score), by = 6)) +
    # scale_x_continuous(name = "Middle", 
    #                    limits = c(min(perAHS_t6$per_mid_acc), max(perAHS_t6$per_mid_acc)), 
    #                    breaks = seq(min(perAHS_t6$per_mid_acc), max(perAHS_t6$per_mid_acc), by = 10)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B10 performance vs. AHS score
  scat6_late = 
    perAHS_t6 %>%
    ggplot(aes(y = per_late_acc, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score)), 
    #                    breaks = seq(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score), by = 6)) +
    # scale_x_continuous(name = "Late", 
    #                    limits = c(min(perAHS_t6$per_late_acc), max(perAHS_t6$per_late_acc)), 
    #                    breaks = seq(min(perAHS_t6$per_late_acc), max(perAHS_t6$per_late_acc), by = 15)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
  
  # B1-10 performance vs. AHS score
  scat6_all = 
    perAHS_t6 %>%
    ggplot(aes(y = per_acc_all, x = AHS_score)) +
    geom_point(stat = "identity", shape = 16, size = 1, show.legend = F) +
    geom_smooth(method = lm) + # Add linear regression line
    # scale_y_continuous(name = "AHS Score",
    #                    limits = c(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score)), 
    #                    breaks = seq(min(perAHS_t6$AHS_score), max(perAHS_t6$AHS_score), by = 6)) +
    # scale_x_continuous(name = "B1-10", 
    #                    limits = c(min(perAHS_t6$per_acc_all), max(perAHS_t6$per_acc_all)), 
    #                    breaks = seq(min(perAHS_t6$per_acc_all), max(perAHS_t6$per_acc_all), by = 5)) +
    theme_classic() + 
    theme(plot.title = element_text(color = "black", size = 14, face = "bold"),
          plot.subtitle = element_text(color = "black", size = 13),
          plot.caption = element_text(hjust = 0, size = 12, face = "italic"),
          text = element_text(size = 13))
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'
`geom_smooth()` using formula 'y ~ x'

LS0tCnRpdGxlOiAiSW52ZXN0aWdhdGluZyBDYXRlZ29yeSBMZWFybmluZyBpbiBhbiBPbmxpbmUgUGxhdGZvcm06IFRoZSBSZWxhdGlvbnNoaXAgYmV0d2VlbiBBbmFseXRpYyBhbmQgSG9saXN0aWMgVGhpbmtpbmcgU3R5bGVzIgpzdWJ0aXRsZTogIlBzeWNob25vbWljIFNvY2lldHkgMjAyMSBBbm51YWwgTWVldGluZyAtIFBvc3RlciBTZXNzaW9uIEk6IENvbmNlcHRzIGFuZCBDYXRlZ29yaWVzIgphdXRob3I6ICJBLiBDLiBSdWl6IFBhcmRvLCBOLiBLaGVtYW5pLCBNLiBHaGFpLCBaLiBHaHVsYW1odXNzYWluLCBDLiBNY0tlbnppZSwgJiBEci4gSi4gUC4gTWluZGEiIApkYXRlOiAiTm92IDUsIDIwMjEiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICc2JwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogbHVtZW4gCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnNicKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IGx1bWVuIAogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE1cHg7fQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDE0cHg7fQpoMS50aXRsZSB7CiAgZm9udC1zaXplOiA0MHB4OwogIGNvbG9yOiAjNWIzNzg5ZmY7CiAgZm9udC13ZWlnaHQ6IGJvbGR9CmgxIHsgLyogSGVhZGVyIDEgKi8KICBmb250LXNpemU6IDM1cHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9CmgyIHsgLyogSGVhZGVyIDIgKi8KICBmb250LXNpemU6IDMzcHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9CmgzIHsgLyogSGVhZGVyIDMgKi8KICBmb250LXNpemU6IDMxcHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9Cmg0IHsgLyogSGVhZGVyIDQgKi8KICBmb250LXNpemU6IDI5cHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9Cmg1IHsgLyogSGVhZGVyIDUgKi8KICBmb250LXNpemU6IDI3cHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9Cmg2IHsgLyogSGVhZGVyIDYgKi8KICBmb250LXNpemU6IDI1cHg7CiAgY29sb3I6ICM1YjM3ODlmZjt9Cgo8L3N0eWxlPgoKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+IAoKYGBge3IgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UpCmBgYAoKCiFbXSgvVXNlcnMvYW5hY2VjaWxpYXJ1aXpwYXJkby9SU3R1ZGlvL0NvbmNlcHRzLCBDYXRlZ29yaWVzLCBhbmQgQ3VsdHVyYWwgVW5pdmVyc2Fscy9TSEogUGlsb3QgLSBVV08gU2FtcGxlICgwNDoyMDoyMSkvcHN5Y2hvbm9taWNzX3Bvc3Rlcl8yMDIxX29jdDE1LnBuZykKCipOT1RFOiBUaGlzIGRvY3VtZW50IGV4dGVuZHMgdGhlIHBvc3RlciBwcmVzZW50ZWQgYXQgdGhlIEFubnVhbCBQc3ljaG9ub21pY3MgU29jaWV0eSBNZWV0aW5nICgyMDIxKS4qClwKCiMgQWJzdHJhY3QKCldlIGV4cGxvcmVkIHRoZSB1bml2ZXJzYWxpdHkgb2YgY2F0ZWdvcnkgbGVhcm5pbmcgYnkgdXNpbmcgYW4gb25saW5lIHBsYXRmb3JtIHRvIHRlc3QgdHlwaWNhbCBjYXRlZ29yeSBsZWFybmluZyBiZWhhdmlvdXIuIFRoZSBnb2FsIG9mIHRoaXMgcHJvamVjdCB3YXMgdG8gaW52ZXN0aWdhdGUgd2hldGhlciB0eXBpY2FsIGNhdGVnb3J5IGxlYXJuaW5nIGluIGEgcHJldmlvdXNseSBleHBsb3JlZCBwb3B1bGF0aW9uIGNhbiBiZSBzZWVuIHVzaW5nIGFuIG9ubGluZSBwbGF0Zm9ybSByYXRoZXIgdGhhbiBhbiBpbi1wZXJzb24vbGFiIG1ldGhvZC4gUGFydGljaXBhbnRzIGxlYXJuZWQgb25lIG9mIHRoZSBzaXggY2xhc3NpZmljYXRpb24gdGFza3MgZmlyc3QgZGVzY3JpYmVkIGJ5IFNoZXBhcmQgZXQgYWwuICgxOTYxKSB3aGljaCB0ZXN0ZWQgdGhlIHJlbGlhbmNlIG9uIHNpbmdsZSBmZWF0dXJlIHJ1bGVzLCBkaXNqdW5jdGl2ZSBydWxlcywgYW5kIGZhbWlseSByZXNlbWJsYW5jZSwgYW5kIHRoZXkgY29tcGxldGVkIGEgbWVhc3VyZSBvZiB0aGVpciB0aGlua2luZyBzdHlsZSAoYW5hbHl0aWMgdnMuIGhvbGlzdGljKS4gV2UgaHlwb3RoZXNpemVkIHRoYXQgY2F0ZWdvcmllcyB0aGF0IGNhbiBiZSBsZWFybmVkIHVzaW5nIGEgc2luZ2xlIHN0cmF0ZWd5IHdvdWxkIGJlIGxlYXJuZWQgbW9yZSBlYXNpbHkgYnkgdGhvc2Ugd2l0aCBhbiBhbmFseXRpYyB0aGlua2luZyBzdHlsZSwgd2hlcmVhcyBjb25jZXB0cyB0aGF0IGNhbiBiZSBhY3F1aXJlZCBpbiBtb3JlIHRoYW4gb25lIHdheSB3aWxsIHNob3cgYSBwcmVmZXJlbmNlIGZvciBob2xpc3RpYyB0aGlua2luZyBzdHlsZS4gV2UgZm91bmQgdGhhdCBwYXJ0aWNpcGFudHMgd2l0aCBhIHByZWZlcmVuY2UgZm9yIGhvbGlzdGljIGNvZ25pdGlvbiBsZWFybmVkIGZhbWlseSByZXNlbWJsYW5jZSBjb25jZXB0cyBtb3JlIGVhc2lseSB0aGFuIHBhcnRpY2lwYW50cyB3aXRoIGEgcHJlZmVyZW5jZSBmb3IgYW5hbHl0aWMgY29nbml0aW9uLiBUaGlzIHByb2plY3QgcHJvdmlkZXMgdmFsdWFibGUgaW5zaWdodHMgdG8gdGhlIGNhdGVnb3J5IGxlYXJuaW5nIGxpdGVyYXR1cmUgYnkgZGVtb25zdHJhdGluZyBob3cgYW4gb25saW5lIHBsYXRmb3JtIGNhbiBwcm92aWRlIGEgbmV3IGdhdGV3YXkgdG8gYmV0dGVyIGFuZCBtb3JlIHJlcHJlc2VudGF0aXZlIGRhdGEuCgoqKlByZXNlbnRlcnM6KioKCi0gQW5hIFJ1aXogUGFyZG8sIE1TYywgV2VzdGVybiBVbml2ZXJzaXR5LCBhcnVpenBhckB1d28uY2EKLSBOZWhhIEtoZW1hbmksIFdlc3Rlcm4gVW5pdmVyc2l0eQoKKktleXdvcmRzOiBBbmFseXRpYyBUaGlua2luZywgQ2F0ZWdvcnkgTGVhcm5pbmcsIEhvbGlzdGljIFRoaW5raW5nKgoKCiMgQW5hbHlzaXMgUHJlcCAgCgojIyBMb2FkIFJlcXVpcmVkIExpYnJhcmllcwoKPGRldGFpbHM+Cgo8c3VtbWFyeT4gVGhlIGZvbGxvd2luZyBwYWNrYWdlcyB3ZXJlIHVzZWQgdG8gY29tcGxldGUgdGhlIGFuYWx5c2VzLCB2aXN1YWxpemF0aW9ucywgZXRjLiBpbiB0aGlzIGRvY3VtZW50LiAqKGNsaWNrIHRvIGV4cGFuZCkqIDwvc3VtbWFyeT4KCmBgYHtyIGxvYWQgbGlicmFyaWVzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHRpYmJsZSkKbGlicmFyeShwbHlyKSAjIGZvciBkYXRhIHdyYW5nbGluZwpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgZGF0YSB3cmFuZ2xpbmcKbGlicmFyeShnZ3Bsb3QyKSAjIHRvIHBsb3QgZmlndXJlcwpsaWJyYXJ5KHBzeWNoKSAjIGZvciBzdGF0cywgZGVzY3JpYmUsIGV0Yy4KbGlicmFyeShIbWlzYykgIyBmb3IgZGVzY3JpcHRpdmUgc3RhdHMKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKSAjIHRvIHNob3cgdGFibGVzCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAjIHRvIGN1c3RvbWl6ZSB0aGUgY29sb3IgcGFsZXR0ZXMgb2YgZGlmZmVyZW50IHZpc3VhbGl6YXRpb25zIApsaWJyYXJ5KCJnZ3B1YnIiKSAjIGZvciBjb3JyZWxhdGlvbiB2aXN1YWxpemF0aW9ucwpsaWJyYXJ5KHN0YXRzKSAjIHRvIHJ1biBjb3JyZWxhdGlvbiBhbmFseXNlcwpsaWJyYXJ5KGdyaWRFeHRyYSkgIyB0byBkaXNwbGF5IG11bHRpcGxlIHBsb3RzIHRvZ2V0aGVyCmxpYnJhcnkoZ2dwdWJyKSAjIHRvIGFkZCBjdXN0b20gdGV4dCB0byBmaWd1cmVzCmxpYnJhcnkoZHBseXIpICMgZm9yIGRhdGEgd3JhbmdsaW5nCmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBsaWJyYXJ5KGRhdGEudGFibGUpICMgdG8gdXNlIHRoZSBmcmVhZCBmdW5jdGlvbgojIGxpYnJhcnkocmVhZHIpCiMgbGlicmFyeShkZXZ0b29scykKIyBsaWJyYXJ5KHNjaG9Sc2NoKQojIGxpYnJhcnkobGF0dGljZSkKIyBsaWJyYXJ5KGNhcikKIyBsaWJyYXJ5KGtuaXRyLmthYmxlcikKIyBsaWJyYXJ5KG1hZ3JpdHRyKQojIGxpYnJhcnkoZXopCiMgbGlicmFyeShyc3RhdGl4KQojIGxpYnJhcnkocHVycnIpCiMgbGlicmFyeShGb3JtdWxhKQojIGxpYnJhcnkoc3Vydml2YWwpCiMgbGlicmFyeShEZXNjVG9vbHMpCiMgbGlicmFyeShHUEFyb3RhdGlvbikKIyBsaWJyYXJ5KGFwYVRhYmxlcykKYGBgCgo8L2RldGFpbHM+CgojIyBBZGRpdGlvbmFsIEZ1bmN0aW9ucwoKIyMjIFJvdW5kaW5nIHAtdmFsdWVzCgo8ZGV0YWlscz4KCjxzdW1tYXJ5PiBUaGlzIHJvdW5kaW5nIGZ1bmN0aW9uIHdhcyBhZGFwdGVkIGZyb20gW0RyLiBFLiBOaWVsc2VuJ3MgUnB1YnNdKGh0dHBzOi8vcnB1YnMuY29tL2VnbmllbHNlbikuIFRoZSBmdW5jdGlvbiAoIioqcF9yb3VuZCh4KSoqIikgd2FzIGNyZWF0ZWQgdG8gYXNzZXNzIGFuZCBwcmludCBwLXZhbHVlcy4gSWYgJHAgXGdlIC4wMDUkLCB0aGUgZnVuY3Rpb24gd2lsbCBkaXNwbGF5IOKAnCRwID0gJOKAnSBhbmQgdGhlIHZhbHVlIHJvdW5kZWQgdG8gdHdvIGRlY2ltYWwgcGxhY2VzLiBJZiAkIC4wMDA1IFxsZSBwIDwuMDA1JCwgdGhlIGZ1bmN0aW9uIHdpbGwgZGlzcGxheSDigJwkcCA9ICTigJ0gYW5kIHRoZSB2YWx1ZSByb3VuZGVkIHRvIHRocmVlIGRlY2ltYWwgcGxhY2VzLiBJZiAkcCA8IC4wMDA1JCwgdGhlIGZ1bmN0aW9uIHdpbGwgZGlzcGxheSDigJwkcCA8IC4wMDEk4oCdLiAqKGNsaWNrIHRvIGV4cGFuZCkqIDwvc3VtbWFyeT4gCgpgYGB7ciBwX3JvdW5kIGZ1bmN0aW9ufQoKcF9yb3VuZCA8LSBmdW5jdGlvbih4KXsKICBpZih4ID4gLjAwNSkKICAgIHt4MSA9IChwYXN0ZSgiPSAiLCBnc3ViKCIwXFwuIiwiXFwuIiwgcm91bmQoeCwgZGlnaXRzID0gMikpLCBzZXAgPSAnJykpCiAgfSAgCiAgZWxzZSBpZih4ID09IC4wMDUpe3gxID0gKHBhc3RlKCI9IiwgZ3N1YigiMFxcLiIsIlxcLiIsIDAuMDEpKSkKICB9CiAgZWxzZSBpZih4ID4gLjAwMDUgJiB4IDwgLjAwNSkKICAgIHt4MSA9IChwYXN0ZSgiPSAiLCBnc3ViKCIwXFwuIiwiXFwuIiwgcm91bmQoeCwgZGlnaXRzID0gMykpLCBzZXAgPSAnJykpCiAgfSAgCiAgZWxzZSBpZih4ID09IC4wMDA1KXt4MSA9IChwYXN0ZSgiPSIsIGdzdWIoIjBcXC4iLCJcXC4iLCAwLjAwMSkpKQogIH0KICBlbHNle3gxID0gKHBhc3RlKCI8IiwgZ3N1YigiMFxcLiIsIlxcLiIsIDAuMDAxKSkpCiAgfSAKICAoeDEpCn0KCmBgYAoKPC9kZXRhaWxzPgoKIyMgUmF3IERhdGEgIApUaGVyZSBhcmUgKip0d28qKiByYXcgZGF0YSBmaWxlcyB0aGF0IHdlcmUgaW1wb3J0ZWQgZm9yIHRoZSBwcmVzZW50IHN0dWR5IChzZWUgdGhlICpJbXBvcnQgUmF3IERhdGEqIHNlY3Rpb24pLiAgCgoqKlRhc2sgRGF0YSoqICAKCjEuIFNISiBSYXcgRGF0YSAgCiAgICAtIHBzeWNob3B5IGV4Y2VsIGZpbGVzIAogICAgLSAqTm90ZToqIHJhdyBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSBtdWx0aXBsZSBleGNlbCBmaWxlcyBpbnRvIG9uZSBmaWxlIChzZWUgdGhlICpJbXBvcnQgUmF3IERhdGEqIHNlY3Rpb24pICAKCioqU3VydmV5IE1lYXN1cmVzKiogIAoKMi4gRGVtb2dyYXBoaWMgJiBBSFMgUmF3IERhdGEgIAogICAgLSBjc3YgZmlsZSBleHBvcnRlZCBmcm9tIFF1YWx0cmljcwoKCiMjIyBJbXBvcnQgUmF3IERhdGEgIAojIyMjIDEuIFNISiBSYXcgRGF0YSAgCjxkZXRhaWxzPiAgCgo8c3VtbWFyeT4gVGhlICoqU0hKIFJhdyBEYXRhKiogd2FzIGNvbGxlY3RlZCB1c2luZyBQc3ljaG9weSAodmVyc2lvbjogKioyMDIxLjEuMioqKS4gRWFjaCBwYXJ0aWNpcGFudCdzIGRhdGEgd2FzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGV4Y2VsIGZpbGUuIFRoZSBmb2xsb3dpbmcgY29kZSBpbXBvcnRzIGFuZCByZS1vcmdhbml6ZWQgdGhlIHJhdyBkYXRhIGludG8gYSBzaW5nbGUgd2lkZSBmb3JtYXQgKGkuZS4sICIqKlNISl9XKioiKSBhbmQgbG9uZyBmb3JtYXQgKGkuZS4sICIqKlNISl9MKioiKSBvZiB0aGUgZGF0YSBhcyBhIHRpYmJsZS4gKihjbGljayB0byBzZWUgZGVzY3JpcHRpb25zKSogPC9zdW1tYXJ5PiAgCgpBREQgQSBERVNDUklQVElPTiBIRVJFIAoKPC9kZXRhaWxzPiAKPC9kZXRhaWxzPiAKCjxkZXRhaWxzPgo8c3VtbWFyeT4gVGhpcyBjb2RlIGltcG9ydGVkIGFuZCBvcmdhbml6ZWQgdGhlIFNISiByYXcgZGF0YSBpbiBhIHdpZGUgZm9ybWF0IGluY2x1ZGluZyB0aGUgdmFyaWFibGVzOiBJRCwgdGFzaywgdHlwZSwgc3VidHlwZSwgZGF0ZSwgT1MsIGZyYW1lUmF0ZSwgYWNjdXJhY3kgcGVyIGJsb2NrIChlLmcuLCAiYWNjdXJhY3lCMSIuLi4iYWNjdXJhY3lCMTAiKSwgYWNjdXJhY3kgcGVyIHRyaWFsIChlLmcuLCAiYWNjMSIuLi4iYWNjODAiKSwgUlQgcGVyIGJsb2NrIChlLmcuLCAiUlRCMSIuLi4iUlRCMTAiKSwgUlQgcGVyIHRyaWFsIChlLmcuLCAiUlQxIi4uLiJSVDgwIikuIEVhY2ggcGFydGljaXBhbnQncyBwZXJmb3JtYW5jZSBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSByb3cuICooY2xpY2sgdG8gZXhwYW5kKSogPC9zdW1tYXJ5PgoKYGBge3IgaW1wb3J0X3Noal9XLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKIy0tLVdJREUgREFUQSBGUkFNRS0tLSJTSEpfVyIgIAoKIy0tVGhpcyBjb2RlIGNvbXBsZXRlcyB0aGUgZm9sbG93aW5nIHRhc2tzOgojICgxKSBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIGFsbCBwc3ljaG9weSBmaWxlcyBhdCBvbmNlCiMgKDIpIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkaXJlY3RvcnkgcGF0aHMgdG8gZWFjaCBpbmRpdmlkdWFsIGZpbGUgCiMgKDMpIEFwcGx5IHRoZSBmdW5jdGlvbiB0byB0aGUgZmlsZXMgCiMgKDQpIENyZWF0ZSBhIHRpYmJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBvbiB0aGUgZmlsZXMKCiMtLVRoZSBGSU5BTCBPVVRQVVQgPSBhIHdpZGUgZm9ybWF0IG9mIHRoZSByYXcgU0hKIGRhdGEgaW5jbHVkaW5nOgojIElELCB0YXNrLCB0eXBlLCBzdWJ0eXBlLCBkYXRlLCBPUywgZnJhbWVSYXRlLCBhY2N1cmFjeSBwZXIgYmxvY2sgKGUuZy4sICJhY2N1cmFjeUIxIi4uLiJhY2N1cmFjeUIxMCIpLCBhY2N1cmFjeSBwZXIgdHJpYWwgKGUuZy4sICJhY2MxIi4uLiJhY2M4MCIpLCBSVCBwZXIgYmxvY2sgKGUuZy4sICJSVEIxIi4uLiJSVEIxMCIpLCBSVCBwZXIgdHJpYWwgKGUuZy4sICJSVDEiLi4uIlJUODAiKQoKIy0tTk9URVM6CgojIFN0ZXAgKDMpIHdpbGwgZ2l2ZSB3YXJuaW5ncyBpZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBkYXRhIHRoYXQgdGhlIGZ1bmN0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGhvdyB0byBoYW5kbGUKIyBleGFtcGxlOiBBbnkgcGFydGljaXBhbnQgdGhhdCBkaWQgbm90IHJlc3BvbmQgdG8gYW4gaXRlbSBvciBkdXJpbmcgYWxsIHRyaWFscyB3aWxsIGhhdmUgYW4gIk5BIiByZXNwb25zZSBpbiB0aGUgZGF0YQoKIyBJbmRpdmlkdWFsIHBhcnRpY2lwYW50IGZpbGVzIGRvIG5vdCBzdGF5IGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgCiMgKHRoZXkgYXJlIHJlLW9yZGVyZWQgc28gdGhhdCBhbGwgcHMgdGhhdCBzdGFydCB3aXRoIHRoZSBkaWdpdCAiMSIgZ28gZmlyc3QsIHRoZW4gdGhlICIyIi4uLikKCiMtLSgxKSBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIGFsbCBwc3ljaG9weSBmb2xkZXJzIGF0IG9uY2UKCiMgY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZyb20gZWFjaCBleGNlbCBmaWxlCiMgZGV0YWlscyBmb3Igd2hhdCBpcyBleHRyYWN0ZWQgaW4gdGhpcyBmdW5jdGlvbiBpcyBmb3VuZCB3aXRoaW4gaXQsIAojIHRvIHVzZSBpdCB0byBleHRyYWN0IGFueSBvdGhlciAmLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBlZGl0IHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmCgojIHRlbXBfZGF0YSA8LSByZWFkcjo6cmVhZF9jc3YoJy9Vc2Vycy9hbmFjZWNpbGlhcnVpenBhcmRvL1JTdHVkaW8vQ29uY2VwdHMsIENhdGVnb3JpZXMsIGFuZCBDdWx0dXJhbCBVbml2ZXJzYWxzL1NISiBQaWxvdCAtIFVXTyBTYW1wbGUgKDA0OjIwOjIxKS9TSEpfdGVzdC5jc3YnKQoKZXh0cmFjdF9zaGpfVyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAjIHRlbXBfZGF0YSA9IHJlYWRyOjpyZWFkX2NzdihkYXRhKQogIAogICNpZiB0ZW1wX2RhdGEKICBpZiAoZmlsZS5zaXplKGRhdGEpID4gMTQpIHsKICAgICAgICB0ZW1wX2RhdGEgPC0gcmVhZF9jc3YoZGF0YSkKICAKICAKICAjIHRyYW5zcG9zZSBkYXRhIHNvIHRoYXQgZWFjaCB0cmlhbCBpcyBhbiBpbmRpdmlkdWFsIGNvbHVtbiBmb3I6ICgxKSBhY2N1cmFjeSAmICgyKSBSVAogICAgYWNjdXJhY3kgPC0gYXNfdGliYmxlKHJiaW5kKHRlbXBfZGF0YSR0cmlhbF9yZXNwLmNvcnIpKQogICAgICAjIGFkZCBwcmVmaXggdG8gY29sdW1ucwogICAgICBuYW1lcyhhY2N1cmFjeSkgPC0gZ3N1YigiViIsICJhY2MiLCBuYW1lcyhhY2N1cmFjeSkpICAKICAgIAogICAgUlQgPC0gYXNfdGliYmxlKHJiaW5kKHRlbXBfZGF0YSR0cmlhbF9yZXNwLnJ0KSkKICAgICAgIyBhZGQgcHJlZml4IHRvIGNvbHVtbnMKICAgICAgbmFtZXMoUlQpIDwtIGdzdWIoIlYiLCAiUlQiLCBuYW1lcyhSVCkpICAKICAgIAogICMgY3JlYXRlIGEgdGliYmxlIHdpdGggdGhlIHZhcmlhYmxlcyBpbiBxdWVzdGlvbgogIHRlbXBfdGliYmxlIDwtIGFzX3RpYmJsZShjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmlxdWUgSUQKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kYXRhWzEsIkVudGVyIHlvdXIgVU5JUVVFIElEIChUaGUgbGFzdCB0d28gZGlnaXRzIG9mIHlvdXIgcGhvbmUgbnVtYmVyLCB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIHlvdXIgYmlydGggeWVhciwgYW5kIHRoZSBmaXJzdCB0d28gbGV0dGVycyBvZiB0aGUgc3RyZWV0IG9uIHdoaWNoIHlvdSBsaXZlKSoiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXNrCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGF0YVsxLCJ0YXNrIl0sIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyB0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGF0YVsxLCJ0eXBlIl0sIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBzdWJ0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGF0YVsxLCAic3VidHlwZSJdLCAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2RhdGFbMSwgImRhdGUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgT1MKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kYXRhWzEsICJPUyJdLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBmcmFtZVJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kYXRhWzEsICJmcmFtZVJhdGUiXSwgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDEgYXZlcmFnZSBhY2N1cmFjeSAoaS5lLiwgdHJpYWxzIDEtOCkKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCMSAgPSBzdW0oYWNjdXJhY3lbLDE6OF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayAyIGF2ZXJhZ2UgYWNjdXJhY3kgKGkuZS4sIHRyaWFscyA5LTE2KQogICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeUIyICA9IHN1bShhY2N1cmFjeVssOToxNl0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayAzIGF2ZXJhZ2UgYWNjdXJhY3kgKGkuZS4sIHRyaWFscyAxNy0yNCkKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCMyAgPSBzdW0oYWNjdXJhY3lbLDE3OjI0XSksCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDQgYXZlcmFnZSBhY2N1cmFjeSAoaS5lLiwgdHJpYWxzIDI1LTMyKQogICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeUI0ICA9IHN1bShhY2N1cmFjeVssMjU6MzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgNSBhdmVyYWdlIGFjY3VyYWN5IChpLmUuLCB0cmlhbHMgMzMtNDApCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5QjUgID0gc3VtKGFjY3VyYWN5WywzMzo0MF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayA2IGF2ZXJhZ2UgYWNjdXJhY3kgKGkuZS4sIHRyaWFscyA0MS00OCkKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCNiAgPSBzdW0oYWNjdXJhY3lbLDQxOjQ4XSksCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDcgYXZlcmFnZSBhY2N1cmFjeSAoaS5lLiwgdHJpYWxzIDQ5LTU2KQogICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeUI3ICA9IHN1bShhY2N1cmFjeVssNDk6NTZdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgOCBhdmVyYWdlIGFjY3VyYWN5IChpLmUuLCB0cmlhbHMgNTctNjQpCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5QjggID0gc3VtKGFjY3VyYWN5Wyw1Nzo2NF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayA5IGF2ZXJhZ2UgYWNjdXJhY3kgKGkuZS4sIHRyaWFscyA2NS03MikKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCOSAgPSBzdW0oYWNjdXJhY3lbLDY1OjcyXSksCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDEwIGF2ZXJhZ2UgYWNjdXJhY3kgKGkuZS4sIHRyaWFscyA3My04MCkKICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCMTAgID0gc3VtKGFjY3VyYWN5Wyw3Mzo4MF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBhY2N1cmFjeSAoZm9yIHRyaWFsIDEtODApCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5LCAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgMSBhdmVyYWdlIFJUIChpLmUuLCB0cmlhbHMgMS04KQogICAgICAgICAgICAgICAgICAgICAgICBSVEIxICA9IHJvd01lYW5zKFJUWywxOjhdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgMiBhdmVyYWdlIFJUIChpLmUuLCB0cmlhbHMgOS0xNikKICAgICAgICAgICAgICAgICAgICAgICAgUlRCMiAgPSByb3dNZWFucyhSVFssOToxNl0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayAzIGF2ZXJhZ2UgUlQgKGkuZS4sIHRyaWFscyAxNy0yNCkKICAgICAgICAgICAgICAgICAgICAgICAgUlRCMyAgPSByb3dNZWFucyhSVFssMTc6MjRdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgNCBhdmVyYWdlIFJUIChpLmUuLCB0cmlhbHMgMjUtMzIpCiAgICAgICAgICAgICAgICAgICAgICAgIFJUQjQgID0gcm93TWVhbnMoUlRbLDI1OjMyXSksCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDUgYXZlcmFnZSBSVCAoaS5lLiwgdHJpYWxzIDMzLTQwKQogICAgICAgICAgICAgICAgICAgICAgICBSVEI1ICA9IHJvd01lYW5zKFJUWywzMzo0MF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayA2IGF2ZXJhZ2UgUlQgKGkuZS4sIHRyaWFscyA0MS00OCkKICAgICAgICAgICAgICAgICAgICAgICAgUlRCNiAgPSByb3dNZWFucyhSVFssNDE6NDhdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgNyBhdmVyYWdlIFJUIChpLmUuLCB0cmlhbHMgNDktNTYpCiAgICAgICAgICAgICAgICAgICAgICAgIFJUQjcgID0gcm93TWVhbnMoUlRbLDQ5OjU2XSksCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIEJsb2NrIDggYXZlcmFnZSBSVCAoaS5lLiwgdHJpYWxzIDU3LTY0KQogICAgICAgICAgICAgICAgICAgICAgICBSVEI4ICA9IHJvd01lYW5zKFJUWyw1Nzo2NF0pLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBCbG9jayA5IGF2ZXJhZ2UgUlQgKGkuZS4sIHRyaWFscyA2NS03MikKICAgICAgICAgICAgICAgICAgICAgICAgUlRCOSAgPSByb3dNZWFucyhSVFssNjU6NzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgQmxvY2sgMTAgYXZlcmFnZSBSVCAoaS5lLiwgdHJpYWxzIDczLTgwKQogICAgICAgICAgICAgICAgICAgICAgICBSVEIxMCAgPSByb3dNZWFucyhSVFssNzM6ODBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgUlQgKGZvciB0cmlhbCAxLTgwKQogICAgICAgICAgICAgICAgICAgICAgICBSVAogICAgICAgICAgICAgICAgICAgICAgICApKQogICAgIyByZW5hbWUgY29sdW1ucwogICAgY29sbmFtZXModGVtcF90aWJibGUpW2NvbG5hbWVzKHRlbXBfdGliYmxlKSA9PSAnRW50ZXIgeW91ciBVTklRVUUgSUQgKFRoZSBsYXN0IHR3byBkaWdpdHMgb2YgeW91ciBwaG9uZSBudW1iZXIsIHRoZSBsYXN0IHR3byBkaWdpdHMgb2YgeW91ciBiaXJ0aCB5ZWFyLCBhbmQgdGhlIGZpcnN0IHR3byBsZXR0ZXJzIG9mIHRoZSBzdHJlZXQgb24gd2hpY2ggeW91IGxpdmUpKiddIDwtICdJRCcgIAoKICAjIGV4cG9ydCB0aGUgY3JlYXRlZCB0aWJibGUgCiAgICB0ZW1wX3RpYmJsZQogIH0KfQoKIy0tKDIpIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSBkaXJlY3RvcnkgcGF0aHMgdG8gZWFjaCBpbmRpdmlkdWFsIGZpbGUgCgojIEZpbmQgdGhlIGxvY2F0aW9uIG9mIGVhY2ggZXhjZWwgKC54bHN4KSBmaWxlcwojIHRoZSBmb2xkZXJzIGNvbnRhaW5pbmcgdGhlIGZpbGVzIHNob3VsZCBiZSBpbiAxIGZvbGRlciAoZS5nLiAiIiBpbiB0aGlzIGNhc2UpCiMgdGhpcyByZXR1cm5zIGEgbGlzdCBvZiBlYWNoIGZpbGUncyBsb2NhdGlvbgojIE5vdGU6IHRoZSBwYXR0ZXJuIGlzIHNldCB0byBpZ25vcmUgYW55IGhpZGRlbiAvIHRlbXBvcmFyeSBmaWxlcyBieSBhZGRpbmcgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSBuYW1lIChlLmcuICJeUEFSVElDSVBBTlRfQ1VfU0hKX3BpbG90IikKCmZpbGVzX3BzeWNob3B5ID0gZGlyKCIvVXNlcnMvYW5hY2VjaWxpYXJ1aXpwYXJkby9SU3R1ZGlvL0NvbmNlcHRzLCBDYXRlZ29yaWVzLCBhbmQgQ3VsdHVyYWwgVW5pdmVyc2Fscy9TSEogUGlsb3QgLSBVV08gU2FtcGxlICgwNDoyMDoyMSkvRGF0YS9TSEpfcmF3IiwgcmVjdXJzaXZlID0gVFJVRSwgZnVsbC5uYW1lcyA9IFRSVUUsIHBhdHRlcm4gPSAiXlBBUlRJQ0lQQU5UX0NVX1NISl9waWxvdCguKiljc3YkIikKCiMtLSgzKSBBcHBseSB0aGUgZnVuY3Rpb24gdG8gdGhlIGZpbGVzIAoKIyBBcHBseSB0aGUgZnVuY3Rpb24gdG8gYWxsIGV4Y2VsIGZpbGVzCnJlc3VsdF9XID0gbGFwcGx5KGZpbGVzX3BzeWNob3B5LCBleHRyYWN0X3Noal9XKQoKIy0tKDQpIENyZWF0ZSBhIHRpYmJsZSBvZiB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBvbiB0aGUgZmlsZXMKCiMgdGFrZSB0aGUgbGlzdHMgb2YgdGhlIGV4dHJhY3RlZCBkYXRhIGFuZCB0dXJuIGl0IGludG8gYSB0aWJibGUKU0hKX1cgPSBhc190aWJibGUoUmVkdWNlKHJiaW5kLCByZXN1bHRfVykpICMgYWx0ZXJuYXRpdmUgbWV0aG9kOiB4ID0gZGF0YS5mcmFtZSh0KHNhcHBseShyZXN1bHQsYykpKQoKIyAjIHJlbW92ZSByb3cgbmFtZXMgdG8gYXZvaWQgY29uZnVzaW9uCiMgcm93bmFtZXMoU0hKX1cpID0gTlVMTAoKIyAjIHJlb3JnYW5pemUgcm93cyBzbyB0aGF0IHRoZSBkYXRhIGlzIG9yZGVyZWQgYnkgdGhlIHBhcnRpY2lwYW50IG51bWJlciAoZS5nLiAxLCAyLCAzLCA0Li4uKQojIFNISl9XID0gZHBseXI6OmFycmFuZ2UoU0hKX1csIElEKQoKIyBkaXNwbGF5IFNISl9MClNISl9XCmBgYAoKPC9kZXRhaWxzPiAgCgo8ZGV0YWlscz4KPHN1bW1hcnk+IFRoaXMgY29kZSBpbXBvcnRlZCBhbmQgb3JnYW5pemVkIHRoZSBTSEogcmF3IGRhdGEgaW4gYSBsb25nIGZvcm1hdCBpbmNsdWRpbmcgdGhlIHZhcmlhYmxlczogSUQsIHRhc2ssIHR5cGUsIHN1YnR5cGUsIHN0aW1OLCB0cmlhbE4sIGJsb2NrLCB0cmlhbF93aXRoaW4sIGNhdGVnb3J5LCBkYXRlLCBPUywgZnJhbWVSYXRlLCBhY2N1cmFjeSwgUlQuIEVhY2ggcGFydGljaXBhbnQncyBwZXJmb3JtYW5jZSBpcyByZXByZXNlbnRlZCBieSA4MCByb3dzLiAqKGNsaWNrIHRvIGV4cGFuZCkqIDwvc3VtbWFyeT4KCmBgYHtyIGltcG9ydF9zaGpfTCwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KCiMtLS1MT05HIERBVEEgRlJBTUUtLS0iU0hKX0wiICAKCiMtLVRoaXMgY29kZSBjb21wbGV0ZXMgdGhlIGZvbGxvd2luZyB0YXNrczoKIyAoMSkgQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyBhbnkgcmVxdWlyZWQgaW5mb3JtYXRpb24gZnJvbSBhbGwgcHN5Y2hvcHkgZmlsZXMgYXQgb25jZQojICgyKSBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGlyZWN0b3J5IHBhdGhzIHRvIGVhY2ggaW5kaXZpZHVhbCBmaWxlIAojICgzKSBBcHBseSB0aGUgZnVuY3Rpb24gdG8gdGhlIGZpbGVzIAojICg0KSBDcmVhdGUgYSB0aWJibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gb24gdGhlIGZpbGVzCgojLS1UaGUgRklOQUwgT1VUUFVUID0gYSBsb25nIGZvcm1hdCBvZiB0aGUgcmF3IFNISiBkYXRhIGluY2x1ZGluZzoKIyBJRCwgdGFzaywgdHlwZSwgc3VidHlwZSwgc3RpbU4sIHRyaWFsTiwgYmxvY2ssIHRyaWFsX3dpdGhpbiwgY2F0ZWdvcnksIGRhdGUsIE9TLCBmcmFtZVJhdGUsIGFjY3VyYWN5LCBSVAoKIy0tTk9URVM6CgojIFN0ZXAgKDMpIHdpbGwgZ2l2ZSB3YXJuaW5ncyBpZiB0aGVyZSBpcyBhbnkgbWlzc2luZyBkYXRhIHRoYXQgdGhlIGZ1bmN0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGhvdyB0byBoYW5kbGUKIyBleGFtcGxlOiBBbnkgcGFydGljaXBhbnQgdGhhdCBkaWQgbm90IHJlc3BvbmQgdG8gYW4gaXRlbSBvciBkdXJpbmcgYWxsIHRyaWFscyB3aWxsIGhhdmUgYW4gIk5BIiByZXNwb25zZSBpbiB0aGUgZGF0YQoKIyBJbmRpdmlkdWFsIHBhcnRpY2lwYW50IGZpbGVzIGRvIG5vdCBzdGF5IGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgCiMgKHRoZXkgYXJlIHJlLW9yZGVyZWQgc28gdGhhdCBhbGwgcHMgdGhhdCBzdGFydCB3aXRoIHRoZSBkaWdpdCAiMSIgZ28gZmlyc3QsIHRoZW4gdGhlICIyIi4uLikKCiMtLSgxKSBDcmVhdGUgYSBmdW5jdGlvbiB0aGF0IGV4dHJhY3RzIGFueSByZXF1aXJlZCBpbmZvcm1hdGlvbiBmcm9tIGFsbCBwc3ljaG9weSBmb2xkZXJzIGF0IG9uY2UKCiMgY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBleHRyYWN0cyBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGZyb20gZWFjaCBleGNlbCBmaWxlCiMgZGV0YWlscyBmb3Igd2hhdCBpcyBleHRyYWN0ZWQgaW4gdGhpcyBmdW5jdGlvbiBpcyBmb3VuZCB3aXRoaW4gaXQsIAojIHRvIHVzZSBpdCB0byBleHRyYWN0IGFueSBvdGhlciAmLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBlZGl0IHdpdGhpbiB0aGUgZnVuY3Rpb24gaXRzZWxmCgojIHRlbXBfZGF0YSA8LSByZWFkcjo6cmVhZF9jc3YoJy9Vc2Vycy9hbmFjZWNpbGlhcnVpenBhcmRvL1JTdHVkaW8vQ29uY2VwdHMsIENhdGVnb3JpZXMsIGFuZCBDdWx0dXJhbCBVbml2ZXJzYWxzL1NISiBQaWxvdCAtIFVXTyBTYW1wbGUgKDA0OjIwOjIxKS9TSEpfdGVzdC5jc3YnKQoKZXh0cmFjdF9zaGpfTCA9IGZ1bmN0aW9uKGRhdGEpIHsKICAjIHRlbXBfZGF0YSA9IHJlYWRyOjpyZWFkX2NzdihkYXRhKQogIAogICNpZiB0ZW1wX2RhdGEKICBpZiAoZmlsZS5zaXplKGRhdGEpID4gMTQpIHsKICAgICAgICB0ZW1wX2RhdGEgPC0gcmVhZF9jc3YoZGF0YSkKICAKICAKICAjIHRyYW5zcG9zZSBkYXRhIHNvIHRoYXQgZWFjaCB0cmlhbCBpcyBhbiBpbmRpdmlkdWFsIGNvbHVtbiBmb3I6ICgxKSBhY2N1cmFjeSAmICgyKSBSVAogICAgYWNjdXJhY3kgPC0gYXNfdGliYmxlKHJiaW5kKHRlbXBfZGF0YSR0cmlhbF9yZXNwLmNvcnIpKQogICAgICBuYW1lcyhhY2N1cmFjeSkgPC0gZ3N1YigiViIsICJhY2MiLCBuYW1lcyhhY2N1cmFjeSkpICAKICAgIAogICAgUlQgPC0gYXNfdGliYmxlKHJiaW5kKHRlbXBfZGF0YSR0cmlhbF9yZXNwLnJ0KSkKICAgICAgbmFtZXMoUlQpIDwtIGdzdWIoIlYiLCAiUlQiLCBuYW1lcyhSVCkpICAKICAgIAogICMgY3JlYXRlIGEgdGliYmxlIHdpdGggdGhlIHZhcmlhYmxlcyBpbiBxdWVzdGlvbgogIHRlbXBfdGliYmxlIDwtIGFzX3RpYmJsZShjYmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmlxdWUgSUQKICAgICAgICAgICAgICAgICAgICAgICAgSUQgPSB0ZW1wX2RhdGEkYEVudGVyIHlvdXIgVU5JUVVFIElEIChUaGUgbGFzdCB0d28gZGlnaXRzIG9mIHlvdXIgcGhvbmUgbnVtYmVyLCB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIHlvdXIgYmlydGggeWVhciwgYW5kIHRoZSBmaXJzdCB0d28gbGV0dGVycyBvZiB0aGUgc3RyZWV0IG9uIHdoaWNoIHlvdSBsaXZlKSpgLAogICAgICAgICAgICAgICAgICAgICAgICAjIHRhc2sKICAgICAgICAgICAgICAgICAgICAgICAgdGFzayA9IHRlbXBfZGF0YSR0YXNrLCAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgdHlwZQogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gdGVtcF9kYXRhJHR5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBzdWJ0eXBlCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUgPSB0ZW1wX2RhdGEkc3VidHlwZSwgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIHN0aW11bHVzIG51bWJlciAoaS5lLiwgMS04KQogICAgICAgICAgICAgICAgICAgICAgICBzdGltTiA9IHRlbXBfZGF0YSRzdGltTiwgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIHRyaWFsIG51bWJlciAoaS5lLiwgb3ZlciBhbGw6IGZyb20gMC03OSwgcmVwcmVzZW50aW5nIHRyaWFscyAxLTgwKQogICAgICAgICAgICAgICAgICAgICAgICB0cmlhbE4gPSBhcy5pbnRlZ2VyKHRlbXBfZGF0YSRUcmlhbF9sb29wLnRoaXNOKSArIDEgLCAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgYmxvY2sgKGkuZS4sIGZyb20gMC05LCByZXByZXNlbnRpbmcgYmxvY2tzIDEtMTApCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYXMuaW50ZWdlcih0ZW1wX2RhdGEkVHJpYWxfbG9vcC50aGlzUmVwTikgKzEsCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIHRyaWFsIG51bWJlciB3aXRoaW4gZ2l2ZW4gYmxvY2sgKGkuZS4sIGZyb20gMC03LCByZXByZXNlbnRpbmcgYmxvY2tzIDEtOCkKICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxXaXRoaW4gPSBhcy5pbnRlZ2VyKHRlbXBfZGF0YSRUcmlhbF9sb29wLnRoaXNUcmlhbE4pKzEsIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgI2NhdGVnb3J5CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gdGVtcF9kYXRhJGNhdGVnb3J5LCAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBkYXRlID0gdGVtcF9kYXRhJGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAjIE9TCiAgICAgICAgICAgICAgICAgICAgICAgIE9TID0gdGVtcF9kYXRhJE9TLAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBmcmFtZVJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlID0gdGVtcF9kYXRhJGZyYW1lUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWNjdXJhY3kgKGZvciB0cmlhbCAxLTgwKQogICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSA9IHRlbXBfZGF0YSR0cmlhbF9yZXNwLmNvcnIsIAogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIyBSVCAoZm9yIHRyaWFsIDEtODApCiAgICAgICAgICAgICAgICAgICAgICAgIFJUID0gdGVtcF9kYXRhJHRyaWFsX3Jlc3AucnQKICAgICAgICAgICAgICAgICAgICAgICAgKSkKCiAgIyBleHBvcnQgdGhlIGNyZWF0ZWQgdGliYmxlIAogICAgdGVtcF90aWJibGUKICB9Cn0KCiMtLSgyKSBDcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgZGlyZWN0b3J5IHBhdGhzIHRvIGVhY2ggaW5kaXZpZHVhbCBmaWxlIAoKIyBGaW5kIHRoZSBsb2NhdGlvbiBvZiBlYWNoIGV4Y2VsICgueGxzeCkgZmlsZXMKIyB0aGUgZm9sZGVycyBjb250YWluaW5nIHRoZSBmaWxlcyBzaG91bGQgYmUgaW4gMSBmb2xkZXIgKGUuZy4gIiIgaW4gdGhpcyBjYXNlKQojIHRoaXMgcmV0dXJucyBhIGxpc3Qgb2YgZWFjaCBmaWxlJ3MgbG9jYXRpb24KIyBOb3RlOiB0aGUgcGF0dGVybiBpcyBzZXQgdG8gaWdub3JlIGFueSBoaWRkZW4gLyB0ZW1wb3JhcnkgZmlsZXMgYnkgYWRkaW5nIHRoZSBzdGFydCBvZiBlYWNoIGZpbGUgbmFtZSAoZS5nLiAiXlBBUlRJQ0lQQU5UX0NVX1NISl9waWxvdCIpCgpmaWxlc19wc3ljaG9weSA9IGRpcigiL1VzZXJzL2FuYWNlY2lsaWFydWl6cGFyZG8vUlN0dWRpby9Db25jZXB0cywgQ2F0ZWdvcmllcywgYW5kIEN1bHR1cmFsIFVuaXZlcnNhbHMvU0hKIFBpbG90IC0gVVdPIFNhbXBsZSAoMDQ6MjA6MjEpL0RhdGEvU0hKX3JhdyIsIHJlY3Vyc2l2ZSA9IFRSVUUsIGZ1bGwubmFtZXMgPSBUUlVFLCBwYXR0ZXJuID0gIl5QQVJUSUNJUEFOVF9DVV9TSEpfcGlsb3QoLiopY3N2JCIpCgojLS0oMykgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIHRoZSBmaWxlcyAKCiMgQXBwbHkgdGhlIGZ1bmN0aW9uIHRvIGFsbCBleGNlbCBmaWxlcwpyZXN1bHRfTCA9IGxhcHBseShmaWxlc19wc3ljaG9weSwgZXh0cmFjdF9zaGpfTCkKCiMtLSg0KSBDcmVhdGUgYSB0aWJibGUgb2YgdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gb24gdGhlIGZpbGVzCgojIHRha2UgdGhlIGxpc3RzIG9mIHRoZSBleHRyYWN0ZWQgZGF0YSBhbmQgdHVybiBpdCBpbnRvIGEgdGliYmxlClNISl9MID0gYXNfdGliYmxlKFJlZHVjZShyYmluZCwgcmVzdWx0X0wpKSAjIGFsdGVybmF0aXZlIG1ldGhvZDogeCA9IGRhdGEuZnJhbWUodChzYXBwbHkocmVzdWx0LGMpKSkKCiMgIyByZW1vdmUgcm93IG5hbWVzIHRvIGF2b2lkIGNvbmZ1c2lvbgojIHJvd25hbWVzKFNISl9MKSA9IE5VTEwKCiMgIyByZW9yZ2FuaXplIHJvd3Mgc28gdGhhdCB0aGUgZGF0YSBpcyBvcmRlcmVkIGJ5IHRoZSBwYXJ0aWNpcGFudCBudW1iZXIgKGUuZy4gMSwgMiwgMywgNC4uLikKIyBTSEpfTCA9IGRwbHlyOjphcnJhbmdlKFNISl9MLCBJRCkKCiMgZGlzcGxheSBTSEpfTApTSEpfTAoKYGBgCgo8L2RldGFpbHM+ICAKCiMjIyMgMi4gRGVtb2dyYXBoaWMgJiBBSFMgUmF3IERhdGEgIAoKVGhlICoqRGVtb2dyYXBoaWMgJiBBSFMgUmF3IERhdGEqKiB3YXMgY29sbGVjdGVkIHVzaW5nIFF1YWx0cmljcy4gVGhpcyByYXcgZGF0YSB3YXMgaW1wb3J0ZWQgYXMgYSB0aWJibGUgKCIqKnN1cnZleV9yYXcqKiIpIGFuZCBpbmNsdWRlZCB0aGUgZm9sbG93aW5nOiAqKGNsaWNrIHRvIHNlZSBkZXNjcmlwdGlvbikqICAgIAoKPGRldGFpbHM+ICAKPHN1bW1hcnk+IDxzcGFuIHN0eWxlPSJjb2xvcjpEYXJrQmx1ZTsgZm9udC1zaXplOjE4cHg7Ij5EZW1vZ3JhcGhpYyBJbmZvcm1hdGlvbiBhbmQgRXhwbG9yYXRvcnkgTWVhc3VyZXM8L3NwYW4+IDwvc3VtbWFyeT4gIAogIAo8ZGV0YWlscz4gIAo8c3VtbWFyeT4gKipEZW1vZ3JhcGhpYyBJbmZvcm1hdGlvbjoqKiAqKGNsaWNrIHRvIGV4cGFuZCkqIDwvc3VtbWFyeT4gIAoKQUREIEEgREVTQ1JJUFRJT04gSEVSRSAKCjwvZGV0YWlscz4KCjxkZXRhaWxzPiAgCjxzdW1tYXJ5PiAqKkV4cGxvcmF0b3J5IE1lYXN1cmVzOioqICooY2xpY2sgdG8gZXhwYW5kKSogPC9zdW1tYXJ5PiAgCgpBREQgQSBERVNDUklQVElPTiBIRVJFIAoKPC9kZXRhaWxzPiAgCjwvZGV0YWlscz4gCgo8ZGV0YWlscz4gIAo8c3VtbWFyeT4gPHNwYW4gc3R5bGU9ImNvbG9yOkRhcmtCbHVlOyBmb250LXNpemU6MThweDsiPlRoZSBBbmFseXNpcy1Ib2xpc20gU2NhbGUgKEFIUykgPC9zcGFuPiA8L3N1bW1hcnk+ICAKCjxkZXRhaWxzPgo8c3VtbWFyeT4gVGhlIHB1cnBvc2Ugb2YgdGhlIEFIUyB3YXMgdG8gbWVhc3VyZSBwYXJ0aWNpcGFudHMnIGFuYWx5dGljIHZlcnN1cyBob2xpc3RpYyB0aGlua2luZyB0ZW5kZW5jeS4gVGhlIEFIUyB3YXMgY3JlYXRlZCBieSBDaG9pIGV0IGFsICgyMDA3KSBhbmQgY29uc2lzdGVkIDI0IGl0ZW1zIG9uIGEgNy1wb2ludCBsaWtlcnQgc2NhbGUgcmFuZ2luZyBmcm9tIDEgKOKAnFN0cm9uZ2x5IERpc2FncmVl4oCdKSB0byA3ICjigJxTdHJvbmdseSBBZ3JlZeKAnSkgKihjbGljayB0byBleHBhbmQpKi4gPC9zdW1tYXJ5PgoKfCAgICAgICBjb2RlIHwgICAgICAgICAgIDEgICAgICAgICAgfCAgICAgMiAgICB8ICAgICAgICAgICAzICAgICAgICAgIHwgICAgNCAgICB8ICAgICAgICAgNSAgICAgICAgIHwgICA2ICAgfCAgICAgICAgIDcgICAgICAgICB8CnwtLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLTp8Oi0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS06fAp8ICpyZXNwb25zZSogfCBTdHJvbmdseTxicj5EaXNhZ3JlZSB8IERpc2FncmVlIHwgU29tZXdoYXQ8YnI+RGlzYWdyZWUgfCBOZXV0cmFsIHwgU29tZXdoYXQ8YnI+QWdyZWUgfCBBZ3JlZSB8IFN0cm9uZ2x5PGJyPkFncmVlIHwKCi0gKipBSFNfMToqKiBFdmVyeXRoaW5nIGluIHRoZSB1bml2ZXJzZSBpcyBzb21laG93IHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIAotICoqQUhTXzI6KiogTm90aGluZyBpcyB1bnJlbGF0ZWQuICAKLSAqKkFIU18zOioqIEV2ZXJ5dGhpbmcgaW4gdGhlIHdvcmxkIGlzIGludGVydHdpbmVkIGluIGEgY2F1c2FsIHJlbGF0aW9uc2hpcC4KLSAqKkFIU180OioqIEV2ZW4gYSBzbWFsbCBjaGFuZ2UgaW4gYW55IGVsZW1lbnQgb2YgdGhlIHVuaXZlcnNlIGNhbiBsZWFkIHRvIHNpZ25pZmljYW50IGFsdGVyYXRpb25zIGluIG90aGVyIGVsZW1lbnRzLgotICoqQUhTXzU6KiogQW55IHBoZW5vbWVub24gaGFzIG51bWVyb3VzIG51bWJlcnMgb2YgY2F1c2VzLCBhbHRob3VnaCBzb21lIG9mIHRoZSBjYXVzZXMgYXJlIG5vdCBrbm93bi4KLSAqKkFIU182OioqIEFueSBwaGVub21lbm9uIGVudGFpbHMgYSBudW1lcm91cyBudW1iZXIgb2YgY29uc2VxdWVuY2VzLCBhbHRob3VnaCBzb21lIG9mIHRoZW0gbWF5IG5vdCBiZSBrbm93bi4KLSAqKkFIU183OioqIEl0IGlzIG1vcmUgZGVzaXJhYmxlIHRvIHRha2UgdGhlIG1pZGRsZSBncm91bmQgdGhhbiBnbyB0byBleHRyZW1lcy4KLSAqKkFIU184OioqIFdoZW4gZGlzYWdyZWVtZW50IGV4aXN0cyBhbW9uZyBwZW9wbGUsIHRoZXkgc2hvdWxkIHNlYXJjaCBmb3Igd2F5cyB0byBjb21wcm9taXNlIGFuZCBlbWJyYWNlIGV2ZXJ5b25l4oCZcyBvcGluaW9ucy4KLSAqKkFIU185OioqIEl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIGZpbmQgYSBwb2ludCBvZiBjb21wcm9taXNlIHRoYW4gdG8gZGViYXRlIHdobyBpcyByaWdodC93cm9uZywgd2hlbiBvbmXigJlzIG9waW5pb25zIGNvbmZsaWN0IHdpdGggb3RoZXLigJlzIG9waW5pb25zLgotICoqQUhTXzEwOioqIEl0IGlzIGRlc2lyYWJsZSB0byBiZSBpbiBoYXJtb255LCByYXRoZXIgdGhhbiBpbiBkaXNjb3JkLCB3aXRoIG90aGVycyBvZiBkaWZmZXJlbnQgb3BpbmlvbnMgdGhhbiBvbmXigJlzIG93bi4KLSAqKkFIU18xMToqKiBDaG9vc2luZyBhIG1pZGRsZSBncm91bmQgaW4gYW4gYXJndW1lbnQgc2hvdWxkIGJlIGF2b2lkZWQuKgotICoqQUhTXzEyOioqIFdlIHNob3VsZCBhdm9pZCBnb2luZyB0byBleHRyZW1lcy4KLSAqKkFIU18xMzoqKiBFdmVyeSBwaGVub21lbm9uIGluIHRoZSB3b3JsZCBtb3ZlcyBpbiBwcmVkaWN0YWJsZSBkaXJlY3Rpb25zLioKLSAqKkFIU18xNDoqKiBBIHBlcnNvbiB3aG8gaXMgY3VycmVudGx5IGxpdmluZyBhIHN1Y2Nlc3NmdWwgbGlmZSB3aWxsIGNvbnRpbnVlIHRvIHN0YXkgc3VjY2Vzc2Z1bC4qCi0gKipBSFNfMTU6KiogQW4gaW5kaXZpZHVhbCB3aG8gaXMgY3VycmVudGx5IGhvbmVzdCB3aWxsIHN0YXkgaG9uZXN0IGluIHRoZSBmdXR1cmUuKgotICoqQUhTXzE2OioqIElmIGFuIGV2ZW50IGlzIG1vdmluZyB0b3dhcmQgYSBjZXJ0YWluIGRpcmVjdGlvbiwgaXQgd2lsbCBjb250aW51ZSB0byBtb3ZlIHRvd2FyZCB0aGF0IGRpcmVjdGlvbi4qCi0gKipBSFNfMTc6KiogQ3VycmVudCBzaXR1YXRpb25zIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUuCi0gKipBSFNfMTg6KiogRnV0dXJlIGV2ZW50cyBhcmUgcHJlZGljdGFibGUgYmFzZWQgb24gcHJlc2VudCBzaXR1YXRpb25zLioKLSAqKkFIU18xOToqKiBUaGUgd2hvbGUsIHJhdGhlciB0aGFuIGl0cyBwYXJ0cywgc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW4gb3JkZXIgdG8gdW5kZXJzdGFuZCBhIHBoZW5vbWVub24uCi0gKipBSFNfMjA6KiogSXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUgd2hvbGUgdGhhbiBpdHMgcGFydHMuCi0gKipBSFNfMjE6KiogVGhlIHdob2xlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3VtIG9mIGl0cyBwYXJ0cy4KLSAqKkFIU18yMjoqKiBJdCBpcyBtb3JlIGltcG9ydGFudCB0byBwYXkgYXR0ZW50aW9uIHRvIHRoZSB3aG9sZSBjb250ZXh0IHJhdGhlciB0aGFuIHRoZSBkZXRhaWxzLgotICoqQUhTXzIzOioqIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1bmRlcnN0YW5kIHRoZSBwYXJ0cyB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSB3aG9sZSBwaWN0dXJlLgotICoqQUhTXzI0OioqIFdlIHNob3VsZCBjb25zaWRlciB0aGUgc2l0dWF0aW9uIGEgcGVyc29uIGlzIGZhY2VkIHdpdGgsIGFzIHdlbGwgYXMgaGlzL2hlciBwZXJzb25hbGl0eSwgaW4gb3JkZXIgdG8gdW5kZXJzdGFuZCBvbmXigJlzIGJlaGF2aW9yLgoKKiAqcmV2ZXJzZS1jb2RlZCBpdGVtKgoKPC9kZXRhaWxzPiAKPC9kZXRhaWxzPiAKICAKPGRldGFpbHM+CjxzdW1tYXJ5PiBUaGlzIGNvZGUgaW1wb3J0cyBhbmQgb3JnYW5pemVzIHRoZSBEZW1vZ3JhcGhpYywgRXhwbG9yYXRvcnksIGFuZCBBSFMgcmF3IGRhdGEuICooY2xpY2sgdG8gZXhwYW5kKSogPC9zdW1tYXJ5PiAgCgpGaXJzdCwgaW1wb3J0IHRoZSByYXcgc3VydmV5IGRhdGEuCgpgYGB7ciBpbXBvcnRfc3VydmV5X3JhdywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc3VydmV5X3JhdyA9IHJlYWRyOjpyZWFkX2Nzdigic3VydmV5X2RhdGFfcmF3LmNzdiIpCgojICMgcmVvcmdhbml6ZSByb3dzIHNvIHRoYXQgdGhlIGRhdGEgaXMgb3JkZXJlZCBieSB0aGUgcGFydGljaXBhbnQgbnVtYmVyIChlLmcuIDEsIDIsIDMsIDQuLi4pCiMgc3VydmV5X3JhdyA9IGRwbHlyOjphcnJhbmdlKHN1cnZleV9yYXcsIGlkKQoKYGBgCgpgYGB7ciBvcmdhbml6ZV9zdXJ2ZXlfcmF3LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHJlbW92ZSByb3cgdGhhdCBzaG93IG5vIGRhdGEKc3VydmV5X3JhdyA8LSAKICBzdXJ2ZXlfcmF3ICU+JSAKICBzbGljZSgzOm5yb3coc3VydmV5X3JhdykpICMgcmVtb3ZlIHJvdyAxICYgMiAtIG5vdCBkYXRhCgojIGNoYW5nZSBjbGFzcyBmb3IgbW9zdCB2YXJpYWJsZXMuLi4gCiAgIyBzaW5jZSByb3cgMSAmIDIgZXhwb3J0cyBjaHIgY2xhc3MgZnJvbSBRdWFsdHJpY3MsIHRoZSBlbnRpcmUgdGliYmxlIHdpbGwgYmUgY2xhc3MgY2hyCiAgCiAgIyBjaGFuZ2UgUHJvZ3Jlc3MsIER1cmF0aW9uLCBMb2NhdGlvbkxhdGl0dWRlLCBMb2NhdGlvbkxvbmdpdHVkZSwgYFMzLjJfRmlyc3QgQ2xpY2tgLCBgUzMuMl9MYXN0IENsaWNrYCwgYFMzLjJfUGFnZSBTdWJtaXRgLCBgUzMuMl9DbGljayBDb3VudGAtYFM0LjJfQ2xpY2sgQ291bnRgLCBTNy4xX2FnZSwgUzguMV9BSFNfMSAtIFM4LjFfQUhTXzI0IHRvIG51bWVyaWMKICBzdXJ2ZXlfcmF3IDwtIAogICAgc3VydmV5X3JhdyAlPiUgCiAgICAgIG11dGF0ZV9hdChjKHdoaWNoKGNvbG5hbWVzKHN1cnZleV9yYXcpID09ICJQcm9ncmVzcyIpLHdoaWNoKGNvbG5hbWVzKHN1cnZleV9yYXcpID09ICJEdXJhdGlvbiAoaW4gc2Vjb25kcykiKSwKICAgICAgICAgICAgICAgICAgd2hpY2goY29sbmFtZXMoc3VydmV5X3JhdykgPT0gIkxvY2F0aW9uTGF0aXR1ZGUiKSwgd2hpY2goY29sbmFtZXMoc3VydmV5X3JhdykgPT0gIkxvY2F0aW9uTG9uZ2l0dWRlIiksCiAgICAgICAgICAgICAgICAgIHdoaWNoKGNvbG5hbWVzKHN1cnZleV9yYXcpID09ICJTMy4yX0ZpcnN0IENsaWNrIik6d2hpY2goY29sbmFtZXMoc3VydmV5X3JhdykgPT0gIlM0LjJfQ2xpY2sgQ291bnQiKSwgCiAgICAgICAgICAgICAgICAgIHdoaWNoKGNvbG5hbWVzKHN1cnZleV9yYXcpID09ICJTNy4xX2FnZSIpLAogICAgICAgICAgICAgICAgICB3aGljaChjb2xuYW1lcyhzdXJ2ZXlfcmF3KSA9PSAiUzguMV9BSFNfMSIpOndoaWNoKGNvbG5hbWVzKHN1cnZleV9yYXcpID09ICJTOC4xX0FIU18yNCIpKSwKICAgICAgICAgICAgICAgIGFzLm51bWVyaWMpCiAgIyBjaGFuZ2UgRmluaXNoZWQsIGBTMS4yX0xPSS9DYCwgUzYuMl9yZWNydWl0ZWQsIFM3LjJfZ2VuZGVyLCBTNy40X2xhbmcsIFM3LjZfcHJvZiwgUzcuN19saXZlIHRvIGZhY3RvcgogIHN1cnZleV9yYXcgPC0gCiAgICBzdXJ2ZXlfcmF3ICU+JSAKICAgICAgbXV0YXRlKEZpbmlzaGVkID0gZmFjdG9yKEZpbmlzaGVkLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCJ5ZXMiLCAibm8iKSkpICU+JSAKICAgICAgbXV0YXRlKGBTMS4yX0xPSS9DYCA9IGZhY3RvcihgUzEuMl9MT0kvQ2AsIGxldmVscyA9IGMoMSwgMiksIGxhYmVscyA9IGMoInllcyIsICJubyIpKSkgJT4lIAogICAgICBtdXRhdGUoUzYuMl9yZWNydWl0ZWQgPSBmYWN0b3IoUzYuMl9yZWNydWl0ZWQsIGxldmVscyA9IGMoMTo0KSwgbGFiZWxzID0gYygiU09OQSIsICJNdHVyayIsICJQcm9saWZpYyIsICJPdGhlciIpKSkgJT4lIAogICAgICBtdXRhdGUoUzcuMl9nZW5kZXIgPSBmYWN0b3IoUzcuMl9nZW5kZXIsIGxldmVscyA9IGMoMTo0KSwgbGFiZWxzID0gYygiTWFsZSIsICJGZW1hbGUiLCAiU2VsZi1JZGVudGlmeSIsICJQcmVmZXIgbm90IHRvIHNheSIpKSkgJT4lIAogICAgICBtdXRhdGUoUzcuNF9sYW5nID0gZmFjdG9yKFM3LjRfbGFuZywgbGV2ZWxzID0gYygxOjgpLCBsYWJlbHMgPSBjKCJFbmdsaXNoIiwgIlNwYW5pc2giLCAiUG9ydHVndWVzZSIsICJGcmVuY2giLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFuZGFyaW4iLCAiQXJhYmljIiwgIk90aGVyIiwgIlByZWZlciBub3QgdG8gc2F5IikpKSAlPiUgCiAgICAgIG11dGF0ZShTNy42X3Byb2YgPSBmYWN0b3IoUzcuNl9wcm9mLCBsZXZlbHMgPSBjKDE6MyksIGxhYmVscyA9IGMoIkxvdyIsICJNb2RlcmF0ZSIsICJIaWdoIikpKSAlPiUgCiAgICAgIG11dGF0ZShTNy43X2xpdmUgPSBmYWN0b3IoUzcuN19saXZlLCBsZXZlbHMgPSBjKDE6MTEpLCBsYWJlbHMgPSBjKCJOb3J0aF9BbWVyaWNhIiwgIkNlbnRyYWxfQW1lcmljYSIsICJTb3V0aCBBbWVyaWNhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdXJvcGUiLCAiQWZyaWNhIiwgIkFzaWEiLCAiQXVzdHJhbGlhIiwgIlBhY2lmaWMgSXNsYW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcmliYmVhbiBJc2xhbmRzIiwgIm90aGVyIiwgIlByZWZlciBub3QgdG8gc2F5IikpKSAlPiUgCiAgICAgIG11dGF0ZShTOS4yX2ZpbmlzaCA9IGZhY3RvcihTOS4yX2ZpbmlzaCwgbGV2ZWxzID0gYygxKSwgbGFiZWxzID0gYygieWVzIikpKQoKIyBjbGVhbiBkYXRhIGZyb20gdW5uZWNlc3Nhcnkgcm93cy9jb2x1bW5zCnN1cnZleV9yYXcgPC0gCiAgc3VydmV5X3JhdyAlPiUgCiAgc2xpY2UoMzpucm93KHN1cnZleV9yYXcpKSAlPiUgIyByZW1vdmUgcm93IDEgJiAyIC0gbm90IGRhdGEKICAjZmlsdGVyKFN0YXJ0RGF0ZSA+PSBhcy5EYXRlKCIyMDIwLTEyLTAzIDEyOjM1IikpICU+JSAjIHJlbW92ZSBwaWxvdCBkYXRhIChpLmUuLCBpbmNsdWRlIGRhdGEgb24gYW5kIGFmdGVyIDIwMjAtMTItMDMgMTI6MzUpICMgbm90IG5lZWRlZCByaWdodCBub3cKICBmaWx0ZXIoRmluaXNoZWQgPT0gInllcyIpICU+JSAgIyByZW1vdmUgcHMgd2hvIGRpZCBub3QgY29tcGxldGUgdGhlIHN0dWR5CiAgZmlsdGVyKGBTMS4yX0xPSS9DYD09ICJ5ZXMiKSAlPiUgICMgcmVtb3ZlIHBzIHdobyBkaWQgbm90IGNvbnNlbnQKICBmaWx0ZXIoIWlzLm5hKFM3LjFfYWdlKSkgJT4lICMgcmVtb3ZlIHBzIHdpdGhvdXQgYWdlIAogICMgYWRkIGZpbHRlciBmb3IgZ2VuZGVyPwogIGZpbHRlcihRNy45X0FDMSAlaW4lIGMoIlRJTUUiLCIgVElNRSIsICJUSU1FICIpKSAlPiUgIyByZW1vdmUgcHMgd2hvIGRpZCBub3QgcGFzcyB0aGUgZmlyc3QgYXR0ZW50aW9uIGNoZWNrIHF1ZXN0aW9uCiAgZmlsdGVyKFM4LjJfQUMyICVpbiUgYygiU09NRSIsIiBTT01FIiwgIlNPTUUgIikpICU+JSAjIHJlbW92ZSBwcyB3aG8gZGlkIG5vdCBwYXNzIHRoZSBTRUNPTkQgYXR0ZW50aW9uIGNoZWNrIHF1ZXN0aW9uCiAgc2VsZWN0KC1jKFN0YXR1czpJUEFkZHJlc3MsIFJlc3BvbnNlSWQ6RXh0ZXJuYWxSZWZlcmVuY2UsIERpc3RyaWJ1dGlvbkNoYW5uZWw6VXNlckxhbmd1YWdlLCBTQzA6aWQpKSAjIHJlbW92ZSB1bm5lY2Vzc2FyeSBjb2x1bW5zCgojIGRpc3BsYXkgc3VydmV5X3JhdwpzdXJ2ZXlfcmF3CmBgYAoKICA8L2RldGFpbHM+ICAKPC9kZXRhaWxzPiAgCgoKIyMgQ29uc3RydWN0IFdvcmtpbmcgRGF0YWZyYW1lcyAgCgpJbiBvcmRlciB0byBjb21wbGV0ZSB0aGUgcHJlc2VudCBzdHVkeSdzIGFuYWx5c2VzLCB0d28gZGF0YSBmcmFtZXMgd2VyZSBjcmVhdGVkLiAgCgojIyMgMS4gQWxsIERhdGEgV2lkZSAKCjxkZXRhaWxzPiAgCgo8c3VtbWFyeT4gQWxsIHRoZSBkYXRhIGZyb20gdGhlIHByZXNlbnQgc3R1ZHkgaW4gb25lIHRpYmJsZSBwcmVzZW50ZWQgaW4gV0lERSBGT1JNQVQ6ICoqImRhdGFXIioqICooY2xpY2sgdG8gc2VlIG1vcmUpKiA8L3N1bW1hcnk+ICAKCjxkZXRhaWxzPgo8c3VtbWFyeT4gVGhpcyBjb2RlIG9yZ2FuaXplZCB0aGUgcmF3IGRhdGEgaW50byBvbmUgdGliYmxlLiAqKGNsaWNrIHRvIGV4cGFuZCkqIDwvc3VtbWFyeT4KCmBgYHtyIHdhcm5pbmc9RkFMU0V9CiMgc3RhcnQgYnkgcmVtb3ZpbmcgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgU0hKIGFuZCBzdXJ2ZXkgcmF3IGRhdGEgLSB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoIG9yaWdpbmFsIGRhdGEgZmlsZXMsIHRoZXNlIHdpbGwgZWFjaCBoYXZlIGEgdGhlIHN1ZmZpeCAiX3RlbXAiClNISl9XX3RlbXAgPC0gCiAgU0hKX1cgJT4lIAogIGRpc3RpbmN0KElELCAua2VlcF9hbGwgPSBUKQoKc3VydmV5X3Jhd190ZW1wIDwtIAogIHN1cnZleV9yYXcgJT4lIAogIGRpc3RpbmN0KFMyLjFfSUQsIC5rZWVwX2FsbCA9IFQpICU+JSAKICBkaXN0aW5jdChTNS4xX0lELCAua2VlcF9hbGwgPSBUKQoKIyBzb21lIHBzIHJlcG9ydGVkIGRpZmZlcmVudCBJRCdzIGR1cmluZyB0aGUgc3VydmV5LCBzbyB0aGUgZGF0YSB3YXMgZmlyc3QgZGl2aWRlZCBpbnRvIHR3bzogKDEpIFBzIHdpdGggbWF0Y2hpbmcgSURzIGluIHRoZSBzdXJ2ZXkgYW5kICgyKSBQcyB3aXRoIG1pc21hdGNoZWQgSURzIGluIHRoZSBzdXJ2ZXkKc3VydmV5X21hdGNoIDwtIAogIHN1cnZleV9yYXdfdGVtcCAlPiUgCiAgZmlsdGVyKFMyLjFfSUQgPT0gUzUuMV9JRCkKCnN1cnZleV9taXNtYXRjaCA8LSAKICBzdXJ2ZXlfcmF3X3RlbXAgJT4lIAogIGZpbHRlcihTMi4xX0lEICE9IFM1LjFfSUQpCgojIGVkaXQgc3VydmV5X21hdGNoIGNvbHVtbnMgdG8gbWVyZ2UKc3VydmV5X21hdGNoIDwtIAogIHN1cnZleV9tYXRjaCAlPiUgCiAgIyByZW1vdmUgZXhjZXNzIHBhcnRpY2lwYW50IElEIGNvbHVtbgogIHNlbGVjdCgtUzUuMV9JRCkgJT4lIAogICMgcmVuYW1lIHJlbWFpbmluZyBJRCBjb2x1bW4gdG8gbWVyZ2UKICBkcGx5cjo6cmVuYW1lKElEID0gUzIuMV9JRCkKCiMgbWVyZ2UgdGhlIG1hdGNoZWQgc3VydmV5IGRhdGEgd2l0aCB0aGUgU0hKIGRhdGEgCmRhdGFXX21hdGNoIDwtIG1lcmdlKFNISl9XX3RlbXAsIHN1cnZleV9tYXRjaCwgYnkgPSAiSUQiKQogCgojIG1lcmdlIHRoZSBtaXNtYXRjaGVkIHN1cnZleSBkYXRhIHdpdGggdGhlIFNISiBkYXRhICAKICAjIHdoaWNoIHJvd3MgaW4gdGhlIDFzdCBJRCByZXNwb25zZSBtYXRjaCBiL3cgdGhlIFNISiBhbmQgc3VydmV5IGRhdGE/CiAgICBJRDEgPC0gU0hKX1dfdGVtcCRJRFtTSEpfV190ZW1wJElEICVpbiUgc3VydmV5X21pc21hdGNoJFMyLjFfSURdCiAgICAjIGNoZWNrIHdoaWNoIHJvdyBpbiBzdXJ2ZXlfbWlzbWF0Y2ggdGhlc2UgYmVsb25nIHRvLi4uIAogICAgSUQxX3JvdyA8LSBjKHdoaWNoKHN1cnZleV9taXNtYXRjaCRTMi4xX0lEID09IFNISl9XX3RlbXAkSURbU0hKX1dfdGVtcCRJRCAlaW4lIHN1cnZleV9taXNtYXRjaCRTMi4xX0lEXVsxXSksIAogICAgICAgICAgICAgICAgIHdoaWNoKHN1cnZleV9taXNtYXRjaCRTMi4xX0lEID09IFNISl9XX3RlbXAkSURbU0hKX1dfdGVtcCRJRCAlaW4lIHN1cnZleV9taXNtYXRjaCRTMi4xX0lEXVsyXSkpCiAgICAKICAjIHdoaWNoIHJvd3MgaW4gdGhlIDJuZCBJRCByZXNwb25zZSBtYXRjaCBiL3cgdGhlIFNISiBhbmQgc3VydmV5IGRhdGE/CiAgICBJRDIgPC0gU0hKX1dfdGVtcCRJRFtTSEpfV190ZW1wJElEICVpbiUgc3VydmV5X21pc21hdGNoJFM1LjFfSURdCiAgCiAgIyBjaGVjayBpZiBhbnkgcm93cyBhcmUgdGhlIHNhbWUgYi93IElEMSAmIElEMi4uLgogICAgIyBpbnRlcnNlY3QoSUQxLCBJRDIpICNjb21tZW50ZWQgb3V0IGZvciBub3cgc28gbm90aGluZyByZXR1cm5lZC4uLiAKICAgICAgIyBzaW5jZSB0aGlzIHZhbHVlIGlzIDAsIG5vIGR1cGxpY2F0ZXMgYi93IElEMSAmIElEMiB3b3VsZCBiZSBnYXRoZXJlZCBpZiBib3RoIGFyZSBpbmNsdWRlZCBpbiBmaW5hbCBkYXRhIHNldCAKICAgIAogICAgCmRhdGFXX21pc21hdGNoIDwtIGJpbmRfcm93cyhtZXJnZShTSEpfV190ZW1wLCBkcGx5cjo6cmVuYW1lKHNlbGVjdChzdXJ2ZXlfbWlzbWF0Y2gsIC1TNS4xX0lEKSwgSUQgPSBTMi4xX0lEKSwgYnkgPSAiSUQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoU0hKX1dfdGVtcCwgZHBseXI6OnJlbmFtZShzZWxlY3Qoc3VydmV5X21pc21hdGNoLCAtUzIuMV9JRCksIElEID0gUzUuMV9JRCksIGJ5ID0gIklEIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCiMgTWVyZ2UgbWF0Y2hlZCAmIG1pc21hdGNoZWQgZGF0YSBpbnRvIDEgZGF0YSBmcmFtZSAtLSB0aGlzIGNhbiBiZSBkb25lIG5vdyB0aGF0IHRoZSBjaGVja3MgYWJvdmUgd2VyZSBjb21wbGV0ZWQKZGF0YVcgPC0gdGliYmxlKGJpbmRfcm93cyhkYXRhV19tYXRjaCwgZGF0YVdfbWlzbWF0Y2gpKQogICMgcmVuYW1lIElEIHRvIG51bWVyYWxzIHRvIHJlbW92ZSBjdXN0b20gSURzIGNyZWF0ZWQgYnkgcHMgZnJvbSBhbnkgZnV0aGVyIGFuYWx5c2lzIChpLmUuLCBmdWxseSBhbm9ueW1pemUgdGhlIGRhdGEpCiAgZGF0YVckSUQgPC0gMTpucm93KGRhdGFXKQoKIyBzaG93IGRhdGFXCmRhdGFXCgoKIyB0byBleHBvcnQgdGhlIGRhdGEgYXMgYSBjc3YgZmlsZSwgdXNlIHRoZSBmb2xsb3dpbmc6CiMgd3JpdGVfZXhjZWxfY3N2KGRhdGFXLCAiZGF0YVcoTWF5MTApLmNzdiIpCmBgYAo8L2RldGFpbHM+ICAKPC9kZXRhaWxzPiAgCgo8IS0tICMjIyAyLiBBbGwgRGF0YSBMb25nICAtLT4KCjwhLS0gPGRldGFpbHM+ICAgLS0+Cgo8IS0tIDxzdW1tYXJ5PiBBbGwgdGhlIGRhdGEgZnJvbSB0aGUgcHJlc2VudCBzdHVkeSBpbiBvbmUgdGliYmxlIHByZXNlbnRlZCBpbiBMT05HIEZPUk1BVDogKioiZGF0YUwiKiogKihjbGljayB0byBzZWUgbW9yZSkqIDwvc3VtbWFyeT4gICAtLT4KCjwhLS0gLSBUaGlzIGRhdGEgaW5jbHVkZWQgdGhlIGZvbGxvd2luZzogICAgLS0+CjwhLS0gICAtIHIgY29sbmFtZXMoZGF0YUwpIC0tPgoKPCEtLSA8ZGV0YWlscz4gLS0+CjwhLS0gPHN1bW1hcnk+IFRoaXMgY29kZSBvcmdhbml6ZWQgdGhlIHJhdyBkYXRhIGludG8gb25lIHRpYmJsZS4gKihjbGljayB0byBleHBhbmQpKiA8L3N1bW1hcnk+IC0tPgo8IS0tIGBgYHtyIHdhcm5pbmc9RkFMU0V9IC0tPgo8IS0tICMjIFRCRCAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSA8L2RldGFpbHM+ICAgLS0+CjwhLS0gPC9kZXRhaWxzPiAgIC0tPgogIAojIEludGVycHJldGluZyB0aGUgRGF0YQoKVGhlIGZvbGxvd2luZyBhbmFseXNlcyB3ZXJlIGNvbXBsZXRlZCBiYXNlZCBvbiBhIHJlZ2lzdGVyZWQgcHJvamVjdCBvbiBPU0YgKHZpZXcgcmVnaXN0cmF0aW9uOiA8aHR0cHM6Ly9vc2YuaW8vMnl1dHIvP3ZpZXdfb25seT1lMGJiMjE0MjE4YTI0OWUyOTExZGEzMTA5NTI5ZDIzZj4pLiBUaGUgYW5hbHlzZXMgZXhwbG9yZWQgdHdvIG1haW4gZWZmZWN0cyBpbiB0aGUgcHJlc2VudCBzdHVkeTogKDEpIFJhbmsgb3JkZXIgZWZmZWN0cyBhbmQgKDIpIENvcnJlbGF0aW9uIHJlbGF0aW9uc2hpcHMuIEVhY2ggYW5hbHlzaXMgY29udGFpbnMgYSBkZXNjcmlwdGlvbiwgYW5kIHJlcXVpcmVkIGFzc3VtcHRpb24gdGVzdHMsIGFuZCB2aXN1YWxpemF0aW9ucy4gCgo8IS0tIEVhY2ggYW5hbHlzaXMgY29udGFpbnMgdGhlIGZvbGxvd2luZzogICAtLT4KCjwhLS0gMS4gRGVzY3JpcHRpdmUgU3RhdGlzdGljcyAtLT4KPCEtLSAyLiBBbmFseXNpcyAqKGluY2x1ZGluZyBhbnkgcmVsZXZhbnQgYXNzdW1wdGlvbiB0ZXN0cykqIC0tPgo8IS0tIDMuIFZpc3VhbGl6YXRpb25zIC0tPgoKPCEtLSAjIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgLS0+Cgo8IS0tIERlbW9ncmFwaGljcyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzICAtLT4KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBjcmVhdGUgZGF0YSB3aXRoIGFsbCBkZW1vZ3JhcGhpYyB2YWx1ZXMKZGVzX2RhdGFfZGVtbyA8LSBkYXRhVyAlPiUgc2VsZWN0KFM3LjFfYWdlLCBTNy4yX2dlbmRlciwgUzcuNF9sYW5nLCBTNy41X2xhbmdPLCBTNy42X3Byb2YsIFM3LjdfbGl2ZSwgUzcuOF9saXZlTykKY29sbmFtZXMoZGVzX2RhdGFfZGVtbykgPC0gYygiYWdlIiwgImdlbmRlciIsICJsYW5nIiwgImxhbmdPIiwgInByb2YiLCAibGl2ZSIsICJsaXZlTyIpCgojIGNyZWF0ZSBkYXRhIHdpdGggYWxsIHF1ZXN0aW9ubmFpcmUgZGF0YSAoQUhTKQpkZXNfZGF0YV9xdWVzIDwtIGRhdGFXICU+JSBzZWxlY3QoUzguMV9BSFNfMTpTOC4xX0FIU18yNCkKCiMgY3JlYXRlIHRhYmxlIHdpdGggYWdlIGRlc2NyaXB0aXZlIHN0YXRzOiBNLCBTRCwgbWluLCBtYXgsIGZyZXEgJiBwcm9wb3J0aW9uCiAgIyB1c2UgcHN5Y2g6OmRlc2NyaWJlKCkKICBkZXNfYWdlIDwtIHBzeWNoOjpkZXNjcmliZShkZXNfZGF0YV9kZW1vJGFnZSkKICAKICAjIGNvdW50IGZyZXF1ZW5jeSBmb3IgZWFjaCBhZ2UKICBkZXNfYWdlX2ZyZXEgPC0gcGx5cjo6Y291bnQoZGVzX2RhdGFfZGVtbyRhZ2UpCiAgCiAgIyBqb2luIGludG8gdGFibGUgd2l0aCBzdW1tYXJ5IHN0YXRzICYgZnJlcSBjb3VudHMgZm9yIGFnZQogIGRlc19hZ2VfdCA8LSBkYXRhLmZyYW1lKGNiaW5kKGMoYXMuZGF0YS5mcmFtZShkZXNfYWdlKSAlPiUgc2VsZWN0KGMobiwgbWVhbiwgbWVkaWFuLCBzZCwgbWluLCBtYXgsIHJhbmdlKSksICIiKSwKICAgICAgICAgICAgICAgICAgICAgIGRlc19hZ2VfZnJlcSR4LAogICAgICAgICAgICAgICAgICAgICAgZGVzX2FnZV9mcmVxJGZyZXEpKQogICMgcmVuYW1lIGNvbHVtbnMKICBjb2xuYW1lcyhkZXNfYWdlX3QpIDwtIGMoInN1bV9zdGF0IiwgImFnZSIsICJmcmVxIikKICAKICAjIHJvdW5kIE0gJiBTRAogIGRlc19hZ2VfdCRzdW1fc3RhdCRtZWFuIDwtIHJvdW5kKGRlc19hZ2VfdCRzdW1fc3RhdCRtZWFuLCAyKQogIGRlc19hZ2VfdCRzdW1fc3RhdCRzZCA8LSByb3VuZChkZXNfYWdlX3Qkc3VtX3N0YXQkc2QsIDIpCiAgCiAgIyBzaG93IHRhYmxlIHVzaW5nIGthYmxlCiAga2FibGUoZGVzX2FnZV90LCBjYXB0aW9uID0gIlN1bW1hcnkgc3RhdGlzdGljcyBhbmQgZnJlcXVlbmN5IGNvdW50cyBmb3IgYWdlIiwgZGlnaXRzID0gMiwgYWxpZ24gPSByZXAoJ2MnKSwgY29sLm5hbWVzID0gYygiICIsICJBZ2UgKHllYXJzKSIsICJGcmVxdWVuY3kiKSkgJT4lCiAgICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiLCAiU3VtbWFyeSBTdGF0aXN0aWMiLCAiRGlzdHJpYnV0aW9uIiA9IDIpLCBib2xkID0gVCkgJT4lCiAgICByb3dfc3BlYygwLCBib2xkID0gVCkgJT4lCiAgICBjb2x1bW5fc3BlYygzLCBib3JkZXJfbGVmdCA9IFQpICU+JQogICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9ICJzdHJpcGVkIiwgImhvdmVyIiwgZnVsbF93aWR0aCA9IEYpICU+JQogICAga2FibGVfY2xhc3NpYygpCiAgCnBseXI6OmNvdW50KGRlc19kYXRhX2RlbW8kYWdlKQoKCnBseXI6OmNvdW50KGRlc19kYXRhX2RlbW8kZ2VuZGVyKQoKcGx5cjo6Y291bnQoZGVzX2RhdGFfZGVtbyRsYW5nKQoKcGx5cjo6Y291bnQoZGVzX2RhdGFfZGVtbyRsYW5nTykKCnBseXI6OmNvdW50KGRlc19kYXRhX2RlbW8kcHJvZikKCnBseXI6OmNvdW50KGRlc19kYXRhX2RlbW8kbGl2ZSkKCnBseXI6OmNvdW50KGRlc19kYXRhX2RlbW8kbGl2ZU8pCgpnbGltcHNlKGRlc19kYXRhX2RlbW8pCmBgYAoKIyBSYW5rIE9yZGVyIERpZmZlcmVuY2VzCgpUbyBpbnZlc3RpZ2F0ZSBpZiB0aGUgcHJlc2VudCBzdHVkeSBmb3VuZCB0aGUgc2FtZSByYW5rIG9yZGVyIGRpZmZlcmVuY2VzIGFzIGluIHByZXZpb3VzIHN0dWRpZXMgKGUuZy4sIFNtaXRoLCBNaW5kYSwgYW5kIFdhc2hidXJuLCAyMDA0KSwgcGFydGljaXBhbnQgcGVyZm9ybWFuY2UgYWNyb3NzIFNISiB0eXBlcyB3YXMgb2JzZXJ2ZWQuIFRoaXMgd2FzIGRvbmUgYWNyb3NzIGFsbCBibG9ja3MgYW5kIGJ5IGJsb2NrIG9mIGVhY2ggU0hKIHR5cGUuIAoKPGRldGFpbHM+CjxzdW1tYXJ5PiBGaXJzdCwgd2UgY2hhcnRlZCB0aGUgZGF0YSBpbiBhIHRhYmxlLiBUaGlzIHNob3dzIHRoZSAqKnBlcmNlbnQgb2YgY29ycmVjdCByZXNwb25zZXMqKiBkdXJpbmcgZWFjaCBibG9jayBhbmQgYWNyb3NzIGFsbCAxMCBibG9ja3MgZm9yIGVhY2ggY2F0ZWdvcnkgdHlwZSBhbmQgY29sbGFwc2VkIGFjcm9zcyBhbGwgY2F0ZWdvcnkgdHlwZXMuICooY2xpY2sgdG8gc2VlIGNvZGUpKjwvc3VtbWFyeT4KCmBgYHtyIGNyZWF0ZV9wZXJfcmVzcCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBzdWJzZXQgZGF0YSBmb3Igb25seSB0aGUgZGF0YSB3ZSB3YW50OiBCMS0xMCBwZXJjZW50IG9mIGNvcnJlY3QgZm9yIGVhY2ggY2F0ZWdvcnkgdHlwZSAKcGVyX2J5YmxvY2tfYnl0eXBlIDwtIAogIGRhdGFXICU+JSAKICBncm91cF9ieSh0eXBlKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKG4gPSBuKCksIFBlckIxID0gKHN1bShhY2N1cmFjeUIxKS8obigpKjgpICoxMDApLCBQZXJCMiA9IChzdW0oYWNjdXJhY3lCMikvKG4oKSo4KSAqMTAwKSwgCiAgICAgICAgICAgIFBlckIzID0gKHN1bShhY2N1cmFjeUIzKS8obigpKjgpICoxMDApLCBQZXJCNCA9IChzdW0oYWNjdXJhY3lCNCkvKG4oKSo4KSAqMTAwKSwgCiAgICAgICAgICAgIFBlckI1ID0gKHN1bShhY2N1cmFjeUI1KS8obigpKjgpICoxMDApLCBQZXJCNiA9IChzdW0oYWNjdXJhY3lCNikvKG4oKSo4KSAqMTAwKSwgCiAgICAgICAgICAgIFBlckI3ID0gKHN1bShhY2N1cmFjeUI3KS8obigpKjgpICoxMDApLCBQZXJCOCA9IChzdW0oYWNjdXJhY3lCOCkvKG4oKSo4KSAqMTAwKSwgCiAgICAgICAgICAgIFBlckI5ID0gKHN1bShhY2N1cmFjeUI5KS8obigpKjgpICoxMDApLCBQZXJCMTAgPSAoc3VtKGFjY3VyYWN5QjEwKS8obigpKjgpICoxMDApCiAgICAgICAgICAgICkKICBwZXJfYnlibG9ja19ieXR5cGUkdHlwZSA8LSBhcy5jaGFyYWN0ZXIocGVyX2J5YmxvY2tfYnl0eXBlJHR5cGUpCgpwZXJfYnlibG9jayA8LSAKICBiaW5kX2NvbHModGliYmxlKHR5cGUgPSAiQWxsIiksIAogICAgICAgICAgICBkYXRhVyAlPiUgCiAgICAgICAgICAgIGRwbHlyOjpzdW1tYXJpc2UobiA9IG4oKSwgUGVyQjEgPSAoc3VtKGFjY3VyYWN5QjEpLyhuKCkqOCkgKjEwMCksIFBlckIyID0gKHN1bShhY2N1cmFjeUIyKS8obigpKjgpICoxMDApLCAKICAgICAgICAgICAgICAgICAgICAgIFBlckIzID0gKHN1bShhY2N1cmFjeUIzKS8obigpKjgpICoxMDApLCBQZXJCNCA9IChzdW0oYWNjdXJhY3lCNCkvKG4oKSo4KSAqMTAwKSwgCiAgICAgICAgICAgICAgICAgICAgICBQZXJCNSA9IChzdW0oYWNjdXJhY3lCNSkvKG4oKSo4KSAqMTAwKSwgUGVyQjYgPSAoc3VtKGFjY3VyYWN5QjYpLyhuKCkqOCkgKjEwMCksIAogICAgICAgICAgICAgICAgICAgICAgUGVyQjcgPSAoc3VtKGFjY3VyYWN5QjcpLyhuKCkqOCkgKjEwMCksIFBlckI4ID0gKHN1bShhY2N1cmFjeUI4KS8obigpKjgpICoxMDApLCAKICAgICAgICAgICAgICAgICAgICAgIFBlckI5ID0gKHN1bShhY2N1cmFjeUI5KS8obigpKjgpICoxMDApLCBQZXJCMTAgPSAoc3VtKGFjY3VyYWN5QjEwKS8obigpKjgpICoxMDApLCAKICAgICAgICAgICAgICAgICAgICAgIEFsbCA9IChzdW0oYWNjdXJhY3lCMSwgYWNjdXJhY3lCMiwgYWNjdXJhY3lCMywgYWNjdXJhY3lCNCwgYWNjdXJhY3lCNSwgYWNjdXJhY3lCNiwgYWNjdXJhY3lCNywgYWNjdXJhY3lCOCwgYWNjdXJhY3lCOSwgYWNjdXJhY3lCMTApLyhuKCkqODApKSoxMDApCiAgICAgICAgICAgICkKICBwZXJfYnlibG9jayR0eXBlIDwtIGFzLmNoYXJhY3RlcihwZXJfYnlibG9jayR0eXBlKQoKCnBlcl9ieXR5cGUgPC0gCiAgZGF0YVcgJT4lIAogIGdyb3VwX2J5KHR5cGUpICU+JSAKICBkcGx5cjo6c3VtbWFyaXNlKEFsbCA9IChzdW0oYWNjdXJhY3lCMSwgYWNjdXJhY3lCMiwgYWNjdXJhY3lCMywgYWNjdXJhY3lCNCwgYWNjdXJhY3lCNSwgCiAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lCNiwgYWNjdXJhY3lCNywgYWNjdXJhY3lCOCwgYWNjdXJhY3lCOSwgYWNjdXJhY3lCMTApLyhuKCkqODApKSoxMDAKICAgICAgICAgICAgKQogIHBlcl9ieXR5cGUkdHlwZSA8LSBhcy5jaGFyYWN0ZXIocGVyX2J5dHlwZSR0eXBlKQoKcGVyX3Jlc3AgPC0gCiAgYmluZF9yb3dzKHBlcl9ieWJsb2NrLCAKICAgICAgICAgICAgbGVmdF9qb2luKHBlcl9ieWJsb2NrX2J5dHlwZSwgcGVyX2J5dHlwZSwgYnkgPSAidHlwZSIpKQpgYGAKPC9kZXRhaWxzPgoKYGBge3Igc2hvdyBwZXJfcmVzcCB0YWJsZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBzaG93IHRhYmxlIHVzaW5nIGthYmxlCmthYmxlKHBlcl9yZXNwLCBjYXB0aW9uID0gIlBlcmNlbnQgb2YgQ29ycmVjdCBSZXNwb25zZXMgRHVyaW5nIEVhY2ggQmxvY2sgJiBBY3Jvc3MgQWxsIEJsb2NrcyBHcm91cGVkIGJ5IFNISiBUYXNrIFR5cGUiLCBjb2wubmFtZXMgPSBjKCJUeXBlIiwgIm4iLCBhcy5jaGFyYWN0ZXIoYygxOjEwKSksICJBbGwiKSwgYWxpZ24gPSByZXAoJ2MnKSwgcm93Lm5hbWVzID0gYygxOjcpLCBkaWdpdHMgPSAyKSAlPiUgCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJQZXJmb3JtYW5jZSBpcyBzdW1tYXJpemVkIGFjcm9zcyB0aGUgNiB0YXNrIHR5cGVzIGluIFJvdyAxLiAiKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiwgIiIsICAiIiwgIkJsb2NrIiA9IDEwLCAiIikpICU+JQogIGthYmxlX2NsYXNzaWMoKQpgYGAKClwKXAoKRm9yIGNvbXBhcmlzb24sIGhlcmUgaXMgdGhlIHRhYmxlIGZyb20gU21pdGgsIE1pbmRhLCBhbmQgV2FzaGJ1cm4gKDIwMDQpOgoKIVtUYWJsZSAzIGZyb20gU21pdGggZXQgYWwuICgyMDA0KV0oL1VzZXJzL2FuYWNlY2lsaWFydWl6cGFyZG8vUlN0dWRpby9Db25jZXB0cywgQ2F0ZWdvcmllcywgYW5kIEN1bHR1cmFsIFVuaXZlcnNhbHMvU0hKIFBpbG90IC0gVVdPIFNhbXBsZSAoMDQ6MjA6MjEpL0ltYWdlcy9TbWl0aCBldCBhbC4oMjAwNCkgLSBUYWJsZSAzLmpwZykKClwKCiMjIE92ZXJhbGwgUmFuayBPcmRlciBQZXJmb3JtYW5jZQoKTm93IHRoYXQgd2UgaGF2ZSBsb29rZWQgYXQgdGhlIGRhdGEsIHdlIHBsb3R0ZWQgdGhlIGRhdGEuIEZpcnN0LCB3ZSB1c2VkIGEgaGlzdG9ncmFtIHRvIGRlcGljdCBwYXJ0aWNpcGFudCBhdmVyYWdlIHBlcmZvcm1hbmNlIGluIHBlcmNlbnQgY29ycmVjdCBhY3Jvc3MgZWFjaCBTSEogdHlwZS4KCjxkZXRhaWxzPgo8c3VtbWFyeT4gRmlndXJlIGRlcGljdGluZyB0aGUgKipwZXJjZW50IG9mIGNvcnJlY3QgcmVzcG9uc2VzKiogZm9yIGVhY2ggU0hKIHR5cGUgYWNyb3NzIGFsbCAxMCBibG9ja3MuICooY2xpY2sgdG8gc2VlIGNvZGUpKjwvc3VtbWFyeT4KCmBgYHtyIHNob3cgcGVyX2J5dHlwZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBmcm9tIHRhYmxlIHBlciBjb3JyIHRhYmxlCnBlcl9ieXR5cGVfZm9yZmlnIDwtIHBlcl9ieXR5cGUgJT4lIAogICMgY2hhbmdlIGNvbCBuYW1lcyB0byBtYWtlIGZpZwogIHJlbmFtZShwZXJjZW50ID0gQWxsKSAlPiUgCiAgIyBhZGQgcm91bmRlZCBjb2wgZm9yIGdvZW1fdGV4dCBpbiBmaWcKICBtdXRhdGUocm91bmRlZF9wZXIgPSByb3VuZChwZXJjZW50LCAyKSkKICAKIyBzaG93IGRhdGEKZ2xpbXBzZShwZXJfYnl0eXBlX2ZvcmZpZykKCmBgYAo8L2RldGFpbHM+CgoKVGhlIGZpZ3VyZSBzaG93cyB0aGF0LCBhcyBwcmVkaWN0ZWQsIHR5cGUgMSBoYWQgdGhlIGJlc3QgcGVyZm9ybWFuY2UuIFR5cGUgMi02IGRpZCBub3Qgc2hvdyB0aGUgc2FtZSBkaWZmZXJlbmNlcyBhcyBzZWVuIGluIHRoZSBwYXN0LiBIb3dldmVyLCB0aGVyZSB3YXMgYSBkb3dud2FyZCB0cmVuZCwgd2hlcmUgcGVyZm9ybWFuY2UgYmVjYW1lIGxvd2VyIGZvciBoaWdoZXIgU0hKIHR5cGVzLiBUaGlzIHRyZW5kLCBhbHRob3VnaCBub3QgbGFyZ2UsIGRpZCBmaXQgb3VyIHByZWRpY3Rpb25zLiBUaGUgdmVyeSBzbWFsbCBkaWZmZXJlbmNlcyBpbiBwZXJmb3JtYW5jZSBzdWdnZXN0IHRoYXQgYWx0aG91Z2ggdGhlIHJhbmsgb3JkZXIgZGlmZmVyZW5jZXMgbWF5IG9jY3VyLCBvdXIgc2FtcGxlIHdhcyBub3Qgc3VmZmljaWVudCB0byBzaG93IHRoZSBkaWZmZXJlbmNlcy4gQSBsYXJnZXIgc2FtcGxlIGlzIG5lZWRlZCB0byBleHBsb3JlIHRoaXMgZnVydGhlci4gCgpgYGB7ciBzaG93IHBlcl9ieXR5cGUgZmlndXJlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGNyZWF0ZSBjdXN0b20gY29sb3IgcGFsbGV0IHRvIGF2b2lkIGxpZ2h0IGNvbG9ycyB0aGF0IGFyZSBkaWZmaWN1bHQgdG8gc2VlCiAgIyB0aGlzIHBhbGV0dGUgY2FuIGJlIHVzZWQgZm9yIGFsbCBzdWJzZXF1ZW50IHZpc3VhbGl6YXRpb25zCm15X3BhbGV0dGUgPSBjKCIjRjZCRDYwIiwgIiM3RDRFNTciLCAiI0Q2Njg1MyIsICIjMDUzMjI1IiwgIiMzNzc0OTUiLCAiIzc5QjlCNSIpCgojIHNob3cgZmlndXJlIGFzIGhpc3RvZ3JhbQpwZXJfYnl0eXBlX2ZpZzwtIGdncGxvdChwZXJfYnl0eXBlX2ZvcmZpZywgYWVzKHggPSB0eXBlLCB5ID0gcGVyY2VudCwgZmlsbCA9IHR5cGUpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZ1bi55ID0gIm1lYW4iLCB3aWR0aCA9IDAuNSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjIpLCBjb2xvdXIgPSAiYmxhY2siKSArIAogICAgZ3VpZGVzKHNoYXBlID0gRkFMU0UpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbXlfcGFsZXR0ZSkgKwogIGxhYnMoIyBhZGQgYWxsIGxhYmVscwogICAgICAgdGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gdGhlIDYgU0hKIFR5cGVzIiwKICAgICAgIHN1YnRpdGxlID0gIlBlcmNlbnQgQ29ycmVjdCBSZXNwb25zZXMiLAogICAgICAgY2FwdGlvbiA9ICJOb3RlOiBQZXJmb3JtYW5jZSBpcyBjb2xsYXBzZWQgYWNyb3NzIDEwIGJsb2NrcyBmb3IgZWFjaCBjYXRlZ29yeSB0eXBlLiIsCiAgICAgICB4ID0gIlR5cGUiLCAKICAgICAgIHkgPSAiUGVyZm9ybWFuY2UgKCUpIikgKwogICAgICAgICMgdGhlICJcbiIgaGVyZSBkZW5vdGUgdGhhdCB5b3Ugd2FudCBhIG5ldyBsaW5lIGZvcm1lZCBpbiB0aGUgdGV4dAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEwMCksIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKHNlcSgwLCAxMDAsIDEwKSkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmRlZF9wZXIpLCB2anVzdCA9IC0wLjUsIHNpemUgPSA1LAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjUsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDI1KSwgCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgc2l6ZSA9IDE2LCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIikKICAgICAgICApCiMgc2hvdyBmaWcKcGVyX2J5dHlwZV9maWcKCiMgZXhwb3J0IHBsb3QKICAjIHRpdGxlICYgY2FwdGlvbiByZW1vdmVkCiMgZ2dzYXZlKGZpbGVuYW1lPSJiYXJfZmlnX29jdDEzLWZpbmFsIiwgcGxvdCA9IHBlcl9ieXR5cGVfZmlnLCBkZXZpY2UgPSAianBlZyIsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iLCBkcGkgPSAxMDAwKQpgYGAKCiMjIFJhbmsgT3JkZXIgUGVyZm9ybWFuY2UgYnkgQmxvY2sKCk5vdyB0aGF0IHdlIGhhdmUgc2VlbiB0aGUgb3ZlcmFsbCBkaWZmZXJlbmNlcywgd2UgcGxvdHRlZCB0aGUgZGF0YSB1c2luZyBhIGxpbmUgZ3JhcGguCgo8ZGV0YWlscz4KPHN1bW1hcnk+IFRoaXMgZmlndXJlIGRlcGljdHMgdGhlICoqcGVyY2VudCBvZiBjb3JyZWN0IHJlc3BvbnNlcyoqIGR1cmluZyBlYWNoIGJsb2NrIGZvciBlYWNoIFNISiB0eXBlLiAqKGNsaWNrIHRvIHNlZSBjb2RlKSo8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgcGVyX3Jlc3BfZm9yZmlnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGdldCBkYXRhIGZvciBsaW5lIGZpZ3VyZQpwZXJfcmVzcF9mb3JmaWcgPC0gCiAgcGVyX2J5YmxvY2tfYnl0eXBlICU+JSAKICBzZWxlY3QoLW4pICU+JSAKICBnYXRoZXIoa2V5ID0gYmxvY2ssIHZhbHVlID0gZXJyb3IsIFBlckIxOlBlckIxMCkgJT4lIAogIHJlbmFtZShUeXBlID0gdHlwZSkKCiMgc2hvdyBkYXRhCmdsaW1wc2UocGVyX3Jlc3BfZm9yZmlnKQpgYGAKPC9kZXRhaWxzPgoKT3ZlcmFsbCwgdHlwZSAxIHdhcyB0aGUgZWFzaWVzdCBhbmQgZmFzdGVzdCBTSEogdHlwZSBsZWFybmVkLCB3aGljaCBmaXQgd2l0aCBvdXIgcHJlZGljdGlvbnMuIFRoaXMgd2FzIG5vdCBzdXJwcmlzaW5nIGFzIGl0IGlzIGJhc2VkIG9uIGEgc2luZ2xlLWRpbWVuc2lvbmFsIHJ1bGUgYW5kIGlzIGNvbnNpZGVyZWQgdGhlIGVhc2llc3QgdG8gbGVhcm4uIFRoZSByZXN0IG9mIHRoZSBTSEogdHlwZXMgd2VyZSBub3QgYXMgY2xlYXJseSByYW5rZWQgYXMgaW4gcHJldmlvdXMgc3R1ZGllcy4gVGhhdCBpcywgdGhlcmUgd2FzIGEgbWl4dHVyZSBvZiB3aGljaCB0eXBlIHdhcyB0aGUgZWFzaWVzdCB0byBsZWFybiB3aGVuIHlvdSBjb25zaWRlciB0aGUgZmlyc3QgYW5kIG1pZGRsZSBibG9ja3MuIFdoZW4gY29tcGFyaW5nIHRoZSBsYXN0IGJsb2NrIG9mIHBlcmZvcm1hbmNlIG9ubHksIGEgdHJlbmQgZGVwaWN0ZWQgdGhlIHByZWRpY3RlZCByYW5rIG9yZGVyIGRpZmZlcmVuY2U6IHR5cGUgMSB3YXMgdGhlIGVhc2llc3QgZm9yIHBhcnRpY2lwYW50cyB0byBsZWFybiwgZm9sbG93ZWQgYnkgdHlwZSAyLCB0aGVuIHR5cGUgMywgdGhlbiB0eXBlIDQgYW5kIDUgdGllZCwgYW5kIGxhc3RseSB3YXMgdHlwZSA2LiBIb3dldmVyLCB0aGUgZGF0YSB3YXMgbm90IHZlcnkgY2xlYXJseSByYW5rZWQsIGFnYWluIHNob3dpbmcgdGhlIHBvdGVudGlhbCBuZWVkIGZvciBhIGxhcmdlciBzYW1wbGUgc2l6ZS4KCmBgYHtyIHNob3cgcGVyX3Jlc3BfZm9yZmlnIGZpZ3VyZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBjcmVhdGUgY3VzdG9tIGNvbG9yIHBhbGxldCB0byBhdm9pZCBsaWdodCBjb2xvcnMgdGhhdCBhcmUgZGlmZmljdWx0IHRvIHNlZQpteV9wYWxldHRlID0gYygiI0Y2QkQ2MCIsICIjN0Q0RTU3IiwgIiNENjY4NTMiLCAiIzA1MzIyNSIsICIjMzc3NDk1IiwgIiM3OUI5QjUiKQoKIyBzaG93IGZpZ3VyZSBhcyBsaW5lIGdyYXBoCnBlcl9yZXNwX2ZpZyA8LSBnZ3Bsb3QocGVyX3Jlc3BfZm9yZmlnLCBhZXMoeCA9IGZhY3RvcihibG9jaywgbGV2ZWwgPSBjKCdQZXJCMScsICdQZXJCMicsICdQZXJCMycsICdQZXJCNCcsICdQZXJCNScsICdQZXJCNicsICdQZXJCNycsICdQZXJCOCcsICdQZXJCOScsICdQZXJCMTAnKSksIHkgPSBlcnJvciwgZ3JvdXAgPSBUeXBlLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxLjUpICsKICBnZW9tX3BvaW50KHNpemUgPSAyLjUpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IG15X3BhbGV0dGUpICsKICBsYWJzKHRpdGxlID0gIlBlcmZvcm1hbmNlIG9uIHRoZSA2IFNISiBUYXNrcyBieSBCbG9jayIsCiAgICAgICBzdWJ0aXRsZSA9ICJQZXJjZW50IENvcnJlY3QgUmVzcG9uc2VzIiwKICAgICAgIHggPSAiQmxvY2siLCAKICAgICAgIHkgPSAiUGVyZm9ybWFuY2UgKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMwLCAxMDApLCBicmVha3MgPSBjKHNlcSgwLCBtYXgocGVyX3Jlc3BfZm9yZmlnJGVycm9yKSArIDUsIDEwKSkpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoYXMuY2hhcmFjdGVyKDE6MTApKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICJUeXBlIikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwgCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMSwgImNtIiksCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUsIGNvbG9yID0gImJsYWNrIiksIAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksIAogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpCiAgICAgICAgKQoKIyBzaG93IGZpZwpwZXJfcmVzcF9maWcKCiMgZXhwb3J0IHBsb3QKICAjIHRpdGxlICYgY2FwdGlvbiByZW1vdmVkCiMgZ2dzYXZlKGZpbGVuYW1lPSJsaW5lX2ZpZ19vY3QxMy1maW5hbCIsIHBsb3QgPSBwZXJfcmVzcF9maWcsIGRldmljZSA9ICJqcGVnIiwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIsIGRwaSA9IDEwMDApCgpgYGAKCiMgQ29ycmVsYXRpb24gQW5hbHlzaXMKCiMjIFNldHRpbmcgVXAgdGhlIERhdGEKCjxkZXRhaWxzPgo8c3VtbWFyeT4gQ2xpY2sgaGVyZSB0byBzZWUgYW5hbHlzaXMgcHJlcCAoZS5nLiwgc2V0dGluZyB1cCB0aGUgZGF0YSkuIDwvc3VtbWFyeT4KCkZvciB0aGlzIGNvcnJlbGF0aW9uIGFuYWx5c2lzLCB3ZSB3ZXJlIGludGVyZXN0ZWQgaW4gY29tcGFyaW5nIHRoZSBwZXJmb3JtYW5jZSAoaS5lLiwgcGVyY2VudGFnZSBjb3JyZWN0KSB3aXRoIEFIUyBzY29yZSBmb3IgZWFjaCBjYXRlZ29yeSB0eXBlIChpLmUuLCB0eXBlIDEtNikuIFRoaXMgY29tcGFyaXNvbiB3YXMgZXhwbG9yZWQgZm9yIHRoZSBmaXJzdCBibG9jayAoaS5lLiwgYmxvY2sgMSksIG1pZGRsZSBibG9jayAoaS5lLiwgYmxvY2sgNSksIGxhc3QgYmxvY2sgKGkuZS4sIGJsb2NrIDEwKSwgYW5kIGNvbGxhcHNlZCBhY3Jvc3MgYWxsIGJsb2Nrcy4KCjxkZXRhaWxzPgo8c3VtbWFyeT4gRmlyc3QsIHdlICoqY3JlYXRlZCBhIGRhdGEgZnJhbWUqKiB3aXRoIHRoZSB2YXJpYWJsZXMgd2UgYXJlIGludGVyZXN0ZWQgaW4gKCoqImRhdGFfY29ycnMiKiopOiBTSEogdHlwZSwgYWNjdXJhY3kgKEIxLTEwKSwgYW5kIEFIUyByYXcgZGF0YS4gKihjbGljayB0byBzZWUgY29kZSkqPC9zdW1tYXJ5PgoKYGBge3IgY3JlYXRlIGRhdGFfY29ycnMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgbWFrZSBuZXcgZGF0YSBmcmFtZSBmcm9tIGRhdGFXCmRhdGFfY29ycnMgPC0gCiAgZGF0YVcgJT4lIAogICMgc2VsZWN0IHRoZSB3YW50ZWQgdmFyaWFibGVzOiBJRCwgdGFzaywgdHlwZSwgQUhTIGl0ZW1zLCBhY2N1cmFjeSwgUlQKICBzZWxlY3QoYyhJRCwgdGFzaywgdHlwZSwgYWNjdXJhY3lCMTphY2N1cmFjeUIxMCwgUzguMV9BSFNfMTpTOC4xX0FIU18yNCkpICU+JSAKICAjIGFkZCByZS1jb2RlZCB2YXJpYWJsZXMgZm9yIHRoZSByZXZlcnNlLWNvZGVkIEFIUyBpdGVtcyAoaS5lLiwgaXRlbXMgMTEsIDEzLCAxNCwgMTUsIDE2LCAmIDE4KQogIG11dGF0ZShTOC4xX0FIU18xMVIgPSBhcy5udW1lcmljKGRwbHlyOjpyZWNvZGUoUzguMV9BSFNfMTEsICcxJyA9ICc3JywgJzInID0gJzYnLCAnMycgPSAnNScsICc0JyA9ICc0JywgJzUnID0gJzMnLCAnNicgPSAnMicsICc3JyA9ICcxJykpLAogICAgICAgICBTOC4xX0FIU18xM1IgPSBhcy5udW1lcmljKGRwbHlyOjpyZWNvZGUoUzguMV9BSFNfMTMsICcxJyA9ICc3JywgJzInID0gJzYnLCAnMycgPSAnNScsICc0JyA9ICc0JywgJzUnID0gJzMnLCAnNicgPSAnMicsICc3JyA9ICcxJykpLCAKICAgICAgICAgUzguMV9BSFNfMTRSID0gYXMubnVtZXJpYyhkcGx5cjo6cmVjb2RlKFM4LjFfQUhTXzE0LCAnMScgPSAnNycsICcyJyA9ICc2JywgJzMnID0gJzUnLCAnNCcgPSAnNCcsICc1JyA9ICczJywgJzYnID0gJzInLCAnNycgPSAnMScpKSwgCiAgICAgICAgIFM4LjFfQUhTXzE1UiA9IGFzLm51bWVyaWMoZHBseXI6OnJlY29kZShTOC4xX0FIU18xNSwgJzEnID0gJzcnLCAnMicgPSAnNicsICczJyA9ICc1JywgJzQnID0gJzQnLCAnNScgPSAnMycsICc2JyA9ICcyJywgJzcnID0gJzEnKSksCiAgICAgICAgIFM4LjFfQUhTXzE2UiA9IGFzLm51bWVyaWMoZHBseXI6OnJlY29kZShTOC4xX0FIU18xNiwgJzEnID0gJzcnLCAnMicgPSAnNicsICczJyA9ICc1JywgJzQnID0gJzQnLCAnNScgPSAnMycsICc2JyA9ICcyJywgJzcnID0gJzEnKSksIAogICAgICAgICBTOC4xX0FIU18xOFIgPSBhcy5udW1lcmljKGRwbHlyOjpyZWNvZGUoUzguMV9BSFNfMTgsICcxJyA9ICc3JywgJzInID0gJzYnLCAnMycgPSAnNScsICc0JyA9ICc0JywgJzUnID0gJzMnLCAnNicgPSAnMicsICc3JyA9ICcxJykpCiAgICAgICAgICkgJT4lIAogICMgZm9yIGVhY2ggcGFydGljaXBhbnQuLi4gCiAgcm93d2lzZSgpICU+JSAKICAjIGFkZCBzY29yZSBmb3IgQUhTIChpLmUuLCBzdW0gb2YgaXRlbXMgMS0yNCBmb3IgZWFjaCBwYXJ0aWNpcGFudCkKICAgICMgaGlnaGVyIHNjb3JlIGNvcnJlc3BvbmRzIHRvIGdyZWF0ZXIgaG9saXNtCiAgbXV0YXRlKEFIU19zY29yZSA9IChzdW0oUzguMV9BSFNfMSwgUzguMV9BSFNfMiwgUzguMV9BSFNfMywgUzguMV9BSFNfNCwgUzguMV9BSFNfNSwgUzguMV9BSFNfNiwgUzguMV9BSFNfNywgUzguMV9BSFNfOCwgUzguMV9BSFNfOSwgUzguMV9BSFNfMTAsIFM4LjFfQUhTXzExUiwgUzguMV9BSFNfMTIsIFM4LjFfQUhTXzEzUiwgUzguMV9BSFNfMTRSLCBTOC4xX0FIU18xNVIsIFM4LjFfQUhTXzE2UiwgUzguMV9BSFNfMTcsIFM4LjFfQUhTXzE4UiwgUzguMV9BSFNfMTksIFM4LjFfQUhTXzIwLCBTOC4xX0FIU18yMSwgUzguMV9BSFNfMjIsIFM4LjFfQUhTXzIzLCBTOC4xX0FIU18yNCkpLzI0KSAlPiUgCiAgIyBhZGQgdmFyaWFibGUgZm9yIHBlcmNlbnQgcGVyZm9ybWFuY2UgZm9yIGVhY2ggYmxvY2sKICBtdXRhdGUocGVyX2FjY0IxID0gKHN1bShhY2N1cmFjeUIxKS84KSoxMDAsIHBlcl9hY2NCMiA9IChzdW0oYWNjdXJhY3lCMikvOCkqMTAwLCAKICAgICAgICAgcGVyX2FjY0IzID0gKHN1bShhY2N1cmFjeUIzKS84KSoxMDAsIHBlcl9hY2NCNCA9IChzdW0oYWNjdXJhY3lCNCkvOCkqMTAwLCAKICAgICAgICAgcGVyX2FjY0I1ID0gKHN1bShhY2N1cmFjeUI1KS84KSoxMDAsIHBlcl9hY2NCNiA9IChzdW0oYWNjdXJhY3lCNikvOCkqMTAwLCAKICAgICAgICAgcGVyX2FjY0I3ID0gKHN1bShhY2N1cmFjeUI3KS84KSoxMDAsIHBlcl9hY2NCOCA9IChzdW0oYWNjdXJhY3lCOCkvOCkqMTAwLAogICAgICAgICBwZXJfYWNjQjkgPSAoc3VtKGFjY3VyYWN5QjkpLzgpKjEwMCwgcGVyX2FjY0IxMCA9IChzdW0oYWNjdXJhY3lCMTApLzgpKjEwMCwgCiAgICAgICAgIHBlcl9hY2NfYWxsID0gKHN1bShhY2N1cmFjeUIxLCBhY2N1cmFjeUIyLCBhY2N1cmFjeUIzLCBhY2N1cmFjeUI0LCBhY2N1cmFjeUI1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5QjYsIGFjY3VyYWN5QjcsIGFjY3VyYWN5QjgsIGFjY3VyYWN5QjksIGFjY3VyYWN5QjEwKS84MCkqMTAwKSAlPiUgCiAgIyBhZGQgdmFyaWFibGVzIGZvciB0aGUgNCBsZWFybmluZyB0aW1lcyBvZiBpbnRlcmVzdDogZWFybHkgbGVhcm5pbmcgKGkuZS4sIGJsb2NrIDEtMyksIG1pZGRsZSBsZWFybmluZyAoaS5lLiwgYmxvY2sgNC03KSwgbGF0ZSBsZWFybmluZyAoaS5lLiwgYmxvY2sgOC0xMCksIGFuZCBjb2xsYXBzZWQgYWNyb3NzIGFsbCBibG9ja3MgKGkuZS4sIGJsb2NrIDEtMTApCiAgbXV0YXRlKHBlcl9lYXJseV9hY2MgPSAoc3VtKGFjY3VyYWN5QjEsIGFjY3VyYWN5QjIsIGFjY3VyYWN5QjMpLyg4KjMpKSoxMDAsIAogICAgICAgICBwZXJfbWlkX2FjYyA9IChzdW0oYWNjdXJhY3lCNCwgYWNjdXJhY3lCNSwgYWNjdXJhY3lCNiwgYWNjdXJhY3lCNykvKDgqNCkpKjEwMCwgCiAgICAgICAgIHBlcl9sYXRlX2FjYyA9IChzdW0oYWNjdXJhY3lCOCwgYWNjdXJhY3lCOSwgYWNjdXJhY3lCMTApLyg4KjMpKSoxMDApCiAgCmBgYAo8L2RldGFpbHM+Cgo8ZGV0YWlscz4KPHN1bW1hcnk+IE5leHQsIHdlIG1hZGUgKipzdWJzZXRzIG9mIHRoZSBkYXRhKiogZm9yIGVhY2ggY2F0ZWdvcnkgdHlwZSAoaS5lLiwgdHlwZSAxLTYpIGZvciB0aGUgYW5hbHlzaXMuIFRoZSByZXN1bHQgaXMgYSBkYXRhIGZyYW1lIGZvciBlYWNoIFNISiB0eXBlIChpLmUuLCAqKiJwZXJBSFNfdDEtcGVyQUhTX3Q2IioqKSBhbmQgY29sbGFwc2VkIGFjcm9zcyBhbGwgU0hKIHR5cGVzIChpLmUuLCAqKiJwZXJBSFNfdGFsbCIqKikgKihjbGljayB0byBzZWUgY29kZSkqPC9zdW1tYXJ5PgoKYGBge3IgY3JlYXRlIHBlckFIU190MS02JmFsbCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBzdWJzZXQgZGF0YSBmb3IgZWFjaCBjYXRlZ29yeSB0eXBlCiMgZm9yIHR5cGUgMQpwZXJBSFNfdDEgPC0gCiAgZGF0YV9jb3JycyAlPiUgCiAgZmlsdGVyKHR5cGUgPT0gMSkgJT4lICMgb25seSBzZWxlY3QgcHMgdGhhdCBjb21wbGV0ZWQgb25lIHR5cGUKICBzZWxlY3QoYyhBSFNfc2NvcmUsIHBlcl9lYXJseV9hY2MsIHBlcl9taWRfYWNjLCBwZXJfbGF0ZV9hY2MsIHBlcl9hY2NfYWxsKSkgIyBzZWxlY3QgdGhlIGNvbHVtbnMgbmVlZGVkIGZvciBhbmFseXNpcwoKIyBmb3IgdHlwZSAyCnBlckFIU190MiA8LSAKICBkYXRhX2NvcnJzICU+JSAKICBmaWx0ZXIodHlwZSA9PSAyKSAlPiUgIyBvbmx5IHNlbGVjdCBwcyB0aGF0IGNvbXBsZXRlZCBvbmUgdHlwZQogIHNlbGVjdChjKEFIU19zY29yZSwgcGVyX2Vhcmx5X2FjYywgcGVyX21pZF9hY2MsIHBlcl9sYXRlX2FjYywgcGVyX2FjY19hbGwpKSAjIHNlbGVjdCB0aGUgY29sdW1ucyBuZWVkZWQgZm9yIGFuYWx5c2lzCgojIGZvciB0eXBlIDMKcGVyQUhTX3QzIDwtIAogIGRhdGFfY29ycnMgJT4lIAogIGZpbHRlcih0eXBlID09IDMpICU+JSAjIG9ubHkgc2VsZWN0IHBzIHRoYXQgY29tcGxldGVkIG9uZSB0eXBlCiAgc2VsZWN0KGMoQUhTX3Njb3JlLCBwZXJfZWFybHlfYWNjLCBwZXJfbWlkX2FjYywgcGVyX2xhdGVfYWNjLCBwZXJfYWNjX2FsbCkpICMgc2VsZWN0IHRoZSBjb2x1bW5zIG5lZWRlZCBmb3IgYW5hbHlzaXMKCiMgZm9yIHR5cGUgNApwZXJBSFNfdDQgPC0gCiAgZGF0YV9jb3JycyAlPiUgCiAgZmlsdGVyKHR5cGUgPT0gNCkgJT4lICMgb25seSBzZWxlY3QgcHMgdGhhdCBjb21wbGV0ZWQgb25lIHR5cGUKICBzZWxlY3QoYyhBSFNfc2NvcmUsIHBlcl9lYXJseV9hY2MsIHBlcl9taWRfYWNjLCBwZXJfbGF0ZV9hY2MsIHBlcl9hY2NfYWxsKSkgIyBzZWxlY3QgdGhlIGNvbHVtbnMgbmVlZGVkIGZvciBhbmFseXNpcwoKIyBmb3IgdHlwZSA1CnBlckFIU190NSA8LSAKICBkYXRhX2NvcnJzICU+JSAKICBmaWx0ZXIodHlwZSA9PSA1KSAlPiUgIyBvbmx5IHNlbGVjdCBwcyB0aGF0IGNvbXBsZXRlZCBvbmUgdHlwZQogIHNlbGVjdChjKEFIU19zY29yZSwgcGVyX2Vhcmx5X2FjYywgcGVyX21pZF9hY2MsIHBlcl9sYXRlX2FjYywgcGVyX2FjY19hbGwpKSAjIHNlbGVjdCB0aGUgY29sdW1ucyBuZWVkZWQgZm9yIGFuYWx5c2lzCgojIGZvciB0eXBlIDYKcGVyQUhTX3Q2IDwtIAogIGRhdGFfY29ycnMgJT4lIAogIGZpbHRlcih0eXBlID09IDYpICU+JSAjIG9ubHkgc2VsZWN0IHBzIHRoYXQgY29tcGxldGVkIG9uZSB0eXBlCiAgc2VsZWN0KGMoQUhTX3Njb3JlLCBwZXJfZWFybHlfYWNjLCBwZXJfbWlkX2FjYywgcGVyX2xhdGVfYWNjLCBwZXJfYWNjX2FsbCkpICMgc2VsZWN0IHRoZSBjb2x1bW5zIG5lZWRlZCBmb3IgYW5hbHlzaXMKCiMgY29sbHBhc2VkIGFjcm9zcyB0eXBlIDEtNgpwZXJBSFNfdGFsbCA8LQogIGRhdGFfY29ycnMgJT4lCiAgc2VsZWN0KGMoQUhTX3Njb3JlLCBwZXJfZWFybHlfYWNjLCBwZXJfbWlkX2FjYywgcGVyX2xhdGVfYWNjLCBwZXJfYWNjX2FsbCkpICMgc2VsZWN0IHRoZSBjb2x1bW5zIG5lZWRlZCBmb3IgYW5hbHlzaXMKCmBgYAo8L2RldGFpbHM+CgoKPC9kZXRhaWxzPgoKCiMjIEFzc3VtcHRpb24gVGVzdHMKCjxkZXRhaWxzPgo8c3VtbWFyeT4gQWxsIGFzc3VtcHRpb25zIHdlcmUgbWV0IGZvciB0aGUgY29ycmVsYXRpb24gYW5hbHlzaXMuIENsaWNrIGhlcmUgdG8gc2VlIHRoZSBhc3N1bXB0aW9uIHRlc3RzLiA8L3N1bW1hcnk+CgoKVGhlIGFzc3VtcHRpb25zIGZvciBhIGNvcnJlbGF0aW9uIGFuYWx5c2lzIHdlcmUgdGVzdGVkLiBUaGVyZSB3ZXJlIHR3byBhc3N1bXB0aW9uczogKDEpIExpbmVhcml0eSBhbmQgKDIpIE5vcm1hbGl0eS4gCgoKMS4gTGluZWFyaXR5IHdhcyB2aXN1YWxseSBpbnNwZWN0ZWQgZnJvbSB0aGUgc2NhdHRlciBwbG90cyAoc2VlIHBsb3RzIGluIHRoZSAiKkZpZ3VyZXM6IFNjYXR0ZXIgUGxvdHMqIiBzZWN0aW9uKS4KCjIuIE5vcm1hbGl0eSB3YXMgdGVzdGVkIHVzaW5nIChhKSB0aGUgU2hhcGlyby1XaWxrIG5vcm1hbGl0eSB0ZXN0IGFuZCAoYikgdmlzdWFsbHkgaW5zcGVjdGVkIHVzaW5nIGEgbm9ybWFsaXR5IHBsb3QuCiAgICAtIFRoZSBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3Qgd2lsbCBzaG93IHR3byB2YWx1ZXMgKGkuZS4sICpXKiBhbmQgKnAqKSBhbmQgZWFjaCB0ZXN0IHVzZXMgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2VzOiBIfk5+OiB0aGUgZGF0YSBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYW5kIEh+QX46IHRoZSBkYXRhIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCiAgICAtIFRoZSBub3JtYWxpdHkgcGxvdHMgdXNlZCB3ZXJlIFEtUSBwbG90cyAocXVhbnRpbGUtcXVhbnRpbGUgcGxvdHMpLCB3aGljaCBkcmF3IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgZ2l2ZW4gc2FtcGxlIGFuZCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gPC9zdW1tYXJ5PgoKIyMjIChhKSBTaGFwaXJvLVdpbGsgTm9ybWFsaXR5IFRlc3QKCjxkZXRhaWxzPgo8c3VtbWFyeT4gVGhlIHRhYmxlIGRlcGljdHMgdGhlIHJlc3VsdHMgb2YgdGhlIFNoYXBpcm8tV2lsa3Mgbm9ybWFsaXR5IHRlc3QgZm9yIGVhY2ggbWVhc3VyZS4gKihjbGljayB0byBzZWUgY29kZSkqIDwvc3VtbWFyeT4KCmBgYHtyIGNyZWF0ZSBjb3Jyc19ub3JtX3Rlc3QsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgY3JlYXRlIGEgdGFibGUgdG8gc2hvdyByZXN1bHRzIG9mIGFsbCBub3JtYWxpdHkgdGVzdHMKY29ycnNfbm9ybV90ZXN0IDwtIAogIHRpYmJsZShTdGF0aXN0aWMgPSByZXAoYygiVyIsICJwLXZhbHVlIiksIDUpLCAKICAgICAgICAgQWxsID0gYyhzaGFwaXJvLnRlc3QocGVyQUhTX3RhbGwkcGVyX2Vhcmx5X2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3RhbGwkcGVyX2Vhcmx5X2FjYykkcC52YWx1ZSwgIyBXICYgcC12YWx1ZSBmb3IgYmxvY2sgMS0zCiAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190YWxsJHBlcl9taWRfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdGFsbCRwZXJfbWlkX2FjYykkcC52YWx1ZSwgIyBXICYgcC12YWx1ZSBmb3IgYmxvY2sgNC03CiAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190YWxsJHBlcl9sYXRlX2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3RhbGwkcGVyX2xhdGVfYWNjKSRwLnZhbHVlLCAjIFcgJiBwLXZhbHVlIGZvciBibG9jayA4LTEwCiAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190YWxsJHBlcl9hY2NfYWxsKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdGFsbCRwZXJfYWNjX2FsbCkkcC52YWx1ZSwgIyBXICYgcC12YWx1ZSBmb3IgYmxvY2sgYWxsCiAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190YWxsJEFIU19zY29yZSkkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3RhbGwkQUhTX3Njb3JlKSRwLnZhbHVlKSwgIyBXICYgcC12YWx1ZSBmb3IgQUhTX3Njb3JlCiAgICAgICAgIFR5cGUxID0gYyhzaGFwaXJvLnRlc3QocGVyQUhTX3QxJHBlcl9lYXJseV9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190MSRwZXJfZWFybHlfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDEkcGVyX21pZF9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190MSRwZXJfbWlkX2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3QxJHBlcl9sYXRlX2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3QxJHBlcl9sYXRlX2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3QxJHBlcl9hY2NfYWxsKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDEkcGVyX2FjY19hbGwpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190MSRBSFNfc2NvcmUpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190MSRBSFNfc2NvcmUpJHAudmFsdWUpLAogICAgICAgICBUeXBlMiA9IGMoc2hhcGlyby50ZXN0KHBlckFIU190MiRwZXJfZWFybHlfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDIkcGVyX2Vhcmx5X2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3QyJHBlcl9taWRfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDIkcGVyX21pZF9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190MiRwZXJfbGF0ZV9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190MiRwZXJfbGF0ZV9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190MiRwZXJfYWNjX2FsbCkkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3QyJHBlcl9hY2NfYWxsKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDIkQUhTX3Njb3JlKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDIkQUhTX3Njb3JlKSRwLnZhbHVlKSwKICAgICAgICAgVHlwZTMgPSBjKHNoYXBpcm8udGVzdChwZXJBSFNfdDMkcGVyX2Vhcmx5X2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3QzJHBlcl9lYXJseV9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190MyRwZXJfbWlkX2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3QzJHBlcl9taWRfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDMkcGVyX2xhdGVfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDMkcGVyX2xhdGVfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDMkcGVyX2FjY19hbGwpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190MyRwZXJfYWNjX2FsbCkkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3QzJEFIU19zY29yZSkkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3QzJEFIU19zY29yZSkkcC52YWx1ZSksIAogICAgICAgICBUeXBlNCA9IGMoc2hhcGlyby50ZXN0KHBlckFIU190NCRwZXJfZWFybHlfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDQkcGVyX2Vhcmx5X2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3Q0JHBlcl9taWRfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDQkcGVyX21pZF9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190NCRwZXJfbGF0ZV9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190NCRwZXJfbGF0ZV9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190NCRwZXJfYWNjX2FsbCkkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3Q0JHBlcl9hY2NfYWxsKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDQkQUhTX3Njb3JlKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDQkQUhTX3Njb3JlKSRwLnZhbHVlKSwgCiAgICAgICAgIFR5cGU1ID0gYyhzaGFwaXJvLnRlc3QocGVyQUhTX3Q1JHBlcl9lYXJseV9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190NSRwZXJfZWFybHlfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDUkcGVyX21pZF9hY2MpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190NSRwZXJfbWlkX2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3Q1JHBlcl9sYXRlX2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3Q1JHBlcl9sYXRlX2FjYykkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3Q1JHBlcl9hY2NfYWxsKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDUkcGVyX2FjY19hbGwpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190NSRBSFNfc2NvcmUpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190NSRBSFNfc2NvcmUpJHAudmFsdWUpLCAKICAgICAgICAgVHlwZTYgPSBjKHNoYXBpcm8udGVzdChwZXJBSFNfdDYkcGVyX2Vhcmx5X2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3Q2JHBlcl9lYXJseV9hY2MpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgc2hhcGlyby50ZXN0KHBlckFIU190NiRwZXJfbWlkX2FjYykkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3Q2JHBlcl9taWRfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDYkcGVyX2xhdGVfYWNjKSRzdGF0aXN0aWMsIHNoYXBpcm8udGVzdChwZXJBSFNfdDYkcGVyX2xhdGVfYWNjKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgICAgIHNoYXBpcm8udGVzdChwZXJBSFNfdDYkcGVyX2FjY19hbGwpJHN0YXRpc3RpYywgc2hhcGlyby50ZXN0KHBlckFIU190NiRwZXJfYWNjX2FsbCkkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICBzaGFwaXJvLnRlc3QocGVyQUhTX3Q2JEFIU19zY29yZSkkc3RhdGlzdGljLCBzaGFwaXJvLnRlc3QocGVyQUhTX3Q2JEFIU19zY29yZSkkcC52YWx1ZSkKICAgICAgICAgKQojIGNvdW50IGhvdyBtYW55IHAtdmFsdWVzIHdlcmUgc2lnLiAoaS5lLiwgbGVzcyB0aGFuIDAuMDUpCmNvcnJzX25vcm1fdGVzdF9zaWcgPC0gCiAgbGVuZ3RoKHdoaWNoKGNvcnJzX25vcm1fdGVzdCRBbGwgW2MoMiwgNCwgNiwgOCAsMTApXSA8IC4wNSkpICsgIyBmb3IgYWxsIFNISiB0eXBlcwogIGxlbmd0aCh3aGljaChjb3Jyc19ub3JtX3Rlc3QkVHlwZTFbYygyLCA0LCA2LCA4ICwxMCldIDwgLjA1KSkgKyAjIGZvciB0eXBlIDEKICBsZW5ndGgod2hpY2goY29ycnNfbm9ybV90ZXN0JFR5cGUyW2MoMiwgNCwgNiwgOCAsMTApXSA8IC4wNSkpICsgIyBmb3IgdHlwZSAyCiAgbGVuZ3RoKHdoaWNoKGNvcnJzX25vcm1fdGVzdCRUeXBlM1tjKDIsIDQsIDYsIDggLDEwKV0gPCAuMDUpKSArICMgZm9yIHR5cGUgMwogIGxlbmd0aCh3aGljaChjb3Jyc19ub3JtX3Rlc3QkVHlwZTRbYygyLCA0LCA2LCA4ICwxMCldIDwgLjA1KSkgKyAjIGZvciB0eXBlIDQKICBsZW5ndGgod2hpY2goY29ycnNfbm9ybV90ZXN0JFR5cGU1W2MoMiwgNCwgNiwgOCAsMTApXSA8IC4wNSkpICsgIyBmb3IgdHlwZSA1CiAgbGVuZ3RoKHdoaWNoKGNvcnJzX25vcm1fdGVzdCRUeXBlNltjKDIsIDQsIDYsIDggLDEwKV0gPCAuMDUpKSAjIGZvciB0eXBlIDYKICAKCmBgYAoKPC9kZXRhaWxzPgoKICAgIC0gQXMgc2VlbiBpbiB0aGUgdGFibGUsIGByIHJvdW5kKChjb3Jyc19ub3JtX3Rlc3Rfc2lnLzMwKSoxMDAsIDIpYCUgb2YgdGhlIG1lYXN1cmVzIHNob3dlZCBzaWduaWZpY2FudCBwLXZhbHVlcyBhbmQgdGhlcmVmb3JlIHZpb2xhdGVkIHRoZSBhc3N1bXB0aW9uIG9mIG5vcm1hbGl0eS4gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQsIGZvciBlYWNoIFNISiB0eXBlIGFuZCB3aGVuIGNvbGxhcHNlZCBhY3Jvc3MgYWxsIFNISiB0eXBlcywgdGhlIEFIUyBzY29yZSB3YXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFRoaXMgc2NvcmUgd2lsbCBiZSBjb3JyZWxhdGVkIHdpdGggdGFzayBwZXJmb3JtYW5jZSBkdXJpbmcgZGlmZmVyZW50IGJsb2Nrcywgd2hpY2ggd2VyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFRoZSB2aXN1YWwgaW5zcGVjdGlvbiBvZiB0aGUgUS1RIHBsb3RzIHdhcyBjb21wbGV0ZWQgbmV4dC4KCmBgYHtyIHNob3cgY29ycnNfbm9ybV90ZXN0IHRhYmxlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHNob3cgdGFibGUgdXNpbmcga2FibGUKa2FibGUoY29ycnNfbm9ybV90ZXN0LCBjYXB0aW9uID0gIlNoYXBpcm8tV2lsa3MgTm9ybWFsaXR5IFRlc3QgZm9yIEFsbCBDb3JyZWxhdGlvbiBNZWFzdXJlcyBHcm91cGVkIGJ5IFNISiBUYXNrIFR5cGUiLCBhbGlnbiA9IHJlcCgnYycpLCBkaWdpdHMgPSAyLCBjb2wubmFtZXMgPSBjKCIgIiwgIkFsbCIsICJUeXBlIDEiLCAiVHlwZSAyIiwgIlR5cGUgMyIsICJ0eXBlIDQiLCAiVHlwZSA1IiwgIlR5cGUgNiIpKSAlPiUgCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJOb3JtYWxpdHkgaXMgbWV0IGZvciBub24tc2lnbmlmaWNhbnQgcC12YWx1ZXMgKGkuZS4sIGdyZWF0ZXIgdGhhbiAwLjA1KS4iKSAlPiUgCiAgcGFja19yb3dzKCJFYXJseSBQZXJmb3JtYW5jZSIsIDEsIDIpICU+JQogIHBhY2tfcm93cygiTWlkZGxlIFBlcmZvcm1hbmNlIiwgMywgNCkgJT4lCiAgcGFja19yb3dzKCJMYXRlIFBlcmZvcm1hbmNlIiwgNSwgNikgJT4lCiAgcGFja19yb3dzKCJCMS0xMCBQZXJmb3JtYW5jZSIsIDcsIDgpICU+JSAKICBwYWNrX3Jvd3MoIkFIUyBTY29yZSIsIDksIDEwKSAlPiUKICBrYWJsZV9jbGFzc2ljKCkKYGBgCgoKIyMjIChiKSBRLVEgUGxvdHMKCjxkZXRhaWxzPgo8c3VtbWFyeT4gT3ZlcmFsbCwgdGhlIFEtUSBwbG90cyBzaG93IHRoZSBkYXRhIGZvciBhbGwgdmFyaWFibGVzIChpLmUuLCBibG9jayAxLCA1LCAxMCwgMS0xMCBwZXJmb3JtYW5jZSwgYW5kIEFIUyBzY29yZSkgZGlkIGZhbGwgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuIFRoZXJlZm9yZSwgbm9ybWFsaXR5IHdhcyBtZXQgZm9yIGFsbCB2YXJpYWJsZXMgYXQgZWFjaCBTSEogY2F0ZWdvcnkgdHlwZSwgZXhjbHVkaW5nOiAgKihjbGljayB0byBzZWUgY29kZSkqCgpBSFMgU2NvcmUsIHdoaWNoIGlzIG1vc3RseSBmYWxsaW5nIGFsb25nIHRoZSBsaW5lLiBBZGRpdGlvbmFsbHksIHRoZSBwbG90cyBhY3Jvc3MgYWxsIFNISiB0eXBlcyAoaS5lLiwgYXMgb3Bwb3NlZCB0byBmb3IgZGlmZmVyZW50IHR5cGVzKSBhcmUgYWxzbyBjbG9zZXIgdG8gZGVwaWN0aW5nIG5vcm1hbGl0eS4gVGhpcyB3YXMgbm90IHN1cnByaXNpbmcgc2luY2UgdGhlIHNhbXBsZSBzaXplICgkTl97YWxsfSQgPSBgciBucm93KHBlckFIU190YWxsKWApIGlzIG11Y2ggbGFyZ2VyIGZvciB0aGlzIGdyb3VwLiBPdmVyYWxsLCB0aGUgU2hhcGlyby1XaWxrIHRlc3QgYW5kIHRoZSB2aXN1YWwgaW5zcGVjdGlvbiBvZiB0aGUgUS1RIHBsb3RzIGRlbW9uc3RyYXRlIHRoYXQgbm9ybWFsaXR5IHdhcyBub3QgbWV0LiBBZGRpdGlvbmFsbHksIHRoZSBzYW1wbGUgc2l6ZXMgZm9yIHRoZSBkaWZmZXJlbnQgU0hKIHR5cGUncyBkYXRhIHdlcmUgc21hbGwgKGkuZS4sICROX3tUeXBlIDF9JCA9IGByIG5yb3cocGVyQUhTX3QxKWAsICROX3tUeXBlIDJ9JCA9IGByIG5yb3cocGVyQUhTX3QyKWAsICROX3tUeXBlIDN9JCA9IGByIG5yb3cocGVyQUhTX3QzKWAsICROX3tUeXBlIDR9JCA9IGByIG5yb3cocGVyQUhTX3Q0KWAsICROX3tUeXBlIDV9JCA9IGByIG5yb3cocGVyQUhTX3Q1KWAsICROX3tUeXBlIDZ9JCA9IGByIG5yb3cocGVyQUhTX3Q2KWApLiAqKGNsaWNrIHRvIHNlZSBjb2RlKSoKCjwvc3VtbWFyeT4KCmBgYHtyIGNvZGUgcXEgcGxvdHMsIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9CiMgQ29sbGFwc2VkIGFjcm9zcyB0eXBlIDEtNgpncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3RhbGwkcGVyX2Vhcmx5X2FjYywgeWxhYiA9ICJFYXJseSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3RhbGwkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdGFsbCRwZXJfbGF0ZV9hY2MsIHlsYWIgPSAiTGF0ZSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3RhbGwkcGVyX2FjY19hbGwsIHlsYWIgPSAiQjEtMTAgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190YWxsJEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIEFsbCBTSEogVHlwZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIk5vcm1hbGl0eSBpcyBtZXQgZm9yIHBsb3RzIHdlcmUgZGF0YSBmYWxscyBhbG9uZyBvciBjbG9zZSB0byB0aGUgbGluZS4gKiBTLVcgcCA8IC4wNSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCkKICAgICAgICAgICAgICkKIyBGb3IgVHlwZSAxCmdyaWQuYXJyYW5nZShnZ3FxcGxvdChwZXJBSFNfdDEkcGVyX2Vhcmx5X2FjYywgeWxhYiA9ICJFYXJseSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QxJHBlcl9taWRfYWNjLCB5bGFiID0gIk1pZGRsZSBQZXJmb3JtYW5jZSoiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MSRwZXJfbGF0ZV9hY2MsIHlsYWIgPSAiTGF0ZSBQZXJmb3JtYW5jZSoiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MSRwZXJfYWNjX2FsbCwgeWxhYiA9ICJCMS0xMCBQZXJmb3JtYW5jZSoiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MSRBSFNfc2NvcmUsIHlsYWIgPSAiQUhTIFNjb3JlIiksCiAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYigiUS1RIFBsb3RzIEZvciBUeXBlIDEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwgIyBzaG93IHRleHQgaW4gYm9sZAogICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJOb3JtYWxpdHkgaXMgbWV0IGZvciBwbG90cyB3ZXJlIGRhdGEgZmFsbHMgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuICogUy1XIHAgPCAuMDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIsICMgc2hvdyB0ZXh0IGluIGl0YWxpY3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgIyBzcGVjaWZ5IG9yaWVudGF0aW9uIG9uIHgtYXhpcyAoYm90dG9tIEwgPSAwKSAoTk9URTogdXNlIGJvdGggeCAmIGhqdXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCkgIyBzcGVjaWZ5IGhvcml6b250YWwganVzdGlmaWNhdGlvbiAoTk9URTogdXNlIGJvdGggeCAmIGhqdXN0KQogICAgICAgICAgICAgKQojIEZvciBUeXBlIDIKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190MiRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDIkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QyJHBlcl9sYXRlX2FjYywgeWxhYiA9ICJMYXRlIFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QyJHBlcl9hY2NfYWxsLCB5bGFiID0gIkIxLTEwIFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QyJEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIFR5cGUgMiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQojIEZvciBUeXBlIDMKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190MyRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QzJHBlcl9taWRfYWNjLCB5bGFiID0gIk1pZGRsZSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QzJHBlcl9sYXRlX2FjYywgeWxhYiA9ICJMYXRlIFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3QzJHBlcl9hY2NfYWxsLCB5bGFiID0gIkIxLTEwIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDMkQUhTX3Njb3JlLCB5bGFiID0gIkFIUyBTY29yZSIpLAogICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlEtUSBQbG90cyBGb3IgVHlwZSAzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJOb3JtYWxpdHkgaXMgbWV0IGZvciBwbG90cyB3ZXJlIGRhdGEgZmFsbHMgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuICogUy1XcyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQojIEZvciBUeXBlIDQKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190NCRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDQkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDQkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NCRwZXJfYWNjX2FsbCwgeWxhYiA9ICJCMS0xMCBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q0JEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIFR5cGUgNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQojIEZvciBUeXBlIDUKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190NSRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDUkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDUkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NSRwZXJfYWNjX2FsbCwgeWxhYiA9ICJCMS0xMCBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q1JEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIFR5cGUgNSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQojIEZvciBUeXBlIDYKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190NiRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlKiIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q2JHBlcl9taWRfYWNjLCB5bGFiID0gIk1pZGRsZSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q2JHBlcl9sYXRlX2FjYywgeWxhYiA9ICJMYXRlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDYkcGVyX2FjY19hbGwsIHlsYWIgPSAiQjEtMTAgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NiRBSFNfc2NvcmUsIHlsYWIgPSAiQUhTIFNjb3JlIiksCiAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYigiUS1RIFBsb3RzIEZvciBUeXBlIDYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIk5vcm1hbGl0eSBpcyBtZXQgZm9yIHBsb3RzIHdlcmUgZGF0YSBmYWxscyBhbG9uZyBvciBjbG9zZSB0byB0aGUgbGluZS4gKiBTLVcgcCA8IC4wNSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCkKICAgICAgICAgICAgICkKYGBgCgo8L2RldGFpbHM+Clx0YWMKPGRldGFpbHM+CjxzdW1tYXJ5PiBDb2xsYXBzZWQgKiphY3Jvc3MgU0hKIHR5cGVzKiosIHRoZSBkYXRhIGZvciBhbGwgdmFyaWFibGVzIGZvbGxvd2VkIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLCBzdWdnZXN0aW5nIG5vcm1hbGl0eS4gQjEtMTAgUGVyZm9ybWFuY2Ugd2FzIG1vZGVyYXRlbHktdGFpbGVkIGFuZCB0aGUgb3RoZXIgdmFyaWFibGVzIHdlcmUgbGlnaHQtdGFpbGVkLiBUaGlzIHdhcyBjb250cmFkaWN0b3J5IHRvIHRoZSBTaGFwaXJvLVdpbGtzIG5vcm1hbGl0eSB0ZXN0LCB3aGljaCBpbmRpY2F0ZWQgdGhhdCBhbGwgdmFyaWFibGVzIChleGNsdWRpbmcgdGhlIEFIUyBzY29yZSkgd2VyZSBub24tbm9ybWFsLiBIb3dldmVyLCB0aGlzIGRhdGEgaGFzIGEgbGFyZ2Ugc2FtcGxlIHNpemUgKCROX3thbGx9JCA9IGByIG5yb3cocGVyQUhTX3RhbGwpYCkgYW5kLCBvdmVyYWxsLCB0aGUgZGF0YSBhcmUgZGlzdHJpYnV0ZWQgYWxvbmcgdGhlIGxpbmUuIFRoZXJlZm9yZSwgYSAqKlBlYXJzb24gY29ycmVsYXRpb24qKiB3YXMgY29tcGxldGVkIGZvciAqKkVhcmx5IFBlcmZvcm1hbmNlKiosICoqTWlkZGxlIFBlcmZvcm1hbmNlKiosICoqQjEtMTAgUGVyZm9ybWFuY2UqKiwgYW5kICoqQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nKiogZm9yIHRoaXMgZ3JvdXAuICooY2xpY2sgdG8gc2VlIHFxIHBsb3RzKSo8L3N1bW1hcnk+CgpgYGB7ciBzaG93IHFxQWxsLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIENvbGxhcHNlZCBhY3Jvc3MgdHlwZSAxLTYKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190YWxsJHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190YWxsJHBlcl9taWRfYWNjLCB5bGFiID0gIk1pZGRsZSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3RhbGwkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190YWxsJHBlcl9hY2NfYWxsLCB5bGFiID0gIkIxLTEwIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdGFsbCRBSFNfc2NvcmUsIHlsYWIgPSAiQUhTIFNjb3JlIiksCiAgICAgICAgICAgICBoZWlnaHRzID0gYyguNSwgLjUpLAogICAgICAgICAgICAgIyBucm93ID0gMSwKICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYigiUS1RIFBsb3RzIEZvciBBbGwgU0hKIFR5cGVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJOb3JtYWxpdHkgaXMgbWV0IGZvciBwbG90cyB3ZXJlIGRhdGEgZmFsbHMgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuICogUy1XIHAgPCAuMDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDApCiAgICAgICAgICAgICApCmBgYAo8L2RldGFpbHM+CgoKPGRldGFpbHM+CjxzdW1tYXJ5PiBGb3IgKipUeXBlIDEqKiwgdGhlIGRhdGEgZm9yIHRoZSB2YXJpYWJsZXMgRWFybHkgUGVyZm9ybWFuY2UsIEIxLTEwIFBlcmZvcm1hbmNlLCBhbmQgQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLCBzdWdnZXN0aW5nIG5vcm1hbGl0eS4gRWFybHkgUGVyZm9ybWFuY2UgYW5kIEFIUyBzY29yZSBhcmUgbGlnaHQgdGFpbGVkLCBhbmQgQjEtMTAgUGVyZm9ybWFuY2UgaXMgaGVhdnktdGFpbGVkIHdpdGggYSBwb3NzaWJsZSBvdXRsaWVyLiBUaGUgdmFyaWFibGVzIEI1IFBlcmZvcm1hbmNlIGFuZCBCMTAgUGVyZm9ybWFuY2UgZGlkIG5vdCBjbG9zZWx5IGZvbGxvdyBhbG9uZyB0aGUgbGluZSBhbmQgc3VnZ2VzdGVkIG5vbi1ub3JtYWwgZGF0YS4gQjUgUGVyZm9ybWFuY2Ugd2FzIGhlYXZpbHkgY29uY2VudHJhdGVkLCBsZWZ0IHNrZXdlZCwgYW5kIGhhZCBzb21lIHBvc3NpYmxlIG91dGxpZXJzLiBCMTAgUGVyZm9ybWFuY2UgaGFkIGdhcHMgYmV0d2VlbiB0d28gc2V0cyBvZiBjb25jZW50cmF0ZWQgZGF0YSBhbmQgd2FzIHNsaWdodGx5IGxlZnQgc2tld2VkLiBUaGVzZSByZXN1bHRzIHdlcmUgY29uc2lzdGVudCB3aXRoIHRoZSBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3Qgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIEIxLTEwIFBlcmZvcm1hbmNlLCB3aGljaCBpbmRpY2F0ZWQgbm9uLW5vcm1hbGl0eS4gSG93ZXZlciwgc2luY2UgdGhlIG92ZXJhbGwgZGlzdHJpYnV0aW9uIGZvciBCMS0xMCBQZXJmb3JtYW5jZSB3YXMgYWxvbmcgdGhlIHN0cmFpZ2h0IGxpbmUsIGl0IHdhcyBjb25zaWRlcmVkIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGVyZWZvcmUsIGEgKipQZWFyc29uIGNvcnJlbGF0aW9uKiogd2FzIGNvbXBsZXRlZCBmb3IgKipFYXJseSBQZXJmb3JtYW5jZSoqLCAqKkIxLTEwIFBlcmZvcm1hbmNlKiosIGFuZCAqKkFIUyBTY29yZSBmb2xsb3dlZCBhbG9uZyoqIGZvciB0aGlzIGdyb3VwLiBTaW5jZSBib3RoIG5vcm1hbGl0eSB0ZXN0cyBzaG93ZWQgbm9uLW5vcm1hbCBkYXRhLCBhICoqS2VuZGFsbCBjb3JyZWxhdGlvbioqIChpLmUuLCBub24tcGFyYW1ldHJpYyBjb3JyZWxhdGlvbjsgc2VlICIqS2VuZGFsbCdzICRcdGF1X3tifSQgUmFuay1PcmRlciBDb3JyZWxhdGlvbnMqIiBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMpIHdhcyBjb21wbGV0ZWQgZm9yICoqQjUgUGVyZm9ybWFuY2UqKiBhbmQgKipCMTAgUGVyZm9ybWFuY2UqKiBmb3IgdGhpcyBncm91cC4gKihjbGljayB0byBzZWUgcXEgcGxvdHMpKiAqPC9zdW1tYXJ5PgoKYGBge3Igc2hvdyBxcTEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgMQpncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3QxJHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MSRwZXJfbWlkX2FjYywgeWxhYiA9ICJNaWRkbGUgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDEkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDEkcGVyX2FjY19hbGwsIHlsYWIgPSAiQjEtMTAgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDEkQUhTX3Njb3JlLCB5bGFiID0gIkFIUyBTY29yZSIpLAogICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlEtUSBQbG90cyBGb3IgVHlwZSAxIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksICMgc2hvdyB0ZXh0IGluIGJvbGQKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAjIHNob3cgdGV4dCBpbiBpdGFsaWNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsICMgc3BlY2lmeSBvcmllbnRhdGlvbiBvbiB4LWF4aXMgKGJvdHRvbSBMID0gMCkgKE5PVEU6IHVzZSBib3RoIHggJiBoanVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDApICMgc3BlY2lmeSBob3Jpem9udGFsIGp1c3RpZmljYXRpb24gKE5PVEU6IHVzZSBib3RoIHggJiBoanVzdCkKICAgICAgICAgICAgICkKYGBgCgo8L2RldGFpbHM+CgoKPGRldGFpbHM+CjxzdW1tYXJ5PiBGb3IgKipUeXBlIDIqKiwgdGhlIGRhdGEgZm9yIHRoZSB2YXJpYWJsZXMgQjUgUGVyZm9ybWFuY2UsIEIxMCBQZXJmb3JtYW5jZSwgYW5kIEIxLTEwIFBlcmZvcm1hbmNlIGZvbGxvd2VkIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLCBzdWdnZXN0aW5nIG5vcm1hbGl0eS4gQjUgUGVyZm9ybWFuY2UsIEIxMCBQZXJmb3JtYW5jZSwgYW5kIEIxLTEwIFBlcmZvcm1hbmNlIHdlcmUgaGVhdnktdGFpbGVkLiBUaGUgdmFyaWFibGVzIEVhcmx5IFBlcmZvcm1hbmNlIGFuZCBBSFMgU2NvcmUgZGlkIG5vdCBjbG9zZWx5IGZvbGxvdyBhbG9uZyB0aGUgbGluZSBhbmQgc3VnZ2VzdGVkIG5vbi1ub3JtYWwgZGF0YS4gRWFybHkgUGVyZm9ybWFuY2Ugd2FzIGhlYXZpbHkgY29uY2VudHJhdGVkLCBsZWZ0IHNrZXdlZCwgYW5kIGhhZCBzb21lIHBvc3NpYmxlIG91dGxpZXJzLiBBSFMgU2NvcmUgd2FzIGhlYXZ5LXRhaWxlZCB3aXRoIG1vc3QgZGF0YSBmYWxsaW5nIG9uIHRoZSBsaW5lLiBJbnRlcmVzdGluZ2x5LCB0aGVzZSByZXN1bHRzIHdlcmUgb3Bwb3NpdGUgdG8gdGhlIFNoYXBpcm8tV2lsayBub3JtYWxpdHkgdGVzdC4gSG93ZXZlciwgb3ZlcmFsbCB0aGUgZGF0YSBtb3N0bHkgZm9sbG93ZWQgYWxvbmcgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIHdhcyBjb25zaWRlcmVkIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGVyZWZvcmUsIGEgKipQZWFyc29uIGNvcnJlbGF0aW9uKiogd2FzIGNvbXBsZXRlZCBmb3IgKipFYXJseSBQZXJmb3JtYW5jZSoqLCAqKkI1IFBlcmZvcm1hbmNlKiosICoqQjEwIFBlcmZvcm1hbmNlKiosICoqQjEtMTAgUGVyZm9ybWFuY2UqKiwgYW5kICoqQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nKiogZm9yIHRoaXMgZ3JvdXAuICooY2xpY2sgdG8gc2VlIHFxIHBsb3RzKSogPC9zdW1tYXJ5PgoKYGBge3Igc2hvdyBxcTIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgMgpncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3QyJHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MiRwZXJfbWlkX2FjYywgeWxhYiA9ICJNaWRkbGUgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDIkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDIkcGVyX2FjY19hbGwsIHlsYWIgPSAiQjEtMTAgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDIkQUhTX3Njb3JlLCB5bGFiID0gIkFIUyBTY29yZSIpLAogICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlEtUSBQbG90cyBGb3IgVHlwZSAyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJOb3JtYWxpdHkgaXMgbWV0IGZvciBwbG90cyB3ZXJlIGRhdGEgZmFsbHMgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuICogUy1XIHAgPCAuMDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDApCiAgICAgICAgICAgICApCmBgYAoKPC9kZXRhaWxzPgoKCjxkZXRhaWxzPgo8c3VtbWFyeT4gRm9yICoqVHlwZSAzKiosIHRoZSBkYXRhIGZvciB0aGUgdmFyaWFibGVzIEI1IFBlcmZvcm1hbmNlLCBCMTAgUGVyZm9ybWFuY2UsIEIxLTEwIFBlcmZvcm1hbmNlLCBhbmQgQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLCBzdWdnZXN0aW5nIG5vcm1hbGl0eS4gQWxsIHZhcmlhYmxlcyBleGNlcHQgQjEtMTAgUGVyZm9ybWFuY2Ugd2VyZSBsaWdodC10YWlsZWQgYW5kIEI1IFBlcmZvcm1hbmNlLCBhbmQgQjEwIFBlcmZvcm1hbmNlIGhhZCBzb21lIGNvbmNlbnRyYXRlZCBjaHVua3Mgd2l0aGluIHRoZSBkaXN0cmlidXRpb24gYWxvbmcgdGhlIGxpbmUuIEVhcmx5IFBlcmZvcm1hbmNlIGRpZCBub3QgY2xvc2VseSBmb2xsb3cgYWxvbmcgdGhlIGxpbmUgYW5kIHN1Z2dlc3RlZCBub24tbm9ybWFsIGRhdGE6IGl0IHdhcyBoZWF2eS10YWlsZWQgYW5kIGhhZCBzb21lIGNvbmNlbnRyYXRlZCBjaHVua3Mgd2l0aGluIHRoZSBkaXN0cmlidXRpb24uIFRoZXNlIHJlc3VsdHMgd2VyZSBwYXJ0aWFsbHkgYWxpZ25lZCB3aXRoIHRoZSBTaGFwaXJvLVdpbGsgbm9ybWFsaXR5IHRlc3QsIHdoZXJlIEVhcmx5IFBlcmZvcm1hbmNlIGFuZCBCMTAgUGVyZm9ybWFuY2UgcmVzdWx0cyBpbmRpY2F0ZWQgbm9uLW5vcm1hbGl0eS4gRm9yIEIxMCBQZXJmb3JtYW5jZSB0aGUgZGF0YSBtb3N0bHkgZm9sbG93ZWQgYWxvbmcgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIHdhcyBjb25zaWRlcmVkIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGVyZWZvcmUsIGEgKipQZWFyc29uIGNvcnJlbGF0aW9uKiogd2FzIGNvbXBsZXRlZCBmb3IgKipCNSBQZXJmb3JtYW5jZSoqLCAqKkIxMCBQZXJmb3JtYW5jZSoqLCAqKkIxLTEwIFBlcmZvcm1hbmNlKiosIGFuZCAqKkFIUyBTY29yZSBmb2xsb3dlZCBhbG9uZyoqIGZvciB0aGlzIGdyb3VwLiBTaW5jZSBib3RoIG5vcm1hbGl0eSB0ZXN0cyBzaG93ZWQgbm9uLW5vcm1hbCBkYXRhLCBhICoqS2VuZGFsbCBjb3JyZWxhdGlvbioqIChpLmUuLCBub24tcGFyYW1ldHJpYyBjb3JyZWxhdGlvbjsgc2VlICIqS2VuZGFsbCdzICRcdGF1X3tifSQgUmFuay1PcmRlciBDb3JyZWxhdGlvbnMqIiBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMpIHdhcyBjb21wbGV0ZWQgZm9yICoqRWFybHkgUGVyZm9ybWFuY2UqKiBmb3IgdGhpcyBncm91cC4gKihjbGljayB0byBzZWUgcXEgcGxvdHMpKiAqPC9zdW1tYXJ5PgoKYGBge3Igc2hvdyBxcTMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgMwpncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3QzJHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDMkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDMkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDMkcGVyX2FjY19hbGwsIHlsYWIgPSAiQjEtMTAgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190MyRBSFNfc2NvcmUsIHlsYWIgPSAiQUhTIFNjb3JlIiksCiAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgIHRvcCA9IHRleHRfZ3JvYigiUS1RIFBsb3RzIEZvciBUeXBlIDMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2IoIk5vcm1hbGl0eSBpcyBtZXQgZm9yIHBsb3RzIHdlcmUgZGF0YSBmYWxscyBhbG9uZyBvciBjbG9zZSB0byB0aGUgbGluZS4gKiBTLVdzIHAgPCAuMDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDApCiAgICAgICAgICAgICApCmBgYAoKPC9kZXRhaWxzPgoKCjxkZXRhaWxzPgo8c3VtbWFyeT4gRm9yICoqVHlwZSA0KiosIAoKdGhlIGRhdGEgZm9yIHRoZSB2YXJpYWJsZXMgQjUgUGVyZm9ybWFuY2UsIEIxMCBQZXJmb3JtYW5jZSwgQjEtMTAgUGVyZm9ybWFuY2UsIGFuZCBBSFMgU2NvcmUgZm9sbG93ZWQgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUsIHN1Z2dlc3Rpbmcgbm9ybWFsaXR5LiBCNSBQZXJmb3JtYW5jZSwgQjEwIFBlcmZvcm1hbmNlLCBhbmQgQUhTIFNjb3JlIHdlcmUgbGlnaHQtdGFpbGVkIGFuZCBCNSBQZXJmb3JtYW5jZSBoYWQgc29tZSBjb25jZW50cmF0ZWQgY2h1bmtzIHdpdGhpbiB0aGUgZGlzdHJpYnV0aW9uIGFsb25nIHRoZSBsaW5lLiBFYXJseSBQZXJmb3JtYW5jZSBkaWQgbm90IGNsb3NlbHkgZm9sbG93IGFsb25nIHRoZSBsaW5lIGFuZCBzdWdnZXN0ZWQgbm9uLW5vcm1hbCBkYXRhOiBpdCB3YXMgaGVhdnktdGFpbGVkIGFuZCBoYWQgc29tZSBjb25jZW50cmF0ZWQgY2h1bmtzIHdpdGhpbiB0aGUgZGlzdHJpYnV0aW9uLiBUaGVzZSByZXN1bHRzIHdlcmUgY29udHJhcnkgdG8gdGhlIFNoYXBpcm8tV2lsayBub3JtYWxpdHkgdGVzdCwgd2hlcmUgRWFybHkgUGVyZm9ybWFuY2UgcmVzdWx0cyBpbmRpY2F0ZWQgbm9ybWFsaXR5LCAqVyogPSBgciByb3VuZChjb3Jyc19ub3JtX3Rlc3QkVHlwZTRbMV0sIDIpYCwgKnAqID0gYHIgcF9yb3VuZChjb3Jyc19ub3JtX3Rlc3QkVHlwZTRbMl0pYC4gQWx0aG91Z2ggRWFybHkgUGVyZm9ybWFuY2Ugd2FzIGhlYXZ5LXRhaWxlZCwgdGhlIG1ham9yaXR5IG9mIHRoZSBkYXRhIG1vc3RseSBmb2xsb3dlZCBhbG9uZyB0aGUgc3RyYWlnaHQgbGluZSBhbmQgd2FzIGNvbnNpZGVyZWQgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFRoZXJlZm9yZSwgYSAqKlBlYXJzb24gY29ycmVsYXRpb24qKiB3YXMgY29tcGxldGVkIGZvciAqKkVhcmx5IFBlcmZvcm1hbmNlKiosICoqQjUgUGVyZm9ybWFuY2UqKiwgKipCMTAgUGVyZm9ybWFuY2UqKiwgKipCMS0xMCBQZXJmb3JtYW5jZSoqLCBhbmQgKipBSFMgU2NvcmUgZm9sbG93ZWQgYWxvbmcqKiBmb3IgdGhpcyBncm91cC4gKihjbGljayB0byBzZWUgcXEgcGxvdHMpKiAqPC9zdW1tYXJ5PgoKYGBge3Igc2hvdyBxcTQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgNApncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3Q0JHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NCRwZXJfbWlkX2FjYywgeWxhYiA9ICJNaWRkbGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NCRwZXJfbGF0ZV9hY2MsIHlsYWIgPSAiTGF0ZSBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q0JHBlcl9hY2NfYWxsLCB5bGFiID0gIkIxLTEwIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDQkQUhTX3Njb3JlLCB5bGFiID0gIkFIUyBTY29yZSIpLAogICAgICAgICAgICAgbnJvdyA9IDIsCiAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlEtUSBQbG90cyBGb3IgVHlwZSA0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksIAogICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKCJOb3JtYWxpdHkgaXMgbWV0IGZvciBwbG90cyB3ZXJlIGRhdGEgZmFsbHMgYWxvbmcgb3IgY2xvc2UgdG8gdGhlIGxpbmUuICogUy1XIHAgPCAuMDUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDApCiAgICAgICAgICAgICApCmBgYAoKPC9kZXRhaWxzPgoKCjxkZXRhaWxzPgo8c3VtbWFyeT4gRm9yICoqVHlwZSA1KiosIAoKdGhlIGRhdGEgZm9yIHRoZSB2YXJpYWJsZXMgRWFybHkgUGVyZm9ybWFuY2UsIEI1IFBlcmZvcm1hbmNlLCBCMTAgUGVyZm9ybWFuY2UsIEIxLTEwIFBlcmZvcm1hbmNlLCBhbmQgQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLCBzdWdnZXN0aW5nIG5vcm1hbGl0eS4gRWFybHkgUGVyZm9ybWFuY2UsIEIxLTEwIFBlcmZvcm1hbmNlIHdlcmUgaGVhdnktdGFpbGVkLiBBSFMgU2NvcmUgd2FzIGxpZ2h0LXRhaWxlZC4gIFRoZXNlIHJlc3VsdHMgd2VyZSBhbGlnbmVkIHdpdGggdGhlIFNoYXBpcm8tV2lsayBub3JtYWxpdHkgdGVzdCByZXN1bHRzLCB3aGVyZSBhbGwgdmFyaWFibGVzIGluaWRjYXRlZCBub3JtYWxpdHksICpXKiA+IGByIHJvdW5kKG1pbihjb3Jyc19ub3JtX3Rlc3QkVHlwZTVbYygxLCAzLCA1LCA3LCA5KV0pLCAyKWAsICpwKiA+IGByIHJvdW5kKG1pbihjb3Jyc19ub3JtX3Rlc3QkVHlwZTVbYygyLCA0LCA2LCA4LCAxMCldKSwgMilgLiBPdmVyYWxsLCB0aGUgZGF0YSBtb3N0bHkgZm9sbG93ZWQgYWxvbmcgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIHdhcyBjb25zaWRlcmVkIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGVyZWZvcmUsIGEgKipQZWFyc29uIGNvcnJlbGF0aW9uKiogd2FzIGNvbXBsZXRlZCBmb3IgKipFYXJseSBQZXJmb3JtYW5jZSoqLCAqKkI1IFBlcmZvcm1hbmNlKiosICoqQjEwIFBlcmZvcm1hbmNlKiosICoqQjEtMTAgUGVyZm9ybWFuY2UqKiwgYW5kICoqQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nKiogZm9yIHRoaXMgZ3JvdXAuICooY2xpY2sgdG8gc2VlIHFxIHBsb3RzKSogKjwvc3VtbWFyeT4KCmBgYHtyIHNob3cgcXE1LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEZvciBUeXBlIDUKZ3JpZC5hcnJhbmdlKGdncXFwbG90KHBlckFIU190NSRwZXJfZWFybHlfYWNjLCB5bGFiID0gIkVhcmx5IFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDUkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDUkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NSRwZXJfYWNjX2FsbCwgeWxhYiA9ICJCMS0xMCBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q1JEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIFR5cGUgNSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQpgYGAKCjwvZGV0YWlscz4KCgo8ZGV0YWlscz4KPHN1bW1hcnk+IEZvciAqKlR5cGUgNioqLCB0aGUgZGF0YSBmb3IgdGhlIHZhcmlhYmxlcyAqKkVhcmx5IFBlcmZvcm1hbmNlKiosICoqQjEtMTAgUGVyZm9ybWFuY2UqKiwgYW5kICoqQUhTIFNjb3JlIGZvbGxvd2VkIGFsb25nKiogb3IgY2xvc2UgdG8gdGhlIGxpbmUsIHN1Z2dlc3Rpbmcgbm9ybWFsaXR5LiBUaGVyZWZvcmUsIGEgY29ycmVsYXRpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHRoZXNlIHZhcmlhYmxlcy4gVGhlIHZhcmlhYmxlcyAqKkI1IFBlcmZvcm1hbmNlKiogYW5kICoqQjEwIFBlcmZvcm1hbmNlKiogZGlkIG5vdCBmb2xsb3cgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIHN1Z2dlc3RlZCBub24tbm9ybWFsIGRhdGEuIFRoZXJlZm9yZSwgYSBub24tcGFyYW1ldHJpYyBjb3JyZWxhdGlvbiBpcyBuZWVkZWQgZm9yIHRoZXNlIHZhcmlhYmxlcy4gKihjbGljayB0byBzZWUgcXEgcGxvdHMpKiAqPC9zdW1tYXJ5PgoKYGBge3Igc2hvdyBxcTYsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgNgpncmlkLmFycmFuZ2UoZ2dxcXBsb3QocGVyQUhTX3Q2JHBlcl9lYXJseV9hY2MsIHlsYWIgPSAiRWFybHkgUGVyZm9ybWFuY2UqIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDYkcGVyX21pZF9hY2MsIHlsYWIgPSAiTWlkZGxlIFBlcmZvcm1hbmNlIiksCiAgICAgICAgICAgICBnZ3FxcGxvdChwZXJBSFNfdDYkcGVyX2xhdGVfYWNjLCB5bGFiID0gIkxhdGUgUGVyZm9ybWFuY2UiKSwKICAgICAgICAgICAgIGdncXFwbG90KHBlckFIU190NiRwZXJfYWNjX2FsbCwgeWxhYiA9ICJCMS0xMCBQZXJmb3JtYW5jZSIpLAogICAgICAgICAgICAgZ2dxcXBsb3QocGVyQUhTX3Q2JEFIU19zY29yZSwgeWxhYiA9ICJBSFMgU2NvcmUiKSwKICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJRLVEgUGxvdHMgRm9yIFR5cGUgNiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYigiTm9ybWFsaXR5IGlzIG1ldCBmb3IgcGxvdHMgd2VyZSBkYXRhIGZhbGxzIGFsb25nIG9yIGNsb3NlIHRvIHRoZSBsaW5lLiAqIFMtVyBwIDwgLjA1IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKQogICAgICAgICAgICAgKQpgYGAKCjwvZGV0YWlscz4KCjwvZGV0YWlscz4KCgojIyBQZWFyc29uIENvcnJlbGF0aW9uIEFuYWx5c2VzCgo8ZGV0YWlscz4KPHN1bW1hcnk+IFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIHBlYXJzb24gY29ycmVsYXRpb25zIGJldHdlZW4gQUhTIHNjb3JlIChhdmVyYWdlKSBhbmQgU0hKIHRhc2sgcGVyZm9ybWFuY2UgKGkuZS4sIGVhcmx5LCBtaWRkbGUsIGxhdGUsIGFuZCBvdmVyYWxsIGxlYXJuaW5nKS4gPC9zdW1tYXJ5PgoKYGBge3IgY3JlYXRlIGNvcnJzX1AyIHRhYmxlLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKY29ycnNfUCA8LSAKICB0aWJibGUoIkFIUyBTY29yZSB2cy4iID0gYygiRWFybHkgUGVyZm9ybWFuY2UiLCAiTWlkZGxlIFBlcmZvcm1hbmNlIiwgIkxhdGUgUGVyZm9ybWFuY2UiLCAiQjEtMTAgUGVyZm9ybWFuY2UiKSwgCiAgICAgICAgICMgY29sbGFwc2VkIGFjcm9zcyBTSEogdHlwZXMKICAgICAgICAgckEgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdGFsbCRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3RhbGwkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190YWxsJHBlcl9taWRfYWNjLCB5ID0gcGVyQUhTX3RhbGwkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190YWxsJHBlcl9sYXRlX2FjYywgeSA9IHBlckFIU190YWxsJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdGFsbCRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190YWxsJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSksIAogICAgICAgICBwQSA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190YWxsJHBlcl9lYXJseV9hY2MsIHkgPSBwZXJBSFNfdGFsbCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190YWxsJHBlcl9taWRfYWNjLCB5ID0gcGVyQUhTX3RhbGwkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICBjb3IudGVzdCh4ID0gcGVyQUhTX3RhbGwkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3RhbGwkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJHAudmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICBjb3IudGVzdCh4ID0gcGVyQUhTX3RhbGwkcGVyX2FjY19hbGwsIHkgPSBwZXJBSFNfdGFsbCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgMQogICAgICAgICByMSA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190MSRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3QxJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDEkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDEkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MSRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDEkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MSRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDEgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDEkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190MSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MSRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190MSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDEkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3QxJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MSRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgMgogICAgICAgICByMiA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190MiRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3QyJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDIkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDIkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MiRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDIkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MiRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDIgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDIkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190MiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MiRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190MiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDIkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3QyJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MiRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgMwogICAgICAgICByMyA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190MyRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3QzJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDMkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDMkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MyRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDMkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MyRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MyRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDMgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDMkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190MyRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MyRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190MyRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDMkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3QzJEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190MyRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190MyRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgNAogICAgICAgICByNCA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190NCRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3Q0JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDQkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDQkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NCRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDQkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NCRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDQgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDQkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190NCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NCRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190NCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDQkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3Q0JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NCRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NCRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgNQogICAgICAgICByNSA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190NSRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3Q1JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDUkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDUkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NSRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDUkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NSRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDUgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDUkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190NSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NSRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190NSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDUkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3Q1JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NSRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NSRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSksIAogICAgICAgICAjIHR5cGUgNgogICAgICAgICByNiA9IGMoY29yLnRlc3QoeCA9IHBlckFIU190NiRwZXJfZWFybHlfYWNjLCB5ID0gcGVyQUhTX3Q2JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRlc3RpbWF0ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDYkcGVyX21pZF9hY2MsIHkgPSBwZXJBSFNfdDYkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NiRwZXJfbGF0ZV9hY2MsIHkgPSBwZXJBSFNfdDYkQUhTX3Njb3JlLCBtZXRob2QgPSAicGVhcnNvbiIpJGVzdGltYXRlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NiRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkZXN0aW1hdGUpLCAKICAgICAgICAgcDYgPSBjKGNvci50ZXN0KHggPSBwZXJBSFNfdDYkcGVyX2Vhcmx5X2FjYywgeSA9IHBlckFIU190NiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NiRwZXJfbWlkX2FjYywgeSA9IHBlckFIU190NiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSwgCiAgICAgICAgICAgICAgICAgIGNvci50ZXN0KHggPSBwZXJBSFNfdDYkcGVyX2xhdGVfYWNjLCB5ID0gcGVyQUhTX3Q2JEFIU19zY29yZSwgbWV0aG9kID0gInBlYXJzb24iKSRwLnZhbHVlLCAKICAgICAgICAgICAgICAgICAgY29yLnRlc3QoeCA9IHBlckFIU190NiRwZXJfYWNjX2FsbCwgeSA9IHBlckFIU190NiRBSFNfc2NvcmUsIG1ldGhvZCA9ICJwZWFyc29uIikkcC52YWx1ZSkKICAgICAgICAgICAgKQpgYGAKCjwvZGV0YWlscz4KCiMjIyBDb3JyZWxhdGlvbiBUYWJsZQoKQmVsb3csIHRoZSBjb3JyZWxhdGlvbiB0YWJsZSBkZXBpY3RzIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBBSFMgc2NvcmUgYW5kIFNISiBwZXJmb3JtYW5jZSAocGVyY2VudCBjb3JyZWN0KSBmb3IgZWFjaCBTSEogdHlwZSAoMS02KSBmb3IgRWFybHkgKEIxLUIzKSwgTWlkZGxlIChCNC1CNyksIExhdGUgKEI4LUIxMCksIGFuZCBPdmVyYWxsIChCMS1CMTApLiAKCi0gQ29sbGFwc2VkICoqYWNyb3NzIFNISiB0eXBlcyoqLCB0aGVyZSB3ZXJlIG5vIHNpZ25pZmljYW50IG9yIHN0cm9uZyBjb3JyZWxhdGlvbnMsICpyKiA9IGByIHJvdW5kKG1pbihjb3Jyc19QJHJBKSwgMilgIHRvICpyKiA9IGByIGZvcm1hdChyb3VuZChtYXgoY29ycnNfUCRyQSksIGRpZ2l0cz0yKSwgbnNtYWxsID0gMilgLCAqcCogYHIgcF9yb3VuZChtaW4oY29ycnNfUCRwQSkpYCB0byAqcCogYHIgcF9yb3VuZChtYXgoY29ycnNfUCRwQSkpYC4KLSBGb3IgKipUeXBlIDEqKiwgdGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBjb3JyZWxhdGlvbnMsICpyKiA9IGByIGZvcm1hdChyb3VuZChjb3Jyc19QJHIxWzFdLCBkaWdpdHM9MiksIG5zbWFsbCA9IDIpYCwgKnAqIGByIHBfcm91bmQoY29ycnNfUCRwMVsxXSlgLiBUaGVyZWZvcmUsIGJldHRlciBwZXJmb3JtYW5jZSBkdXJpbmcgYmxvY2sgMSB3YXMgYXNzb2NpYXRlZCB3aXRoIGEgbW9yZSBhbmFseXRpYyB0aGlua2luZyBzdHlsZS4gCi0gRm9yICoqVHlwZSAyKiosIHRoZXJlIHdlcmUgbm8gc2lnbmlmaWNhbnQgb3Igc3Ryb25nIGNvcnJlbGF0aW9ucywgKnIqID0gYHIgcm91bmQobWluKGNvcnJzX1AkcjIpLCAyKWAgdG8gKnIqID0gYHIgcm91bmQobWF4KGNvcnJzX1AkcjIpLCAyKWAsICpwKiBgciBwX3JvdW5kKG1pbihjb3Jyc19QJHAyKSlgIHRvICpwKiBgciBwX3JvdW5kKG1heChjb3Jyc19QJHAyKSlgLgotIEZvciAqKlR5cGUgMyoqLCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudCwgc3Ryb25nLCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuICoqQUhTIHNjb3JlIGFuZCBtaWRkbGUgKGkuZS4sIGJsb2NrIDQtNykgcGVyZm9ybWFuY2UqKiwgKnIqID0gYHIgcm91bmQoY29ycnNfUCRyM1syXSwgMilgLCAqcCogYHIgcF9yb3VuZChjb3Jyc19QJHAzWzJdKWAuIFRoZXJlZm9yZSwgYmV0dGVyIHBlcmZvcm1hbmNlIGR1cmluZyBibG9jayA1IHdhcyBhc3NvY2lhdGVkIHdpdGggYSBtb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiAKLSBGb3IgKipUeXBlIDQqKiwgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQsIHN0cm9uZywgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiAqKkFIUyBzY29yZSoqIGFuZCAqKmVhcmx5IChpLmUuLCBibG9jayAxLTMpKiosICAqciogPSBgciByb3VuZChjb3Jyc19QJHI0WzFdLCAyKWAsICpwKiBgciBwX3JvdW5kKGNvcnJzX1AkcDRbMV0pYCwgKiptaWRkbGUgKGkuZS4sIGJsb2NrIDQtNykqKiwgICpyKiA9IGByIHJvdW5kKGNvcnJzX1AkcjRbMl0sIDIpYCwgKnAqIGByIHBfcm91bmQoY29ycnNfUCRwNFsyXSlgLCBhbmQgKipvdmVyYWxsIGJsb2NrIHBlcmZvcm1hbmNlIChpLmUuLCBibG9jayAxLTEwKSoqLCAqciogPSBgciByb3VuZChjb3Jyc19QJHI0WzRdLCAyKWAsICpwKiBgciBwX3JvdW5kKGNvcnJzX1AkcDRbNF0pYC4gVGhlcmVmb3JlLCBiZXR0ZXIgcGVyZm9ybWFuY2UgZHVyaW5nIGVhcmx5LCBtaWRkbGUsIGFuZCBvdmVyYWxsIHBlcmZvcm1hbmNlIHdhcyBhc3NvY2lhdGVkIHdpdGggYSBtb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiAKLSBGb3IgKipUeXBlIDUqKiwgdGhlcmUgd2VyZSBubyBzaWduaWZpY2FudCBvciBzdHJvbmcgY29ycmVsYXRpb25zLCAqciogPSBgciByb3VuZChtaW4oY29ycnNfUCRyNSksIDIpYCB0byAqciogPSBgciByb3VuZChtYXgoY29ycnNfUCRyNSksIDIpYCwgKnAqIGByIHBfcm91bmQobWluKGNvcnJzX1AkcDUpKWAgdG8gKnAqIGByIHBfcm91bmQobWF4KGNvcnJzX1AkcDUpKWAuCi0gRm9yICoqVHlwZSA2KiosIHRoZXJlIHdlcmUgbm8gc2lnbmlmaWNhbnQgb3Igc3Ryb25nIGNvcnJlbGF0aW9ucywgKnIqID0gYHIgcm91bmQobWluKGNvcnJzX1AkcjYpLCAyKWAgdG8gKnIqID0gYHIgcm91bmQobWF4KGNvcnJzX1AkcjYpLCAyKWAsICpwKiBgciBwX3JvdW5kKG1pbihjb3Jyc19QJHA2KSlgIHRvICpwKiBgciBwX3JvdW5kKG1heChjb3Jyc19QJHA2KSlgLgoKCmBgYHtyIHNob3cgY29ycnNfUCB0YWJsZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBzaG93IHRhYmxlIHVzaW5nIGthYmxlCmthYmxlKGNvcnJzX1AsIGNhcHRpb24gPSAiUGVhcnNvbiBDb3JyZWxhdGlvbnMgYmV0d2VlbiBBSFMgU2NvcmUgYW5kIFNISiBUYXNrIFBlcmZvcm1hbmNlIEdyb3VwZWQgYnkgU0hKIFRhc2sgVHlwZSIsIGFsaWduID0gcmVwKCdjJyksIGRpZ2l0cyA9IDIsIGNvbC5uYW1lcyA9IGMoIkFIUyBTY29yZSB2cy4iLCByZXAoYygiciIsICJwLXZhbHVlIiksIDcpKSkgJT4lCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJFYXJseSBQZXJmb3JtYW5jZSA9IEIxLUIzOyBNaWRkbGUgUGVyZm9ybWFuY2UgPSBCNC1CNywgTGF0ZSBQZXJmb3JtYW5jZSA9IEI4LUIxMC4iKSAlPiUgCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiwgIkFsbCIgPSAyLCAiVHlwZSAxIiA9IDIsICJUeXBlIDIiID0gMiwgIlR5cGUgMyIgPSAyLCAiVHlwZSA0IiA9IDIsICJUeXBlIDUiID0gMiwgIlR5cGUgNiIgPSAyKSwgYm9sZCA9IFQpICU+JSAKICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkgJT4lIAogIHJvd19zcGVjKDQsIGJvbGQgPSBUKSAlPiUgCiAga2FibGVfY2xhc3NpYygpCmBgYAoKTm93IHRoYXQgd2UgaGF2ZSBzZWVuIHRoZSBjb3JyZWxhdGlvbiB0YWJsZSwgdGhlIHJlc3VsdHMgd2VyZSB2aXN1YWxpemVkIHVzaW5nIGEgc2NhdHRlciBwbG90LgoKIyMjIE1haW46IEFjcm9zcyBBbGwgQmxvY2tzIAoKV2UgdmlzdWFsaXplZCBlYWNoIGNvbXBhcmlzb24gZnJvbSBhYm92ZSB1c2luZyBzY2F0dGVyIHBsb3RzIG9mIHRoZSByYXcgZGF0YS4gVGhpcyB3YXMgZG9uZSBmb3IgZWFjaCBTSEogY2F0ZWdvcnkgdHlwZSAoaS5lLiwgVHlwZSAxLTYpLiBTb21lIHRoaW5ncyB0byBrZWVwIGluIG1pbmQgYWJvdXQgdGhlIHZhcmlhYmxlczoKICAgIC0gQUhTIHNjb3JlOgogICAgICAgIC0gbWVhc3VyZXMgcGFydGljaXBhbnQncyB0aGlua2luZyBzdHlsZSB1c2luZyAyNCBpdGVtcyBvbiBhIDctcG9pbnQgbGlrZXJ0IHNjYWxlOiAqKmhpZ2hlciBzY29yZSBkZXBpY3RzIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcqKgogICAgICAgIC0gcG9zc2libGUgcmFuZ2U6IDAgLSBgciAyNCo3YAogICAgICAgIC0gc2hvd24gb24gdGhlIHgtYXhpcyBvZiBhbGwgcGxvdHMKICAgIC0gU0hKIHBlcmZvcm1hbmNlOgogICAgICAgIC0gbWVhc3VyZXMgKipwZXJjZW50IGNvcnJlY3QqKiBmb3IgZ2l2ZW4gYmxvY2socyk6IEVhcmx5IChmaXJzdCBibG9jayksIEI1IChtaWRkbGUgYmxvY2spLCBCMTAgKGxhc3QgYmxvY2spLCBhbmQgQjEtMTAgKGNvbGxhcHNlZCBhY3Jvc3MgYmxvY2tzKQogICAgICAgIC0gcG9zc2libGUgcmFuZ2U6IDAlIC0gMTAwJQogICAgICAgIC0gc2hvd24gb24gdGhlIHktYXhpcyBvZiBhbGwgcGxvdHMKICAgICAgICAtIGJsb2NrcwogICAgICAgIAogICAgICAgIApUaGVyZSB3YXMgc2lnbmlmaWNhbnQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBBSFMgc2NvcmUgYW5kIHR5cGUgNCBwZXJmb3JtYW5jZSBhY3Jvc3MgYWxsIGJsb2Nrcy4gU28sIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcgc3R5bGUgd2FzIGFzc29jaWF0ZWQgd2l0aCBiZXR0ZXIgdHlwZSA0IHBlcmZvcm1hbmNlLiBObyBvdGhlciBjb3JyZWxhdGlvbiBiZXR3ZWVuIEFIUyBzY29yZSBhbmQgcGVyZm9ybWFuY2UgZm9yIGVhY2ggU0hKIHR5cGUgd2FzIHNpZ25pZmljYW50LiBBbHRob3VnaCBub3Qgc2lnbmlmaWNhbnQsIGl0IGNhbiBiZSBub3RlZCB0aGF0IHRoZSB0cmVuZCBmb3IgdGhlIHJ1bGUtYmFzZWQgdHlwZXMgKGkuZS4sIHR5cGUgMS0yKSB3YXMgdHJlbmRpbmcgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uLCB3aGVyZSBsb3dlciBBSFMgc2NvcmUgKGkuZS4sIG1vcmUgYW5hbHl0aWMgdGhpbmtpbmcgc3R5bGUpIHdhcyBhc3NvY2lhdGVkIHdpdGggaGlnaGVyIHBlcmZvcm1hbmNlLiBUaGlzIHBhcnRpYWxseSBzdXBwb3J0ZWQgb3VyIHByZWRpY3Rpb25zLiAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgZ2F0aGVyIHBsb3RzIGZvciBlYWNoIHR5cGUsIHdpdGggb3ZlcmFsbCBibG9hY2sgcGVyIGNvcnIgcGVyZm9yYW5jZSAoQjEtQjEwKQoKIyBUeXBlIDEKcHN5Y2hfc2NhdDFfYWxsID0gCiAgICBwZXJBSFNfdDEgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfYWNjX2FsbCwgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBjb2xvciA9IG15X3BhbGV0dGVbMV0sIHNpemUgPSAxLjUpICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEuNSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg1MCwgMTAwKSwgYnJlYWtzID0gc2VxKDUwLCAxMDAsIGxlbmd0aC5vdXQgPSA2KSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4ocGVyQUhTX3QxJEFIU19zY29yZSksIG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSksIAogICAgICAgICAgICAgICAgICAgICAgICMgYnJlYWtzID0gc2VxKHJvdW5kKG1pbihwZXJBSFNfdDEkQUhTX3Njb3JlKSksIHJvdW5kKG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSksIC41KSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygzMCwgMTAwKSwgCiAgICAjICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYyhzZXEoMzAsIDEwMCwgMjApKSkgKwogICAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IG15X3BhbGV0dGUpICsgIyBkb2VzIG5vdCBhZGQgYW55dGhpbmcgeWV0Li4uIAogICAgbGFicygjIGFkZCBhbGwgbGFiZWxzCiAgICAgICB0aXRsZSA9ICJUeXBlIDEiLAogICAgICAgc3VidGl0bGUgPSBleHByZXNzaW9uKH5pdGFsaWMocil+JygxMTcpID0gLS4yNCwnIH5pdGFsaWMocCl+Jz0gLjMxJyksCiAgICAgICAjIGNhcHRpb24gPSAiTm90ZTogIiwKICAgICAgIHggPSAiQUhTIFNjb3JlIiwKICAgICAgIHkgPSAiUGVyZm9ybWFuY2UgKCUpIikgKwogICAgICAgICMgdGhlICJcbiIgaGVyZSBkZW5vdGUgdGhhdCB5b3Ugd2FudCBhIG5ldyBsaW5lIGZvcm1lZCBpbiB0aGUgdGV4dAogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpKQojIAojIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLCAKIyAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLCAKIyAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKIyAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDI1LCBjb2xvciA9ICJibGFjayIpLCAKIyAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiMgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwgCiMgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKQojICAgICAgICAgKQoKIyBUeXBlIDIKcHN5Y2hfc2NhdDJfYWxsID0gCiAgICBwZXJBSFNfdDIgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfYWNjX2FsbCwgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBjb2xvciA9IG15X3BhbGV0dGVbMl0sIHNpemUgPSAxLjUpICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEuNSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICAjIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDQwLDEwMCksIGJyZWFrcyA9IHNlcSg0MCwgMTAwLCBsZW5ndGgub3V0ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMywgNiksIGJyZWFrcyA9IHNlcSgzLCA2LCAxKSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJEFIU19zY29yZSksIG1heChwZXJBSFNfdDIkQUhTX3Njb3JlKSksCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MiRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3QyJEFIU19zY29yZSksIGJ5ID0gMTApKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxLTEwIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDIkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3QyJHBlcl9hY2NfYWxsKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDIkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3QyJHBlcl9hY2NfYWxsKSwgYnkgPSAxMCkpICsKICAgIGxhYnMoIyBhZGQgYWxsIGxhYmVscwogICAgICAgdGl0bGUgPSAiVHlwZSAyIiwKICAgICAgIHN1YnRpdGxlID0gZXhwcmVzc2lvbih+aXRhbGljKHIpficoMTE3KSA9IC0uMTQsJyB+aXRhbGljKHApfic9IC41NycpLAogICAgICAgIyBjYXB0aW9uID0gIk5vdGU6ICIsCiAgICAgICB4ID0gIkFIUyBTY29yZSIsCiAgICAgICB5ID0gIlBlcmZvcm1hbmNlICglKSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSkKCiMgVHlwZSAzCnBzeWNoX3NjYXQzX2FsbCA9IAogICAgcGVyQUhTX3QzICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2FjY19hbGwsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgY29sb3IgPSBteV9wYWxldHRlWzNdLCBzaXplID0gMS41KSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLjUsIHNob3cubGVnZW5kID0gRikgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg0MCwgOTApLCBicmVha3MgPSBzZXEoNDAsIDkwLCBsZW5ndGgub3V0ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMywgNiksIGJyZWFrcyA9IHNlcSgzLCA2LCAxKSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJEFIU19zY29yZSksIG1heChwZXJBSFNfdDMkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDMkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MyRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJCMS0xMCIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190MyRwZXJfYWNjX2FsbCkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QzJHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190MyRwZXJfYWNjX2FsbCksIGJ5ID0gNSkpICsKICAgIGxhYnMoIyBhZGQgYWxsIGxhYmVscwogICAgICAgdGl0bGUgPSAiVHlwZSAzIiwKICAgICAgIHN1YnRpdGxlID0gZXhwcmVzc2lvbih+aXRhbGljKHIpficoMTE3KSA9IC4yOCwnIH5pdGFsaWMocCl+Jz0gLjE1JyksCiAgICAgICAjIGNhcHRpb24gPSAiTm90ZTogIiwKICAgICAgIHggPSAiQUhTIFNjb3JlIiwKICAgICAgIHkgPSAiUGVyZm9ybWFuY2UgKCUpIikgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMsIGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpKQoKIyBUeXBlIDQKcHN5Y2hfc2NhdDRfYWxsID0gCiAgICBwZXJBSFNfdDQgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfYWNjX2FsbCwgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBjb2xvciA9IG15X3BhbGV0dGVbNF0sIHNpemUgPSAxLjUpICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEuNSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICAjIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDMwLCA5MCksIGJyZWFrcyA9IHNlcSgzMCwgOTAsIGxlbmd0aC5vdXQgPSA2KSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygzLCA2KSwgYnJlYWtzID0gc2VxKDMsIDYsIDEpKSArCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFIUyBTY29yZSIsCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDQkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NCRBSFNfc2NvcmUpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NCRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q0JEFIU19zY29yZSksIGJ5ID0gMTApKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxLTEwKiIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q0JHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190NCRwZXJfYWNjX2FsbCkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q0JHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190NCRwZXJfYWNjX2FsbCksIGJ5ID0gMTApKSArCiAgICBsYWJzKCMgYWRkIGFsbCBsYWJlbHMKICAgICAgIHRpdGxlID0gIlR5cGUgNCoiLAogICAgICAgc3VidGl0bGUgPSBleHByZXNzaW9uKH5pdGFsaWMocil+JygxMTcpID0gLjYxLCcgfml0YWxpYyhwKX4nPSAuMDEnKSwKICAgICAgICMgY2FwdGlvbiA9ICJOb3RlOiAiLAogICAgICAgeCA9ICJBSFMgU2NvcmUiLAogICAgICAgeSA9ICJQZXJmb3JtYW5jZSAoJSkiKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikpCgojIFR5cGUgNQpwc3ljaF9zY2F0NV9hbGwgPSAKICAgIHBlckFIU190NSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9hY2NfYWxsLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGNvbG9yID0gbXlfcGFsZXR0ZVs1XSwgc2l6ZSA9IDEuNSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMS41LCBzaG93LmxlZ2VuZCA9IEYpICsKICAgICMgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoNDAsIDkwKSwgYnJlYWtzID0gc2VxKDQwLCA5MCwgbGVuZ3RoLm91dCA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDMsIDYpLCBicmVha3MgPSBzZXEoMywgNiwgMSkpICsKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NSRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q1JEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q1JEFIU19zY29yZSksIG1heChwZXJBSFNfdDUkQUhTX3Njb3JlKSwgYnkgPSA2KSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJCMS0xMCIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q1JHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190NSRwZXJfYWNjX2FsbCkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q1JHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190NSRwZXJfYWNjX2FsbCksIGJ5ID0gMTApKSArCiAgICBsYWJzKCMgYWRkIGFsbCBsYWJlbHMKICAgICAgIHRpdGxlID0gIlR5cGUgNSIsCiAgICAgICBzdWJ0aXRsZSA9IGV4cHJlc3Npb24ofml0YWxpYyhyKX4nKDExNykgPSAuMDMsJyB+aXRhbGljKHApfic9IC45MicpLAogICAgICAgIyBjYXB0aW9uID0gIk5vdGU6ICIsCiAgICAgICB4ID0gIkFIUyBTY29yZSIsCiAgICAgICB5ID0gIlBlcmZvcm1hbmNlICglKSIpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzLCBjb2xvciA9ICJibGFjayIpLCAKICAgICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSkKCiMgVHlwZSA2CnBzeWNoX3NjYXQ2X2FsbCA9IAogICAgcGVyQUhTX3Q2ICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2FjY19hbGwsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgY29sb3IgPSBteV9wYWxldHRlWzZdLCBzaXplID0gMS41KSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLjUsIHNob3cubGVnZW5kID0gRikgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyg0MCwgNzApLCBicmVha3MgPSBzZXEoNDAsIDcwLCBsZW5ndGgub3V0ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMywgNiksIGJyZWFrcyA9IHNlcSgzLCA2LCAxKSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q2JEFIU19zY29yZSksIG1heChwZXJBSFNfdDYkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDYkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NiRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxLTEwIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDYkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q2JHBlcl9hY2NfYWxsKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDYkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q2JHBlcl9hY2NfYWxsKSwgYnkgPSA1KSkgKwogICAgbGFicygjIGFkZCBhbGwgbGFiZWxzCiAgICAgICB0aXRsZSA9ICJUeXBlIDYiLAogICAgICAgc3VidGl0bGUgPSBleHByZXNzaW9uKH5pdGFsaWMocil+JygxMTcpID0gLjI1LCcgfml0YWxpYyhwKX4nPSAuMzInKSwKICAgICAgICMgY2FwdGlvbiA9ICJOb3RlOiAiLAogICAgICAgeCA9ICJBSFMgU2NvcmUiLAogICAgICAgeSA9ICJQZXJmb3JtYW5jZSAoJSkiKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMywgY29sb3IgPSAiYmxhY2siKSwgCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksIAogICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIikpCgojIGNyZWF0ZSBmaWd1cmUgY2FwdGlvbgpzY2F0YWxsX25vdGUgPSAiTm90ZTogUGVyZm9ybWFuY2UgYWNyb3NzIDEwIGJsb2NrcyBvbiBTaGVwYXJkLCBIb3ZsYW5kLCBhbmQgSmVua2lucyAoU0hKOyAxOTYxKSB0eXBlcyBpcyBtZWFzdXJlZCBpbiBwZXJjZW50IGNvcnJlY3QuIEhpZ2hlciBBbmFseXNpcy1Ib2xpc20gU2NhbGUgKEFIUykgc2NvcmUgZGVwaWN0cyBhIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcgc3R5bGUuIFRoZSBjb2xvdXJlZCBsaW5lcyBkZXBpY3QgbGluZWFyIHJlbGF0aW9uc2hpcC4gVGhlIHNoYWRlZCBhcmVhIHJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uICogcCA8IC4wNSIKc2NhdGFsbF9ub3RlID0gcGFzdGUwKHN0cndyYXAoc2NhdGFsbF9ub3RlLCB3aWR0aCA9IDkwKSwgY29sbGFwc2UgPSAiXG4iKQoKIyBkaXNwbGF5IGFsbCBzY2F0dGVyIHBsb3RzIHRvZ2V0aGVyIC0gZ3JvdXBlZCBieSBTSEogVHlwZQpwc3ljaF9zY2F0c19hbGwgPC0gCiAgZ3JpZC5hcnJhbmdlKHBzeWNoX3NjYXQxX2FsbCwgcHN5Y2hfc2NhdDJfYWxsLCBwc3ljaF9zY2F0M19hbGwsIHBzeWNoX3NjYXQ0X2FsbCwgcHN5Y2hfc2NhdDVfYWxsLCBwc3ljaF9zY2F0Nl9hbGwsCiAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIkFIUyBTY29yZSB2cy4gUGVyZm9ybWFuY2UgYnkgU0hKIFR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDIwKSwgIyBzaG93IHRleHQgaW4gYm9sZAogICAgICAgICAgICAgICBib3R0b20gPSB0ZXh0X2dyb2Ioc2NhdGFsbF9ub3RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLCAjIHNwZWNpZnkgaG9yaXpvbnRhbCBqdXN0aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gMC4wNSwgIyBzcGVjaWZ5IG9yaWVudGF0aW9uIG9uIHgtYXhpcyAoYm90dG9tIEwgPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJpdGFsaWMiKSAjIHNob3cgdGV4dCBpbiBpdGFsaWNzCiAgICAgICAgICAgICAgICkKCiMgc2hvdyBwbG90CnBzeWNoX3NjYXRzX2FsbAojIGV4cG9ydCBwbG90CiAgIyB0aXRsZSAmIGNhcHRpb24gcmVtb3ZlZAojIGdnc2F2ZShmaWxlbmFtZT0ic2NhdHRlcl9maWdfb2N0MTMtZmluYWwiLCBwbG90ID0gcHN5Y2hfc2NhdHNfYWxsLCBkZXZpY2UgPSAianBlZyIsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iLCBkcGkgPSAxMDAwKQpgYGAKIyMjIFN1cHBsZW1lbnRhbDogRWFybHksIE1pZGRsZSwgTGF0ZSwgYW5kIEFjcm9zcyBBbGwgQmxvY2tzCgpMYXN0bHksIHdlIGV4cGxvcmVkIHRoZSBkYXRhIGZ1cnRoZXIgYnkgdmlzdWFsaXppbmcgZWFjaCBjb21wYXJpc29uIGZyb20gYWJvdmUgdXNpbmcgc2NhdHRlciBwbG90cyBvZiB0aGUgcmF3IGRhdGEuIFRoaXMgd2FzIGRvbmUgZm9yIGVhY2ggU0hKIGNhdGVnb3J5IHR5cGUgKGkuZS4sIFR5cGUgMS02KSBmb3IgRWFybHkgKEIxLUIzKSwgTWlkZGxlIChCNC1CNyksIExhdGUgKEI4LUIxMCksIGFuZCBPdmVyYWxsIChCMS1CMTApLiBTb21lIHRoaW5ncyB0byBrZWVwIGluIG1pbmQgYWJvdXQgdGhlIHZhcmlhYmxlczoKICAgIC0gQUhTIHNjb3JlOgogICAgICAgIC0gbWVhc3VyZXMgcGFydGljaXBhbnQncyB0aGlua2luZyBzdHlsZSB1c2luZyAyNCBpdGVtcyBvbiBhIDctcG9pbnQgbGlrZXJ0IHNjYWxlOiAqKmhpZ2hlciBzY29yZSBkZXBpY3RzIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcqKgogICAgICAgIC0gcG9zc2libGUgcmFuZ2U6IDAgLSBgciAyNCo3YAogICAgICAgIC0gc2hvd24gb24gdGhlIHgtYXhpcyBvZiBhbGwgcGxvdHMKICAgIC0gU0hKIHBlcmZvcm1hbmNlOgogICAgICAgIC0gbWVhc3VyZXMgKipwZXJjZW50IGNvcnJlY3QqKiBmb3IgZ2l2ZW4gYmxvY2socyk6IEVhcmx5IChmaXJzdCBibG9jayksIEI1IChtaWRkbGUgYmxvY2spLCBCMTAgKGxhc3QgYmxvY2spLCBhbmQgQjEtMTAgKGNvbGxhcHNlZCBhY3Jvc3MgYmxvY2tzKQogICAgICAgIC0gcG9zc2libGUgcmFuZ2U6IDAlIC0gMTAwJQogICAgICAgIC0gc2hvd24gb24gdGhlIHktYXhpcyBvZiBhbGwgcGxvdHMKICAgICAgICAtIGJsb2NrcwoKIyMjIyMgVFlQRSAxCgo8ZGV0YWlscz4KPHN1bW1hcnk+ICooY2xpY2sgdG8gc2VlIGNvZGUpKiA8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgc2NhdDFzMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGb3IgVHlwZSAxCiAgIyBFQVJMWSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDFfZWFybHkgPSAKICAgIHBlckFIU190MSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9lYXJseV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIGxhYnModGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gQmxvY2sgMSB2ZXJzdXMgQUhTIFNjb3JlIiwgIyBhZGQgaWYgd2FudCB0byBleHBvcnQgZmlnIGFsb25lCiAgICAjICAgICAgc3VidGl0bGUgPSAiXHUwM0M0ID0gLS40MCwgcCA9IC4wMiIsIAogICAgIyAgICAgIHggPSAiRWFybHkgUGVyZm9ybWFuY2UgKCUpIiwgCiAgICAjICAgICAgeSA9ICJBSFMgU2NvcmUiLCAKICAgICMgICAgICBjYXB0aW9uID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgXG5tb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBCbHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSBcbnJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uIgogICAgIyAgICAgICkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QxJEFIU19zY29yZSksIG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDEkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MSRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkVhcmx5IChCMS0zKSIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QxJHBlcl9lYXJseV9hY2MpLCBtYXgocGVyQUhTX3QxJHBlcl9lYXJseV9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MSRwZXJfZWFybHlfYWNjKSwgbWF4KHBlckFIU190MSRwZXJfZWFybHlfYWNjKSwgYnkgPSAyMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIE1JRERMRSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDFfbWlkZGxlID0gCiAgICBwZXJBSFNfdDEgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfbWlkX2FjYywgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MSRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3QxJEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QxJEFIU19zY29yZSksIG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSwgYnkgPSA2KSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJNaWRkbGUgKEI0LTcpIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDEkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3QxJHBlcl9taWRfYWNjKSksIAogICAgICAgICAgICAgICAgICAgICAgICMgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDEkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3QxJHBlcl9taWRfYWNjKSwgYnkgPSAxNSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIExBVEUgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQxX2xhdGUgPSAKICAgIHBlckFIU190MSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9sYXRlX2FjYywgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MSRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3QxJEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QxJEFIU19zY29yZSksIG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSwgYnkgPSA2KSkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJMYXRlIChCOC0xMCkiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MSRwZXJfbGF0ZV9hY2MpLCBtYXgocGVyQUhTX3QxJHBlcl9sYXRlX2FjYykpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QxJHBlcl9sYXRlX2FjYyksIG1heChwZXJBSFNfdDEkcGVyX2xhdGVfYWNjKSwgYnkgPSA1KSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjEtMTAgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQxX2FsbDIgPSAKICAgIHBlckFIU190MSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9hY2NfYWxsLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QxJEFIU19zY29yZSksIG1heChwZXJBSFNfdDEkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDEkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MSRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkIxLTEwIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDEkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3QxJHBlcl9hY2NfYWxsKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDEkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3QxJHBlcl9hY2NfYWxsKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKYGBgCgo8L2RldGFpbHM+CgpgYGB7ciBzaG93IHNjYXQxczIgdG9nZXRoZXIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgY3JlYXRlIGZpZ3VyZSBjYXB0aW9uCnNjYXQxX25vdGUyID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgbW9yZSBob2xpc3RpYyB0aGlua2luZyBzdHlsZS4gVGhlIGJsdWUgbGluZSBkZXBpY3RzIGEgbGluZWFyIHJlbGF0aW9uc2hpcC4gVGhlIHNoYWRlZCBhcmVhIHJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uICogcCA8IC4wNSIKc2NhdDFfbm90ZTIgPSBwYXN0ZTAoc3Ryd3JhcChzY2F0MV9ub3RlMiwgd2lkdGggPSA5NSksIGNvbGxhcHNlID0gIlxuIikKCiMgZGlzcGxheSBhbGwgc2NhdHRlciBwbG90cyB0b2dldGhlciAtIGdyb3VwZWQgYnkgU0hKIFR5cGUKZ3JpZC5hcnJhbmdlKHNjYXQxX2Vhcmx5LCBzY2F0MV9taWRkbGUsIHNjYXQxX2xhdGUsIHNjYXQxX2FsbDIsCiAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlR5cGUgMTogUGVyZm9ybWFuY2UgdnMuIEFIUyBTY29yZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksICMgc2hvdyB0ZXh0IGluIGJvbGQKICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKHNjYXQxX25vdGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgIyBzcGVjaWZ5IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsICMgc3BlY2lmeSBvcmllbnRhdGlvbiBvbiB4LWF4aXMgKGJvdHRvbSBMID0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIikgIyBzaG93IHRleHQgaW4gaXRhbGljcwogICAgICAgICAgICAgICApCmBgYAoKIyMjIyMgVFlQRSAyCgo8ZGV0YWlscz4KPHN1bW1hcnk+ICooY2xpY2sgdG8gc2VlIGNvZGUpKiA8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgc2NhdDJzMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGb3IgVHlwZSAyCiAgIyBFYXJseSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDJfZWFybHkgPSAKICAgIHBlckFIU190MiAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9lYXJseV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIGxhYnModGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gQmxvY2sgMSB2ZXJzdXMgQUhTIFNjb3JlIiwgIyBhZGQgaWYgd2FudCB0byBleHBvcnQgZmlnIGFsb25lCiAgICAjICAgICAgc3VidGl0bGUgPSAiXHUwM0M0ID0gLS40MCwgcCA9IC4wMiIsIAogICAgIyAgICAgIHggPSAiRWFybHkgUGVyZm9ybWFuY2UgKCUpIiwgCiAgICAjICAgICAgeSA9ICJBSFMgU2NvcmUiLCAKICAgICMgICAgICBjYXB0aW9uID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgXG5tb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBibHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSBcbnJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uIgogICAgIyAgICAgICkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJEFIU19zY29yZSksIG1heChwZXJBSFNfdDIkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDIkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MiRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJCMSIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJHBlcl9lYXJseV9hY2MpLCBtYXgocGVyQUhTX3QyJHBlcl9lYXJseV9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MiRwZXJfZWFybHlfYWNjKSwgbWF4KHBlckFIU190MiRwZXJfZWFybHlfYWNjKSwgYnkgPSAxNSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEI1IHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0Ml9taWRkbGUgPSAKICAgIHBlckFIU190MiAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9taWRfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJEFIU19zY29yZSksIG1heChwZXJBSFNfdDIkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDIkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MiRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJNaWRkbGUiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MiRwZXJfbWlkX2FjYyksIG1heChwZXJBSFNfdDIkcGVyX21pZF9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MiRwZXJfbWlkX2FjYyksIG1heChwZXJBSFNfdDIkcGVyX21pZF9hY2MpLCBieSA9IDEwKSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjEwIHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0Ml9sYXRlID0gCiAgICBwZXJBSFNfdDIgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfbGF0ZV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFIUyBTY29yZSIsCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDIkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MiRBSFNfc2NvcmUpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MiRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3QyJEFIU19zY29yZSksIGJ5ID0gMTApKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkxhdGUiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MiRwZXJfbGF0ZV9hY2MpLCBtYXgocGVyQUhTX3QyJHBlcl9sYXRlX2FjYykpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QyJHBlcl9sYXRlX2FjYyksIG1heChwZXJBSFNfdDIkcGVyX2xhdGVfYWNjKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEIxLTEwIHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0Ml9hbGwgPSAKICAgIHBlckFIU190MiAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9hY2NfYWxsLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJEFIU19zY29yZSksIG1heChwZXJBSFNfdDIkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDIkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MiRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJCMS0xMCIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QyJHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190MiRwZXJfYWNjX2FsbCkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QyJHBlcl9hY2NfYWxsKSwgbWF4KHBlckFIU190MiRwZXJfYWNjX2FsbCksIGJ5ID0gMTApKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKPC9kZXRhaWxzPgoKYGBge3Igc2hvdyBzY2F0MnMyIHRvZ2V0aGVyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGNyZWF0ZSBmaWd1cmUgY2FwdGlvbgpzY2F0Ml9ub3RlMiA9ICJOb3RlOiBQZXJmb3JtYW5jZSBpcyBtZWFzdXJlZCBpbiBwZXJjZW50IGNvcnJlY3QuIEhpZ2hlciBBSFMgc2NvcmUgZGVwaWN0cyBhIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcgc3R5bGUuIFRoZSBibHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSByZXByZXNlbnRzIGEgOTUlIGNvbmZpZGVuY2UgcmVnaW9uLiAqIHAgPCAuMDUiCnNjYXQyX25vdGUyID0gcGFzdGUwKHN0cndyYXAoc2NhdDJfbm90ZTIsIHdpZHRoID0gOTUpLCBjb2xsYXBzZSA9ICJcbiIpCgojIGRpc3BsYXkgYWxsIHNjYXR0ZXIgcGxvdHMgdG9nZXRoZXIgLSBncm91cGVkIGJ5IFNISiBUeXBlCmdyaWQuYXJyYW5nZShzY2F0Ml9lYXJseSwgc2NhdDJfbWlkZGxlLCBzY2F0Ml9sYXRlLCBzY2F0Ml9hbGwsCiAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlR5cGUgMjogUGVyZm9ybWFuY2UgdnMuIEFIUyBTY29yZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksICMgc2hvdyB0ZXh0IGluIGJvbGQKICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKHNjYXQyX25vdGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgIyBzcGVjaWZ5IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsICMgc3BlY2lmeSBvcmllbnRhdGlvbiBvbiB4LWF4aXMgKGJvdHRvbSBMID0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIikgIyBzaG93IHRleHQgaW4gaXRhbGljcwogICAgICAgICAgICAgICApCmBgYAoKIyMjIyMgVFlQRSAzCgo8ZGV0YWlscz4KPHN1bW1hcnk+ICooY2xpY2sgdG8gc2VlIGNvZGUpKiA8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgc2NhdDNzMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGb3IgVHlwZSAzCiAgIyBFYXJseSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDNfZWFybHkgPSAKICAgIHBlckFIU190MyAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9lYXJseV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIGxhYnModGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gQmxvY2sgMSB2ZXJzdXMgQUhTIFNjb3JlIiwgIyBhZGQgaWYgd2FudCB0byBleHBvcnQgZmlnIGFsb25lCiAgICAjICAgICAgc3VidGl0bGUgPSAiXHUwM0M0ID0gLS40MCwgcCA9IC4wMiIsIAogICAgIyAgICAgIHggPSAiRWFybHkgUGVyZm9ybWFuY2UgKCUpIiwgCiAgICAjICAgICAgeSA9ICJBSFMgU2NvcmUiLCAKICAgICMgICAgICBjYXB0aW9uID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgXG5tb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBCbHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSBcbnJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uIgogICAgIyAgICAgICkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJEFIU19zY29yZSksIG1heChwZXJBSFNfdDMkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDMkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MyRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJCMSIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJHBlcl9lYXJseV9hY2MpLCBtYXgocGVyQUhTX3QzJHBlcl9lYXJseV9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MyRwZXJfZWFybHlfYWNjKSwgbWF4KHBlckFIU190MyRwZXJfZWFybHlfYWNjKSwgYnkgPSAxNSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEI1IHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0M19taWRkbGUgPSAKICAgIHBlckFIU190MyAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9taWRfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJEFIU19zY29yZSksIG1heChwZXJBSFNfdDMkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDMkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MyRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJNaWRkbGUqIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDMkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3QzJHBlcl9taWRfYWNjKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDMkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3QzJHBlcl9taWRfYWNjKSwgYnkgPSAxNSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEIxMCBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDNfbGF0ZSA9IAogICAgcGVyQUhTX3QzICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2xhdGVfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3QzJEFIU19zY29yZSksIG1heChwZXJBSFNfdDMkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDMkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190MyRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJMYXRlIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDMkcGVyX2xhdGVfYWNjKSwgbWF4KHBlckFIU190MyRwZXJfbGF0ZV9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MyRwZXJfbGF0ZV9hY2MpLCBtYXgocGVyQUhTX3QzJHBlcl9sYXRlX2FjYyksIGJ5ID0gMTApKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCiAgCiAgIyBCMS0xMCBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDNfYWxsID0gCiAgICBwZXJBSFNfdDMgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfYWNjX2FsbCwgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MyRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3QzJEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3QzJEFIU19zY29yZSksIG1heChwZXJBSFNfdDMkQUhTX3Njb3JlKSwgYnkgPSAxMCkpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQjEtMTAiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190MyRwZXJfYWNjX2FsbCksIG1heChwZXJBSFNfdDMkcGVyX2FjY19hbGwpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190MyRwZXJfYWNjX2FsbCksIG1heChwZXJBSFNfdDMkcGVyX2FjY19hbGwpLCBieSA9IDUpKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKPC9kZXRhaWxzPgoKCmBgYHtyIHNob3cgc2NhdDNzMiB0b2dldGhlciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBjcmVhdGUgZmlndXJlIGNhcHRpb24Kc2NhdDNfbm90ZTIgPSAiTm90ZTogUGVyZm9ybWFuY2UgaXMgbWVhc3VyZWQgaW4gcGVyY2VudCBjb3JyZWN0LiBIaWdoZXIgQUhTIHNjb3JlIGRlcGljdHMgYSBtb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBUaGUgYmx1ZSBsaW5lIGRlcGljdHMgYSBsaW5lYXIgcmVsYXRpb25zaGlwLiBUaGUgc2hhZGVkIGFyZWEgcmVwcmVzZW50cyBhIDk1JSBjb25maWRlbmNlIHJlZ2lvbi4gKiBwIDwgLjA1IgpzY2F0M19ub3RlMiA9IHBhc3RlMChzdHJ3cmFwKHNjYXQzX25vdGUyLCB3aWR0aCA9IDk1KSwgY29sbGFwc2UgPSAiXG4iKQoKIyBkaXNwbGF5IGFsbCBzY2F0dGVyIHBsb3RzIHRvZ2V0aGVyIC0gZ3JvdXBlZCBieSBTSEogVHlwZQpncmlkLmFycmFuZ2Uoc2NhdDNfZWFybHksIHNjYXQzX21pZGRsZSwgc2NhdDNfbGF0ZSwgc2NhdDNfYWxsLAogICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJUeXBlIDM6IFBlcmZvcm1hbmNlIHZzLiBBSFMgU2NvcmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAjIHNob3cgdGV4dCBpbiBib2xkCiAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYihzY2F0M19ub3RlMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAsICMgc3BlY2lmeSBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAjIHNwZWNpZnkgb3JpZW50YXRpb24gb24geC1heGlzIChib3R0b20gTCA9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIpICMgc2hvdyB0ZXh0IGluIGl0YWxpY3MKICAgICAgICAgICAgICAgKQpgYGAKCiMjIyMjIFRZUEUgNAoKPGRldGFpbHM+CjxzdW1tYXJ5PiAqKGNsaWNrIHRvIHNlZSBjb2RlKSogPC9zdW1tYXJ5PgoKYGBge3IgY3JlYXRlIHNjYXQ0czIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRm9yIFR5cGUgNAogICMgRWFybHkgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQ0X2Vhcmx5ID0gCiAgICBwZXJBSFNfdDQgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfZWFybHlfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBsYWJzKHRpdGxlID0gIlBlcmZvcm1hbmNlIG9uIEJsb2NrIDEgdmVyc3VzIEFIUyBTY29yZSIsICMgYWRkIGlmIHdhbnQgdG8gZXhwb3J0IGZpZyBhbG9uZQogICAgIyAgICAgIHN1YnRpdGxlID0gIlx1MDNDNCA9IC0uNDAsIHAgPSAuMDIiLCAKICAgICMgICAgICB4ID0gIkVhcmx5IFBlcmZvcm1hbmNlICglKSIsIAogICAgIyAgICAgIHkgPSAiQUhTIFNjb3JlIiwgCiAgICAjICAgICAgY2FwdGlvbiA9ICJOb3RlOiBQZXJmb3JtYW5jZSBpcyBtZWFzdXJlZCBpbiBwZXJjZW50IGNvcnJlY3QuIEhpZ2hlciBBSFMgc2NvcmUgZGVwaWN0cyBhIFxubW9yZSBob2xpc3RpYyB0aGlua2luZyBzdHlsZS4gQmx1ZSBsaW5lIGRlcGljdHMgYSBsaW5lYXIgcmVsYXRpb25zaGlwLiBUaGUgc2hhZGVkIGFyZWEgXG5yZXByZXNlbnRzIGEgOTUlIGNvbmZpZGVuY2UgcmVnaW9uLiIKICAgICMgICAgICApICsKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NCRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q0JEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q0JEFIU19zY29yZSksIG1heChwZXJBSFNfdDQkQUhTX3Njb3JlKSwgYnkgPSAxMCkpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQjEiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NCRwZXJfZWFybHlfYWNjKSwgbWF4KHBlckFIU190NCRwZXJfZWFybHlfYWNjKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDQkcGVyX2Vhcmx5X2FjYyksIG1heChwZXJBSFNfdDQkcGVyX2Vhcmx5X2FjYyksIGJ5ID0gMTUpKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCiAgCiAgIyBCNSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDRfbWlkZGxlID0gCiAgICBwZXJBSFNfdDQgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfbWlkX2FjYywgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NCRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q0JEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q0JEFIU19zY29yZSksIG1heChwZXJBSFNfdDQkQUhTX3Njb3JlKSwgYnkgPSAxMCkpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTWlkZGxlIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDQkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3Q0JHBlcl9taWRfYWNjKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDQkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3Q0JHBlcl9taWRfYWNjKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEIxMCBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDRfbGF0ZSA9IAogICAgcGVyQUhTX3Q0ICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2xhdGVfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q0JEFIU19zY29yZSksIG1heChwZXJBSFNfdDQkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDQkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NCRBSFNfc2NvcmUpLCBieSA9IDEwKSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJMYXRlIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDQkcGVyX2xhdGVfYWNjKSwgbWF4KHBlckFIU190NCRwZXJfbGF0ZV9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NCRwZXJfbGF0ZV9hY2MpLCBtYXgocGVyQUhTX3Q0JHBlcl9sYXRlX2FjYyksIGJ5ID0gMTApKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCiAgCiAgIyBCMS0xMCBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDRfYWxsID0gCiAgICBwZXJBSFNfdDQgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfYWNjX2FsbCwgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NCRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q0JEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q0JEFIU19zY29yZSksIG1heChwZXJBSFNfdDQkQUhTX3Njb3JlKSwgYnkgPSAxMCkpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQjEtMTAqIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDQkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q0JHBlcl9hY2NfYWxsKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDQkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q0JHBlcl9hY2NfYWxsKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKYGBgCgo8L2RldGFpbHM+CgoKYGBge3Igc2hvdyBzY2F0NHMyIHRvZ2V0aGVyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGNyZWF0ZSBmaWd1cmUgY2FwdGlvbgpzY2F0NF9ub3RlMiA9ICJOb3RlOiBQZXJmb3JtYW5jZSBpcyBtZWFzdXJlZCBpbiBwZXJjZW50IGNvcnJlY3QuIEhpZ2hlciBBSFMgc2NvcmUgZGVwaWN0cyBhIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcgc3R5bGUuIFRoZSBibHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSByZXByZXNlbnRzIGEgOTUlIGNvbmZpZGVuY2UgcmVnaW9uLiAqIHAgPCAuMDUiCnNjYXQ0X25vdGUyID0gcGFzdGUwKHN0cndyYXAoc2NhdDRfbm90ZTIsIHdpZHRoID0gOTUpLCBjb2xsYXBzZSA9ICJcbiIpCgojIGRpc3BsYXkgYWxsIHNjYXR0ZXIgcGxvdHMgdG9nZXRoZXIgLSBncm91cGVkIGJ5IFNISiBUeXBlCmdyaWQuYXJyYW5nZShzY2F0NF9lYXJseSwgc2NhdDRfbWlkZGxlLCBzY2F0NF9sYXRlLCBzY2F0NF9hbGwsCiAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlR5cGUgNDogUGVyZm9ybWFuY2UgdnMuIEFIUyBTY29yZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksICMgc2hvdyB0ZXh0IGluIGJvbGQKICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKHNjYXQ0X25vdGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgIyBzcGVjaWZ5IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsICMgc3BlY2lmeSBvcmllbnRhdGlvbiBvbiB4LWF4aXMgKGJvdHRvbSBMID0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIikgIyBzaG93IHRleHQgaW4gaXRhbGljcwogICAgICAgICAgICAgICApCmBgYAoKIyMjIyMgVFlQRSA1Cgo8ZGV0YWlscz4KPHN1bW1hcnk+ICooY2xpY2sgdG8gc2VlIGNvZGUpKiA8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgc2NhdDVzMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGb3IgVHlwZSA1CiAgIyBFYXJseSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDVfZWFybHkgPSAKICAgIHBlckFIU190NSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9lYXJseV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIGxhYnModGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gQmxvY2sgMSB2ZXJzdXMgQUhTIFNjb3JlIiwgIyBhZGQgaWYgd2FudCB0byBleHBvcnQgZmlnIGFsb25lCiAgICAjICAgICAgc3VidGl0bGUgPSAiXHUwM0M0ID0gLS40MCwgcCA9IC4wMiIsIAogICAgIyAgICAgIHggPSAiRWFybHkgUGVyZm9ybWFuY2UgKCUpIiwgCiAgICAjICAgICAgeSA9ICJBSFMgU2NvcmUiLCAKICAgICMgICAgICBjYXB0aW9uID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgXG5tb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBCbHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSBcbnJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uIgogICAgIyAgICAgICkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q1JEFIU19zY29yZSksIG1heChwZXJBSFNfdDUkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDUkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NSRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDUkcGVyX2Vhcmx5X2FjYyksIG1heChwZXJBSFNfdDUkcGVyX2Vhcmx5X2FjYykpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q1JHBlcl9lYXJseV9hY2MpLCBtYXgocGVyQUhTX3Q1JHBlcl9lYXJseV9hY2MpLCBieSA9IDE1KSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjUgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQ1X21pZGRsZSA9IAogICAgcGVyQUhTX3Q1ICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX21pZF9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFIUyBTY29yZSIsCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDUkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NSRBSFNfc2NvcmUpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NSRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q1JEFIU19zY29yZSksIGJ5ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTWlkZGxlIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDUkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3Q1JHBlcl9taWRfYWNjKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDUkcGVyX21pZF9hY2MpLCBtYXgocGVyQUhTX3Q1JHBlcl9taWRfYWNjKSwgYnkgPSAxNSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEIxMCBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDVfbGF0ZSA9IAogICAgcGVyQUhTX3Q1ICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2xhdGVfYWNjLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q1JEFIU19zY29yZSksIG1heChwZXJBSFNfdDUkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDUkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NSRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkxhdGUiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NSRwZXJfbGF0ZV9hY2MpLCBtYXgocGVyQUhTX3Q1JHBlcl9sYXRlX2FjYykpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q1JHBlcl9sYXRlX2FjYyksIG1heChwZXJBSFNfdDUkcGVyX2xhdGVfYWNjKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKICAKICAjIEIxLTEwIHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0NV9hbGwgPSAKICAgIHBlckFIU190NSAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9hY2NfYWxsLCB4ID0gQUhTX3Njb3JlKSkgKwogICAgZ2VvbV9wb2ludChzdGF0ID0gImlkZW50aXR5Iiwgc2hhcGUgPSAxNiwgc2l6ZSA9IDEsIHNob3cubGVnZW5kID0gRikgKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0pICsgIyBBZGQgbGluZWFyIHJlZ3Jlc3Npb24gbGluZQogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q1JEFIU19zY29yZSksIG1heChwZXJBSFNfdDUkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDUkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NSRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxLTEwIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDUkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q1JHBlcl9hY2NfYWxsKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDUkcGVyX2FjY19hbGwpLCBtYXgocGVyQUhTX3Q1JHBlcl9hY2NfYWxsKSwgYnkgPSAxMCkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEzKSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIHNpemUgPSAxMiwgZmFjZSA9ICJpdGFsaWMiKSwKICAgICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKYGBgCgo8L2RldGFpbHM+CgoKYGBge3Igc2hvdyBzY2F0NXMyIHRvZ2V0aGVyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIGNyZWF0ZSBmaWd1cmUgY2FwdGlvbgpzY2F0NV9ub3RlMiA9ICJOb3RlOiBQZXJmb3JtYW5jZSBpcyBtZWFzdXJlZCBpbiBwZXJjZW50IGNvcnJlY3QuIEhpZ2hlciBBSFMgc2NvcmUgZGVwaWN0cyBhIG1vcmUgaG9saXN0aWMgdGhpbmtpbmcgc3R5bGUuIFRoZSBibHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSByZXByZXNlbnRzIGEgOTUlIGNvbmZpZGVuY2UgcmVnaW9uLiAqIHAgPCAuMDUiCnNjYXQ1X25vdGUyID0gcGFzdGUwKHN0cndyYXAoc2NhdDVfbm90ZTIsIHdpZHRoID0gOTUpLCBjb2xsYXBzZSA9ICJcbiIpCgojIGRpc3BsYXkgYWxsIHNjYXR0ZXIgcGxvdHMgdG9nZXRoZXIgLSBncm91cGVkIGJ5IFNISiBUeXBlCmdyaWQuYXJyYW5nZShzY2F0NV9lYXJseSwgc2NhdDVfbWlkZGxlLCBzY2F0NV9sYXRlLCBzY2F0NV9hbGwsCiAgICAgICAgICAgICAgIG5yb3cgPSAyLAogICAgICAgICAgICAgICB0b3AgPSB0ZXh0X2dyb2IoIlR5cGUgNTogUGVyZm9ybWFuY2UgdnMuIEFIUyBTY29yZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksICMgc2hvdyB0ZXh0IGluIGJvbGQKICAgICAgICAgICAgICAgYm90dG9tID0gdGV4dF9ncm9iKHNjYXQ1X25vdGUyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgIyBzcGVjaWZ5IGhvcml6b250YWwganVzdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IDAuMDUsICMgc3BlY2lmeSBvcmllbnRhdGlvbiBvbiB4LWF4aXMgKGJvdHRvbSBMID0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiaXRhbGljIikgIyBzaG93IHRleHQgaW4gaXRhbGljcwogICAgICAgICAgICAgICApCmBgYAoKIyMjIyMgVFlQRSA2Cgo8ZGV0YWlscz4KPHN1bW1hcnk+ICooY2xpY2sgdG8gc2VlIGNvZGUpKiA8L3N1bW1hcnk+CgpgYGB7ciBjcmVhdGUgc2NhdDZzMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGb3IgVHlwZSA2CiAgIyBFYXJseSBwZXJmb3JtYW5jZSB2cy4gQUhTIHNjb3JlCiAgc2NhdDZfZWFybHkgPSAKICAgIHBlckFIU190NiAlPiUKICAgIGdncGxvdChhZXMoeSA9IHBlcl9lYXJseV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIGxhYnModGl0bGUgPSAiUGVyZm9ybWFuY2Ugb24gQmxvY2sgMSB2ZXJzdXMgQUhTIFNjb3JlIiwgIyBhZGQgaWYgd2FudCB0byBleHBvcnQgZmlnIGFsb25lCiAgICAjICAgICAgc3VidGl0bGUgPSAiXHUwM0M0ID0gLS40MCwgcCA9IC4wMiIsIAogICAgIyAgICAgIHggPSAiRWFybHkgUGVyZm9ybWFuY2UgKCUpIiwgCiAgICAjICAgICAgeSA9ICJBSFMgU2NvcmUiLCAKICAgICMgICAgICBjYXB0aW9uID0gIk5vdGU6IFBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGluIHBlcmNlbnQgY29ycmVjdC4gSGlnaGVyIEFIUyBzY29yZSBkZXBpY3RzIGEgXG5tb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBCbHVlIGxpbmUgZGVwaWN0cyBhIGxpbmVhciByZWxhdGlvbnNoaXAuIFRoZSBzaGFkZWQgYXJlYSBcbnJlcHJlc2VudHMgYSA5NSUgY29uZmlkZW5jZSByZWdpb24uIgogICAgIyAgICAgICkgKwogICAgIyBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJBSFMgU2NvcmUiLAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q2JEFIU19zY29yZSksIG1heChwZXJBSFNfdDYkQUhTX3Njb3JlKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDYkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NiRBSFNfc2NvcmUpLCBieSA9IDYpKSArCiAgICAjIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkIxIiwgCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDYkcGVyX2Vhcmx5X2FjYyksIG1heChwZXJBSFNfdDYkcGVyX2Vhcmx5X2FjYykpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q2JHBlcl9lYXJseV9hY2MpLCBtYXgocGVyQUhTX3Q2JHBlcl9lYXJseV9hY2MpLCBieSA9IDEwKSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjUgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQ2X21pZGRsZSA9CiAgICBwZXJBSFNfdDYgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfbWlkX2FjYywgeCA9IEFIU19zY29yZSkpICsKICAgIGdlb21fcG9pbnQoc3RhdCA9ICJpZGVudGl0eSIsIHNoYXBlID0gMTYsIHNpemUgPSAxLCBzaG93LmxlZ2VuZCA9IEYpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtKSArICMgQWRkIGxpbmVhciByZWdyZXNzaW9uIGxpbmUKICAgICMgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQUhTIFNjb3JlIiwKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NiRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q2JEFIU19zY29yZSkpLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcShtaW4ocGVyQUhTX3Q2JEFIU19zY29yZSksIG1heChwZXJBSFNfdDYkQUhTX3Njb3JlKSwgYnkgPSA2KSkgKwogICAgIyBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJNaWRkbGUiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NiRwZXJfbWlkX2FjYyksIG1heChwZXJBSFNfdDYkcGVyX21pZF9hY2MpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NiRwZXJfbWlkX2FjYyksIG1heChwZXJBSFNfdDYkcGVyX21pZF9hY2MpLCBieSA9IDEwKSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjEwIHBlcmZvcm1hbmNlIHZzLiBBSFMgc2NvcmUKICBzY2F0Nl9sYXRlID0gCiAgICBwZXJBSFNfdDYgJT4lCiAgICBnZ3Bsb3QoYWVzKHkgPSBwZXJfbGF0ZV9hY2MsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFIUyBTY29yZSIsCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDYkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NiRBSFNfc2NvcmUpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NiRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q2JEFIU19zY29yZSksIGJ5ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiTGF0ZSIsIAogICAgIyAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGVyQUhTX3Q2JHBlcl9sYXRlX2FjYyksIG1heChwZXJBSFNfdDYkcGVyX2xhdGVfYWNjKSksIAogICAgIyAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKG1pbihwZXJBSFNfdDYkcGVyX2xhdGVfYWNjKSwgbWF4KHBlckFIU190NiRwZXJfbGF0ZV9hY2MpLCBieSA9IDE1KSkgKwogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTMpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDEyLCBmYWNlID0gIml0YWxpYyIpLAogICAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKQogIAogICMgQjEtMTAgcGVyZm9ybWFuY2UgdnMuIEFIUyBzY29yZQogIHNjYXQ2X2FsbCA9IAogICAgcGVyQUhTX3Q2ICU+JQogICAgZ2dwbG90KGFlcyh5ID0gcGVyX2FjY19hbGwsIHggPSBBSFNfc2NvcmUpKSArCiAgICBnZW9tX3BvaW50KHN0YXQgPSAiaWRlbnRpdHkiLCBzaGFwZSA9IDE2LCBzaXplID0gMSwgc2hvdy5sZWdlbmQgPSBGKSArCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSkgKyAjIEFkZCBsaW5lYXIgcmVncmVzc2lvbiBsaW5lCiAgICAjIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkFIUyBTY29yZSIsCiAgICAjICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwZXJBSFNfdDYkQUhTX3Njb3JlKSwgbWF4KHBlckFIU190NiRBSFNfc2NvcmUpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NiRBSFNfc2NvcmUpLCBtYXgocGVyQUhTX3Q2JEFIU19zY29yZSksIGJ5ID0gNikpICsKICAgICMgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQjEtMTAiLCAKICAgICMgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBlckFIU190NiRwZXJfYWNjX2FsbCksIG1heChwZXJBSFNfdDYkcGVyX2FjY19hbGwpKSwgCiAgICAjICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEobWluKHBlckFIU190NiRwZXJfYWNjX2FsbCksIG1heChwZXJBSFNfdDYkcGVyX2FjY19hbGwpLCBieSA9IDUpKSArCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMyksCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplID0gMTIsIGZhY2UgPSAiaXRhbGljIiksCiAgICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKPC9kZXRhaWxzPgoKCmBgYHtyIHNob3cgc2NhdDZzMiB0b2dldGhlciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBjcmVhdGUgZmlndXJlIGNhcHRpb24Kc2NhdDZfbm90ZTIgPSAiTm90ZTogUGVyZm9ybWFuY2UgaXMgbWVhc3VyZWQgaW4gcGVyY2VudCBjb3JyZWN0LiBIaWdoZXIgQUhTIHNjb3JlIGRlcGljdHMgYSBtb3JlIGhvbGlzdGljIHRoaW5raW5nIHN0eWxlLiBUaGUgYmx1ZSBsaW5lIGRlcGljdHMgYSBsaW5lYXIgcmVsYXRpb25zaGlwLiBUaGUgc2hhZGVkIGFyZWEgcmVwcmVzZW50cyBhIDk1JSBjb25maWRlbmNlIHJlZ2lvbi4gKiBwIDwgLjA1IgpzY2F0Nl9ub3RlMiA9IHBhc3RlMChzdHJ3cmFwKHNjYXQ2X25vdGUyLCB3aWR0aCA9IDk1KSwgY29sbGFwc2UgPSAiXG4iKQoKIyBkaXNwbGF5IGFsbCBzY2F0dGVyIHBsb3RzIHRvZ2V0aGVyIC0gZ3JvdXBlZCBieSBTSEogVHlwZQpncmlkLmFycmFuZ2Uoc2NhdDZfZWFybHksIHNjYXQ2X21pZGRsZSwgc2NhdDZfbGF0ZSwgc2NhdDZfYWxsLAogICAgICAgICAgICAgICBucm93ID0gMiwKICAgICAgICAgICAgICAgdG9wID0gdGV4dF9ncm9iKCJUeXBlIDY6IFBlcmZvcm1hbmNlIHZzLiBBSFMgU2NvcmUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpLCAjIHNob3cgdGV4dCBpbiBib2xkCiAgICAgICAgICAgICAgIGJvdHRvbSA9IHRleHRfZ3JvYihzY2F0Nl9ub3RlMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAsICMgc3BlY2lmeSBob3Jpem9udGFsIGp1c3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjA1LCAjIHNwZWNpZnkgb3JpZW50YXRpb24gb24geC1heGlzIChib3R0b20gTCA9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gIml0YWxpYyIpICMgc2hvdyB0ZXh0IGluIGl0YWxpY3MKICAgICAgICAgICAgICAgKQpgYGAKCgoK