## start by coding in given values from instructions
# DISCLAIMER: I am assuming there is a typo in the opening paragraph of the assignment. I am setting sample size to 50, not 5.
n = 50
# old_drug = what's currently on market
old_drug_xbar = 25 #mg/dl
old_drug_sd = 15 #mg/dl
# new_drug = CholestFix
new_drug_xbar = 29 #mg/dl
new_drug_sd = 15 #mg/dl
Intro and Setup
For today’s analysis we have been contacted by a pharmaceutical
company who has developed a drug they are calling CholestFix,
whose goal is to reduce LDL cholesterol. While we were not provided
access to the dataset itself, we were still given enough valuable
information to assess how effective CholestFix is in comparison to the
current LDL-fighting drugs on the marketplace (what we will refer to as
market-standard).
The market-standard sees an average LDL reduction of 25 mg/dL with a
standard deviation of 15 mg/dL. However, the three-month study conducted
by our pharma company, with a sample size of 50 patients, showed a mean
LDL reduction in patients who took CholestFix of 29 mg/dL. The standard
deviation for subjects given CholestFix was also 15 mg/dL though.
a.) Initial Hypothesis Test
Given this available information, the first step I performed was a
one-sample t-test. This hypothesis test is relevant as we are comparing
the mean of one test sample (the 50 patients who took CholestFix) to the
mean of a more general or broadly accepted population parameter (the
market-standard pharmaceutical option).
Technically speaking, calculations were performed via a custom-built
R function and conducted with a confidence level of 95%. I chose to set
\(\alpha\) = to 0.05 as that is
generally considered industry standard. Results are below.
# will use a one-sample t test
# only have one sample, the old_drug stats are the population (or baseline) for which we are comparing too
# need sample data to use R's t.test function, we don't have sample data so will be doing manual calculation
# t value formula from Sec 3.1 step 3
alpha = 0.05
one_sample_t_no_data = function(n, xbar, pop_mean, pop_sd, alpha, tail_option){
df = n - 1
numerator = xbar - pop_mean
denominator = pop_sd/sqrt(n)
t = numerator/denominator
#### now we have t value
crit_value = qt(p = alpha, df = df, lower.tail = tail_option)
# using quantile function with t distribution to get critical value
results = rbind(t, crit_value)
return(results)
}
help(qt)
t_test = one_sample_t_no_data(n = n,
xbar = new_drug_xbar,
pop_mean = old_drug_xbar,
pop_sd = old_drug_sd,
alpha = alpha,
tail_option = FALSE)
# tail option is FALSE as we are testing the "researchers' belief", which is specifically that new drug's mean is MORE than the current standard
rownames(t_test) = c("T Value", "Critical Value")
colnames(t_test) = NULL
kable(round(t_test,4),align = "c",
caption = "<span style='color:##000000;'>
T-Test Results </span>") %>%
kable_styling(
bootstrap_options = c("striped", "bordered"),
full_width = FALSE,
position = "center")
T-Test Results
|
|
|
|
T Value
|
1.8856
|
|
Critical Value
|
1.6766
|
Looking at our test output, we are lead to believe that there is
significant reason to believe that CholestFix does reduce LDL
cholesterol, and does so to a more effective degree than the current
market-standard. Using a T distribution, our sample data’s standardized
value is about 0.209 units greater than that of the market-standard. In
other words, we reject the null hypothesis in this
instance.
b.) Power Analysis (Current Conditions)
Now knowing that there appears to be statistical significance to our
sample data’s greater reduction in LDL cholesterol, we assess the power
of our findings. Statistical power can be defined as the probability of
rejecting the null hypothesis (or default assumption) IF the alternative
is actually true. To use criminal justice analogously, power is
essentially the probability of convicting someone on trial who truly did
commit the crime they are accused of. Power is bounded between (0 and
100)%, and generally it is the goal of a researcher to achieve power of
at least 80%.
## reference section 6.5
effect_size = 4
# "probability we'd detect a true improvement" = Power
power_test = power.t.test(n = n,
delta = effect_size,
# delta argument within the function is the "true difference in means" which we belive to be 4
sd = old_drug_sd,
# sd argument is for the assumed POPULATION/baseline standard deviation
sig.level = alpha,
type ="one.sample",
alternative = "one.sided"
)
partb_power = power_test$power # = 0.5849737
There are numerous factors that go into the calculation of power,
including what type of statistical test we are running, our sample size,
sample statistics, population parameters and such. As previously noted,
we have a sample size of 50, a population standard deviation of 15 mg/dL
and are operating with a Type I error rate (\(\alpha\)) of 0.05. Additionally, the effect
size of our experiment (often denoted as \(\delta\)) is equal to 4 as that is the
difference between our sample mean of LDL reduction and what is
market-standard.
Given these conditions, I used R’s power.t.test() function to calculate the
power of this specific analysis (ie the probability that we would detect
an improvement in LDL reduction if one genuinely existed).
Unfortunately, our current power is only about 58.5%, a
far cry from the 80% that is generally desired.
In the future, if our pharmaceutical partners wanted to conduct a
similar experiment with a greater degree of power, they could achieve
such by garnering a larger sample size and/or operating under a more
liberal confidence level. In other words, sample size and power are
positively correlated while confidence and power are inversely
related.
c.) Sample Size Determination
As mentioned above, power, sample size, confidence and effect size
are all interdependent. Below, I once again use R’s power.t.test() function, this time from the
perspective of searching for a necessary sample size.
partc_power = 0.8
# same function as part b, this time replace input for n argument with input for power argument
sample_size_test = power.t.test(power = partc_power,
delta = effect_size,
sd = old_drug_sd,
sig.level = alpha,
type ="one.sample",
alternative = "one.sided"
)
desired_n = sample_size_test$n
In a theoretical future study of CholestFix, if we were to maintain a
confidence level of 95% (ie \(\alpha\)
= 0.05), still have our sample data show us an effect size of 4, a
sample mean of 29 and a sample standard deviation of 15 we would need a
sample size of at least 89 subjects.
Per our calculations, the required sample size is technically about
88.31, however we can obviously not have a proportion of an individual
person participate in our study. In minimum-based calculations like
these, we must always round up despite conventional mathematics
rounding a value like this one down.
d.) Power Analysis W/ Theoretical Sample Sizes
To further analyze the relationship between sample size and power of
experiment, I used a custom function in R to generate the power of a
one-sample t-test (with the same characteristics of the experiment that
our pharmaceutical partner previously did) with sample sizes iterating
by 1, starting from 50 and ending at 200. A resulting plot of this data
is below.
# let variable x denote the different sample sizes that we are testing for power results
x = seq(from = 50, to = 200, by = 1)
# START CUSTOM FUNCTION
find_power = function(x, effect_size, pop_sd, alpha, test_type, alt){
power_results = numeric(length(x))
# START FOR LOOP
for (i in min(x):max(x)){
power_sample = power.t.test(n = x,
delta = effect_size,
sd = pop_sd,
sig.level = alpha,
type = test_type,
alternative = alt
)
## will put results in data frame format for easier analysis
power_results_n = cbind(power_sample$n)
power_results_power = cbind(power_sample$power)
results = cbind(power_results_n, power_results_power)
colnames(results) = c("n", "power")
} # END FOR LOOP
return(results)
} # END CUSTOM FUNCTION
power_curve_data = find_power(x = x,
effect_size = effect_size,
pop_sd = old_drug_sd,
alpha = alpha,
test_type = "one.sample",
alt = "one.sided")
power_curve_data = data.frame(power_curve_data)
lin_model = lm(power_curve_data$power ~ power_curve_data$n)
ggplot(data = power_curve_data) +
geom_point(mapping = aes(x = n, y = power)) +
geom_hline(yintercept = 0.8,
color = "red",
linewidth = 1) +
# using geom_hline to point out the threshold between values that do and don't achieve ideal power
geom_hline(yintercept = 0.9,
color = "blue",
linewidth = 1) +
labs(title = "Sample Size and Power Relationship",
x = "Sample Size (n)",
y = "Power (0 - 1 Scale)")

