1 Question (a): Hypothesis Test for LDL Reduction

1.1 Step 1: Problem Setup

We are given the following information:

  • Sample size: \(n = 5\)
  • Sample mean: \(\bar{x} = 29\)
  • Population mean under standard drug: \(\mu_0 = 25\)
  • Population standard deviation: \(\sigma = 15\)
  • Significance level: \(\alpha = 0.05\)

The researchers believe that the new drug is more effective, meaning it leads to a greater LDL reduction.


1.2 Step 2: Hypotheses

We formulate a one-sided hypothesis test:

\[ H_0: \mu = 25 \] \[ H_a: \mu > 25 \]


1.3 Step 3: Test Statistic

Since the population standard deviation \(\sigma\) is known, we use a one-sample z-test:

\[ Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}} \]

Substituting the values:

\[ Z = \frac{29 - 25}{15 / \sqrt{5}} = \frac{4}{15 / \sqrt{5}} = \frac{4\sqrt{5}}{15} \]

\[ Z \approx 0.596 \]


1.4 Step 4: Critical Value

For a right-tailed test at \(\alpha = 0.05\):

\[ z_{0.05} = 1.645 \]


1.5 Step 5: Decision

Since:

\[ Z = 0.596 < 1.645 \]

we fail to reject \(H_0\).


1.6 Step 6: Interpretation

There is insufficient statistical evidence at the \(\alpha = 0.05\) level to conclude that the new drug results in a greater mean LDL reduction compared to the standard treatment.


1.7 Verification Using R

# Given values
x_bar <- 29       # sample mean
mu_0 <- 25        # null mean
sigma <- 15       # known population standard deviation
n <- 5            # sample size

# Compute z-statistic
z_stat <- (x_bar - mu_0) / (sigma / sqrt(n))

# Compute p-value for right-tailed test
p_value <- 1 - pnorm(z_stat)

# Critical value at alpha = 0.05
z_crit <- qnorm(0.95)

# Output results
cat("Z-statistic:", round(z_stat, 3), "\n")
Z-statistic: 0.596 
cat("Critical value:", round(z_crit, 3), "\n")
Critical value: 1.645 
cat("P-value:", round(p_value, 4), "\n")
P-value: 0.2755 

1.8 Summary

The observed sample mean LDL reduction (\(\bar{x} = 29\)) is higher than the standard treatment mean of \(\mu_0 = 25\). However, when standardized using the standard error \(\sigma/\sqrt{n} = 15/\sqrt{5} \approx 6.71\), the resulting test statistic is \(Z \approx 0.596\), which is relatively small.

This analysis is valid because the population standard deviation is assumed known and the test follows a normal model, allowing the use of a one-sample z-test. The hypothesis test is correctly specified as a right-tailed test based on the research claim that the new drug is more effective.

The results indicate that the observed difference of 4 mg/dL is small relative to the variability in the data. Under the null hypothesis, such a sample mean is not unlikely (p-value ≈ 0.28), meaning it could reasonably occur due to random sampling variation. Therefore, there is insufficient evidence to conclude that the new drug provides a greater mean LDL reduction.

2 Question (b): Power Calculation

2.1 Step 1: Problem Setup

We are given:

  • Sample size: \(n = 50\)
  • Standard deviation: \(\sigma = 15\)
  • Significance level: \(\alpha = 0.05\)
  • Effect size to detect: \(\delta = 4\)

We are testing:

\[ H_0: \mu = 25 \quad \text{vs.} \quad H_a: \mu > 25 \]


2.2 Step 2: Test Framework

We use a one-sided z-test, since \(\sigma\) is known.

The rejection rule is:

\[ Z > z_{1-\alpha} \]

where:

\[ z_{1-\alpha} = z_{0.95} = 1.645 \]


2.3 Step 3: Non-Centrality Parameter

The non-centrality parameter is:

\[ \lambda = \frac{\mu - \mu_0}{\sigma / \sqrt{n}} = \frac{\delta}{\sigma / \sqrt{n}} \]

Substituting values:

\[ \lambda = \frac{4}{15/\sqrt{50}} = \frac{4\sqrt{50}}{15} \approx 1.886 \]


2.4 Step 4: Power Calculation

Power is:

\[ \text{Power} = P\left(Z > z_{1-\alpha} \mid \mu = 29\right) \]

This can be rewritten using the shift:

\[ \text{Power} = P\left(Z > 1.645 - \lambda\right) \]

\[ = 1 - \Phi(1.645 - 1.886) \]

\[ = 1 - \Phi(-0.241) \]

\[ \approx 1 - 0.405 = 0.595 \]


2.5 Step 5: Result

\[ \text{Power} \approx 0.595 \]


2.6 Verification Using R

# Given values
n <- 50
sigma <- 15
delta <- 4
alpha <- 0.05

# Standard error
se <- sigma / sqrt(n)

# Non-centrality parameter
lambda <- delta / se

# Critical value
z_crit <- qnorm(1 - alpha)

# Power calculation
power <- 1 - pnorm(z_crit - lambda)

