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\).

H0: mu = 25 (mean LDL reduction is the same as the standard drug)

Ha: mu > 25 (mean LDL reduction is greater than the standard drug)

# Given values
xbar <- 29
mu0 <- 25
sigma <- 15
n <- 5

# Test statistic
z <- (xbar - mu0) / (sigma / sqrt(n))

# Display labeled result
cat("Test statistic (z):", round(z, 3))
Test statistic (z): 0.596
# Critical value for right-tailed test
alpha <- 0.05

z_crit <- qnorm(1 - alpha)

cat("Critical value (z):", round(z_crit, 3))
Critical value (z): 1.645
# p-value for right-tailed test
p_value <- 1 - pnorm(z)
cat("p-value:", round(p_value, 4))
p-value: 0.2755

p-value and interpretation:

The p-value is 0.2755, which is greater than alpha = 0.05. This indicates that the observed mean reduction of 29 mg/dL is not significantly greater than 25 mg/dL and does not provide strong evidence that CholestFix is more effective than the standard drug.

Decision in context

Since the p-value is greater than alpha = 0.05, we fail to reject H0. There is not sufficient statistical evidence to support the claim that CholestFix reduces LDL cholesterol more than the current standard drug.

Summary

The sample mean LDL reduction observed in the clinical trial is 29 mg/dL, which is higher than the standard drug’s average reduction of 25 mg/dL. A one-sample z-test makes sense here because the population standard deviation is known and we are testing the sample mean against a specific value. Based on the results of the hypothesis test at the significance level alpha = 0.05, the difference between the sample mean and the standard value is not statistically significant. Therefore, there is not sufficient statistical evidence to support the researchers’ claim that CholestFix reduces LDL cholesterol 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?

# Store given values for power calculation
n <- 50
sigma <- 15
delta <- 4
alpha <- 0.05
# Calculate probability of detecting true effect
power_result <- power.t.test(
  n = n,
  delta = delta,
  sd = sigma,
  sig.level = alpha,
  type = "one.sample",
  alternative = "one.sided"
)

# Display computed power
cat("Power:", round(power_result$power, 4))
Power: 0.585

Summary:

The power is about 0.585, which is not very high compared to the usual 0.80 target. This means there is only about a 58.5% chance of detecting a real improvement if it actually exists. The method used here is appropriate since it uses the values given in the problem to calculate the probability of detecting an effect. Since the power is low, the study may not be strong enough and could fail to detect a true improvement.

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.

# Store given values for sample size calculation
delta <- 4
sigma <- 15
alpha <- 0.05
target_power <- 0.80
# Calculate required sample size
sample_size_result <- power.t.test(
  power = target_power,
  delta = delta,
  sd = sigma,
  sig.level = alpha,
  type = "one.sample",
  alternative = "one.sided"
)

# Display required sample size
cat("Required sample size:", ceiling(sample_size_result$n))
Required sample size: 89

Summary

The required sample size comes out to 89, which is a lot bigger than what was used before. So this tells us that the earlier study was probably too small to really detect the effect. The way this was done makes sense because it uses the values given in the problem like the effect size, standard deviation, alpha, and the target power. Since we want power = 0.80, we need a larger sample to get there. Because of that, using a smaller sample would likely not be enough to detect the improvement even if it is actually there.

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.

# Store fixed values from part (b)
delta <- 4
sigma <- 15
alpha <- 0.05

# Choose sample sizes to examine
n_seq <- seq(10, 120, by = 5)

# Compute power for each sample size
power_values <- sapply(n_seq, function(n) {
  power.t.test(
    n = n,
    delta = delta,
    sd = sigma,
    sig.level = alpha,
    type = "one.sample",
    alternative = "one.sided"
  )$power
})
# Plot power curve
plot(n_seq, power_values, type = "l", lwd = 2,
     xlab = "Sample size (n)",
     ylab = "Power",
     main = "Power Curve for Detecting LDL Improvement")

# Add reference lines
abline(h = 0.80, lty = 2)
abline(v = 89, lty = 2)

Summary:

