Homework Set 1: Modules 1 - 3
Item 1.1
Using the built-in R data frame ChickWeight which examines weight vs age of chicks on different diets, conduct an analysis of the variable weight. Include all relevant plots, and include titles and axis labels for your histogram and density plot.
favstats(~weight , data = ChickWeight)
The descriptives indicate possible right skew as distance between Q3 and Max (210) is much greater than distance between Q1 and min (28). Also, by Robb’s Rule of Thumb, the mean is more than 18 units greater than the median which is far more than one-tenth of a standard deviation: \[\frac{s}{10}=\frac{71.07}{10}= 7.11\] Therefore we expect skew and outliers to the right.
We can begin our check for outliers by calculating 2 standard deviations away from the mean. Admittedly, this data set has 578 observations, so we definitely expect several data points to exceed this distance from the mean. (See Module S3 material to understand why I make this claim.)
histogram(~weight , data = ChickWeight)

densityplot(~weight , data = ChickWeight)

Both histogram and density plot have some evidence of a mode (tallest bar or bars) with a tail in both directions. The left tail is severely truncated. Hence, the data appear to have been drawn from an approximately normal distribution, with strong skew to the right.
boxplot(ChickWeight$weight, horizontal = TRUE)

There are 7 outliers to the right, and none to the left, confirming the strong skew to the right which we already suspected.
stem(ChickWeight$weight, scale = 2)
The decimal point is 1 digit(s) to the right of the |
3 | 599999999
4 | 00000111111111111111111112222222222222223333456678888888899999999999
5 | 000000111111112222333334445555566667778888899999
6 | 001111111222222223333344444555556666777778888889
7 | 0011111122222233333444444446667778889999
8 | 0011222334444445555556677778899999
9 | 0001223333566666788888889
10 | 00001111222333333345666677788899
11 | 01122223445555667789
12 | 0000222333334444555566778889
13 | 0113444555566788889
14 | 1112344445555666667778889
15 | 0011234444555666777777789
16 | 0000223333444446678899
17 | 0000134445555789
18 | 1224444455567778
19 | 2225677778889999
20 | 01234445555579
21 | 00245578
22 | 00123577
23 | 01123344556788
24 | 08
25 | 001699
26 | 12344569
27 | 259
28 | 0178
29 | 0145
30 | 35579
31 | 8
32 | 127
33 | 12
34 | 1
35 |
36 | 1
37 | 3
The stem plot is optional as the sample size makes it unweildy. A scale of 1 is not detailed enough, and a scale of 5 is too granular. A scale of 2 (splitting stems two ways) shows the distribution rather well. We can also pick off the highest 7 observations which were identified as outliers, the values \(x = 32.2, 32.7, 33.1, 33.2,34.1, 36.1, 37.3\).
Summary of EDA. Approximately normal but skewed right distribution with outliers to the right.
Item 1.3
Use the built-in R data frame cars which compares the numeric variables speed measured in miles per hours (mph) and stopping distance (variable is dist, measured in feet). The data is from the 1920’s, by the way. Create an xyplot for the two variables, and include axis labels on your plot.
xyplot(speed ~ dist, data = cars,
xlab = "Stopping Distance (ft)",
ylab = "Speed (mph)")

Item 1.5
Using the built-in R data frame Dimes which compares the mass of a dime to the year in which is was minted, conduct an analysis of the variable mass. Include all relevant plots, and include titles and axis labels for your histogram and density plot.
favstats(~mass, data = Dimes)
The mean and the median differ by approximately a tenth of a standard deviation, we expect skew and outliers to the right since the mean is to the right of the median. However, the tails of the distribution appear to be approximately symmetric. Notice that none of the observations are more than 2 standard deviations from the mean.
histogram(~mass, data = Dimes,
fit = "normal")

histogram(~mass, data = Dimes,
fit = "normal",
width = .01)

The width of the bins is hard to choose, here. The standard histogram with bin width of 0.02 has too few bars to see the distribution, while a bin width of 0.01 is too granular. Let’s check the other graphics before deciding on any analysis statements.
densityplot(~mass, data = Dimes)

The plateau-shaped density plot shows the data appear more uniformly distributed than normally distributed.
boxplot(Dimes$mass, horizontal = TRUE)

We see the approximate symmetry with no outliers.
stem(Dimes$mass)
The decimal point is 2 digit(s) to the left of the |
221 | 4
222 |
223 | 03445568
224 | 79
225 | 244569
226 | 888
227 | 14457
228 | 27
229 | 288
The best evidence yet of a bell-shaped distribution. Still, one is surely uncomfortable with the normality assumption given this data. For robust procedures like the \(t\)-test and \(t\)-intervals, we would proceed using the normality since there are no outliers. Outliers cause problems in statistics procedures with small samples sizes because they are influential data points. Here, we have minor issues deciding whether the shape is more uniform than normal, but that won’t affect the accuracy of \(t\) procedures.
Summary of EDA. Approximately normal and approximately symmetric. Minor issues with analysis, but not enough to be troublesome in practice.
Item 2.1
Using the Mosaic function rflip, flip 16 coins and count the number of Heads. Repeat 10,000 times using the Mosaic function do. Estimate the probability that, if Dr. Bristol tasted 16 cups of tea each of which was randomly chosen to be “tea first” or “milk first,” that she would get at least 14 correct using a histogram with the type parameter set to “count.”
coins = do(10000) * rflip(16)
tally(~ heads, data = coins)
heads
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
4 16 87 296 629 1215 1687 1973 1806 1204 707 270 88 13 4
16
1
histogram(~heads, data = coins,
width = 1,
type = "count")

We see that 19 times there were exactly 14 Heads, 4 times there were exactly 15 Heads and 1 time there were exactly 16. Thus, we estimate the probability: \[P(k\geq 14)=\frac{24}{10000} = 0.0024\] Notice that, as the sample size grows, Dr. Bristol’s accuracy rate can be much lower and still provide strong evidence to reject the null as unlikely to be true.
Item 2.3
For 32 coins flips (and 10,000 randomized draws), estimate the probability that Dr. Bristol would get at least 24 correct if she were guessing at random. Use a histogram with the type parameter set to “count.” Update pFun to find the theoretical probabilities and compare the two results.
coins = do(10000) * rflip(32)
tally(~ heads, data = coins)
heads
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 12 18 52 122 310 502 786 1106 1344 1422 1332 1091 810
20 21 22 23 24 25 26 27
504 329 162 62 23 5 4 1
histogram(~heads, data = coins,
width = 1,
type = "count")

Notice that we have \[P(k\geq 24)=\frac{30+7+2+1}{10000}=\frac{40}{10000}= 0.004\]
For the pFun function, we update it as follows:
pFun <- function(t) {
choose(32,t)*(.5)^t *(.5)^(32-t)
}
Sum the probabilities from \(k=24\) to \(k=32\).
sum(pFun(24:32))
[1] 0.003500183
Note that the two values are reasonably close to the same value. We could certainly create more than 10,000 samples to improve the accuracy of the randomization effort at estimating the theoretical probability.
Item 3.1
Find the percentile ranking for an IQ score of 120 using the xpnorm function. IQ’s have the \(N(100,15)\) distribution.
xpnorm(120,100,15)
If X ~ N(100, 15), then
P(X <= 120) = P(Z <= 1.333) = 0.9088
P(X > 120) = P(Z > 1.333) = 0.09121
[1] 0.9087888

An IQ score of 120 corresponds to the 90th percentile - note it’s not the 91st percentile, we don’t round, we truncate.
Item 3.4
Find the approximate SAT-Math score that corresponds to the 60th percentile SAT-Math score. Use the xqnorm function. SAT components have the \(N(500,100)\) distribution.
xqnorm(.6,500,100)
If X ~ N(500, 100), then
P(X <= 525.3347) = 0.6
P(X > 525.3347) = 0.4
[1] 525.3347

The 60th percentile on an SAT component is approximately 525.
Homework Set 2: Modules 4 and 5
Item 4.3
Using the AccDate variable from the Data3350 data frame, test the hypothesis that the Yes/No responses to the dating question depend upon whether or not the person is a member of social Greek fraternity or sorority. Test at the \(\alpha = 0.1\) level, and include a Mosaic plot with a description about it’s relationship to your \(p\)-value and conclusions.
Solution. The data pass verification, and we fail to reject the null. There is no evidence that Yes/No responses to the Dating Question depend upon membership in a social Greek fraternitry or sorority. Discussion will vary.
prop.test(AccDate ~ Greek, data = Data3350, alternative = "greater")
2-sample test for equality of proportions with continuity correction
data: tally(AccDate ~ Greek)
X-squared = 0.00045324, df = 1, p-value = 0.4915
alternative hypothesis: greater
95 percent confidence interval:
-0.1333805 1.0000000
sample estimates:
prop 1 prop 2
0.4414414 0.4259259
mosaicplot(AccDate ~ Greek, data = Data3350)

Item 4.4
A strong sense of Coping Humor indicates a person who uses humor to relieve stress and deal with the struggles of life. Test at the .05 level whether more than 10% of North Georgia students exhibit strong Coping Humor. A recent study used a criteria of scoring 30 or higher on the Coping Humor Scale to evaluate this criteria, and found that 21 of 175 North Georgia students did so.
We are testing the hypothesis \[H_0 : prop = 0.1 \\ H_a : prop > 0.1\] using a 1-proportion \(z\)-test which RStudio will evaluate using \(\chi^2\). The data pass verification for \(z\)-procedures because the estimated number of successes is \[np_0 = (175)(0.1) = 17.5\] and thus, the estimated number of failures is much, much larger than 10.
prop.test( x = 21 , n = 175 , p = 0.1 ,
alternative = "g",
correct = F)
1-sample proportions test without continuity correction
data: 21 out of 175
X-squared = 0.77778, df = 1, p-value = 0.1889
alternative hypothesis: true p is greater than 0.1
95 percent confidence interval:
0.08527351 1.00000000
sample estimates:
p
0.12
I showed the abbreviation format for the alternative and correct parameters. We fail to reject the null because \(p = 0.19 > 0.05 = \alpha\). There is no evidence that more than 10% of UNG students exhibit strong coping humor.
Item 4.5
A recent study asked UNG students whether they frequently texted at work about things unrelated to work. For younger students, 25 of 103 said they frequently did so while 15 of 46 students who 21 or older reported doing so. Test for an age-difference for Texting Frequently at Work at the .05 level.
If we use the subscripts Y and D for “younger” and “older” students respectively, we are testing the hypothesis \[H_0 : p_Y = p_D \\ H_a : p_Y > p_D\] using a 2-proportion \(z\)-test (calculator) which RStudio will evaluate using \(\chi^2\). The data pass verification for \(z\)-procedures as there more than 10 successes and 10 failures in both samples. The data pass verification for \(\chi^2\) procedures because they are less strict than for \(z\).
As a fun option, we can create a mosaic plot for the problem since it can be represented as a two-way table. You will not need to do this in homework, tests or projects, but it is not difficult. I just like mosaic plots, so I wanted to learn how to create one from summary data alone. We first create a table called tab, then ask for mosaic plot.
tab = matrix(c(25,15,78,31),ncol=2,byrow=TRUE)
colnames(tab) = c("Younger", "Older")
rownames(tab) = c("Yes","No")
tab
Younger Older
Yes 25 15
No 78 31
The mosaic plot will display the relative proportions as areas.
mosaicplot(tab)

We need to specify a one-tailed test and provide the summary statistics.
prop.test( x = c(25, 15), n = c(103,46),
alternative = "greater" ,
correct = FALSE )
2-sample test for equality of proportions without continuity
correction
data: c out of c25 out of 10315 out of 46
X-squared = 1.1254, df = 1, p-value = 0.8556
alternative hypothesis: greater
95 percent confidence interval:
-0.2166097 1.0000000
sample estimates:
prop 1 prop 2
0.2427184 0.3260870
With \(p = .86 > 0.05 = \alpha\), in fact, much greater, we fail to reject the null. There is no evidence younger students text more frequently at work about things not related to work.
Item 5.2
Use the toxic relationship beliefs variable TxRel from the Data3350 data frame to test for a significant difference between females and males (Sex variable). Use the 0.05 level of significance.
This calls for an independent samples t-test. \[H_0 : \mu_F = \mu_M\\H_a : \mu_F \neq \mu_M\] For some reason, the variable TxRel is not being recognized by the Mosaic function histogram. I use the R standard hist, instead, with the traditional R structure of DataFrame$variable. Notice that other functions are working fine.
favstats(TxRel ~ Sex, data = Data3350)
boxplot(Data3350$TxRel, horizontal = TRUE)

hist(Data3350$TxRel)

histogram(TxRel ~ Sex, data = Data3350)
Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] :
non-numeric argument to binary operator
Again, I can’t get this work. I don’t know why. Mosaic’s densityplot and favstats functions will not work either for the variable by itself. Still, we have evidence of a bell-shaped distribution with no outliers and a huge overall sample size, all of which means that the data are quite suitable for \(t\)-procedures. Since the sample sizes are not sharply unequal (ratio of 96:68 is less than 2:1), these data easily pass verification.
Because \[p = 0.01616 < 0.05 = \alpha\] we reject the null. Evidence suggests there is a difference in naive relationship beliefs based on biological sex. A quick glance at the boxplot using the grouping variable Sex clarifies the situation, as will a quick glance at the means summary in the last two lines of the output.
Item 5.3
Use the Anxiety variable Anx from the Data3350 data frame to test for a significant difference between females and males (Sex variable). Use the 0.05 level of significance.
Another independent samples t-test. \[H_0 : \mu_F = \mu_M\\H_a : \mu_F \neq \mu_M\] Even though the sample size is much greater than 40 and easily passes verification, there’s no reason not to check the distribution and descriptives.
We have evidence of an approximately bell-shaped distribution that is skewed right with an outlier to the right. However, outliers only cause inaccurate \(p\)-values for \(t\)-tests when the sample size is less than 40. Here, we have \(n=144\). There is also no issue with the homogeneity of variances assumption as our sample sizes are not sharply unequal. We have 84 females and 60 males which is not greater than a ratio of 2:1.
We reject the null at the 0.05 level and note that would also have rejected the null at the 0.01 level. We have strong evidence that anxiety levels differ based upon biological sex.
Item 5.5
Use the Neuroticism variable Neuro from the Data3350 data frame to test for a significance difference in levels of Neuroticism based upon Primary Humor Style (PHS variable). Conduct a post hoc Tukey HSD test if needed.
Because the grouping variable has four levels, we will use ANOVA.
\[H_0 : \mu_{AF} = \mu_{SE} = \mu_{AG} = \mu_{SE} \\H_a : \text{At least one significantly different}\]
Let’s take a look at the boxplots and descriptive using the grouping variable to get breakdowns for the individual samples. Again, this is not really necessary due to sample size and the robustness of the \(F\) statistic.
The main reason for running the favstats function is to check the relative sample sizes to assess the homegeneity assumption. Notice the largest to smallest group size ratio is 43 to 31 which is far less than 2:1. The sample size is more than adequate, and the group sizes are not sharply unequal. OK to proceed with ANOVA procedure.
modA = lm(Neuro ~ PHS, data = Data3350)
anova(modA)
Analysis of Variance Table
Response: Neuro
Df Sum Sq Mean Sq F value Pr(>F)
PHS 3 5145.1 1715.03 10.73 2.158e-06 ***
Residuals 140 22375.9 159.83
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
With \[p = 0.00000216 < 0.05 = \alpha\] we reject the null and have evidence for a difference in Neuroticism based on primary humor style. When we reject the null with an ANOVA procedure, we must follow up with a post hoc test. In this course, we will always use Tukey’s Honestly Significant Difference (HSD).
TukeyHSD(modA)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x)
$PHS
diff lwr upr p adj
AG-AF 4.978245 -2.7668457 12.723335 0.3427512
SD-AF 12.000872 3.9970309 20.004713 0.0008530
SE-AF -4.282502 -12.5045100 3.939505 0.5301145
SD-AG 7.022627 -0.3485287 14.393783 0.0679484
SE-AG -9.260747 -16.8682354 -1.653259 0.0101553
SE-SD -16.283374 -24.1541382 -8.412610 0.0000018
mplot(TukeyHSD(modA))

While we can use the HSD confidence intervals and corresponding \(p\)-values to find the significant pairwise differences, the mplot visual output makes life much easier. Only intervals that do not include zero are significantly different, so we see significant differences in
- Self-Defeating vs. Affiliative
- Self-Enhancing vs. Aggressive
- Self-Enhancing vs. Self-Defeating
Item 5.6
Use the Self-Esteem variable SE from the Data3350 data frame to test for a significance difference in levels of Self-Esteem based upon Primary Humor Style (PHS variable). Conduct a post hoc Tukey HSD test if needed.
We will test the hypothesis
\[H_0 : \mu_{AF} = \mu_{SE} = \mu_{AG} = \mu_{SE} \\H_a : \text{At least one significantly different}\]
using ANOVA.
To check the assumptions, consider:
favstats(SE ~ PHS , data = Data3350)
The overall sample size is far greater than 20, and the largest to smallest group size ratio is less than 2:1, so these data are appropriate for ANOVA procedures. For fun, let’s look at the boxplots by group.
boxplot(SE ~ PHS , data = Data3350)

