Assignment Objectives
Enhance understanding the logic and procedure of hypothesis
testing .
Implement the procedures for power and sample size calculation
for basic hypothesis testing procedures using nuilt-in function and
manual calculation.
**Simple versus Composite Hypothesis*
Simple Hypothesis
Simple Hypothesis Test is a hypothesis that
completely specifies the population distribution. Mathematically, simple
hypothesis fixes all parameters to specific values. For example, The
simple hypotheses are: \(H_0: \mu = 5\)
(if \(\alpha\) is known), \(H_0: \mu = 100, \sigma^2 = 25\), and \(H_1: p = 0.7\) for a Bernoulli
distribution.
Example Scenario Test if a coin is
fair:
\[
\begin{aligned}
H_0&: p = 0.5 \quad \text{(completely specified)} \\
H_1&: p = 0.6 \quad \text{(also completely specified)}
\end{aligned}
\]
Both are simple hypotheses.
Composite Hypothesis
Composite Hypothesis is a hypothesis that does
not completely specify the distribution. Mathematically, it allows a
range of values for at least one parameter. For example, in one-sided:
\(\mu >5\); in two-sided: \(\mu \le 5\).
Example Scenarios
$$
\[\begin{aligned}
&H_0: \mu = 5 && \text{(simple)} \\
&H_1: \mu > 5 && \text{(composite)}
\end{aligned}\]
\[\begin{aligned}
&H_0: \mu \leq 5 && \text{(composite)} \\
&H_1: \mu > 5 && \text{(composite)}
\end{aligned}\]
\[\begin{aligned}
&H_0: \text{data follows } N(\mu, 1), \mu = 0 &&
\text{(simple)} \\
&H_1: \text{data follows Poisson}(\lambda) &&
\text{(composite – different family)}
\end{aligned}\]
$$
This assignment focuses on performing
performing a test of mean (\(\mu\)) a
normal population and calculating the power and sample size based on
various assumptions
Question: New Cholesterol Medication
A pharmaceutical company develops “CholestFix” to
reduce Low-Density Lipoprotein (LDL, fat carrier that’s low in
density) cholesterol. The current standard drug
lowers LDL by an average of 25 mg/dL with a standard deviation of 15
mg/dL. A clinical trial with 5 participants were recruited in the study
for three months. At the end of the study, the mean reduction is 29
mg/dL. Assume that the variance of LDL reduction of new drug is the same
as that of the standard drugs.
Based on the results in the clinical trial, researchers in the company
believe
CholestFix is more effective.
a). Perform a formal hypothesis test of the researchers’ belief
regarding LDL reduction, using a significance level of \(\alpha = 0.05\).
Answer to Question 1 Part A:
The researchers in the example above are attempting to determine
whether or not CholestFix is more effective than the current standard
drug. That is, they are attempting to determine whether or not
CholestFix lowers LDL more than the current standard drug. Given this,
we know that the appropriate test for this setting is a right-tailed
t-test (given the small sample size of \(n=5\)). We can also identify the following
values: \(n=5, \bar{x}=29, s=15,
\mu_0=100,\) and \(\alpha=0.05\). First we will use R to get
the test statistic, p-value, and degrees of freedom for this setting and
then use the results to perform a formal hypotheses test.
set.seed(123) #Sets seed
simulated_drug <- rnorm(5, mean=29, sd=15) #Creates simulated data set using statistics from our setting
result <- t.test(simulated_drug, mu=25, alternative="greater")
#Performs t-test
print(result) #Prints t-test
One Sample t-test
data: simulated_drug
t = 1.2689, df = 4, p-value = 0.1366
alternative hypothesis: true mean is greater than 25
95 percent confidence interval:
20.30524 Inf
sample estimates:
mean of x
31.90355
For our setting, our null and alternative hypotheses are:
\[
H_0: \mu \le 25 \\
H_a: \mu >25
\]
That is, our null hypothesis is that CholestFix lowers LDL less than
or equal to the current standard drug and our alternative hypothesis is
that CholestFix lowers LDL more than the current standard drug.
Using the output above, we know our test statistic is \(t=1.2680\).
Next we can use R to determine our critical value and compare our
test statistic to our critical value.
alpha <- 0.05
df <- 4
critical_val <- qt(1-alpha, df)
print(critical_val)
[1] 2.131847
Based on the above output we know that our critical value for this
setting is 2.131847.
Given that our test statistic is less than our critical value (\(t=1.2680<2.131487\)) and our p-value is
greater than our \(\alpha\) (\(\text{p-value}=0.1366>0.05=\alpha\)) we
do not have enough evidence to reject our \(H_0\).
In context, this means that we do not have enough evidence (at the
0.05 significance level) to reject our null hypothesis that CholestFix
lowers LDL less than or equal to the current standard drug. Therefore,
we do not have enough evidence to indicate that CholestFix lowers LDL
more than the current standard drug.
b). Given \(n = 50, \sigma = 15, \alpha =
0.05\), and an effect size we wish to detect \(\delta = 4\) mg/dL (corresponding to a
reduction from 29 mg/dL to 25 mg/dL). What is the probability that we’d
detect a true improvement?
Answer to Question 1 Part B:
Given \(n = 50, \sigma = 15, \alpha =
0.05\) and an effect size of \(\delta=4\) that we wish to detect, we can
use R to determine the probability that we would detect a true
improvement:
power_calc <- power.t.test(n=50, #Power-test using above values
delta=4,
sd=15,
sig.level=0.05,
type="one.sample",
alternative="one.sided")
print(power_calc) #Prints results
One-sample t test power calculation
n = 50
delta = 4
sd = 15
sig.level = 0.05
power = 0.5849737
alternative = one.sided
Based on the above output, we know that power of this test where
\(n = 50, \sigma = 15, \alpha = 0.05\)
and \(\delta=4\) is \(\text{Power}=0.5849737\). Given that \(\text{Power}=P(\text{Reject } H_0 |H_a)\)
we know that the probability that we would detect a true improvement is
0.5849737.
c). Determine the minimum sample size required to detect an effect
size of 4 mg/dL with a power of \(1 - \beta =
0.8\) and a significance level of \(\alpha = 0.05\). Assume the standard
deviation of LDL reduction is 15 mg/dL.
Answer to Question 1 Part C:
Given \(\sigma = 15, \alpha = 0.05\)
and that we want a power of \(1-\beta=0.08\), we can use R to determine
the minimum sample size required to detect an effect size of \(\delta=4\):
sample_size <- power.t.test(power=0.8,
delta=4,
sd=15,
sig.level=0.05,
type="one.sample",
alternative="one.sided")
cat("\nRequired sample size for 80% power:", ceiling(sample_size$n))
Required sample size for 80% power: 89
Based on the above output we know that, given that \(\sigma = 15, \alpha = 0.05\) and \(\delta=4\), we need a sample size of at
least 89 if we want a power of \(1-\beta=0.80\). This means that we need a
sample size of at least 89 to detect a true improvement of 4 80% of the
time.
d).
Power curve: To assess the impact of sample size on
power, we can create a power function in terms of the sample size
\(n\) and use the remaining information from
part (b). Plot the power curve by selecting a sequence of sample sizes.
Answer to Question 1 Part D:
We can create a power curve by plotting the powers from a sequence of
sample size values (\(n\) values). We
are able to use the same method used in Part B and simply apply this
method to a sequence of values. Here we will use a sequence of \(n\) values from 1 to 500 in order to asses
the impact of sample size on power. We will also create a line that
indicates when \(\text{Power}=0.8\)
(the power we previously determined could be obtained from a sample size
of \(n=89\)).
n_range <- seq(1, 500)
powers <- sapply(n_range, function(n) {power.t.test(n=n, #Power-test using above values
delta=4,
sd=15,
sig.level=0.05,
type="one.sample",
alternative="one.sided")$power
})
plot(n_range, powers, type = "l", lwd=2, col = "red",
main = "Power Curve",
xlab = "Sample Size",
ylab = "Power")
abline(h=0.8, col="blue", lty=2)

