This is a continuation of the original Cog_Interference analysis, now considering the the relationship that mood has with category learning. First, we will need to import our clean dataframe from the original analysis and then combine it with a .csv file that was used to save the mood information. Mood information is saved as a level of positive affect and negative affect, one measure for each participant. The higher the value a mood measure has, the greater that participant is represented by that mood.

Data Preparation

Load Libraries

library(tidyverse)
library(car)
library(ggplot2)

Set Working Directory

#Set working Directory
knitr::opts_knit$set(root.dir = normalizePath("C:\\Users\\Josh\\Dropbox\\COVIS Interference\\csvfolder"))

Import the Two Data Frames

Cat = read.delim("cogintdataframe.txt", header=TRUE,sep="\t")
Mood = read.delim("moodvalues.txt", header=TRUE,sep="\t")

Combine the Two Data Frames

dfB = merge(Cat, Mood, by.x="Participant")
View(dfB)

Analysis

Now lets run some very simple analysis. First thing we might want to know, is whether there is even a relationship between Mood and Category learning ability. To look at this we’ll need to conduct a number of Correlations, one for each groups we’re interested in (our six groups found in our original data frame), by each mood level (either positive or negative). As such, we’ll be running a total of 12 independent correlations. We’ll begin with our correlations between Positive Affect Level and Category Learning Accuracy. For the time being, we will look at the level of Category Learning Accuracy across all four blocks. In order to do this, we’ll need to create a new data frame that only have one accuracy score for each participant.

dfnoB = dfB %>%
  group_by(Participant, Category, Concurrent, POS, NEG) %>%
  summarise(MeanAcc = mean(Accuracy))
#dfnoB = merge(dfnoB, Mood, by.x = "Participant")
View(dfnoB)

Descriptive Statistics Across Blocks

Rule-Described Category Set

The following plots show the relationship between Negative Affect and Accuracy in our Rule-Described category Set, and Positive Affect and Accuracy in our Rule-Describe Category Set. Bear in mind that each of these plots looks at Accuracy across all four blocks, so we do not see the effect of learning - only their ability level across 320 trials.

Before we can begin, we’ll need to create a subset for only our Rule-Described data. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

RDdfnoB = subset(dfnoB, Category == 'RD')
View(RDdfnoB)

Control Task

To begin, we’ll create a plot that visualizes the relationship between Negative Affect and Accuracy in the control task; as well as Positive Affect and Accuracy in the control task.

