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.

Policies of Using AI Tools

Policy on AI Tool Use: Please adhere to the AI tool policy specified in the course syllabus. The direct copying of AI-generated content is strictly prohibited. All submitted work must reflect your own understanding; where external tools are consulted, content must be thoroughly rephrased and synthesized in your own words.

Code Inclusion Requirement: Any code included in your essay must be properly commented to explain the purpose and/or expected output of key code lines. Submitting AI-generated code without meaningful, student-added comments will not be accepted.

**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=