# Output
cat("Non-centrality parameter:", round(lambda, 3), "\n")
Non-centrality parameter: 1.886 
cat("Critical value:", round(z_crit, 3), "\n")
Critical value: 1.645 
cat("Power:", round(power, 4), "\n")
Power: 0.5951 

2.7 Summary

The calculated power is approximately 0.595, indicating about a 59.5% chance of correctly rejecting the null hypothesis when the true mean improvement is 4 mg/dL.

This analysis is valid because it follows the theoretical framework for power calculation using the normal distribution, as outlined in the lecture notes. The known population standard deviation justifies the use of a z-test, and the non-centrality parameter correctly captures the distance between H 0 and H a

The result shows that even with a larger sample size (n=50), the probability of detecting a true improvement of 4 mg/dL is still moderate. This reflects that the effect size is relatively small compared to the variability (σ=15). Consequently, there remains a substantial probability (about 40%) of failing to detect a real improvement, highlighting the importance of either increasing sample size or targeting larger effect sizes in study design.

3 Question (c): Minimum Sample Size Determination

3.1 Step 1: Problem Setup

We are given:

  • Desired power: \(1 - \beta = 0.80\)
  • Significance level: \(\alpha = 0.05\)
  • Standard deviation: \(\sigma = 15\)
  • Effect size: \(\delta = 4\)

We are testing:

\[ H_0: \mu = 25 \quad \text{vs.} \quad H_a: \mu > 25 \]


3.2 Step 2: Approximate Sample Size Formula

The required sample size can be approximated using:

\[ n \approx \left( \frac{(z_{1-\alpha} + z_{1-\beta}) \cdot \sigma}{\delta} \right)^2 \]

For a one-sided test:

  • \(z_{1-\alpha} = z_{0.95} = 1.645\)
  • \(z_{1-\beta} = z_{0.80} = 0.842\)

3.3 Step 3: Manual Calculation

\[ n \approx \left( \frac{(1.645 + 0.842)\cdot 15}{4} \right)^2 \]

\[ = \left( \frac{2.487 \cdot 15}{4} \right)^2 = \left( \frac{37.305}{4} \right)^2 = (9.326)^2 \approx 86.98 \]

\[ n \approx 87 \]


3.4 Step 4: Result

\[ \boxed{n = 87} \]


3.5 Verification Using R

# Use built-in function to compute required sample size

sample_size <- power.t.test(power = 0.80,
                           delta = 4,       # effect size
                           sd = 15,         # standard deviation
                           sig.level = 0.05,
                           type = "one.sample",
                           alternative = "one.sided")

# Round up since sample size must be an integer
ceiling(sample_size$n)
[1] 89

3.6 Summary

The required sample size to achieve 80% power for detecting a 4 mg/dL improvement is approximately n=87.This analysis is valid because it follows the standard sample size determination framework based on normal approximations, as outlined in the lecture notes. The formula incorporates both the significance level (α) and desired power (1−β), ensuring that the test has a controlled Type I error rate and a sufficiently high probability of detecting a true effect.

The result highlights that a substantially larger sample size is needed compared to part (b). This reflects the relatively small effect size (δ=4) compared to the variability (σ=15). Detecting such a modest improvement with high reliability requires more observations, reinforcing the tradeoff between effect size, variability, and sample size in hypothesis testing.

4 Question (d): Power Curve as a Function of Sample Size

4.1 Step 1: Objective

We examine how statistical power changes as the sample size \(n\) varies, while holding all other parameters fixed.

Given:

  • Effect size: \(\delta = 4\)
  • Standard deviation: \(\sigma = 15\)
  • Significance level: \(\alpha = 0.05\)
  • One-sided test

4.2 Step 2: Power Function

power is given by:

\[ \text{Power}(n) = 1 - \Phi\left(z_{1-\alpha} - \frac{\delta}{\sigma/\sqrt{n}}\right) \]

where:

\[ \lambda(n) = \frac{\delta}{\sigma/\sqrt{n}} = \frac{\delta \sqrt{n}}{\sigma} \]


4.3 Step 3: Compute Power Across Sample Sizes

We evaluate power for a sequence of sample sizes to observe how it increases with \(n\).

# Parameters
sigma <- 15
delta <- 4
alpha <- 0.05

# Critical value
z_crit <- qnorm(1 - alpha)

# Sequence of sample sizes
n_values <- seq(5, 150, by = 1)

# Compute power for each n
power_values <- sapply(n_values, function(n) {
  lambda <- delta / (sigma / sqrt(n))  # non-centrality parameter
  1 - pnorm(z_crit - lambda)
})

# Plot power curve
plot(n_values, power_values, type = "l",
     xlab = "Sample Size (n)",
     ylab = "Power",
     main = "Power Curve for Detecting δ = 4",
     lwd = 2)

# Add reference line at 80% power
abline(h = 0.80, lty = 2)

4.4 Interpretation

The plot shows that power increases monotonically as the sample size increases. For small \(n\), power is low due to high variability in the sample mean. As \(n\) grows, the standard error \(\sigma/\sqrt{n}\) decreases, making it easier to detect the effect.

The curve crosses the 0.80 threshold at approximately \(n \approx 87\), which is consistent with the result obtained in part (c).

4.5 Summary

