## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.4 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 2.0.1 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## Loading required package: airports
## Loading required package: cherryblossom
## Loading required package: usdata
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following objects are masked from 'package:openintro':
##
## ethanol, lsegments
##
## Attaching package: 'BSDA'
## The following object is masked from 'package:datasets':
##
## Orange
Exercise 1
Q.In the first paragraph, several key findings are reported. Do these percentages appear to be sample statistics (derived from the data sample) or population parameters?
A. The first paragrpah documents the general finding of this study with percentaged that are of the sample statistics. stats that stem from 50,000 men and women across 57 countrie. ### Exercise 2
The title of the report is “Global Index of Religiosity and Atheism”. To generalize the report’s findings to the global human population, what must we assume about the sampling method? Does that seem like a reasonable assumption?
- Random sampling took place.
- The samples were independent of one another .
- The sample size is normaly dist or is sufficient.
The data
What does each row of Table 6 correspond to? What does each row of atheism correspond to?
download.file("http://www.openintro.org/stat/data/atheism.RData", destfile = "atheism.RData")
load("atheism.RData")
Exercise 3
What does each row of Table 6 correspond to? What does each row of atheism correspond to?
view(atheism)
us12 <- subset(atheism, nationality == "United States" & year == "2012")
Table 6 on page 15 of the study shows a row of different countries along with the percentage in in the categories of " religious “,”nonreligious“,”convinced atheists“,”I don’t know"
while rows of table 6 correspond to high level statistics , “atheism” corresponds to individual samples in each country of binary responses of atheist or not atheist.
Exercise 4
Does it agree with the percentage in Table 6? If not, why?
#Using the command below, create a new dataframe called us12 that contains only the rows in atheism associated with respondents to the 2012 survey from the United States.
us12 <- subset(atheism, nationality == "United States" & year == "2012")
us.atheist <- subset(us12, response == "atheist" )
us.nonatheist <- subset(us12, response == "non-atheist" )
num.atheist<- count(us.atheist)
num.nonatheist<-count(us.nonatheist)
us.asked<-count(us12)
#Next, calculate the proportion of atheist responses. Does it agree with the percentage in Table 6? If not, why?
prop.atheist<-(num.atheist/us.asked)
The value of the proportion is 0.0499002 which when rounded macth the values from the table.
Inference on proportions
What we’d like, though, is insight into the population parameters. You answer the question, “What proportion of people in your sample reported being atheists?” with a statistic; while the question “What proportion of people on earth would report being atheists” is answered with an estimate of the parameter.
Exercise 5
Q. Write out the conditions for inference to construct a 95% confidence interval for the proportion of atheists in the United States in 2012. Are you confident all conditions are met?
# The inferential tools for estimating population proportion are analogous to those used for means in the last chapter: the confidence interval and the hypothesis test.
inference(us12$response, est = "proportion", type = "ci", method = "theoretical", success = "atheist")
## Single proportion -- success: atheist
## Summary statistics:

## p_hat = 0.0499 ; n = 1002
## Check conditions: number of successes = 50 ; number of failures = 952
## Standard error = 0.0069
## 95 % Confidence interval = ( 0.0364 , 0.0634 )
Note that since the goal is to construct an interval estimate for a proportion, it’s necessary to specify what constitutes a “success”, which here is a response of “atheist”.
Although formal confidence intervals and hypothesis tests don’t show up in the report, suggestions of inference appear at the bottom of page 7:
“In general, the error margin for surveys of this kind is ± 3-5% at 95% confidence”
Exercise 6
Q. Based on the R output, what is the margin of error for the estimate of the proportion of the proportion of atheists in US in 2012?
Exercise 7
Using the inference function, calculate confidence intervals for the proportion of atheists in 2012 in two other countries of your choice, and report the associated margins of error. Be sure to note whether the conditions for inference are met. It may be helpful to create new data sets for each of the two countries first, and then use these data sets in the inference function to construct the confidence intervals.
How does the proportion affect the margin of error?
Imagine you’ve set out to survey 1000 people on two questions: are you female? and are you left-handed? Since both of these sample proportions were calculated from the same sample size, they should have the same margin of error, right? Wrong! While the margin of error does change with sample size, it is also affected by the proportion.
Think back to the formula for the standard error: SE=p(1−p)/n‾‾‾‾‾‾‾‾‾‾√. This is then used in the formula for the margin of error for a 95% confidence interval: ME=1.96×SE=1.96×p(1−p)/n‾‾‾‾‾‾‾‾‾‾√. Since the population proportion p is in this ME formula, it should make sense that the margin of error is in some way dependent on the population proportion. We can visualize this relationship by creating a plot of ME vs. p.
# survey 1000 people
n <- 1000
# The first step is to make a vector p that is a sequence from 0 to 1 with each number separated by 0.01.
p <- seq(0, 1, 0.01)
#we can then create a vector of the margin of error (me) associated with each of these values of p using the familiar approximate formula (ME=2×SE).
me <- 2 * sqrt(p * (1 - p)/n)
#Lastly, we plot the two vectors against each other to reveal their relationship.
plot(me ~ p, ylab = "Margin of Error", xlab = "Population Proportion")

Exercise 8
Q. Describe the relationship between p and me.
A. As the population proportion increases the margin of erroe increases till it is large enough to not have much significance where it levels off and falls.
Success-failure condition.
We can investigate the interplay between n and p and the shape of the sampling distribution by using simulations.
#To start off, we simulate the process of drawing 5000 samples of size 1040 from a population with a true atheist proportion of 0.1.
p <- 0.1
n <- 1040
p_hats <- rep(0, 5000)
#For each of the 5000 samples we compute p̂ and then plot a histogram to visualize their distribution.
for(i in 1:5000)
{samp <- sample(c("atheist", "non_atheist"), n, replace = TRUE, prob = c(p, 1-p))
p_hats[i] <- sum(samp == "atheist")/n
}
hist(p_hats, main = "p = 0.1, n = 1040", xlim = c(0, 0.18))

Exercise 9
Q. Describe the sampling distribution of sample proportions at n=1040 and p=0.1. Be sure to note the center, spread, and shape.
#Hint: Remember that R has functions such as mean to calculate summary statistics.
summary(p_hats)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.07019 0.09327 0.09904 0.09969 0.10577 0.12981
Exercise 10
Repeat the above simulation three more times but with modified sample sizes and proportions: for n=400 and p=0.1, n=1040 and p=0.02, and n=400 and p=0.02. Plot all four histograms together by running the par(mfrow = c(2, 2))
Q.Based on these limited plots, how does n appear to affect the distribution of p̂ ? How does p affect the sampling distribution?
#command before creating the histograms. You may need to expand the plot window to accommodate the larger two-by-two plot. Describe the three new sampling distributions.
#1. n=400 and p=0.1,
n<-400
p<-0.1
p_hat.a<-rep(0, 5000)
for(i in 1:5000){
samp <- sample(c("atheist", "non_atheist"), n, replace = TRUE, prob = c(p, 1-p))
p_hat.a[i] <- sum(samp == "atheist")/n
}
hist(p_hat.a, main = "p = 0.1, n = 400", xlim = c(0, 0.18))