RDdfnoBC = subset(RDdfnoB, Concurrent == 'Control')
RDControlplot = ggplot(RDdfnoBC, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Control Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDControlplot

We can see from this plot that there doesn’t appear to be a strong relationship between either Affect type and Accuracy in the control Rule-Described category set. There appears to be a slight positive relationship between Negative Affect and Accuracy; our inferential statistics will attempt to elaborate more on this later. In general, Negative Affect levels appeared to be lower than Positive Affect Levels.

Verbal Interference Task

Next, we’ll create a visualization for the relationship between Negative Affect and Accuracy in the Verbal Interference task; as well as Positive Affect and Accuracy in the Verbal Interference task.

RDdfnoBV = subset(RDdfnoB, Concurrent == 'Letters')
RDVerbalplot = ggplot(RDdfnoBV, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Verbal Interference Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDVerbalplot

In this graph we can see a more dramatic negative relationship between Positive Affect level and performance in the Verbal Interference Group. It would appear that as level of Positive Affect decreased, performance in the Verbal Interference Group also decreased. This indicates to us that if participants had lower levels of Positive Affect, then it may have decreased working memory capacity, resulting in poorer performance on a categorization task when being distracted by another task that used working memory.

Non-Verbal Interference Task

Last for the Rule-Described category set, we’ll create a visualization for the relationship between Negative Affect and Accuracy in the Non-Verbal Interference task; as well as Positive Affect and Accuracy in the Non-Verbal Interference task.

RDdfnoBNV = subset(RDdfnoB, Concurrent == 'Tapping')
RDNonVerbalplot = ggplot(RDdfnoBNV, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Non-Verbal Interference Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDNonVerbalplot

Here we can see a slight positive relationship between level of Positive Affect and Total Accuracy, such that as accuracy increases, so too does level of Positive Affect. The relationship is not dramatic though, and we’ll confirm whether this exists in our inferential statistics.

Information Integration Category Set

The following plots show the relationship between Negative Affect and Accuracy in the Information Integration Category Set, and Positive Affect and Accuracy in the Information Integration Category Set. Bear in mind that each of these plots looks at Accuracy across all four blocks, so we do not see the effect of learning - only their ability level across 320 trials.

Before we can begin, we’ll need to create a subset for only our Information Integration data. We’ll do that here, and then call to it for each of the following Information Integration descriptive plots.

IIdfnoB = subset(dfnoB, Category == 'II')
View(IIdfnoB)

Control Task

To begin, we’ll create a plot that visualizes the relationship between Negative Affect and Accuracy in the control task; as well as Positive Affect and Accuracy in the control task.

IIdfnoBC = subset(IIdfnoB, Concurrent == 'Control')
# We've just made a subset for the Control data
IIControlplot = ggplot(IIdfnoBC, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Control Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIControlplot

We can see in this graph that there doesn’t appear to be any visual relationship between either dimension of affect and accuracy in the control group.

Verbal Interference Task

Next, we’ll create a visualization for the relationship between Negative Affect and Accuracy in the Verbal Interference task; as well as Positive Affect and Accuracy in the Verbal Interference task.

IIdfnoBV = subset(IIdfnoB, Concurrent == 'Letters')
# We've just made a subset for the Verbal Interference data
IIVerbalplot = ggplot(IIdfnoBV, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Verbal Interference Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIVerbalplot

Again, we don’t see any dramatic visual relationships, though there does appear to be a slight negative relationship between Positive Affect and Accuracy, and a slight positive relationship between Negative Affect and Accuracy. Inferential statistics will confirm or deny this.

Non-Verbal Interference Task

Last for the Information Integration category set, we’ll create a visualization for the relationship between Negative Affect and Accuracy in the Non-Verbal Interference task; as well as Positive Affect and Accuracy in the Non-Verbal Interference task.

IIdfnoBNV = subset(IIdfnoB, Concurrent == 'Tapping')
# We've just made a subset for the Non-Verbal Interference data
IINonVerbalplot = ggplot(IIdfnoBNV, aes(x=MeanAcc)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Total Accuracy")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Non-Verbal Interference Group: \n Level of Affect by Accuracy")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IINonVerbalplot

There doesn’t appear to be any visual relationships between either dimension of Affect and Accuracy in the Non-Verbal Interference task. However, there might be a slight relationship between Positive Affect level and Accuracy. Inferential Statistics will either confirm or deny this.

Descriptive Statistics Within Blocks

Our first set of descriptive statistics took a look at the relationship between Mood and Accuracy across all Blocks for each participant. While this tells us what the relationship looks like against a total accuracy score, it doesn’t give us any insight into the effect of learning. As this is a task where participants go through 320 images and attempt to learn a category rule through trial and error, it is important for us to assess how learning was impacted. In the other Rpubs notebook related to this study, we looked at the impact that concurrent tasks can have on learning in each block. Now, we’ll look a the relationship that Mood shares with performance in each block. The reason why this is important is because it can tell us whether Mood played a significant role in initial or late-stage learning.

Rule-Described Category Set

The following plots show the relationship between Negative Affect and Accuracy in our Rule-Described category Set, and Positive Affect and Accuracy in our Rule-Describe Category Set. Each of the following plots shows performance at each Block.

Block 1

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

RDdfB1 = subset(dfB, Category == 'RD')
RDdfB1 = subset(RDdfB1, Block == '0')
View(RDdfB1)

Control at Block 1

RDdfB1C = subset(RDdfB1, Concurrent == 'Control')
RDB1Controlplot = ggplot(RDdfB1C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Control Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB1Controlplot

We can see a slight trend towards a negative relationship between level of Positive Affect and Accuracy at Block 1.

Verbal Interference at Block 1

RDdfB1V = subset(RDdfB1, Concurrent == 'Letters')
RDB1Verbalplot = ggplot(RDdfB1V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Verbal Interference Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB1Verbalplot

We can see a slight negative relationship between Positive Affect and Accuracy at Block 1, but at this point it looks almost negligible.

Non-Verbal Interference at Block 1

RDdfB1NV = subset(RDdfB1, Concurrent == 'Tapping')
RDB1NonVerbalplot = ggplot(RDdfB1NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB1NonVerbalplot

We can see a more dramatic positive relationship here between Positive Affect and Accuracy at Block 1, as well as a slight negative relationship between Negative Affect and Accuracy at Block 1.

Block 2

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

RDdfB2 = subset(dfB, Category == 'RD')
RDdfB2 = subset(RDdfB2, Block == '1')
View(RDdfB2)

Control at Block 2

RDdfB2C = subset(RDdfB2, Concurrent == 'Control')
RDB2Controlplot = ggplot(RDdfB2C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Control Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB2Controlplot

We can see a slight trend towards a positive relationship between level of Negative Affect and Accuracy at Block 2.

Verbal Interference at Block 2

RDdfB2V = subset(RDdfB2, Concurrent == 'Letters')
RDB2Verbalplot = ggplot(RDdfB2V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Verbal Interference Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB2Verbalplot

We can see a negative relationship between Positive Affect and Accuracy at Block 2.

Non-Verbal Interference at Block 2

RDdfB2NV = subset(RDdfB2, Concurrent == 'Tapping')
RDB2NonVerbalplot = ggplot(RDdfB2NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB2NonVerbalplot

There doesn’t seem to be much of a strong relationship with either dimension of Affect type and performance at Block 2. Perhaps a slightly positive relationship between Positive Affect and Accuracy, and a slightly negative relationship between Negative Affect and Accuracy - but at this point, it looks somewhat negligible. Inferential statistics will tell.

Block 3

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

RDdfB3 = subset(dfB, Category == 'RD')
RDdfB3 = subset(RDdfB3, Block == '2')
View(RDdfB3)

Control at Block 3

RDdfB3C = subset(RDdfB3, Concurrent == 'Control')
RDB3Controlplot = ggplot(RDdfB3C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Control Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB3Controlplot

We can see a slight positive relationship between level of Negative Affect and Accuracy at Block 3.

Verbal Interference at Block 3

RDdfB3V = subset(RDdfB3, Concurrent == 'Letters')
RDB3Verbalplot = ggplot(RDdfB3V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Verbal Interference Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB3Verbalplot

We can see a negative relationship between Positive Affect and Accuracy at Block 3.

Non-Verbal Interference at Block 3

RDdfB3NV = subset(RDdfB3, Concurrent == 'Tapping')
RDB3NonVerbalplot = ggplot(RDdfB3NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB3NonVerbalplot

We can see a slightly positive relationship here between Positive Affect and Accuracy at Block 3.

Block 4

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

RDdfB4 = subset(dfB, Category == 'RD')
RDdfB4 = subset(RDdfB4, Block == '3')
View(RDdfB4)

Control at Block 4

RDdfB4C = subset(RDdfB4, Concurrent == 'Control')
RDB4Controlplot = ggplot(RDdfB4C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Control Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB4Controlplot

We can see a slight positive relationship between level of Negative Affect and Accuracy at Block 4.

Verbal Interference at Block 4

RDdfB4V = subset(RDdfB4, Concurrent == 'Letters')
RDB4Verbalplot = ggplot(RDdfB4V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Verbal Interference Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB4Verbalplot

We can see a negative relationship between Positive Affect and Accuracy at Block 4.

Non-Verbal Interference at Block 4

RDdfB4NV = subset(RDdfB4, Concurrent == 'Tapping')
RDB4NonVerbalplot = ggplot(RDdfB4NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Rule-Described Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
RDB4NonVerbalplot

There doesn’t seem to be much of a strong relationship with either dimension of Affect type and performance at Block 4.

Information Integration Category Set

The following plots show the relationship between Negative Affect and Accuracy in our Information Integration category Set, and Positive Affect and Accuracy in our Information Integration Category Set. Each of the following plots shows performance at each Block.

Block 1

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

IIdfB1 = subset(dfB, Category == 'II')
IIdfB1 = subset(IIdfB1, Block == '0')
View(IIdfB1)

Control at Block 1

IIdfB1C = subset(IIdfB1, Concurrent == 'Control')
IIB1Controlplot = ggplot(IIdfB1C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Control Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB1Controlplot

There doesn’t seem to be much of a strong relationship with either dimension of Affect type and performance at Block 1.

Verbal Interference at Block 1

IIdfB1V = subset(IIdfB1, Concurrent == 'Letters')
IIB1Verbalplot = ggplot(IIdfB1V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Verbal Interference Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB1Verbalplot

We can see a slight negative relationship between Positive Affect and Accuracy and a slight positive relationship between Negative Affect and Accuracy at Block 1.

Non-Verbal Interference at Block 1

IIdfB1NV = subset(IIdfB1, Concurrent == 'Tapping')
IIB1NonVerbalplot = ggplot(IIdfB1NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 1")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 1")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB1NonVerbalplot

We can see a slight negative relationship here between Positive Affect and Accuracy, as well as a slight positive relationship between Negative Affect and Accuracy at Block 1.

Block 2

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

IIdfB2 = subset(dfB, Category == 'II')
IIdfB2 = subset(IIdfB2, Block == '1')
View(IIdfB2)

Control at Block 2

IIdfB2C = subset(IIdfB2, Concurrent == 'Control')
IIB2Controlplot = ggplot(IIdfB2C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Control Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB2Controlplot

There appears to be very slight correlations between both Positive and Negative Affect, and Accuracy at Block 2.

Verbal Interference at Block 2

IIdfB2V = subset(IIdfB2, Concurrent == 'Letters')
IIB2Verbalplot = ggplot(IIdfB2V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Verbal Interference Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB2Verbalplot

We can see a slight negative relationship between Positive Affect and Accuracy and a slight positive relationship between Negative Affect and Accuracy at Block 2.

Non-Verbal Interference at Block 2

IIdfB2NV = subset(IIdfB2, Concurrent == 'Tapping')
IIB2NonVerbalplot = ggplot(IIdfB2NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 2")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 2")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB2NonVerbalplot

We can see a positive relationship here between Positive Affect and Accuracy, as well as a negative relationship between Negative Affect and Accuracy at Block 2.

Block 3

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

IIdfB3 = subset(dfB, Category == 'II')
IIdfB3 = subset(IIdfB3, Block == '2')
View(IIdfB3)

Control at Block 3

IIdfB3C = subset(IIdfB3, Concurrent == 'Control')
IIB3Controlplot = ggplot(IIdfB3C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Control Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB3Controlplot

There appears to be very slight correlations between both Positive and Negative Affect, and Accuracy at Block 3.

Verbal Interference at Block 3

IIdfB3V = subset(IIdfB3, Concurrent == 'Letters')
IIB3Verbalplot = ggplot(IIdfB3V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Verbal Interference Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB3Verbalplot

We can see a slight negative relationship between Positive Affect and Accuracy and a slight positive relationship between Negative Affect and Accuracy at Block 3.

Non-Verbal Interference at Block 3

IIdfB3NV = subset(IIdfB3, Concurrent == 'Tapping')
IIB3NonVerbalplot = ggplot(IIdfB3NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 3")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 3")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB3NonVerbalplot

We can see a positive relationship here between Positive Affect and Accuracy, as well as a negative relationship between Negative Affect and Accuracy at Block 3.

Block 4

Before we can begin, we’ll need to create a subset for only our Rule-Described data at Block 1. We’ll do that here, and then call to it for each of the following Rule-Described descriptive plots.

IIdfB4 = subset(dfB, Category == 'II')
IIdfB4 = subset(IIdfB4, Block == '3')
View(IIdfB4)

Control at Block 4

IIdfB4C = subset(IIdfB4, Concurrent == 'Control')
IIB4Controlplot = ggplot(IIdfB4C, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Control Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB4Controlplot

There appears to be avery slight negative relationship between Negative Affect and Accuracy at Block 4.

Verbal Interference at Block 4

IIdfB4V = subset(IIdfB4, Concurrent == 'Letters')
IIB4Verbalplot = ggplot(IIdfB4V, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Verbal Interference Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB4Verbalplot

There appears to be no relationship between either dimension of Affect Type and Accuracy at Block 4.

Non-Verbal Interference at Block 4

IIdfB4NV = subset(IIdfB4, Concurrent == 'Tapping')
IIB4NonVerbalplot = ggplot(IIdfB4NV, aes(x=Accuracy)) +
  geom_point(aes(y = POS, color = "POS"))+
  geom_smooth(method = lm, aes(y = POS), color = "turquoise3")+
  geom_point(aes(y = NEG, color = "NEG"))+
  geom_smooth(method = lm, aes(y = NEG), color = "red")+
  xlab("Accuracy at Block 4")+
  ylab("Level of Affect")+
  ggtitle("Information Integration Non-Verbal Interference Group: \n Level of Affect by Accuracy at Block 4")+
  guides(col= guide_legend(title = "Affect Type"))+
  scale_color_manual(labels = c("Negative", "Positive"), values = c("red", "turquoise3"))
IIB4NonVerbalplot

We can see a slightly positive relationship here between Positive Affect and Accuracy, as well as a slightly positive relationship between Negative Affect and Accuracy at Block 4.

Inferential Statistics

LS0tDQp0aXRsZTogIkNvZ25pdGl2ZSBJbnRlcmZlcmVuY2UgSW4gTXVsdGlwbGUgU3lzdGVtIENhdGVnb3JpemF0aW9uIE1vb2QgQW5hbHlzaXMiDQphdXRob3I6ICJKb3NoIEhhdGhlcmxleSwgQWx5c3NhIFRoaWJlYXVsdCwgUnNoYSBTb3VkLCAmIERyLiBQYXVsIE1pbmRhIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNicNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNicNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwcmV0dHlkb2M6Omh0bWxfcHJldHR5Og0KICAgIHRoZW1lOiBhcmNoaXRlY3QNCiAgICBoaWdobGlnaHQ6IHZpZ25ldHRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc2Jw0KLS0tDQoNClRoaXMgaXMgYSBjb250aW51YXRpb24gb2YgdGhlIG9yaWdpbmFsIENvZ19JbnRlcmZlcmVuY2UgYW5hbHlzaXMsIG5vdyBjb25zaWRlcmluZyB0aGUgdGhlIHJlbGF0aW9uc2hpcCB0aGF0IG1vb2QgaGFzIHdpdGggY2F0ZWdvcnkgbGVhcm5pbmcuIEZpcnN0LCB3ZSB3aWxsIG5lZWQgdG8gaW1wb3J0IG91ciBjbGVhbiBkYXRhZnJhbWUgZnJvbSB0aGUgb3JpZ2luYWwgYW5hbHlzaXMgYW5kIHRoZW4gY29tYmluZSBpdCB3aXRoIGEgLmNzdiBmaWxlIHRoYXQgd2FzIHVzZWQgdG8gc2F2ZSB0aGUgbW9vZCBpbmZvcm1hdGlvbi4gTW9vZCBpbmZvcm1hdGlvbiBpcyBzYXZlZCBhcyBhIGxldmVsIG9mIHBvc2l0aXZlIGFmZmVjdCBhbmQgbmVnYXRpdmUgYWZmZWN0LCBvbmUgbWVhc3VyZSBmb3IgZWFjaCBwYXJ0aWNpcGFudC4gVGhlIGhpZ2hlciB0aGUgdmFsdWUgYSBtb29kIG1lYXN1cmUgaGFzLCB0aGUgZ3JlYXRlciB0aGF0IHBhcnRpY2lwYW50IGlzIHJlcHJlc2VudGVkIGJ5IHRoYXQgbW9vZC4NCg0KIyBEYXRhIFByZXBhcmF0aW9uDQoNCiMjIExvYWQgTGlicmFyaWVzDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KDQojIyBTZXQgV29ya2luZyBEaXJlY3RvcnkNCmBgYHtyfQ0KI1NldCB3b3JraW5nIERpcmVjdG9yeQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBub3JtYWxpemVQYXRoKCJDOlxcVXNlcnNcXEpvc2hcXERyb3Bib3hcXENPVklTIEludGVyZmVyZW5jZVxcY3N2Zm9sZGVyIikpDQpgYGANCg0KIyMgSW1wb3J0IHRoZSBUd28gRGF0YSBGcmFtZXMNCmBgYHtyfQ0KQ2F0ID0gcmVhZC5kZWxpbSgiY29naW50ZGF0YWZyYW1lLnR4dCIsIGhlYWRlcj1UUlVFLHNlcD0iXHQiKQ0KTW9vZCA9IHJlYWQuZGVsaW0oIm1vb2R2YWx1ZXMudHh0IiwgaGVhZGVyPVRSVUUsc2VwPSJcdCIpDQpgYGANCg0KIyMgQ29tYmluZSB0aGUgVHdvIERhdGEgRnJhbWVzDQpgYGB7cn0NCmRmQiA9IG1lcmdlKENhdCwgTW9vZCwgYnkueD0iUGFydGljaXBhbnQiKQ0KDQpWaWV3KGRmQikNCmBgYA0KDQojIEFuYWx5c2lzDQoNCk5vdyBsZXRzIHJ1biBzb21lIHZlcnkgc2ltcGxlIGFuYWx5c2lzLiBGaXJzdCB0aGluZyB3ZSBtaWdodCB3YW50IHRvIGtub3csIGlzIHdoZXRoZXIgdGhlcmUgaXMgZXZlbiBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIE1vb2QgYW5kIENhdGVnb3J5IGxlYXJuaW5nIGFiaWxpdHkuIFRvIGxvb2sgYXQgdGhpcyB3ZSdsbCBuZWVkIHRvIGNvbmR1Y3QgYSBudW1iZXIgb2YgQ29ycmVsYXRpb25zLCBvbmUgZm9yIGVhY2ggZ3JvdXBzIHdlJ3JlIGludGVyZXN0ZWQgaW4gKG91ciBzaXggZ3JvdXBzIGZvdW5kIGluIG91ciBvcmlnaW5hbCBkYXRhIGZyYW1lKSwgYnkgZWFjaCBtb29kIGxldmVsIChlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUpLiBBcyBzdWNoLCB3ZSdsbCBiZSBydW5uaW5nIGEgdG90YWwgb2YgMTIgaW5kZXBlbmRlbnQgY29ycmVsYXRpb25zLiBXZSdsbCBiZWdpbiB3aXRoIG91ciBjb3JyZWxhdGlvbnMgYmV0d2VlbiAqUG9zaXRpdmUgQWZmZWN0IExldmVsKiBhbmQgKkNhdGVnb3J5IExlYXJuaW5nIEFjY3VyYWN5Ki4gRm9yIHRoZSB0aW1lIGJlaW5nLCB3ZSB3aWxsIGxvb2sgYXQgdGhlIGxldmVsIG9mICpDYXRlZ29yeSBMZWFybmluZyBBY2N1cmFjeSogYWNyb3NzIGFsbCBmb3VyIGJsb2Nrcy4gSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UnbGwgbmVlZCB0byBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSB0aGF0IG9ubHkgaGF2ZSBvbmUgYWNjdXJhY3kgc2NvcmUgZm9yIGVhY2ggcGFydGljaXBhbnQuDQoNCmBgYHtyfQ0KZGZub0IgPSBkZkIgJT4lDQogIGdyb3VwX2J5KFBhcnRpY2lwYW50LCBDYXRlZ29yeSwgQ29uY3VycmVudCwgUE9TLCBORUcpICU+JQ0KICBzdW1tYXJpc2UoTWVhbkFjYyA9IG1lYW4oQWNjdXJhY3kpKQ0KDQojVmlldyhkZm5vQikNCmBgYA0KDQojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgQWNyb3NzIEJsb2Nrcw0KDQojIyBSdWxlLURlc2NyaWJlZCBDYXRlZ29yeSBTZXQNCg0KVGhlIGZvbGxvd2luZyBwbG90cyBzaG93IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIG91ciBSdWxlLURlc2NyaWJlZCBjYXRlZ29yeSBTZXQsIGFuZCBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIG91ciBSdWxlLURlc2NyaWJlIENhdGVnb3J5IFNldC4gQmVhciBpbiBtaW5kIHRoYXQgZWFjaCBvZiB0aGVzZSBwbG90cyBsb29rcyBhdCBBY2N1cmFjeSBhY3Jvc3MgYWxsIGZvdXIgYmxvY2tzLCBzbyB3ZSBkbyBub3Qgc2VlIHRoZSBlZmZlY3Qgb2YgbGVhcm5pbmcgLSBvbmx5IHRoZWlyIGFiaWxpdHkgbGV2ZWwgYWNyb3NzIDMyMCB0cmlhbHMuDQoNCkJlZm9yZSB3ZSBjYW4gYmVnaW4sIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc3Vic2V0IGZvciBvbmx5IG91ciBSdWxlLURlc2NyaWJlZCBkYXRhLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpSRGRmbm9CID0gc3Vic2V0KGRmbm9CLCBDYXRlZ29yeSA9PSAnUkQnKQ0KI1ZpZXcoUkRkZm5vQikNCmBgYA0KDQoNCiMjIyBDb250cm9sIFRhc2sNCg0KVG8gYmVnaW4sIHdlJ2xsIGNyZWF0ZSBhIHBsb3QgdGhhdCB2aXN1YWxpemVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBjb250cm9sIHRhc2s7IGFzIHdlbGwgYXMgUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiB0aGUgY29udHJvbCB0YXNrLg0KDQpgYGB7cn0NClJEZGZub0JDID0gc3Vic2V0KFJEZGZub0IsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KUkRDb250cm9scGxvdCA9IGdncGxvdChSRGRmbm9CQywgYWVzKHg9TWVhbkFjYykpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFBPUywgY29sb3IgPSAiUE9TIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBQT1MpLCBjb2xvciA9ICJ0dXJxdW9pc2UzIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBORUcsIGNvbG9yID0gIk5FRyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gTkVHKSwgY29sb3IgPSAicmVkIikrDQogIHhsYWIoIlRvdGFsIEFjY3VyYWN5IikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJSdWxlLURlc2NyaWJlZCBDb250cm9sIEdyb3VwOiBcbiBMZXZlbCBvZiBBZmZlY3QgYnkgQWNjdXJhY3kiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRDb250cm9scGxvdA0KYGBgDQpXZSBjYW4gc2VlIGZyb20gdGhpcyBwbG90IHRoYXQgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gZWl0aGVyIEFmZmVjdCB0eXBlIGFuZCBBY2N1cmFjeSBpbiB0aGUgY29udHJvbCBSdWxlLURlc2NyaWJlZCBjYXRlZ29yeSBzZXQuIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBzbGlnaHQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeTsgb3VyIGluZmVyZW50aWFsIHN0YXRpc3RpY3Mgd2lsbCBhdHRlbXB0IHRvIGVsYWJvcmF0ZSBtb3JlIG9uIHRoaXMgbGF0ZXIuIEluIGdlbmVyYWwsIE5lZ2F0aXZlIEFmZmVjdCBsZXZlbHMgYXBwZWFyZWQgdG8gYmUgbG93ZXIgdGhhbiBQb3NpdGl2ZSBBZmZlY3QgTGV2ZWxzLg0KDQojIyMgVmVyYmFsIEludGVyZmVyZW5jZSBUYXNrDQoNCk5leHQsIHdlJ2xsIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gZm9yIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBWZXJiYWwgSW50ZXJmZXJlbmNlIHRhc2s7IGFzIHdlbGwgYXMgUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiB0aGUgVmVyYmFsIEludGVyZmVyZW5jZSB0YXNrLg0KDQpgYGB7cn0NClJEZGZub0JWID0gc3Vic2V0KFJEZGZub0IsIENvbmN1cnJlbnQgPT0gJ0xldHRlcnMnKQ0KUkRWZXJiYWxwbG90ID0gZ2dwbG90KFJEZGZub0JWLCBhZXMoeD1NZWFuQWNjKSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiVG90YWwgQWNjdXJhY3kiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIlJ1bGUtRGVzY3JpYmVkIFZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpSRFZlcmJhbHBsb3QNCmBgYA0KDQpJbiB0aGlzIGdyYXBoIHdlIGNhbiBzZWUgYSBtb3JlIGRyYW1hdGljIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBsZXZlbCBhbmQgcGVyZm9ybWFuY2UgaW4gdGhlIFZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXAuIEl0IHdvdWxkIGFwcGVhciB0aGF0IGFzIGxldmVsIG9mIFBvc2l0aXZlIEFmZmVjdCBkZWNyZWFzZWQsIHBlcmZvcm1hbmNlIGluIHRoZSBWZXJiYWwgSW50ZXJmZXJlbmNlIEdyb3VwIGFsc28gZGVjcmVhc2VkLiBUaGlzIGluZGljYXRlcyB0byB1cyB0aGF0IGlmIHBhcnRpY2lwYW50cyBoYWQgbG93ZXIgbGV2ZWxzIG9mIFBvc2l0aXZlIEFmZmVjdCwgdGhlbiBpdCBtYXkgaGF2ZSBkZWNyZWFzZWQgd29ya2luZyBtZW1vcnkgY2FwYWNpdHksIHJlc3VsdGluZyBpbiBwb29yZXIgcGVyZm9ybWFuY2Ugb24gYSBjYXRlZ29yaXphdGlvbiB0YXNrIHdoZW4gYmVpbmcgZGlzdHJhY3RlZCBieSBhbm90aGVyIHRhc2sgdGhhdCB1c2VkIHdvcmtpbmcgbWVtb3J5Lg0KDQojIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgVGFzaw0KDQpMYXN0IGZvciB0aGUgUnVsZS1EZXNjcmliZWQgY2F0ZWdvcnkgc2V0LCB3ZSdsbCBjcmVhdGUgYSB2aXN1YWxpemF0aW9uIGZvciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiB0aGUgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgdGFzazsgYXMgd2VsbCBhcyBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBOb24tVmVyYmFsIEludGVyZmVyZW5jZSB0YXNrLg0KDQpgYGB7cn0NClJEZGZub0JOViA9IHN1YnNldChSRGRmbm9CLCBDb25jdXJyZW50ID09ICdUYXBwaW5nJykNClJETm9uVmVyYmFscGxvdCA9IGdncGxvdChSRGRmbm9CTlYsIGFlcyh4PU1lYW5BY2MpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJUb3RhbCBBY2N1cmFjeSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpSRE5vblZlcmJhbHBsb3QNCmBgYA0KDQpIZXJlIHdlIGNhbiBzZWUgYSBzbGlnaHQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGV2ZWwgb2YgUG9zaXRpdmUgQWZmZWN0IGFuZCBUb3RhbCBBY2N1cmFjeSwgc3VjaCB0aGF0IGFzIGFjY3VyYWN5IGluY3JlYXNlcywgc28gdG9vIGRvZXMgbGV2ZWwgb2YgUG9zaXRpdmUgQWZmZWN0LiBUaGUgcmVsYXRpb25zaGlwIGlzIG5vdCBkcmFtYXRpYyB0aG91Z2gsIGFuZCB3ZSdsbCBjb25maXJtIHdoZXRoZXIgdGhpcyBleGlzdHMgaW4gb3VyIGluZmVyZW50aWFsIHN0YXRpc3RpY3MuIA0KDQojIyBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBDYXRlZ29yeSBTZXQNCg0KVGhlIGZvbGxvd2luZyBwbG90cyBzaG93IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBDYXRlZ29yeSBTZXQsIGFuZCBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBDYXRlZ29yeSBTZXQuIEJlYXIgaW4gbWluZCB0aGF0IGVhY2ggb2YgdGhlc2UgcGxvdHMgbG9va3MgYXQgQWNjdXJhY3kgYWNyb3NzIGFsbCBmb3VyIGJsb2Nrcywgc28gd2UgZG8gbm90IHNlZSB0aGUgZWZmZWN0IG9mIGxlYXJuaW5nIC0gb25seSB0aGVpciBhYmlsaXR5IGxldmVsIGFjcm9zcyAzMjAgdHJpYWxzLg0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gZGF0YS4gV2UnbGwgZG8gdGhhdCBoZXJlLCBhbmQgdGhlbiBjYWxsIHRvIGl0IGZvciBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gZGVzY3JpcHRpdmUgcGxvdHMuDQoNCmBgYHtyfQ0KSUlkZm5vQiA9IHN1YnNldChkZm5vQiwgQ2F0ZWdvcnkgPT0gJ0lJJykNCiNWaWV3KElJZGZub0IpDQpgYGANCg0KIyMjIENvbnRyb2wgVGFzaw0KDQpUbyBiZWdpbiwgd2UnbGwgY3JlYXRlIGEgcGxvdCB0aGF0IHZpc3VhbGl6ZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIE5lZ2F0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgaW4gdGhlIGNvbnRyb2wgdGFzazsgYXMgd2VsbCBhcyBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBjb250cm9sIHRhc2suDQoNCmBgYHtyfQ0KSUlkZm5vQkMgPSBzdWJzZXQoSUlkZm5vQiwgQ29uY3VycmVudCA9PSAnQ29udHJvbCcpDQojIFdlJ3ZlIGp1c3QgbWFkZSBhIHN1YnNldCBmb3IgdGhlIENvbnRyb2wgZGF0YQ0KDQpJSUNvbnRyb2xwbG90ID0gZ2dwbG90KElJZGZub0JDLCBhZXMoeD1NZWFuQWNjKSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiVG90YWwgQWNjdXJhY3kiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIkluZm9ybWF0aW9uIEludGVncmF0aW9uIENvbnRyb2wgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpJSUNvbnRyb2xwbG90DQpgYGANCldlIGNhbiBzZWUgaW4gdGhpcyBncmFwaCB0aGF0IHRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSB2aXN1YWwgcmVsYXRpb25zaGlwIGJldHdlZW4gZWl0aGVyIGRpbWVuc2lvbiBvZiBhZmZlY3QgYW5kIGFjY3VyYWN5IGluIHRoZSBjb250cm9sIGdyb3VwLg0KDQojIyMgVmVyYmFsIEludGVyZmVyZW5jZSBUYXNrDQoNCk5leHQsIHdlJ2xsIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gZm9yIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBWZXJiYWwgSW50ZXJmZXJlbmNlIHRhc2s7IGFzIHdlbGwgYXMgUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiB0aGUgVmVyYmFsIEludGVyZmVyZW5jZSB0YXNrLg0KDQpgYGB7cn0NCklJZGZub0JWID0gc3Vic2V0KElJZGZub0IsIENvbmN1cnJlbnQgPT0gJ0xldHRlcnMnKQ0KIyBXZSd2ZSBqdXN0IG1hZGUgYSBzdWJzZXQgZm9yIHRoZSBWZXJiYWwgSW50ZXJmZXJlbmNlIGRhdGENCg0KSUlWZXJiYWxwbG90ID0gZ2dwbG90KElJZGZub0JWLCBhZXMoeD1NZWFuQWNjKSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiVG90YWwgQWNjdXJhY3kiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIkluZm9ybWF0aW9uIEludGVncmF0aW9uIFZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpJSVZlcmJhbHBsb3QNCmBgYA0KQWdhaW4sIHdlIGRvbid0IHNlZSBhbnkgZHJhbWF0aWMgdmlzdWFsIHJlbGF0aW9uc2hpcHMsIHRob3VnaCB0aGVyZSBkb2VzIGFwcGVhciB0byBiZSBhIHNsaWdodCBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5LCBhbmQgYSBzbGlnaHQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeS4gSW5mZXJlbnRpYWwgc3RhdGlzdGljcyB3aWxsIGNvbmZpcm0gb3IgZGVueSB0aGlzLg0KDQojIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgVGFzaw0KDQpMYXN0IGZvciB0aGUgSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gY2F0ZWdvcnkgc2V0LCB3ZSdsbCBjcmVhdGUgYSB2aXN1YWxpemF0aW9uIGZvciB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiB0aGUgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgdGFzazsgYXMgd2VsbCBhcyBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBOb24tVmVyYmFsIEludGVyZmVyZW5jZSB0YXNrLg0KDQpgYGB7cn0NCklJZGZub0JOViA9IHN1YnNldChJSWRmbm9CLCBDb25jdXJyZW50ID09ICdUYXBwaW5nJykNCiMgV2UndmUganVzdCBtYWRlIGEgc3Vic2V0IGZvciB0aGUgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgZGF0YQ0KDQpJSU5vblZlcmJhbHBsb3QgPSBnZ3Bsb3QoSUlkZm5vQk5WLCBhZXMoeD1NZWFuQWNjKSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiVG90YWwgQWNjdXJhY3kiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIkluZm9ybWF0aW9uIEludGVncmF0aW9uIE5vbi1WZXJiYWwgSW50ZXJmZXJlbmNlIEdyb3VwOiBcbiBMZXZlbCBvZiBBZmZlY3QgYnkgQWNjdXJhY3kiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlOb25WZXJiYWxwbG90DQpgYGANCg0KVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHZpc3VhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gZWl0aGVyIGRpbWVuc2lvbiBvZiBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIHRoZSBOb24tVmVyYmFsIEludGVyZmVyZW5jZSB0YXNrLiBIb3dldmVyLCB0aGVyZSBtaWdodCBiZSBhIHNsaWdodCByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgbGV2ZWwgYW5kIEFjY3VyYWN5LiBJbmZlcmVudGlhbCBTdGF0aXN0aWNzIHdpbGwgZWl0aGVyIGNvbmZpcm0gb3IgZGVueSB0aGlzLg0KDQojIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MgV2l0aGluIEJsb2Nrcw0KDQpPdXIgZmlyc3Qgc2V0IG9mIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgdG9vayBhIGxvb2sgYXQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIE1vb2QgYW5kIEFjY3VyYWN5IGFjcm9zcyBhbGwgQmxvY2tzIGZvciBlYWNoIHBhcnRpY2lwYW50LiBXaGlsZSB0aGlzIHRlbGxzIHVzIHdoYXQgdGhlIHJlbGF0aW9uc2hpcCBsb29rcyBsaWtlIGFnYWluc3QgYSB0b3RhbCBhY2N1cmFjeSBzY29yZSwgaXQgZG9lc24ndCBnaXZlIHVzIGFueSBpbnNpZ2h0IGludG8gdGhlIGVmZmVjdCBvZiBsZWFybmluZy4gQXMgdGhpcyBpcyBhIHRhc2sgd2hlcmUgcGFydGljaXBhbnRzIGdvIHRocm91Z2ggMzIwIGltYWdlcyBhbmQgYXR0ZW1wdCB0byBsZWFybiBhIGNhdGVnb3J5IHJ1bGUgdGhyb3VnaCB0cmlhbCBhbmQgZXJyb3IsIGl0IGlzIGltcG9ydGFudCBmb3IgdXMgdG8gYXNzZXNzIGhvdyBsZWFybmluZyB3YXMgaW1wYWN0ZWQuIEluIHRoZSBvdGhlciBScHVicyBub3RlYm9vayByZWxhdGVkIHRvIHRoaXMgc3R1ZHksIHdlIGxvb2tlZCBhdCB0aGUgaW1wYWN0IHRoYXQgY29uY3VycmVudCB0YXNrcyBjYW4gaGF2ZSBvbiBsZWFybmluZyBpbiBlYWNoIGJsb2NrLiBOb3csIHdlJ2xsIGxvb2sgYSB0aGUgcmVsYXRpb25zaGlwIHRoYXQgTW9vZCBzaGFyZXMgd2l0aCBwZXJmb3JtYW5jZSBpbiBlYWNoIGJsb2NrLiBUaGUgcmVhc29uIHdoeSB0aGlzIGlzIGltcG9ydGFudCBpcyBiZWNhdXNlIGl0IGNhbiB0ZWxsIHVzIHdoZXRoZXIgTW9vZCBwbGF5ZWQgYSBzaWduaWZpY2FudCByb2xlIGluIGluaXRpYWwgb3IgbGF0ZS1zdGFnZSBsZWFybmluZy4NCg0KIyMgUnVsZS1EZXNjcmliZWQgQ2F0ZWdvcnkgU2V0DQoNClRoZSBmb2xsb3dpbmcgcGxvdHMgc2hvdyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiBvdXIgUnVsZS1EZXNjcmliZWQgY2F0ZWdvcnkgU2V0LCBhbmQgUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBpbiBvdXIgUnVsZS1EZXNjcmliZSBDYXRlZ29yeSBTZXQuIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBwbG90cyBzaG93cyBwZXJmb3JtYW5jZSBhdCBlYWNoIEJsb2NrLg0KDQojIyMgQmxvY2sgMQ0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpSRGRmQjEgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnUkQnKQ0KUkRkZkIxID0gc3Vic2V0KFJEZGZCMSwgQmxvY2sgPT0gJzAnKQ0KI1ZpZXcoUkRkZkIxKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAxDQoNCmBgYHtyfQ0KUkRkZkIxQyA9IHN1YnNldChSRGRmQjEsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KUkRCMUNvbnRyb2xwbG90ID0gZ2dwbG90KFJEZGZCMUMsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDEiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCMUNvbnRyb2xwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodCB0cmVuZCB0b3dhcmRzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGV2ZWwgb2YgUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAxLg0KDQojIyMjIFZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMQ0KDQpgYGB7cn0NClJEZGZCMVYgPSBzdWJzZXQoUkRkZkIxLCBDb25jdXJyZW50ID09ICdMZXR0ZXJzJykNClJEQjFWZXJiYWxwbG90ID0gZ2dwbG90KFJEZGZCMVYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDEiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCMVZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgc2xpZ2h0IG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYXQgQmxvY2sgMSwgYnV0IGF0IHRoaXMgcG9pbnQgaXQgbG9va3MgYWxtb3N0IG5lZ2xpZ2libGUuIA0KDQojIyMjIE5vbi1WZXJiYWwgSW50ZXJmZXJlbmNlIGF0IEJsb2NrIDENCg0KYGBge3J9DQpSRGRmQjFOViA9IHN1YnNldChSRGRmQjEsIENvbmN1cnJlbnQgPT0gJ1RhcHBpbmcnKQ0KUkRCMU5vblZlcmJhbHBsb3QgPSBnZ3Bsb3QoUkRkZkIxTlYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSBhdCBCbG9jayAxIikrDQogIGd1aWRlcyhjb2w9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBZmZlY3QgVHlwZSIpKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIiksIHZhbHVlcyA9IGMoInJlZCIsICJ0dXJxdW9pc2UzIikpDQoNClJEQjFOb25WZXJiYWxwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIG1vcmUgZHJhbWF0aWMgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGhlcmUgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGF0IEJsb2NrIDEsIGFzIHdlbGwgYXMgYSBzbGlnaHQgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAxLg0KDQojIyMgQmxvY2sgMg0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpSRGRmQjIgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnUkQnKQ0KUkRkZkIyID0gc3Vic2V0KFJEZGZCMiwgQmxvY2sgPT0gJzEnKQ0KI1ZpZXcoUkRkZkIyKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAyDQoNCmBgYHtyfQ0KUkRkZkIyQyA9IHN1YnNldChSRGRmQjIsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KUkRCMkNvbnRyb2xwbG90ID0gZ2dwbG90KFJEZGZCMkMsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMiIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCMkNvbnRyb2xwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodCB0cmVuZCB0b3dhcmRzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gbGV2ZWwgb2YgTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAyLg0KDQojIyMjIFZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMg0KDQpgYGB7cn0NClJEZGZCMlYgPSBzdWJzZXQoUkRkZkIyLCBDb25jdXJyZW50ID09ICdMZXR0ZXJzJykNClJEQjJWZXJiYWxwbG90ID0gZ2dwbG90KFJEZGZCMlYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMiIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCMlZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAyLiANCg0KIyMjIyBOb24tVmVyYmFsIEludGVyZmVyZW5jZSBhdCBCbG9jayAyDQoNCmBgYHtyfQ0KUkRkZkIyTlYgPSBzdWJzZXQoUkRkZkIyLCBDb25jdXJyZW50ID09ICdUYXBwaW5nJykNClJEQjJOb25WZXJiYWxwbG90ID0gZ2dwbG90KFJEZGZCMk5WLCBhZXMoeD1BY2N1cmFjeSkpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFBPUywgY29sb3IgPSAiUE9TIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBQT1MpLCBjb2xvciA9ICJ0dXJxdW9pc2UzIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBORUcsIGNvbG9yID0gIk5FRyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gTkVHKSwgY29sb3IgPSAicmVkIikrDQogIHhsYWIoIkFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIlJ1bGUtRGVzY3JpYmVkIE5vbi1WZXJiYWwgSW50ZXJmZXJlbmNlIEdyb3VwOiBcbiBMZXZlbCBvZiBBZmZlY3QgYnkgQWNjdXJhY3kgYXQgQmxvY2sgMiIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpSREIyTm9uVmVyYmFscGxvdA0KYGBgDQoNClRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBtdWNoIG9mIGEgc3Ryb25nIHJlbGF0aW9uc2hpcCB3aXRoIGVpdGhlciBkaW1lbnNpb24gb2YgQWZmZWN0IHR5cGUgYW5kIHBlcmZvcm1hbmNlIGF0IEJsb2NrIDIuIFBlcmhhcHMgYSBzbGlnaHRseSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5LCBhbmQgYSBzbGlnaHRseSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IC0gYnV0IGF0IHRoaXMgcG9pbnQsIGl0IGxvb2tzIHNvbWV3aGF0IG5lZ2xpZ2libGUuIEluZmVyZW50aWFsIHN0YXRpc3RpY3Mgd2lsbCB0ZWxsLg0KDQojIyMgQmxvY2sgMw0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpSRGRmQjMgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnUkQnKQ0KUkRkZkIzID0gc3Vic2V0KFJEZGZCMywgQmxvY2sgPT0gJzInKQ0KI1ZpZXcoUkRkZkIzKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAzDQoNCmBgYHtyfQ0KUkRkZkIzQyA9IHN1YnNldChSRGRmQjMsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KUkRCM0NvbnRyb2xwbG90ID0gZ2dwbG90KFJEZGZCM0MsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMyIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDMiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCM0NvbnRyb2xwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodCBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBsZXZlbCBvZiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGF0IEJsb2NrIDMuDQoNCiMjIyMgVmVyYmFsIEludGVyZmVyZW5jZSBhdCBCbG9jayAzDQoNCmBgYHtyfQ0KUkRkZkIzViA9IHN1YnNldChSRGRmQjMsIENvbmN1cnJlbnQgPT0gJ0xldHRlcnMnKQ0KUkRCM1ZlcmJhbHBsb3QgPSBnZ3Bsb3QoUkRkZkIzViwgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayAzIikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJSdWxlLURlc2NyaWJlZCBWZXJiYWwgSW50ZXJmZXJlbmNlIEdyb3VwOiBcbiBMZXZlbCBvZiBBZmZlY3QgYnkgQWNjdXJhY3kgYXQgQmxvY2sgMyIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpSREIzVmVyYmFscGxvdA0KYGBgDQoNCldlIGNhbiBzZWUgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGF0IEJsb2NrIDMuIA0KDQojIyMjIE5vbi1WZXJiYWwgSW50ZXJmZXJlbmNlIGF0IEJsb2NrIDMNCg0KYGBge3J9DQpSRGRmQjNOViA9IHN1YnNldChSRGRmQjMsIENvbmN1cnJlbnQgPT0gJ1RhcHBpbmcnKQ0KUkRCM05vblZlcmJhbHBsb3QgPSBnZ3Bsb3QoUkRkZkIzTlYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMyIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiUnVsZS1EZXNjcmliZWQgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSBhdCBCbG9jayAzIikrDQogIGd1aWRlcyhjb2w9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBZmZlY3QgVHlwZSIpKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIiksIHZhbHVlcyA9IGMoInJlZCIsICJ0dXJxdW9pc2UzIikpDQoNClJEQjNOb25WZXJiYWxwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodGx5IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBoZXJlIGJldHdlZW4gUG9zaXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAzLg0KDQojIyMgQmxvY2sgNA0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpSRGRmQjQgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnUkQnKQ0KUkRkZkI0ID0gc3Vic2V0KFJEZGZCNCwgQmxvY2sgPT0gJzMnKQ0KVmlldyhSRGRmQjQpDQpgYGANCg0KIyMjIyBDb250cm9sIGF0IEJsb2NrIDQNCg0KYGBge3J9DQpSRGRmQjRDID0gc3Vic2V0KFJEZGZCNCwgQ29uY3VycmVudCA9PSAnQ29udHJvbCcpDQpSREI0Q29udHJvbHBsb3QgPSBnZ3Bsb3QoUkRkZkI0QywgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayA0IikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJSdWxlLURlc2NyaWJlZCBDb250cm9sIEdyb3VwOiBcbiBMZXZlbCBvZiBBZmZlY3QgYnkgQWNjdXJhY3kgYXQgQmxvY2sgNCIpKw0KICBndWlkZXMoY29sPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiQWZmZWN0IFR5cGUiKSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKCJOZWdhdGl2ZSIsICJQb3NpdGl2ZSIpLCB2YWx1ZXMgPSBjKCJyZWQiLCAidHVycXVvaXNlMyIpKQ0KDQpSREI0Q29udHJvbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgc2xpZ2h0IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGxldmVsIG9mIE5lZ2F0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYXQgQmxvY2sgNC4NCg0KIyMjIyBWZXJiYWwgSW50ZXJmZXJlbmNlIGF0IEJsb2NrIDQNCg0KYGBge3J9DQpSRGRmQjRWID0gc3Vic2V0KFJEZGZCNCwgQ29uY3VycmVudCA9PSAnTGV0dGVycycpDQpSREI0VmVyYmFscGxvdCA9IGdncGxvdChSRGRmQjRWLCBhZXMoeD1BY2N1cmFjeSkpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFBPUywgY29sb3IgPSAiUE9TIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBQT1MpLCBjb2xvciA9ICJ0dXJxdW9pc2UzIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBORUcsIGNvbG9yID0gIk5FRyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gTkVHKSwgY29sb3IgPSAicmVkIikrDQogIHhsYWIoIkFjY3VyYWN5IGF0IEJsb2NrIDQiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIlJ1bGUtRGVzY3JpYmVkIFZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSBhdCBCbG9jayA0IikrDQogIGd1aWRlcyhjb2w9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBZmZlY3QgVHlwZSIpKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIiksIHZhbHVlcyA9IGMoInJlZCIsICJ0dXJxdW9pc2UzIikpDQoNClJEQjRWZXJiYWxwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYXQgQmxvY2sgNC4gDQoNCiMjIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgNA0KDQpgYGB7cn0NClJEZGZCNE5WID0gc3Vic2V0KFJEZGZCNCwgQ29uY3VycmVudCA9PSAnVGFwcGluZycpDQpSREI0Tm9uVmVyYmFscGxvdCA9IGdncGxvdChSRGRmQjROViwgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayA0IikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJSdWxlLURlc2NyaWJlZCBOb24tVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDQiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KUkRCNE5vblZlcmJhbHBsb3QNCmBgYA0KDQpUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgbXVjaCBvZiBhIHN0cm9uZyByZWxhdGlvbnNoaXAgd2l0aCBlaXRoZXIgZGltZW5zaW9uIG9mIEFmZmVjdCB0eXBlIGFuZCBwZXJmb3JtYW5jZSBhdCBCbG9jayA0Lg0KDQojIyBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBDYXRlZ29yeSBTZXQNCg0KVGhlIGZvbGxvd2luZyBwbG90cyBzaG93IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIG91ciBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBjYXRlZ29yeSBTZXQsIGFuZCBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGluIG91ciBJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBDYXRlZ29yeSBTZXQuIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBwbG90cyBzaG93cyBwZXJmb3JtYW5jZSBhdCBlYWNoIEJsb2NrLg0KDQojIyMgQmxvY2sgMQ0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpJSWRmQjEgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnSUknKQ0KSUlkZkIxID0gc3Vic2V0KElJZGZCMSwgQmxvY2sgPT0gJzAnKQ0KI1ZpZXcoSUlkZkIxKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAxDQoNCmBgYHtyfQ0KSUlkZkIxQyA9IHN1YnNldChJSWRmQjEsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KSUlCMUNvbnRyb2xwbG90ID0gZ2dwbG90KElJZGZCMUMsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDEiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCMUNvbnRyb2xwbG90DQpgYGANCg0KVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIG11Y2ggb2YgYSBzdHJvbmcgcmVsYXRpb25zaGlwIHdpdGggZWl0aGVyIGRpbWVuc2lvbiBvZiBBZmZlY3QgdHlwZSBhbmQgcGVyZm9ybWFuY2UgYXQgQmxvY2sgMS4NCg0KIyMjIyBWZXJiYWwgSW50ZXJmZXJlbmNlIGF0IEJsb2NrIDENCg0KYGBge3J9DQpJSWRmQjFWID0gc3Vic2V0KElJZGZCMSwgQ29uY3VycmVudCA9PSAnTGV0dGVycycpDQpJSUIxVmVyYmFscGxvdCA9IGdncGxvdChJSWRmQjFWLCBhZXMoeD1BY2N1cmFjeSkpICsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IFBPUywgY29sb3IgPSAiUE9TIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBQT1MpLCBjb2xvciA9ICJ0dXJxdW9pc2UzIikrDQogIGdlb21fcG9pbnQoYWVzKHkgPSBORUcsIGNvbG9yID0gIk5FRyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gTkVHKSwgY29sb3IgPSAicmVkIikrDQogIHhsYWIoIkFjY3VyYWN5IGF0IEJsb2NrIDEiKSsNCiAgeWxhYigiTGV2ZWwgb2YgQWZmZWN0IikrDQogIGdndGl0bGUoIkluZm9ybWF0aW9uIEludGVncmF0aW9uIFZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSBhdCBCbG9jayAxIikrDQogIGd1aWRlcyhjb2w9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBZmZlY3QgVHlwZSIpKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIiksIHZhbHVlcyA9IGMoInJlZCIsICJ0dXJxdW9pc2UzIikpDQoNCklJQjFWZXJiYWxwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodCBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGFuZCBhIHNsaWdodCBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZWdhdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5IGF0IEJsb2NrIDEuIA0KDQojIyMjIE5vbi1WZXJiYWwgSW50ZXJmZXJlbmNlIGF0IEJsb2NrIDENCg0KYGBge3J9DQpJSWRmQjFOViA9IHN1YnNldChJSWRmQjEsIENvbmN1cnJlbnQgPT0gJ1RhcHBpbmcnKQ0KSUlCMU5vblZlcmJhbHBsb3QgPSBnZ3Bsb3QoSUlkZkIxTlYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMSIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgR3JvdXA6IFxuIExldmVsIG9mIEFmZmVjdCBieSBBY2N1cmFjeSBhdCBCbG9jayAxIikrDQogIGd1aWRlcyhjb2w9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJBZmZlY3QgVHlwZSIpKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoIk5lZ2F0aXZlIiwgIlBvc2l0aXZlIiksIHZhbHVlcyA9IGMoInJlZCIsICJ0dXJxdW9pc2UzIikpDQoNCklJQjFOb25WZXJiYWxwbG90DQpgYGANCg0KV2UgY2FuIHNlZSBhIHNsaWdodCBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgaGVyZSBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3ksIGFzIHdlbGwgYXMgYSBzbGlnaHQgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAxLg0KDQojIyMgQmxvY2sgMg0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpJSWRmQjIgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnSUknKQ0KSUlkZkIyID0gc3Vic2V0KElJZGZCMiwgQmxvY2sgPT0gJzEnKQ0KI1ZpZXcoSUlkZkIyKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAyDQoNCmBgYHtyfQ0KSUlkZkIyQyA9IHN1YnNldChJSWRmQjIsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KSUlCMkNvbnRyb2xwbG90ID0gZ2dwbG90KElJZGZCMkMsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMiIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCMkNvbnRyb2xwbG90DQpgYGANCg0KVGhlcmUgYXBwZWFycyB0byBiZSB2ZXJ5IHNsaWdodCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBib3RoIFBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBBZmZlY3QsIGFuZCBBY2N1cmFjeSBhdCBCbG9jayAyLg0KDQojIyMjIFZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMg0KDQpgYGB7cn0NCklJZGZCMlYgPSBzdWJzZXQoSUlkZkIyLCBDb25jdXJyZW50ID09ICdMZXR0ZXJzJykNCklJQjJWZXJiYWxwbG90ID0gZ2dwbG90KElJZGZCMlYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMiIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCMlZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgc2xpZ2h0IG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYW5kIGEgc2xpZ2h0IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIE5lZ2F0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYXQgQmxvY2sgMi4gDQoNCiMjIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMg0KDQpgYGB7cn0NCklJZGZCMk5WID0gc3Vic2V0KElJZGZCMiwgQ29uY3VycmVudCA9PSAnVGFwcGluZycpDQpJSUIyTm9uVmVyYmFscGxvdCA9IGdncGxvdChJSWRmQjJOViwgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayAyIikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBOb24tVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDIiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCMk5vblZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGhlcmUgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5LCBhcyB3ZWxsIGFzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAyLg0KDQojIyMgQmxvY2sgMw0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpJSWRmQjMgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnSUknKQ0KSUlkZkIzID0gc3Vic2V0KElJZGZCMywgQmxvY2sgPT0gJzInKQ0KI1ZpZXcoSUlkZkIzKQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayAzDQoNCmBgYHtyfQ0KSUlkZkIzQyA9IHN1YnNldChJSWRmQjMsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KSUlCM0NvbnRyb2xwbG90ID0gZ2dwbG90KElJZGZCM0MsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMyIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDMiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCM0NvbnRyb2xwbG90DQpgYGANCg0KVGhlcmUgYXBwZWFycyB0byBiZSB2ZXJ5IHNsaWdodCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBib3RoIFBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBBZmZlY3QsIGFuZCBBY2N1cmFjeSBhdCBCbG9jayAzLg0KDQojIyMjIFZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMw0KDQpgYGB7cn0NCklJZGZCM1YgPSBzdWJzZXQoSUlkZkIzLCBDb25jdXJyZW50ID09ICdMZXR0ZXJzJykNCklJQjNWZXJiYWxwbG90ID0gZ2dwbG90KElJZGZCM1YsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgMyIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDMiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCM1ZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgc2xpZ2h0IG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvc2l0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYW5kIGEgc2xpZ2h0IHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIE5lZ2F0aXZlIEFmZmVjdCBhbmQgQWNjdXJhY3kgYXQgQmxvY2sgMy4gDQoNCiMjIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgMw0KDQpgYGB7cn0NCklJZGZCM05WID0gc3Vic2V0KElJZGZCMywgQ29uY3VycmVudCA9PSAnVGFwcGluZycpDQpJSUIzTm9uVmVyYmFscGxvdCA9IGdncGxvdChJSWRmQjNOViwgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayAzIikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBOb24tVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDMiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCM05vblZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGhlcmUgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5LCBhcyB3ZWxsIGFzIGEgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayAzLg0KDQojIyMgQmxvY2sgNA0KDQpCZWZvcmUgd2UgY2FuIGJlZ2luLCB3ZSdsbCBuZWVkIHRvIGNyZWF0ZSBhIHN1YnNldCBmb3Igb25seSBvdXIgUnVsZS1EZXNjcmliZWQgZGF0YSBhdCBCbG9jayAxLiBXZSdsbCBkbyB0aGF0IGhlcmUsIGFuZCB0aGVuIGNhbGwgdG8gaXQgZm9yIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBSdWxlLURlc2NyaWJlZCBkZXNjcmlwdGl2ZSBwbG90cy4NCg0KYGBge3J9DQpJSWRmQjQgPSBzdWJzZXQoZGZCLCBDYXRlZ29yeSA9PSAnSUknKQ0KSUlkZkI0ID0gc3Vic2V0KElJZGZCNCwgQmxvY2sgPT0gJzMnKQ0KI1ZpZXcoSUlkZkI0KQ0KYGBgDQoNCiMjIyMgQ29udHJvbCBhdCBCbG9jayA0DQoNCmBgYHtyfQ0KSUlkZkI0QyA9IHN1YnNldChJSWRmQjQsIENvbmN1cnJlbnQgPT0gJ0NvbnRyb2wnKQ0KSUlCNENvbnRyb2xwbG90ID0gZ2dwbG90KElJZGZCNEMsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgNCIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gQ29udHJvbCBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDQiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCNENvbnRyb2xwbG90DQpgYGANCg0KVGhlcmUgYXBwZWFycyB0byBiZSBhdmVyeSBzbGlnaHQgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayA0Lg0KDQojIyMjIFZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgNA0KDQpgYGB7cn0NCklJZGZCNFYgPSBzdWJzZXQoSUlkZkI0LCBDb25jdXJyZW50ID09ICdMZXR0ZXJzJykNCklJQjRWZXJiYWxwbG90ID0gZ2dwbG90KElJZGZCNFYsIGFlcyh4PUFjY3VyYWN5KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gUE9TLCBjb2xvciA9ICJQT1MiKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IFBPUyksIGNvbG9yID0gInR1cnF1b2lzZTMiKSsNCiAgZ2VvbV9wb2ludChhZXMoeSA9IE5FRywgY29sb3IgPSAiTkVHIikpKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSBsbSwgYWVzKHkgPSBORUcpLCBjb2xvciA9ICJyZWQiKSsNCiAgeGxhYigiQWNjdXJhY3kgYXQgQmxvY2sgNCIpKw0KICB5bGFiKCJMZXZlbCBvZiBBZmZlY3QiKSsNCiAgZ2d0aXRsZSgiSW5mb3JtYXRpb24gSW50ZWdyYXRpb24gVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDQiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCNFZlcmJhbHBsb3QNCmBgYA0KDQpUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVpdGhlciBkaW1lbnNpb24gb2YgQWZmZWN0IFR5cGUgYW5kIEFjY3VyYWN5IGF0IEJsb2NrIDQuDQoNCiMjIyMgTm9uLVZlcmJhbCBJbnRlcmZlcmVuY2UgYXQgQmxvY2sgNA0KDQpgYGB7cn0NCklJZGZCNE5WID0gc3Vic2V0KElJZGZCNCwgQ29uY3VycmVudCA9PSAnVGFwcGluZycpDQpJSUI0Tm9uVmVyYmFscGxvdCA9IGdncGxvdChJSWRmQjROViwgYWVzKHg9QWNjdXJhY3kpKSArDQogIGdlb21fcG9pbnQoYWVzKHkgPSBQT1MsIGNvbG9yID0gIlBPUyIpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gbG0sIGFlcyh5ID0gUE9TKSwgY29sb3IgPSAidHVycXVvaXNlMyIpKw0KICBnZW9tX3BvaW50KGFlcyh5ID0gTkVHLCBjb2xvciA9ICJORUciKSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9IGxtLCBhZXMoeSA9IE5FRyksIGNvbG9yID0gInJlZCIpKw0KICB4bGFiKCJBY2N1cmFjeSBhdCBCbG9jayA0IikrDQogIHlsYWIoIkxldmVsIG9mIEFmZmVjdCIpKw0KICBnZ3RpdGxlKCJJbmZvcm1hdGlvbiBJbnRlZ3JhdGlvbiBOb24tVmVyYmFsIEludGVyZmVyZW5jZSBHcm91cDogXG4gTGV2ZWwgb2YgQWZmZWN0IGJ5IEFjY3VyYWN5IGF0IEJsb2NrIDQiKSsNCiAgZ3VpZGVzKGNvbD0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIkFmZmVjdCBUeXBlIikpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYygiTmVnYXRpdmUiLCAiUG9zaXRpdmUiKSwgdmFsdWVzID0gYygicmVkIiwgInR1cnF1b2lzZTMiKSkNCg0KSUlCNE5vblZlcmJhbHBsb3QNCmBgYA0KDQpXZSBjYW4gc2VlIGEgc2xpZ2h0bHkgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGhlcmUgYmV0d2VlbiBQb3NpdGl2ZSBBZmZlY3QgYW5kIEFjY3VyYWN5LCBhcyB3ZWxsIGFzIGEgc2xpZ2h0bHkgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gTmVnYXRpdmUgQWZmZWN0IGFuZCBBY2N1cmFjeSBhdCBCbG9jayA0Lg0KDQojIEluZmVyZW50aWFsIFN0YXRpc3RpY3M=