Now we conduct the test by first running the lm (linear models) procedure and next by calling anova. I am creating the variable modS (for self-esteem model) to store the model to used later.
modS = lm(SE ~ PHS , data = Data3350)
anova(modS)
Analysis of Variance Table
Response: SE
Df Sum Sq Mean Sq F value Pr(>F)
PHS 3 3644 1214.68 10.884 1.8e-06 ***
Residuals 140 15625 111.61
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Since we reject the null and find significant evidence of differences, we must conduct the post hoc Tukey’s HSD procedure.
TukeyHSD(modS)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x)
$PHS
diff lwr upr p adj
AG-AF -3.972243 -10.444327 2.4998406 0.3843188
SD-AF -9.646033 -16.334338 -2.9577279 0.0014582
SE-AF 4.182796 -2.687818 11.0534090 0.3916473
SD-AG -5.673790 -11.833400 0.4858203 0.0827024
SE-AG 8.155039 1.797940 14.5121372 0.0059398
SE-SD 13.828829 7.251728 20.4059300 0.0000012
mplot(TukeyHSD(modS))

The two significant pairwise differences are between Self-Enhancing vs. Aggressive and between Self-Enhancing vs. Self-Defeating humor styles.
Item 5.8
Use the subset command as shown above for the following hypothesis test. Males are more likely to use Aggressive Humor, and younger folks are more likely to use aggressive humor than older folks. Find the overall aggressive humor average using the (HSAG variable) in the Data3350 data frame. Subset a group of young men who are less than 20 years old, and test the hypothesis that this subpopulation has a higher group mean than the overall population mean.
First, we must determine \(\mu_0\), the overall mean.
favstats(~HSAG , data = Data3350)
Next, we need a subset of young males.
male = subset(Data3350, Sex == "M", c(Age,HSAG))
yMale = subset(male, Age < 20, HSAG)
yMale
We will test the hypothesis \[H_0 : \mu = 28.85 \\ H_a : \mu > 28.85 \] using a one-tailed \(t\)-test. Checking the assumptions, we need to know our sample size.
favstats(~HSAG , data = yMale)
With a sample size of 12, we have some work to do on the normality assumption: both verify using a boxplot there are no outliers, and use a histogram and density plot to verify the samples appears drawn from an approximately normal distribution.
boxplot(yMale$HSAG, horizontal = T)

We find no outliers, so we check a histogram and density plot. Don’t worry about the extra code - just a demo on how to plot multiple graphics in one output window. It’s totally optional. If you’re interested, though, the output window has coordinates like the unit square, and we define the bottom-left point and top-right point for each graphic inside the print command.
p1 = histogram(~HSAG , data = yMale, width = 3)
p2 = densityplot(~HSAG , data = yMale)
print(p1, c(0,0.5,1,1), more = TRUE)
print(p2, c(0,0,1,0.5))

I had to fiddle a bit with the width parameter on the histogram, but the overall shape confirms the sample appear to have been drawn from an approximately normal distribution. The density plot also shows an approximate bell shape.
t.test(~HSAG , data = yMale , mu = 28.85 , alternative = "g")
One Sample t-test
data: HSAG
t = 1.9429, df = 11, p-value = 0.03903
alternative hypothesis: true mean is greater than 28.85
95 percent confidence interval:
29.1072 Inf
sample estimates:
mean of x
32.25
We reject the null because \(p=0.039 < 0.05 = \alpha\), and we thus have evidence that younger males use more aggressive humor than the overall population at UNG.
Homework Set 3: Modules 6 and 7
Item 6.1
How many resamplings should we use when bootstrapping? Try re-running the code blocks from the Sleep example with 50, 100, 500, and 1000 resamplings. How does the accuracy compare to the theoretical confidence interval as number of resamplings increases? Explain why about 500 resamplings is usually good enough.
Notice how the endpoints fluctuate dramatically as your retry this code block. In five iterations, I saw left endpoints of 6.06, 6.07, 6.09 , 6.08 and 6.02.
bootstrap = do(50) * mean(resample(Data3350$Sleep))
qdata(~mean, p=c(0.025, 0.975), data=bootstrap)
2.5% 97.5%
6.018258 6.598182
Still wobbly: left endpoints of 6.07, 6.03, 6.03, 5.92, 6.03. Notice that not only do have these endpoints jumping around, there’s a mismatch between the one’s above and these.
bootstrap = do(100) * mean(resample(Data3350$Sleep))
qdata(~mean, p=c(0.025, 0.975), data=bootstrap)
2.5% 97.5%
6.030833 6.658182
Starting to stabilize: 6.05, 6.06, 6.03, 6.04, 5.99. Except for the last one, we had a tight grouping.
bootstrap = do(500) * mean(resample(Data3350$Sleep))
qdata(~mean, p=c(0.025, 0.975), data=bootstrap)
2.5% 97.5%
5.984697 6.686742
For the last one, our left endpoints were 6.04, 6.04, 6.03, 6.04, 6.05.
bootstrap = do(1000) * mean(resample(Data3350$Sleep))
qdata(~mean, p=c(0.025, 0.975), data=bootstrap)
2.5% 97.5%
6.048258 6.669697
As we can see, a thousand trials is certainly enough, and the 50 and 100 were way too few. We did hit an outlier value with 500. Stats theory suggests about 500 is enough. However, there is no downside - as long as we have the computing power - to use a thousand or more trials. At a thousand plus, it appears we have stable endpoints for our confidence intervals.
Item 6.3
Use the VarsAth variable in Data3350 where Y / N responses indicate whether the participant’s is a varsity UNG athlete. Assuming the data frame is representative of the UNG Dahlonega campus, create a 95% confidence interval estimate for the percentage of students who are varsity athletes and interpret your findings. Hint: set success = “Y”.
We need to ensure the data pass verification: 10 or more successes and 10 or more failures in the sample.
tally(~VarsAth , data = Data3350)
VarsAth
N Y
148 17
Since we 17 successes and 148 failures, the data are appropriate for \(z\)-procedures. Even though RStudio is using the \(\chi^2\) statistic to evaluate it, we’re emulating a \(z\)-procedure, so I used the verification process for \(z\)-proportion procedures for my data checks.
Item 6.5
Use the CHS variable in Data3350 where numeric scores represent scores on the Coping Humor Scale. Assuming the data frame is representative of the UNG Dahlonega campus, create a 95% confidence interval estimate for the mean CHS score and interpret your findings.
We need to check the normality assumption.
favstats( ~CHS , data = Data3350)
With \(n = 163\) which is much greater than 40, the robustness of the \(t\)-statistic suggests good accuracy for the interval.
confint(t.test(~CHS, data = Data3350))
Item 6.6
Use the CHS variable in Data3350 to create a bootstrap confidence interval at the 95% level. Compare and contrast it with the results from the theoretical confidence interval. Use 500 resamplings.
Let’s create the bootstrapping resampling for the variable CHS and name the data frame boots.
boots = do(500) * mean(resample(Data3350$CHS))
qdata(~mean, p=c(0.025, 0.975), data=boots)
Notice there’s a good deal of agreement between the two different approaches to confidence intervals.
Item 7.2
Use the Data3350 data frame to build and evaluate a linear model for neuroticism (dependent variabele) vs. optimism (independent variable) using the Neuro and Opt variables. Be sure to check the linearity and normality assumptions and analyze all regression statistics. Construct a confidence interval for the slope of the regression line using an appropriate method.
xyplot(Neuro ~ Opt, data = Data3350)

We see and approximately downward trend, and certainly no non-linear pattern. Time to build the model and check the diagnostics.
modN = lm(Neuro ~ Opt, data = Data3350)
summary(modN)
Call:
lm(formula = Neuro ~ Opt, data = Data3350)
Residuals:
Min 1Q Median 3Q Max
-32.153 -8.612 1.765 7.388 27.077
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 79.8572 4.2275 18.890 < 2e-16 ***
Opt -1.8852 0.2096 -8.996 1.29e-15 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 11.09 on 143 degrees of freedom
(20 observations deleted due to missingness)
Multiple R-squared: 0.3614, Adjusted R-squared: 0.357
F-statistic: 80.94 on 1 and 143 DF, p-value: 1.294e-15
With a multiple R-squared of 0.3614, we find that 36% of the variance in Neuro is accounted for by Opt. Since the absolute value of the correlation is \[r = \sqrt{R^2} = \sqrt{0.3614} = 0.601165534607565\] we see that \(r \approx -0.60\). Note that we have to manually add the negative sign for the correlation since the trend was downward sloping. Thus, we have moderate, negative correlation between Neuro and Opt.
Next, lets check the diagnostics.
qqmath(~resid(modN), type = c("p" , "r"))

While a few wiggles exist, the overall pattern lies reasonably close the 45 degree line and provides evidence for an approximately normal (bell-shaped) distribution of residuals. We can also check a fitted values plot, though they make more sense in the presence of multiple predictors.
plot(modN, which = 1 )

The red line is reasonably close to a straight line, and overall the model seems to work rather well and meet the assumptions for linear regression.
To analyze the slope coefficient of \(-1.89\) indicates that, for each 1 unit increase in Opt, we expect a \(1.89\) unit decrease in Neuro.
Item 7.4
Use the Perc data frame to create linear models for the 75th and 90th percentile wage earners from 2000 Q1 through 2019 Q4. Be sure to look carefully at all diagnostic plots. Create models for the Trump era and the last 3 years of the Obama era and conduct hypothesis tests that the Trump era growth was significantly greater than the historic trend as well as greater than the Obama era.
Full details available in my Wage Growth analysis. The summary chart below covers all 20 possible models.
US Weekly Wage Growth Per Quarter: All Wage Earners
\[\begin{array}{lccccc}
&\textbf{10th Percentile}&\textbf{25th Percentile}&\textbf{Median}&\textbf{75th Percentile}&\textbf{90th Percentile}\\
\text{Historic} & \$2.03& \$2.77& \$4.05& \$7.49& \$12.02\\
\text{Trump Era} &\$4.95 & \$5.14 & \$6.90 & \$10.45 & \$20.72\\
\text{Obama Era} & \$1.49 & \$1.48 & \$3.20 & \$6.03 & \$8.34\\
\text{Obama Last 3 Yrs} & \$1.68 & \$2.06 & \$5.08 & \$6.40 & \$6.70
\end{array}\]
Item 7.5
The PercB data is similar to Perc in that it includes the 10th, 25th, 50th, 75th and 90th percentile wages, but PerB includes Black wage earners only. Use the PercB data frame to create a linear model for the median wage growth (50th percentile) from 2000 Q1 through 2019 Q4. Be sure to look carefully at all diagnostic plots. Create models for the Trump era and the last 3 years of the Obama era and conduct hypothesis tests that the Trump era growth was significantly greater than the historic trend as well as greater than the Obama era.
Full details available in my Wage Growth analysis. The summary chart below covers all 20 possible models.
US Weekly Wage Growth Per Quarter: African American Wage Earners Only
\[\begin{array}{lccccc}
&\textbf{10th Percentile}&\textbf{25th Percentile}&\textbf{Median}&\textbf{75th Percentile}&\textbf{90th Percentile}\\
\text{Historic} & \$1.65 & \$2.25 & \$3.11 & \$5.26 & \$9.23\\
\text{Trump Era} & \$3.24 & \$4.66 & \$4.54 & \$9.82 & \$11.57\\
\text{Obama Era} & \$0.88 & \$1.32 & \$1.66 & \$3.79 & \$9.85\\
\text{Obama Last 3 Yrs} & \$1.68 & \$1.65 & \$0.92 & \$2.47 & \$4.60
\end{array}\]
Homework Set 4: Modules 8 and 9
Item 8.2
Using the HSAG variable from the Data3350 data frame, build a linear model for Aggressive Humor using the predictors Narcissism and Self-Defeating Humor Style: \[\text{HSAG} \sim \text{Narc} + \text{HSSD}\] Evaluate and analyze your model including all diagnostic plots.
The linear model:
modG = lm(HSAG ~ Narc + HSSD , data = Data3350)
summary(modG)
Call:
lm(formula = HSAG ~ Narc + HSSD, data = Data3350)
Residuals:
Min 1Q Median 3Q Max
-14.5678 -3.3956 -0.5862 3.8085 15.6463
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 15.25834 2.00564 7.608 4.98e-12 ***
Narc 0.93980 0.18755 5.011 1.73e-06 ***
HSSD 0.31606 0.05922 5.337 4.07e-07 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.926 on 130 degrees of freedom
(32 observations deleted due to missingness)
Multiple R-squared: 0.296, Adjusted R-squared: 0.2851
F-statistic: 27.32 on 2 and 130 DF, p-value: 1.242e-10
Notice that R-squared = 0.296, so the two predictors together are accounting for 30% of the variance in Aggressive Humor.
qqmath(~resid(modG), type = c("p","r"))

plot(modG , which = 1)

The qq-plot is very much linear along the 45 degree line indicating the residuals follow an approximately normal distribution (normality assumption). The fitted values plot also shows the red fit-line lies very close to the dotted horizontal line indicating perfect linearity (linearity assumption). Thus, these data are well-suited for linear regression modeling.
Consider the interpretation of the model: Aggressive humor depends on another humor style – not surprising two types of humor are correlated – and also on Narcissism. That makes sense, too. Aggressive humor is comprised of sarcasm and put-downs, and narcissists would find it less irksome to belittle others.
Item 8.3
Add the Eating Attitudes variable Eat as the third predictor in your model for HSAG:\[\text{HSAG} \sim \text{Narc} + \text{HSSD} + \text{Eat}\] Evaluate and analyze your model including all diagnostic plots, and compare your three-predictor model with your results from the two-predictor model. Is the correlation between Eat and HSAG positive or negative? How can you tell from the model summary statistics output? If higher scores on the Eat variable indicate higher levels of being calorie conscious, knowing the fat content of food items and thinking about burning calories when working out, does this relationship between Eat and HSAG make sense?
The model.
modG2 = lm(HSAG ~ Narc + HSSD + Eat, data = Data3350)
summary(modG2)
Call:
lm(formula = HSAG ~ Narc + HSSD + Eat, data = Data3350)
Residuals:
Min 1Q Median 3Q Max
-15.3174 -3.0466 -0.3175 3.6231 12.8209
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 19.63898 2.54922 7.704 3.28e-12 ***
Narc 1.00601 0.18748 5.366 3.69e-07 ***
HSSD 0.30799 0.05921 5.201 7.70e-07 ***
Eat -0.15245 0.05825 -2.617 0.00994 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 5.828 on 127 degrees of freedom
(34 observations deleted due to missingness)
Multiple R-squared: 0.3196, Adjusted R-squared: 0.3035
F-statistic: 19.89 on 3 and 127 DF, p-value: 1.248e-10
We have increased R-squared to 0.3196, so we are now accounting for an additional 2% of the variance in the Aggressive Humor variable. Note the \(p\)-values for the significance of the correlation. While the Eating Attitudes variable is much less significant than the other two, it’s still significant at the 0.01 level which is why it’s able to contribute additional R-squared to the overall model.
qqmath(~resid(modG2), type = c("p", "r"))

plot(modG2 , which = 1)