#2 n=1040 and p=0.02
n<-1040
p<-0.02
p_hat.b<-rep(0, 5000)
for(i in 1:5000){
samp <- sample(c("atheist", "non_atheist"), n, replace = TRUE, prob = c(p, 1-p))
p_hat.b[i] <- sum(samp == "atheist")/n
}
hist(p_hat.b, main = "p = 0.02, n = 1040", xlim = c(0, 0.18))

#3n=400 and p=0.02
n<-400
p<-0.02
p_hat.c<-rep(0, 5000)
for(i in 1:5000){
samp <- sample(c("atheist", "non_atheist"), n, replace = TRUE, prob = c(p, 1-p))
p_hat.c[i] <- sum(samp == "atheist")/n
}
hist(p_hat.c, main = "p = 0.02, n = 400", xlim = c(0, 0.18))

#Once you’re done, you can reset the layout of the plotting window by using the command par(mfrow = c(1, 1)) command or clicking on “Clear All” above the plotting window (if using RStudio). Note that the latter will get rid of all your previous plots.
#Once you’re done, you can reset the layout of the plotting window by using the command par(mfrow = c(1, 1)) command or clicking on “Clear All” above the plotting window (if using RStudio). Note that the latter will get rid of all your previous plots.
par(mfrow = c(1, 1))
Exercise 11
Q. Let’s suppose for this exercise that these point estimates are actually the truth. Then given the shape of their respective sampling distributions, do you think it is sensible to proceed with inference and report margin of errors, as the reports does?
While it is somewhat sensible to proceed with the report of the margin of errors in the case of Ecuador it might not be.
On your own
The question of atheism was asked by WIN-Gallup International in a similar survey that was conducted in 2005. (We assume here that sample sizes have remained the same.) Table 4 on page 13 of the report summarizes survey results from 2005 and 2012 for 39 countries.
- Answer the following two questions using the inference function. As always, write out the hypotheses for any tests you conduct and outline the status of the conditions for inference.
- Is there convincing evidence that Spain has seen a change in its atheism index between 2005 and 2012?
H0: There is no change in atheism in Spain from 2005 to 2012
Ha:There is a change in seen in spain in atheism form 2015 to 2012
#Hint: Create a new data set for respondents from Spain. Form confidence intervals for the true proportion of athiests in both years, and determine whether they overlap.
#2005
sp05 <- subset(atheism, nationality == "Spain" & year == "2005")
sp05.atheist <- subset(sp05, response == "atheist" )
num.atheist05<- count(sp05.atheist)
num.atheist05
## n
## 1 115
sp05.asked<-count(sp05)
sp05.asked
## n
## 1 1146
#Next, calculate the proportion of atheist responses. Does it agree with the percentage in Table 6? If not, why?
#2012
sp12 <- subset(atheism, nationality == "Spain" & year == "2012")
sp12.atheist <- subset(sp12, response == "atheist" )
num.atheist12<- count(sp12.atheist)
sp12.asked<-count(sp12)
sp12.asked
## n
## 1 1145
#Next, calculate the proportion of atheist responses. Does it agree with the percentage in Table 6? If not, why?
prop.atheis12<-(num.atheist12 / sp12.asked)
final <-prop.atheis12*100
2005 Spain polled citizens atheists were 10.0349% of the sample with a proportion of .103 and had proportion of .089 with a percent of 8.9%.furhter with a pvalue of 0.3 the is sufficent evidence to accept the null hypothese.
spain <- subset(atheism, nationality == "Spain" & year == "2005" | nationality == "Spain" & year == "2012")
inference(y = spain$response, x = spain$year, est = "proportion",type = "ht", null = 0, alternative = "twosided", method = "theoretical", success = "atheist")
## Warning: Explanatory variable was numerical, it has been converted to
## categorical. In order to avoid this warning, first convert your explanatory
## variable to a categorical variable using the as.factor() function.
## Response variable: categorical, Explanatory variable: categorical
## Two categorical variables
## Difference between two proportions -- success: atheist
## Summary statistics:
## x
## y 2005 2012 Sum
## atheist 115 103 218
## non-atheist 1031 1042 2073
## Sum 1146 1145 2291
## Observed difference between proportions (2005-2012) = 0.0104
##
## H0: p_2005 - p_2012 = 0
## HA: p_2005 - p_2012 != 0
## Pooled proportion = 0.0952
## Check conditions:
## 2005 : number of expected successes = 109 ; number of expected failures = 1037
## 2012 : number of expected successes = 109 ; number of expected failures = 1036
## Standard error = 0.012
## Test statistic: Z = 0.848
## p-value = 0.3966