As we can see, the benchmark threshold of 80% power is crossed once
our sample size reaches just below 90 subjects. If we are to hold
ourselves to an even stricter standard and attempt to achieve 90% power,
while holding all other elements of our experiment (like confidence
level for example) constant, then we would need at least 122 subjects to
participate.
LS0tCnRpdGxlOiAiSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3N0LUFuYWx5c2lzIFcvIFQtVGVzdCIKYXV0aG9yOiAiQ2hyaXMgQmFobSIKZGF0ZTogIkFwcmlsIDQsIDIwMjYiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ193aWR0aDogNgogICAgZmlnX2hlaWdodDogNAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGx1bWVuCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgoKaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbgogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuCgppZiAoIXJlcXVpcmUodGlkeXZlcnNlKSkge2xpYnJhcnkodGlkeXZzZXJzZSl9IAoKaWYgKCFyZXF1aXJlKEdHYWxseSkpIHtsaWJyYXJ5KEdHYWxseSl9IAoKaWYgKCFyZXF1aXJlKGthYmxlRXh0cmEpKSB7bGlicmFyeShrYWJsZUV4dHJhKX0gCgppZiAoIXJlcXVpcmUoZ2dwbG90MikpIHtsaWJyYXJ5KGdncGxvdDIpfSAKCmlmICghcmVxdWlyZShjYXIpKSB7bGlicmFyeShjYXIpfSAKCmlmICghcmVxdWlyZShkcGx5cikpIHtsaWJyYXJ5KGRwbHlyKX0gCgppZiAoIXJlcXVpcmUocGFuZGVyKSkge2xpYnJhcnkocGFuZGVyKX0gCgppZiAoIXJlcXVpcmUoZm9yZWNhc3QpKSB7bGlicmFyeShmb3JlY2FzdCl9IAoKaWYgKCFyZXF1aXJlKGx1YnJpZGF0ZSkpIHtsaWJyYXJ5KGx1YnJpZGF0ZSl9IAoKaWYgKCFyZXF1aXJlKCJzY2FsZXMiKSkgewppbnN0YWxsLnBhY2thZ2VzKCJzY2FsZXMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKbGlicmFyeSgic2NhbGVzIikgCn0KCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKCWVjaG8gPSBUUlVFLAoJbWVzc2FnZSA9IEZBTFNFLAoJd2FybmluZyA9IEZBTFNFLAoJY29tbWVudCA9IE5BLAoJcmVzdWx0cyA9IFRSVUUsCglmaWcuYWxpZ24gPSAiY2VudGVyIgopCmBgYAoKYGBge3J9CiMjIHN0YXJ0IGJ5IGNvZGluZyBpbiBnaXZlbiB2YWx1ZXMgZnJvbSBpbnN0cnVjdGlvbnMKICAjIERJU0NMQUlNRVI6IEkgYW0gYXNzdW1pbmcgdGhlcmUgaXMgYSB0eXBvIGluIHRoZSBvcGVuaW5nIHBhcmFncmFwaCBvZiB0aGUgYXNzaWdubWVudC4gSSBhbSBzZXR0aW5nIHNhbXBsZSBzaXplIHRvIDUwLCBub3QgNS4KbiA9IDUwCgojIG9sZF9kcnVnID0gd2hhdCdzIGN1cnJlbnRseSBvbiBtYXJrZXQKb2xkX2RydWdfeGJhciA9IDI1ICNtZy9kbApvbGRfZHJ1Z19zZCA9IDE1ICNtZy9kbAoKIyBuZXdfZHJ1ZyA9IENob2xlc3RGaXgKbmV3X2RydWdfeGJhciA9IDI5ICNtZy9kbApuZXdfZHJ1Z19zZCA9IDE1ICNtZy9kbApgYGAKCiMgSW50cm8gYW5kIFNldHVwCkZvciB0b2RheSdzIGFuYWx5c2lzIHdlIGhhdmUgYmVlbiBjb250YWN0ZWQgYnkgYSBwaGFybWFjZXV0aWNhbCBjb21wYW55IHdobyBoYXMgZGV2ZWxvcGVkIGEgZHJ1ZyB0aGV5IGFyZSBjYWxsaW5nICpDaG9sZXN0Rml4Kiwgd2hvc2UgZ29hbCBpcyB0byByZWR1Y2UgTERMIGNob2xlc3Rlcm9sLiBXaGlsZSB3ZSB3ZXJlIG5vdCBwcm92aWRlZCBhY2Nlc3MgdG8gdGhlIGRhdGFzZXQgaXRzZWxmLCB3ZSB3ZXJlIHN0aWxsIGdpdmVuIGVub3VnaCB2YWx1YWJsZSBpbmZvcm1hdGlvbiB0byBhc3Nlc3MgaG93IGVmZmVjdGl2ZSBDaG9sZXN0Rml4IGlzIGluIGNvbXBhcmlzb24gdG8gdGhlIGN1cnJlbnQgTERMLWZpZ2h0aW5nIGRydWdzIG9uIHRoZSBtYXJrZXRwbGFjZSAod2hhdCB3ZSB3aWxsIHJlZmVyIHRvIGFzIG1hcmtldC1zdGFuZGFyZCkuCgpUaGUgbWFya2V0LXN0YW5kYXJkIHNlZXMgYW4gYXZlcmFnZSBMREwgcmVkdWN0aW9uIG9mIGByIG9sZF9kcnVnX3hiYXJgIG1nL2RMIHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgb2xkX2RydWdfc2RgIG1nL2RMLiBIb3dldmVyLCB0aGUgdGhyZWUtbW9udGggc3R1ZHkgY29uZHVjdGVkIGJ5IG91ciBwaGFybWEgY29tcGFueSwgd2l0aCBhIHNhbXBsZSBzaXplIG9mIGByIG5gIHBhdGllbnRzLCBzaG93ZWQgYSBtZWFuIExETCByZWR1Y3Rpb24gaW4gcGF0aWVudHMgd2hvIHRvb2sgQ2hvbGVzdEZpeCBvZiBgciBuZXdfZHJ1Z194YmFyYCBtZy9kTC4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3Igc3ViamVjdHMgZ2l2ZW4gQ2hvbGVzdEZpeCB3YXMgYWxzbyBgciBuZXdfZHJ1Z19zZGAgbWcvZEwgdGhvdWdoLgoKIyBhLikgSW5pdGlhbCBIeXBvdGhlc2lzIFRlc3QKR2l2ZW4gdGhpcyBhdmFpbGFibGUgaW5mb3JtYXRpb24sIHRoZSBmaXJzdCBzdGVwIEkgcGVyZm9ybWVkIHdhcyBhIG9uZS1zYW1wbGUgdC10ZXN0LiBUaGlzIGh5cG90aGVzaXMgdGVzdCBpcyByZWxldmFudCBhcyB3ZSBhcmUgY29tcGFyaW5nIHRoZSBtZWFuIG9mIG9uZSB0ZXN0IHNhbXBsZSAodGhlIGByIG5gIHBhdGllbnRzIHdobyB0b29rIENob2xlc3RGaXgpIHRvIHRoZSBtZWFuIG9mIGEgbW9yZSBnZW5lcmFsIG9yIGJyb2FkbHkgYWNjZXB0ZWQgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgKHRoZSBtYXJrZXQtc3RhbmRhcmQgcGhhcm1hY2V1dGljYWwgb3B0aW9uKS4KClRlY2huaWNhbGx5IHNwZWFraW5nLCBjYWxjdWxhdGlvbnMgd2VyZSBwZXJmb3JtZWQgdmlhIGEgY3VzdG9tLWJ1aWx0IFIgZnVuY3Rpb24gYW5kIGNvbmR1Y3RlZCB3aXRoIGEgY29uZmlkZW5jZSBsZXZlbCBvZiA5NSUuIEkgY2hvc2UgdG8gc2V0ICRcYWxwaGEkID0gdG8gMC4wNSBhcyB0aGF0IGlzIGdlbmVyYWxseSBjb25zaWRlcmVkIGluZHVzdHJ5IHN0YW5kYXJkLiBSZXN1bHRzIGFyZSBiZWxvdy4KYGBge3J9CiMgd2lsbCB1c2UgYSBvbmUtc2FtcGxlIHQgdGVzdAogICMgb25seSBoYXZlIG9uZSBzYW1wbGUsIHRoZSBvbGRfZHJ1ZyBzdGF0cyBhcmUgdGhlIHBvcHVsYXRpb24gKG9yIGJhc2VsaW5lKSBmb3Igd2hpY2ggd2UgYXJlIGNvbXBhcmluZyB0b28KCiMgbmVlZCBzYW1wbGUgZGF0YSB0byB1c2UgUidzIHQudGVzdCBmdW5jdGlvbiwgd2UgZG9uJ3QgaGF2ZSBzYW1wbGUgZGF0YSBzbyB3aWxsIGJlIGRvaW5nIG1hbnVhbCBjYWxjdWxhdGlvbgogICMgdCB2YWx1ZSBmb3JtdWxhIGZyb20gU2VjIDMuMSBzdGVwIDMKYWxwaGEgPSAwLjA1CgoKb25lX3NhbXBsZV90X25vX2RhdGEgPSBmdW5jdGlvbihuLCB4YmFyLCBwb3BfbWVhbiwgcG9wX3NkLCBhbHBoYSwgdGFpbF9vcHRpb24pewogIGRmID0gbiAtIDEKICBudW1lcmF0b3IgPSB4YmFyIC0gcG9wX21lYW4KICBkZW5vbWluYXRvciA9IHBvcF9zZC9zcXJ0KG4pCiAgdCA9IG51bWVyYXRvci9kZW5vbWluYXRvcgogIyMjIyBub3cgd2UgaGF2ZSB0IHZhbHVlCiAgCiAgY3JpdF92YWx1ZSA9IHF0KHAgPSBhbHBoYSwgZGYgPSBkZiwgbG93ZXIudGFpbCA9IHRhaWxfb3B0aW9uKQogICAgIyB1c2luZyBxdWFudGlsZSBmdW5jdGlvbiB3aXRoIHQgZGlzdHJpYnV0aW9uIHRvIGdldCBjcml0aWNhbCB2YWx1ZQogIHJlc3VsdHMgPSByYmluZCh0LCBjcml0X3ZhbHVlKQogIAogIHJldHVybihyZXN1bHRzKQp9CmhlbHAocXQpCgp0X3Rlc3QgPSBvbmVfc2FtcGxlX3Rfbm9fZGF0YShuID0gbiwgCiAgICAgICAgICAgICAgICAgICAgIHhiYXIgPSBuZXdfZHJ1Z194YmFyLCAKICAgICAgICAgICAgICAgICAgICAgcG9wX21lYW4gPSBvbGRfZHJ1Z194YmFyLAogICAgICAgICAgICAgICAgICAgICBwb3Bfc2QgPSBvbGRfZHJ1Z19zZCwKICAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBhbHBoYSwKICAgICAgICAgICAgICAgICAgICAgdGFpbF9vcHRpb24gPSBGQUxTRSkKICAgICAgICAgICAgICAgICAgICAgICMgdGFpbCBvcHRpb24gaXMgRkFMU0UgYXMgd2UgYXJlIHRlc3RpbmcgdGhlICJyZXNlYXJjaGVycycgYmVsaWVmIiwgd2hpY2ggaXMgc3BlY2lmaWNhbGx5IHRoYXQgbmV3IGRydWcncyBtZWFuIGlzIE1PUkUgdGhhbiB0aGUgY3VycmVudCBzdGFuZGFyZAoKcm93bmFtZXModF90ZXN0KSA9IGMoIlQgVmFsdWUiLCAiQ3JpdGljYWwgVmFsdWUiKQpjb2xuYW1lcyh0X3Rlc3QpID0gTlVMTAoKa2FibGUocm91bmQodF90ZXN0LDQpLGFsaWduID0gImMiLAogICAgICBjYXB0aW9uID0gIjxzcGFuIHN0eWxlPSdjb2xvcjojIzAwMDAwMDsnPgogICAgICBULVRlc3QgUmVzdWx0cyA8L3NwYW4+IikgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJib3JkZXJlZCIpLAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgcG9zaXRpb24gPSAiY2VudGVyIikKCmBgYAoKTG9va2luZyBhdCBvdXIgdGVzdCBvdXRwdXQsIHdlIGFyZSBsZWFkIHRvIGJlbGlldmUgdGhhdCB0aGVyZSBpcyAqc2lnbmlmaWNhbnQqIHJlYXNvbiB0byBiZWxpZXZlIHRoYXQgQ2hvbGVzdEZpeCBkb2VzIHJlZHVjZSBMREwgY2hvbGVzdGVyb2wsIGFuZCBkb2VzIHNvIHRvIGEgbW9yZSBlZmZlY3RpdmUgZGVncmVlIHRoYW4gdGhlIGN1cnJlbnQgbWFya2V0LXN0YW5kYXJkLiBVc2luZyBhIFQgZGlzdHJpYnV0aW9uLCBvdXIgc2FtcGxlIGRhdGEncyBzdGFuZGFyZGl6ZWQgdmFsdWUgaXMgYWJvdXQgYHIgcm91bmQodF90ZXN0WzFdLDQpIC0gcm91bmQodF90ZXN0WzJdLDQpYCB1bml0cyBncmVhdGVyIHRoYW4gdGhhdCBvZiB0aGUgbWFya2V0LXN0YW5kYXJkLiBJbiBvdGhlciB3b3Jkcywgd2UgKipyZWplY3QqKiB0aGUgbnVsbCBoeXBvdGhlc2lzIGluIHRoaXMgaW5zdGFuY2UuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KCiMjIFRlc3QgdXNpbmcgc2ltdWxhdGVkIGRhdGEgYW5kIGJ1aWx0LWluIFIgZnVuY3Rpb24Kc2V0LnNlZWQoMTIzKQpzaW1fZGF0YSA9IHJub3JtKG4gPSA1MCwgbWVhbiA9IG5ld19kcnVnX3hiYXIsIHNkID0gbmV3X2RydWdfc2QpCnNpbV9kYXRhX3Rlc3QgPSB0LnRlc3Qoc2ltX2RhdGEsIG11ID0gb2xkX2RydWdfeGJhciwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpCnNpbV9kYXRhX3Rlc3QKc2ltX2RhdGFfdGVzdCRzdGF0aXN0aWMKICAjIHQgdGVzdCByZXN1bHRzIHZhcnkgV0lMRExZLCB1c2UgYSBib290c3RyYXAKCmJvb3RzdHJhcF9zaW0gPSBmdW5jdGlvbihkYXRhLCBiLCBtdSwgbWV0aG9kKXsKICBuID0gbGVuZ3RoKGRhdGEpCiAgYm9vdHN0cmFwX3RfZXN0aW1hdGVzID0gbnVtZXJpYyhiKQogIAogICMgU1RBUlQgRk9SIExPT1AKICAgIGZvciAoaSBpbiAxOmIpewogICAgICBib290X3NhbXBsZSA9IHNhbXBsZShkYXRhLCBzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpCiAgICAgIAogICAgICB0X3Rlc3RzID0gdC50ZXN0KGJvb3Rfc2FtcGxlLCBtdSA9IG11LCBhbHRlcm5hdGl2ZSA9IG1ldGhvZCkKICAgICAgYm9vdHN0cmFwX3RfZXN0aW1hdGVzW2ldID0gdF90ZXN0cyRzdGF0aXN0aWMKICAgIH0gIyBFTkQgRk9SIExPT1AKICAKICByZXR1cm4oYm9vdHN0cmFwX3RfZXN0aW1hdGVzKQp9CgpzaW1fZGF0YV90ID0gYm9vdHN0cmFwX3NpbShkYXRhID0gc2ltX2RhdGEsIGIgPSA1MDAsIG11ID0gb2xkX2RydWdfeGJhciwgbWV0aG9kID0gImdyZWF0ZXIiKQoKbWVhbihzaW1fZGF0YV90KQoKYGBgCgojIGIuKSBQb3dlciBBbmFseXNpcyAoQ3VycmVudCBDb25kaXRpb25zKQpOb3cga25vd2luZyB0aGF0IHRoZXJlIGFwcGVhcnMgdG8gYmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHRvIG91ciBzYW1wbGUgZGF0YSdzIGdyZWF0ZXIgcmVkdWN0aW9uIGluIExETCBjaG9sZXN0ZXJvbCwgd2UgYXNzZXNzIHRoZSBwb3dlciBvZiBvdXIgZmluZGluZ3MuIFN0YXRpc3RpY2FsIHBvd2VyIGNhbiBiZSBkZWZpbmVkIGFzIHRoZSBwcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAob3IgZGVmYXVsdCBhc3N1bXB0aW9uKSBJRiB0aGUgYWx0ZXJuYXRpdmUgaXMgYWN0dWFsbHkgdHJ1ZS4gVG8gdXNlIGNyaW1pbmFsIGp1c3RpY2UgYW5hbG9nb3VzbHksIHBvd2VyIGlzIGVzc2VudGlhbGx5IHRoZSBwcm9iYWJpbGl0eSBvZiBjb252aWN0aW5nIHNvbWVvbmUgb24gdHJpYWwgd2hvIHRydWx5IGRpZCBjb21taXQgdGhlIGNyaW1lIHRoZXkgYXJlIGFjY3VzZWQgb2YuIFBvd2VyIGlzIGJvdW5kZWQgYmV0d2VlbiAoMCBhbmQgMTAwKSUsIGFuZCBnZW5lcmFsbHkgaXQgaXMgdGhlIGdvYWwgb2YgYSByZXNlYXJjaGVyIHRvIGFjaGlldmUgcG93ZXIgb2YgYXQgbGVhc3QgODAlLiAKCmBgYHtyfQojIyByZWZlcmVuY2Ugc2VjdGlvbiA2LjUKCmVmZmVjdF9zaXplID0gNAojICJwcm9iYWJpbGl0eSB3ZSdkIGRldGVjdCBhIHRydWUgaW1wcm92ZW1lbnQiID0gUG93ZXIKCnBvd2VyX3Rlc3QgPSBwb3dlci50LnRlc3QobiA9IG4sCiAgICAgICAgICAgICBkZWx0YSA9IGVmZmVjdF9zaXplLAogICAgICAgICAgICAgICMgZGVsdGEgYXJndW1lbnQgd2l0aGluIHRoZSBmdW5jdGlvbiBpcyB0aGUgInRydWUgZGlmZmVyZW5jZSBpbiBtZWFucyIgd2hpY2ggd2UgYmVsaXZlIHRvIGJlIDQKICAgICAgICAgICAgIHNkID0gb2xkX2RydWdfc2QsCiAgICAgICAgICAgICAjIHNkIGFyZ3VtZW50IGlzIGZvciB0aGUgYXNzdW1lZCBQT1BVTEFUSU9OL2Jhc2VsaW5lIHN0YW5kYXJkIGRldmlhdGlvbgogICAgICAgICAgICAgc2lnLmxldmVsID0gYWxwaGEsCiAgICAgICAgICAgICB0eXBlID0ib25lLnNhbXBsZSIsCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJvbmUuc2lkZWQiCiAgICAgICAgICAgICApCgpwYXJ0Yl9wb3dlciA9IHBvd2VyX3Rlc3QkcG93ZXIgIyA9IDAuNTg0OTczNwpgYGAKVGhlcmUgYXJlIG51bWVyb3VzIGZhY3RvcnMgdGhhdCBnbyBpbnRvIHRoZSBjYWxjdWxhdGlvbiBvZiBwb3dlciwgaW5jbHVkaW5nIHdoYXQgdHlwZSBvZiBzdGF0aXN0aWNhbCB0ZXN0IHdlIGFyZSBydW5uaW5nLCBvdXIgc2FtcGxlIHNpemUsIHNhbXBsZSBzdGF0aXN0aWNzLCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMgYW5kIHN1Y2guIEFzIHByZXZpb3VzbHkgbm90ZWQsIHdlIGhhdmUgYSBzYW1wbGUgc2l6ZSBvZiBgciBuYCwgYSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBgciBvbGRfZHJ1Z19zZGAgbWcvZEwgYW5kIGFyZSBvcGVyYXRpbmcgd2l0aCBhIFR5cGUgSSBlcnJvciByYXRlICgkXGFscGhhJCkgb2YgYHIgYWxwaGFgLiBBZGRpdGlvbmFsbHksIHRoZSBlZmZlY3Qgc2l6ZSBvZiBvdXIgZXhwZXJpbWVudCAob2Z0ZW4gZGVub3RlZCBhcyAkXGRlbHRhJCkgaXMgZXF1YWwgdG8gYHIgZWZmZWN0X3NpemVgIGFzIHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBvdXIgc2FtcGxlIG1lYW4gb2YgTERMIHJlZHVjdGlvbiBhbmQgd2hhdCBpcyBtYXJrZXQtc3RhbmRhcmQuCgpHaXZlbiB0aGVzZSBjb25kaXRpb25zLCBJIHVzZWQgUidzIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlOyI+cG93ZXIudC50ZXN0KCk8L3NwYW4+IGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgcG93ZXIgb2YgdGhpcyBzcGVjaWZpYyBhbmFseXNpcyAoaWUgdGhlIHByb2JhYmlsaXR5IHRoYXQgd2Ugd291bGQgZGV0ZWN0IGFuIGltcHJvdmVtZW50IGluIExETCByZWR1Y3Rpb24gaWYgb25lIGdlbnVpbmVseSBleGlzdGVkKS4gVW5mb3J0dW5hdGVseSwgb3VyIGN1cnJlbnQgcG93ZXIgaXMgb25seSBhYm91dCAqKmByIHJvdW5kKHBhcnRiX3Bvd2VyLDQpKjEwMGAlKiosIGEgZmFyIGNyeSBmcm9tIHRoZSA4MCUgdGhhdCBpcyBnZW5lcmFsbHkgZGVzaXJlZC4KCkluIHRoZSBmdXR1cmUsIGlmIG91ciBwaGFybWFjZXV0aWNhbCBwYXJ0bmVycyB3YW50ZWQgdG8gY29uZHVjdCBhIHNpbWlsYXIgZXhwZXJpbWVudCB3aXRoIGEgZ3JlYXRlciBkZWdyZWUgb2YgcG93ZXIsIHRoZXkgY291bGQgYWNoaWV2ZSBzdWNoIGJ5IGdhcm5lcmluZyBhIGxhcmdlciBzYW1wbGUgc2l6ZSBhbmQvb3Igb3BlcmF0aW5nIHVuZGVyIGEgbW9yZSBsaWJlcmFsIGNvbmZpZGVuY2UgbGV2ZWwuIEluIG90aGVyIHdvcmRzLCBzYW1wbGUgc2l6ZSBhbmQgcG93ZXIgYXJlIHBvc2l0aXZlbHkgY29ycmVsYXRlZCB3aGlsZSBjb25maWRlbmNlIGFuZCBwb3dlciBhcmUgaW52ZXJzZWx5IHJlbGF0ZWQuCgojIGMuKSBTYW1wbGUgU2l6ZSBEZXRlcm1pbmF0aW9uCkFzIG1lbnRpb25lZCBhYm92ZSwgcG93ZXIsIHNhbXBsZSBzaXplLCBjb25maWRlbmNlIGFuZCBlZmZlY3Qgc2l6ZSBhcmUgYWxsIGludGVyZGVwZW5kZW50LiBCZWxvdywgSSBvbmNlIGFnYWluIHVzZSBSJ3MgPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWU7Ij5wb3dlci50LnRlc3QoKTwvc3Bhbj4gZnVuY3Rpb24sIHRoaXMgdGltZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiBzZWFyY2hpbmcgZm9yIGEgbmVjZXNzYXJ5IHNhbXBsZSBzaXplLgoKYGBge3J9CnBhcnRjX3Bvd2VyID0gMC44CgojIHNhbWUgZnVuY3Rpb24gYXMgcGFydCBiLCB0aGlzIHRpbWUgcmVwbGFjZSBpbnB1dCBmb3IgbiBhcmd1bWVudCB3aXRoIGlucHV0IGZvciBwb3dlciBhcmd1bWVudApzYW1wbGVfc2l6ZV90ZXN0ID0gcG93ZXIudC50ZXN0KHBvd2VyID0gcGFydGNfcG93ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBlZmZlY3Rfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IG9sZF9kcnVnX3NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbCA9IGFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSJvbmUuc2FtcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSA9ICJvbmUuc2lkZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKZGVzaXJlZF9uID0gc2FtcGxlX3NpemVfdGVzdCRuCmBgYAoKSW4gYSB0aGVvcmV0aWNhbCBmdXR1cmUgc3R1ZHkgb2YgQ2hvbGVzdEZpeCwgaWYgd2Ugd2VyZSB0byBtYWludGFpbiBhIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTUlIChpZSAkXGFscGhhJCA9IGByIGFscGhhYCksIHN0aWxsIGhhdmUgb3VyIHNhbXBsZSBkYXRhIHNob3cgdXMgYW4gZWZmZWN0IHNpemUgb2YgYHIgZWZmZWN0X3NpemVgLCBhIHNhbXBsZSBtZWFuIG9mIGByIG5ld19kcnVnX3hiYXJgIGFuZCBhIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYHIgbmV3X2RydWdfc2RgIHdlIHdvdWxkIG5lZWQgYSBzYW1wbGUgc2l6ZSBvZiBhdCBsZWFzdCAqKjg5IHN1YmplY3RzKiouCgpQZXIgb3VyIGNhbGN1bGF0aW9ucywgdGhlIHJlcXVpcmVkIHNhbXBsZSBzaXplIGlzIHRlY2huaWNhbGx5IGFib3V0IGByIHJvdW5kKGRlc2lyZWRfbiwyKWAsIGhvd2V2ZXIgd2UgY2FuIG9idmlvdXNseSBub3QgaGF2ZSBhIHByb3BvcnRpb24gb2YgYW4gaW5kaXZpZHVhbCBwZXJzb24gcGFydGljaXBhdGUgaW4gb3VyIHN0dWR5LiBJbiBtaW5pbXVtLWJhc2VkIGNhbGN1bGF0aW9ucyBsaWtlIHRoZXNlLCB3ZSBtdXN0IGFsd2F5cyByb3VuZCAqdXAqIGRlc3BpdGUgY29udmVudGlvbmFsIG1hdGhlbWF0aWNzIHJvdW5kaW5nIGEgdmFsdWUgbGlrZSB0aGlzIG9uZSBkb3duLgoKIyBkLikgUG93ZXIgQW5hbHlzaXMgVy8gVGhlb3JldGljYWwgU2FtcGxlIFNpemVzClRvIGZ1cnRoZXIgYW5hbHl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc2FtcGxlIHNpemUgYW5kIHBvd2VyIG9mIGV4cGVyaW1lbnQsIEkgdXNlZCBhIGN1c3RvbSBmdW5jdGlvbiBpbiBSIHRvIGdlbmVyYXRlIHRoZSBwb3dlciBvZiBhIG9uZS1zYW1wbGUgdC10ZXN0ICh3aXRoIHRoZSBzYW1lIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZXhwZXJpbWVudCB0aGF0IG91ciBwaGFybWFjZXV0aWNhbCBwYXJ0bmVyIHByZXZpb3VzbHkgZGlkKSB3aXRoIHNhbXBsZSBzaXplcyBpdGVyYXRpbmcgYnkgMSwgc3RhcnRpbmcgZnJvbSA1MCBhbmQgZW5kaW5nIGF0IDIwMC4gQSByZXN1bHRpbmcgcGxvdCBvZiB0aGlzIGRhdGEgaXMgYmVsb3cuCgpgYGB7cn0KIyBsZXQgdmFyaWFibGUgeCBkZW5vdGUgdGhlIGRpZmZlcmVudCBzYW1wbGUgc2l6ZXMgdGhhdCB3ZSBhcmUgdGVzdGluZyBmb3IgcG93ZXIgcmVzdWx0cwp4ID0gc2VxKGZyb20gPSA1MCwgdG8gPSAyMDAsIGJ5ID0gMSkKCiMgU1RBUlQgQ1VTVE9NIEZVTkNUSU9OCmZpbmRfcG93ZXIgPSBmdW5jdGlvbih4LCBlZmZlY3Rfc2l6ZSwgcG9wX3NkLCBhbHBoYSwgdGVzdF90eXBlLCBhbHQpewogIHBvd2VyX3Jlc3VsdHMgPSBudW1lcmljKGxlbmd0aCh4KSkKICAKICAjIFNUQVJUIEZPUiBMT09QCiAgZm9yIChpIGluIG1pbih4KTptYXgoeCkpewogICAgcG93ZXJfc2FtcGxlID0gcG93ZXIudC50ZXN0KG4gPSB4LAogICAgICAgICAgICAgZGVsdGEgPSBlZmZlY3Rfc2l6ZSwKICAgICAgICAgICAgIHNkID0gcG9wX3NkLAogICAgICAgICAgICAgc2lnLmxldmVsID0gYWxwaGEsCiAgICAgICAgICAgICB0eXBlID0gdGVzdF90eXBlLAogICAgICAgICAgICAgYWx0ZXJuYXRpdmUgPSBhbHQKICAgICAgICAgICAgICkKICAgIAogICAgIyMgd2lsbCBwdXQgcmVzdWx0cyBpbiBkYXRhIGZyYW1lIGZvcm1hdCBmb3IgZWFzaWVyIGFuYWx5c2lzCiAgICBwb3dlcl9yZXN1bHRzX24gPSBjYmluZChwb3dlcl9zYW1wbGUkbikKICAgIHBvd2VyX3Jlc3VsdHNfcG93ZXIgPSBjYmluZChwb3dlcl9zYW1wbGUkcG93ZXIpCiAgICByZXN1bHRzID0gY2JpbmQocG93ZXJfcmVzdWx0c19uLCBwb3dlcl9yZXN1bHRzX3Bvd2VyKQogICAgY29sbmFtZXMocmVzdWx0cykgPSBjKCJuIiwgInBvd2VyIikKICAgIAogIH0gIyBFTkQgRk9SIExPT1AKICAKICByZXR1cm4ocmVzdWx0cykKfSAjIEVORCBDVVNUT00gRlVOQ1RJT04KCnBvd2VyX2N1cnZlX2RhdGEgPSBmaW5kX3Bvd2VyKHggPSB4LAogICAgICAgICAgIGVmZmVjdF9zaXplID0gZWZmZWN0X3NpemUsCiAgICAgICAgICAgcG9wX3NkID0gb2xkX2RydWdfc2QsCiAgICAgICAgICAgYWxwaGEgPSBhbHBoYSwKICAgICAgICAgICB0ZXN0X3R5cGUgPSAib25lLnNhbXBsZSIsCiAgICAgICAgICAgYWx0ID0gIm9uZS5zaWRlZCIpCgpwb3dlcl9jdXJ2ZV9kYXRhID0gZGF0YS5mcmFtZShwb3dlcl9jdXJ2ZV9kYXRhKQoKbGluX21vZGVsID0gbG0ocG93ZXJfY3VydmVfZGF0YSRwb3dlciB+IHBvd2VyX2N1cnZlX2RhdGEkbikKCmdncGxvdChkYXRhID0gcG93ZXJfY3VydmVfZGF0YSkgKwogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gbiwgeSA9IHBvd2VyKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjgsIAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgCiAgICAgICAgICAgICBsaW5ld2lkdGggPSAxKSArIAogICAgIyB1c2luZyBnZW9tX2hsaW5lIHRvIHBvaW50IG91dCB0aGUgdGhyZXNob2xkIGJldHdlZW4gdmFsdWVzIHRoYXQgZG8gYW5kIGRvbid0IGFjaGlldmUgaWRlYWwgcG93ZXIKICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjksIAogICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIAogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKICBsYWJzKHRpdGxlID0gIlNhbXBsZSBTaXplIGFuZCBQb3dlciBSZWxhdGlvbnNoaXAiLAogICAgICAgeCA9ICJTYW1wbGUgU2l6ZSAobikiLAogICAgICAgeSA9ICJQb3dlciAoMCAtIDEgU2NhbGUpIikgCmBgYAoKQXMgd2UgY2FuIHNlZSwgdGhlIGJlbmNobWFyayB0aHJlc2hvbGQgb2YgODAlIHBvd2VyIGlzIGNyb3NzZWQgb25jZSBvdXIgc2FtcGxlIHNpemUgcmVhY2hlcyBqdXN0IGJlbG93IDkwIHN1YmplY3RzLiBJZiB3ZSBhcmUgdG8gaG9sZCBvdXJzZWx2ZXMgdG8gYW4gZXZlbiBzdHJpY3RlciBzdGFuZGFyZCBhbmQgYXR0ZW1wdCB0byBhY2hpZXZlIDkwJSBwb3dlciwgd2hpbGUgaG9sZGluZyBhbGwgb3RoZXIgZWxlbWVudHMgb2Ygb3VyIGV4cGVyaW1lbnQgKGxpa2UgY29uZmlkZW5jZSBsZXZlbCBmb3IgZXhhbXBsZSkgY29uc3RhbnQsIHRoZW4gd2Ugd291bGQgbmVlZCBhdCBsZWFzdCAxMjIgc3ViamVjdHMgdG8gcGFydGljaXBhdGUuCg==