The linearity assumption checks out – the fitted values plot shows nearly perfect linearity. The qq-plot wobbles a bit, but the residuals do seem to be approximately normally distributed. Our three-predictor model is excellent, and one would very much trust research conclusions based on a model with summary statistics and diagnostics like this one.
The addition of the Eating Attitudes variable is interesting. The questions are about knowing the number of calories in foods we eat, thinking about how many calories are burned when exercising and other health conscious behaviors. Notice this coefficient is negatively correlated with Aggressive Humor. Those who are more health conscious may – I’m totally guessing here – have an aversion to humor based on insults and put-downs because they are more conscious about weight and body image. Perhaps their empathy makes them resistant to aggressive humor. Whatever the reasons, it is an interesting relationship among personality variables and bears consideration.
Item 9.2
A supposedly fair die is rolled 50 times with the following results: 9 ones, 15 twos, 9 threes, 8 fours, 6 fives and 13 sixes. Test at the 0.05 level whether the die is actually fair using \(\chi^2\) GOF.
I find it hilarious that this fails:
observed = c(9 , 15 , 9 , 8 , 6 , 13)
expected = c(0.1667 , 0.1667 , 0.1667 , 0.1667 , 0.1667 , 0.1667 )
xchisq.test(x = observed,
p = expected)
Error in chisq.test(x = x, y = y, correct = correct, p = p, rescale.p = rescale.p, :
probabilities must sum to 1.
What RStudio is expecting is that we will leave the expected parameter to its default setting when each probability is equally likely. So this works:
xchisq.test(x = observed)
Chi-squared test for given probabilities
data: x
X-squared = 5.6, df = 5, p-value = 0.3471
9.00 15.00 9.00 8.00 6.00 13.00
(10.00) (10.00) (10.00) (10.00) (10.00) (10.00)
[0.10] [2.50] [0.10] [0.40] [1.60] [0.90]
<-0.32> < 1.58> <-0.32> <-0.63> <-1.26> < 0.95>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
Also, if you let RStudio create the rounding error, the values will (in R’s complicated mind) sum to 1. Let’s create a variable for the probability of a dice roll:
pDice = 1/6
pDice
[1] 0.1666667
observed = c(9 , 15 , 9 , 8 , 6 , 13)
expected = c(pDice , pDice , pDice , pDice , pDice , pDice )
xchisq.test(x = observed,
p = expected)
Chi-squared test for given probabilities
data: x
X-squared = 5.6, df = 5, p-value = 0.3471
9.00 15.00 9.00 8.00 6.00 13.00
(10.00) (10.00) (10.00) (10.00) (10.00) (10.00)
[0.10] [2.50] [0.10] [0.40] [1.60] [0.90]
<-0.32> < 1.58> <-0.32> <-0.63> <-1.26> < 0.95>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
So we’ve tested the probability model (null hypothesis) using \(\chi^2\) GOF and found a \(p\)-value of 0.3471. The expected cell counts are all equal to 10 which is greater than 5, so the data pass the verification check. The statistical conclusion? We fail to reject the null. We have no evidence the probability model is incorrect.
LS0tDQp0aXRsZTogIkhvbWV3b3JrIEV4ZXJjaXNlcyBhbmQgU29sdXRpb25zIEd1aWRlIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW5pdGlhbGl6aW5nIFJTdHVkaW88L3NwYW4+DQpUaGUgY29kZSBibG9jayBiZWxvdyB1c2VzIHRoZSAqKmxpYnJhcnkqKiBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgKipNb3NhaWMqKiBwYWNrYWdlIGlzIGxvYWRlZCBhbmQgd2lsbCBpbXBvcnQgdGhlIGRhdGEgZnJhbWVzIHdlIGhhdmUgdXNlZCBpbiBhbGwgbW9kdWxlczogKipEYXRhMzM1MCoqLCAqKkRvbHBoaW4qKiwgKipNZWQqKiwgKipQZXJjKiosICoqUGVyY0IqKi4gUGxlYXNlIG1ha2Ugc3VyZSBhbGwgZGF0YSBzZXRzIGFyZSBkb3dubG9hZGVkIGFuZCBwbGFjZWQgaW4geW91ciB3b3JraW5nIGRpcmVjdG9yeS4NCg0KYGBge3J9DQpsaWJyYXJ5KG1vc2FpYykNCmxpYnJhcnkocmVhZHhsKQ0KRGF0YTMzNTAgPSByZWFkX2V4Y2VsKCJEYXRhMzM1MC54bHN4IikNCk1lZCA9IHJlYWRfZXhjZWwoIk1lZC54bHN4IikNClBlcmMgPSByZWFkX2V4Y2VsKCJQZXJjLnhsc3giKQ0KUGVyQiA9IHJlYWRfZXhjZWwoIlBlcmNCLnhsc3giKQ0KYGBgIA0KPC9kaXY+DQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SG9tZXdvcmsgU2V0IDE6IE1vZHVsZXMgMSAtIDM8L3NwYW4+DQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDEuMTwvc3Bhbj4gDQpVc2luZyB0aGUgYnVpbHQtaW4gUiBkYXRhIGZyYW1lICoqQ2hpY2tXZWlnaHQqKiB3aGljaCBleGFtaW5lcyB3ZWlnaHQgdnMgYWdlIG9mIGNoaWNrcyBvbiBkaWZmZXJlbnQgZGlldHMsIGNvbmR1Y3QgYW4gYW5hbHlzaXMgb2YgdGhlIHZhcmlhYmxlICoqd2VpZ2h0KiouIEluY2x1ZGUgYWxsIHJlbGV2YW50IHBsb3RzLCBhbmQgaW5jbHVkZSB0aXRsZXMgYW5kIGF4aXMgbGFiZWxzIGZvciB5b3VyIGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90Lg0KDQpgYGB7cn0NCmZhdnN0YXRzKH53ZWlnaHQgLCBkYXRhID0gQ2hpY2tXZWlnaHQpDQpgYGANClRoZSBkZXNjcmlwdGl2ZXMgaW5kaWNhdGUgcG9zc2libGUgcmlnaHQgc2tldyBhcyBkaXN0YW5jZSBiZXR3ZWVuIFEzIGFuZCBNYXggKDIxMCkgaXMgbXVjaCBncmVhdGVyIHRoYW4gZGlzdGFuY2UgYmV0d2VlbiBRMSBhbmQgbWluICgyOCkuIEFsc28sIGJ5IFJvYmIncyBSdWxlIG9mIFRodW1iLCB0aGUgbWVhbiBpcyBtb3JlIHRoYW4gMTggdW5pdHMgZ3JlYXRlciB0aGFuIHRoZSBtZWRpYW4gd2hpY2ggaXMgZmFyIG1vcmUgdGhhbiBvbmUtdGVudGggb2YgYSBzdGFuZGFyZCBkZXZpYXRpb246DQokJFxmcmFje3N9ezEwfT1cZnJhY3tgciBwYXN0ZShyb3VuZChmYXZzdGF0cyh+d2VpZ2h0ICwgZGF0YSA9IENoaWNrV2VpZ2h0KSRzZCwyKSlgfXsxMH09IGByIHBhc3RlKDAuMSAqIHJvdW5kKGZhdnN0YXRzKH53ZWlnaHQgLCBkYXRhID0gQ2hpY2tXZWlnaHQpJHNkLDEpKWAkJA0KVGhlcmVmb3JlIHdlIGV4cGVjdCBza2V3IGFuZCBvdXRsaWVycyB0byB0aGUgcmlnaHQuDQoNCldlIGNhbiBiZWdpbiBvdXIgY2hlY2sgZm9yIG91dGxpZXJzIGJ5IGNhbGN1bGF0aW5nIDIgc3RhbmRhcmQgZGV2aWF0aW9ucyBhd2F5IGZyb20gdGhlIG1lYW4uIEFkbWl0dGVkbHksIHRoaXMgZGF0YSBzZXQgaGFzIDU3OCBvYnNlcnZhdGlvbnMsIHNvIHdlIGRlZmluaXRlbHkgZXhwZWN0IHNldmVyYWwgZGF0YSBwb2ludHMgdG8gZXhjZWVkIHRoaXMgZGlzdGFuY2UgZnJvbSB0aGUgbWVhbi4gKFNlZSBNb2R1bGUgUzMgbWF0ZXJpYWwgdG8gdW5kZXJzdGFuZCB3aHkgSSBtYWtlIHRoaXMgY2xhaW0uKQ0KDQoNCmBgYHtyfQ0KaGlzdG9ncmFtKH53ZWlnaHQgLCBkYXRhID0gQ2hpY2tXZWlnaHQpDQpgYGANCmBgYHtyfQ0KZGVuc2l0eXBsb3QofndlaWdodCAsIGRhdGEgPSBDaGlja1dlaWdodCkNCmBgYA0KDQpCb3RoIGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90IGhhdmUgc29tZSBldmlkZW5jZSBvZiBhIG1vZGUgKHRhbGxlc3QgYmFyIG9yIGJhcnMpIHdpdGggYSB0YWlsIGluIGJvdGggZGlyZWN0aW9ucy4gVGhlIGxlZnQgdGFpbCBpcyBzZXZlcmVseSB0cnVuY2F0ZWQuIEhlbmNlLCB0aGUgZGF0YSBhcHBlYXIgdG8gaGF2ZSBiZWVuIGRyYXduIGZyb20gYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uLCB3aXRoIHN0cm9uZyBza2V3IHRvIHRoZSByaWdodC4NCg0KYGBge3J9DQpib3hwbG90KENoaWNrV2VpZ2h0JHdlaWdodCwgaG9yaXpvbnRhbCA9IFRSVUUpDQpgYGANClRoZXJlIGFyZSA3IG91dGxpZXJzIHRvIHRoZSByaWdodCwgYW5kIG5vbmUgdG8gdGhlIGxlZnQsIGNvbmZpcm1pbmcgdGhlIHN0cm9uZyBza2V3IHRvIHRoZSByaWdodCB3aGljaCB3ZSBhbHJlYWR5IHN1c3BlY3RlZC4NCg0KYGBge3J9DQpzdGVtKENoaWNrV2VpZ2h0JHdlaWdodCwgc2NhbGUgPSAyKQ0KYGBgDQpUaGUgc3RlbSBwbG90IGlzIG9wdGlvbmFsIGFzIHRoZSBzYW1wbGUgc2l6ZSBtYWtlcyBpdCB1bndlaWxkeS4gQSBzY2FsZSBvZiAxIGlzIG5vdCBkZXRhaWxlZCBlbm91Z2gsIGFuZCBhIHNjYWxlIG9mIDUgaXMgdG9vIGdyYW51bGFyLiBBIHNjYWxlIG9mIDIgKHNwbGl0dGluZyBzdGVtcyB0d28gd2F5cykgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiByYXRoZXIgd2VsbC4gV2UgY2FuIGFsc28gcGljayBvZmYgdGhlIGhpZ2hlc3QgNyBvYnNlcnZhdGlvbnMgd2hpY2ggd2VyZSBpZGVudGlmaWVkIGFzIG91dGxpZXJzLCB0aGUgdmFsdWVzICR4ID0gMzIuMiwgMzIuNywgMzMuMSwgMzMuMiwzNC4xLCAzNi4xLCAzNy4zJC4NCg0KKipTdW1tYXJ5IG9mIEVEQS4qKiBBcHByb3hpbWF0ZWx5IG5vcm1hbCBidXQgc2tld2VkIHJpZ2h0IGRpc3RyaWJ1dGlvbiB3aXRoIG91dGxpZXJzIHRvIHRoZSByaWdodC4NCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSAxLjM8L3NwYW4+IA0KVXNlIHRoZSBidWlsdC1pbiBSIGRhdGEgZnJhbWUgKipjYXJzKiogd2hpY2ggY29tcGFyZXMgdGhlIG51bWVyaWMgdmFyaWFibGVzICoqc3BlZWQqKiBtZWFzdXJlZCBpbiBtaWxlcyBwZXIgaG91cnMgKG1waCkgYW5kIHN0b3BwaW5nIGRpc3RhbmNlICh2YXJpYWJsZSBpcyAqKmRpc3QqKiwgbWVhc3VyZWQgaW4gZmVldCkuIFRoZSBkYXRhIGlzIGZyb20gdGhlIDE5MjAncywgYnkgdGhlIHdheS4gQ3JlYXRlIGFuICoqeHlwbG90KiogZm9yIHRoZSB0d28gdmFyaWFibGVzLCBhbmQgaW5jbHVkZSBheGlzIGxhYmVscyBvbiB5b3VyIHBsb3QuDQoNCmBgYHtyfQ0KeHlwbG90KHNwZWVkIH4gZGlzdCwgZGF0YSA9IGNhcnMsIA0KICAgICAgIHhsYWIgPSAiU3RvcHBpbmcgRGlzdGFuY2UgKGZ0KSIsDQogICAgICAgeWxhYiA9ICJTcGVlZCAobXBoKSIpDQpgYGANCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSAxLjU8L3NwYW4+IA0KVXNpbmcgdGhlIGJ1aWx0LWluIFIgZGF0YSBmcmFtZSAqKkRpbWVzKiogd2hpY2ggY29tcGFyZXMgdGhlIG1hc3Mgb2YgYSBkaW1lIHRvIHRoZSB5ZWFyIGluIHdoaWNoIGlzIHdhcyBtaW50ZWQsIGNvbmR1Y3QgYW4gYW5hbHlzaXMgb2YgdGhlIHZhcmlhYmxlICoqbWFzcyoqLiBJbmNsdWRlIGFsbCByZWxldmFudCBwbG90cywgYW5kIGluY2x1ZGUgdGl0bGVzIGFuZCBheGlzIGxhYmVscyBmb3IgeW91ciBoaXN0b2dyYW0gYW5kIGRlbnNpdHkgcGxvdC4NCg0KYGBge3J9DQpmYXZzdGF0cyh+bWFzcywgZGF0YSA9IERpbWVzKQ0KYGBgDQpUaGUgbWVhbiBhbmQgdGhlIG1lZGlhbiBkaWZmZXIgYnkgYXBwcm94aW1hdGVseSBhIHRlbnRoIG9mIGEgc3RhbmRhcmQgZGV2aWF0aW9uLCB3ZSBleHBlY3Qgc2tldyBhbmQgb3V0bGllcnMgdG8gdGhlIHJpZ2h0IHNpbmNlIHRoZSBtZWFuIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgbWVkaWFuLiBIb3dldmVyLCB0aGUgdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBhcHBlYXIgdG8gYmUgYXBwcm94aW1hdGVseSBzeW1tZXRyaWMuIE5vdGljZSB0aGF0IG5vbmUgb2YgdGhlIG9ic2VydmF0aW9ucyBhcmUgbW9yZSB0aGFuIDIgc3RhbmRhcmQgZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLg0KDQpgYGB7cn0NCmhpc3RvZ3JhbSh+bWFzcywgZGF0YSA9IERpbWVzLA0KICAgICAgICAgIGZpdCA9ICJub3JtYWwiKQ0KaGlzdG9ncmFtKH5tYXNzLCBkYXRhID0gRGltZXMsDQogICAgICAgICAgZml0ID0gIm5vcm1hbCIsDQogICAgICAgICAgd2lkdGggPSAuMDEpDQpgYGANClRoZSB3aWR0aCBvZiB0aGUgYmlucyBpcyBoYXJkIHRvIGNob29zZSwgaGVyZS4gVGhlIHN0YW5kYXJkIGhpc3RvZ3JhbSB3aXRoIGJpbiB3aWR0aCBvZiAwLjAyIGhhcyB0b28gZmV3IGJhcnMgdG8gc2VlIHRoZSBkaXN0cmlidXRpb24sIHdoaWxlIGEgYmluIHdpZHRoIG9mIDAuMDEgaXMgdG9vIGdyYW51bGFyLiBMZXQncyBjaGVjayB0aGUgb3RoZXIgZ3JhcGhpY3MgYmVmb3JlIGRlY2lkaW5nIG9uIGFueSBhbmFseXNpcyBzdGF0ZW1lbnRzLg0KDQoNCmBgYHtyfQ0KZGVuc2l0eXBsb3Qofm1hc3MsIGRhdGEgPSBEaW1lcykNCmBgYA0KVGhlIHBsYXRlYXUtc2hhcGVkIGRlbnNpdHkgcGxvdCBzaG93cyB0aGUgZGF0YSBhcHBlYXIgbW9yZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgdGhhbiBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KYGBge3J9DQpib3hwbG90KERpbWVzJG1hc3MsIGhvcml6b250YWwgPSBUUlVFKQ0KYGBgDQpXZSBzZWUgdGhlIGFwcHJveGltYXRlIHN5bW1ldHJ5IHdpdGggbm8gb3V0bGllcnMuDQoNCmBgYHtyfQ0Kc3RlbShEaW1lcyRtYXNzKQ0KYGBgDQpUaGUgYmVzdCBldmlkZW5jZSB5ZXQgb2YgYSBiZWxsLXNoYXBlZCBkaXN0cmlidXRpb24uIFN0aWxsLCBvbmUgaXMgc3VyZWx5IHVuY29tZm9ydGFibGUgd2l0aCB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24gZ2l2ZW4gdGhpcyBkYXRhLiBGb3Igcm9idXN0IHByb2NlZHVyZXMgbGlrZSB0aGUgJHQkLXRlc3QgYW5kICR0JC1pbnRlcnZhbHMsIHdlIHdvdWxkIHByb2NlZWQgdXNpbmcgdGhlIG5vcm1hbGl0eSBzaW5jZSB0aGVyZSBhcmUgbm8gb3V0bGllcnMuIE91dGxpZXJzIGNhdXNlIHByb2JsZW1zIGluIHN0YXRpc3RpY3MgcHJvY2VkdXJlcyB3aXRoIHNtYWxsIHNhbXBsZXMgc2l6ZXMgYmVjYXVzZSB0aGV5IGFyZSBpbmZsdWVudGlhbCBkYXRhIHBvaW50cy4gSGVyZSwgd2UgaGF2ZSBtaW5vciBpc3N1ZXMgZGVjaWRpbmcgd2hldGhlciB0aGUgc2hhcGUgaXMgbW9yZSB1bmlmb3JtIHRoYW4gbm9ybWFsLCBidXQgdGhhdCB3b24ndCBhZmZlY3QgdGhlIGFjY3VyYWN5IG9mICR0JCBwcm9jZWR1cmVzLg0KDQoqKlN1bW1hcnkgb2YgRURBLioqIEFwcHJveGltYXRlbHkgbm9ybWFsIGFuZCBhcHByb3hpbWF0ZWx5IHN5bW1ldHJpYy4gTWlub3IgaXNzdWVzIHdpdGggYW5hbHlzaXMsIGJ1dCBub3QgZW5vdWdoIHRvIGJlIHRyb3VibGVzb21lIGluIHByYWN0aWNlLg0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDIuMTwvc3Bhbj4gDQpVc2luZyB0aGUgKk1vc2FpYyogZnVuY3Rpb24gKipyZmxpcCoqLCBmbGlwIDE2IGNvaW5zIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIEhlYWRzLiBSZXBlYXQgMTAsMDAwIHRpbWVzIHVzaW5nIHRoZSAqTW9zYWljKiBmdW5jdGlvbiAqZG8qLiBFc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCwgaWYgRHIuIEJyaXN0b2wgdGFzdGVkIDE2IGN1cHMgb2YgdGVhIGVhY2ggb2Ygd2hpY2ggd2FzIHJhbmRvbWx5IGNob3NlbiB0byBiZSAidGVhIGZpcnN0IiBvciAibWlsayBmaXJzdCwiIHRoYXQgc2hlIHdvdWxkIGdldCBhdCBsZWFzdCAxNCBjb3JyZWN0IHVzaW5nIGEgaGlzdG9ncmFtIHdpdGggdGhlICoqdHlwZSoqIHBhcmFtZXRlciBzZXQgdG8gImNvdW50LiINCg0KYGBge3J9DQpjb2lucyA9IGRvKDEwMDAwKSAqIHJmbGlwKDE2KQ0KdGFsbHkofiBoZWFkcywgZGF0YSA9IGNvaW5zKQ0KaGlzdG9ncmFtKH5oZWFkcywgZGF0YSA9IGNvaW5zLA0KICAgICAgICAgIHdpZHRoID0gMSwNCiAgICAgICAgICB0eXBlID0gImNvdW50IikNCmBgYA0KV2Ugc2VlIHRoYXQgMTkgdGltZXMgdGhlcmUgd2VyZSBleGFjdGx5IDE0IEhlYWRzLCA0IHRpbWVzIHRoZXJlIHdlcmUgZXhhY3RseSAxNSBIZWFkcyBhbmQgMSB0aW1lIHRoZXJlIHdlcmUgZXhhY3RseSAxNi4gVGh1cywgd2UgZXN0aW1hdGUgdGhlIHByb2JhYmlsaXR5Og0KJCRQKGtcZ2VxIDE0KT1cZnJhY3syNH17MTAwMDB9ID0gYHIgcGFzdGUoMjQvMTAwMDApYCQkDQpOb3RpY2UgdGhhdCwgYXMgdGhlIHNhbXBsZSBzaXplIGdyb3dzLCBEci4gQnJpc3RvbCdzIGFjY3VyYWN5IHJhdGUgY2FuIGJlIG11Y2ggbG93ZXIgYW5kIHN0aWxsIHByb3ZpZGUgc3Ryb25nIGV2aWRlbmNlIHRvIHJlamVjdCB0aGUgbnVsbCBhcyB1bmxpa2VseSB0byBiZSB0cnVlLg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSAyLjM8L3NwYW4+IA0KRm9yIDMyIGNvaW5zIGZsaXBzIChhbmQgMTAsMDAwIHJhbmRvbWl6ZWQgZHJhd3MpLCBlc3RpbWF0ZSB0aGUgcHJvYmFiaWxpdHkgdGhhdCBEci4gQnJpc3RvbCB3b3VsZCBnZXQgYXQgbGVhc3QgMjQgY29ycmVjdCBpZiBzaGUgd2VyZSBndWVzc2luZyBhdCByYW5kb20uIFVzZSBhIGhpc3RvZ3JhbSB3aXRoIHRoZSAqKnR5cGUqKiBwYXJhbWV0ZXIgc2V0IHRvICJjb3VudC4iIFVwZGF0ZSAqKnBGdW4qKiB0byBmaW5kIHRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0aWVzIGFuZCBjb21wYXJlIHRoZSB0d28gcmVzdWx0cy4NCg0KDQpgYGB7cn0NCmNvaW5zID0gZG8oMTAwMDApICogcmZsaXAoMzIpDQp0YWxseSh+IGhlYWRzLCBkYXRhID0gY29pbnMpDQpoaXN0b2dyYW0ofmhlYWRzLCBkYXRhID0gY29pbnMsDQogICAgICAgICAgd2lkdGggPSAxLA0KICAgICAgICAgIHR5cGUgPSAiY291bnQiKQ0KYGBgDQpOb3RpY2UgdGhhdCB3ZSBoYXZlICQkUChrXGdlcSAyNCk9XGZyYWN7MzArNysyKzF9ezEwMDAwfT1cZnJhY3s0MH17MTAwMDB9PSBgciBwYXN0ZSg0MC8xMDAwMClgJCQNCg0KRm9yIHRoZSAqKnBGdW4qKiBmdW5jdGlvbiwgd2UgdXBkYXRlIGl0IGFzIGZvbGxvd3M6DQoNCmBgYHtyfQ0KcEZ1biA8LSBmdW5jdGlvbih0KSB7DQogIGNob29zZSgzMix0KSooLjUpXnQgKiguNSleKDMyLXQpDQp9DQpgYGANClN1bSB0aGUgcHJvYmFiaWxpdGllcyBmcm9tICRrPTI0JCB0byAkaz0zMiQuDQoNCmBgYHtyfQ0Kc3VtKHBGdW4oMjQ6MzIpKQ0KYGBgDQpOb3RlIHRoYXQgdGhlIHR3byB2YWx1ZXMgYXJlIHJlYXNvbmFibHkgY2xvc2UgdG8gdGhlIHNhbWUgdmFsdWUuIFdlIGNvdWxkIGNlcnRhaW5seSBjcmVhdGUgbW9yZSB0aGFuIDEwLDAwMCBzYW1wbGVzIHRvIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSByYW5kb21pemF0aW9uIGVmZm9ydCBhdCBlc3RpbWF0aW5nIHRoZSB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0eS4NCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSAzLjE8L3NwYW4+DQpGaW5kIHRoZSBwZXJjZW50aWxlIHJhbmtpbmcgZm9yIGFuIElRIHNjb3JlIG9mIDEyMCB1c2luZyB0aGUgKip4cG5vcm0qKiBmdW5jdGlvbi4gSVEncyBoYXZlIHRoZSAkTigxMDAsMTUpJCBkaXN0cmlidXRpb24uDQoNCmBgYHtyfQ0KeHBub3JtKDEyMCwxMDAsMTUpDQpgYGANCkFuIElRIHNjb3JlIG9mIDEyMCBjb3JyZXNwb25kcyB0byB0aGUgOTB0aCBwZXJjZW50aWxlIC0gbm90ZSBpdCdzIG5vdCB0aGUgOTFzdCBwZXJjZW50aWxlLCB3ZSBkb24ndCByb3VuZCwgd2UgdHJ1bmNhdGUuDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDMuNDwvc3Bhbj4gDQpGaW5kIHRoZSBhcHByb3hpbWF0ZSBTQVQtTWF0aCBzY29yZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA2MHRoIHBlcmNlbnRpbGUgU0FULU1hdGggc2NvcmUuIFVzZSB0aGUgKip4cW5vcm0qKiBmdW5jdGlvbi4gU0FUIGNvbXBvbmVudHMgaGF2ZSB0aGUgJE4oNTAwLDEwMCkkIGRpc3RyaWJ1dGlvbi4NCg0KYGBge3J9DQp4cW5vcm0oLjYsNTAwLDEwMCkNCmBgYA0KVGhlIDYwdGggcGVyY2VudGlsZSBvbiBhbiBTQVQgY29tcG9uZW50IGlzIGFwcHJveGltYXRlbHkgNTI1Lg0KDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SG9tZXdvcmsgU2V0IDI6IE1vZHVsZXMgNCBhbmQgNTwvc3Bhbj4NCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkl0ZW0gNC4zPC9zcGFuPiANClVzaW5nIHRoZSAqKkFjY0RhdGUqKiB2YXJpYWJsZSBmcm9tIHRoZSAqKkRhdGEzMzUwKiogZGF0YSBmcmFtZSwgdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IHRoZSBZZXMvTm8gcmVzcG9uc2VzIHRvIHRoZSBkYXRpbmcgcXVlc3Rpb24gZGVwZW5kIHVwb24gd2hldGhlciBvciBub3QgdGhlIHBlcnNvbiBpcyBhIG1lbWJlciBvZiBzb2NpYWwgKipHcmVlayoqIGZyYXRlcm5pdHkgb3Igc29yb3JpdHkuIFRlc3QgYXQgdGhlICRcYWxwaGEgPSAwLjEkIGxldmVsLCBhbmQgaW5jbHVkZSBhIE1vc2FpYyBwbG90IHdpdGggYSBkZXNjcmlwdGlvbiBhYm91dCBpdCdzIHJlbGF0aW9uc2hpcCB0byB5b3VyICRwJC12YWx1ZSBhbmQgY29uY2x1c2lvbnMuDQoNCioqU29sdXRpb24uKiogVGhlIGRhdGEgcGFzcyB2ZXJpZmljYXRpb24sIGFuZCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbC4gVGhlcmUgaXMgbm8gZXZpZGVuY2UgdGhhdCBZZXMvTm8gcmVzcG9uc2VzIHRvIHRoZSBEYXRpbmcgUXVlc3Rpb24gZGVwZW5kIHVwb24gbWVtYmVyc2hpcCBpbiBhIHNvY2lhbCBHcmVlayBmcmF0ZXJuaXRyeSBvciBzb3Jvcml0eS4gRGlzY3Vzc2lvbiB3aWxsIHZhcnkuDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KEFjY0RhdGUgfiBHcmVlaywgZGF0YSA9IERhdGEzMzUwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikNCm1vc2FpY3Bsb3QoQWNjRGF0ZSB+IEdyZWVrLCBkYXRhID0gRGF0YTMzNTApDQpgYGANCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDQuNDwvc3Bhbj4gDQpBIHN0cm9uZyBzZW5zZSBvZiBDb3BpbmcgSHVtb3IgaW5kaWNhdGVzIGEgcGVyc29uIHdobyB1c2VzIGh1bW9yIHRvIHJlbGlldmUgc3RyZXNzIGFuZCBkZWFsIHdpdGggdGhlIHN0cnVnZ2xlcyBvZiBsaWZlLiBUZXN0IGF0IHRoZSAuMDUgbGV2ZWwgd2hldGhlciBtb3JlIHRoYW4gMTAlIG9mIE5vcnRoIEdlb3JnaWEgc3R1ZGVudHMgZXhoaWJpdCBzdHJvbmcgQ29waW5nIEh1bW9yLiBBIHJlY2VudCBzdHVkeSB1c2VkIGEgY3JpdGVyaWEgb2Ygc2NvcmluZyAzMCBvciBoaWdoZXIgb24gdGhlIENvcGluZyBIdW1vciBTY2FsZSB0byBldmFsdWF0ZSB0aGlzIGNyaXRlcmlhLCBhbmQgZm91bmQgdGhhdCAyMSBvZiAxNzUgTm9ydGggR2VvcmdpYSBzdHVkZW50cyBkaWQgc28uIA0KDQpXZSBhcmUgdGVzdGluZyB0aGUgaHlwb3RoZXNpcyANCiQkSF8wIDogcHJvcCA9IDAuMSBcXCBIX2EgOiBwcm9wID4gMC4xJCQNCnVzaW5nIGEgMS1wcm9wb3J0aW9uICR6JC10ZXN0IHdoaWNoIFJTdHVkaW8gd2lsbCBldmFsdWF0ZSB1c2luZyAkXGNoaV4yJC4gVGhlIGRhdGEgcGFzcyB2ZXJpZmljYXRpb24gZm9yICR6JC1wcm9jZWR1cmVzIGJlY2F1c2UgdGhlIGVzdGltYXRlZCBudW1iZXIgb2Ygc3VjY2Vzc2VzIGlzIA0KJCRucF8wID0gKDE3NSkoMC4xKSA9IDE3LjUkJA0KYW5kIHRodXMsIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGZhaWx1cmVzIGlzIG11Y2gsIG11Y2ggbGFyZ2VyIHRoYW4gMTAuDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KCB4ID0gMjEgLCBuID0gMTc1ICwgcCA9IDAuMSAsIA0KICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJnIiwNCiAgICAgICAgICAgY29ycmVjdCA9IEYpDQpgYGANCkkgc2hvd2VkIHRoZSBhYmJyZXZpYXRpb24gZm9ybWF0IGZvciB0aGUgKiphbHRlcm5hdGl2ZSoqIGFuZCAqKmNvcnJlY3QqKiBwYXJhbWV0ZXJzLiBXZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBiZWNhdXNlICRwID0gMC4xOSA+IDAuMDUgPSBcYWxwaGEkLiBUaGVyZSBpcyBubyBldmlkZW5jZSB0aGF0IG1vcmUgdGhhbiAxMCUgb2YgVU5HIHN0dWRlbnRzIGV4aGliaXQgc3Ryb25nIGNvcGluZyBodW1vci4NCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkl0ZW0gNC41PC9zcGFuPiANCkEgcmVjZW50IHN0dWR5IGFza2VkIFVORyBzdHVkZW50cyB3aGV0aGVyIHRoZXkgZnJlcXVlbnRseSB0ZXh0ZWQgYXQgd29yayBhYm91dCB0aGluZ3MgdW5yZWxhdGVkIHRvIHdvcmsuIEZvciB5b3VuZ2VyIHN0dWRlbnRzLCAyNSBvZiAxMDMgc2FpZCB0aGV5IGZyZXF1ZW50bHkgZGlkIHNvIHdoaWxlIDE1IG9mIDQ2IHN0dWRlbnRzIHdobyAyMSBvciBvbGRlciByZXBvcnRlZCBkb2luZyBzby4gVGVzdCBmb3IgYW4gYWdlLWRpZmZlcmVuY2UgZm9yIFRleHRpbmcgRnJlcXVlbnRseSBhdCBXb3JrIGF0IHRoZSAuMDUgbGV2ZWwuDQoNCklmIHdlIHVzZSB0aGUgc3Vic2NyaXB0cyBZIGFuZCBEIGZvciAieW91bmdlciIgYW5kICJvbGRlciIgc3R1ZGVudHMgcmVzcGVjdGl2ZWx5LCB3ZSBhcmUgdGVzdGluZyB0aGUgaHlwb3RoZXNpcw0KJCRIXzAgOiBwX1kgPSBwX0QgXFwgSF9hIDogcF9ZID4gcF9EJCQgdXNpbmcgYSAyLXByb3BvcnRpb24gJHokLXRlc3QgKGNhbGN1bGF0b3IpIHdoaWNoIFJTdHVkaW8gd2lsbCBldmFsdWF0ZSB1c2luZyAkXGNoaV4yJC4gVGhlIGRhdGEgcGFzcyB2ZXJpZmljYXRpb24gZm9yICR6JC1wcm9jZWR1cmVzIGFzIHRoZXJlIG1vcmUgdGhhbiAxMCBzdWNjZXNzZXMgYW5kIDEwIGZhaWx1cmVzIGluIGJvdGggc2FtcGxlcy4gVGhlIGRhdGEgcGFzcyB2ZXJpZmljYXRpb24gZm9yICRcY2hpXjIkIHByb2NlZHVyZXMgYmVjYXVzZSB0aGV5IGFyZSBsZXNzIHN0cmljdCB0aGFuIGZvciAkeiQuDQoNCkFzIGEgZnVuIG9wdGlvbiwgd2UgY2FuIGNyZWF0ZSBhIG1vc2FpYyBwbG90IGZvciB0aGUgcHJvYmxlbSBzaW5jZSBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSB0d28td2F5IHRhYmxlLiBZb3Ugd2lsbCBub3QgbmVlZCB0byBkbyB0aGlzIGluIGhvbWV3b3JrLCB0ZXN0cyBvciBwcm9qZWN0cywgYnV0IGl0IGlzIG5vdCBkaWZmaWN1bHQuIEkganVzdCBsaWtlIG1vc2FpYyBwbG90cywgc28gSSB3YW50ZWQgdG8gbGVhcm4gaG93IHRvIGNyZWF0ZSBvbmUgZnJvbSBzdW1tYXJ5IGRhdGEgYWxvbmUuIFdlIGZpcnN0IGNyZWF0ZSBhIHRhYmxlIGNhbGxlZCAqKnRhYioqLCB0aGVuIGFzayBmb3IgbW9zYWljIHBsb3QuDQoNCmBgYHtyfQ0KdGFiID0gbWF0cml4KGMoMjUsMTUsNzgsMzEpLG5jb2w9MixieXJvdz1UUlVFKQ0KY29sbmFtZXModGFiKSA9IGMoIllvdW5nZXIiLCAiT2xkZXIiKQ0Kcm93bmFtZXModGFiKSA9IGMoIlllcyIsIk5vIikNCnRhYg0KYGBgDQpUaGUgbW9zYWljIHBsb3Qgd2lsbCBkaXNwbGF5IHRoZSByZWxhdGl2ZSBwcm9wb3J0aW9ucyBhcyBhcmVhcy4NCg0KYGBge3J9DQptb3NhaWNwbG90KHRhYikNCmBgYA0KDQpXZSBuZWVkIHRvIHNwZWNpZnkgYSBvbmUtdGFpbGVkIHRlc3QgYW5kIHByb3ZpZGUgdGhlIHN1bW1hcnkgc3RhdGlzdGljcy4NCg0KYGBge3J9DQpwcm9wLnRlc3QoIHggPSBjKDI1LCAxNSksIG4gPSBjKDEwMyw0NiksIA0KICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiAsDQogICAgICAgICAgIGNvcnJlY3QgPSBGQUxTRSAgKQ0KYGBgDQpXaXRoICRwID0gLjg2ID4gMC4wNSA9IFxhbHBoYSQsIGluIGZhY3QsIG11Y2ggZ3JlYXRlciwgd2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwuIFRoZXJlIGlzIG5vIGV2aWRlbmNlIHlvdW5nZXIgc3R1ZGVudHMgdGV4dCBtb3JlIGZyZXF1ZW50bHkgYXQgd29yayBhYm91dCB0aGluZ3Mgbm90IHJlbGF0ZWQgdG8gd29yay4NCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA1LjI8L3NwYW4+IA0KVXNlIHRoZSB0b3hpYyByZWxhdGlvbnNoaXAgYmVsaWVmcyB2YXJpYWJsZSAqKlR4UmVsKiogZnJvbSB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZSB0byB0ZXN0IGZvciBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBmZW1hbGVzIGFuZCBtYWxlcyAoKlNleCogdmFyaWFibGUpLiBVc2UgdGhlIDAuMDUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KDQpUaGlzIGNhbGxzIGZvciBhbiBpbmRlcGVuZGVudCBzYW1wbGVzIHQtdGVzdC4NCiQkSF8wIDogXG11X0YgPSBcbXVfTVxcSF9hIDogXG11X0YgXG5lcSBcbXVfTSQkDQpGb3Igc29tZSByZWFzb24sIHRoZSB2YXJpYWJsZSAqKlR4UmVsKiogaXMgbm90IGJlaW5nIHJlY29nbml6ZWQgYnkgdGhlIE1vc2FpYyBmdW5jdGlvbiAqKmhpc3RvZ3JhbSoqLiBJIHVzZSB0aGUgUiBzdGFuZGFyZCAqKmhpc3QqKiwgaW5zdGVhZCwgd2l0aCB0aGUgdHJhZGl0aW9uYWwgUiBzdHJ1Y3R1cmUgb2YgKipEYXRhRnJhbWUkdmFyaWFibGUqKi4gTm90aWNlIHRoYXQgb3RoZXIgZnVuY3Rpb25zIGFyZSB3b3JraW5nIGZpbmUuDQoNCmBgYHtyfQ0KZmF2c3RhdHMoVHhSZWwgfiBTZXgsIGRhdGEgPSBEYXRhMzM1MCkNCmJveHBsb3QoRGF0YTMzNTAkVHhSZWwsIGhvcml6b250YWwgPSBUUlVFKQ0KaGlzdChEYXRhMzM1MCRUeFJlbCkNCmBgYA0KDQpgYGB7cn0NCmhpc3RvZ3JhbShUeFJlbCB+IFNleCwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQpBZ2FpbiwgSSBjYW4ndCBnZXQgdGhpcyB3b3JrLiBJIGRvbid0IGtub3cgd2h5LiBNb3NhaWMncyAqKmRlbnNpdHlwbG90KiogYW5kICoqZmF2c3RhdHMqKiBmdW5jdGlvbnMgd2lsbCBub3Qgd29yayBlaXRoZXIgZm9yIHRoZSB2YXJpYWJsZSBieSBpdHNlbGYuIFN0aWxsLCB3ZSBoYXZlIGV2aWRlbmNlIG9mIGEgYmVsbC1zaGFwZWQgZGlzdHJpYnV0aW9uIHdpdGggbm8gb3V0bGllcnMgYW5kIGEgaHVnZSBvdmVyYWxsIHNhbXBsZSBzaXplLCBhbGwgb2Ygd2hpY2ggbWVhbnMgdGhhdCB0aGUgZGF0YSBhcmUgcXVpdGUgc3VpdGFibGUgZm9yICR0JC1wcm9jZWR1cmVzLiBTaW5jZSB0aGUgc2FtcGxlIHNpemVzIGFyZSBub3Qgc2hhcnBseSB1bmVxdWFsIChyYXRpbyBvZiA5Njo2OCBpcyBsZXNzIHRoYW4gMjoxKSwgdGhlc2UgZGF0YSBlYXNpbHkgcGFzcyB2ZXJpZmljYXRpb24uDQoNCmBgYHtyfQ0KdC50ZXN0KFR4UmVsIH4gU2V4ICwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQpCZWNhdXNlICQkcCA9IDAuMDE2MTYgPCAwLjA1ID0gXGFscGhhJCQgd2UgcmVqZWN0IHRoZSBudWxsLiBFdmlkZW5jZSBzdWdnZXN0cyB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gbmFpdmUgcmVsYXRpb25zaGlwIGJlbGllZnMgYmFzZWQgb24gYmlvbG9naWNhbCBzZXguIEEgcXVpY2sgZ2xhbmNlIGF0IHRoZSBib3hwbG90IHVzaW5nIHRoZSBncm91cGluZyB2YXJpYWJsZSBTZXggY2xhcmlmaWVzIHRoZSBzaXR1YXRpb24sIGFzIHdpbGwgYSBxdWljayBnbGFuY2UgYXQgdGhlIG1lYW5zIHN1bW1hcnkgaW4gdGhlIGxhc3QgdHdvIGxpbmVzIG9mIHRoZSBvdXRwdXQuDQoNCmBgYHtyfQ0KYm94cGxvdChUeFJlbCB+IFNleCAsIGRhdGEgPSBEYXRhMzM1MCkNCmBgYA0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDUuMzwvc3Bhbj4gDQpVc2UgdGhlIEFueGlldHkgdmFyaWFibGUgKipBbngqKiBmcm9tIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lIHRvIHRlc3QgZm9yIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGZlbWFsZXMgYW5kIG1hbGVzICgqU2V4KiB2YXJpYWJsZSkuIFVzZSB0aGUgMC4wNSBsZXZlbCBvZiBzaWduaWZpY2FuY2UuDQoNCkFub3RoZXIgaW5kZXBlbmRlbnQgc2FtcGxlcyB0LXRlc3QuICQkSF8wIDogXG11X0YgPSBcbXVfTVxcSF9hIDogXG11X0YgXG5lcSBcbXVfTSQkIEV2ZW4gdGhvdWdoIHRoZSBzYW1wbGUgc2l6ZSBpcyBtdWNoIGdyZWF0ZXIgdGhhbiA0MCBhbmQgZWFzaWx5IHBhc3NlcyB2ZXJpZmljYXRpb24sIHRoZXJlJ3Mgbm8gcmVhc29uIG5vdCB0byBjaGVjayB0aGUgZGlzdHJpYnV0aW9uIGFuZCBkZXNjcmlwdGl2ZXMuDQoNCmBgYHtyfQ0KZmF2c3RhdHMofkFueCwgZGF0YSA9IERhdGEzMzUwKQ0KZmF2c3RhdHMoQW54IH4gU2V4LCBkYXRhID0gRGF0YTMzNTApDQpoaXN0b2dyYW0ofkFueCwgZGF0YSA9IERhdGEzMzUwKQ0KYm94cGxvdChEYXRhMzM1MCRBbnggLCBob3Jpem9udGFsID0gVFJVRSkNCmBgYA0KV2UgaGF2ZSBldmlkZW5jZSBvZiBhbiBhcHByb3hpbWF0ZWx5IGJlbGwtc2hhcGVkIGRpc3RyaWJ1dGlvbiB0aGF0IGlzIHNrZXdlZCByaWdodCB3aXRoIGFuIG91dGxpZXIgdG8gdGhlIHJpZ2h0LiBIb3dldmVyLCBvdXRsaWVycyBvbmx5IGNhdXNlIGluYWNjdXJhdGUgJHAkLXZhbHVlcyBmb3IgJHQkLXRlc3RzIHdoZW4gdGhlIHNhbXBsZSBzaXplIGlzIGxlc3MgdGhhbiA0MC4gSGVyZSwgd2UgaGF2ZSAkbj0xNDQkLiBUaGVyZSBpcyBhbHNvIG5vIGlzc3VlIHdpdGggdGhlIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlcyBhc3N1bXB0aW9uIGFzIG91ciBzYW1wbGUgc2l6ZXMgYXJlIG5vdCBzaGFycGx5IHVuZXF1YWwuIFdlIGhhdmUgODQgZmVtYWxlcyBhbmQgNjAgbWFsZXMgd2hpY2ggaXMgbm90IGdyZWF0ZXIgdGhhbiBhIHJhdGlvIG9mIDI6MS4NCg0KYGBge3J9DQp0LnRlc3QoQW54IH4gU2V4LCBkYXRhID0gRGF0YTMzNTApDQpgYGANCg0KV2UgcmVqZWN0IHRoZSBudWxsIGF0IHRoZSAwLjA1IGxldmVsIGFuZCBub3RlIHRoYXQgd291bGQgYWxzbyBoYXZlIHJlamVjdGVkIHRoZSBudWxsIGF0IHRoZSAwLjAxIGxldmVsLiBXZSBoYXZlIHN0cm9uZyBldmlkZW5jZSB0aGF0IGFueGlldHkgbGV2ZWxzIGRpZmZlciBiYXNlZCB1cG9uIGJpb2xvZ2ljYWwgc2V4Lg0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDUuNTwvc3Bhbj4gDQpVc2UgdGhlIE5ldXJvdGljaXNtIHZhcmlhYmxlICoqTmV1cm8qKiBmcm9tIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lIHRvIHRlc3QgZm9yIGEgc2lnbmlmaWNhbmNlIGRpZmZlcmVuY2UgaW4gbGV2ZWxzIG9mIE5ldXJvdGljaXNtICBiYXNlZCB1cG9uIFByaW1hcnkgSHVtb3IgU3R5bGUgKCoqUEhTKiogdmFyaWFibGUpLiBDb25kdWN0IGEgKnBvc3QgaG9jKiBUdWtleSBIU0QgdGVzdCBpZiBuZWVkZWQuDQoNCkJlY2F1c2UgdGhlIGdyb3VwaW5nIHZhcmlhYmxlIGhhcyBmb3VyIGxldmVscywgd2Ugd2lsbCB1c2UgQU5PVkEuIA0KDQokJEhfMCA6IFxtdV97QUZ9ID0gXG11X3tTRX0gPSBcbXVfe0FHfSA9IFxtdV97U0V9IFxcSF9hIDogXHRleHR7QXQgbGVhc3Qgb25lIHNpZ25pZmljYW50bHkgZGlmZmVyZW50fSQkDQoNCkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBib3hwbG90cyBhbmQgZGVzY3JpcHRpdmUgdXNpbmcgdGhlIGdyb3VwaW5nIHZhcmlhYmxlIHRvIGdldCBicmVha2Rvd25zIGZvciB0aGUgaW5kaXZpZHVhbCBzYW1wbGVzLiBBZ2FpbiwgdGhpcyBpcyBub3QgcmVhbGx5IG5lY2Vzc2FyeSBkdWUgdG8gc2FtcGxlIHNpemUgYW5kIHRoZSByb2J1c3RuZXNzIG9mIHRoZSAkRiQgc3RhdGlzdGljLg0KDQpgYGB7cn0NCmZhdnN0YXRzKE5ldXJvIH4gUEhTLCBkYXRhID0gRGF0YTMzNTApDQpib3hwbG90KE5ldXJvIH4gUEhTLCBkYXRhID0gRGF0YTMzNTApDQpgYGANClRoZSBtYWluIHJlYXNvbiBmb3IgcnVubmluZyB0aGUgKipmYXZzdGF0cyoqIGZ1bmN0aW9uIGlzIHRvIGNoZWNrIHRoZSByZWxhdGl2ZSBzYW1wbGUgc2l6ZXMgdG8gYXNzZXNzIHRoZSBob21lZ2VuZWl0eSBhc3N1bXB0aW9uLiBOb3RpY2UgdGhlIGxhcmdlc3QgdG8gc21hbGxlc3QgZ3JvdXAgc2l6ZSByYXRpbyBpcyA0MyB0byAzMSB3aGljaCBpcyBmYXIgbGVzcyB0aGFuIDI6MS4gVGhlIHNhbXBsZSBzaXplIGlzIG1vcmUgdGhhbiBhZGVxdWF0ZSwgYW5kIHRoZSBncm91cCBzaXplcyBhcmUgbm90IHNoYXJwbHkgdW5lcXVhbC4gT0sgdG8gcHJvY2VlZCB3aXRoIEFOT1ZBIHByb2NlZHVyZS4NCg0KYGBge3J9DQptb2RBID0gbG0oTmV1cm8gfiBQSFMsIGRhdGEgPSBEYXRhMzM1MCkNCmFub3ZhKG1vZEEpDQpgYGANCldpdGggJCRwID0gMC4wMDAwMDIxNiA8IDAuMDUgPSBcYWxwaGEkJA0Kd2UgcmVqZWN0IHRoZSBudWxsIGFuZCBoYXZlIGV2aWRlbmNlIGZvciBhIGRpZmZlcmVuY2UgaW4gTmV1cm90aWNpc20gYmFzZWQgb24gcHJpbWFyeSBodW1vciBzdHlsZS4gV2hlbiB3ZSByZWplY3QgdGhlIG51bGwgd2l0aCBhbiBBTk9WQSBwcm9jZWR1cmUsIHdlIG11c3QgZm9sbG93IHVwIHdpdGggYSAqcG9zdCBob2MqIHRlc3QuIEluIHRoaXMgY291cnNlLCB3ZSB3aWxsIGFsd2F5cyB1c2UgVHVrZXkncyBIb25lc3RseSBTaWduaWZpY2FudCBEaWZmZXJlbmNlIChIU0QpLg0KDQpgYGB7cn0NClR1a2V5SFNEKG1vZEEpDQptcGxvdChUdWtleUhTRChtb2RBKSkNCmBgYA0KDQpXaGlsZSB3ZSBjYW4gdXNlIHRoZSBIU0QgY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIGNvcnJlc3BvbmRpbmcgJHAkLXZhbHVlcyB0byBmaW5kIHRoZSBzaWduaWZpY2FudCBwYWlyd2lzZSBkaWZmZXJlbmNlcywgdGhlICoqbXBsb3QqKiB2aXN1YWwgb3V0cHV0IG1ha2VzIGxpZmUgbXVjaCBlYXNpZXIuIE9ubHkgaW50ZXJ2YWxzIHRoYXQgZG8gKm5vdCogaW5jbHVkZSB6ZXJvIGFyZSBzaWduaWZpY2FudGx5IGRpZmZlcmVudCwgc28gd2Ugc2VlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluDQoNCiogU2VsZi1EZWZlYXRpbmcgdnMuIEFmZmlsaWF0aXZlDQoqIFNlbGYtRW5oYW5jaW5nIHZzLiBBZ2dyZXNzaXZlDQoqIFNlbGYtRW5oYW5jaW5nIHZzLiBTZWxmLURlZmVhdGluZw0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA1LjY8L3NwYW4+IA0KVXNlIHRoZSBTZWxmLUVzdGVlbSB2YXJpYWJsZSAqKlNFKiogZnJvbSB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZSB0byB0ZXN0IGZvciBhIHNpZ25pZmljYW5jZSBkaWZmZXJlbmNlIGluIGxldmVscyBvZiBTZWxmLUVzdGVlbSAgYmFzZWQgdXBvbiBQcmltYXJ5IEh1bW9yIFN0eWxlICgqKlBIUyoqIHZhcmlhYmxlKS4gQ29uZHVjdCBhICpwb3N0IGhvYyogVHVrZXkgSFNEIHRlc3QgaWYgbmVlZGVkLg0KDQpXZSB3aWxsIHRlc3QgdGhlIGh5cG90aGVzaXMgDQoNCiQkSF8wIDogXG11X3tBRn0gPSBcbXVfe1NFfSA9IFxtdV97QUd9ID0gXG11X3tTRX0gXFxIX2EgOiBcdGV4dHtBdCBsZWFzdCBvbmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnR9JCQNCg0KdXNpbmcgQU5PVkEuDQoNClRvIGNoZWNrIHRoZSBhc3N1bXB0aW9ucywgY29uc2lkZXI6DQoNCmBgYHtyfQ0KZmF2c3RhdHMoU0UgfiBQSFMgLCBkYXRhID0gRGF0YTMzNTApDQpgYGANClRoZSBvdmVyYWxsIHNhbXBsZSBzaXplIGlzIGZhciBncmVhdGVyIHRoYW4gMjAsIGFuZCB0aGUgbGFyZ2VzdCB0byBzbWFsbGVzdCBncm91cCBzaXplIHJhdGlvIGlzIGxlc3MgdGhhbiAyOjEsIHNvIHRoZXNlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciBBTk9WQSBwcm9jZWR1cmVzLiBGb3IgZnVuLCBsZXQncyBsb29rIGF0IHRoZSBib3hwbG90cyBieSBncm91cC4NCg0KYGBge3J9DQpib3hwbG90KFNFIH4gUEhTICwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQoNCk5vdyB3ZSBjb25kdWN0IHRoZSB0ZXN0IGJ5IGZpcnN0IHJ1bm5pbmcgdGhlICoqbG0qKiAobGluZWFyIG1vZGVscykgcHJvY2VkdXJlIGFuZCBuZXh0IGJ5IGNhbGxpbmcgKiphbm92YSoqLiBJIGFtIGNyZWF0aW5nIHRoZSB2YXJpYWJsZSAqKm1vZFMqKiAoZm9yIHNlbGYtZXN0ZWVtIG1vZGVsKSB0byBzdG9yZSB0aGUgbW9kZWwgdG8gdXNlZCBsYXRlci4NCg0KYGBge3J9DQptb2RTID0gbG0oU0UgfiBQSFMgLCBkYXRhID0gRGF0YTMzNTApDQphbm92YShtb2RTKQ0KYGBgDQoNClNpbmNlIHdlIHJlamVjdCB0aGUgbnVsbCBhbmQgZmluZCBzaWduaWZpY2FudCBldmlkZW5jZSBvZiBkaWZmZXJlbmNlcywgd2UgbXVzdCBjb25kdWN0IHRoZSAqcG9zdCBob2MqIFR1a2V5J3MgSFNEIHByb2NlZHVyZS4NCg0KYGBge3J9DQpUdWtleUhTRChtb2RTKQ0KbXBsb3QoVHVrZXlIU0QobW9kUykpDQpgYGANCg0KVGhlIHR3byBzaWduaWZpY2FudCBwYWlyd2lzZSBkaWZmZXJlbmNlcyBhcmUgYmV0d2VlbiBTZWxmLUVuaGFuY2luZyB2cy4gQWdncmVzc2l2ZSBhbmQgYmV0d2VlbiBTZWxmLUVuaGFuY2luZyB2cy4gU2VsZi1EZWZlYXRpbmcgaHVtb3Igc3R5bGVzLg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA1Ljg8L3NwYW4+ICANClVzZSB0aGUgKipzdWJzZXQqKiBjb21tYW5kIGFzIHNob3duIGFib3ZlIGZvciB0aGUgZm9sbG93aW5nIGh5cG90aGVzaXMgdGVzdC4gTWFsZXMgYXJlIG1vcmUgbGlrZWx5IHRvIHVzZSBBZ2dyZXNzaXZlIEh1bW9yLCBhbmQgeW91bmdlciBmb2xrcyBhcmUgbW9yZSBsaWtlbHkgdG8gdXNlIGFnZ3Jlc3NpdmUgaHVtb3IgdGhhbiBvbGRlciBmb2xrcy4gRmluZCB0aGUgb3ZlcmFsbCBhZ2dyZXNzaXZlIGh1bW9yIGF2ZXJhZ2UgdXNpbmcgdGhlICgqKkhTQUcqKiB2YXJpYWJsZSkgaW4gdGhlIERhdGEzMzUwIGRhdGEgZnJhbWUuIFN1YnNldCBhIGdyb3VwIG9mIHlvdW5nIG1lbiB3aG8gYXJlIGxlc3MgdGhhbiAyMCB5ZWFycyBvbGQsIGFuZCB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhpcyBzdWJwb3B1bGF0aW9uIGhhcyBhIGhpZ2hlciBncm91cCBtZWFuIHRoYW4gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBtZWFuLg0KDQpGaXJzdCwgd2UgbXVzdCBkZXRlcm1pbmUgJFxtdV8wJCwgdGhlIG92ZXJhbGwgbWVhbi4NCg0KYGBge3J9DQpmYXZzdGF0cyh+SFNBRyAsIGRhdGEgPSBEYXRhMzM1MCkNCmBgYA0KDQpOZXh0LCB3ZSBuZWVkIGEgc3Vic2V0IG9mIHlvdW5nIG1hbGVzLg0KDQpgYGB7cn0NCm1hbGUgPSBzdWJzZXQoRGF0YTMzNTAsIFNleCA9PSAiTSIsIGMoQWdlLEhTQUcpKQ0KeU1hbGUgPSBzdWJzZXQobWFsZSwgQWdlIDwgMjAsIEhTQUcpDQp5TWFsZQ0KYGBgDQoNCldlIHdpbGwgdGVzdCB0aGUgaHlwb3RoZXNpcyAkJEhfMCA6IFxtdSA9IDI4Ljg1IFxcIEhfYSA6IFxtdSA+IDI4Ljg1ICQkIHVzaW5nIGEgb25lLXRhaWxlZCAkdCQtdGVzdC4gQ2hlY2tpbmcgdGhlIGFzc3VtcHRpb25zLCB3ZSBuZWVkIHRvIGtub3cgb3VyIHNhbXBsZSBzaXplLg0KDQpgYGB7cn0NCmZhdnN0YXRzKH5IU0FHICwgZGF0YSA9IHlNYWxlKQ0KYGBgDQpXaXRoIGEgc2FtcGxlIHNpemUgb2YgMTIsIHdlIGhhdmUgc29tZSB3b3JrIHRvIGRvIG9uIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbjogYm90aCB2ZXJpZnkgdXNpbmcgYSBib3hwbG90IHRoZXJlIGFyZSBubyBvdXRsaWVycywgYW5kIHVzZSBhIGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90IHRvIHZlcmlmeSB0aGUgc2FtcGxlcyBhcHBlYXJzIGRyYXduIGZyb20gYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQpgYGB7cn0NCmJveHBsb3QoeU1hbGUkSFNBRywgaG9yaXpvbnRhbCA9IFQpDQpgYGANCldlIGZpbmQgbm8gb3V0bGllcnMsIHNvIHdlIGNoZWNrIGEgaGlzdG9ncmFtIGFuZCBkZW5zaXR5IHBsb3QuIERvbid0IHdvcnJ5IGFib3V0IHRoZSBleHRyYSBjb2RlIC0ganVzdCBhIGRlbW8gb24gaG93IHRvIHBsb3QgbXVsdGlwbGUgZ3JhcGhpY3MgaW4gb25lIG91dHB1dCB3aW5kb3cuIEl0J3MgdG90YWxseSBvcHRpb25hbC4gSWYgeW91J3JlIGludGVyZXN0ZWQsIHRob3VnaCwgdGhlIG91dHB1dCB3aW5kb3cgaGFzIGNvb3JkaW5hdGVzIGxpa2UgdGhlIHVuaXQgc3F1YXJlLCBhbmQgd2UgZGVmaW5lIHRoZSBib3R0b20tbGVmdCBwb2ludCBhbmQgdG9wLXJpZ2h0IHBvaW50IGZvciBlYWNoIGdyYXBoaWMgaW5zaWRlIHRoZSAqKnByaW50KiogY29tbWFuZC4NCg0KYGBge3J9DQpwMSA9IGhpc3RvZ3JhbSh+SFNBRyAsIGRhdGEgPSB5TWFsZSwgd2lkdGggPSAzKQ0KcDIgPSBkZW5zaXR5cGxvdCh+SFNBRyAsIGRhdGEgPSB5TWFsZSkNCnByaW50KHAxLCBjKDAsMC41LDEsMSksIG1vcmUgPSBUUlVFKQ0KcHJpbnQocDIsIGMoMCwwLDEsMC41KSkNCg0KYGBgDQpJIGhhZCB0byBmaWRkbGUgYSBiaXQgd2l0aCB0aGUgKip3aWR0aCoqIHBhcmFtZXRlciBvbiB0aGUgaGlzdG9ncmFtLCBidXQgdGhlIG92ZXJhbGwgc2hhcGUgY29uZmlybXMgdGhlIHNhbXBsZSBhcHBlYXIgdG8gaGF2ZSBiZWVuIGRyYXduIGZyb20gYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uLiBUaGUgZGVuc2l0eSBwbG90IGFsc28gc2hvd3MgYW4gYXBwcm94aW1hdGUgYmVsbCBzaGFwZS4NCg0KYGBge3J9DQp0LnRlc3QofkhTQUcgLCBkYXRhID0geU1hbGUgLCBtdSA9IDI4Ljg1ICwgYWx0ZXJuYXRpdmUgPSAiZyIpDQpgYGANCldlIHJlamVjdCB0aGUgbnVsbCBiZWNhdXNlICRwPTAuMDM5IDwgMC4wNSA9IFxhbHBoYSQsIGFuZCB3ZSB0aHVzIGhhdmUgZXZpZGVuY2UgdGhhdCB5b3VuZ2VyIG1hbGVzIHVzZSBtb3JlIGFnZ3Jlc3NpdmUgaHVtb3IgdGhhbiB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGF0IFVORy4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5Ib21ld29yayBTZXQgMzogTW9kdWxlcyA2IGFuZCA3PC9zcGFuPg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA2LjE8L3NwYW4+ICANCkhvdyBtYW55IHJlc2FtcGxpbmdzIHNob3VsZCB3ZSB1c2Ugd2hlbiBib290c3RyYXBwaW5nPyBUcnkgcmUtcnVubmluZyB0aGUgY29kZSBibG9ja3MgZnJvbSB0aGUgU2xlZXAgZXhhbXBsZSB3aXRoIDUwLCAxMDAsIDUwMCwgYW5kIDEwMDAgcmVzYW1wbGluZ3MuIEhvdyBkb2VzIHRoZSBhY2N1cmFjeSBjb21wYXJlIHRvIHRoZSB0aGVvcmV0aWNhbCBjb25maWRlbmNlIGludGVydmFsIGFzIG51bWJlciBvZiByZXNhbXBsaW5ncyBpbmNyZWFzZXM/IEV4cGxhaW4gd2h5IGFib3V0IDUwMCByZXNhbXBsaW5ncyBpcyB1c3VhbGx5IGdvb2QgZW5vdWdoLg0KDQpOb3RpY2UgaG93IHRoZSBlbmRwb2ludHMgZmx1Y3R1YXRlIGRyYW1hdGljYWxseSBhcyB5b3VyIHJldHJ5IHRoaXMgY29kZSBibG9jay4gSW4gZml2ZSBpdGVyYXRpb25zLCBJIHNhdyBsZWZ0IGVuZHBvaW50cyBvZiA2LjA2LCA2LjA3LCA2LjA5ICwgNi4wOCBhbmQgNi4wMi4NCg0KYGBge3J9DQpib290c3RyYXAgPSBkbyg1MCkgKiBtZWFuKHJlc2FtcGxlKERhdGEzMzUwJFNsZWVwKSkNCnFkYXRhKH5tZWFuLCBwPWMoMC4wMjUsIDAuOTc1KSwgZGF0YT1ib290c3RyYXApDQpgYGANCg0KU3RpbGwgd29iYmx5OiBsZWZ0IGVuZHBvaW50cyBvZiA2LjA3LCA2LjAzLCA2LjAzLCA1LjkyLCA2LjAzLiBOb3RpY2UgdGhhdCBub3Qgb25seSBkbyBoYXZlIHRoZXNlIGVuZHBvaW50cyBqdW1waW5nIGFyb3VuZCwgdGhlcmUncyBhIG1pc21hdGNoIGJldHdlZW4gdGhlIG9uZSdzIGFib3ZlIGFuZCB0aGVzZS4NCg0KYGBge3J9DQpib290c3RyYXAgPSBkbygxMDApICogbWVhbihyZXNhbXBsZShEYXRhMzM1MCRTbGVlcCkpDQpxZGF0YSh+bWVhbiwgcD1jKDAuMDI1LCAwLjk3NSksIGRhdGE9Ym9vdHN0cmFwKQ0KYGBgDQoNClN0YXJ0aW5nIHRvIHN0YWJpbGl6ZTogNi4wNSwgNi4wNiwgNi4wMywgNi4wNCwgNS45OS4gRXhjZXB0IGZvciB0aGUgbGFzdCBvbmUsIHdlIGhhZCBhIHRpZ2h0IGdyb3VwaW5nLg0KDQpgYGB7cn0NCmJvb3RzdHJhcCA9IGRvKDUwMCkgKiBtZWFuKHJlc2FtcGxlKERhdGEzMzUwJFNsZWVwKSkNCnFkYXRhKH5tZWFuLCBwPWMoMC4wMjUsIDAuOTc1KSwgZGF0YT1ib290c3RyYXApDQpgYGANCg0KRm9yIHRoZSBsYXN0IG9uZSwgb3VyIGxlZnQgZW5kcG9pbnRzIHdlcmUgNi4wNCwgNi4wNCwgNi4wMywgNi4wNCwgNi4wNS4gDQoNCmBgYHtyfQ0KYm9vdHN0cmFwID0gZG8oMTAwMCkgKiBtZWFuKHJlc2FtcGxlKERhdGEzMzUwJFNsZWVwKSkNCnFkYXRhKH5tZWFuLCBwPWMoMC4wMjUsIDAuOTc1KSwgZGF0YT1ib290c3RyYXApDQpgYGANCkFzIHdlIGNhbiBzZWUsIGEgdGhvdXNhbmQgdHJpYWxzIGlzIGNlcnRhaW5seSBlbm91Z2gsIGFuZCB0aGUgNTAgYW5kIDEwMCB3ZXJlIHdheSB0b28gZmV3LiBXZSBkaWQgaGl0IGFuIG91dGxpZXIgdmFsdWUgd2l0aCA1MDAuIFN0YXRzIHRoZW9yeSBzdWdnZXN0cyBhYm91dCA1MDAgaXMgZW5vdWdoLiBIb3dldmVyLCB0aGVyZSBpcyBubyBkb3duc2lkZSAtIGFzIGxvbmcgYXMgd2UgaGF2ZSB0aGUgY29tcHV0aW5nIHBvd2VyIC0gdG8gdXNlIGEgdGhvdXNhbmQgb3IgbW9yZSB0cmlhbHMuIEF0IGEgdGhvdXNhbmQgcGx1cywgaXQgYXBwZWFycyB3ZSBoYXZlIHN0YWJsZSBlbmRwb2ludHMgZm9yIG91ciBjb25maWRlbmNlIGludGVydmFscy4NCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkl0ZW0gNi4zPC9zcGFuPiAgDQpVc2UgdGhlIFZhcnNBdGggdmFyaWFibGUgaW4gRGF0YTMzNTAgd2hlcmUgWSAvIE4gcmVzcG9uc2VzIGluZGljYXRlIHdoZXRoZXIgdGhlIHBhcnRpY2lwYW50J3MgaXMgYSB2YXJzaXR5IFVORyBhdGhsZXRlLiBBc3N1bWluZyB0aGUgZGF0YSBmcmFtZSBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgVU5HIERhaGxvbmVnYSBjYW1wdXMsIGNyZWF0ZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGVzdGltYXRlIGZvciB0aGUgcGVyY2VudGFnZSBvZiBzdHVkZW50cyB3aG8gYXJlIHZhcnNpdHkgYXRobGV0ZXMgYW5kIGludGVycHJldCB5b3VyIGZpbmRpbmdzLiBIaW50OiBzZXQgc3VjY2VzcyA9ICJZIi4NCg0KV2UgbmVlZCB0byBlbnN1cmUgdGhlIGRhdGEgcGFzcyB2ZXJpZmljYXRpb246IDEwIG9yIG1vcmUgc3VjY2Vzc2VzIGFuZCAxMCBvciBtb3JlIGZhaWx1cmVzIGluIHRoZSBzYW1wbGUuDQoNCmBgYHtyfQ0KdGFsbHkoflZhcnNBdGggLCBkYXRhID0gRGF0YTMzNTApDQpgYGANClNpbmNlIHdlIDE3IHN1Y2Nlc3NlcyBhbmQgMTQ4IGZhaWx1cmVzLCB0aGUgZGF0YSBhcmUgYXBwcm9wcmlhdGUgZm9yICR6JC1wcm9jZWR1cmVzLiBFdmVuIHRob3VnaCBSU3R1ZGlvIGlzIHVzaW5nIHRoZSAkXGNoaV4yJCBzdGF0aXN0aWMgdG8gZXZhbHVhdGUgaXQsIHdlJ3JlIGVtdWxhdGluZyBhICR6JC1wcm9jZWR1cmUsIHNvIEkgdXNlZCB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgZm9yICR6JC1wcm9wb3J0aW9uIHByb2NlZHVyZXMgZm9yIG15IGRhdGEgY2hlY2tzLg0KDQoNCmBgYHtyfQ0KY29uZmludChwcm9wLnRlc3QoflZhcnNBdGgsIHN1Y2Nlc3MgPSAiWSIsIGRhdGEgPSBEYXRhMzM1MCAsDQogICAgICAgICAgICAgICAgICBjb25mLmxldmVsID0gLjk1KSkNCmBgYA0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA2LjU8L3NwYW4+ICANClVzZSB0aGUgQ0hTIHZhcmlhYmxlIGluIERhdGEzMzUwIHdoZXJlIG51bWVyaWMgc2NvcmVzIHJlcHJlc2VudCBzY29yZXMgb24gdGhlIDxhIGhyZWYgPSBodHRwczovL3d3dy5yZXNlYXJjaGdhdGUubmV0L3Byb2ZpbGUvUm9kX01hcnRpbi9wdWJsaWNhdGlvbi8yNDk5MjkxMDlfVGhlX1NpdHVhdGlvbmFsX0h1bW9yX1Jlc3BvbnNlX1F1ZXN0aW9ubmFpcmVfU0hSUV9hbmRfQ29waW5nX0h1bW9yX1NjYWxlX0NIU19BX2RlY2FkZV9vZl9yZXNlYXJjaF9maW5kaW5ncy9saW5rcy8wMGI0OTUyZGQ4MWJkMjY3ODUwMDAwMDAvVGhlLVNpdHVhdGlvbmFsLUh1bW9yLVJlc3BvbnNlLVF1ZXN0aW9ubmFpcmUtU0hSUS1hbmQtQ29waW5nLUh1bW9yLVNjYWxlLUNIUy1BLWRlY2FkZS1vZi1yZXNlYXJjaC1maW5kaW5ncy5wZGY+Q29waW5nIEh1bW9yIFNjYWxlPC9hPi4gQXNzdW1pbmcgdGhlIGRhdGEgZnJhbWUgaXMgcmVwcmVzZW50YXRpdmUgb2YgdGhlIFVORyBEYWhsb25lZ2EgY2FtcHVzLCBjcmVhdGUgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBlc3RpbWF0ZSBmb3IgdGhlIG1lYW4gQ0hTIHNjb3JlIGFuZCBpbnRlcnByZXQgeW91ciBmaW5kaW5ncy4NCg0KV2UgbmVlZCB0byBjaGVjayB0aGUgbm9ybWFsaXR5IGFzc3VtcHRpb24uDQoNCmBgYHtyfQ0KZmF2c3RhdHMoIH5DSFMgLCBkYXRhID0gRGF0YTMzNTApDQpgYGANCldpdGggJG4gPSAxNjMkIHdoaWNoIGlzIG11Y2ggZ3JlYXRlciB0aGFuIDQwLCB0aGUgcm9idXN0bmVzcyBvZiB0aGUgJHQkLXN0YXRpc3RpYyBzdWdnZXN0cyBnb29kIGFjY3VyYWN5IGZvciB0aGUgaW50ZXJ2YWwuDQoNCmBgYHtyfQ0KY29uZmludCh0LnRlc3QofkNIUywgZGF0YSA9IERhdGEzMzUwKSkNCmBgYA0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA2LjY8L3NwYW4+ICANClVzZSB0aGUgQ0hTIHZhcmlhYmxlIGluIERhdGEzMzUwIHRvIGNyZWF0ZSBhIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIGF0IHRoZSA5NSUgbGV2ZWwuIENvbXBhcmUgYW5kIGNvbnRyYXN0IGl0IHdpdGggdGhlIHJlc3VsdHMgZnJvbSB0aGUgdGhlb3JldGljYWwgY29uZmlkZW5jZSBpbnRlcnZhbC4gVXNlIDUwMCByZXNhbXBsaW5ncy4NCg0KTGV0J3MgY3JlYXRlIHRoZSBib290c3RyYXBwaW5nIHJlc2FtcGxpbmcgZm9yIHRoZSB2YXJpYWJsZSAqKkNIUyoqIGFuZCBuYW1lIHRoZSBkYXRhIGZyYW1lICoqYm9vdHMqKi4NCg0KYGBge3J9DQpib290cyA9IGRvKDUwMCkgKiBtZWFuKHJlc2FtcGxlKERhdGEzMzUwJENIUykpDQpxZGF0YSh+bWVhbiwgcD1jKDAuMDI1LCAwLjk3NSksIGRhdGE9Ym9vdHMpDQpgYGANCk5vdGljZSB0aGVyZSdzIGEgZ29vZCBkZWFsIG9mIGFncmVlbWVudCBiZXR3ZWVuIHRoZSB0d28gZGlmZmVyZW50IGFwcHJvYWNoZXMgdG8gY29uZmlkZW5jZSBpbnRlcnZhbHMuDQoNCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkl0ZW0gNy4yPC9zcGFuPg0KVXNlIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lIHRvIGJ1aWxkIGFuZCBldmFsdWF0ZSBhIGxpbmVhciBtb2RlbCBmb3IgbmV1cm90aWNpc20gKGRlcGVuZGVudCB2YXJpYWJlbGUpIHZzLiBvcHRpbWlzbSAoaW5kZXBlbmRlbnQgdmFyaWFibGUpIHVzaW5nIHRoZSAqKk5ldXJvKiogYW5kICoqT3B0KiogdmFyaWFibGVzLiBCZSBzdXJlIHRvIGNoZWNrIHRoZSBsaW5lYXJpdHkgYW5kIG5vcm1hbGl0eSBhc3N1bXB0aW9ucyBhbmQgYW5hbHl6ZSBhbGwgcmVncmVzc2lvbiBzdGF0aXN0aWNzLiBDb25zdHJ1Y3QgYSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgc2xvcGUgb2YgdGhlIHJlZ3Jlc3Npb24gbGluZSB1c2luZyBhbiBhcHByb3ByaWF0ZSBtZXRob2QuDQoNCmBgYHtyfQ0KeHlwbG90KE5ldXJvIH4gT3B0LCBkYXRhID0gRGF0YTMzNTApDQpgYGANCldlIHNlZSBhbmQgYXBwcm94aW1hdGVseSBkb3dud2FyZCB0cmVuZCwgYW5kIGNlcnRhaW5seSBubyBub24tbGluZWFyIHBhdHRlcm4uIFRpbWUgdG8gYnVpbGQgdGhlIG1vZGVsIGFuZCBjaGVjayB0aGUgZGlhZ25vc3RpY3MuDQoNCmBgYHtyfQ0KbW9kTiA9IGxtKE5ldXJvIH4gT3B0LCBkYXRhID0gRGF0YTMzNTApDQpzdW1tYXJ5KG1vZE4pDQpgYGANCg0KV2l0aCBhIG11bHRpcGxlIFItc3F1YXJlZCBvZiAwLjM2MTQsIHdlIGZpbmQgdGhhdCAzNiUgb2YgdGhlIHZhcmlhbmNlIGluICoqTmV1cm8qKiBpcyBhY2NvdW50ZWQgZm9yIGJ5ICoqT3B0KiouIFNpbmNlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29ycmVsYXRpb24gaXMgJCRyID0gXHNxcnR7Ul4yfSA9IFxzcXJ0ezAuMzYxNH0gPSBgciBwYXN0ZShzcXJ0KDAuMzYxNCkpYCQkDQp3ZSBzZWUgdGhhdCAkciBcYXBwcm94IC0wLjYwJC4gTm90ZSB0aGF0IHdlIGhhdmUgdG8gbWFudWFsbHkgYWRkIHRoZSBuZWdhdGl2ZSBzaWduIGZvciB0aGUgY29ycmVsYXRpb24gc2luY2UgdGhlIHRyZW5kIHdhcyBkb3dud2FyZCBzbG9waW5nLiBUaHVzLCB3ZSBoYXZlIG1vZGVyYXRlLCBuZWdhdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuICoqTmV1cm8qKiBhbmQgKipPcHQqKi4NCg0KTmV4dCwgbGV0cyBjaGVjayB0aGUgZGlhZ25vc3RpY3MuDQoNCmBgYHtyfQ0KcXFtYXRoKH5yZXNpZChtb2ROKSwgdHlwZSA9IGMoInAiICwgInIiKSkNCmBgYA0KV2hpbGUgYSBmZXcgd2lnZ2xlcyBleGlzdCwgdGhlIG92ZXJhbGwgcGF0dGVybiBsaWVzIHJlYXNvbmFibHkgY2xvc2UgdGhlIDQ1IGRlZ3JlZSBsaW5lIGFuZCBwcm92aWRlcyBldmlkZW5jZSBmb3IgYW4gYXBwcm94aW1hdGVseSBub3JtYWwgKGJlbGwtc2hhcGVkKSBkaXN0cmlidXRpb24gb2YgcmVzaWR1YWxzLiBXZSBjYW4gYWxzbyBjaGVjayBhIGZpdHRlZCB2YWx1ZXMgcGxvdCwgdGhvdWdoIHRoZXkgbWFrZSBtb3JlIHNlbnNlIGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBwcmVkaWN0b3JzLg0KDQpgYGB7cn0NCnBsb3QobW9kTiwgd2hpY2ggPSAxICkNCmBgYA0KVGhlIHJlZCBsaW5lIGlzIHJlYXNvbmFibHkgY2xvc2UgdG8gYSBzdHJhaWdodCBsaW5lLCBhbmQgb3ZlcmFsbCB0aGUgbW9kZWwgc2VlbXMgdG8gd29yayByYXRoZXIgd2VsbCBhbmQgbWVldCB0aGUgYXNzdW1wdGlvbnMgZm9yIGxpbmVhciByZWdyZXNzaW9uLg0KDQpUbyBhbmFseXplIHRoZSBzbG9wZSBjb2VmZmljaWVudCBvZiAkLTEuODkkIGluZGljYXRlcyB0aGF0LCBmb3IgZWFjaCAxIHVuaXQgaW5jcmVhc2UgaW4gKipPcHQqKiwgd2UgZXhwZWN0IGEgJDEuODkkIHVuaXQgZGVjcmVhc2UgaW4gKipOZXVybyoqLg0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDcuNDwvc3Bhbj4NClVzZSB0aGUgKipQZXJjKiogZGF0YSBmcmFtZSB0byBjcmVhdGUgbGluZWFyIG1vZGVscyBmb3IgdGhlIDc1dGggYW5kIDkwdGggcGVyY2VudGlsZSB3YWdlIGVhcm5lcnMgZnJvbSAyMDAwIFExIHRocm91Z2ggIDIwMTkgUTQuIEJlIHN1cmUgdG8gbG9vayBjYXJlZnVsbHkgYXQgYWxsIGRpYWdub3N0aWMgcGxvdHMuIENyZWF0ZSBtb2RlbHMgZm9yIHRoZSBUcnVtcCBlcmEgYW5kIHRoZSBsYXN0IDMgeWVhcnMgb2YgdGhlIE9iYW1hIGVyYSBhbmQgY29uZHVjdCBoeXBvdGhlc2lzIHRlc3RzIHRoYXQgdGhlIFRydW1wIGVyYSBncm93dGggd2FzIHNpZ25pZmljYW50bHkgZ3JlYXRlciB0aGFuIHRoZSBoaXN0b3JpYyB0cmVuZCBhcyB3ZWxsIGFzIGdyZWF0ZXIgdGhhbiB0aGUgT2JhbWEgZXJhLg0KDQpGdWxsIGRldGFpbHMgYXZhaWxhYmxlIGluIG15IDxhIGhyZWYgPSBodHRwczovL3JwdWJzLmNvbS9yb2Jic2lubi93YWdlZ3Jvd3RoPldhZ2UgR3Jvd3RoPC9hPiBhbmFseXNpcy4gVGhlIHN1bW1hcnkgY2hhcnQgYmVsb3cgY292ZXJzIGFsbCAyMCBwb3NzaWJsZSBtb2RlbHMuDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+VVMgV2Vla2x5IFdhZ2UgR3Jvd3RoIFBlciBRdWFydGVyOjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BbGwgV2FnZSBFYXJuZXJzPC9zcGFuPg0KDQokJFxiZWdpbnthcnJheX17bGNjY2NjfQ0KJlx0ZXh0YmZ7MTB0aCBQZXJjZW50aWxlfSZcdGV4dGJmezI1dGggUGVyY2VudGlsZX0mXHRleHRiZntNZWRpYW59Jlx0ZXh0YmZ7NzV0aCBQZXJjZW50aWxlfSZcdGV4dGJmezkwdGggUGVyY2VudGlsZX1cXA0KXHRleHR7SGlzdG9yaWN9ICYgXCQyLjAzJiBcJDIuNzcmIFwkNC4wNSYgXCQ3LjQ5JiBcJDEyLjAyXFwNClx0ZXh0e1RydW1wIEVyYX0gJlwkNC45NSAmIFwkNS4xNCAmIFwkNi45MCAmIFwkMTAuNDUgJiBcJDIwLjcyXFwNClx0ZXh0e09iYW1hIEVyYX0gJiBcJDEuNDkgJiBcJDEuNDggJiBcJDMuMjAgJiBcJDYuMDMgJiBcJDguMzRcXA0KXHRleHR7T2JhbWEgTGFzdCAzIFlyc30gJiBcJDEuNjggJiBcJDIuMDYgJiBcJDUuMDggJiBcJDYuNDAgJiBcJDYuNzANClxlbmR7YXJyYXl9JCQNCg0KIyMjIyA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkl0ZW0gNy41PC9zcGFuPg0KVGhlICoqUGVyY0IqKiBkYXRhIGlzIHNpbWlsYXIgdG8gKipQZXJjKiogaW4gdGhhdCBpdCBpbmNsdWRlcyB0aGUgMTB0aCwgMjV0aCwgNTB0aCwgNzV0aCBhbmQgOTB0aCBwZXJjZW50aWxlIHdhZ2VzLCBidXQgKipQZXJCKiogaW5jbHVkZXMgQmxhY2sgd2FnZSBlYXJuZXJzIG9ubHkuIFVzZSB0aGUgKipQZXJjQioqIGRhdGEgZnJhbWUgdG8gY3JlYXRlIGEgbGluZWFyIG1vZGVsIGZvciB0aGUgbWVkaWFuIHdhZ2UgZ3Jvd3RoICg1MHRoIHBlcmNlbnRpbGUpIGZyb20gMjAwMCBRMSB0aHJvdWdoIDIwMTkgUTQuIEJlIHN1cmUgdG8gbG9vayBjYXJlZnVsbHkgYXQgYWxsIGRpYWdub3N0aWMgcGxvdHMuIENyZWF0ZSBtb2RlbHMgZm9yIHRoZSBUcnVtcCBlcmEgYW5kIHRoZSBsYXN0IDMgeWVhcnMgb2YgdGhlIE9iYW1hIGVyYSBhbmQgY29uZHVjdCBoeXBvdGhlc2lzIHRlc3RzIHRoYXQgdGhlIFRydW1wIGVyYSBncm93dGggd2FzIHNpZ25pZmljYW50bHkgZ3JlYXRlciB0aGFuIHRoZSBoaXN0b3JpYyB0cmVuZCBhcyB3ZWxsIGFzIGdyZWF0ZXIgdGhhbiB0aGUgT2JhbWEgZXJhLg0KDQpGdWxsIGRldGFpbHMgYXZhaWxhYmxlIGluIG15IDxhIGhyZWYgPSBodHRwczovL3JwdWJzLmNvbS9yb2Jic2lubi93YWdlZ3Jvd3RoPldhZ2UgR3Jvd3RoPC9hPiBhbmFseXNpcy4gVGhlIHN1bW1hcnkgY2hhcnQgYmVsb3cgY292ZXJzIGFsbCAyMCBwb3NzaWJsZSBtb2RlbHMuDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+VVMgV2Vla2x5IFdhZ2UgR3Jvd3RoIFBlciBRdWFydGVyOjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5BZnJpY2FuIEFtZXJpY2FuIFdhZ2UgRWFybmVycyBPbmx5PC9zcGFuPg0KDQokJFxiZWdpbnthcnJheX17bGNjY2NjfQ0KJlx0ZXh0YmZ7MTB0aCBQZXJjZW50aWxlfSZcdGV4dGJmezI1dGggUGVyY2VudGlsZX0mXHRleHRiZntNZWRpYW59Jlx0ZXh0YmZ7NzV0aCBQZXJjZW50aWxlfSZcdGV4dGJmezkwdGggUGVyY2VudGlsZX1cXA0KXHRleHR7SGlzdG9yaWN9ICYgXCQxLjY1ICYgXCQyLjI1ICYgXCQzLjExICYgXCQ1LjI2ICYgXCQ5LjIzXFwNClx0ZXh0e1RydW1wIEVyYX0gJiBcJDMuMjQgJiBcJDQuNjYgJiBcJDQuNTQgJiBcJDkuODIgJiBcJDExLjU3XFwNClx0ZXh0e09iYW1hIEVyYX0gJiBcJDAuODggJiBcJDEuMzIgJiBcJDEuNjYgJiBcJDMuNzkgJiBcJDkuODVcXA0KXHRleHR7T2JhbWEgTGFzdCAzIFlyc30gJiBcJDEuNjggJiBcJDEuNjUgJiBcJDAuOTIgJiBcJDIuNDcgJiBcJDQuNjANClxlbmR7YXJyYXl9JCQNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5Ib21ld29yayBTZXQgNDogTW9kdWxlcyA4IGFuZCA5PC9zcGFuPg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA4LjI8L3NwYW4+DQpVc2luZyB0aGUgKipIU0FHKiogdmFyaWFibGUgZnJvbSB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZSwgYnVpbGQgYSBsaW5lYXIgbW9kZWwgZm9yIEFnZ3Jlc3NpdmUgSHVtb3IgdXNpbmcgdGhlIHByZWRpY3RvcnMgTmFyY2lzc2lzbSAgYW5kIFNlbGYtRGVmZWF0aW5nIEh1bW9yIFN0eWxlOiAkJFx0ZXh0e0hTQUd9IFxzaW0gXHRleHR7TmFyY30gKyBcdGV4dHtIU1NEfSQkIEV2YWx1YXRlIGFuZCBhbmFseXplIHlvdXIgbW9kZWwgaW5jbHVkaW5nIGFsbCBkaWFnbm9zdGljIHBsb3RzLg0KDQpUaGUgbGluZWFyIG1vZGVsOg0KDQpgYGB7cn0NCm1vZEcgPSBsbShIU0FHIH4gTmFyYyArIEhTU0QgLCBkYXRhID0gRGF0YTMzNTApDQpzdW1tYXJ5KG1vZEcpDQpgYGANCg0KTm90aWNlIHRoYXQgUi1zcXVhcmVkID0gMC4yOTYsIHNvIHRoZSB0d28gcHJlZGljdG9ycyB0b2dldGhlciBhcmUgYWNjb3VudGluZyBmb3IgMzAlIG9mIHRoZSB2YXJpYW5jZSBpbiBBZ2dyZXNzaXZlIEh1bW9yLg0KDQpgYGB7cn0NCnFxbWF0aCh+cmVzaWQobW9kRyksIHR5cGUgPSBjKCJwIiwiciIpKQ0KYGBgDQpgYGB7cn0NCnBsb3QobW9kRyAsIHdoaWNoID0gMSkNCmBgYA0KVGhlIHFxLXBsb3QgaXMgdmVyeSBtdWNoIGxpbmVhciBhbG9uZyB0aGUgNDUgZGVncmVlIGxpbmUgaW5kaWNhdGluZyB0aGUgcmVzaWR1YWxzIGZvbGxvdyBhbiBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24gKG5vcm1hbGl0eSBhc3N1bXB0aW9uKS4gVGhlIGZpdHRlZCB2YWx1ZXMgcGxvdCBhbHNvIHNob3dzIHRoZSByZWQgZml0LWxpbmUgbGllcyB2ZXJ5IGNsb3NlIHRvIHRoZSBkb3R0ZWQgaG9yaXpvbnRhbCBsaW5lIGluZGljYXRpbmcgcGVyZmVjdCBsaW5lYXJpdHkgKGxpbmVhcml0eSBhc3N1bXB0aW9uKS4gVGh1cywgdGhlc2UgZGF0YSBhcmUgd2VsbC1zdWl0ZWQgZm9yIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsaW5nLg0KDQpDb25zaWRlciB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIG1vZGVsOiBBZ2dyZXNzaXZlIGh1bW9yIGRlcGVuZHMgb24gYW5vdGhlciBodW1vciBzdHlsZSAtLSBub3Qgc3VycHJpc2luZyB0d28gdHlwZXMgb2YgaHVtb3IgYXJlIGNvcnJlbGF0ZWQgLS0gYW5kIGFsc28gb24gTmFyY2lzc2lzbS4gVGhhdCBtYWtlcyBzZW5zZSwgdG9vLiBBZ2dyZXNzaXZlIGh1bW9yIGlzIGNvbXByaXNlZCBvZiBzYXJjYXNtIGFuZCBwdXQtZG93bnMsIGFuZCBuYXJjaXNzaXN0cyB3b3VsZCBmaW5kIGl0IGxlc3MgaXJrc29tZSB0byBiZWxpdHRsZSBvdGhlcnMuDQoNCg0KDQojIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SXRlbSA4LjM8L3NwYW4+DQpBZGQgdGhlIEVhdGluZyBBdHRpdHVkZXMgdmFyaWFibGUgKipFYXQqKiBhcyB0aGUgdGhpcmQgcHJlZGljdG9yIGluIHlvdXIgbW9kZWwgZm9yICoqSFNBRyoqOiQkXHRleHR7SFNBR30gXHNpbSBcdGV4dHtOYXJjfSArIFx0ZXh0e0hTU0R9ICsgXHRleHR7RWF0fSQkIEV2YWx1YXRlIGFuZCBhbmFseXplIHlvdXIgbW9kZWwgaW5jbHVkaW5nIGFsbCBkaWFnbm9zdGljIHBsb3RzLCBhbmQgY29tcGFyZSB5b3VyIHRocmVlLXByZWRpY3RvciBtb2RlbCB3aXRoIHlvdXIgcmVzdWx0cyBmcm9tIHRoZSB0d28tcHJlZGljdG9yIG1vZGVsLiBJcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiAqKkVhdCoqIGFuZCAqKkhTQUcqKiBwb3NpdGl2ZSBvciBuZWdhdGl2ZT8gSG93IGNhbiB5b3UgdGVsbCBmcm9tIHRoZSBtb2RlbCBzdW1tYXJ5IHN0YXRpc3RpY3Mgb3V0cHV0PyBJZiBoaWdoZXIgc2NvcmVzIG9uIHRoZSAqKkVhdCoqIHZhcmlhYmxlIGluZGljYXRlIGhpZ2hlciBsZXZlbHMgb2YgYmVpbmcgY2Fsb3JpZSBjb25zY2lvdXMsIGtub3dpbmcgdGhlIGZhdCBjb250ZW50IG9mIGZvb2QgaXRlbXMgYW5kIHRoaW5raW5nIGFib3V0IGJ1cm5pbmcgY2Fsb3JpZXMgd2hlbiB3b3JraW5nIG91dCwgZG9lcyB0aGlzIHJlbGF0aW9uc2hpcCBiZXR3ZWVuICoqRWF0KiogYW5kICoqSFNBRyoqIG1ha2Ugc2Vuc2U/DQoNClRoZSBtb2RlbC4NCg0KDQpgYGB7cn0NCm1vZEcyID0gbG0oSFNBRyB+IE5hcmMgKyBIU1NEICsgRWF0LCBkYXRhID0gRGF0YTMzNTApDQpzdW1tYXJ5KG1vZEcyKQ0KYGBgDQoNCldlIGhhdmUgaW5jcmVhc2VkIFItc3F1YXJlZCB0byAwLjMxOTYsIHNvIHdlIGFyZSBub3cgYWNjb3VudGluZyBmb3IgYW4gYWRkaXRpb25hbCAyJSBvZiB0aGUgdmFyaWFuY2UgaW4gdGhlIEFnZ3Jlc3NpdmUgSHVtb3IgdmFyaWFibGUuIE5vdGUgdGhlICRwJC12YWx1ZXMgZm9yIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIGNvcnJlbGF0aW9uLiBXaGlsZSB0aGUgRWF0aW5nIEF0dGl0dWRlcyB2YXJpYWJsZSBpcyBtdWNoIGxlc3Mgc2lnbmlmaWNhbnQgdGhhbiB0aGUgb3RoZXIgdHdvLCBpdCdzIHN0aWxsIHNpZ25pZmljYW50IGF0IHRoZSAwLjAxIGxldmVsIHdoaWNoIGlzIHdoeSBpdCdzIGFibGUgdG8gY29udHJpYnV0ZSBhZGRpdGlvbmFsIFItc3F1YXJlZCB0byB0aGUgb3ZlcmFsbCBtb2RlbC4NCg0KYGBge3J9DQpxcW1hdGgofnJlc2lkKG1vZEcyKSwgdHlwZSA9IGMoInAiLCAiciIpKQ0KYGBgDQpgYGB7cn0NCnBsb3QobW9kRzIgLCB3aGljaCA9IDEpDQpgYGANClRoZSBsaW5lYXJpdHkgYXNzdW1wdGlvbiBjaGVja3Mgb3V0IC0tIHRoZSBmaXR0ZWQgdmFsdWVzIHBsb3Qgc2hvd3MgbmVhcmx5IHBlcmZlY3QgbGluZWFyaXR5LiBUaGUgcXEtcGxvdCB3b2JibGVzIGEgYml0LCBidXQgdGhlIHJlc2lkdWFscyBkbyBzZWVtIHRvIGJlIGFwcHJveGltYXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIE91ciB0aHJlZS1wcmVkaWN0b3IgbW9kZWwgaXMgZXhjZWxsZW50LCBhbmQgb25lIHdvdWxkIHZlcnkgbXVjaCB0cnVzdCByZXNlYXJjaCBjb25jbHVzaW9ucyBiYXNlZCBvbiBhIG1vZGVsIHdpdGggc3VtbWFyeSBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcyBsaWtlIHRoaXMgb25lLg0KDQpUaGUgYWRkaXRpb24gb2YgdGhlIEVhdGluZyBBdHRpdHVkZXMgdmFyaWFibGUgaXMgaW50ZXJlc3RpbmcuIFRoZSBxdWVzdGlvbnMgYXJlIGFib3V0IGtub3dpbmcgdGhlIG51bWJlciBvZiBjYWxvcmllcyBpbiBmb29kcyB3ZSBlYXQsIHRoaW5raW5nIGFib3V0IGhvdyBtYW55IGNhbG9yaWVzIGFyZSBidXJuZWQgd2hlbiBleGVyY2lzaW5nIGFuZCBvdGhlciBoZWFsdGggY29uc2Npb3VzIGJlaGF2aW9ycy4gTm90aWNlIHRoaXMgY29lZmZpY2llbnQgaXMgKm5lZ2F0aXZlbHkqIGNvcnJlbGF0ZWQgd2l0aCBBZ2dyZXNzaXZlIEh1bW9yLiBUaG9zZSB3aG8gYXJlIG1vcmUgaGVhbHRoIGNvbnNjaW91cyBtYXkgLS0gSSdtIHRvdGFsbHkgZ3Vlc3NpbmcgaGVyZSAtLSBoYXZlIGFuIGF2ZXJzaW9uIHRvIGh1bW9yIGJhc2VkIG9uIGluc3VsdHMgYW5kIHB1dC1kb3ducyBiZWNhdXNlIHRoZXkgYXJlIG1vcmUgY29uc2Npb3VzIGFib3V0IHdlaWdodCBhbmQgYm9keSBpbWFnZS4gUGVyaGFwcyB0aGVpciBlbXBhdGh5IG1ha2VzIHRoZW0gcmVzaXN0YW50IHRvIGFnZ3Jlc3NpdmUgaHVtb3IuIFdoYXRldmVyIHRoZSByZWFzb25zLCBpdCBpcyBhbiBpbnRlcmVzdGluZyByZWxhdGlvbnNoaXAgYW1vbmcgcGVyc29uYWxpdHkgdmFyaWFibGVzIGFuZCBiZWFycyBjb25zaWRlcmF0aW9uLg0KDQoNCiMjIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5JdGVtIDkuMjwvc3Bhbj4NCkEgc3VwcG9zZWRseSBmYWlyIGRpZSBpcyByb2xsZWQgNTAgdGltZXMgd2l0aCB0aGUgZm9sbG93aW5nIHJlc3VsdHM6IDkgb25lcywgMTUgdHdvcywgOSB0aHJlZXMsIDggZm91cnMsIDYgZml2ZXMgYW5kIDEzIHNpeGVzLiBUZXN0IGF0IHRoZSAwLjA1IGxldmVsIHdoZXRoZXIgdGhlIGRpZSBpcyBhY3R1YWxseSBmYWlyIHVzaW5nICRcY2hpXjIkIEdPRi4NCg0KSSBmaW5kIGl0IGhpbGFyaW91cyB0aGF0IHRoaXMgZmFpbHM6DQoNCmBgYHtyfQ0Kb2JzZXJ2ZWQgPSBjKDkgLCAxNSAsIDkgLCA4ICwgNiAsIDEzKQ0KZXhwZWN0ZWQgPSBjKDAuMTY2NyAsIDAuMTY2NyAsIDAuMTY2NyAsIDAuMTY2NyAsIDAuMTY2NyAsIDAuMTY2NyApDQp4Y2hpc3EudGVzdCh4ID0gb2JzZXJ2ZWQsDQogICAgICAgICAgIHAgPSBleHBlY3RlZCkNCmBgYA0KDQpXaGF0IFJTdHVkaW8gaXMgZXhwZWN0aW5nIGlzIHRoYXQgd2Ugd2lsbCBsZWF2ZSB0aGUgKipleHBlY3RlZCoqIHBhcmFtZXRlciB0byBpdHMgZGVmYXVsdCBzZXR0aW5nIHdoZW4gZWFjaCBwcm9iYWJpbGl0eSBpcyBlcXVhbGx5IGxpa2VseS4gU28gdGhpcyB3b3JrczoNCg0KYGBge3J9DQp4Y2hpc3EudGVzdCh4ID0gb2JzZXJ2ZWQpDQpgYGANCg0KQWxzbywgaWYgeW91IGxldCBSU3R1ZGlvIGNyZWF0ZSB0aGUgcm91bmRpbmcgZXJyb3IsIHRoZSB2YWx1ZXMgd2lsbCAoaW4gUidzIGNvbXBsaWNhdGVkIG1pbmQpIHN1bSB0byAxLiBMZXQncyBjcmVhdGUgYSB2YXJpYWJsZSBmb3IgdGhlIHByb2JhYmlsaXR5IG9mIGEgZGljZSByb2xsOg0KDQpgYGB7cn0NCnBEaWNlID0gMS82DQpwRGljZQ0KYGBgDQoNCmBgYHtyfQ0Kb2JzZXJ2ZWQgPSBjKDkgLCAxNSAsIDkgLCA4ICwgNiAsIDEzKQ0KZXhwZWN0ZWQgPSBjKHBEaWNlICwgcERpY2UgLCBwRGljZSAsIHBEaWNlICwgcERpY2UgLCBwRGljZSApDQp4Y2hpc3EudGVzdCh4ID0gb2JzZXJ2ZWQsDQogICAgICAgICAgIHAgPSBleHBlY3RlZCkNCmBgYA0KDQpTbyB3ZSd2ZSB0ZXN0ZWQgdGhlIHByb2JhYmlsaXR5IG1vZGVsIChudWxsIGh5cG90aGVzaXMpIHVzaW5nICRcY2hpXjIkIEdPRiBhbmQgZm91bmQgYSAkcCQtdmFsdWUgb2YgMC4zNDcxLiBUaGUgZXhwZWN0ZWQgY2VsbCBjb3VudHMgYXJlIGFsbCBlcXVhbCB0byAxMCB3aGljaCBpcyBncmVhdGVyIHRoYW4gNSwgc28gdGhlIGRhdGEgcGFzcyB0aGUgdmVyaWZpY2F0aW9uIGNoZWNrLiBUaGUgc3RhdGlzdGljYWwgY29uY2x1c2lvbj8gV2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwuIFdlIGhhdmUgbm8gZXZpZGVuY2UgdGhlIHByb2JhYmlsaXR5IG1vZGVsIGlzIGluY29ycmVjdC4NCg0KDQo=