- Is there convincing evidence that the United States has seen a change in its atheism index between 2005 and 2012?
us12 <- subset(atheism, nationality == "United States" & year == "2012")
us.atheist <- subset(us12, response == "atheist" )
us.nonatheist <- subset(us12, response == "non-atheist" )
num.atheist<- count(us.atheist)
#50
us.asked<-count(us12)
#1002
prop.atheistus12<-(50/1002)
#.0499002
us05 <- subset(atheism, nationality == "United States" & year == "2005")
us.atheist05 <- subset(us05, response == "atheist" )
num.atheist05<- count(us.atheist05)
#10
us.asked05<-count(us05)
#1002
prop05us<-( 10/1002)
#[1] 0.00998004
#There seems to be a change in proportions between the years in the united states.
usa<- subset(atheism, nationality == "United States" & year == "2005" | nationality == "United States" & year == "2012")
inference(y = usa$response, x = usa$year, est = "proportion",type = "ht", null = 0, alternative = "twosided", method = "theoretical", success = "atheist")
## Warning: Explanatory variable was numerical, it has been converted to
## categorical. In order to avoid this warning, first convert your explanatory
## variable to a categorical variable using the as.factor() function.
## Response variable: categorical, Explanatory variable: categorical
## Two categorical variables
## Difference between two proportions -- success: atheist
## Summary statistics:
## x
## y 2005 2012 Sum
## atheist 10 50 60
## non-atheist 992 952 1944
## Sum 1002 1002 2004
## Observed difference between proportions (2005-2012) = -0.0399
##
## H0: p_2005 - p_2012 = 0
## HA: p_2005 - p_2012 != 0
## Pooled proportion = 0.0299
## Check conditions:
## 2005 : number of expected successes = 30 ; number of expected failures = 972
## 2012 : number of expected successes = 30 ; number of expected failures = 972
## Standard error = 0.008
## Test statistic: Z = -5.243
## p-value = 0
p-value = 0 suggests strong evidence to reject the null hypothesis that there isnt any change in atheism in the united states.
- If in fact there has been no change in the atheism index in the countries listed in Table 4, in how many of those countries would you expect to detect a change (at a significance level of 0.05) simply by chance?
A.type one error is rejecting the null hypotheisis when it is true therefore with a significance level of 0.05 or the probability of rejecting the null with 39 countried there isa chance that at least 2 countries will detect a shift or a change in atheism index.
- Suppose you’re hired by the local government to estimate the proportion of residents that attend a religious service on a weekly basis. According to the guidelines, the estimate must have a margin of error no greater than 1% with 95% confidence. You have no idea what to expect for p. How many people would you have to sample to ensure that you are within the guidelines?
There must be a sample size of 9604 to ensure that there it is wituidelines h in the g
M.e<-0.01
p<-0.5
#ci95%=1.96
se<-0.01/1.96
B<-se^2
#00510
#p(1-P)
A<-.25
n<-(A/B)
n
## [1] 9604
LS0tCnRpdGxlOiAiSW5mZXJlbmNlIGZvciBjYXRlZ29yaWNhbCBkYXRhIgphdXRob3I6ICJNYWtkYSBEZW1lbGFzaCIKZGF0ZTogImAxMS8xLzIwMjFgIgpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydAotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmxpYnJhcnkoQlNEQSkKYGBgCgojIyMgRXhlcmNpc2UgMQoKUS5JbiB0aGUgZmlyc3QgcGFyYWdyYXBoLCBzZXZlcmFsIGtleSBmaW5kaW5ncyBhcmUgcmVwb3J0ZWQuIERvIHRoZXNlIHBlcmNlbnRhZ2VzIGFwcGVhciB0byBiZSBzYW1wbGUgc3RhdGlzdGljcyAoZGVyaXZlZCBmcm9tIHRoZSBkYXRhIHNhbXBsZSkgb3IgcG9wdWxhdGlvbiBwYXJhbWV0ZXJzPwoKCkEuIFRoZSBmaXJzdCBwYXJhZ3JwYWggZG9jdW1lbnRzIHRoZSBnZW5lcmFsIGZpbmRpbmcgb2YgdGhpcyBzdHVkeSB3aXRoIHBlcmNlbnRhZ2VkIHRoYXQgYXJlIG9mIHRoZSBzYW1wbGUgc3RhdGlzdGljcy4gc3RhdHMgdGhhdCBzdGVtIGZyb20gNTAsMDAwIG1lbiBhbmQgd29tZW4gYWNyb3NzIDU3IGNvdW50cmllLgojIyMgRXhlcmNpc2UgMgoKClRoZSB0aXRsZSBvZiB0aGUgcmVwb3J0IGlzIOKAnEdsb2JhbCBJbmRleCBvZiBSZWxpZ2lvc2l0eSBhbmQgQXRoZWlzbeKAnS4gVG8gZ2VuZXJhbGl6ZSB0aGUgcmVwb3J04oCZcyBmaW5kaW5ncyB0byB0aGUgZ2xvYmFsIGh1bWFuIHBvcHVsYXRpb24sIHdoYXQgbXVzdCB3ZSBhc3N1bWUgYWJvdXQgdGhlIHNhbXBsaW5nIG1ldGhvZD8gRG9lcyB0aGF0IHNlZW0gbGlrZSBhIHJlYXNvbmFibGUgYXNzdW1wdGlvbj8KCjEuIFJhbmRvbSBzYW1wbGluZyB0b29rIHBsYWNlLgoyLiBUaGUgc2FtcGxlcyB3ZXJlIGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyIC4KMy4gVGhlIHNhbXBsZSBzaXplIGlzIG5vcm1hbHkgZGlzdCBvciBpcyBzdWZmaWNpZW50LgoKCgojIyMgVGhlIGRhdGEKCldoYXQgZG9lcyBlYWNoIHJvdyBvZiBUYWJsZSA2IGNvcnJlc3BvbmQgdG8/IFdoYXQgZG9lcyBlYWNoIHJvdyBvZiBhdGhlaXNtIGNvcnJlc3BvbmQgdG8/CgpgYGB7cn0KZG93bmxvYWQuZmlsZSgiaHR0cDovL3d3dy5vcGVuaW50cm8ub3JnL3N0YXQvZGF0YS9hdGhlaXNtLlJEYXRhIiwgZGVzdGZpbGUgPSAiYXRoZWlzbS5SRGF0YSIpCmxvYWQoImF0aGVpc20uUkRhdGEiKQpgYGAKCgojIyMgRXhlcmNpc2UgMwoKV2hhdCBkb2VzIGVhY2ggcm93IG9mIFRhYmxlIDYgY29ycmVzcG9uZCB0bz8gV2hhdCBkb2VzIGVhY2ggcm93IG9mIGF0aGVpc20gY29ycmVzcG9uZCB0bz8KYGBge3IgfQp2aWV3KGF0aGVpc20pCnVzMTIgPC0gc3Vic2V0KGF0aGVpc20sIG5hdGlvbmFsaXR5ID09ICJVbml0ZWQgU3RhdGVzIiAmIHllYXIgPT0gIjIwMTIiKQoKYGBgCgpUYWJsZSA2IG9uIHBhZ2UgMTUgb2YgdGhlIHN0dWR5IHNob3dzIGEgcm93IG9mIGRpZmZlcmVudCBjb3VudHJpZXMgYWxvbmcgd2l0aCB0aGUgcGVyY2VudGFnZSBpbiBpbiB0aGUgY2F0ZWdvcmllcyBvZiAiIHJlbGlnaW91cyAiLCAibm9ucmVsaWdpb3VzIiwiY29udmluY2VkIGF0aGVpc3RzIiwiSSBkb24ndCBrbm93IgoKd2hpbGUgcm93cyBvZiB0YWJsZSA2IGNvcnJlc3BvbmQgdG8gaGlnaCBsZXZlbCBzdGF0aXN0aWNzICwgImF0aGVpc20gIiBjb3JyZXNwb25kcyB0byBpbmRpdmlkdWFsIHNhbXBsZXMgaW4gZWFjaCBjb3VudHJ5IG9mIGJpbmFyeSByZXNwb25zZXMgb2YgYXRoZWlzdCBvciBub3QgYXRoZWlzdC4KCiMjIyBFeGVyY2lzZSA0CgogRG9lcyBpdCBhZ3JlZSB3aXRoIHRoZSBwZXJjZW50YWdlIGluIFRhYmxlIDY/IElmIG5vdCwgd2h5PwoKCmBgYHtyIH0KI1VzaW5nIHRoZSBjb21tYW5kIGJlbG93LCBjcmVhdGUgYSBuZXcgZGF0YWZyYW1lIGNhbGxlZCB1czEyIHRoYXQgY29udGFpbnMgb25seSB0aGUgcm93cyBpbiBhdGhlaXNtIGFzc29jaWF0ZWQgd2l0aCByZXNwb25kZW50cyB0byB0aGUgMjAxMiBzdXJ2ZXkgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcy4KCgp1czEyIDwtIHN1YnNldChhdGhlaXNtLCBuYXRpb25hbGl0eSA9PSAiVW5pdGVkIFN0YXRlcyIgJiB5ZWFyID09ICIyMDEyIikKdXMuYXRoZWlzdCA8LSBzdWJzZXQodXMxMiwgcmVzcG9uc2UgPT0gImF0aGVpc3QiICkKdXMubm9uYXRoZWlzdCA8LSBzdWJzZXQodXMxMiwgcmVzcG9uc2UgPT0gIm5vbi1hdGhlaXN0IiApCm51bS5hdGhlaXN0PC0gY291bnQodXMuYXRoZWlzdCkKbnVtLm5vbmF0aGVpc3Q8LWNvdW50KHVzLm5vbmF0aGVpc3QpCgp1cy5hc2tlZDwtY291bnQodXMxMikKCiAjTmV4dCwgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGF0aGVpc3QgcmVzcG9uc2VzLiBEb2VzIGl0IGFncmVlIHdpdGggdGhlIHBlcmNlbnRhZ2UgaW4gVGFibGUgNj8gSWYgbm90LCB3aHk/Cgpwcm9wLmF0aGVpc3Q8LShudW0uYXRoZWlzdC91cy5hc2tlZCkKYGBgCiAKIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcG9ydGlvbiBpcyAwLjA0OTkwMDIgd2hpY2ggd2hlbiByb3VuZGVkIG1hY3RoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgdGFibGUuCgojIyMgSW5mZXJlbmNlIG9uIHByb3BvcnRpb25zCgogV2hhdCB3ZeKAmWQgbGlrZSwgdGhvdWdoLCBpcyBpbnNpZ2h0IGludG8gdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVycy4gWW91IGFuc3dlciB0aGUgcXVlc3Rpb24sIOKAnFdoYXQgcHJvcG9ydGlvbiBvZiBwZW9wbGUgaW4geW91ciBzYW1wbGUgcmVwb3J0ZWQgYmVpbmcgYXRoZWlzdHM/4oCdIHdpdGggYSBzdGF0aXN0aWM7IHdoaWxlIHRoZSBxdWVzdGlvbiDigJxXaGF0IHByb3BvcnRpb24gb2YgcGVvcGxlIG9uIGVhcnRoIHdvdWxkIHJlcG9ydCBiZWluZyBhdGhlaXN0c+KAnSBpcyBhbnN3ZXJlZCB3aXRoIGFuIGVzdGltYXRlIG9mIHRoZSBwYXJhbWV0ZXIuCgogCiMjIyBFeGVyY2lzZSA1CgpRLiBXcml0ZSBvdXQgdGhlIGNvbmRpdGlvbnMgZm9yIGluZmVyZW5jZSB0byBjb25zdHJ1Y3QgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIHByb3BvcnRpb24gb2YgYXRoZWlzdHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgaW4gMjAxMi4gQXJlIHlvdSBjb25maWRlbnQgYWxsIGNvbmRpdGlvbnMgYXJlIG1ldD8KCgpgYGB7ciB9CiMgVGhlIGluZmVyZW50aWFsIHRvb2xzIGZvciBlc3RpbWF0aW5nIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBhcmUgYW5hbG9nb3VzIHRvIHRob3NlIHVzZWQgZm9yIG1lYW5zIGluIHRoZSBsYXN0IGNoYXB0ZXI6IHRoZSBjb25maWRlbmNlIGludGVydmFsIGFuZCB0aGUgaHlwb3RoZXNpcyB0ZXN0LgoKCmluZmVyZW5jZSh1czEyJHJlc3BvbnNlLCBlc3QgPSAicHJvcG9ydGlvbiIsIHR5cGUgPSAiY2kiLCBtZXRob2QgPSAidGhlb3JldGljYWwiLCAgc3VjY2VzcyA9ICJhdGhlaXN0IikKCgpgYGAKCgpOb3RlIHRoYXQgc2luY2UgdGhlIGdvYWwgaXMgdG8gY29uc3RydWN0IGFuIGludGVydmFsIGVzdGltYXRlIGZvciBhIHByb3BvcnRpb24sIGl04oCZcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSB3aGF0IGNvbnN0aXR1dGVzIGEg4oCcc3VjY2Vzc+KAnSwgd2hpY2ggaGVyZSBpcyBhIHJlc3BvbnNlIG9mICJhdGhlaXN0Ii4KCkFsdGhvdWdoIGZvcm1hbCBjb25maWRlbmNlIGludGVydmFscyBhbmQgaHlwb3RoZXNpcyB0ZXN0cyBkb27igJl0IHNob3cgdXAgaW4gdGhlIHJlcG9ydCwgc3VnZ2VzdGlvbnMgb2YgaW5mZXJlbmNlIGFwcGVhciBhdCB0aGUgYm90dG9tIG9mIHBhZ2UgNzogCgrigJxJbiBnZW5lcmFsLCB0aGUgZXJyb3IgbWFyZ2luIGZvciBzdXJ2ZXlzIG9mIHRoaXMga2luZCBpcyDCsSAzLTUlIGF0IDk1JSBjb25maWRlbmNl4oCdCgojIyMgRXhlcmNpc2UgNgoKUS4gQmFzZWQgb24gdGhlIFIgb3V0cHV0LCB3aGF0IGlzIHRoZSBtYXJnaW4gb2YgZXJyb3IgZm9yIHRoZSBlc3RpbWF0ZSBvZiB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgcHJvcG9ydGlvbiBvZiBhdGhlaXN0cyBpbiBVUyBpbiAyMDEyPwoKYGBge3IgfQpNLmVycm9yPC0oMS45NiogMC4wMDY5KQpgYGAKCgojIyMgRXhlcmNpc2UgNwoKVXNpbmcgdGhlIGluZmVyZW5jZSBmdW5jdGlvbiwgY2FsY3VsYXRlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgcHJvcG9ydGlvbiBvZiBhdGhlaXN0cyBpbiAyMDEyIGluIHR3byBvdGhlciBjb3VudHJpZXMgb2YgeW91ciBjaG9pY2UsIGFuZCByZXBvcnQgdGhlIGFzc29jaWF0ZWQgbWFyZ2lucyBvZiBlcnJvci4gQmUgc3VyZSB0byBub3RlIHdoZXRoZXIgdGhlIGNvbmRpdGlvbnMgZm9yIGluZmVyZW5jZSBhcmUgbWV0LiBJdCBtYXkgYmUgaGVscGZ1bCB0byBjcmVhdGUgbmV3IGRhdGEgc2V0cyBmb3IgZWFjaCBvZiB0aGUgdHdvIGNvdW50cmllcyBmaXJzdCwgYW5kIHRoZW4gdXNlIHRoZXNlIGRhdGEgc2V0cyBpbiB0aGUgaW5mZXJlbmNlIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMuCgoKYGBge3IgfQpgYGAKCgojIyMgSG93IGRvZXMgdGhlIHByb3BvcnRpb24gYWZmZWN0IHRoZSBtYXJnaW4gb2YgZXJyb3I/CgoKSW1hZ2luZSB5b3XigJl2ZSBzZXQgb3V0IHRvIHN1cnZleSAxMDAwIHBlb3BsZSBvbiB0d28gcXVlc3Rpb25zOiBhcmUgeW91IGZlbWFsZT8gYW5kIGFyZSB5b3UgbGVmdC1oYW5kZWQ/IFNpbmNlIGJvdGggb2YgdGhlc2Ugc2FtcGxlIHByb3BvcnRpb25zIHdlcmUgY2FsY3VsYXRlZCBmcm9tIHRoZSBzYW1lIHNhbXBsZSBzaXplLCB0aGV5IHNob3VsZCBoYXZlIHRoZSBzYW1lIG1hcmdpbiBvZiBlcnJvciwgcmlnaHQ/IFdyb25nISBXaGlsZSB0aGUgbWFyZ2luIG9mIGVycm9yIGRvZXMgY2hhbmdlIHdpdGggc2FtcGxlIHNpemUsIGl0IGlzIGFsc28gYWZmZWN0ZWQgYnkgdGhlIHByb3BvcnRpb24uCgpUaGluayBiYWNrIHRvIHRoZSBmb3JtdWxhIGZvciB0aGUgc3RhbmRhcmQgZXJyb3I6IFNFPXAoMeKIknApL27igL7igL7igL7igL7igL7igL7igL7igL7igL7igL7iiJouIFRoaXMgaXMgdGhlbiB1c2VkIGluIHRoZSBmb3JtdWxhIGZvciB0aGUgbWFyZ2luIG9mIGVycm9yIGZvciBhIDk1JSBjb25maWRlbmNlIGludGVydmFsOiBNRT0xLjk2w5dTRT0xLjk2w5dwKDHiiJJwKS9u4oC+4oC+4oC+4oC+4oC+4oC+4oC+4oC+4oC+4oC+4oiaLiBTaW5jZSB0aGUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIHAgaXMgaW4gdGhpcyBNRSBmb3JtdWxhLCBpdCBzaG91bGQgbWFrZSBzZW5zZSB0aGF0IHRoZSBtYXJnaW4gb2YgZXJyb3IgaXMgaW4gc29tZSB3YXkgZGVwZW5kZW50IG9uIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uIFdlIGNhbiB2aXN1YWxpemUgdGhpcyByZWxhdGlvbnNoaXAgYnkgY3JlYXRpbmcgYSBwbG90IG9mIE1FIHZzLiBwLgoKCgpgYGB7cn0KCgojIHN1cnZleSAxMDAwIHBlb3BsZQpuIDwtIDEwMDAKIyBUaGUgZmlyc3Qgc3RlcCBpcyB0byBtYWtlIGEgdmVjdG9yIHAgdGhhdCBpcyBhIHNlcXVlbmNlIGZyb20gMCB0byAxIHdpdGggZWFjaCBudW1iZXIgc2VwYXJhdGVkIGJ5IDAuMDEuCgpwIDwtIHNlcSgwLCAxLCAwLjAxKQoKCiN3ZSBjYW4gdGhlbiBjcmVhdGUgYSB2ZWN0b3Igb2YgdGhlIG1hcmdpbiBvZiBlcnJvciAobWUpIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9mIHRoZXNlIHZhbHVlcyBvZiBwIHVzaW5nIHRoZSBmYW1pbGlhciBhcHByb3hpbWF0ZSBmb3JtdWxhIChNRT0yw5dTRSkuCm1lIDwtIDIgKiBzcXJ0KHAgKiAoMSAtIHApL24pCgoKI0xhc3RseSwgd2UgcGxvdCB0aGUgdHdvIHZlY3RvcnMgYWdhaW5zdCBlYWNoIG90aGVyIHRvIHJldmVhbCB0aGVpciByZWxhdGlvbnNoaXAuCgpwbG90KG1lIH4gcCwgeWxhYiA9ICJNYXJnaW4gb2YgRXJyb3IiLCB4bGFiID0gIlBvcHVsYXRpb24gUHJvcG9ydGlvbiIpCgoKYGBgCgoKIyMjIEV4ZXJjaXNlIDgKCgpRLiBEZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcCBhbmQgbWUuCgoKQS4gQXMgdGhlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBpbmNyZWFzZXMgdGhlIG1hcmdpbiBvZiBlcnJvZSBpbmNyZWFzZXMgdGlsbCBpdCBpcyBsYXJnZSBlbm91Z2ggdG8gbm90IGhhdmUgbXVjaCBzaWduaWZpY2FuY2Ugd2hlcmUgaXQgbGV2ZWxzIG9mZiBhbmQgZmFsbHMuCgoKCiMjIyBTdWNjZXNzLWZhaWx1cmUgY29uZGl0aW9uLgoKCgpXZSBjYW4gaW52ZXN0aWdhdGUgdGhlIGludGVycGxheSBiZXR3ZWVuIG4gYW5kIHAgYW5kIHRoZSBzaGFwZSBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGJ5IHVzaW5nIHNpbXVsYXRpb25zLiAKYGBge3J9CiNUbyBzdGFydCBvZmYsIHdlIHNpbXVsYXRlIHRoZSBwcm9jZXNzIG9mIGRyYXdpbmcgNTAwMCBzYW1wbGVzIG9mIHNpemUgMTA0MCBmcm9tIGEgcG9wdWxhdGlvbiB3aXRoIGEgdHJ1ZSBhdGhlaXN0IHByb3BvcnRpb24gb2YgMC4xLiAKCgpwIDwtIDAuMQpuIDwtIDEwNDAKcF9oYXRzIDwtIHJlcCgwLCA1MDAwKQoKCiNGb3IgZWFjaCBvZiB0aGUgNTAwMCBzYW1wbGVzIHdlIGNvbXB1dGUgcMyCICBhbmQgdGhlbiBwbG90IGEgaGlzdG9ncmFtIHRvIHZpc3VhbGl6ZSB0aGVpciBkaXN0cmlidXRpb24uCgpmb3IoaSBpbiAxOjUwMDApCiAge3NhbXAgPC0gc2FtcGxlKGMoImF0aGVpc3QiLCAibm9uX2F0aGVpc3QiKSwgbiwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBjKHAsIDEtcCkpCiBwX2hhdHNbaV0gPC0gc3VtKHNhbXAgPT0gImF0aGVpc3QiKS9uCn0KCmhpc3QocF9oYXRzLCBtYWluID0gInAgPSAwLjEsIG4gPSAxMDQwIiwgeGxpbSA9IGMoMCwgMC4xOCkpCgoKCgpgYGAKCgojIyMgRXhlcmNpc2UgOQpRLiBEZXNjcmliZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBwcm9wb3J0aW9ucyBhdCBuPTEwNDAgYW5kIHA9MC4xLiBCZSBzdXJlIHRvIG5vdGUgdGhlIGNlbnRlciwgc3ByZWFkLCBhbmQgc2hhcGUuCmBgYHtyfQojSGludDogUmVtZW1iZXIgdGhhdCBSIGhhcyBmdW5jdGlvbnMgc3VjaCBhcyBtZWFuIHRvIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MuCnN1bW1hcnkocF9oYXRzKQpgYGAKCgoKCiMjIyBFeGVyY2lzZSAxMApSZXBlYXQgdGhlIGFib3ZlIHNpbXVsYXRpb24gdGhyZWUgbW9yZSB0aW1lcyBidXQgd2l0aCBtb2RpZmllZCBzYW1wbGUgc2l6ZXMgYW5kIHByb3BvcnRpb25zOiBmb3Igbj00MDAgYW5kIHA9MC4xLCBuPTEwNDAgYW5kIHA9MC4wMiwgYW5kIG49NDAwIGFuZCBwPTAuMDIuIFBsb3QgYWxsIGZvdXIgaGlzdG9ncmFtcyB0b2dldGhlciBieSBydW5uaW5nIHRoZSBwYXIobWZyb3cgPSBjKDIsIDIpKSAKClEuQmFzZWQgb24gdGhlc2UgbGltaXRlZCBwbG90cywgaG93IGRvZXMgbiBhcHBlYXIgdG8gYWZmZWN0IHRoZSBkaXN0cmlidXRpb24gb2YgcMyCID8gSG93IGRvZXMgcCBhZmZlY3QgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbj8KCmBgYHtyfQojY29tbWFuZCBiZWZvcmUgY3JlYXRpbmcgdGhlIGhpc3RvZ3JhbXMuIFlvdSBtYXkgbmVlZCB0byBleHBhbmQgdGhlIHBsb3Qgd2luZG93IHRvIGFjY29tbW9kYXRlIHRoZSBsYXJnZXIgdHdvLWJ5LXR3byBwbG90LiBEZXNjcmliZSB0aGUgdGhyZWUgbmV3IHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMuCgoKIzEuIG49NDAwIGFuZCBwPTAuMSwKCm48LTQwMCAKcDwtMC4xCnBfaGF0LmE8LXJlcCgwLCA1MDAwKQoKCmZvcihpIGluIDE6NTAwMCl7CiAgc2FtcCA8LSBzYW1wbGUoYygiYXRoZWlzdCIsICJub25fYXRoZWlzdCIpLCBuLCByZXBsYWNlID0gVFJVRSwgcHJvYiA9IGMocCwgMS1wKSkKIHBfaGF0LmFbaV0gPC0gc3VtKHNhbXAgPT0gImF0aGVpc3QiKS9uCn0KCmhpc3QocF9oYXQuYSwgbWFpbiA9ICJwID0gMC4xLCBuID0gNDAwIiwgeGxpbSA9IGMoMCwgMC4xOCkpCgoKIzIgbj0xMDQwIGFuZCBwPTAuMDIKbjwtMTA0MCAKcDwtMC4wMgpwX2hhdC5iPC1yZXAoMCwgNTAwMCkKCmZvcihpIGluIDE6NTAwMCl7CiAgc2FtcCA8LSBzYW1wbGUoYygiYXRoZWlzdCIsICJub25fYXRoZWlzdCIpLCBuLCByZXBsYWNlID0gVFJVRSwgcHJvYiA9IGMocCwgMS1wKSkKIHBfaGF0LmJbaV0gPC0gc3VtKHNhbXAgPT0gImF0aGVpc3QiKS9uCn0KCmhpc3QocF9oYXQuYiwgbWFpbiA9ICJwID0gMC4wMiwgbiA9IDEwNDAiLCB4bGltID0gYygwLCAwLjE4KSkKCgojM249NDAwIGFuZCBwPTAuMDIKbjwtNDAwIApwPC0wLjAyCnBfaGF0LmM8LXJlcCgwLCA1MDAwKQoKCgpmb3IoaSBpbiAxOjUwMDApewogIHNhbXAgPC0gc2FtcGxlKGMoImF0aGVpc3QiLCAibm9uX2F0aGVpc3QiKSwgbiwgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBjKHAsIDEtcCkpCiBwX2hhdC5jW2ldIDwtIHN1bShzYW1wID09ICJhdGhlaXN0Iikvbgp9CgpoaXN0KHBfaGF0LmMsIG1haW4gPSAicCA9IDAuMDIsIG4gPSA0MDAiLCB4bGltID0gYygwLCAwLjE4KSkKCgojT25jZSB5b3XigJlyZSBkb25lLCB5b3UgY2FuIHJlc2V0IHRoZSBsYXlvdXQgb2YgdGhlIHBsb3R0aW5nIHdpbmRvdyBieSB1c2luZyB0aGUgY29tbWFuZCBwYXIobWZyb3cgPSBjKDEsIDEpKSBjb21tYW5kIG9yIGNsaWNraW5nIG9uIOKAnENsZWFyIEFsbOKAnSBhYm92ZSB0aGUgcGxvdHRpbmcgd2luZG93IChpZiB1c2luZyBSU3R1ZGlvKS4gTm90ZSB0aGF0IHRoZSBsYXR0ZXIgd2lsbCBnZXQgcmlkIG9mIGFsbCB5b3VyIHByZXZpb3VzIHBsb3RzLgoKYGBgCgpgYGB7cn0KCiNPbmNlIHlvdeKAmXJlIGRvbmUsIHlvdSBjYW4gcmVzZXQgdGhlIGxheW91dCBvZiB0aGUgcGxvdHRpbmcgd2luZG93IGJ5IHVzaW5nIHRoZSBjb21tYW5kIHBhcihtZnJvdyA9IGMoMSwgMSkpIGNvbW1hbmQgb3IgY2xpY2tpbmcgb24g4oCcQ2xlYXIgQWxs4oCdIGFib3ZlIHRoZSBwbG90dGluZyB3aW5kb3cgKGlmIHVzaW5nIFJTdHVkaW8pLiBOb3RlIHRoYXQgdGhlIGxhdHRlciB3aWxsIGdldCByaWQgb2YgYWxsIHlvdXIgcHJldmlvdXMgcGxvdHMuCgpwYXIobWZyb3cgPSBjKDEsIDEpKQpgYGAKCgoKIyMjIEV4ZXJjaXNlIDExCgoKUS4gTGV04oCZcyBzdXBwb3NlIGZvciB0aGlzIGV4ZXJjaXNlIHRoYXQgdGhlc2UgcG9pbnQgZXN0aW1hdGVzIGFyZSBhY3R1YWxseSB0aGUgdHJ1dGguIFRoZW4gZ2l2ZW4gdGhlIHNoYXBlIG9mIHRoZWlyIHJlc3BlY3RpdmUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucywgZG8geW91IHRoaW5rIGl0IGlzIHNlbnNpYmxlIHRvIHByb2NlZWQgd2l0aCBpbmZlcmVuY2UgYW5kIHJlcG9ydCBtYXJnaW4gb2YgZXJyb3JzLCBhcyB0aGUgcmVwb3J0cyBkb2VzPwoKV2hpbGUgaXQgaXMgc29tZXdoYXQgc2Vuc2libGUgdG8gcHJvY2VlZCB3aXRoIHRoZSByZXBvcnQgb2YgdGhlIG1hcmdpbiBvZiBlcnJvcnMgaW4gdGhlIGNhc2Ugb2YgRWN1YWRvciBpdCBtaWdodCBub3QgYmUuCgojIyMgT24geW91ciBvd24KClRoZSBxdWVzdGlvbiBvZiBhdGhlaXNtIHdhcyBhc2tlZCBieSBXSU4tR2FsbHVwIEludGVybmF0aW9uYWwgaW4gYSBzaW1pbGFyIHN1cnZleSB0aGF0IHdhcyBjb25kdWN0ZWQgaW4gMjAwNS4gKFdlIGFzc3VtZSBoZXJlIHRoYXQgc2FtcGxlIHNpemVzIGhhdmUgcmVtYWluZWQgdGhlIHNhbWUuKSBUYWJsZSA0IG9uIHBhZ2UgMTMgb2YgdGhlIHJlcG9ydCBzdW1tYXJpemVzIHN1cnZleSByZXN1bHRzIGZyb20gMjAwNSBhbmQgMjAxMiBmb3IgMzkgY291bnRyaWVzLgoKMS4gQW5zd2VyIHRoZSBmb2xsb3dpbmcgdHdvIHF1ZXN0aW9ucyB1c2luZyB0aGUgaW5mZXJlbmNlIGZ1bmN0aW9uLiBBcyBhbHdheXMsIHdyaXRlIG91dCB0aGUgaHlwb3RoZXNlcyBmb3IgYW55IHRlc3RzIHlvdSBjb25kdWN0IGFuZCBvdXRsaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGNvbmRpdGlvbnMgZm9yIGluZmVyZW5jZS4KCmEuIElzIHRoZXJlIGNvbnZpbmNpbmcgZXZpZGVuY2UgdGhhdCBTcGFpbiBoYXMgc2VlbiBhIGNoYW5nZSBpbiBpdHMgYXRoZWlzbSBpbmRleCBiZXR3ZWVuIDIwMDUgYW5kIDIwMTI/CgpIMDogVGhlcmUgaXMgbm8gY2hhbmdlIGluIGF0aGVpc20gaW4gU3BhaW4gIGZyb20gMjAwNSB0byAyMDEyCgoKSGE6VGhlcmUgaXMgYSBjaGFuZ2UgaW4gc2VlbiBpbiBzcGFpbiBpbiBhdGhlaXNtIGZvcm0gMjAxNSB0byAyMDEyCgoKYGBge3J9CiNIaW50OiBDcmVhdGUgYSBuZXcgZGF0YSBzZXQgZm9yIHJlc3BvbmRlbnRzIGZyb20gU3BhaW4uIEZvcm0gY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHRoZSB0cnVlIHByb3BvcnRpb24gb2YgYXRoaWVzdHMgaW4gYm90aCB5ZWFycywgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXkgb3ZlcmxhcC4KCiMyMDA1CnNwMDUgPC0gc3Vic2V0KGF0aGVpc20sIG5hdGlvbmFsaXR5ID09ICJTcGFpbiIgJiB5ZWFyID09ICIyMDA1IikKc3AwNS5hdGhlaXN0IDwtIHN1YnNldChzcDA1LCByZXNwb25zZSA9PSAiYXRoZWlzdCIgKQpudW0uYXRoZWlzdDA1PC0gY291bnQoc3AwNS5hdGhlaXN0KQpudW0uYXRoZWlzdDA1CnNwMDUuYXNrZWQ8LWNvdW50KHNwMDUpCnNwMDUuYXNrZWQKCiAjTmV4dCwgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGF0aGVpc3QgcmVzcG9uc2VzLiBEb2VzIGl0IGFncmVlIHdpdGggdGhlIHBlcmNlbnRhZ2UgaW4gVGFibGUgNj8gSWYgbm90LCB3aHk/CgoKCgogCiAjMjAxMiAKc3AxMiA8LSBzdWJzZXQoYXRoZWlzbSwgbmF0aW9uYWxpdHkgPT0gIlNwYWluIiAmIHllYXIgPT0gIjIwMTIiKQpzcDEyLmF0aGVpc3QgPC0gc3Vic2V0KHNwMTIsIHJlc3BvbnNlID09ICJhdGhlaXN0IiApCm51bS5hdGhlaXN0MTI8LSBjb3VudChzcDEyLmF0aGVpc3QpCnNwMTIuYXNrZWQ8LWNvdW50KHNwMTIpCnNwMTIuYXNrZWQKCiAjTmV4dCwgY2FsY3VsYXRlIHRoZSBwcm9wb3J0aW9uIG9mIGF0aGVpc3QgcmVzcG9uc2VzLiBEb2VzIGl0IGFncmVlIHdpdGggdGhlIHBlcmNlbnRhZ2UgaW4gVGFibGUgNj8gSWYgbm90LCB3aHk/Cgpwcm9wLmF0aGVpczEyPC0obnVtLmF0aGVpc3QxMiAvIHNwMTIuYXNrZWQpCmZpbmFsIDwtcHJvcC5hdGhlaXMxMioxMDAKYGBgCgoyMDA1IFNwYWluIHBvbGxlZCBjaXRpemVucyBhdGhlaXN0cyB3ZXJlIDEwLjAzNDklIG9mIHRoZSBzYW1wbGUgd2l0aCBhIHByb3BvcnRpb24gb2YgLjEwMyBhbmQgaGFkIHByb3BvcnRpb24gb2YgLjA4OSB3aXRoIGEgcGVyY2VudCBvZiA4LjklLmZ1cmh0ZXIgd2l0aCBhIHB2YWx1ZSBvZiAwLjMgdGhlIGlzIHN1ZmZpY2VudCBldmlkZW5jZSB0byBhY2NlcHQgdGhlIG51bGwgaHlwb3RoZXNlLgoKYGBge3J9CgoKc3BhaW4gPC0gc3Vic2V0KGF0aGVpc20sIG5hdGlvbmFsaXR5ID09ICJTcGFpbiIgJiB5ZWFyID09ICIyMDA1IiAgfCBuYXRpb25hbGl0eSA9PSAiU3BhaW4iICYgeWVhciA9PSAiMjAxMiIpCgppbmZlcmVuY2UoeSA9IHNwYWluJHJlc3BvbnNlLCB4ID0gc3BhaW4keWVhciwgZXN0ID0gInByb3BvcnRpb24iLHR5cGUgPSAiaHQiLCBudWxsID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvc2lkZWQiLCBtZXRob2QgPSAidGhlb3JldGljYWwiLCBzdWNjZXNzID0gImF0aGVpc3QiKQoKYGBgCiAKCiAKIAogCmIuIElzIHRoZXJlIGNvbnZpbmNpbmcgZXZpZGVuY2UgdGhhdCB0aGUgVW5pdGVkIFN0YXRlcyBoYXMgc2VlbiBhIGNoYW5nZSBpbiBpdHMgYXRoZWlzbSBpbmRleCBiZXR3ZWVuIDIwMDUgYW5kIDIwMTI/CgoKYGBge3J9CnVzMTIgPC0gc3Vic2V0KGF0aGVpc20sIG5hdGlvbmFsaXR5ID09ICJVbml0ZWQgU3RhdGVzIiAmIHllYXIgPT0gIjIwMTIiKQp1cy5hdGhlaXN0IDwtIHN1YnNldCh1czEyLCByZXNwb25zZSA9PSAiYXRoZWlzdCIgKQp1cy5ub25hdGhlaXN0IDwtIHN1YnNldCh1czEyLCByZXNwb25zZSA9PSAibm9uLWF0aGVpc3QiICkKbnVtLmF0aGVpc3Q8LSBjb3VudCh1cy5hdGhlaXN0KQojNTAKdXMuYXNrZWQ8LWNvdW50KHVzMTIpCiMxMDAyCQpwcm9wLmF0aGVpc3R1czEyPC0oNTAvMTAwMikKIy4wNDk5MDAyCgp1czA1IDwtIHN1YnNldChhdGhlaXNtLCBuYXRpb25hbGl0eSA9PSAiVW5pdGVkIFN0YXRlcyIgJiB5ZWFyID09ICIyMDA1IikKdXMuYXRoZWlzdDA1IDwtIHN1YnNldCh1czA1LCByZXNwb25zZSA9PSAiYXRoZWlzdCIgKQpudW0uYXRoZWlzdDA1PC0gY291bnQodXMuYXRoZWlzdDA1KQoKIzEwCnVzLmFza2VkMDU8LWNvdW50KHVzMDUpCgojMTAwMgpwcm9wMDV1czwtKCAxMC8xMDAyKQojWzFdIDAuMDA5OTgwMDQKCgoKI1RoZXJlIHNlZW1zIHRvIGJlIGEgY2hhbmdlIGluIHByb3BvcnRpb25zIGJldHdlZW4gdGhlIHllYXJzIGluIHRoZSB1bml0ZWQgc3RhdGVzLgoKdXNhPC0gc3Vic2V0KGF0aGVpc20sIG5hdGlvbmFsaXR5ID09ICJVbml0ZWQgU3RhdGVzIiAmIHllYXIgPT0gIjIwMDUiICB8IG5hdGlvbmFsaXR5ID09ICJVbml0ZWQgU3RhdGVzIiAmIHllYXIgPT0gIjIwMTIiKQoKaW5mZXJlbmNlKHkgPSB1c2EkcmVzcG9uc2UsIHggPSB1c2EkeWVhciwgZXN0ID0gInByb3BvcnRpb24iLHR5cGUgPSAiaHQiLCBudWxsID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvc2lkZWQiLCBtZXRob2QgPSAidGhlb3JldGljYWwiLCBzdWNjZXNzID0gImF0aGVpc3QiKQoKCgpgYGAKcC12YWx1ZSA9ICAwIHN1Z2dlc3RzIHN0cm9uZyBldmlkZW5jZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZXJlIGlzbnQgYW55IGNoYW5nZSAgaW4gYXRoZWlzbSBpbiB0aGUgdW5pdGVkIHN0YXRlcy4KCgoKCgoKCgoKCgoKCjIuIElmIGluIGZhY3QgdGhlcmUgaGFzIGJlZW4gbm8gY2hhbmdlIGluIHRoZSBhdGhlaXNtIGluZGV4IGluIHRoZSBjb3VudHJpZXMgbGlzdGVkIGluIFRhYmxlIDQsIGluIGhvdyBtYW55IG9mIHRob3NlIGNvdW50cmllcyB3b3VsZCB5b3UgZXhwZWN0IHRvIGRldGVjdCBhIGNoYW5nZSAoYXQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgMC4wNSkgc2ltcGx5IGJ5IGNoYW5jZT8KCgoKQS50eXBlIG9uZSBlcnJvciBpcyByZWplY3RpbmcgdGhlIG51bGwgaHlwb3RoZWlzaXMgd2hlbiBpdCBpcyB0cnVlIHRoZXJlZm9yZSB3aXRoIGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUgb3IgdGhlIHByb2JhYmlsaXR5IG9mIHJlamVjdGluZyB0aGUgbnVsbCB3aXRoIDM5IGNvdW50cmllZCB0aGVyZSBpc2EgY2hhbmNlIHRoYXQgYXQgbGVhc3QgMiBjb3VudHJpZXMgd2lsbCAgZGV0ZWN0IGEgc2hpZnQgb3IgYSBjaGFuZ2UgaW4gYXRoZWlzbSBpbmRleC4KCgozLiBTdXBwb3NlIHlvdeKAmXJlIGhpcmVkIGJ5IHRoZSBsb2NhbCBnb3Zlcm5tZW50IHRvIGVzdGltYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHJlc2lkZW50cyB0aGF0IGF0dGVuZCBhIHJlbGlnaW91cyBzZXJ2aWNlIG9uIGEgd2Vla2x5IGJhc2lzLgpBY2NvcmRpbmcgdG8gdGhlIGd1aWRlbGluZXMsIHRoZSBlc3RpbWF0ZSBtdXN0IGhhdmUgYSBtYXJnaW4gb2YgZXJyb3Igbm8gZ3JlYXRlciB0aGFuIDElIHdpdGggOTUlIGNvbmZpZGVuY2UuIApZb3UgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZXhwZWN0IGZvciBwLiBIb3cgbWFueSBwZW9wbGUgd291bGQgeW91IGhhdmUgdG8gc2FtcGxlIHRvIGVuc3VyZSB0aGF0IHlvdSBhcmUgd2l0aGluIHRoZSBndWlkZWxpbmVzPwoKClRoZXJlIG11c3QgYmUgYSBzYW1wbGUgc2l6ZSBvZiA5NjA0IHRvIGVuc3VyZSB0aGF0IHRoZXJlIGl0IGlzIHdpdHVpZGVsaW5lcyBoIGluIHRoZSBnCgoKYGBge3J9Ck0uZTwtMC4wMQpwPC0wLjUKI2NpOTUlPTEuOTYKc2U8LTAuMDEvMS45NgpCPC1zZV4yCiMwMDUxMAojcCgxLVApCkE8LS4yNQpuPC0oQS9CKQpuCgpgYGAKCg==