Considering the power curve above, we can see that power increases
rapidly from \(n=1\) to \(n=89\). However, after \(n=89\) the growth significantly slows down.
This indicates that at a certain point, increasing the size of \(n\) doesn’t do a lot to increase the power
of the test. Practically, this means that when we are considering
increasing \(n\) to increase the power
of a test, there comes a point were the small additional power of the
test may not be worth the additional work and resources of increasing
the sample size.
Note: For each of the questions
above, write a short summary of what you observed, justify why your
analysis is valid, and interpret the results.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgOTogSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBhbmQgU2FtcGxlIHNpemUgRGV0ZXJtaW5hdGlvbiINCmF1dGhvcjogIkdyYWNlIExpcHBlcnQiDQpkYXRlOiAiIER1ZTogNC83LzIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQoNCmlmICghcmVxdWlyZSgiVkdBTSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKQ0KICBsaWJyYXJ5KFZHQU0pDQp9DQojIyMjIFZHQU0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQogXA0KIA0KIyMgKipBc3NpZ25tZW50IE9iamVjdGl2ZXMqKiANCg0KPHA+DQoqIEVuaGFuY2UgdW5kZXJzdGFuZGluZyB0aGUgbG9naWMgYW5kIHByb2NlZHVyZSBvZiBoeXBvdGhlc2lzIHRlc3RpbmcgLg0KDQoqIEltcGxlbWVudCB0aGUgcHJvY2VkdXJlcyBmb3IgcG93ZXIgYW5kIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGZvciBiYXNpYyBoeXBvdGhlc2lzIHRlc3RpbmcgcHJvY2VkdXJlcyB1c2luZyBudWlsdC1pbiBmdW5jdGlvbiBhbmQgbWFudWFsIGNhbGN1bGF0aW9uLg0KPC9wPg0KDQoNCiMjICoqUG9saWNpZXMgb2YgVXNpbmcgQUkgVG9vbHMqKg0KDQo8cD4NCioqUG9saWN5IG9uIEFJIFRvb2wgVXNlKio6IFBsZWFzZSBhZGhlcmUgdG8gdGhlIEFJIHRvb2wgcG9saWN5IHNwZWNpZmllZCBpbiB0aGUgY291cnNlIHN5bGxhYnVzLiBUaGUgZGlyZWN0IGNvcHlpbmcgb2YgQUktZ2VuZXJhdGVkIGNvbnRlbnQgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gQWxsIHN1Ym1pdHRlZCB3b3JrIG11c3QgcmVmbGVjdCB5b3VyIG93biB1bmRlcnN0YW5kaW5nOyB3aGVyZSBleHRlcm5hbCB0b29scyBhcmUgY29uc3VsdGVkLCBjb250ZW50IG11c3QgYmUgdGhvcm91Z2hseSByZXBocmFzZWQgYW5kIHN5bnRoZXNpemVkIGluIHlvdXIgb3duIHdvcmRzLg0KPC9wPg0KDQo8cD4NCioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLg0KPC9wPg0KDQoNCiMjICoqU2ltcGxlIHZlcnN1cyBDb21wb3NpdGUgSHlwb3RoZXNpcyoNCg0KKipTaW1wbGUgSHlwb3RoZXNpcyoqDQoNCiogKipTaW1wbGUgSHlwb3RoZXNpcyBUZXN0KiogaXMgYSBoeXBvdGhlc2lzIHRoYXQgY29tcGxldGVseSBzcGVjaWZpZXMgdGhlIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uLiBNYXRoZW1hdGljYWxseSwgc2ltcGxlIGh5cG90aGVzaXMgZml4ZXMgYWxsIHBhcmFtZXRlcnMgdG8gc3BlY2lmaWMgdmFsdWVzLiBGb3IgZXhhbXBsZSwgVGhlIHNpbXBsZSBoeXBvdGhlc2VzIGFyZTogJEhfMDogXG11ID0gNSQgKGlmICRcYWxwaGEkIGlzIGtub3duKSwgJEhfMDogXG11ID0gMTAwLCBcc2lnbWFeMiA9IDI1JCwgYW5kICRIXzE6IHAgPSAwLjckIGZvciBhIEJlcm5vdWxsaSBkaXN0cmlidXRpb24uDQoNCiogKipFeGFtcGxlIFNjZW5hcmlvKiogIFRlc3QgaWYgYSBjb2luIGlzIGZhaXI6DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCkhfMCY6IHAgPSAwLjUgXHF1YWQgXHRleHR7KGNvbXBsZXRlbHkgc3BlY2lmaWVkKX0gXFwNCkhfMSY6IHAgPSAwLjYgXHF1YWQgXHRleHR7KGFsc28gY29tcGxldGVseSBzcGVjaWZpZWQpfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KQm90aCBhcmUgKipzaW1wbGUqKiBoeXBvdGhlc2VzLg0KDQoqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKioNCg0KKiAqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKiogaXMgYSBoeXBvdGhlc2lzIHRoYXQgZG9lcyBub3QgY29tcGxldGVseSBzcGVjaWZ5IHRoZSBkaXN0cmlidXRpb24uIE1hdGhlbWF0aWNhbGx5LCBpdCBhbGxvd3MgYSByYW5nZSBvZiB2YWx1ZXMgZm9yIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpbiBvbmUtc2lkZWQ6ICRcbXUgPjUkOyBpbiB0d28tc2lkZWQ6ICRcbXUgXGxlIDUkLg0KDQoqICoqRXhhbXBsZSBTY2VuYXJpb3MqKiANCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KJkhfMDogXG11ID0gNSAmJiBcdGV4dHsoc2ltcGxlKX0gXFwNCiZIXzE6IFxtdSA+IDUgJiYgXHRleHR7KGNvbXBvc2l0ZSl9DQpcZW5ke2FsaWduZWR9DQoNCg0KDQpcYmVnaW57YWxpZ25lZH0NCiZIXzA6IFxtdSBcbGVxIDUgJiYgXHRleHR7KGNvbXBvc2l0ZSl9IFxcDQomSF8xOiBcbXUgPiA1ICYmIFx0ZXh0eyhjb21wb3NpdGUpfQ0KXGVuZHthbGlnbmVkfQ0KDQoNClxiZWdpbnthbGlnbmVkfQ0KJkhfMDogXHRleHR7ZGF0YSBmb2xsb3dzIH0gTihcbXUsIDEpLCBcbXUgPSAwICYmIFx0ZXh0eyhzaW1wbGUpfSBcXA0KJkhfMTogXHRleHR7ZGF0YSBmb2xsb3dzIFBvaXNzb259KFxsYW1iZGEpICYmIFx0ZXh0eyhjb21wb3NpdGUg4oCTIGRpZmZlcmVudCBmYW1pbHkpfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KDQo8cD48Zm9udCBjb2xvciA9ICJkYXJrcmVkIj4qKlRoaXMgYXNzaWdubWVudCBmb2N1c2VzIG9uIHBlcmZvcm1pbmcgcGVyZm9ybWluZyBhIHRlc3Qgb2YgbWVhbiAoJFxtdSQpIGEgbm9ybWFsIHBvcHVsYXRpb24gYW5kIGNhbGN1bGF0aW5nIHRoZSBwb3dlciBhbmQgc2FtcGxlIHNpemUgYmFzZWQgb24gdmFyaW91cyBhc3N1bXB0aW9ucyoqPC9mb250PjwvcD4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb246IE5ldyBDaG9sZXN0ZXJvbCBNZWRpY2F0aW9uKioNCg0KPHA+DQpBIHBoYXJtYWNldXRpY2FsIGNvbXBhbnkgZGV2ZWxvcHMgKioiQ2hvbGVzdEZpeCIqKiB0byByZWR1Y2UgTG93LURlbnNpdHkgTGlwb3Byb3RlaW4gKExETCwgKmZhdCBjYXJyaWVyIHRoYXQncyBsb3cgaW4gZGVuc2l0eSopIGNob2xlc3Rlcm9sLiBUaGUgKipjdXJyZW50IHN0YW5kYXJkIGRydWcqKiBsb3dlcnMgTERMIGJ5IGFuIGF2ZXJhZ2Ugb2YgMjUgbWcvZEwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTC4gQSBjbGluaWNhbCB0cmlhbCB3aXRoIDUgcGFydGljaXBhbnRzIHdlcmUgcmVjcnVpdGVkIGluIHRoZSBzdHVkeSBmb3IgdGhyZWUgbW9udGhzLiBBdCB0aGUgZW5kIG9mIHRoZSBzdHVkeSwgdGhlIG1lYW4gcmVkdWN0aW9uIGlzIDI5IG1nL2RMLiBBc3N1bWUgdGhhdCB0aGUgdmFyaWFuY2Ugb2YgTERMIHJlZHVjdGlvbiBvZiBuZXcgZHJ1ZyBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBzdGFuZGFyZCBkcnVncy4NCg0KQmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIGNsaW5pY2FsIHRyaWFsLCByZXNlYXJjaGVycyBpbiB0aGUgY29tcGFueSBiZWxpZXZlICoqQ2hvbGVzdEZpeCoqIGlzIG1vcmUgZWZmZWN0aXZlLg0KPC9wPg0KDQoNCjxwPg0KYSkuIFBlcmZvcm0gYSBmb3JtYWwgaHlwb3RoZXNpcyB0ZXN0IG9mIHRoZSByZXNlYXJjaGVyc+KAmSBiZWxpZWYgcmVnYXJkaW5nIExETCByZWR1Y3Rpb24sIHVzaW5nIGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mICRcYWxwaGEgPSAwLjA1JC4NCg0KIyBBbnN3ZXIgdG8gUXVlc3Rpb24gMSBQYXJ0IEE6DQoNClRoZSByZXNlYXJjaGVycyBpbiB0aGUgZXhhbXBsZSBhYm92ZSBhcmUgYXR0ZW1wdGluZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgQ2hvbGVzdEZpeCBpcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuICBUaGF0IGlzLCB0aGV5IGFyZSBhdHRlbXB0aW5nIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBDaG9sZXN0Rml4IGxvd2VycyBMREwgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuICBHaXZlbiB0aGlzLCB3ZSBrbm93IHRoYXQgdGhlIGFwcHJvcHJpYXRlIHRlc3QgZm9yIHRoaXMgc2V0dGluZyBpcyBhIHJpZ2h0LXRhaWxlZCB0LXRlc3QgKGdpdmVuIHRoZSBzbWFsbCBzYW1wbGUgc2l6ZSBvZiAkbj01JCkuICBXZSBjYW4gYWxzbyBpZGVudGlmeSB0aGUgZm9sbG93aW5nIHZhbHVlczogJG49NSwgXGJhcnt4fT0yOSwgcz0xNSwgXG11XzA9MTAwLCQgYW5kICRcYWxwaGE9MC4wNSQuICBGaXJzdCB3ZSB3aWxsIHVzZSBSIHRvIGdldCB0aGUgdGVzdCBzdGF0aXN0aWMsIHAtdmFsdWUsIGFuZCBkZWdyZWVzIG9mIGZyZWVkb20gZm9yIHRoaXMgc2V0dGluZyBhbmQgdGhlbiB1c2UgdGhlIHJlc3VsdHMgdG8gcGVyZm9ybSBhIGZvcm1hbCBoeXBvdGhlc2VzIHRlc3QuDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKSAjU2V0cyBzZWVkDQpzaW11bGF0ZWRfZHJ1ZyA8LSBybm9ybSg1LCBtZWFuPTI5LCBzZD0xNSkgI0NyZWF0ZXMgc2ltdWxhdGVkIGRhdGEgc2V0IHVzaW5nIHN0YXRpc3RpY3MgZnJvbSBvdXIgc2V0dGluZw0KcmVzdWx0IDwtIHQudGVzdChzaW11bGF0ZWRfZHJ1ZywgbXU9MjUsIGFsdGVybmF0aXZlPSJncmVhdGVyIikNCiNQZXJmb3JtcyB0LXRlc3QNCnByaW50KHJlc3VsdCkgI1ByaW50cyB0LXRlc3QNCmBgYA0KDQpGb3Igb3VyIHNldHRpbmcsIG91ciBudWxsIGFuZCBhbHRlcm5hdGl2ZSBoeXBvdGhlc2VzIGFyZToNCg0KJCQNCkhfMDogXG11IFxsZSAyNSBcXA0KSF9hOiBcbXUgPjI1DQokJA0KDQpUaGF0IGlzLCBvdXIgbnVsbCBoeXBvdGhlc2lzIGlzIHRoYXQgQ2hvbGVzdEZpeCBsb3dlcnMgTERMIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBzdGFuZGFyZCBkcnVnIGFuZCBvdXIgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBpcyB0aGF0IENob2xlc3RGaXggbG93ZXJzIExETCBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgc3RhbmRhcmQgZHJ1Zy4NCg0KVXNpbmcgdGhlIG91dHB1dCBhYm92ZSwgd2Uga25vdyBvdXIgdGVzdCBzdGF0aXN0aWMgaXMgJHQ9MS4yNjgwJC4gIA0KDQpOZXh0IHdlIGNhbiB1c2UgUiB0byBkZXRlcm1pbmUgb3VyIGNyaXRpY2FsIHZhbHVlIGFuZCBjb21wYXJlIG91ciB0ZXN0IHN0YXRpc3RpYyB0byBvdXIgY3JpdGljYWwgdmFsdWUuDQoNCmBgYHtyfQ0KYWxwaGEgPC0gMC4wNQ0KZGYgPC0gNA0KY3JpdGljYWxfdmFsIDwtIHF0KDEtYWxwaGEsIGRmKQ0KcHJpbnQoY3JpdGljYWxfdmFsKQ0KYGBgDQoNCkJhc2VkIG9uIHRoZSBhYm92ZSBvdXRwdXQgd2Uga25vdyB0aGF0IG91ciBjcml0aWNhbCB2YWx1ZSBmb3IgdGhpcyBzZXR0aW5nIGlzIDIuMTMxODQ3Lg0KDQpHaXZlbiB0aGF0IG91ciB0ZXN0IHN0YXRpc3RpYyBpcyBsZXNzIHRoYW4gb3VyIGNyaXRpY2FsIHZhbHVlICgkdD0xLjI2ODA8Mi4xMzE0ODckKSBhbmQgb3VyIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIG91ciAkXGFscGhhJCAoJFx0ZXh0e3AtdmFsdWV9PTAuMTM2Nj4wLjA1PVxhbHBoYSQpIHdlIGRvIG5vdCBoYXZlIGVub3VnaCBldmlkZW5jZSB0byByZWplY3Qgb3VyICRIXzAkLg0KDQpJbiBjb250ZXh0LCB0aGlzIG1lYW5zIHRoYXQgd2UgZG8gbm90IGhhdmUgZW5vdWdoIGV2aWRlbmNlIChhdCB0aGUgMC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwpIHRvIHJlamVjdCBvdXIgbnVsbCBoeXBvdGhlc2lzIHRoYXQgQ2hvbGVzdEZpeCBsb3dlcnMgTERMIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBzdGFuZGFyZCBkcnVnLiAgVGhlcmVmb3JlLCB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggZXZpZGVuY2UgdG8gaW5kaWNhdGUgdGhhdCBDaG9sZXN0Rml4IGxvd2VycyBMREwgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuDQoNCmIpLiBHaXZlbiAkbiA9IDUwLCBcc2lnbWEgPSAxNSwgXGFscGhhID0gMC4wNSQsIGFuZCBhbiBlZmZlY3Qgc2l6ZSB3ZSB3aXNoIHRvIGRldGVjdCAkXGRlbHRhID0gNCQgbWcvZEwgKGNvcnJlc3BvbmRpbmcgdG8gYSByZWR1Y3Rpb24gZnJvbSAyOSBtZy9kTCB0byAyNSBtZy9kTCkuICBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlJ2QgZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudD8NCg0KIyBBbnN3ZXIgdG8gUXVlc3Rpb24gMSBQYXJ0IEI6DQoNCkdpdmVuICRuID0gNTAsIFxzaWdtYSA9IDE1LCBcYWxwaGEgPSAwLjA1JCBhbmQgYW4gZWZmZWN0IHNpemUgb2YgJFxkZWx0YT00JCB0aGF0IHdlIHdpc2ggdG8gZGV0ZWN0LCB3ZSBjYW4gdXNlIFIgdG8gZGV0ZXJtaW5lIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlIHdvdWxkIGRldGVjdCBhIHRydWUgaW1wcm92ZW1lbnQ6DQoNCmBgYHtyfQ0KcG93ZXJfY2FsYyA8LSBwb3dlci50LnRlc3Qobj01MCwgI1Bvd2VyLXRlc3QgdXNpbmcgYWJvdmUgdmFsdWVzDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YT00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Q9MTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcubGV2ZWw9MC4wNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9uZS5zYW1wbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRpdmU9Im9uZS5zaWRlZCIpDQpwcmludChwb3dlcl9jYWxjKSAjUHJpbnRzIHJlc3VsdHMNCmBgYA0KDQpCYXNlZCBvbiB0aGUgYWJvdmUgb3V0cHV0LCB3ZSBrbm93IHRoYXQgcG93ZXIgb2YgdGhpcyB0ZXN0IHdoZXJlICAkbiA9IDUwLCBcc2lnbWEgPSAxNSwgXGFscGhhID0gMC4wNSQgYW5kICRcZGVsdGE9NCQgaXMgJFx0ZXh0e1Bvd2VyfT0wLjU4NDk3MzckLiAgR2l2ZW4gdGhhdCAkXHRleHR7UG93ZXJ9PVAoXHRleHR7UmVqZWN0IH0gSF8wIHxIX2EpJCB3ZSBrbm93IHRoYXQgdGhlIHByb2JhYmlsaXR5IHRoYXQgd2Ugd291bGQgZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudCBpcyAwLjU4NDk3MzcuDQoNCmMpLiBEZXRlcm1pbmUgdGhlIG1pbmltdW0gc2FtcGxlIHNpemUgcmVxdWlyZWQgdG8gZGV0ZWN0IGFuIGVmZmVjdCBzaXplIG9mIDQgbWcvZEwgd2l0aCBhIHBvd2VyIG9mICQxIC0gXGJldGEgPSAwLjgkICBhbmQgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJFxhbHBoYSA9IDAuMDUkLiBBc3N1bWUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBMREwgcmVkdWN0aW9uIGlzIDE1IG1nL2RMLg0KDQojIEFuc3dlciB0byBRdWVzdGlvbiAxIFBhcnQgQzoNCg0KR2l2ZW4gJFxzaWdtYSA9IDE1LCBcYWxwaGEgPSAwLjA1JCBhbmQgdGhhdCB3ZSB3YW50IGEgcG93ZXIgb2YgJDEtXGJldGE9MC4wOCQsIHdlIGNhbiB1c2UgUiB0byBkZXRlcm1pbmUgdGhlIG1pbmltdW0gc2FtcGxlIHNpemUgcmVxdWlyZWQgdG8gZGV0ZWN0IGFuIGVmZmVjdCBzaXplIG9mICRcZGVsdGE9NCQ6DQoNCmBgYHtyfQ0Kc2FtcGxlX3NpemUgPC0gcG93ZXIudC50ZXN0KHBvd2VyPTAuOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YT00LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkPTE1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbD0wLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9uZS5zYW1wbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlPSJvbmUuc2lkZWQiKQ0KY2F0KCJcblJlcXVpcmVkIHNhbXBsZSBzaXplIGZvciA4MCUgcG93ZXI6IiwgY2VpbGluZyhzYW1wbGVfc2l6ZSRuKSkNCmBgYA0KDQpCYXNlZCBvbiB0aGUgYWJvdmUgb3V0cHV0IHdlIGtub3cgdGhhdCwgZ2l2ZW4gdGhhdCAkXHNpZ21hID0gMTUsIFxhbHBoYSA9IDAuMDUkIGFuZCAkXGRlbHRhPTQkLCB3ZSBuZWVkIGEgc2FtcGxlIHNpemUgb2YgYXQgbGVhc3QgODkgaWYgd2Ugd2FudCBhIHBvd2VyIG9mICQxLVxiZXRhPTAuODAkLiAgVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgYSBzYW1wbGUgc2l6ZSBvZiBhdCBsZWFzdCA4OSB0byBkZXRlY3QgYSB0cnVlIGltcHJvdmVtZW50IG9mIDQgODAlIG9mIHRoZSB0aW1lLiAgDQoNCmQpLiAqKlBvd2VyIGN1cnZlKio6IFRvIGFzc2VzcyB0aGUgaW1wYWN0IG9mIHNhbXBsZSBzaXplIG9uIHBvd2VyLCB3ZSBjYW4gY3JlYXRlIGEgcG93ZXIgZnVuY3Rpb24gaW4gdGVybXMgb2YgdGhlIHNhbXBsZSBzaXplICRuJCBhbmQgdXNlIHRoZSByZW1haW5pbmcgaW5mb3JtYXRpb24gZnJvbSBwYXJ0IChiKS4gUGxvdCB0aGUgcG93ZXIgY3VydmUgYnkgc2VsZWN0aW5nIGEgc2VxdWVuY2Ugb2Ygc2FtcGxlIHNpemVzLg0KPC9wPg0KDQojIEFuc3dlciB0byBRdWVzdGlvbiAxIFBhcnQgRDoNCg0KV2UgY2FuIGNyZWF0ZSBhIHBvd2VyIGN1cnZlIGJ5IHBsb3R0aW5nIHRoZSBwb3dlcnMgZnJvbSBhIHNlcXVlbmNlIG9mIHNhbXBsZSBzaXplIHZhbHVlcyAoJG4kIHZhbHVlcykuICBXZSBhcmUgYWJsZSB0byB1c2UgdGhlIHNhbWUgbWV0aG9kIHVzZWQgaW4gUGFydCBCIGFuZCBzaW1wbHkgYXBwbHkgdGhpcyBtZXRob2QgdG8gYSBzZXF1ZW5jZSBvZiB2YWx1ZXMuICBIZXJlIHdlIHdpbGwgdXNlIGEgc2VxdWVuY2Ugb2YgJG4kIHZhbHVlcyBmcm9tIDEgdG8gNTAwIGluIG9yZGVyIHRvIGFzc2VzIHRoZSBpbXBhY3Qgb2Ygc2FtcGxlIHNpemUgb24gcG93ZXIuICBXZSB3aWxsIGFsc28gY3JlYXRlIGEgbGluZSB0aGF0IGluZGljYXRlcyB3aGVuICRcdGV4dHtQb3dlcn09MC44JCAodGhlIHBvd2VyIHdlIHByZXZpb3VzbHkgZGV0ZXJtaW5lZCBjb3VsZCBiZSBvYnRhaW5lZCBmcm9tIGEgc2FtcGxlIHNpemUgb2YgJG49ODkkKS4NCg0KYGBge3J9DQpuX3JhbmdlIDwtIHNlcSgxLCA1MDApDQpwb3dlcnMgPC0gc2FwcGx5KG5fcmFuZ2UsIGZ1bmN0aW9uKG4pIHtwb3dlci50LnRlc3Qobj1uLCAjUG93ZXItdGVzdCB1c2luZyBhYm92ZSB2YWx1ZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhPTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZD0xNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZy5sZXZlbD0wLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib25lLnNhbXBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZT0ib25lLnNpZGVkIikkcG93ZXINCn0pDQoNCnBsb3Qobl9yYW5nZSwgcG93ZXJzLCB0eXBlID0gImwiLCBsd2Q9MiwgY29sID0gInJlZCIsDQogICAgIG1haW4gPSAiUG93ZXIgQ3VydmUiLA0KICAgICB4bGFiID0gIlNhbXBsZSBTaXplIiwNCiAgICAgeWxhYiA9ICJQb3dlciIpDQoNCmFibGluZShoPTAuOCwgY29sPSJibHVlIiwgbHR5PTIpDQpgYGANCg0KQ29uc2lkZXJpbmcgdGhlIHBvd2VyIGN1cnZlIGFib3ZlLCB3ZSBjYW4gc2VlIHRoYXQgcG93ZXIgaW5jcmVhc2VzIHJhcGlkbHkgZnJvbSAkbj0xJCB0byAkbj04OSQuICBIb3dldmVyLCBhZnRlciAkbj04OSQgdGhlIGdyb3d0aCBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24uICBUaGlzIGluZGljYXRlcyB0aGF0IGF0IGEgY2VydGFpbiBwb2ludCwgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiAkbiQgZG9lc24ndCBkbyBhIGxvdCB0byBpbmNyZWFzZSB0aGUgcG93ZXIgb2YgdGhlIHRlc3QuICBQcmFjdGljYWxseSwgdGhpcyBtZWFucyB0aGF0IHdoZW4gd2UgYXJlIGNvbnNpZGVyaW5nIGluY3JlYXNpbmcgJG4kIHRvIGluY3JlYXNlIHRoZSBwb3dlciBvZiBhIHRlc3QsIHRoZXJlIGNvbWVzIGEgcG9pbnQgd2VyZSB0aGUgc21hbGwgYWRkaXRpb25hbCBwb3dlciBvZiB0aGUgdGVzdCBtYXkgbm90IGJlIHdvcnRoIHRoZSBhZGRpdGlvbmFsIHdvcmsgYW5kIHJlc291cmNlcyBvZiBpbmNyZWFzaW5nIHRoZSBzYW1wbGUgc2l6ZS4gIA0KDQo8Zm9udCBjb2xvciA9ICJyZWQiPioqTm90ZSoqOiBGb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGFib3ZlLCB3cml0ZSBhIHNob3J0IHN1bW1hcnkgb2Ygd2hhdCB5b3Ugb2JzZXJ2ZWQsIGp1c3RpZnkgd2h5IHlvdXIgYW5hbHlzaXMgaXMgdmFsaWQsIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMuPC9mb250Pg0KDQo=