The power curve demonstrates the relationship between sample size and the ability to detect a true effect. As sample size increases, the variability of the sample mean decreases, leading to higher power.

This analysis is valid because it directly applies the theoretical power function derived from the normal distribution and uses consistent parameter values from previous parts. The use of a continuous range of n values allows for a clear visualization of how power evolves.

The results confirm that small sample sizes provide insufficient power to detect modest effects, while larger samples substantially improve the probability of correctly rejecting the null hypothesis. This reinforces the conclusion from part (c) that a sample size of approximately 87 is required to achieve 80% power for detecting a 4 mg/dL improvement.

LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgOScNCmF1dGhvcjogJ0dlcmFyZCBJa2UnDQpkYXRlOiAiMjAyNi0wNC0wNyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQoNCmlmICghcmVxdWlyZSgia25pdHIiKSkgeyAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdG8gZGV0ZWN0DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGEgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGluDQogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQNCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgaXQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAgICAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgICAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBkZWZhdWx0IGxlYWRpbmcgaGFzaCB0YWdzIGluIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBRdWVzdGlvbiAoYSk6IEh5cG90aGVzaXMgVGVzdCBmb3IgTERMIFJlZHVjdGlvbg0KDQojIyBTdGVwIDE6IFByb2JsZW0gU2V0dXANCg0KV2UgYXJlIGdpdmVuIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246DQoNCi0gU2FtcGxlIHNpemU6IFwoIG4gPSA1IFwpDQotIFNhbXBsZSBtZWFuOiBcKCBcYmFye3h9ID0gMjkgXCkNCi0gUG9wdWxhdGlvbiBtZWFuIHVuZGVyIHN0YW5kYXJkIGRydWc6IFwoIFxtdV8wID0gMjUgXCkNCi0gUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KDQpUaGUgcmVzZWFyY2hlcnMgYmVsaWV2ZSB0aGF0IHRoZSBuZXcgZHJ1ZyBpcyAqKm1vcmUgZWZmZWN0aXZlKiosIG1lYW5pbmcgaXQgbGVhZHMgdG8gYSBncmVhdGVyIExETCByZWR1Y3Rpb24uDQoNCi0tLQ0KDQojIyBTdGVwIDI6IEh5cG90aGVzZXMNCg0KV2UgZm9ybXVsYXRlIGEgb25lLXNpZGVkIGh5cG90aGVzaXMgdGVzdDoNCg0KXFsNCkhfMDogXG11ID0gMjUNClxdDQpcWw0KSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMzogVGVzdCBTdGF0aXN0aWMNCg0KU2luY2UgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIFwoIFxzaWdtYSBcKSBpcyBrbm93biwgd2UgdXNlIGEgKipvbmUtc2FtcGxlIHotdGVzdCoqOg0KDQpcWw0KWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19DQpcXQ0KDQpTdWJzdGl0dXRpbmcgdGhlIHZhbHVlczoNCg0KXFsNClogPSBcZnJhY3syOSAtIDI1fXsxNSAvIFxzcXJ0ezV9fSA9IFxmcmFjezR9ezE1IC8gXHNxcnR7NX19ID0gXGZyYWN7NFxzcXJ0ezV9fXsxNX0NClxdDQoNClxbDQpaIFxhcHByb3ggMC41OTYNClxdDQoNCi0tLQ0KDQojIyBTdGVwIDQ6IENyaXRpY2FsIFZhbHVlDQoNCkZvciBhIHJpZ2h0LXRhaWxlZCB0ZXN0IGF0IFwoIFxhbHBoYSA9IDAuMDUgXCk6DQoNClxbDQp6X3swLjA1fSA9IDEuNjQ1DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCA1OiBEZWNpc2lvbg0KDQpTaW5jZToNCg0KXFsNClogPSAwLjU5NiA8IDEuNjQ1DQpcXQ0KDQp3ZSAqKmZhaWwgdG8gcmVqZWN0KiogXCggSF8wIFwpLg0KDQotLS0NCg0KIyMgU3RlcCA2OiBJbnRlcnByZXRhdGlvbg0KDQpUaGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RhdGlzdGljYWwgZXZpZGVuY2UgYXQgdGhlIFwoIFxhbHBoYSA9IDAuMDUgXCkgbGV2ZWwgdG8gY29uY2x1ZGUgdGhhdCB0aGUgbmV3IGRydWcgcmVzdWx0cyBpbiBhIGdyZWF0ZXIgbWVhbiBMREwgcmVkdWN0aW9uIGNvbXBhcmVkIHRvIHRoZSBzdGFuZGFyZCB0cmVhdG1lbnQuDQoNCi0tLQ0KDQojIyBWZXJpZmljYXRpb24gVXNpbmcgUg0KDQpgYGB7cn0NCiMgR2l2ZW4gdmFsdWVzDQp4X2JhciA8LSAyOSAgICAgICAjIHNhbXBsZSBtZWFuDQptdV8wIDwtIDI1ICAgICAgICAjIG51bGwgbWVhbg0Kc2lnbWEgPC0gMTUgICAgICAgIyBrbm93biBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbg0KbiA8LSA1ICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZQ0KDQojIENvbXB1dGUgei1zdGF0aXN0aWMNCnpfc3RhdCA8LSAoeF9iYXIgLSBtdV8wKSAvIChzaWdtYSAvIHNxcnQobikpDQoNCiMgQ29tcHV0ZSBwLXZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KcF92YWx1ZSA8LSAxIC0gcG5vcm0oel9zdGF0KQ0KDQojIENyaXRpY2FsIHZhbHVlIGF0IGFscGhhID0gMC4wNQ0Kel9jcml0IDwtIHFub3JtKDAuOTUpDQoNCiMgT3V0cHV0IHJlc3VsdHMNCmNhdCgiWi1zdGF0aXN0aWM6Iiwgcm91bmQoel9zdGF0LCAzKSwgIlxuIikNCmNhdCgiQ3JpdGljYWwgdmFsdWU6Iiwgcm91bmQoel9jcml0LCAzKSwgIlxuIikNCmNhdCgiUC12YWx1ZToiLCByb3VuZChwX3ZhbHVlLCA0KSwgIlxuIikNCmBgYA0KDQoNCiMjIFN1bW1hcnkNCg0KVGhlIG9ic2VydmVkIHNhbXBsZSBtZWFuIExETCByZWR1Y3Rpb24gKFwoIFxiYXJ7eH0gPSAyOSBcKSkgaXMgaGlnaGVyIHRoYW4gdGhlIHN0YW5kYXJkIHRyZWF0bWVudCBtZWFuIG9mIFwoIFxtdV8wID0gMjUgXCkuIEhvd2V2ZXIsIHdoZW4gc3RhbmRhcmRpemVkIHVzaW5nIHRoZSBzdGFuZGFyZCBlcnJvciBcKCBcc2lnbWEvXHNxcnR7bn0gPSAxNS9cc3FydHs1fSBcYXBwcm94IDYuNzEgXCksIHRoZSByZXN1bHRpbmcgdGVzdCBzdGF0aXN0aWMgaXMgXCggWiBcYXBwcm94IDAuNTk2IFwpLCB3aGljaCBpcyByZWxhdGl2ZWx5IHNtYWxsLg0KDQpUaGlzIGFuYWx5c2lzIGlzIHZhbGlkIGJlY2F1c2UgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGFzc3VtZWQga25vd24gYW5kIHRoZSB0ZXN0IGZvbGxvd3MgYSBub3JtYWwgbW9kZWwsIGFsbG93aW5nIHRoZSB1c2Ugb2YgYSBvbmUtc2FtcGxlIHotdGVzdC4gVGhlIGh5cG90aGVzaXMgdGVzdCBpcyBjb3JyZWN0bHkgc3BlY2lmaWVkIGFzIGEgcmlnaHQtdGFpbGVkIHRlc3QgYmFzZWQgb24gdGhlIHJlc2VhcmNoIGNsYWltIHRoYXQgdGhlIG5ldyBkcnVnIGlzIG1vcmUgZWZmZWN0aXZlLg0KDQpUaGUgcmVzdWx0cyBpbmRpY2F0ZSB0aGF0IHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlIG9mIDQgbWcvZEwgaXMgc21hbGwgcmVsYXRpdmUgdG8gdGhlIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiBVbmRlciB0aGUgbnVsbCBoeXBvdGhlc2lzLCBzdWNoIGEgc2FtcGxlIG1lYW4gaXMgbm90IHVubGlrZWx5IChwLXZhbHVlIOKJiCAwLjI4KSwgbWVhbmluZyBpdCBjb3VsZCByZWFzb25hYmx5IG9jY3VyIGR1ZSB0byByYW5kb20gc2FtcGxpbmcgdmFyaWF0aW9uLiBUaGVyZWZvcmUsIHRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IHRoZSBuZXcgZHJ1ZyBwcm92aWRlcyBhIGdyZWF0ZXIgbWVhbiBMREwgcmVkdWN0aW9uLg0KDQoNCg0KIyBRdWVzdGlvbiAoYik6IFBvd2VyIENhbGN1bGF0aW9uDQoNCiMjIFN0ZXAgMTogUHJvYmxlbSBTZXR1cA0KDQpXZSBhcmUgZ2l2ZW46DQoNCi0gU2FtcGxlIHNpemU6IFwoIG4gPSA1MCBcKQ0KLSBTdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KLSBFZmZlY3Qgc2l6ZSB0byBkZXRlY3Q6IFwoIFxkZWx0YSA9IDQgXCkNCg0KV2UgYXJlIHRlc3Rpbmc6DQoNClxbDQpIXzA6IFxtdSA9IDI1IFxxdWFkIFx0ZXh0e3ZzLn0gXHF1YWQgSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMjogVGVzdCBGcmFtZXdvcmsNCg0KV2UgdXNlIGEgKipvbmUtc2lkZWQgei10ZXN0KiosIHNpbmNlIFwoIFxzaWdtYSBcKSBpcyBrbm93bi4NCg0KVGhlIHJlamVjdGlvbiBydWxlIGlzOg0KDQpcWw0KWiA+IHpfezEtXGFscGhhfQ0KXF0NCg0Kd2hlcmU6DQoNClxbDQp6X3sxLVxhbHBoYX0gPSB6X3swLjk1fSA9IDEuNjQ1DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBOb24tQ2VudHJhbGl0eSBQYXJhbWV0ZXINCg0KVGhlIG5vbi1jZW50cmFsaXR5IHBhcmFtZXRlciBpczoNCg0KXFsNClxsYW1iZGEgPSBcZnJhY3tcbXUgLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19ID0gXGZyYWN7XGRlbHRhfXtcc2lnbWEgLyBcc3FydHtufX0NClxdDQoNClN1YnN0aXR1dGluZyB2YWx1ZXM6DQoNClxbDQpcbGFtYmRhID0gXGZyYWN7NH17MTUvXHNxcnR7NTB9fSA9IFxmcmFjezRcc3FydHs1MH19ezE1fSBcYXBwcm94IDEuODg2DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCA0OiBQb3dlciBDYWxjdWxhdGlvbg0KDQpQb3dlciBpczoNCg0KXFsNClx0ZXh0e1Bvd2VyfSA9IFBcbGVmdChaID4gel97MS1cYWxwaGF9IFxtaWQgXG11ID0gMjlccmlnaHQpDQpcXQ0KDQpUaGlzIGNhbiBiZSByZXdyaXR0ZW4gdXNpbmcgdGhlIHNoaWZ0Og0KDQpcWw0KXHRleHR7UG93ZXJ9ID0gUFxsZWZ0KFogPiAxLjY0NSAtIFxsYW1iZGFccmlnaHQpDQpcXQ0KDQpcWw0KPSAxIC0gXFBoaSgxLjY0NSAtIDEuODg2KQ0KXF0NCg0KXFsNCj0gMSAtIFxQaGkoLTAuMjQxKQ0KXF0NCg0KXFsNClxhcHByb3ggMSAtIDAuNDA1ID0gMC41OTUNClxdDQoNCi0tLQ0KDQojIyBTdGVwIDU6IFJlc3VsdA0KDQpcWw0KXHRleHR7UG93ZXJ9IFxhcHByb3ggMC41OTUNClxdDQoNCi0tLQ0KDQojIyBWZXJpZmljYXRpb24gVXNpbmcgUg0KDQpgYGB7cn0NCiMgR2l2ZW4gdmFsdWVzDQpuIDwtIDUwDQpzaWdtYSA8LSAxNQ0KZGVsdGEgPC0gNA0KYWxwaGEgPC0gMC4wNQ0KDQojIFN0YW5kYXJkIGVycm9yDQpzZSA8LSBzaWdtYSAvIHNxcnQobikNCg0KIyBOb24tY2VudHJhbGl0eSBwYXJhbWV0ZXINCmxhbWJkYSA8LSBkZWx0YSAvIHNlDQoNCiMgQ3JpdGljYWwgdmFsdWUNCnpfY3JpdCA8LSBxbm9ybSgxIC0gYWxwaGEpDQoNCiMgUG93ZXIgY2FsY3VsYXRpb24NCnBvd2VyIDwtIDEgLSBwbm9ybSh6X2NyaXQgLSBsYW1iZGEpDQoNCiMgT3V0cHV0DQpjYXQoIk5vbi1jZW50cmFsaXR5IHBhcmFtZXRlcjoiLCByb3VuZChsYW1iZGEsIDMpLCAiXG4iKQ0KY2F0KCJDcml0aWNhbCB2YWx1ZToiLCByb3VuZCh6X2NyaXQsIDMpLCAiXG4iKQ0KY2F0KCJQb3dlcjoiLCByb3VuZChwb3dlciwgNCksICJcbiIpDQpgYGANCg0KIyMgU3VtbWFyeQ0KVGhlIGNhbGN1bGF0ZWQgcG93ZXIgaXMgYXBwcm94aW1hdGVseSANCjAuNTk1LCBpbmRpY2F0aW5nIGFib3V0IGEgNTkuNSUgY2hhbmNlIG9mIGNvcnJlY3RseSByZWplY3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyB3aGVuIHRoZSB0cnVlIG1lYW4gaW1wcm92ZW1lbnQgaXMgNCBtZy9kTC4NCg0KVGhpcyBhbmFseXNpcyBpcyB2YWxpZCBiZWNhdXNlIGl0IGZvbGxvd3MgdGhlIHRoZW9yZXRpY2FsIGZyYW1ld29yayBmb3IgcG93ZXIgY2FsY3VsYXRpb24gdXNpbmcgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24sIGFzIG91dGxpbmVkIGluIHRoZSBsZWN0dXJlIG5vdGVzLiBUaGUga25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24ganVzdGlmaWVzIHRoZSB1c2Ugb2YgYSB6LXRlc3QsIGFuZCB0aGUgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGNvcnJlY3RseSBjYXB0dXJlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiANCkgNCjANCiBhbmQgDQpIDQphDQoJDQpUaGUgcmVzdWx0IHNob3dzIHRoYXQgZXZlbiB3aXRoIGEgbGFyZ2VyIHNhbXBsZSBzaXplIChuPTUwKSwgdGhlIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhIHRydWUgaW1wcm92ZW1lbnQgb2YgNCBtZy9kTCBpcyBzdGlsbCBtb2RlcmF0ZS4gVGhpcyByZWZsZWN0cyB0aGF0IHRoZSBlZmZlY3Qgc2l6ZSBpcyByZWxhdGl2ZWx5IHNtYWxsIGNvbXBhcmVkIHRvIHRoZSB2YXJpYWJpbGl0eSAoz4M9MTUpLiBDb25zZXF1ZW50bHksIHRoZXJlIHJlbWFpbnMgYSBzdWJzdGFudGlhbCBwcm9iYWJpbGl0eSAoYWJvdXQgNDAlKSBvZiBmYWlsaW5nIHRvIGRldGVjdCBhIHJlYWwgaW1wcm92ZW1lbnQsIGhpZ2hsaWdodGluZyB0aGUgaW1wb3J0YW5jZSBvZiBlaXRoZXIgaW5jcmVhc2luZyBzYW1wbGUgc2l6ZSBvciB0YXJnZXRpbmcgbGFyZ2VyIGVmZmVjdCBzaXplcyBpbiBzdHVkeSBkZXNpZ24uDQoNCg0KIyBRdWVzdGlvbiAoYyk6IE1pbmltdW0gU2FtcGxlIFNpemUgRGV0ZXJtaW5hdGlvbg0KDQojIyBTdGVwIDE6IFByb2JsZW0gU2V0dXANCg0KV2UgYXJlIGdpdmVuOg0KDQotIERlc2lyZWQgcG93ZXI6IFwoIDEgLSBcYmV0YSA9IDAuODAgXCkNCi0gU2lnbmlmaWNhbmNlIGxldmVsOiBcKCBcYWxwaGEgPSAwLjA1IFwpDQotIFN0YW5kYXJkIGRldmlhdGlvbjogXCggXHNpZ21hID0gMTUgXCkNCi0gRWZmZWN0IHNpemU6IFwoIFxkZWx0YSA9IDQgXCkNCg0KV2UgYXJlIHRlc3Rpbmc6DQoNClxbDQpIXzA6IFxtdSA9IDI1IFxxdWFkIFx0ZXh0e3ZzLn0gXHF1YWQgSF9hOiBcbXUgPiAyNQ0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgMjogQXBwcm94aW1hdGUgU2FtcGxlIFNpemUgRm9ybXVsYQ0KDQpUaGUgcmVxdWlyZWQgc2FtcGxlIHNpemUgY2FuIGJlIGFwcHJveGltYXRlZCB1c2luZzoNCg0KXFsNCm4gXGFwcHJveCBcbGVmdCggXGZyYWN7KHpfezEtXGFscGhhfSArIHpfezEtXGJldGF9KSBcY2RvdCBcc2lnbWF9e1xkZWx0YX0gXHJpZ2h0KV4yDQpcXQ0KDQpGb3IgYSBvbmUtc2lkZWQgdGVzdDoNCg0KLSBcKCB6X3sxLVxhbHBoYX0gPSB6X3swLjk1fSA9IDEuNjQ1IFwpDQotIFwoIHpfezEtXGJldGF9ID0gel97MC44MH0gPSAwLjg0MiBcKQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBNYW51YWwgQ2FsY3VsYXRpb24NCg0KXFsNCm4gXGFwcHJveCBcbGVmdCggXGZyYWN7KDEuNjQ1ICsgMC44NDIpXGNkb3QgMTV9ezR9IFxyaWdodCleMg0KXF0NCg0KXFsNCj0gXGxlZnQoIFxmcmFjezIuNDg3IFxjZG90IDE1fXs0fSBccmlnaHQpXjINCj0gXGxlZnQoIFxmcmFjezM3LjMwNX17NH0gXHJpZ2h0KV4yDQo9ICg5LjMyNileMg0KXGFwcHJveCA4Ni45OA0KXF0NCg0KXFsNCm4gXGFwcHJveCA4Nw0KXF0NCg0KLS0tDQoNCiMjIFN0ZXAgNDogUmVzdWx0DQoNClxbDQpcYm94ZWR7biA9IDg3fQ0KXF0NCg0KLS0tDQoNCiMjIFZlcmlmaWNhdGlvbiBVc2luZyBSDQoNCmBgYHtyfQ0KIyBVc2UgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSByZXF1aXJlZCBzYW1wbGUgc2l6ZQ0KDQpzYW1wbGVfc2l6ZSA8LSBwb3dlci50LnRlc3QocG93ZXIgPSAwLjgwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSA0LCAgICAgICAjIGVmZmVjdCBzaXplDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IDE1LCAgICAgICAgICMgc3RhbmRhcmQgZGV2aWF0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcubGV2ZWwgPSAwLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJvbmUuc2FtcGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gIm9uZS5zaWRlZCIpDQoNCiMgUm91bmQgdXAgc2luY2Ugc2FtcGxlIHNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyDQpjZWlsaW5nKHNhbXBsZV9zaXplJG4pDQpgYGANCg0KDQojIyBTdW1tYXJ5DQoNClRoZSByZXF1aXJlZCBzYW1wbGUgc2l6ZSB0byBhY2hpZXZlIDgwJSBwb3dlciBmb3IgZGV0ZWN0aW5nIGEgNCBtZy9kTCBpbXByb3ZlbWVudCBpcyBhcHByb3hpbWF0ZWx5IG49ODcuVGhpcyBhbmFseXNpcyBpcyB2YWxpZCBiZWNhdXNlIGl0IGZvbGxvd3MgdGhlIHN0YW5kYXJkIHNhbXBsZSBzaXplIGRldGVybWluYXRpb24gZnJhbWV3b3JrIGJhc2VkIG9uIG5vcm1hbCBhcHByb3hpbWF0aW9ucywgYXMgb3V0bGluZWQgaW4gdGhlIGxlY3R1cmUgbm90ZXMuIFRoZSBmb3JtdWxhIGluY29ycG9yYXRlcyBib3RoIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgKM6xKSBhbmQgZGVzaXJlZCBwb3dlciAoMeKIks6yKSwgZW5zdXJpbmcgdGhhdCB0aGUgdGVzdCBoYXMgYSBjb250cm9sbGVkIFR5cGUgSSBlcnJvciByYXRlIGFuZCBhIHN1ZmZpY2llbnRseSBoaWdoIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhIHRydWUgZWZmZWN0Lg0KDQpUaGUgcmVzdWx0IGhpZ2hsaWdodHMgdGhhdCBhIHN1YnN0YW50aWFsbHkgbGFyZ2VyIHNhbXBsZSBzaXplIGlzIG5lZWRlZCBjb21wYXJlZCB0byBwYXJ0IChiKS4gVGhpcyByZWZsZWN0cyB0aGUgcmVsYXRpdmVseSBzbWFsbCBlZmZlY3Qgc2l6ZSAozrQ9NCkgY29tcGFyZWQgdG8gdGhlIHZhcmlhYmlsaXR5ICjPgz0xNSkuIERldGVjdGluZyBzdWNoIGEgbW9kZXN0IGltcHJvdmVtZW50IHdpdGggaGlnaCByZWxpYWJpbGl0eSByZXF1aXJlcyBtb3JlIG9ic2VydmF0aW9ucywgcmVpbmZvcmNpbmcgdGhlIHRyYWRlb2ZmIGJldHdlZW4gZWZmZWN0IHNpemUsIHZhcmlhYmlsaXR5LCBhbmQgc2FtcGxlIHNpemUgaW4gaHlwb3RoZXNpcyB0ZXN0aW5nLg0KDQoNCiMgUXVlc3Rpb24gKGQpOiBQb3dlciBDdXJ2ZSBhcyBhIEZ1bmN0aW9uIG9mIFNhbXBsZSBTaXplDQoNCiMjIFN0ZXAgMTogT2JqZWN0aXZlDQoNCldlIGV4YW1pbmUgaG93IHN0YXRpc3RpY2FsIHBvd2VyIGNoYW5nZXMgYXMgdGhlIHNhbXBsZSBzaXplIFwoIG4gXCkgdmFyaWVzLCB3aGlsZSBob2xkaW5nIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGZpeGVkLg0KDQpHaXZlbjoNCg0KLSBFZmZlY3Qgc2l6ZTogXCggXGRlbHRhID0gNCBcKQ0KLSBTdGFuZGFyZCBkZXZpYXRpb246IFwoIFxzaWdtYSA9IDE1IFwpDQotIFNpZ25pZmljYW5jZSBsZXZlbDogXCggXGFscGhhID0gMC4wNSBcKQ0KLSBPbmUtc2lkZWQgdGVzdA0KDQotLS0NCg0KIyMgU3RlcCAyOiBQb3dlciBGdW5jdGlvbg0KDQpwb3dlciBpcyBnaXZlbiBieToNCg0KXFsNClx0ZXh0e1Bvd2VyfShuKSA9IDEgLSBcUGhpXGxlZnQoel97MS1cYWxwaGF9IC0gXGZyYWN7XGRlbHRhfXtcc2lnbWEvXHNxcnR7bn19XHJpZ2h0KQ0KXF0NCg0Kd2hlcmU6DQoNClxbDQpcbGFtYmRhKG4pID0gXGZyYWN7XGRlbHRhfXtcc2lnbWEvXHNxcnR7bn19ID0gXGZyYWN7XGRlbHRhIFxzcXJ0e259fXtcc2lnbWF9DQpcXQ0KDQotLS0NCg0KIyMgU3RlcCAzOiBDb21wdXRlIFBvd2VyIEFjcm9zcyBTYW1wbGUgU2l6ZXMNCg0KV2UgZXZhbHVhdGUgcG93ZXIgZm9yIGEgc2VxdWVuY2Ugb2Ygc2FtcGxlIHNpemVzIHRvIG9ic2VydmUgaG93IGl0IGluY3JlYXNlcyB3aXRoIFwoIG4gXCkuDQoNCmBgYHtyfQ0KIyBQYXJhbWV0ZXJzDQpzaWdtYSA8LSAxNQ0KZGVsdGEgPC0gNA0KYWxwaGEgPC0gMC4wNQ0KDQojIENyaXRpY2FsIHZhbHVlDQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhKQ0KDQojIFNlcXVlbmNlIG9mIHNhbXBsZSBzaXplcw0Kbl92YWx1ZXMgPC0gc2VxKDUsIDE1MCwgYnkgPSAxKQ0KDQojIENvbXB1dGUgcG93ZXIgZm9yIGVhY2ggbg0KcG93ZXJfdmFsdWVzIDwtIHNhcHBseShuX3ZhbHVlcywgZnVuY3Rpb24obikgew0KICBsYW1iZGEgPC0gZGVsdGEgLyAoc2lnbWEgLyBzcXJ0KG4pKSAgIyBub24tY2VudHJhbGl0eSBwYXJhbWV0ZXINCiAgMSAtIHBub3JtKHpfY3JpdCAtIGxhbWJkYSkNCn0pDQoNCiMgUGxvdCBwb3dlciBjdXJ2ZQ0KcGxvdChuX3ZhbHVlcywgcG93ZXJfdmFsdWVzLCB0eXBlID0gImwiLA0KICAgICB4bGFiID0gIlNhbXBsZSBTaXplIChuKSIsDQogICAgIHlsYWIgPSAiUG93ZXIiLA0KICAgICBtYWluID0gIlBvd2VyIEN1cnZlIGZvciBEZXRlY3RpbmcgzrQgPSA0IiwNCiAgICAgbHdkID0gMikNCg0KIyBBZGQgcmVmZXJlbmNlIGxpbmUgYXQgODAlIHBvd2VyDQphYmxpbmUoaCA9IDAuODAsIGx0eSA9IDIpDQpgYGANCg0KIyMgSW50ZXJwcmV0YXRpb24NCg0KVGhlIHBsb3Qgc2hvd3MgdGhhdCBwb3dlciBpbmNyZWFzZXMgbW9ub3RvbmljYWxseSBhcyB0aGUgc2FtcGxlIHNpemUgaW5jcmVhc2VzLiBGb3Igc21hbGwgXCggbiBcKSwgcG93ZXIgaXMgbG93IGR1ZSB0byBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBzYW1wbGUgbWVhbi4gQXMgXCggbiBcKSBncm93cywgdGhlIHN0YW5kYXJkIGVycm9yIFwoIFxzaWdtYS9cc3FydHtufSBcKSBkZWNyZWFzZXMsIG1ha2luZyBpdCBlYXNpZXIgdG8gZGV0ZWN0IHRoZSBlZmZlY3QuDQoNClRoZSBjdXJ2ZSBjcm9zc2VzIHRoZSAwLjgwIHRocmVzaG9sZCBhdCBhcHByb3hpbWF0ZWx5IFwoIG4gXGFwcHJveCA4NyBcKSwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZXN1bHQgb2J0YWluZWQgaW4gcGFydCAoYykuDQoNCg0KIyMgU3VtbWFyeQ0KDQpUaGUgcG93ZXIgY3VydmUgZGVtb25zdHJhdGVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzYW1wbGUgc2l6ZSBhbmQgdGhlIGFiaWxpdHkgdG8gZGV0ZWN0IGEgdHJ1ZSBlZmZlY3QuIEFzIHNhbXBsZSBzaXplIGluY3JlYXNlcywgdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBzYW1wbGUgbWVhbiBkZWNyZWFzZXMsIGxlYWRpbmcgdG8gaGlnaGVyIHBvd2VyLg0KDQpUaGlzIGFuYWx5c2lzIGlzIHZhbGlkIGJlY2F1c2UgaXQgZGlyZWN0bHkgYXBwbGllcyB0aGUgdGhlb3JldGljYWwgcG93ZXIgZnVuY3Rpb24gZGVyaXZlZCBmcm9tIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIGFuZCB1c2VzIGNvbnNpc3RlbnQgcGFyYW1ldGVyIHZhbHVlcyBmcm9tIHByZXZpb3VzIHBhcnRzLiBUaGUgdXNlIG9mIGEgY29udGludW91cyByYW5nZSBvZiBuIHZhbHVlcyBhbGxvd3MgZm9yIGEgY2xlYXIgdmlzdWFsaXphdGlvbiBvZiBob3cgcG93ZXIgZXZvbHZlcy4NCg0KVGhlIHJlc3VsdHMgY29uZmlybSB0aGF0IHNtYWxsIHNhbXBsZSBzaXplcyBwcm92aWRlIGluc3VmZmljaWVudCBwb3dlciB0byBkZXRlY3QgbW9kZXN0IGVmZmVjdHMsIHdoaWxlIGxhcmdlciBzYW1wbGVzIHN1YnN0YW50aWFsbHkgaW1wcm92ZSB0aGUgcHJvYmFiaWxpdHkgb2YgY29ycmVjdGx5IHJlamVjdGluZyB0aGUgbnVsbCBoeXBvdGhlc2lzLiBUaGlzIHJlaW5mb3JjZXMgdGhlIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChjKSB0aGF0IGEgc2FtcGxlIHNpemUgb2YgYXBwcm94aW1hdGVseSA4NyBpcyByZXF1aXJlZCB0byBhY2hpZXZlIDgwJSBwb3dlciBmb3IgZGV0ZWN0aW5nIGEgNCBtZy9kTCBpbXByb3ZlbWVudC4NCg==