The graph shows that power increases as the sample size increases. At smaller sample sizes, the power is pretty low, but it gets closer to 0.80 as n gets bigger. This makes sense here because it keeps the same effect size, standard deviation, and significance level from part (b), and only changes n to see how the power changes. Looking at the curve, it is clear that we need a much larger sample to reach the desired power of 0.80, which matches what we found in part (c).

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.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgOTogSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBhbmQgU2FtcGxlIHNpemUgRGV0ZXJtaW5hdGlvbiINCmF1dGhvcjogIktheWxhIER5ZXIiDQpkYXRlOiAiIER1ZTogQXByaWwgNywgMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCiAgICAgIGNvbG9yOiAjMDAwMDAwOw0KICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgZm9udC1zaXplOiAxcmVtOw0KICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgIH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJWR0FNIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiVkdBTSIpDQogIGxpYnJhcnkoVkdBTSkNCn0NCiMjIyMgVkdBTQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQo8cD4NCiogRW5oYW5jZSB1bmRlcnN0YW5kaW5nIHRoZSBsb2dpYyBhbmQgcHJvY2VkdXJlIG9mIGh5cG90aGVzaXMgdGVzdGluZyAuDQoNCiogSW1wbGVtZW50IHRoZSBwcm9jZWR1cmVzIGZvciBwb3dlciBhbmQgc2FtcGxlIHNpemUgY2FsY3VsYXRpb24gZm9yIGJhc2ljIGh5cG90aGVzaXMgdGVzdGluZyBwcm9jZWR1cmVzIHVzaW5nIG51aWx0LWluIGZ1bmN0aW9uIGFuZCBtYW51YWwgY2FsY3VsYXRpb24uDQo8L3A+DQoNCg0KIyMgKipQb2xpY2llcyBvZiBVc2luZyBBSSBUb29scyoqDQoNCjxwPg0KKipQb2xpY3kgb24gQUkgVG9vbCBVc2UqKjogUGxlYXNlIGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQo8L3A+DQoNCjxwPg0KKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQo8L3A+DQoNCg0KIyMgKipTaW1wbGUgdmVyc3VzIENvbXBvc2l0ZSBIeXBvdGhlc2lzKg0KDQoqKlNpbXBsZSBIeXBvdGhlc2lzKioNCg0KKiAqKlNpbXBsZSBIeXBvdGhlc2lzIFRlc3QqKiBpcyBhIGh5cG90aGVzaXMgdGhhdCBjb21wbGV0ZWx5IHNwZWNpZmllcyB0aGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIE1hdGhlbWF0aWNhbGx5LCBzaW1wbGUgaHlwb3RoZXNpcyBmaXhlcyBhbGwgcGFyYW1ldGVycyB0byBzcGVjaWZpYyB2YWx1ZXMuIEZvciBleGFtcGxlLCBUaGUgc2ltcGxlIGh5cG90aGVzZXMgYXJlOiAkSF8wOiBcbXUgPSA1JCAoaWYgJFxhbHBoYSQgaXMga25vd24pLCAkSF8wOiBcbXUgPSAxMDAsIFxzaWdtYV4yID0gMjUkLCBhbmQgJEhfMTogcCA9IDAuNyQgZm9yIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbi4NCg0KKiAqKkV4YW1wbGUgU2NlbmFyaW8qKiAgVGVzdCBpZiBhIGNvaW4gaXMgZmFpcjoNCg0KXGJlZ2lue2FsaWduZWR9DQpIXzAmOiBwID0gMC41IFxxdWFkIFx0ZXh0eyhjb21wbGV0ZWx5IHNwZWNpZmllZCl9IFxcDQpIXzEmOiBwID0gMC42IFxxdWFkIFx0ZXh0eyhhbHNvIGNvbXBsZXRlbHkgc3BlY2lmaWVkKX0NClxlbmR7YWxpZ25lZH0NCg0KQm90aCBhcmUgKipzaW1wbGUqKiBoeXBvdGhlc2VzLg0KDQoqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKioNCg0KKiAqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKiogaXMgYSBoeXBvdGhlc2lzIHRoYXQgZG9lcyBub3QgY29tcGxldGVseSBzcGVjaWZ5IHRoZSBkaXN0cmlidXRpb24uIE1hdGhlbWF0aWNhbGx5LCBpdCBhbGxvd3MgYSByYW5nZSBvZiB2YWx1ZXMgZm9yIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpbiBvbmUtc2lkZWQ6ICRcbXUgPjUkOyBpbiB0d28tc2lkZWQ6ICRcbXUgXGxlIDUkLg0KDQoqICoqRXhhbXBsZSBTY2VuYXJpb3MqKiANCg0KDQpcYmVnaW57YWxpZ25lZH0NCiZIXzA6IFxtdSA9IDUgJiYgXHRleHR7KHNpbXBsZSl9IFxcDQomSF8xOiBcbXUgPiA1ICYmIFx0ZXh0eyhjb21wb3NpdGUpfQ0KXGVuZHthbGlnbmVkfQ0KDQoNCg0KXGJlZ2lue2FsaWduZWR9DQomSF8wOiBcbXUgXGxlcSA1ICYmIFx0ZXh0eyhjb21wb3NpdGUpfSBcXA0KJkhfMTogXG11ID4gNSAmJiBcdGV4dHsoY29tcG9zaXRlKX0NClxlbmR7YWxpZ25lZH0NCg0KDQpcYmVnaW57YWxpZ25lZH0NCiZIXzA6IFx0ZXh0e2RhdGEgZm9sbG93cyB9IE4oXG11LCAxKSwgXG11ID0gMCAmJiBcdGV4dHsoc2ltcGxlKX0gXFwNCiZIXzE6IFx0ZXh0e2RhdGEgZm9sbG93cyBQb2lzc29ufShcbGFtYmRhKSAmJiBcdGV4dHsoY29tcG9zaXRlIOKAkyBkaWZmZXJlbnQgZmFtaWx5KX0NClxlbmR7YWxpZ25lZH0NCg0KDQoNCjxwPjxmb250IGNvbG9yID0gImRhcmtyZWQiPioqVGhpcyBhc3NpZ25tZW50IGZvY3VzZXMgb24gcGVyZm9ybWluZyBwZXJmb3JtaW5nIGEgdGVzdCBvZiBtZWFuICgkXG11JCkgYSBub3JtYWwgcG9wdWxhdGlvbiBhbmQgY2FsY3VsYXRpbmcgdGhlIHBvd2VyIGFuZCBzYW1wbGUgc2l6ZSBiYXNlZCBvbiB2YXJpb3VzIGFzc3VtcHRpb25zKio8L2ZvbnQ+PC9wPg0KDQoNClwNCg0KIyMgKipRdWVzdGlvbjogTmV3IENob2xlc3Rlcm9sIE1lZGljYXRpb24qKg0KDQo8cD4NCkEgcGhhcm1hY2V1dGljYWwgY29tcGFueSBkZXZlbG9wcyAqKiJDaG9sZXN0Rml4IioqIHRvIHJlZHVjZSBMb3ctRGVuc2l0eSBMaXBvcHJvdGVpbiAoTERMLCAqZmF0IGNhcnJpZXIgdGhhdCdzIGxvdyBpbiBkZW5zaXR5KikgY2hvbGVzdGVyb2wuIFRoZSAqKmN1cnJlbnQgc3RhbmRhcmQgZHJ1ZyoqIGxvd2VycyBMREwgYnkgYW4gYXZlcmFnZSBvZiAyNSBtZy9kTCB3aXRoIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDE1IG1nL2RMLiBBIGNsaW5pY2FsIHRyaWFsIHdpdGggNSBwYXJ0aWNpcGFudHMgd2VyZSByZWNydWl0ZWQgaW4gdGhlIHN0dWR5IGZvciB0aHJlZSBtb250aHMuIEF0IHRoZSBlbmQgb2YgdGhlIHN0dWR5LCB0aGUgbWVhbiByZWR1Y3Rpb24gaXMgMjkgbWcvZEwuIEFzc3VtZSB0aGF0IHRoZSB2YXJpYW5jZSBvZiBMREwgcmVkdWN0aW9uIG9mIG5ldyBkcnVnIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHN0YW5kYXJkIGRydWdzLg0KDQpCYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgY2xpbmljYWwgdHJpYWwsIHJlc2VhcmNoZXJzIGluIHRoZSBjb21wYW55IGJlbGlldmUgKipDaG9sZXN0Rml4KiogaXMgbW9yZSBlZmZlY3RpdmUuDQo8L3A+DQoNCg0KPHA+DQphKS4gUGVyZm9ybSBhIGZvcm1hbCBoeXBvdGhlc2lzIHRlc3Qgb2YgdGhlIHJlc2VhcmNoZXJz4oCZIGJlbGllZiByZWdhcmRpbmcgTERMIHJlZHVjdGlvbiwgdXNpbmcgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJFxhbHBoYSA9IDAuMDUkLg0KDQojIEgwOiBtdSA9IDI1ICAobWVhbiBMREwgcmVkdWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFuZGFyZCBkcnVnKQ0KIyBIYTogbXUgPiAyNSAgKG1lYW4gTERMIHJlZHVjdGlvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHN0YW5kYXJkIGRydWcpDQoNCmBgYHtyfQ0KIyBHaXZlbiB2YWx1ZXMNCnhiYXIgPC0gMjkNCm11MCA8LSAyNQ0Kc2lnbWEgPC0gMTUNCm4gPC0gNQ0KDQojIFRlc3Qgc3RhdGlzdGljDQp6IDwtICh4YmFyIC0gbXUwKSAvIChzaWdtYSAvIHNxcnQobikpDQoNCiMgRGlzcGxheSBsYWJlbGVkIHJlc3VsdA0KY2F0KCJUZXN0IHN0YXRpc3RpYyAoeik6Iiwgcm91bmQoeiwgMykpDQpgYGANCg0KYGBge3J9DQojIENyaXRpY2FsIHZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KYWxwaGEgPC0gMC4wNQ0KDQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhKQ0KDQpjYXQoIkNyaXRpY2FsIHZhbHVlICh6KToiLCByb3VuZCh6X2NyaXQsIDMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBwLXZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KcF92YWx1ZSA8LSAxIC0gcG5vcm0oeikNCmNhdCgicC12YWx1ZToiLCByb3VuZChwX3ZhbHVlLCA0KSkNCmBgYA0KDQojIHAtdmFsdWUgYW5kIGludGVycHJldGF0aW9uOg0KVGhlIHAtdmFsdWUgaXMgMC4yNzU1LCB3aGljaCBpcyBncmVhdGVyIHRoYW4gYWxwaGEgPSAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBvYnNlcnZlZCBtZWFuIHJlZHVjdGlvbiBvZiAyOSBtZy9kTCBpcyBub3Qgc2lnbmlmaWNhbnRseSBncmVhdGVyIHRoYW4gMjUgbWcvZEwgYW5kIGRvZXMgbm90IHByb3ZpZGUgc3Ryb25nIGV2aWRlbmNlIHRoYXQgQ2hvbGVzdEZpeCBpcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIHRoZSBzdGFuZGFyZCBkcnVnLg0KDQojIERlY2lzaW9uIGluIGNvbnRleHQNClNpbmNlIHRoZSBwLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBhbHBoYSA9IDAuMDUsIHdlIGZhaWwgdG8gcmVqZWN0IEgwLiBUaGVyZSBpcyBub3Qgc3VmZmljaWVudCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0byBzdXBwb3J0IHRoZSBjbGFpbSB0aGF0IENob2xlc3RGaXggcmVkdWNlcyBMREwgY2hvbGVzdGVyb2wgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuDQoNCiMgU3VtbWFyeQ0KVGhlIHNhbXBsZSBtZWFuIExETCByZWR1Y3Rpb24gb2JzZXJ2ZWQgaW4gdGhlIGNsaW5pY2FsIHRyaWFsIGlzIDI5IG1nL2RMLCB3aGljaCBpcyBoaWdoZXIgdGhhbiB0aGUgc3RhbmRhcmQgZHJ1Z+KAmXMgYXZlcmFnZSByZWR1Y3Rpb24gb2YgMjUgbWcvZEwuIEEgb25lLXNhbXBsZSB6LXRlc3QgbWFrZXMgc2Vuc2UgaGVyZSBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBrbm93biBhbmQgd2UgYXJlIHRlc3RpbmcgdGhlIHNhbXBsZSBtZWFuIGFnYWluc3QgYSBzcGVjaWZpYyB2YWx1ZS4gQmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlIGh5cG90aGVzaXMgdGVzdCBhdCB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIGFscGhhID0gMC4wNSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2FtcGxlIG1lYW4gYW5kIHRoZSBzdGFuZGFyZCB2YWx1ZSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0byBzdXBwb3J0IHRoZSByZXNlYXJjaGVyc+KAmSBjbGFpbSB0aGF0IENob2xlc3RGaXggcmVkdWNlcyBMREwgY2hvbGVzdGVyb2wgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuDQoNCmIpLiBHaXZlbiAkbiA9IDUwLCBcc2lnbWEgPSAxNSwgXGFscGhhID0gMC4wNSQsIGFuZCBhbiBlZmZlY3Qgc2l6ZSB3ZSB3aXNoIHRvIGRldGVjdCAkXGRlbHRhID0gNCQgbWcvZEwgKGNvcnJlc3BvbmRpbmcgdG8gYSByZWR1Y3Rpb24gZnJvbSAyOSBtZy9kTCB0byAyNSBtZy9kTCkuICBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlJ2QgZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudD8NCg0KYGBge3J9DQojIFN0b3JlIGdpdmVuIHZhbHVlcyBmb3IgcG93ZXIgY2FsY3VsYXRpb24NCm4gPC0gNTANCnNpZ21hIDwtIDE1DQpkZWx0YSA8LSA0DQphbHBoYSA8LSAwLjA1DQpgYGANCg0KYGBge3J9DQojIENhbGN1bGF0ZSBwcm9iYWJpbGl0eSBvZiBkZXRlY3RpbmcgdHJ1ZSBlZmZlY3QNCnBvd2VyX3Jlc3VsdCA8LSBwb3dlci50LnRlc3QoDQogIG4gPSBuLA0KICBkZWx0YSA9IGRlbHRhLA0KICBzZCA9IHNpZ21hLA0KICBzaWcubGV2ZWwgPSBhbHBoYSwNCiAgdHlwZSA9ICJvbmUuc2FtcGxlIiwNCiAgYWx0ZXJuYXRpdmUgPSAib25lLnNpZGVkIg0KKQ0KDQojIERpc3BsYXkgY29tcHV0ZWQgcG93ZXINCmNhdCgiUG93ZXI6Iiwgcm91bmQocG93ZXJfcmVzdWx0JHBvd2VyLCA0KSkNCmBgYA0KDQojIFN1bW1hcnk6DQpUaGUgcG93ZXIgaXMgYWJvdXQgMC41ODUsIHdoaWNoIGlzIG5vdCB2ZXJ5IGhpZ2ggY29tcGFyZWQgdG8gdGhlIHVzdWFsIDAuODAgdGFyZ2V0LiBUaGlzIG1lYW5zIHRoZXJlIGlzIG9ubHkgYWJvdXQgYSA1OC41JSBjaGFuY2Ugb2YgZGV0ZWN0aW5nIGEgcmVhbCBpbXByb3ZlbWVudCBpZiBpdCBhY3R1YWxseSBleGlzdHMuIFRoZSBtZXRob2QgdXNlZCBoZXJlIGlzIGFwcHJvcHJpYXRlIHNpbmNlIGl0IHVzZXMgdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgcHJvYmxlbSB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhbiBlZmZlY3QuIFNpbmNlIHRoZSBwb3dlciBpcyBsb3csIHRoZSBzdHVkeSBtYXkgbm90IGJlIHN0cm9uZyBlbm91Z2ggYW5kIGNvdWxkIGZhaWwgdG8gZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudC4NCg0KYykuIERldGVybWluZSB0aGUgbWluaW11bSBzYW1wbGUgc2l6ZSByZXF1aXJlZCB0byBkZXRlY3QgYW4gZWZmZWN0IHNpemUgb2YgNCBtZy9kTCB3aXRoIGEgcG93ZXIgb2YgJDEgLSBcYmV0YSA9IDAuOCQgIGFuZCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAkXGFscGhhID0gMC4wNSQuIEFzc3VtZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIExETCByZWR1Y3Rpb24gaXMgMTUgbWcvZEwuDQoNCmBgYHtyfQ0KIyBTdG9yZSBnaXZlbiB2YWx1ZXMgZm9yIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uDQpkZWx0YSA8LSA0DQpzaWdtYSA8LSAxNQ0KYWxwaGEgPC0gMC4wNQ0KdGFyZ2V0X3Bvd2VyIDwtIDAuODANCmBgYA0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIHJlcXVpcmVkIHNhbXBsZSBzaXplDQpzYW1wbGVfc2l6ZV9yZXN1bHQgPC0gcG93ZXIudC50ZXN0KA0KICBwb3dlciA9IHRhcmdldF9wb3dlciwNCiAgZGVsdGEgPSBkZWx0YSwNCiAgc2QgPSBzaWdtYSwNCiAgc2lnLmxldmVsID0gYWxwaGEsDQogIHR5cGUgPSAib25lLnNhbXBsZSIsDQogIGFsdGVybmF0aXZlID0gIm9uZS5zaWRlZCINCikNCg0KIyBEaXNwbGF5IHJlcXVpcmVkIHNhbXBsZSBzaXplDQpjYXQoIlJlcXVpcmVkIHNhbXBsZSBzaXplOiIsIGNlaWxpbmcoc2FtcGxlX3NpemVfcmVzdWx0JG4pKQ0KYGBgDQoNCiMgU3VtbWFyeQ0KVGhlIHJlcXVpcmVkIHNhbXBsZSBzaXplIGNvbWVzIG91dCB0byA4OSwgd2hpY2ggaXMgYSBsb3QgYmlnZ2VyIHRoYW4gd2hhdCB3YXMgdXNlZCBiZWZvcmUuIFNvIHRoaXMgdGVsbHMgdXMgdGhhdCB0aGUgZWFybGllciBzdHVkeSB3YXMgcHJvYmFibHkgdG9vIHNtYWxsIHRvIHJlYWxseSBkZXRlY3QgdGhlIGVmZmVjdC4gVGhlIHdheSB0aGlzIHdhcyBkb25lIG1ha2VzIHNlbnNlIGJlY2F1c2UgaXQgdXNlcyB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBwcm9ibGVtIGxpa2UgdGhlIGVmZmVjdCBzaXplLCBzdGFuZGFyZCBkZXZpYXRpb24sIGFscGhhLCBhbmQgdGhlIHRhcmdldCBwb3dlci4gU2luY2Ugd2Ugd2FudCBwb3dlciA9IDAuODAsIHdlIG5lZWQgYSBsYXJnZXIgc2FtcGxlIHRvIGdldCB0aGVyZS4gQmVjYXVzZSBvZiB0aGF0LCB1c2luZyBhIHNtYWxsZXIgc2FtcGxlIHdvdWxkIGxpa2VseSBub3QgYmUgZW5vdWdoIHRvIGRldGVjdCB0aGUgaW1wcm92ZW1lbnQgZXZlbiBpZiBpdCBpcyBhY3R1YWxseSB0aGVyZS4NCg0KZCkuICoqUG93ZXIgY3VydmUqKjogVG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2Ygc2FtcGxlIHNpemUgb24gcG93ZXIsIHdlIGNhbiBjcmVhdGUgYSBwb3dlciBmdW5jdGlvbiBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIHNpemUgJG4kIGFuZCB1c2UgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBmcm9tIHBhcnQgKGIpLiBQbG90IHRoZSBwb3dlciBjdXJ2ZSBieSBzZWxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBzYW1wbGUgc2l6ZXMuDQo8L3A+DQoNCmBgYHtyfQ0KIyBTdG9yZSBmaXhlZCB2YWx1ZXMgZnJvbSBwYXJ0IChiKQ0KZGVsdGEgPC0gNA0Kc2lnbWEgPC0gMTUNCmFscGhhIDwtIDAuMDUNCg0KIyBDaG9vc2Ugc2FtcGxlIHNpemVzIHRvIGV4YW1pbmUNCm5fc2VxIDwtIHNlcSgxMCwgMTIwLCBieSA9IDUpDQoNCiMgQ29tcHV0ZSBwb3dlciBmb3IgZWFjaCBzYW1wbGUgc2l6ZQ0KcG93ZXJfdmFsdWVzIDwtIHNhcHBseShuX3NlcSwgZnVuY3Rpb24obikgew0KICBwb3dlci50LnRlc3QoDQogICAgbiA9IG4sDQogICAgZGVsdGEgPSBkZWx0YSwNCiAgICBzZCA9IHNpZ21hLA0KICAgIHNpZy5sZXZlbCA9IGFscGhhLA0KICAgIHR5cGUgPSAib25lLnNhbXBsZSIsDQogICAgYWx0ZXJuYXRpdmUgPSAib25lLnNpZGVkIg0KICApJHBvd2VyDQp9KQ0KYGBgDQoNCmBgYHtyfQ0KIyBQbG90IHBvd2VyIGN1cnZlDQpwbG90KG5fc2VxLCBwb3dlcl92YWx1ZXMsIHR5cGUgPSAibCIsIGx3ZCA9IDIsDQogICAgIHhsYWIgPSAiU2FtcGxlIHNpemUgKG4pIiwNCiAgICAgeWxhYiA9ICJQb3dlciIsDQogICAgIG1haW4gPSAiUG93ZXIgQ3VydmUgZm9yIERldGVjdGluZyBMREwgSW1wcm92ZW1lbnQiKQ0KDQojIEFkZCByZWZlcmVuY2UgbGluZXMNCmFibGluZShoID0gMC44MCwgbHR5ID0gMikNCmFibGluZSh2ID0gODksIGx0eSA9IDIpDQpgYGANCg0KIyBTdW1tYXJ5Og0KVGhlIGdyYXBoIHNob3dzIHRoYXQgcG93ZXIgaW5jcmVhc2VzIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMuIEF0IHNtYWxsZXIgc2FtcGxlIHNpemVzLCB0aGUgcG93ZXIgaXMgcHJldHR5IGxvdywgYnV0IGl0IGdldHMgY2xvc2VyIHRvIDAuODAgYXMgbiBnZXRzIGJpZ2dlci4gVGhpcyBtYWtlcyBzZW5zZSBoZXJlIGJlY2F1c2UgaXQga2VlcHMgdGhlIHNhbWUgZWZmZWN0IHNpemUsIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIHNpZ25pZmljYW5jZSBsZXZlbCBmcm9tIHBhcnQgKGIpLCBhbmQgb25seSBjaGFuZ2VzIG4gdG8gc2VlIGhvdyB0aGUgcG93ZXIgY2hhbmdlcy4gTG9va2luZyBhdCB0aGUgY3VydmUsIGl0IGlzIGNsZWFyIHRoYXQgd2UgbmVlZCBhIG11Y2ggbGFyZ2VyIHNhbXBsZSB0byByZWFjaCB0aGUgZGVzaXJlZCBwb3dlciBvZiAwLjgwLCB3aGljaCBtYXRjaGVzIHdoYXQgd2UgZm91bmQgaW4gcGFydCAoYykuDQoNCjxmb250IGNvbG9yID0gInJlZCI+KipOb3RlKio6IEZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgYWJvdmUsIHdyaXRlIGEgc2hvcnQgc3VtbWFyeSBvZiB3aGF0IHlvdSBvYnNlcnZlZCwganVzdGlmeSB3aHkgeW91ciBhbmFseXNpcyBpcyB2YWxpZCwgYW5kIGludGVycHJldCB0aGUgcmVzdWx0cy48L2ZvbnQ+DQoNCg==