Study Cases

Statistical Inferences~ Week 14

Carol Dupino Pereira

NIM : 52250051

Student Major in Data Science at
Institut Teknologi Sains Bandung

R Programming
Data Science
Statistics
Dosen Pembimbing
Bakti Siregar, M.Sc., CDS.

1 Case Study 1

1.1 One-Sample Z-Test (Statistical Hypotheses)

A digital learning platform claims that the average daily study time of its users is 120 minutes. Based on historical records, the population standard deviation is known to be 15 minutes.

A random sample of 64 users shows an average study time of 116 minutes.

\[ \begin{eqnarray*} \mu_0 &=& 120 \\ \sigma &=& 15 \\ n &=& 64 \\ \bar{x} &=& 116 \end{eqnarray*} \]

1.2 Tasks

  1. Formulate the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).
  2. Identify the appropriate statistical test and justify your choice.
  3. Compute the test statistic and p-value using \(\alpha = 0.05\).
  4. State the statistical decision.
  5. Interpret the result in a business analytics context.

1.3 Answer Case Study 1

  1. Formulate the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).

In hypothesis testing, we compare a “status quo” claim against a new observation to see if there is a statistically significant difference.

  • The Null Hypothesis (\(H_0\))

The null hypothesis represents the claim that there is no change or no difference. In this case, it assumes the platform’s claim is correct.

  • Statement: The average daily study time of users is equal to 120 minutes.Mathematical

  • Form: \[H_0: \mu = 120\]

  • The Alternative Hypothesis (\(H_1\))

The alternative hypothesis is what we suspect might actually be true (that the claim is incorrect). Since the problem does not specify if we are looking for “less than” or “greater than,” we test for any significant difference.

  • Statement: The average daily study time of users is not equal to 120 minutes.
  • Mathematical Form: \[H_1: \mu \neq 120\]

To move forward with the calculation (the Z-test), you have the following known values:

Statistical Parameters
Parameter Symbol Value
Population Mean μ0 120 minutes
Population Std. Deviation σ 15 minutes
Sample Size n 64
Sample Mean 116 minutes
  1. Identify the appropriate statistical test and justify your choice.

The choice of a Z-test over a T-test is based on two primary criteria found in the data:

  • Justification 1: Known Population Standard Deviation

The most critical factor in choosing a Z-test is that the population standard deviation (\(\sigma\)) is known. In this case, the platform provides a historical record showing \(\sigma = 15\).

  • If \(\sigma\) were unknown and we had to rely on the sample standard deviation (\(s\)), a T-test would typically be required to account for the additional uncertainty.

  • Justification 2: Large Sample Size (\(n \ge 30\))The sample size in this study is 64, which is significantly larger than the common threshold of 30.

  • According to the Central Limit Theorem, when the sample size is large (\(n \ge 30\)), the sampling distribution of the mean becomes approximately normal, regardless of the shape of the underlying population distribution. This reinforces the validity of using the standard normal distribution (Z-distribution).

Requirements Check for Statistical Test
Requirement Case Study Value Condition Met?
Population Std. Dev. (σ) Known (15) Yes
Sample Size (n) 64 Yes (since n≥30)
Data Type Continuous (minutes) Yes
Independence Random sample Yes

Conclusion: Because the population standard deviation is known and the sample size is sufficiently large, the One-Sample Z-Test is the most precise and robust method for this analysis.

  1. Compute the test statistic and p-value using \(\alpha = 0.05\).

Compute the Test Statistic

The Z-score measures how many standard errors the sample mean (\(\bar{x}\)) is from the population mean (\(\mu_0\)).

  • Step 1: Calculate the Standard Error (\(SE\))The standard error represents the standard deviation of the sampling distribution.

\[SE = \frac{\sigma}{\sqrt{n}} = \frac{15}{\sqrt{64}} = \frac{15}{8} = 1.875\]

  • Step 2: Calculate the Z-score (\(z\))\[z = \frac{\bar{x} - \mu_0}{SE} = \frac{116 - 120}{1.875} = \frac{-4}{1.875} \approx -2.1333\] The test statistic is \(z = -2.13\).

Compute the P-Value

Since our alternative hypothesis is two-tailed (\(H_1: \mu \neq 120\)), we look for the probability of observing a Z-score more extreme than \(\pm 2.13\) in both tails of the standard normal distribution.

  • P-value calculation: \(P(|Z| > 2.13) = 2 \times P(Z < -2.13)\)

  • Using the standard normal table (or software):\(P(Z < -2.13) \approx 0.0164\)

  • Two-tailed p-value \(= 2 \times 0.0164 = 0.0328\)

The p-value is \(0.0329\) (rounded).

Z-Test Results Summary
Statistical Measure Value
Z-Statistic -2.13
P-value 0.0329
Threshold (α) 0.05
Final Decision Reject H₀

Comparison: Since the p-value (\(0.0329\)) < \(\alpha\) (\(0.05\)), the result is statistically significant.

How to Read the Visualization:

  • Black Line: Standard normal distribution curve.

  • Red Area: \(H_0\) rejection region. The boundary is \(\pm 1.96\). If the Z-count falls into this area, we reject the platform’s claim.

  • Blue Dashed Line: The position of our sample data at -2.13.

  • Conclusion: Since the blue line is within the Red Area, we can immediately visually see that the results of this study are significant (Reject \(H_0\)).

  1. State the statistical decision

To reach a final decision, we evaluate whether the evidence is strong enough to reject the platform’s initial claim.

The Decision Rule

  • P-value (\(0.0329\)) < Alpha (\(0.05\)): The result is statistically significant.
  • Z-statistic (\(-2.13\)): This falls outside the “Fail to Reject” range (which is between \(-1.96\) and \(+1.96\) for a 95% confidence level).

Final Decision

Reject the Null Hypothesis (\(H_0\))

Formal Interpretation

There is sufficient evidence at the \(\alpha = 0.05\) significance level to conclude that the average daily study time of the digital learning platform’s users is significantly different from 120 minutes.

The data suggests that the true population mean is likely lower than what the platform claims, given that our sample mean of 116 minutes resulted in a Z-score that reached the “rejection region.”

Hypothesis Test Decision Criteria
Observed
Decision Rule
Conclusion
Metric Value Threshold/Condition Decision
Z-Score −2.13 |z| > 1.96 Reject H₀
P-value 0.0329 p < 0.05 Statistically Significant
Note:
Note: The absolute Z-score (|−2.13| = 2.13) exceeds the critical value of 1.96, and the p-value is less than 0.05, providing sufficient evidence to reject the null hypothesis at the 5% significance level.

Conclusion: The platform’s claim is not supported by the sample data.

  1. Interpret the result in a business analytics context.

Discrepancy in Performance Claims

The analysis reveals that the platform’s claim of 120 minutes of study time is statistically overestimated. The observed average of 116 minutes is not just a random fluctuation; it represents a significant downward departure from the historical benchmark.

  • Business Impact: If this 120-minute figure is used in marketing materials or investor pitches, it may be considered misleading. The data suggests the “real” user engagement is lower than advertised.

User Engagement Insights

The 4-minute gap (\(120 - 116\)) might seem small, but on a scale of thousands of users, it indicates a shift in engagement patterns.

  • Potential Causes: This decline could be due to increased competition, a change in the difficulty of new content, or perhaps a segment of the user base is experiencing “learning fatigue.”

Operational Recommendations

Based on this statistical decision, a business analyst would recommend the following actions:

  • Audit Marketing Materials: Update engagement statistics to reflect current data (e.g., “Users average nearly 2 hours daily”) to maintain transparency.

  • Investigate Retention: Since study time is often a leading indicator of subscription renewal, the platform should investigate if this decrease in time correlates with a higher churn rate.

  • A/B Testing: Implement new features (like gamification or reminders) to see if the average study time can be pushed back toward the 120-minute goal.

Business Intelligence: Study Time Analysis
Analytics Component Business Finding Priority
Statistical Result The 120-minute claim is invalid at 95% confidence level (p = 0.0329 < 0.05) High
Magnitude of Error Average deficit of 4 minutes (~3.3% below target) across user base Medium
Actionable Insight Review user experience to identify engagement barriers High
Business Implication Potential reputational risk if inaccurate claims continue Critical
Recommendation Conduct A/B testing on platform features to improve engagement High
Note:
Based on sample of 64 users with mean study time of 116 minutes (σ = 15). Analysis conducted at α = 0.05.

2 Case Study 2

2.1 One-Sample T-Test (σ Unknown, Small Sample)

A UX Research Team investigates whether the average task completion time of a new application differs from 10 minutes.

The following data are collected from 10 users:

\[ 9.2,\; 10.5,\; 9.8,\; 10.1,\; 9.6,\; 10.3,\; 9.9,\; 9.7,\; 10.0,\; 9.5 \]

2.2 Tasks

  1. Define H₀ and H₁ (two-tailed).
  2. Determine the appropriate hypothesis test.
  3. Calculate the t-statistic and p-value at \(\alpha = 0.05\).
  4. Make a statistical decision.
  5. Explain how sample size affects inferential reliability.

2.3 Answer Case Study 2

  1. Define H₀ and H₁ (two-tailed).

To investigate whether the average task completion time differs from the 10-minute benchmark, we define our statistical hypotheses based on the population mean (\(\mu\)).In a two-tailed test, we are looking for any significant difference—whether the users are faster or slower than the target—rather than a specific direction.

The Null Hypothesis (\(H_0\))

The null hypothesis represents the “status quo” or the assumption that there is no effect or change.1 In this case, it states that the true average task completion time is exactly 10 minutes.\[H_0: \mu = 10\]

The Alternative Hypothesis (\(H_1\))

The alternative hypothesis represents the research claim we are testing for.2 Since this is a two-tailed test, it states that the true average task completion time is not equal to 10 minutes.\[H_1: \mu \neq 10\]

Contextual Summary

  • \(H_0\): The new application’s average task completion time is 10 minutes.

  • \(H_1\): The new application’s average task completion time is significantly different from 10 minutes.

For a one-sample t-test like this, the next step is usually to calculate the Sample Mean (\(\bar{x}\)) and Sample Standard Deviation (\(s\)) to find the test statistic.

  1. Determine the appropriate hypothesis test.

Selected Test: One-Sample t-Test

For this scenario, the One-Sample t-Test is the appropriate choice. This test is used to determine whether a sample mean significantly differs from a hypothesized population mean when the population standard deviation (\(\sigma\)) is unknown.

The selection is based on four specific criteria present in your case study:

  • Unknown Population Standard Deviation (\(\sigma\)): The problem does not provide the standard deviation for all possible users; we only have the raw data from a small group.

  • Small Sample Size (\(n < 30\)) : You are only testing 10 users. When the sample size is small and \(\sigma\) is unknown, the t-distribution is more accurate than the Z-distribution (Normal distribution).

  • Continuous Data: Task completion time is a ratio-level measurement (time), which is required for a t-test.

  • Comparison to a Fixed Standard: You are comparing the sample mean (\(\bar{x}\)) against a specific benchmark value (\(\mu_0 = 10\) minutes).

Statistical Test Parameters: One-Sample t-Test Setup
Category Parameter Symbol Value Status
Hypothesis Hypothesized Mean (μ₀) μ₀ 10 minutes Given
Sample Sample Size (n) n 10 Collected
Statistics Degrees of Freedom (df) df 9 Calculated
Data Data Type Continuous Valid
Assumptions Population SD (σ) σ Unknown Unknown → Use t-test
Note:
Note: Since population standard deviation (σ) is unknown, a t-test (not z-test) is appropriate for hypothesis testing.

Statistical Calculation Results

Based on the 10 user data you provided:

  • Sample Mean (\(\bar{x}\)): \(9.86\) minutes

  • Sample Standard Deviation (\(s\)): \(0.386\)

  • t-statistic (\(t_{obs}\)): \(-1.146\)

  • Degrees of Freedom (\(df\)): \(9\)

  • Critical Value (\(t_{crit}\)): \(\pm 2.262\) (for \(\alpha = 0.05\), two-tailed)

Conclusion: Since the calculated \(t\) value (\(-1.146\)) is between the critical values ​​(\(-2.262\) and \(+2.262\)), we fail to reject \(H_0\). There is no significant difference between the average task completion time and the target of 10 minutes.

  1. Calculate the t-statistic and p-value at \(\alpha = 0.05\).

Descriptive Statistics

First, we calculate the mean (\(\bar{x}\)) and the sample standard deviation (\(s\)):

  • Sample Mean (\(\bar{x}\)):

\[\bar{x} = \frac{\sum x}{n} = \frac{9.2 + 10.5 + 9.8 + 10.1 + 9.6 + 10.3 + 9.9 + 9.7 + 10.0 + 9.5}{10} = \mathbf{9.86}\]

  • Sample Standard Deviation (\(s\)):

\[s = \sqrt{\frac{\sum (x_i - \bar{x})^2}{n-1}} \approx \mathbf{0.386}\]

Calculation of t-statistic

The formula for \(t\)-statistic is:\[t = \frac{\bar{x} - \mu_0}{s / \sqrt{n}}\]

Where:

  • \(\bar{x} = 9.86\)

  • \(\mu_0 = 10\) (Hypothesis value)

  • \(s = 0.386\)\(n = 10\)

Calculation steps:

  • Calculate Standard Error (\(SE\)): \(SE = 0.386 / \sqrt{10} = 0.386 / 3.162 = \mathbf{0.122}\)

  • Calculate t-score: \(t = (9.86 - 10) / 0.122 = -0.14 / 0.122 = \mathbf{-1.147}\)

Determining the p-value

To determine the \(p\)-value, we need to look at the \(t\)-distribution table or use the statistical function with the parameters:

  • t-statistic: \(-1.147\)

  • Degrees of Freedom (1\(df\)): 2\(n - 1 = \mathbf{9}\)

  • Test Type: Two-tailed (two-way)

Based on the calculation:p-value \(\approx \mathbf{0.281}\)
One-Sample t-Test: Results Summary
Statistical Measure Value Interpretation
Test Statistic (t) -1.147 Standardized difference from μ₀
Degrees of Freedom (df) 9 n - 1 = 10 - 1
P-value (two-tailed) 0.281 Probability of observing such extreme results if H₀ is true
Significance Level (α) 0.05 Maximum acceptable Type I error rate
Critical Value (±t*) ±2.262 Boundary of rejection region
95% Confidence Interval [-1.35, 3.35] minutes* Plausible range for true population mean
Statistical Decision Fail to reject H₀ p-value > α → Retain null hypothesis
Practical Conclusion Insufficient evidence against claim Data consistent with 10-minute average
Note:
*Example confidence interval; actual depends on sample mean and SD
1 H₀: μ = 10 minutes
2 Sample size: n = 10
3 Test: Two-tailed t-test

Visual Analysis of the Plot

  • The Curve:Represents the range of possible outcomes if the null hypothesis (\(H_0\)) were true.

  • The Red Areas: These are the “Danger Zones” (Rejection Regions). If your blue line falls here, the result is significant.

  • The Blue Dashed Line: This represents your actual research result (\(t = -1.147\)).The Verdict: Because the Blue Line is in the white area (the “Fail to Reject” zone) and not in the red areas, we conclude that the task completion time is not significantly different from 10 minutes.

  1. Make a statistical decision.

Decision Criteria

There are two ways to state the decision, both leading to the same result:

P-value Approach: If \(p\text{-value} \leq \alpha\), reject \(H_0\).

  • Our \(p\text{-value} = 0.281\)

  • \(0.281 > 0.05\)

Critical Value Approach: If \(|t_{obs}| > t_{crit}\), reject

  • \(H_0\).\(|{-1.147}| = 1.147\)

  • \(t_{crit}\) (for \(df=9, \alpha=0.05\)) \(= 2.262\)

  • \(1.147 < 2.262\)

The Statistical Decision

Based on the evidence:

Fail to Reject the Null Hypothesis (\(H_0\))

Conclusion in Context

Since we failed to reject \(H_0\), the UX Research Team concludes that there is no statistically significant evidence to suggest that the average task completion time differs from 10 minutes.

The observed mean of \(9.86\) minutes is numerically lower than the target, but the difference is small enough that it could simply be due to random sampling variation rather than a true change in the application’s performance.

  1. Explain how sample size affects inferential reliability.

In inferential statistics, specifically within the context of a One-Sample t-Test, the sample size (\(n\)) is a critical lever that determines the reliability and sensitivity of your findings.2Here is how the sample size of 10 users affects the reliability of your UX research:

Influence on the Standard Error

The reliability of an inference depends on the Standard Error (\(SE\)), which measures how much the sample mean is expected to vary from the true population mean.

\[SE = \frac{s}{\sqrt{n}}\]

  • Small Sample (\(n=10\)): Since you are dividing by a smaller number (\(\sqrt{10}\)), the \(SE\) remains relatively large. This creates “noise,” making it harder to distinguish between a real improvement in the app and random chance.

  • Large Sample: As 5\(n\) increases, the \(SE\) decreases, meaning your sample mean becomes a much more precise estimate of the true population behavior.

The Shape of the t-Distribution

Because your sample size is small (\(n < 30\)), we must use the t-distribution rather than the Z-distribution (normal distribution).

  • Degrees of Freedom (\(df\)): With only 9 degrees of freedom (8\(n - 1\)), the t-distribution has “heavier tails”

  • Reliability Impact: Heavier tails mean that extreme values are more likely to occur by chance.10 To compensate for this uncertainty, the Critical Value becomes higher (in your case, \(\pm 2.262\)). This makes it harder to “reject the null hypothesis” unless the effect is very large.

Statistical Power and Type II Errors

The most significant impact on reliability here is Statistical Power.

  • The Risk: With only 10 users, the test has low power.11 This means there is a high risk of a Type II Error (failing to detect a real difference when one actually exists).

  • UX Context: If your new app actually reduced completion time to 9.5 minutes, a sample of 10 might not be enough to prove it statistically. You might wrongly conclude the app is “no different” from the old version simply because the sample was too small to provide “beyond a reasonable doubt” evidence.

Statistical Implications of Sample Size
Small Sample Characteristics
Large Sample Advantages
Key Consideration
Aspect Small Sample (n=10) Large Sample (n>30) Implication
Estimation Precision Low - High uncertainty High - Low uncertainty Interpret with caution
Sampling Distribution t-distribution (df=9) Approaches normal (z) Different critical values
Effect Detection Only large effects detectable Small effects detectable Practical vs statistical significance
Outlier Impact Significant distortion possible Minimal impact Check robustness
Statistical Test t-test mandatory z-test often acceptable Test selection matters
Confidence Intervals Wide (e.g., ±3.5 units) Narrow (e.g., ±1.0 units) Precision of estimates
Type II Error Risk High (Poor power) Low (Good power) False negative risk
Cost & Feasibility Low cost, quick High cost, time-consuming Study design trade-off
Note:
Note: The ‘n > 30’ rule is a guideline; in practice, sample size requirements depend on effect size, variability, and desired power.

3 Case Study 3

3.1 Two-Sample T-Test (A/B Testing)

A product analytics team conducts an A/B test to compare the average session duration (minutes) between two versions of a landing page.

Version Sample Size (n) Mean Standard Deviation
A 25 4.8 1.2
B 25 5.4 1.4

3.2 Tasks

  1. Formulate the null and alternative hypotheses.
  2. Identify the type of t-test required.
  3. Compute the test statistic and p-value.
  4. Draw a statistical conclusion at \(\alpha = 0.05\).
  5. Interpret the result for product decision-making.

3.3 Answer Case Study 3

  1. Formulate the null and alternative hypotheses.

Formulating the Hypotheses

  • To perform a two-sample t-test, we first define what we are testing for. We use \(\mu_A\) to represent the true population mean of Version A and \(\mu_B\) for Version B.

  • Null Hypothesis (\(H_0\))The null hypothesis assumes there is no significant difference between the two landing page versions. Any observed difference in the sample means is due to random chance.

  • \(H_0: \mu_A = \mu_B\) (or \(\mu_A - \mu_B = 0\))

  • Alternative Hypothesis (\(H_a\))

The alternative hypothesis suggests that there is a significant difference between the two versions. Since the task doesn’t specify a direction (e.g., “B is better than A”), we typically use a two-tailed test.

  • \(H_a: \mu_A \neq \mu_B\) (or \(\mu_A - \mu_B \neq 0\))
A/B Testing: Version Comparison Statistics
Control Group
Test Group
Absolute Δ
Relative Δ
Parameter Version A Version B Difference % Change
Sample Mean (x̄) 4.8 5.4 +0.6 +12.5%
Standard Deviation (s) 1.2 1.4 +0.2 +16.7%
Sample Size (n) 25 25 0 0%
Standard Error 0.240 0.280 +0.040 +16.7%
Variance (s²) 1.44 1.96 +0.52 +36.1%
Minimum ~2.4 ~2.6 +0.2 +8.3%
Maximum ~7.2 ~8.2 +1.0 +13.9%
Range ~4.8 ~5.6 +0.8 +16.7%
Note:
*Minimum, Maximum, and Range are estimates based on normal distribution approximation (±2SD from mean)
1 n = 25 for both groups
2 Data suggests Version B has higher mean but also higher variability

Next Steps in the Analysis

To complete this A/B test, the typical next steps would involve:

  • Calculating the Pooled Standard Deviation (since sample sizes are equal).

  • Computing the T-statistic using the formula:\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\]

  • Determining the p-value based on degrees of freedom (\(df = n_1 + n_2 - 2\)).

  1. Identify the type of t-test required

Type of T-Test: Independent Two-Sample T-Test

For this A/B test, you should use an Independent Two-Sample T-Test (also known as an Unpaired T-Test).

This is the correct choice because:

  • Independent Groups: The participants in Version A are different individuals from those in Version B. The session duration of one user does not influence or relate to the session duration of another.

  • Comparison of Means: The goal is to compare the average (mean) of a continuous variable (session duration) between two distinct categories (Version A vs. Version B).

  • Sample Size: With 4\(n = 25\) for each group, the sample size is relatively small (typically 5\(n < 30\) is the threshold where T-tests are prioritized over Z-tests), making the T-distribution appropriate.

Sub-type Selection: Student’s vs. Welch’s

Within the category of independent T-tests, there are two common variations based on the variance (Standard Deviation squared) of the samples:

Statistical Test Selection: A/B Testing Options
Test Type Key Assumption Variance Check Our Case Assessment Recommendation
Pooled (Student’s) t-test Equal population variances (homoscedasticity) Required: F-test or Levene’s test for equal variances SDs: 1.2 vs 1.4 (ratio = 1.17 < 2) - Likely acceptable Acceptable for preliminary analysis
Welch’s (Unequal Variance) t-test No equal variance assumption (heteroscedasticity allowed) Not required - automatically adjusts for unequal variances Default recommendation - More conservative approach referred for final results
Mann-Whitney U test No normality assumption (non-parametric) Not applicable - works on ranks, not raw values Fallback if normality violated (n=25 may need checking) Consider if data non-normal
Note:
Rule of thumb: If larger SD / smaller SD < 2, pooled t-test is often acceptable. In our case: 1.4/1.2 = 1.17

Note: Because the sample sizes are exactly equal (7\(n=25\) for both), the standard Student’s T-test is highly robust even if the variances differ slightly.

  1. Compute the test statistic and p-value.

Calculate the Standard Error (\(SE\))

Since the sample sizes are equal (\(n_A = n_B = 25\)), the standard error for the difference between means is calculated as: \[SE = \sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}}\]\[SE = \sqrt{\frac{1.2^2}{25} + \frac{1.4^2}{25}}\]\[SE = \sqrt{\frac{1.44}{25} + \frac{1.96}{25}} = \sqrt{0.0576 + 0.0784}\]\[SE = \sqrt{0.136} \approx 0.3688\]

Compute the Test Statistic (\(t\))

The \(t\)-statistic measures how many standard errors the difference in sample means is from zero:\[t = \frac{\bar{x}_A - \bar{x}_B}{SE}\]\[t = \frac{4.8 - 5.4}{0.3688}\]\[t = \frac{-0.6}{0.3688} \approx -1.627\]

Determine Degrees of Freedom (\(df\))

For a pooled two-sample t-test:\[df = n_A + n_B - 2 = 25 + 25 - 2 = 48\]

Calculate the P-value

Using a \(t\)-distribution table or statistical software for a two-tailed test with \(t = -1.627\) and \(df = 48\):\(p\text{-value} \approx 0.1103\)

Two-Sample Welch’s t-Test: Results Summary
Statistical Measure Value Interpretation
Test Statistic (t-value) -1.627 Standardized difference between groups
Degrees of Freedom (df) 48 Welch-Satterthwaite approximation
P-value (two-tailed) 0.1103 Probability of observing such extreme results if H₀ is true
Significance Level (α) 0.05 Maximum acceptable Type I error rate
Critical Value (t*) ±2.011 Boundary for rejection region (two-tailed)
Mean Difference Estimate 0.600 Sample mean difference (B - A)
Standard Error 0.369 Standard error of the difference
Effect Size (Cohen’s d) 0.461 Medium effect size (but not statistically significant)
Statistical Decision Fail to reject H₀ Insufficient evidence against null hypothesis
Practical Significance No significant difference Difference may not be practically important
Note:
H₀: μ_A = μ_B vs H₁: μ_A ≠ μ_B | Test: Welch’s two-sample t-test (does not assume equal variances)

Interpretation: At a standard significance level of \(\alpha = 0.05\), since the \(p\)-value (\(0.1103\)) is greater than \(0.05\), we fail to reject the null hypothesis. There is not enough statistical evidence to conclude that there is a significant difference in average session duration between Version A and Version B.

Visualization Explanation:

  • Blue Curve: Shows a T-probability distribution with 48 degrees of freedom.

  • Red Area: This is the Rejection Region. If the black line falls within this area, the difference is statistically significant.

  • Black Dashed Line: This is the T-statistic (-1.627) we calculated.

Visual Conclusion: Since the black line falls outside the red area (in the white center), we can visually see that the difference in session duration between Versions A and B is not strong enough to be considered significant at the 5% level.

  1. Draw a statistical conclusion at \(\alpha = 0.05\).

Comparison of Values

Based on the calculation in the previous step:

  • P-value: \(0.1103\)

  • Significance Level (\(\alpha\)): \(0.05\)

  • T-statistic: \(-1.627\)

  • T-critical (\(df=48, \alpha=0.05\)): \(\pm 2.011\)

Hypothesis Test

We use the standard decision rule:

  • P-value Criteria: If \(P \leq \alpha\), Reject \(H_0\). If \(P > \alpha\), Fail to Reject \(H_0\).\(0.1103 > 0.05 \rightarrow\) Fail to Reject \(H_0\)

  • T-statistic Criteria: If \(|t| > t_{crit}\), Reject \(H_0\).\(|-1.627| < 2.011 \rightarrow\) Fail to Reject \(H_0\)

Conclusion: At the \(5%\) significance level, we do not have sufficient statistical evidence to reject the null hypothesis (\(H_0\)).

Meaning: The difference in mean session duration between Version A (4.8 minutes) and Version B (5.4 minutes) is not statistically significant. The observed difference is most likely due to random variation in the sample, not to a significant difference in landing page performance.

Business Recommendation

Although Version B has a nominally higher mean, the product team should:

  • Increase the sample size (\(n\)): With \(n=25\), statistical power may be too low to detect small differences.

  • Run the test longer: To see if this trend becomes significant as the data grows.

  • Not immediately change the design: Based on this data alone, there is no guarantee that Version B will perform better in the general population.

  1. Interpret the result for product decision-making.

Don’t Get Caught Up in the “Lust of Data”

Nominally, Version B appears to be 12.5% ​​better (a difference of 0.6 minutes). However, because the test results are not significant, we cannot be sure that this increase will persist if the feature is rolled out to all users. There is a high risk that this difference is just “noise” or just a coincidence.

Evaluate the Effect of Sample Size

The sample size of \(n = 25\) per group is very small for an A/B test on a digital platform.

  • Problem: This statistical test may have Low Power, meaning the test is not sensitive enough to detect a true difference.

  • Action: If the operational costs of Version B are not significantly higher than Version A, do not dismiss Version B out of hand. Continue testing with a larger sample size (e.g., \(n = 100\) or more) to get more conclusive results.

Consider Switching Costs

In product management, every change has a cost (developer time, bug risk, user confusion).

  • Decision: If Version B requires significant effort to implement permanently, then stick with Version A (status quo). There is no compelling data-driven reason to take on the technical risk if its performance has not been proven to be significantly superior.

Analysis of Variance

The standard deviation of Version B (1.4) is higher than that of Version A (1.2). This suggests that user behavior in Version B is more inconsistent. It is possible that some users really like it (very long duration), while others are confused (very short duration).
Strategic Recommendations: A/B Testing Follow-up Actions
Strategic Direction
Immediate Action
Evidence-Based Rationale
Measurable Outcomes
Responsible
Recommendation Key Action Rationale Success Metrics Owner
Status Quo (Hold) Maintain current deployment Statistical evidence insufficient (p=0.1103, CI includes 0) No negative impact on key metrics Product Manager
Test Iteration Run powered follow-up study Current study underpowered (35%) - high Type II error risk Achieve 80% statistical power Data Scientist
Qualitative Analysis Conduct user experience research Higher variance in Version B (SD=1.4) suggests inconsistent user experience Identify root cause of variance increase UX Researcher
Cost-Benefit Analysis Calculate ROI of potential change Need business justification for 0.6-minute improvement Clear ROI calculation Business Analyst
Implementation Roadmap Develop phased rollout plan Prepare for potential future deployment based on new evidence Documented deployment plan Project Manager
Note:
Based on A/B test results: t(48) = -1.627, p = 0.1103, mean difference = 0.6 minutes

4 Case Study 4

4.1 Chi-Square Test of Independence

An e-commerce company examines whether device type is associated with payment method preference.

Device / Payment E-Wallet Credit Card Cash on Delivery
Mobile 120 80 50
Desktop 60 90 40

4.2 Tasks

  1. State the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).
  2. Identify the appropriate statistical test.
  3. Compute the Chi-Square statistic (χ²).
  4. Determine the p-value at \(\alpha = 0.05\).
  5. Interpret the results in terms of digital payment strategy.

4.3 Answer Case Study 4

  1. State the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).

Null Hypothesis (\(H_0\))

The null hypothesis assumes that there is no relationship between the variables.2 In other words, the variables are independent.

  • \(H_0\): Device type and payment method preference are independent.

  • (Put simply: The type of device a customer uses does not affect which payment method they choose.)

Alternative Hypothesis (\(H_1\))

The alternative hypothesis assumes that there is a relationship between the variables.3 This suggests that the distribution of one variable depends on the other.

  • \(H_1\): Device type and payment method preference are dependent (associated).

  • (Put simply: The choice of payment method depends on whether the customer is using a mobile device or a desktop.)

Understanding the Test

To validate these hypotheses, you would typically calculate the Expected Frequencies for each cell in your table using the formula:

\[E = \frac{(\text{Row Total} \times \text{Column Total})}{\text{Grand Total}}\]

Then, you would use the Chi-Square formula to find the test statistic (\(\chi^2\)):

\[\chi^2 = \sum \frac{(O - E)^2}{E}\]

Where \(O\) is the Observed frequency (the numbers provided in your table) and \(E\) is the Expected frequency.

  1. Identify the appropriate statistical test. The Chi-Square Test of Independence

Categorical Variables: Both of your variables are categorical (nominal).

  • Variable 1 (Device Type): Mobile or Desktop.

  • Variable 2 (Payment Method): E-Wallet, Credit Card, or Cash on Delivery.

Relationship Testing: The goal is to determine if there is a significant association or dependency between these two variables, rather than comparing means (which would require a t-test or ANOVA).

Contingency Table Format: Your data is organized in a \(2 \times 3\) contingency table (2 rows for devices and 3 columns for payment methods), which is the standard input for this test.

Key Assumptions for this Test

To ensure the results of this test are valid, the following conditions should be met:

  • Independence: The observations are independent of each other (one customer’s choice doesn’t affect another’s).

  • Sample Size: The expected frequency in each cell should generally be 5 or greater.

  • Random Sampling: The data should be collected from a random sample of the population.

  1. Compute the Chi-Square statistic (χ²).

To compute the Chi-Square statistic (\(\chi^2\)), we follow these steps:

Calculate Row and Column Totals

First, we find the sums for each row and column to determine the grand total.

Contingency Table: Device Type × Payment Method (N=440)
Payment Method
E-Wallet Credit Card COD Row Total
Mobile 120 80 50 250
️Desktop 60 90 40 190
Column Total 180 170 90 440
Note:
N = 440 total transactions

Calculate Expected Frequencies (\(E\))

The expected frequency for each cell is calculated using the formula:

\[E = \frac{\text{Row Total} \times \text{Column Total}}{\text{Grand Total (N)}}\]

  • Mobile / E-Wallet: \(\frac{250 \times 180}{440} \approx 102.27\)

  • Mobile / Credit Card: \(\frac{250 \times 170}{440} \approx 96.59\)

  • Mobile / COD: \(\frac{250 \times 90}{440} \approx 51.14\)

  • Desktop / E-Wallet: \(\frac{190 \times 180}{440} \approx 77.73\)

  • Desktop / Credit Card: \(\frac{190 \times 170}{440} \approx 73.41\)

  • Desktop / COD: \(\frac{190 \times 90}{440} \approx 38.86\)

Expected Frequencies (Under Independence Assumption)
Payment Method
E-Wallet Credit Card COD Row Total
Mobile 102.27 96.59 51.14 250
Desktop 77.73 73.41 38.86 190
Column Total 180.00 170.00 90.00 440
Note:
Formula: Expected = (Row Total × Column Total) / Grand Total

Compute the Chi-Square Statistic (\(\chi^2\))

Using the formula \(\chi^2 = \sum \frac{(O - E)^2}{E}\), where \(O\) is the observed frequency:

Step 1: Calculate Each PartWe will calculate each fraction one by one:

Part 1: \[\frac{(120 - 102.27)^2}{102.27} = \frac{(17.73)^2}{102.27} = \frac{314.35}{102.27} \approx \mathbf{3.074}\]

Part 2: \[\frac{(80 - 96.59)^2}{96.59} = \frac{(-16.59)^2}{96.59} = \frac{275.23}{96.59} \approx \mathbf{2.849}\]

Part 3: \[\frac{(50 - 51.14)^2}{51.14} = \frac{(-1.14)^2}{51.14} = \frac{1.30}{51.14} \approx \mathbf{0.025}\] Part 4: \[\frac{(60 - 77.73)^2}{77.73} = \frac{(-17.73)^2}{77.73} = \frac{314.35}{77.73} \approx \mathbf{4.044}\]

Part 5: \[\frac{(90 - 73.41)^2}{73.41} = \frac{(16.59)^2}{73.41} = \frac{275.23}{73.41} \approx \mathbf{3.749}\]

Part 6: \[\frac{(40 - 38.86)^2}{38.86} = \frac{(1.14)^2}{38.86} = \frac{1.30}{38.86} \approx \mathbf{0.033}\] Step 2: Add Up All the Results

Now add up all the calculated values: \[\chi^2 = 3.074 + 2.849 + 0.025 + 4.044 + 3.749 + 0.033\]

\[\chi^2 \approx 13.774\]

Chi-Square Statistic Calculation
Calculation Steps
Cell Observed (O) Expected (E) O - E (O - E)² (O - E)² / E
Mobile / E-Wallet 120 102.27 17.73 314.35 3.073
Mobile / Credit Card 80 96.59 -16.59 275.23 2.85
Mobile / COD 50 51.14 -1.14 1.3 0.025
Desktop / E-Wallet 60 77.73 -17.73 314.35 4.044
Desktop / Credit Card 90 73.41 16.59 275.23 3.749
Desktop / COD 40 38.86 1.14 1.3 0.033
TOTAL (χ²) 13.774
Note:
Formula: χ² = Σ [(Oᵢ - Eᵢ)² / Eᵢ] where O = Observed, E = Expected
  1. Determine the p-value at \(\alpha = 0.05\).

To determine the p-value for this Chi-Square Test of Independence, we use the previously calculated Chi-Square statistic (1\(\chi^2 \approx 13.774\)) and the degrees of freedom.

Degrees of Freedom (\(df\))

The degrees of freedom for a contingency table is calculated as:\[df = (\text{Rows} - 1) \times (\text{Columns} - 1)\]\[df = (2 - 1) \times (3 - 1) = 1 \times 2 = 2\]

P-Value Calculation

Using the Chi-Square distribution with \(2\) degrees of freedom and a test statistic of \(13.774\):

  • Chi-Square Statistic (\(\chi^2\)): \(13.7736\)

  • P-value: \(\approx 0.0010\)

Conclusion at $= 0.05

  • $P-value (\(0.0010\)) < \(\alpha\) (\(0.05\))

Since the p-value is significantly less than the significance level of \(0.05\), we reject the null hypothesis (\(H_0\)).

Result:The p-value is \(0.0010\). This indicates that there is a statistically significant association between the device type used and the customer’s payment method preference.

Visualization Explanation:

  • X-axis (Horizontal): Displays payment method categories (E-Wallet, Credit Card, COD).

  • Y-axis (Vertical): Shows the number of transactions or observation frequency.

  • Bar Color: Distinguishes between mobile and desktop users.

  • Interactivity: Because Plotly is used, you can hover over each bar in RStudio Viewer to see the exact numbers in detail.

  1. Interpret the results in terms of digital payment strategy.

Based on the previous Chi-Square test results (\(\chi^2 = 13.77\), \(p < 0.05\)), we have statistically proven that there is a significant relationship between device type and payment method. Here is the interpretation of these results to formulate a digital payment strategy for e-commerce companies:

“Mobile-First” Optimization for E-Wallet

Data shows the overwhelming dominance of Mobile users on E-Wallet methods (120 vs 60).

  • Strategy: Companies should ensure the e-wallet checkout process in mobile apps is very smooth (such as one-click payment features or biometric integration). Since mobile users tend to prefer speed, e-wallet cashback promotional campaigns should be targeted specifically at mobile app users.

Desktop as a High-Value Transaction Hub (Credit Card)

Desktop users are more likely to use Credit Cards (90) than E-Wallets (60), even surpassing mobile credit card users (80).

  • Strategy: Desktop users may feel safer making large transactions or entering card details on a larger screen. The right strategy is to highlight security features (such as the Verified by Visa or Mastercard ID Check logo) and offer a 0% installment program that is more visible on the desktop web display.

Cash on Delivery (COD)

Evaluation COD has a relatively low number on both devices, but still contributes.

  • Strategy: Because COD is operationally riskier (high returns), companies can slowly shift COD users on mobile to e-wallets by providing “Free Shipping” incentives only for digital payments.

UI/UX Personalization Based on Device

The results of this independence test show that consumer behavior differs depending on their “entry point”.

Strategy:

  • On Mobile: Display E-Wallet as the main payment option (topmost).

  • On Desktop: Give display priority to Credit Card or Bank Transfer options that require more detailed verification.

Device-Based Marketing & UX Strategy
Strategic Focus
Value Proposition
Implementation Tactics
Business Impact
Device Segment Primary Focus Core Value Proposition Key Tactics Expected Impact
📱 Mobile Speed & Convenience Quick, frictionless transactions for on-the-go users • E-Wallet integration • Biometric authentication • One-click checkout • Push notifications ↑ Mobile conversion by 15-20% ↓ Cart abandonment by 25% ↑ App engagement by 30%
🖥️ Desktop Security & Large Transactions Secure, informed purchasing for high-value transactions • Credit card promotions • Installment plans • Detailed product info • Security badges ↑ Average order value by 25-30% ↑ Credit card usage by 40% ↑ Customer trust scores
📊 Overall Strategy Personalized User Experience Seamless cross-device journey with tailored offerings • Unified user profile • Cross-device sync • Personalized recommendations • Loyalty integration ↑ Customer lifetime value by 35% ↑ Retention rate by 20% ↑ Cross-sell success by 25%
Note:
Based on chi-square analysis showing significant device × payment method association (χ²=13.77, p<0.01)

5 Case Study 5

5.1 Type I and Type II Errors (Conceptual)

A fintech startup tests whether a new fraud detection algorithm reduces fraudulent transactions.

  • H₀: The new algorithm does not reduce fraud.
  • H₁: The new algorithm reduces fraud.

5.2 Tasks

  1. Explain a Type I Error (α) in this context.
  2. Explain a Type II Error (β) in this context.
  3. Identify which error is more costly from a business perspective.
  4. Discuss how sample size affects Type II Error.
  5. Explain the relationship between α, β, and statistical power.

5.3 Answer Case Study 5

  1. Explain a Type I Error (α) in this context.

Definition of Type I Error (\(\alpha\))A

Type I Error occurs when the null hypothesis (\(H_0\)) is true, but we incorrectly reject it.4 It is essentially a “false positive” at the strategic level.

In This Context:

In your fraud detection case study, a Type I Error would look like this:

  • The Reality: The new algorithm is not effective. It does not actually reduce the rate of fraudulent transactions compared to the current system. (\(H_0\) is true).

  • The Decision: Based on the test data, the startup concludes that the algorithm is effective and reduces fraud. (Reject \(H_0\)).

  • The Error: The startup believes they have found a “winner” and implements the new algorithm, when in fact, the results they saw were likely due to random chance or a biased sample.

Business Consequences of a Type I Error

For a fintech startup, making a Type I Error can be quite costly because it leads to unjustified action. The consequences include:

  • Wasted Resources: The company spends time, engineering effort, and money deploying and maintaining an algorithm that provides no real benefit.

  • False Sense of Security: The startup may stop looking for other fraud solutions, believing the problem is solved, while fraudulent transactions continue at the same rate.

  • Operational Risk: If the new algorithm is “stricter” but not “smarter,” it might increase False Positives at the transaction level (blocking legitimate customers), leading to customer frustration and lost revenue, without actually catching more fraud.

  • Key Takeaway: If the startup sets a significance level of \(\alpha = 0.05\), they are accepting a 5% risk of committing this error—essentially saying they are okay with a 5% chance of adopting a “dud” algorithm.

  1. Explain a Type II Error (β) in this context.

Definition of Type II Error (\(\beta\))A

Type II Error occurs when the null hypothesis (4\(H_0\)) is false, but we fail to reject it.5 In simpler terms, the new algorithm actually works, but your test results are not strong enough to prove it, so you conclude it’s a failure.

In This Context:

In your fraud detection case study, a Type II Error would look like this:

  • The Reality: The new algorithm is highly effective. It truly reduces fraud and would save the company significant money. (\(H_0\) is false; \(H_1\) is true).

_ The Decision: Based on the test data (perhaps due to a small sample size or a low significance level), the startup concludes that the algorithm does not show a significant improvement. (Fail to reject \(H_0\)).

  • The Error: The startup shelves a superior piece of technology and continues using an inferior or outdated fraud detection system.

Business Consequences of a Type II Error

While a Type I error leads to “wasted effort,” a Type II error leads to “missed opportunities.” For a fintech company, this is often the more dangerous error:

  • Financial Loss: The company continues to lose money to fraudulent transactions that the new algorithm could have caught.

  • Competitive Disadvantage: If a competitor develops and successfully implements a similar algorithm, they will have lower fraud costs and can offer better rates to customers, potentially driving the startup out of the market.

  • Stagnation: The startup remains stuck with “legacy” rules that are easily bypassed by sophisticated modern fraud tactics, failing to evolve with the threat landscape.

The Relationship to Statistical Power

The probability of not making a Type II error is called Statistical Power (8\(1 - \beta\)).

  • If your test has low power, you have a high risk of 10\(\beta\).

  • This usually happens if the sample size is too small or if the effect (the reduction in fraud) is subtle and hard to detect against the “noise” of daily transactions.

  • Key Takeaway: A Type II error is like a fire alarm that fails to go off when there is actually a fire.13 The “fire” (fraud) continues to burn your capital because you thought everything was fine.

  1. Identify which error is more costly from a business perspective.

Here is a breakdown of why the “False Negative” (Type II) typically carries a higher price tag than the “False Positive” (Type I).

Statistical Error Types: Business Implications & Mitigation
Statistical
Business Context
Test Outcome
Consequences
Risk Management
Error Type Statistical Concept Business Scenario Hypothesis Test Outcome Business Impact Recommended Mitigation
Type I (Alpha) Error False Positive Adopting ineffective fraud detection Reject H₀ when H₀ is true Sunk Costs:
• Development resources wasted
• Maintenance costs incurred
• Customer trust eroded
• Conservative α levels (0.01)
• Extensive testing
• Phased rollout
Type II (Beta) Error False Negative Rejecting effective fraud detection Fail to reject H₀ when H₀ is false Opportunity Costs:
• Ongoing fraud losses
• Regulatory penalties
• Competitive disadvantage
• Adequate statistical power
• Continuous monitoring
• Sensitivity checks
Type I vs Type II Trade-off α vs β Balance Choosing risk tolerance level Setting significance level (α) Strategic Decision:
• Risk appetite determination
• Resource allocation
• Competitive positioning
• Cost-benefit analysis
• Stakeholder alignment
• Iterative refinement
Note:
Type I Error (α): False alarm | Type II Error (β): Missed detection | Power (1-β): Correct detection

Type II is usually “More Costly”

In fintech, fraud is often an existential threat. Here are three reasons why missing out on a working algorithm (Type II) is worse:

  • Direct Capital Loss: Fraud represents a direct hit to the bottom line. If the new algorithm had the potential to reduce fraud by 20%, every day the startup commits a Type II error, it is effectively “burning” money that it didn’t have to.

  • Scalability Risk: Startups need to scale fast. If you fail to implement a working fraud reduction tool, your losses will grow exponentially as your user base grows, potentially leading to bankruptcy or the loss of banking licenses.

  • The “Safety Net” of Type I: If you commit a Type I error and deploy a useless algorithm, you usually find out eventually through performance monitoring. You can then revert to the old system. The cost is limited to the development time. However, if you commit a Type II error, you never know what you missed, and the fraud continues unabated.

The One Exception

A Type I Error could be more costly only if the new algorithm is so aggressive that it triggers a massive wave of False Positives at the transaction level (blocking legitimate customers). This would lead to “churn” (customers leaving the platform), which can be harder to recover from than the fraud itself.

Final Verdict

For most fintech startups, Type II is the greater risk. The goal of the startup should be to maximize Statistical Power, ensuring that if a solution to their fraud problem exists, they are capable of detecting it and putting it into production.

  1. Discuss how sample size affects Type II Error

The relationship is inverse: as the sample size increases, the probability of a Type II Error decreases.

The Statistical Relationship

The probability of a Type II Error is tied directly to Statistical Power (\(1 - \beta\)).

  1. Small Sample Size: Leads to “noisy” data with a wide standard error. It is difficult to tell if a slight drop in fraud is a real result of the algorithm or just a random fluke in that day’s transactions. This results in high \(\beta\) (high risk of a False Negative).

  2. Large Sample Size: Reduces the standard error, making the test more “sensitive.” It narrows the distribution of the test results, allowing the startup to detect even small improvements in fraud reduction.8 This results in low \(\beta\) (low risk of a False Negative).

Sample Size Matters for Fraud Detection

Fraudulent transactions are often “rare events” (e.g., only 0.1% of all transactions).

  • The Problem: If the startup only tests the algorithm on 1,000 transactions, they might only see 1 fraud case by chance. Even if the algorithm is perfect, 1 case isn’t enough data to prove it works.

  • The Solution: By increasing the sample size to 1,000,000 transactions, the startup might see 1,000 fraud cases. With this much data, they can statistically prove whether the algorithm reduced that number to 800 (a 20% reduction) with high confidence.

The Trade-offs of Increasing Sample Size

While a larger sample size reduces the risk of missing a great algorithm (Type II Error), it comes with practical business costs:

Sample Size Effects: Statistical vs Practical Considerations
Large Sample (n > 10,000)
Small Sample (n < 1,000)
Best Practice
Consideration Large Sample Impact Small Sample Impact Recommendation
Testing Timeline Significant Delay:
• Weeks to months for data collection
• Slower iteration cycles
• Delayed business decisions
Rapid Testing:
• Days to weeks for results
• Fast iteration possible
• Quick business decisions
Use sequential testing
Computational Cost High Expense:
• Cloud computing costs scale linearly
• Storage and processing costs increase
• Infrastructure investment needed
Low Cost:
• Minimal cloud expenses
• Standard infrastructure sufficient
• Low operational overhead
Conduct cost-benefit analysis
Statistical Power Very High Power (≈0.95+):
• Low Type II error risk
• Can detect very small effects
• High confidence in negative results
Moderate Power (≈0.30-0.70):
• Higher Type II error risk
• Only detects substantial effects
• Uncertainty in negative results
Target power = 0.80-0.90
Type I Error Rate No Impact:
• α is researcher-set threshold
• Independent of sample size
• Typically fixed at 0.05
No Impact:
• α remains fixed by design
• Same Type I error control
• Consistent decision threshold
Fix α = 0.05 (standard)
Business Velocity Slower Time-to-Market:
• Delayed feature releases
• Slower learning cycles
• Missed competitive opportunities
Faster Innovation:
• Quick feature iterations
• Rapid experimentation
• Competitive responsiveness
Balance speed with confidence
Detection Sensitivity Extreme Sensitivity:
• Can detect trivial effects
• May find ‘significant’ but unimportant effects
• Risk of overfitting
Practical Sensitivity:
• Detects meaningful effects only
• Focuses on important differences
• Reduces overfitting risk
Consider practical significance
Note:
Key Insight: Type I error rate (α) is independent of sample size - it’s a design choice, not a data property

Visualization Explanation:

  1. Blue Curve (\(H_0\)): Represents the condition where the new algorithm is actually the same as the old one (no reduction in fraud).

  2. Red Curve (\(H_1\)): Represents the condition where the new algorithm is completely effective in reducing fraud.

  3. Type I Error (Red Area on the Right): This is the risk that we reject \(H_0\) when it is actually true. We think the algorithm is successful, when it is just a coincidence (False Positive).

  4. Type II Error (Blue Area on the Left): This is the risk that we fail to reject \(H_0\) when it is actually false. The algorithm is actually good, but our data is not strong enough to prove it (False Negative).

  5. Explain the relationship between α, β, and statistical power.

In statistics, \(\alpha\) (Alpha), \(\beta\) (Beta), and Statistical Power are three components that are interconnected in a decision-making ecosystem. Understanding the relationship between the three is crucial for fintech startups to balance operational risks and innovation opportunities.

The following is an explanation of the interrelationship between the three:

Mathematical Definitions and Relationships

These three concepts work on two different reality scenarios (when \(H_0\) is true vs when \(H_1\) is true):

Statistical Hypothesis Testing Parameters
Parameter Other_Name Simple_Definition Relationship
α (Alpha) Type I Error Risk of ‘Wrongful Accusation’: Assuming an algorithm is effective when it is not. Set by the researcher (e.g., 0.05).
β (Beta) Type II Error Risk of ‘Missing’: Assuming an algorithm is failing when it is actually effective. Inversely proportional to Power.
Power (1−β) Statistical Power The ability to detect a truly present effect. The ideal target is usually ≥0.80.

Inverse Relationship (Trade-off) between \(\alpha\) and \(\beta\)

In a fixed sample, \(\alpha\) and \(\beta\) have an inverse relationship. If you try to lower the Type I risk (\(\alpha\)), the Type II risk (\(\beta\)) will automatically increase.

  • If \(\alpha\) is lowered (e.g., from 0.05 to 0.01): You become very strict and do not want to make mistakes in adopting new algorithms. The consequence: The standard of proof becomes too high, so you are more likely to miss algorithms that are actually good (\(\beta\) increases, Power decreases).

  • If \(\alpha\) is raised (e.g., from 0.05 to 0.10): You are more “lax” and willing to take the risk of wrong adoption. The consequence: You are more likely to detect effective algorithms (\(\beta\) decreases, Power increases).

The Role of Statistical Power (\(1 - \beta\))

Power is the probability that the test will reject 6\(H_0\) when 7\(H_1\) is indeed true.8 In the fintech context:

  • High Power (0.80 - 0.95): Startups have keen “eyes.” If the new algorithm really reduces fraud, the test will almost certainly find it.

  • Low Power (< 0.50): It’s like flipping a coin. Even if your algorithm is great, the test will most likely conclude “no significant results.”

Sample Size Become a “Savior”

The only way to simultaneously decrease \(\alpha\) and \(\beta\) (or increase Power without increasing \(\alpha\)) is to increase the Sample Size (\(n\)). As \(n\) increases, the data distribution becomes narrower (precision increases). This reduces the overlap area between the \(H_0\) and \(H_1\) curves, so the risk of misrepresentation (\(\alpha\)) and the risk of omission (\(\beta\)) are both minimized.

Summary for Business Decisions Fintech startups should choose:

  • Want to be extremely safe from wasted implementation costs? Use low \(\alpha\) (risk: low Power).

  • Want to be sure not to miss opportunities to catch fraud? Go for high Power (risk: need a large sample size or a looser \(\alpha\)).

Read This Visualization:

  • Dashed Line (Decision Line): This is the boundary you defined. If the test results are to the right of this line, you adopt the new algorithm.

  • RED Area (\(\alpha\) - Type I Error): You are on the left curve (H0), but the test results cross the boundary line. You think you won, but it was just a fluke.

  • BLUE Area (\(\beta\) - Type II Error): You are on the right curve (H1), meaning the algorithm is actually good. But because the test results are to the left of the boundary line, you think the algorithm failed. You missed a golden opportunity.

  • GREEN Area (Power - \(1-\beta\)): This is the ideal situation. The algorithm is good, and your tests prove it. The wider the green area, the more sophisticated your startup’s tests are.

6 Case Study 6

6.1 P-Value and Statistical Decision Making

A churn prediction model evaluation yields the following results:

  • Test statistic = 2.31
  • p-value = 0.021
  • Significance level: \(\alpha = 0.05\)

6.2 Tasks

  1. Explain the meaning of the p-value.
  2. Make a statistical decision.
  3. Translate the decision into non-technical language for management.
  4. Discuss the risk if the sample is not representative.
  5. Explain why the p-value does not measure effect size.

6.3 Answer Case Study 6

  1. Explain the meaning of the p-value.

The Core Meaning of the P-Value

The p-value of 0.021 represents the probability of obtaining a test statistic as extreme as (or more extreme than) 2.31, assuming that the null hypothesis (\(H_0\)) is true.

In churn prediction, the null hypothesis usually states that there is no effect—for example, that a specific feature does not influence churn, or that the model’s performance is no better than a baseline (random guessing).

Therefore, a p-value of 0.021 means:

  • There is only a 2.1% chance that you would see these results if the model actually had no predictive power.

  • Because 2.1% is a very low probability, it suggests that the “no effect” assumption is likely incorrect.

Statistical Decision: Comparing P-Value and Alpha (\(\alpha\))

To make a formal decision, we compare the p-value to your pre-defined significance level (\(\alpha\)):

Hypothesis Test Results
Metric Value Comparison/Result
P-Value 0.021 p < α
Significance Level (α) 0.05 (0.021 < 0.05)
Conclusion Statistically Significant

The Decision: Since the p-value (5\(0.021\)) is less than the significance level (6\(0.05\)), you reject the null hypothesis.

Business Interpretation:

In practical terms for your churn model, this result indicates that the findings are statistically significant. You can conclude with 95% confidence that the model has identified a real pattern in customer behavior rather than just “noise” in the data. You now have sufficient evidence to move forward with the model’s insights for retention strategies.

  1. Make a statistical decision.

To make a statistical decision for your churn prediction model, we compare the calculated p-value against the pre-determined significance level (\(\alpha\)).

The Statistical Decision

Based on the results provided, the decision is to Reject the Null Hypothesis (\(H_0\)).

Justification

The decision-making rule in hypothesis testing is straightforward:

  • If \(p \leq \alpha\): Reject \(H_0\) (The result is statistically significant).

  • If \(p > \alpha\): Fail to Reject \(H_0\) (The result is not statistically significant).

In this case study:

  • P-value = \(0.021\)

  • Significance Level (\(\alpha\)) = \(0.05\)

Since \(0.021 < 0.05\), the p-value falls within the “rejection region.” This means the probability of observing a test statistic of \(2.31\) by pure chance is lower than the \(5\%\) threshold you set.

Conclusion and Business Impact

By rejecting the null hypothesis, you are concluding that:

  • Statistical Significance: The findings of the churn prediction model are statistically significant at the \(95\%\) confidence level.

  • Model Validity: There is strong evidence to suggest that the model’s predictors are actually related to customer churn, rather than the results being a product of random sampling error.

  • Actionable Insight: The business can proceed with using this model to inform retention strategies, as the relationship it has identified is unlikely to be a fluke.

Decision via P-Value Comparison

The standard rule for any hypothesis test is: Reject the null hypothesis if \(p \leq \alpha\).

  • P-Value: 0.021

  • Significance Level (\(\alpha\)): 0.05

  • Comparison: \(0.021 < 0.05\)

Statistical Decision: Reject the Null Hypothesis (\(H_0\)).

Decision via Test Statistic Comparison

We can also visualize this by comparing your test statistic to the critical value. For a standard normal distribution (Z-test) at \(\alpha = 0.05\):

  • Two-Tailed Critical Value: \(\pm 1.96\)

  • One-Tailed (Right) Critical Value: \(+1.645\)

  • Your Test Statistic: 2.31

Since your test statistic of 2.31 is greater than the critical value (e.g., \(1.96\) or \(1.645\)), it falls deep into the rejection region (the “tail” of the curve).

Visual Explanation:

  • Blue Curve: Shows the standard normal distribution (assuming \(H_0\) is true).

  • Red Area: Rejection region (\(\alpha = 0.05\)). If the green line falls here, we reject \(H_0\).

  • Green Dashed Line: Shows the position of your model (\(2.31\)). Since this line is well within the red area, it visually proves that your model’s results are statistically significant.

  1. Translate the decision into non-technical language for management.

The Results Are No Coincidence

The analysis shows that the patterns identified by our model are very robust and real. Simply put, the probability that these patterns occurred due to “luck” or pure chance is extremely small—only about 2%.

Decision

The Model is Ready to Use Because our confidence level exceeds industry standards (which typically set a margin of error of 5%), we officially accept the model’s results. We have sufficient evidence to state that the factors identified by the model truly influence customers’ decisions to churn.

Business Impact

Prediction Accuracy: We can be more confident in allocating marketing budgets to retain customers identified by the model as “high-risk.”

Next Steps: We can immediately launch retention campaigns (such as special promotions or discounts) to these targeted customers because the supporting data has been scientifically proven.

Conclusion for Management “The data shows with 97.9% certainty that this model is working correctly. We’re not guessing; the churn patterns we’re seeing are real and actionable to prevent lost revenue.”

  1. Discuss the risk if the sample is not representative.

If the data used to calculate that p-value (\(0.021\)) doesn’t reflect the diversity of your real customer base, you face the following risks:

False Sense of Certainty (The “Paper Tiger” Model)

A p-value of \(0.021\) suggests your results are “statistically significant.” However, significance only means the pattern is strong within the data provided.

  • The Risk: If your sample only includes long-term premium users but the model is applied to new “freemium” users, the model may predict churn perfectly for the sample but fail miserably in the real world. You are essentially making a highly confident decision based on the wrong information.

Misallocation of Retention Budget

Management uses churn models to decide where to spend money (e.g., discounts, outreach).

  • The Risk: If the non-representative sample over-represents a specific demographic (e.g., users from a certain region), the model will identify “churn signals” unique to that group. When you scale this, you might send expensive retention offers to people who weren’t going to leave, while ignoring the actual “at-risk” customers the sample missed.

Masking Hidden Variables (Omitted Variable Bias)

A non-representative sample often correlates with missing data.

  • The Risk: If you only sampled customers who contacted support, your \(2.31\) test statistic might actually be measuring “customer frustration” rather than “churn intent.” You might conclude that a specific app feature is causing churn, when in reality, it’s the lack of support response time that the sample failed to capture globally.

Poor Generalization (Low External Validity)

In statistics, we distinguish between internal and external validity.

  • Internal Validity: Did the experiment work for this specific group? (Yes, \(p < 0.05\)).

  • External Validity: Does this apply to the whole company? (No, because the sample is biased).

6.4 Summary of Risks:

RISK TYPE BUSINESS IMPACT
GENERALIZATION ERROR The model works in the “lab” environment but fails when deployed to the actual production population.
STRATEGIC MISALIGNMENT Marketing treats the wrong symptoms based on biased data, leading to ineffective campaigns and lost revenue.
MODEL DRIFT As the actual customer population naturally evolves, a biased model decays much faster and provides increasingly inaccurate predictions.

  1. Explain why the p-value does not measure effect size.

In statistical decision-making, it is a common misconception that a “small p-value” implies a “large effect.” However, these two metrics answer fundamentally different questions. In your churn prediction case study, the \(p = 0.021\) tells you that the result is statistically significant at \(\alpha = 0.05\), but it says nothing about how much the model actually improves retention or reduces churn.

The p-value does not measure effect size for the following primary reasons:

Confounding with Sample Size

The most critical reason is that p-values are highly dependent on sample size (\(n\)).

  • Large Samples: In a large dataset (e.g., 100,000 customers), even a tiny, trivial difference in churn rates can produce a very small p-value.

  • Small Samples: Conversely, a massive, business-changing effect might produce a high (non-significant) p-value simply because the sample size was too small to provide certainty.

Difference in Objectives

The two metrics represent different dimensions of your data:

  • P-Value (Statistical Significance): Measures the reliability of the result. It answers: “How likely is it that the difference we see is due to random noise?”

  • Effect Size (Practical Significance): Measures the magnitude of the result. It answers: “How large is the difference, and does it matter for the business?”

Example: In your churn model, a p-value of 0.021 suggests the model’s predictors are likely “real” and not just luck. However, the Effect Size (e.g., Cohen’s \(d\) or an Odds Ratio) would tell you if the model reduces churn by 0.1% (trivial) or 10% (substantial).

The P-Value Scale is Not Linear

The p-value is a probability, not a physical measurement.8 A p-value of 0.01 is not “twice as much effect” as a p-value of 0.02. Because the p-value is a function of both the effect magnitude and the precision (standard error) of the estimate, you cannot decouple the “size” of the effect from the “certainty” of the estimate using only the p-value.

Summary Comparison:

FEATURE P-VALUE EFFECT SIZE
Question Is there an effect? How big is the effect?
Sample Size Highly sensitive to n. Independent of n.
Result Type Probability (0 to 1). Magnitude (e.g., mean difference).
Business Use Decision to trust the model. Decision on ROI and implementation.
LS0tDQp0aXRsZTogIlN0dWR5IENhc2VzIiAgICAgICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiU3RhdGlzdGljYWwgSW5mZXJlbmNlc34gV2VlayAxNCIgICMgU3VidGl0bGUgb3IgdG9waWMgZm9yIHdlZWsgMg0KYXV0aG9yOiAiQ2Fyb2wgRHVwaW5vIFBlcmVpcmEiICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICMgQXV0byBkaXNwbGF5cyB0aGUgY3VycmVudCBkYXRlDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IHNlY3Rpb24gZGVmaW5lcyB0aGUgZm9ybWF0IGFuZCBsYXlvdXQgDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAjIEVtYmVkcyBhbGwgcmVzb3VyY2VzIChDU1MsIEpTLCBpbWFnZXMpIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAjIERpc3BsYXlzIGltYWdlIHRodW1ibmFpbHMgaW4gdGhlIGRvYw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAjIEVuYWJsZXMgY2xpY2sgdG8gZW5sYXJnZSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgIyBHcm91cHMgaW1hZ2VzIGludG8gYW4gaW50ZXJhY3RpdmUgZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAjIEF1dG9tYXRpY2FsbHkgbnVtYmVycyBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgIyBEaXJlY3Rvcnkgd2hlcmUgSmF2YVNjcmlwdC9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICMgRGlzcGxheXMgZGF0YSBmcmFtZXMgYXMgaW50ZXJhY3RpdmUgcGFnZWQgDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICMgQWxsb3dzIGZvbGRpbmcvdW5mb2xkaW5nIFIgY29kZSBibG9ja3MgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICMgQWRkcyBhIGJ1dHRvbiB0byBkb3dubG9hZCBhbGwgUiBjb2RlDQogICAgY3NzOiBjYXJvbF8xLmNzcyAgICAgICANCi0tLQ0KDQoNCmBgYHtyIHByb2ZpbGUsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGh0bWx0b29scykNCkhUTUwoJw0KPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAzMHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmNWY3ZmEgMCUsICNjM2NmZTIgMTAwJSk7IHBhZGRpbmc6IDMwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IG1hcmdpbjogMjBweCAwOyI+DQogIDxkaXY+DQogICAgPGltZyBzcmM9IkM6Zm90byBjYXJvbC5qcGVnIiANCiAgICAgICAgIHN0eWxlPSJ3aWR0aDogMjUwcHg7IGhlaWdodDogMjUwcHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwwLDAsMC4yKTsiPg0KICA8L2Rpdj4NCiAgPGRpdiBzdHlsZT0iZmxleDogMTsiPg0KICAgIDxoMSBzdHlsZT0iY29sb3I6ICMyYzNlNTA7IG1hcmdpbjogMDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiPkNhcm9sIER1cGlubyBQZXJlaXJhPC9oMT4NCiAgICA8cCBzdHlsZT0iY29sb3I6ICM3ZjhjOGQ7IG1hcmdpbjogNXB4IDAgNXB4IDA7Ij5OSU0gIDogNTIyNTAwNTE8L3A+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjNWQ2ZDdlOyBtYXJnaW46IDAgMCAxNXB4IDA7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDUwMDsgbGluZS1oZWlnaHQ6IDEuNTsiPg0KICAgICAgU3R1ZGVudCBNYWpvciBpbiBEYXRhIFNjaWVuY2UgYXQ8YnI+DQogICAgICBJbnN0aXR1dCBUZWtub2xvZ2kgU2FpbnMgQmFuZHVuZw0KICAgIDwvcD4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDE1cHg7IG1hcmdpbi10b3A6IDIwcHg7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyI+DQogICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjMzQ5OGRiOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiPg0KICAgICAgICBSIFByb2dyYW1taW5nDQogICAgICA8L2Rpdj4NCiAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNlNzRjM2M7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXItcmFkaXVzOiAxNXB4OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyB3aGl0ZS1zcGFjZTogbm93cmFwOyI+DQogICAgICAgIERhdGEgU2NpZW5jZQ0KICAgICAgPC9kaXY+DQogICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjMmVjYzcxOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiPg0KICAgICAgICBTdGF0aXN0aWNzDQogICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBtYXJnaW4tdG9wOiAxNXB4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgYWxpZ24taXRlbXM6IGNlbnRlcjsiPg0KICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzliNTliNjsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiAxNXB4IDQwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJveC1zaGFkb3c6IDAgM3B4IDEwcHggcmdiYSgwLDAsMCwwLjE1KTsgbWF4LXdpZHRoOiAzNTBweDsiPg0KICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDExcHg7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbi1ib3R0b206IDVweDsgd2hpdGUtc3BhY2U6IG5vd3JhcDsiPkRvc2VuIFBlbWJpbWJpbmc8L2Rpdj4NCiAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxNHB4OyB3aGl0ZS1zcGFjZTogbm93cmFwOyI+QmFrdGkgU2lyZWdhciwgTS5TYy4sIENEUy48L2Rpdj4NCiAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCmBgYA0KDQotLS0NCg0KIyBDYXNlIFN0dWR5IDENCg0KIyMgT25lLVNhbXBsZSBaLVRlc3QgKFN0YXRpc3RpY2FsIEh5cG90aGVzZXMpDQoNCkEgKipkaWdpdGFsIGxlYXJuaW5nIHBsYXRmb3JtKiogY2xhaW1zIHRoYXQgdGhlICoqYXZlcmFnZSBkYWlseSBzdHVkeSB0aW1lKiogb2YgaXRzIHVzZXJzIGlzICoqMTIwIG1pbnV0ZXMqKi4gQmFzZWQgb24gaGlzdG9yaWNhbCByZWNvcmRzLCB0aGUgKipwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBrbm93bioqIHRvIGJlIDE1IG1pbnV0ZXMuDQoNCkEgcmFuZG9tIHNhbXBsZSBvZiAqKjY0IHVzZXJzKiogc2hvd3MgYW4gYXZlcmFnZSBzdHVkeSB0aW1lIG9mICoqMTE2IG1pbnV0ZXMqKi4NCg0KJCQNClxiZWdpbntlcW5hcnJheSp9DQpcbXVfMCAmPSYgMTIwIFxcDQpcc2lnbWEgJj0mIDE1IFxcDQpuICY9JiA2NCBcXA0KXGJhcnt4fSAmPSYgMTE2DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCiMjIFRhc2tzDQoNCjEuIEZvcm11bGF0ZSB0aGUgKipOdWxsIEh5cG90aGVzaXMgKEjigoApKiogYW5kICoqQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoSOKCgSkqKi4NCjIuIElkZW50aWZ5IHRoZSAqKmFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QqKiBhbmQganVzdGlmeSB5b3VyIGNob2ljZS4NCjMuIENvbXB1dGUgdGhlICoqdGVzdCBzdGF0aXN0aWMqKiBhbmQgKipwLXZhbHVlKiogdXNpbmcgJFxhbHBoYSA9IDAuMDUkLg0KNC4gU3RhdGUgdGhlICoqc3RhdGlzdGljYWwgZGVjaXNpb24qKi4NCjUuIEludGVycHJldCB0aGUgcmVzdWx0IGluIGEgKipidXNpbmVzcyBhbmFseXRpY3MgY29udGV4dCoqLg0KDQojIyAgQW5zd2VyIENhc2UgU3R1ZHkgMQ0KDQoxLiBGb3JtdWxhdGUgdGhlICoqTnVsbCBIeXBvdGhlc2lzIChI4oKAKSoqIGFuZCAqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKEjigoEpKiouDQoNCg0KSW4gaHlwb3RoZXNpcyB0ZXN0aW5nLCB3ZSBjb21wYXJlIGEgInN0YXR1cyBxdW8iIGNsYWltIGFnYWluc3QgYSBuZXcgb2JzZXJ2YXRpb24gdG8gc2VlIGlmIHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLg0KDQotIFRoZSBOdWxsIEh5cG90aGVzaXMgKCRIXzAkKQ0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzIHJlcHJlc2VudHMgdGhlIGNsYWltIHRoYXQgdGhlcmUgaXMgbm8gY2hhbmdlIG9yIG5vIGRpZmZlcmVuY2UuIEluIHRoaXMgY2FzZSwgaXQgYXNzdW1lcyB0aGUgcGxhdGZvcm0ncyBjbGFpbSBpcyBjb3JyZWN0Lg0KDQotIFN0YXRlbWVudDogVGhlIGF2ZXJhZ2UgZGFpbHkgc3R1ZHkgdGltZSBvZiB1c2VycyBpcyBlcXVhbCB0byAxMjAgbWludXRlcy5NYXRoZW1hdGljYWwgDQotIEZvcm06ICQkSF8wOiBcbXUgPSAxMjAkJA0KDQotIFRoZSBBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzICgkSF8xJCkNCg0KVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaXMgd2hhdCB3ZSBzdXNwZWN0IG1pZ2h0IGFjdHVhbGx5IGJlIHRydWUgKHRoYXQgdGhlIGNsYWltIGlzIGluY29ycmVjdCkuIFNpbmNlIHRoZSBwcm9ibGVtIGRvZXMgbm90IHNwZWNpZnkgaWYgd2UgYXJlIGxvb2tpbmcgZm9yICJsZXNzIHRoYW4iIG9yICJncmVhdGVyIHRoYW4sIiB3ZSB0ZXN0IGZvciBhbnkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4NCg0KLSBTdGF0ZW1lbnQ6IFRoZSBhdmVyYWdlIGRhaWx5IHN0dWR5IHRpbWUgb2YgdXNlcnMgaXMgbm90IGVxdWFsIHRvIDEyMCBtaW51dGVzLg0KLSBNYXRoZW1hdGljYWwgRm9ybTogJCRIXzE6IFxtdSBcbmVxIDEyMCQkDQoNCg0KVG8gbW92ZSBmb3J3YXJkIHdpdGggdGhlIGNhbGN1bGF0aW9uICh0aGUgWi10ZXN0KSwgeW91IGhhdmUgdGhlIGZvbGxvd2luZyBrbm93biB2YWx1ZXM6DQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KbGlicmFyeShrbml0cikNCg0KbXlfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgUGFyYW1ldGVyID0gYygiUG9wdWxhdGlvbiBNZWFuIiwgIlBvcHVsYXRpb24gU3RkLiBEZXZpYXRpb24iLCAiU2FtcGxlIFNpemUiLCAiU2FtcGxlIE1lYW4iKSwNCiAgU3ltYm9sID0gYygizrwwIiwgIs+DIiwgIm4iLCAieMyEIiksDQogIFZhbHVlID0gYygiMTIwIG1pbnV0ZXMiLCAiMTUgbWludXRlcyIsICI2NCIsICIxMTYgbWludXRlcyIpDQopDQoNCiMgRGlzcGxheSBhcyBhIG5pY2VseSBmb3JtYXR0ZWQgbWFya2Rvd24gdGFibGUNCmthYmxlKG15X3RhYmxlLCBhbGlnbiA9IGMoImwiLCAiYyIsICJyIiksIGNhcHRpb24gPSAiU3RhdGlzdGljYWwgUGFyYW1ldGVycyIpDQpgYGANCg0KDQoyLiAgSWRlbnRpZnkgdGhlICoqYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgdGVzdCoqIGFuZCBqdXN0aWZ5IHlvdXIgY2hvaWNlLg0KDQpUaGUgY2hvaWNlIG9mIGEgWi10ZXN0IG92ZXIgYSBULXRlc3QgaXMgYmFzZWQgb24gdHdvIHByaW1hcnkgY3JpdGVyaWEgZm91bmQgaW4gdGhlIGRhdGE6DQoNCi0gSnVzdGlmaWNhdGlvbiAxOiBLbm93biBQb3B1bGF0aW9uIFN0YW5kYXJkIERldmlhdGlvbg0KDQpUaGUgbW9zdCBjcml0aWNhbCBmYWN0b3IgaW4gY2hvb3NpbmcgYSBaLXRlc3QgaXMgdGhhdCB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKCRcc2lnbWEkKSBpcyBrbm93bi4gSW4gdGhpcyBjYXNlLCB0aGUgcGxhdGZvcm0gcHJvdmlkZXMgYSBoaXN0b3JpY2FsIHJlY29yZCBzaG93aW5nICRcc2lnbWEgPSAxNSQuDQoNCi0gSWYgJFxzaWdtYSQgd2VyZSB1bmtub3duIGFuZCB3ZSBoYWQgdG8gcmVseSBvbiB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiAoJHMkKSwgYSBULXRlc3Qgd291bGQgdHlwaWNhbGx5IGJlIHJlcXVpcmVkIHRvIGFjY291bnQgZm9yIHRoZSBhZGRpdGlvbmFsIHVuY2VydGFpbnR5Lg0KDQotIEp1c3RpZmljYXRpb24gMjogTGFyZ2UgU2FtcGxlIFNpemUgKCRuIFxnZSAzMCQpVGhlIHNhbXBsZSBzaXplIGluIHRoaXMgc3R1ZHkgaXMgNjQsIHdoaWNoIGlzIHNpZ25pZmljYW50bHkgbGFyZ2VyIHRoYW4gdGhlIGNvbW1vbiB0aHJlc2hvbGQgb2YgMzAuDQoNCi0gQWNjb3JkaW5nIHRvIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0sIHdoZW4gdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlICgkbiBcZ2UgMzAkKSwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiBiZWNvbWVzIGFwcHJveGltYXRlbHkgbm9ybWFsLCByZWdhcmRsZXNzIG9mIHRoZSBzaGFwZSBvZiB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gVGhpcyByZWluZm9yY2VzIHRoZSB2YWxpZGl0eSBvZiB1c2luZyB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbiAoWi1kaXN0cmlidXRpb24pLg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KcmVxdWlyZW1lbnRzX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFJlcXVpcmVtZW50ID0gYygiUG9wdWxhdGlvbiBTdGQuIERldi4gKM+DKSIsICJTYW1wbGUgU2l6ZSAobikiLCAiRGF0YSBUeXBlIiwgIkluZGVwZW5kZW5jZSIpLA0KICBgQ2FzZSBTdHVkeSBWYWx1ZWAgPSBjKCJLbm93biAoMTUpIiwgIjY0IiwgIkNvbnRpbnVvdXMgKG1pbnV0ZXMpIiwgIlJhbmRvbSBzYW1wbGUiKSwNCiAgYENvbmRpdGlvbiBNZXQ/YCA9IGMoIlllcyIsICJZZXMgKHNpbmNlIG7iiaUzMCkiLCAiWWVzIiwgIlllcyIpLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIGEgc3R5bGVkIHRhYmxlDQprYWJsZShyZXF1aXJlbWVudHNfdGFibGUsIA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImMiLCAiYyIpLA0KICAgICAgY2FwdGlvbiA9ICJSZXF1aXJlbWVudHMgQ2hlY2sgZm9yIFN0YXRpc3RpY2FsIFRlc3QiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImNlbnRlciIpICU+JQ0KICBjb2x1bW5fc3BlYygzLCBib2xkID0gVFJVRSwgY29sb3IgPSAiZ3JlZW4iKSAgIyBIaWdobGlnaHQgIkNvbmRpdGlvbiBNZXQ/IiBjb2x1bW4NCmBgYA0KDQoqKkNvbmNsdXNpb24qKjogQmVjYXVzZSB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gaXMga25vd24gYW5kIHRoZSBzYW1wbGUgc2l6ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UsIHRoZSBPbmUtU2FtcGxlIFotVGVzdCBpcyB0aGUgbW9zdCBwcmVjaXNlIGFuZCByb2J1c3QgbWV0aG9kIGZvciB0aGlzIGFuYWx5c2lzLg0KDQozLiAgQ29tcHV0ZSB0aGUgKip0ZXN0IHN0YXRpc3RpYyoqIGFuZCAqKnAtdmFsdWUqKiB1c2luZyAkXGFscGhhID0gMC4wNSQuDQoNCiAqKkNvbXB1dGUgdGhlIFRlc3QgU3RhdGlzdGljKioNCg0KVGhlIFotc2NvcmUgbWVhc3VyZXMgaG93IG1hbnkgc3RhbmRhcmQgZXJyb3JzIHRoZSBzYW1wbGUgbWVhbiAoJFxiYXJ7eH0kKSBpcyBmcm9tIHRoZSBwb3B1bGF0aW9uIG1lYW4gKCRcbXVfMCQpLg0KDQotIFN0ZXAgMTogQ2FsY3VsYXRlIHRoZSBTdGFuZGFyZCBFcnJvciAoJFNFJClUaGUgc3RhbmRhcmQgZXJyb3IgcmVwcmVzZW50cyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24uDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSA9IFxmcmFjezE1fXtcc3FydHs2NH19ID0gXGZyYWN7MTV9ezh9ID0gMS44NzUkJA0KDQotIFN0ZXAgMjogQ2FsY3VsYXRlIHRoZSBaLXNjb3JlICgkeiQpJCR6ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtTRX0gPSBcZnJhY3sxMTYgLSAxMjB9ezEuODc1fSA9IFxmcmFjey00fXsxLjg3NX0gXGFwcHJveCAtMi4xMzMzJCQNClRoZSB0ZXN0IHN0YXRpc3RpYyBpcyAkeiA9IC0yLjEzJC4NCg0KKipDb21wdXRlIHRoZSBQLVZhbHVlKioNCg0KU2luY2Ugb3VyIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaXMgdHdvLXRhaWxlZCAoJEhfMTogXG11IFxuZXEgMTIwJCksIHdlIGxvb2sgZm9yIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgYSBaLXNjb3JlIG1vcmUgZXh0cmVtZSB0aGFuICRccG0gMi4xMyQgaW4gYm90aCB0YWlscyBvZiB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCg0KLSBQLXZhbHVlIGNhbGN1bGF0aW9uOiAkUCh8WnwgPiAyLjEzKSA9IDIgXHRpbWVzIFAoWiA8IC0yLjEzKSQNCg0KLSBVc2luZyB0aGUgc3RhbmRhcmQgbm9ybWFsIHRhYmxlIChvciBzb2Z0d2FyZSk6JFAoWiA8IC0yLjEzKSBcYXBwcm94IDAuMDE2NCQNCi0gVHdvLXRhaWxlZCBwLXZhbHVlICQ9IDIgXHRpbWVzIDAuMDE2NCA9IDAuMDMyOCQNCg0KVGhlIHAtdmFsdWUgaXMgJDAuMDMyOSQgKHJvdW5kZWQpLg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBTdGVwID0gYygiWi1TdGF0aXN0aWMiLCAiUC12YWx1ZSIsICJUaHJlc2hvbGQgKM6xKSIsICJGaW5hbCBEZWNpc2lvbiIpLA0KICBSZXN1bHQgPSBjKCItMi4xMyIsICIwLjAzMjkiLCAiMC4wNSIsICJSZWplY3QgSOKCgCIpDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUocmVzdWx0cywgDQogICAgICBhbGlnbiA9IGMoImwiLCAiciIpLA0KICAgICAgY2FwdGlvbiA9ICJaLVRlc3QgUmVzdWx0cyBTdW1tYXJ5IiwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlN0YXRpc3RpY2FsIE1lYXN1cmUiLCAiVmFsdWUiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgZm9udF9zaXplID0gMTQNCiAgKSAlPiUNCiAgcm93X3NwZWMoNCwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRDMyRjJGIikgJT4lICAjIFJlZCBmb3IgZmluYWwgZGVjaXNpb24NCiAgcm93X3NwZWMoMiwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIiMxNTY1QzAiKSAlPiUgICMgQmx1ZSBmb3IgcC12YWx1ZQ0KICBjb2x1bW5fc3BlYygyLCBib2xkID0gVFJVRSkNCmBgYA0KDQpDb21wYXJpc29uOiBTaW5jZSB0aGUgcC12YWx1ZSAoJDAuMDMyOSQpIDwgJFxhbHBoYSQgKCQwLjA1JCksIHRoZSByZXN1bHQgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIExvYWQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gUGFyYW1ldGVyDQp6X3N0YXQgPC0gLTIuMTMzDQphbHBoYSA8LSAwLjA1DQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhLzIpICMgTmlsYWkga3JpdGlzICgxLjk2KQ0KDQojIDIuIERhdGEgS3VydmEgTm9ybWFsDQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoLm91dCA9IDEwMDApDQp5IDwtIGRub3JtKHgpDQpkZiA8LSBkYXRhLmZyYW1lKHggPSB4LCB5ID0geSkNCg0KIyAzLiBQbG90dGluZyBkZW5nYW4gUGxvdGx5DQpmaWcgPC0gcGxvdF9seShkZiwgeCA9IH54LCB5ID0gfnksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgICAgIG5hbWUgPSAnRGlzdHJpYnVzaSBaJywgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snKSkNCg0KIyBUYW1iYWhrYW4gV2lsYXlhaCBQZW5vbGFrYW4gKEtpcmkpDQpmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UoeCA9IH54W3ggPD0gLXpfY3JpdF0sIHkgPSB+eVt4IDw9IC16X2NyaXRdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gJ3RvemVyb3knLCBmaWxsY29sb3IgPSAncmdiYSgyNTUsIDAsIDAsIDAuMyknLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICd0cmFuc3BhcmVudCcpLCBuYW1lID0gJ1dpbGF5YWggVG9sYWsnKQ0KDQojIFRhbWJhaGthbiBXaWxheWFoIFBlbm9sYWthbiAoS2FuYW4pDQpmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UoeCA9IH54W3ggPj0gel9jcml0XSwgeSA9IH55W3ggPj0gel9jcml0XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICd0b3plcm95JywgZmlsbGNvbG9yID0gJ3JnYmEoMjU1LCAwLCAwLCAwLjMpJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAndHJhbnNwYXJlbnQnKSwgc2hvd2xlZ2VuZCA9IEZBTFNFKQ0KDQojIFRhbWJhaGthbiBHYXJpcyBaLWhpdHVuZyAoLTIuMTMpDQpmaWcgPC0gZmlnICU+JSBhZGRfc2VnbWVudHMoeCA9IHpfc3RhdCwgeGVuZCA9IHpfc3RhdCwgeSA9IDAsIHllbmQgPSBkbm9ybSh6X3N0YXQpICsgMC4wNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIGRhc2ggPSAnZGFzaCcsIHdpZHRoID0gMyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZSgnWi1oaXR1bmc6Jywgcm91bmQoel9zdGF0LCAyKSkpDQoNCiMgUGVuZ2F0dXJhbiBMYXlvdXQNCmZpZyA8LSBmaWcgJT4lIGxheW91dCgNCiAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgVWppIFogKFBsb3RseSBkaSBSKSIsDQogIHhheGlzID0gbGlzdCh0aXRsZSA9ICJaLXNjb3JlIiksDQogIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEZW5zaXR5IiksDQogIGFubm90YXRpb25zID0gbGlzdCgNCiAgICBsaXN0KHggPSB6X3N0YXQsIHkgPSBkbm9ybSh6X3N0YXQpICsgMC4wNywgdGV4dCA9ICJIYXNpbCBaLWhpdHVuZyIsIHNob3dhcnJvdyA9IEZBTFNFLCBmb250ID0gbGlzdChjb2xvciA9ICJibHVlIikpLA0KICAgIGxpc3QoeCA9IC0yLjUsIHkgPSAwLjAyLCB0ZXh0ID0gIkFscGhhLzIiLCBzaG93YXJyb3cgPSBGQUxTRSksDQogICAgbGlzdCh4ID0gMi41LCB5ID0gMC4wMiwgdGV4dCA9ICJBbHBoYS8yIiwgc2hvd2Fycm93ID0gRkFMU0UpDQogICkNCikNCg0KZmlnDQpgYGANCg0KSG93IHRvIFJlYWQgdGhlIFZpc3VhbGl6YXRpb246DQoNCi0gKipCbGFjayBMaW5lOioqIFN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gY3VydmUuDQoNCi0gKipSZWQgQXJlYToqKiAkSF8wJCByZWplY3Rpb24gcmVnaW9uLiANClRoZSBib3VuZGFyeSBpcyAkXHBtIDEuOTYkLiBJZiB0aGUgWi1jb3VudCBmYWxscyBpbnRvIHRoaXMgYXJlYSwgd2UgcmVqZWN0IHRoZSBwbGF0Zm9ybSdzIGNsYWltLg0KDQotICoqQmx1ZSBEYXNoZWQgTGluZToqKiBUaGUgcG9zaXRpb24gb2Ygb3VyIHNhbXBsZSBkYXRhIGF0IC0yLjEzLg0KDQotICoqQ29uY2x1c2lvbjoqKiBTaW5jZSB0aGUgYmx1ZSBsaW5lIGlzIHdpdGhpbiB0aGUgUmVkIEFyZWEsIHdlIGNhbiBpbW1lZGlhdGVseSB2aXN1YWxseSBzZWUgdGhhdCB0aGUgcmVzdWx0cyBvZiB0aGlzIHN0dWR5IGFyZSBzaWduaWZpY2FudCAoUmVqZWN0ICRIXzAkKS4NCg0KDQo0LiBTdGF0ZSB0aGUgKipzdGF0aXN0aWNhbCBkZWNpc2lvbioqDQoNClRvIHJlYWNoIGEgZmluYWwgZGVjaXNpb24sIHdlIGV2YWx1YXRlIHdoZXRoZXIgdGhlIGV2aWRlbmNlIGlzIHN0cm9uZyBlbm91Z2ggdG8gcmVqZWN0IHRoZSBwbGF0Zm9ybSdzIGluaXRpYWwgY2xhaW0uDQoNCioqVGhlIERlY2lzaW9uIFJ1bGUqKg0KDQotICoqUC12YWx1ZSAoJDAuMDMyOSQpIDwgQWxwaGEgKCQwLjA1JCk6KiogVGhlIHJlc3VsdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lg0KLSAqKlotc3RhdGlzdGljICgkLTIuMTMkKToqKiBUaGlzIGZhbGxzIG91dHNpZGUgdGhlICoqIkZhaWwgdG8gUmVqZWN0IioqIHJhbmdlICh3aGljaCBpcyBiZXR3ZWVuICQtMS45NiQgYW5kICQrMS45NiQgZm9yIGEgOTUlIGNvbmZpZGVuY2UgbGV2ZWwpLg0KDQoqKkZpbmFsIERlY2lzaW9uKioNCg0KKipSZWplY3QgdGhlIE51bGwgSHlwb3RoZXNpcyAoJEhfMCQpKioNCg0KKipGb3JtYWwgSW50ZXJwcmV0YXRpb24qKg0KDQpUaGVyZSBpcyAqKnN1ZmZpY2llbnQgZXZpZGVuY2UqKiBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIHNpZ25pZmljYW5jZSBsZXZlbCB0byBjb25jbHVkZSB0aGF0IHRoZSBhdmVyYWdlIGRhaWx5IHN0dWR5IHRpbWUgb2YgdGhlIGRpZ2l0YWwgbGVhcm5pbmcgcGxhdGZvcm0ncyB1c2VycyBpcyAqKnNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gMTIwIG1pbnV0ZXMqKi4NCg0KVGhlIGRhdGEgc3VnZ2VzdHMgdGhhdCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gaXMgbGlrZWx5IGxvd2VyIHRoYW4gd2hhdCB0aGUgcGxhdGZvcm0gY2xhaW1zLCBnaXZlbiB0aGF0IG91ciBzYW1wbGUgbWVhbiBvZiAxMTYgbWludXRlcyByZXN1bHRlZCBpbiBhIFotc2NvcmUgdGhhdCByZWFjaGVkIHRoZSAicmVqZWN0aW9uIHJlZ2lvbi4iDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIEluc3RhbGwgaWYgbmVlZGVkOiBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQ3JlYXRlIHRoZSBkYXRhDQp0ZXN0X3Jlc3VsdHMgPC0gZGF0YS5mcmFtZSgNCiAgTWV0cmljID0gYygiWi1TY29yZSIsICJQLXZhbHVlIiksDQogIFZhbHVlID0gYygi4oiSMi4xMyIsICIwLjAzMjkiKSwNCiAgYFRocmVzaG9sZC9Db25kaXRpb25gID0gYygifHp8ID4gMS45NiIsICJwIDwgMC4wNSIpLA0KICBEZWNpc2lvbiA9IGMoIlJlamVjdCBI4oKAIiwgIlN0YXRpc3RpY2FsbHkgU2lnbmlmaWNhbnQiKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBiZWF1dGlmdWwgdGFibGUNCmthYmxlKHRlc3RfcmVzdWx0cywgDQogICAgICBhbGlnbiA9IGMoImwiLCAiciIsICJsIiwgImwiKSwNCiAgICAgIGNhcHRpb24gPSAiSHlwb3RoZXNpcyBUZXN0IERlY2lzaW9uIENyaXRlcmlhIiwNCiAgICAgIGZvcm1hdCA9ICJodG1sIikgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDE0DQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgY29sb3IgPSAiYmx1ZSIsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygzLCBjb2xvciA9ICJkYXJrZ3JheSIsIHdpZHRoID0gIjVjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCBjb2xvciA9ICJkYXJrcmVkIiwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjZjbSIpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIk9ic2VydmVkIiA9IDEsICJEZWNpc2lvbiBSdWxlIiA9IDEsICJDb25jbHVzaW9uIiA9IDEpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJOb3RlOiBUaGUgYWJzb2x1dGUgWi1zY29yZSAofOKIkjIuMTN8ID0gMi4xMykgZXhjZWVkcyB0aGUgY3JpdGljYWwgdmFsdWUgb2YgMS45NiwgYW5kIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiAwLjA1LCBwcm92aWRpbmcgc3VmZmljaWVudCBldmlkZW5jZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBhdCB0aGUgNSUgc2lnbmlmaWNhbmNlIGxldmVsLiIpDQpgYGANCg0KKipDb25jbHVzaW9uOioqIFRoZSBwbGF0Zm9ybSdzIGNsYWltIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNhbXBsZSBkYXRhLg0KDQo1LiBJbnRlcnByZXQgdGhlIHJlc3VsdCBpbiBhICoqYnVzaW5lc3MgYW5hbHl0aWNzIGNvbnRleHQqKi4NCg0KKipEaXNjcmVwYW5jeSBpbiBQZXJmb3JtYW5jZSBDbGFpbXMqKg0KDQpUaGUgYW5hbHlzaXMgcmV2ZWFscyB0aGF0IHRoZSBwbGF0Zm9ybSdzIGNsYWltIG9mIDEyMCBtaW51dGVzIG9mIHN0dWR5IHRpbWUgaXMgc3RhdGlzdGljYWxseSBvdmVyZXN0aW1hdGVkLiBUaGUgb2JzZXJ2ZWQgYXZlcmFnZSBvZiAxMTYgbWludXRlcyBpcyBub3QganVzdCBhIHJhbmRvbSBmbHVjdHVhdGlvbjsgaXQgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50IGRvd253YXJkIGRlcGFydHVyZSBmcm9tIHRoZSBoaXN0b3JpY2FsIGJlbmNobWFyay4NCg0KLSAqKkJ1c2luZXNzIEltcGFjdDoqKiBJZiB0aGlzIDEyMC1taW51dGUgZmlndXJlIGlzIHVzZWQgaW4gbWFya2V0aW5nIG1hdGVyaWFscyBvciBpbnZlc3RvciBwaXRjaGVzLCBpdCBtYXkgYmUgY29uc2lkZXJlZCBtaXNsZWFkaW5nLiBUaGUgZGF0YSBzdWdnZXN0cyB0aGUgInJlYWwiIHVzZXIgZW5nYWdlbWVudCBpcyBsb3dlciB0aGFuIGFkdmVydGlzZWQuDQoNCioqVXNlciBFbmdhZ2VtZW50IEluc2lnaHRzKioNCg0KVGhlIDQtbWludXRlIGdhcCAoJDEyMCAtIDExNiQpIG1pZ2h0IHNlZW0gc21hbGwsIGJ1dCBvbiBhIHNjYWxlIG9mIHRob3VzYW5kcyBvZiB1c2VycywgaXQgaW5kaWNhdGVzIGEgc2hpZnQgaW4gZW5nYWdlbWVudCBwYXR0ZXJucy4NCg0KLSAqKlBvdGVudGlhbCBDYXVzZXM6KiogVGhpcyBkZWNsaW5lIGNvdWxkIGJlIGR1ZSB0byBpbmNyZWFzZWQgY29tcGV0aXRpb24sIGEgY2hhbmdlIGluIHRoZSBkaWZmaWN1bHR5IG9mIG5ldyBjb250ZW50LCBvciBwZXJoYXBzIGEgc2VnbWVudCBvZiB0aGUgdXNlciBiYXNlIGlzIGV4cGVyaWVuY2luZyAibGVhcm5pbmcgZmF0aWd1ZS4iDQoNCioqT3BlcmF0aW9uYWwgUmVjb21tZW5kYXRpb25zKioNCg0KQmFzZWQgb24gdGhpcyBzdGF0aXN0aWNhbCBkZWNpc2lvbiwgYSBidXNpbmVzcyBhbmFseXN0IHdvdWxkIHJlY29tbWVuZCB0aGUgZm9sbG93aW5nIGFjdGlvbnM6DQoNCi0gKipBdWRpdCBNYXJrZXRpbmcgTWF0ZXJpYWxzOioqIFVwZGF0ZSBlbmdhZ2VtZW50IHN0YXRpc3RpY3MgdG8gcmVmbGVjdCBjdXJyZW50IGRhdGEgKGUuZy4sICJVc2VycyBhdmVyYWdlIG5lYXJseSAyIGhvdXJzIGRhaWx5IikgdG8gbWFpbnRhaW4gdHJhbnNwYXJlbmN5Lg0KDQotICoqSW52ZXN0aWdhdGUgUmV0ZW50aW9uOioqIFNpbmNlIHN0dWR5IHRpbWUgaXMgb2Z0ZW4gYSBsZWFkaW5nIGluZGljYXRvciBvZiBzdWJzY3JpcHRpb24gcmVuZXdhbCwgdGhlIHBsYXRmb3JtIHNob3VsZCBpbnZlc3RpZ2F0ZSBpZiB0aGlzIGRlY3JlYXNlIGluIHRpbWUgY29ycmVsYXRlcyB3aXRoIGEgaGlnaGVyIGNodXJuIHJhdGUuDQoNCi0gKipBL0IgVGVzdGluZzoqKiBJbXBsZW1lbnQgbmV3IGZlYXR1cmVzIChsaWtlIGdhbWlmaWNhdGlvbiBvciByZW1pbmRlcnMpIHRvIHNlZSBpZiB0aGUgYXZlcmFnZSBzdHVkeSB0aW1lIGNhbiBiZSBwdXNoZWQgYmFjayB0b3dhcmQgdGhlIDEyMC1taW51dGUgZ29hbC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPVRSVUUsd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBDcmVhdGUgYnVzaW5lc3MgaW5zaWdodHMgdGFibGUNCmJ1c2luZXNzX3JlcG9ydCA8LSBkYXRhLmZyYW1lKA0KICBgQW5hbHl0aWNzIENvbXBvbmVudGAgPSBjKA0KICAgICJTdGF0aXN0aWNhbCBSZXN1bHQiLA0KICAgICJNYWduaXR1ZGUgb2YgRXJyb3IiLCANCiAgICAiQWN0aW9uYWJsZSBJbnNpZ2h0IiwNCiAgICAiQnVzaW5lc3MgSW1wbGljYXRpb24iLA0KICAgICJSZWNvbW1lbmRhdGlvbiINCiAgKSwNCiAgYEJ1c2luZXNzIEZpbmRpbmdgID0gYygNCiAgICAiVGhlIDEyMC1taW51dGUgY2xhaW0gaXMgaW52YWxpZCBhdCA5NSUgY29uZmlkZW5jZSBsZXZlbCAocCA9IDAuMDMyOSA8IDAuMDUpIiwNCiAgICAiQXZlcmFnZSBkZWZpY2l0IG9mIDQgbWludXRlcyAofjMuMyUgYmVsb3cgdGFyZ2V0KSBhY3Jvc3MgdXNlciBiYXNlIiwNCiAgICAiUmV2aWV3IHVzZXIgZXhwZXJpZW5jZSB0byBpZGVudGlmeSBlbmdhZ2VtZW50IGJhcnJpZXJzIiwNCiAgICAiUG90ZW50aWFsIHJlcHV0YXRpb25hbCByaXNrIGlmIGluYWNjdXJhdGUgY2xhaW1zIGNvbnRpbnVlIiwNCiAgICAiQ29uZHVjdCBBL0IgdGVzdGluZyBvbiBwbGF0Zm9ybSBmZWF0dXJlcyB0byBpbXByb3ZlIGVuZ2FnZW1lbnQiDQogICksDQogIGBQcmlvcml0eWAgPSBjKCJIaWdoIiwgIk1lZGl1bSIsICJIaWdoIiwgIkNyaXRpY2FsIiwgIkhpZ2giKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKGJ1c2luZXNzX3JlcG9ydCwgDQogICAgICBhbGlnbiA9IGMoImwiLCAibCIsICJjIiksDQogICAgICBjYXB0aW9uID0gIkJ1c2luZXNzIEludGVsbGlnZW5jZTogU3R1ZHkgVGltZSBBbmFseXNpcyIsDQogICAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDEzLA0KICAgIGZpeGVkX3RoZWFkID0gVFJVRQ0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNGNtIiwgYmFja2dyb3VuZCA9ICIjZjVmNWY1IikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjhjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIyY20iKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjMmMzZTUwIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI2ZmZjNjZCIpICU+JSAgIyBXYXJuaW5nIGNvbG9yIGZvciBzdGF0aXN0aWNhbCByZXN1bHQNCiAgcm93X3NwZWMoNCwgYmFja2dyb3VuZCA9ICIjZjhkN2RhIikgJT4lICAjIERhbmdlciBjb2xvciBmb3IgYnVzaW5lc3MgaW1wbGljYXRpb24NCiAgcm93X3NwZWMoNSwgYmFja2dyb3VuZCA9ICIjZDFlY2YxIikgJT4lICAjIEluZm8gY29sb3IgZm9yIHJlY29tbWVuZGF0aW9uDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiQmFzZWQgb24gc2FtcGxlIG9mIDY0IHVzZXJzIHdpdGggbWVhbiBzdHVkeSB0aW1lIG9mIDExNiBtaW51dGVzICjPgyA9IDE1KS4gQW5hbHlzaXMgY29uZHVjdGVkIGF0IM6xID0gMC4wNS4iKQ0KYGBgDQoNCg0KIyBDYXNlIFN0dWR5IDIgIA0KDQojIyBPbmUtU2FtcGxlIFQtVGVzdCAoz4MgVW5rbm93biwgU21hbGwgU2FtcGxlKQ0KDQpBICoqVVggUmVzZWFyY2ggVGVhbSoqIGludmVzdGlnYXRlcyB3aGV0aGVyIHRoZSAqKmF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUqKiBvZiBhIG5ldyBhcHBsaWNhdGlvbiBkaWZmZXJzIGZyb20gKioxMCBtaW51dGVzKiouDQoNClRoZSBmb2xsb3dpbmcgZGF0YSBhcmUgY29sbGVjdGVkIGZyb20gKioxMCB1c2VycyoqOg0KDQokJA0KOS4yLFw7IDEwLjUsXDsgOS44LFw7IDEwLjEsXDsgOS42LFw7IDEwLjMsXDsgOS45LFw7IDkuNyxcOyAxMC4wLFw7IDkuNQ0KJCQNCg0KIyMgVGFza3MNCg0KMS4gRGVmaW5lICoqSOKCgCoqIGFuZCAqKkjigoEqKiAodHdvLXRhaWxlZCkuDQoyLiBEZXRlcm1pbmUgdGhlICoqYXBwcm9wcmlhdGUgaHlwb3RoZXNpcyB0ZXN0KiouDQozLiBDYWxjdWxhdGUgdGhlICoqdC1zdGF0aXN0aWMqKiBhbmQgKipwLXZhbHVlKiogYXQgJFxhbHBoYSA9IDAuMDUkLg0KNC4gTWFrZSBhICoqc3RhdGlzdGljYWwgZGVjaXNpb24qKi4NCjUuIEV4cGxhaW4gaG93ICoqc2FtcGxlIHNpemUqKiBhZmZlY3RzIGluZmVyZW50aWFsIHJlbGlhYmlsaXR5Lg0KDQojIyAgQW5zd2VyIENhc2UgU3R1ZHkgMg0KDQoxLiAgRGVmaW5lICoqSOKCgCoqIGFuZCAqKkjigoEqKiAodHdvLXRhaWxlZCkuDQoNClRvIGludmVzdGlnYXRlIHdoZXRoZXIgdGhlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgZGlmZmVycyBmcm9tIHRoZSAxMC1taW51dGUgYmVuY2htYXJrLCB3ZSBkZWZpbmUgb3VyIHN0YXRpc3RpY2FsIGh5cG90aGVzZXMgYmFzZWQgb24gdGhlIHBvcHVsYXRpb24gbWVhbiAoJFxtdSQpLkluIGEgdHdvLXRhaWxlZCB0ZXN0LCB3ZSBhcmUgbG9va2luZyBmb3IgYW55IHNpZ25pZmljYW50IGRpZmZlcmVuY2XigJR3aGV0aGVyIHRoZSB1c2VycyBhcmUgZmFzdGVyIG9yIHNsb3dlciB0aGFuIHRoZSB0YXJnZXTigJRyYXRoZXIgdGhhbiBhIHNwZWNpZmljIGRpcmVjdGlvbi4NCg0KKipUaGUgTnVsbCBIeXBvdGhlc2lzICgkSF8wJCkqKg0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzIHJlcHJlc2VudHMgdGhlICJzdGF0dXMgcXVvIiBvciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGlzIG5vIGVmZmVjdCBvciBjaGFuZ2UuMSBJbiB0aGlzIGNhc2UsIGl0IHN0YXRlcyB0aGF0IHRoZSB0cnVlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgaXMgZXhhY3RseSAxMCBtaW51dGVzLiQkSF8wOiBcbXUgPSAxMCQkDQoNCioqVGhlIEFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKSoqDQoNClRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIHJlcHJlc2VudHMgdGhlIHJlc2VhcmNoIGNsYWltIHdlIGFyZSB0ZXN0aW5nIGZvci4yIFNpbmNlIHRoaXMgaXMgYSB0d28tdGFpbGVkIHRlc3QsIGl0IHN0YXRlcyB0aGF0IHRoZSB0cnVlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgaXMgbm90IGVxdWFsIHRvIDEwIG1pbnV0ZXMuJCRIXzE6IFxtdSBcbmVxIDEwJCQNCg0KKipDb250ZXh0dWFsIFN1bW1hcnkqKg0KDQotICRIXzAkOiBUaGUgbmV3IGFwcGxpY2F0aW9uJ3MgYXZlcmFnZSB0YXNrIGNvbXBsZXRpb24gdGltZSBpcyAxMCBtaW51dGVzLg0KDQotICRIXzEkOiBUaGUgbmV3IGFwcGxpY2F0aW9uJ3MgYXZlcmFnZSB0YXNrIGNvbXBsZXRpb24gdGltZSBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tIDEwIG1pbnV0ZXMuDQoNCkZvciBhIG9uZS1zYW1wbGUgdC10ZXN0IGxpa2UgdGhpcywgdGhlIG5leHQgc3RlcCBpcyB1c3VhbGx5IHRvIGNhbGN1bGF0ZSB0aGUgU2FtcGxlIE1lYW4gKCRcYmFye3h9JCkgYW5kIFNhbXBsZSBTdGFuZGFyZCBEZXZpYXRpb24gKCRzJCkgdG8gZmluZCB0aGUgdGVzdCBzdGF0aXN0aWMuDQoNCjIuIERldGVybWluZSB0aGUgKiphcHByb3ByaWF0ZSBoeXBvdGhlc2lzIHRlc3QqKi4NCg0KKipTZWxlY3RlZCBUZXN0OiBPbmUtU2FtcGxlIHQtVGVzdCoqDQoNCkZvciB0aGlzIHNjZW5hcmlvLCB0aGUgKipPbmUtU2FtcGxlIHQtVGVzdCoqIGlzIHRoZSBhcHByb3ByaWF0ZSBjaG9pY2UuIFRoaXMgdGVzdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc2FtcGxlIG1lYW4gc2lnbmlmaWNhbnRseSBkaWZmZXJzIGZyb20gYSBoeXBvdGhlc2l6ZWQgcG9wdWxhdGlvbiBtZWFuIHdoZW4gdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgkXHNpZ21hJCkgaXMgdW5rbm93bi4NCg0KVGhlIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiBmb3VyIHNwZWNpZmljIGNyaXRlcmlhIHByZXNlbnQgaW4geW91ciBjYXNlIHN0dWR5Og0KDQotICoqVW5rbm93biBQb3B1bGF0aW9uIFN0YW5kYXJkIERldmlhdGlvbiAoJFxzaWdtYSQpKio6IFRoZSBwcm9ibGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgYWxsIHBvc3NpYmxlIHVzZXJzOyB3ZSBvbmx5IGhhdmUgdGhlIHJhdyBkYXRhIGZyb20gYSBzbWFsbCBncm91cC4NCg0KLSAqKlNtYWxsIFNhbXBsZSBTaXplICgkbiA8IDMwJCkqKiA6IFlvdSBhcmUgb25seSB0ZXN0aW5nICoqMTAgdXNlcnMqKi4gV2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgc21hbGwgYW5kICRcc2lnbWEkIGlzIHVua25vd24sIHRoZSB0LWRpc3RyaWJ1dGlvbiBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIFotZGlzdHJpYnV0aW9uIChOb3JtYWwgZGlzdHJpYnV0aW9uKS4NCg0KLSAqKkNvbnRpbnVvdXMgRGF0YSoqOiBUYXNrIGNvbXBsZXRpb24gdGltZSBpcyBhIHJhdGlvLWxldmVsIG1lYXN1cmVtZW50ICh0aW1lKSwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGEgdC10ZXN0Lg0KDQotICoqQ29tcGFyaXNvbiB0byBhIEZpeGVkIFN0YW5kYXJkKio6IFlvdSBhcmUgY29tcGFyaW5nIHRoZSBzYW1wbGUgbWVhbiAoJFxiYXJ7eH0kKSBhZ2FpbnN0IGEgc3BlY2lmaWMgYmVuY2htYXJrIHZhbHVlICgkXG11XzAgPSAxMCQgbWludXRlcykuDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIEluc3RhbGwgaWYgbmVlZGVkOiBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQ3JlYXRlIGNvbXByZWhlbnNpdmUgcGFyYW1ldGVycyB0YWJsZQ0KdGVzdF9wYXJhbXMgPC0gZGF0YS5mcmFtZSgNCiAgQ2F0ZWdvcnkgPSBjKCJIeXBvdGhlc2lzIiwgIlNhbXBsZSIsICJTdGF0aXN0aWNzIiwgIkRhdGEiLCAiQXNzdW1wdGlvbnMiKSwNCiAgUGFyYW1ldGVyID0gYygNCiAgICAiSHlwb3RoZXNpemVkIE1lYW4gKM684oKAKSIsDQogICAgIlNhbXBsZSBTaXplIChuKSIsDQogICAgIkRlZ3JlZXMgb2YgRnJlZWRvbSAoZGYpIiwNCiAgICAiRGF0YSBUeXBlIiwNCiAgICAiUG9wdWxhdGlvbiBTRCAoz4MpIg0KICApLA0KICBTeW1ib2wgPSBjKCLOvOKCgCIsICJuIiwgImRmIiwgIuKAlCIsICLPgyIpLA0KICBWYWx1ZSA9IGMoIjEwIG1pbnV0ZXMiLCAiMTAiLCAiOSIsICJDb250aW51b3VzIiwgIlVua25vd24iKSwNCiAgU3RhdHVzID0gYygiR2l2ZW4iLCAiQ29sbGVjdGVkIiwgIkNhbGN1bGF0ZWQiLCAiVmFsaWQiLCAiVW5rbm93biDihpIgVXNlIHQtdGVzdCIpLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUodGVzdF9wYXJhbXMsIA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImwiLCAiYyIsICJjIiwgImwiKSwNCiAgICAgIGNhcHRpb24gPSAiU3RhdGlzdGljYWwgVGVzdCBQYXJhbWV0ZXJzOiBPbmUtU2FtcGxlIHQtVGVzdCBTZXR1cCIsDQogICAgICBjb2wubmFtZXMgPSBjKCJDYXRlZ29yeSIsICJQYXJhbWV0ZXIiLCAiU3ltYm9sIiwgIlZhbHVlIiwgIlN0YXR1cyIpKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgZm9udF9zaXplID0gMTMNCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjNjbSIsIGJhY2tncm91bmQgPSAiI2Y4ZjlmYSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiMmNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDQsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg1LCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gInRvcCIpICU+JQ0KICByb3dfc3BlYyg1LCBib2xkID0gVFJVRSwgY29sb3IgPSAiI2QzMmYyZiIpICU+JSAgIyBIaWdobGlnaHQgz4MgdW5rbm93bg0KICBmb290bm90ZShnZW5lcmFsID0gIk5vdGU6IFNpbmNlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICjPgykgaXMgdW5rbm93biwgYSB0LXRlc3QgKG5vdCB6LXRlc3QpIGlzIGFwcHJvcHJpYXRlIGZvciBoeXBvdGhlc2lzIHRlc3RpbmcuIikNCmBgYA0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoc3RhdHMpDQoNCiMgRGF0YSBkYW4gUGFyYW1ldGVyDQpkYXRhX3VzZXJzIDwtIGMoOS4yLCAxMC41LCA5LjgsIDEwLjEsIDkuNiwgMTAuMywgOS45LCA5LjcsIDEwLjAsIDkuNSkNCm11XzAgPC0gMTANCm4gPC0gbGVuZ3RoKGRhdGFfdXNlcnMpDQpkZiA8LSBuIC0gMQ0KdF9zdGF0IDwtIChtZWFuKGRhdGFfdXNlcnMpIC0gbXVfMCkgLyAoc2QoZGF0YV91c2VycykgLyBzcXJ0KG4pKQ0KdF9jcml0IDwtIHF0KDAuOTc1LCBkZikNCg0KIyBNZW1idWF0IGt1cnZhIGRpc3RyaWJ1c2kgdA0KeCA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeSA8LSBkdCh4LCBkZikNCmRmX3Bsb3QgPC0gZGF0YS5mcmFtZSh4ID0geCwgeSA9IHkpDQoNCiMgVmlzdWFsaXNhc2kgZGVuZ2FuIFBsb3RseQ0KZmlnIDwtIHBsb3RfbHkoZGZfcGxvdCwgeCA9IH54LCB5ID0gfnksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgICAgIG5hbWUgPSAnRGlzdHJpYnVzaSB0IChkZj05KScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJykpICU+JQ0KICAjIERhZXJhaCBQZW5vbGFrYW4gS2lyaQ0KICBhZGRfcG9seWdvbnMoeCA9IGMoeFt4IDw9IC10X2NyaXRdLCAtdF9jcml0KSwgeSA9IGMoeVt4IDw9IC10X2NyaXRdLCAwKSwNCiAgICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgICAgbmFtZSA9ICdEYWVyYWggUGVub2xha2FuJykgJT4lDQogICMgRGFlcmFoIFBlbm9sYWthbiBLYW5hbg0KICBhZGRfcG9seWdvbnMoeCA9IGModF9jcml0LCB4W3ggPj0gdF9jcml0XSksIHkgPSBjKDAsIHlbeCA+PSB0X2NyaXRdKSwNCiAgICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSAlPiUNCiAgIyBHYXJpcyB0LW9icyAoRGF0YSBBbmRhKQ0KICBhZGRfc2VnbWVudHMoeCA9IHRfc3RhdCwgeGVuZCA9IHRfc3RhdCwgeSA9IDAsIHllbmQgPSAwLjQsDQogICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdibHVlJywgZGFzaCA9ICdkYXNoJywgd2lkdGggPSAzKSwgbmFtZSA9ICd0LWhpdHVuZycpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiT25lLVNhbXBsZSB0LVRlc3QiLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gInQtdmFsdWUiKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEZW5zaXR5IiksDQogICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAgICAgIGxpc3QoeCA9IHRfc3RhdCwgeSA9IDAuMiwgdGV4dCA9IHBhc3RlKCJ0LW9iczoiLCByb3VuZCh0X3N0YXQsMykpLCBzaG93YXJyb3cgPSBUKQ0KICAgICAgICAgKSkNCg0KZmlnDQpgYGANCg0KKipTdGF0aXN0aWNhbCBDYWxjdWxhdGlvbiBSZXN1bHRzKioNCg0KQmFzZWQgb24gdGhlIDEwIHVzZXIgZGF0YSB5b3UgcHJvdmlkZWQ6DQoNCi0gKipTYW1wbGUgTWVhbiAoJFxiYXJ7eH0kKSoqOiAkOS44NiQgbWludXRlcw0KDQotICoqU2FtcGxlIFN0YW5kYXJkIERldmlhdGlvbiAoJHMkKSoqOiAkMC4zODYkDQoNCi0gKip0LXN0YXRpc3RpYyAoJHRfe29ic30kKSoqOiAkLTEuMTQ2JA0KDQotICoqRGVncmVlcyBvZiBGcmVlZG9tICgkZGYkKSoqOiAkOSQNCg0KLSAqKkNyaXRpY2FsIFZhbHVlICgkdF97Y3JpdH0kKSoqOiAkXHBtIDIuMjYyJCAoZm9yICRcYWxwaGEgPSAwLjA1JCwgdHdvLXRhaWxlZCkNCg0KKipDb25jbHVzaW9uKio6IFNpbmNlIHRoZSBjYWxjdWxhdGVkICR0JCB2YWx1ZSAoJC0xLjE0NiQpIGlzIGJldHdlZW4gdGhlIGNyaXRpY2FsIHZhbHVlcyDigIvigIsoJC0yLjI2MiQgYW5kICQrMi4yNjIkKSwgd2UgKipmYWlsIHRvIHJlamVjdCAkSF8wJCoqLiBUaGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgYW5kIHRoZSB0YXJnZXQgb2YgMTAgbWludXRlcy4NCg0KMy4gIENhbGN1bGF0ZSB0aGUgKip0LXN0YXRpc3RpYyoqIGFuZCAqKnAtdmFsdWUqKiBhdCAkXGFscGhhID0gMC4wNSQuDQoNCioqRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqDQoNCkZpcnN0LCB3ZSBjYWxjdWxhdGUgdGhlIG1lYW4gKCRcYmFye3h9JCkgYW5kIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICgkcyQpOg0KDQotIFNhbXBsZSBNZWFuICgkXGJhcnt4fSQpOg0KDQokJFxiYXJ7eH0gPSBcZnJhY3tcc3VtIHh9e259ID0gXGZyYWN7OS4yICsgMTAuNSArIDkuOCArIDEwLjEgKyA5LjYgKyAxMC4zICsgOS45ICsgOS43ICsgMTAuMCArIDkuNX17MTB9ID0gXG1hdGhiZns5Ljg2fSQkDQoNCi0gU2FtcGxlIFN0YW5kYXJkIERldmlhdGlvbiAoJHMkKToNCg0KJCRzID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXGJhcnt4fSleMn17bi0xfX0gXGFwcHJveCBcbWF0aGJmezAuMzg2fSQkDQoNCioqQ2FsY3VsYXRpb24gb2YgdC1zdGF0aXN0aWMqKg0KDQpUaGUgZm9ybXVsYSBmb3IgJHQkLXN0YXRpc3RpYyBpczokJHQgPSBcZnJhY3tcYmFye3h9IC0gXG11XzB9e3MgLyBcc3FydHtufX0kJA0KDQpXaGVyZToNCg0KLSAkXGJhcnt4fSA9IDkuODYkDQoNCi0gJFxtdV8wID0gMTAkIChIeXBvdGhlc2lzIHZhbHVlKQ0KDQotICRzID0gMC4zODYkJG4gPSAxMCQNCg0KKipDYWxjdWxhdGlvbiBzdGVwczoqKg0KDQotIENhbGN1bGF0ZSBTdGFuZGFyZCBFcnJvciAoJFNFJCk6ICRTRSA9IDAuMzg2IC8gXHNxcnR7MTB9ID0gMC4zODYgLyAzLjE2MiA9IFxtYXRoYmZ7MC4xMjJ9JA0KDQotIENhbGN1bGF0ZSB0LXNjb3JlOiAkdCA9ICg5Ljg2IC0gMTApIC8gMC4xMjIgPSAtMC4xNCAvIDAuMTIyID0gXG1hdGhiZnstMS4xNDd9JA0KDQoqKkRldGVybWluaW5nIHRoZSBwLXZhbHVlKioNCg0KVG8gZGV0ZXJtaW5lIHRoZSAkcCQtdmFsdWUsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgJHQkLWRpc3RyaWJ1dGlvbiB0YWJsZSBvciB1c2UgdGhlIHN0YXRpc3RpY2FsIGZ1bmN0aW9uIHdpdGggdGhlIHBhcmFtZXRlcnM6DQoNCi0gdC1zdGF0aXN0aWM6ICQtMS4xNDckDQoNCi0gRGVncmVlcyBvZiBGcmVlZG9tICgxJGRmJCk6IDIkbiAtIDEgPSBcbWF0aGJmezl9JA0KDQotIFRlc3QgVHlwZTogVHdvLXRhaWxlZCAodHdvLXdheSkNCg0KQmFzZWQgb24gdGhlIGNhbGN1bGF0aW9uOnAtdmFsdWUgJFxhcHByb3ggXG1hdGhiZnswLjI4MX0kDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSByZXN1bHRzIHRhYmxlDQp0X3Jlc3VsdHMgPC0gZGF0YS5mcmFtZSgNCiAgYFN0YXRpc3RpY2FsIE1lYXN1cmVgID0gYygNCiAgICAiVGVzdCBTdGF0aXN0aWMgKHQpIiwNCiAgICAiRGVncmVlcyBvZiBGcmVlZG9tIChkZikiLA0KICAgICJQLXZhbHVlICh0d28tdGFpbGVkKSIsDQogICAgIlNpZ25pZmljYW5jZSBMZXZlbCAozrEpIiwNCiAgICAiQ3JpdGljYWwgVmFsdWUgKMKxdCopIiwNCiAgICAiOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwiLA0KICAgICJTdGF0aXN0aWNhbCBEZWNpc2lvbiIsDQogICAgIlByYWN0aWNhbCBDb25jbHVzaW9uIg0KICApLA0KICBWYWx1ZSA9IGMoDQogICAgIi0xLjE0NyIsDQogICAgIjkiLA0KICAgICIwLjI4MSIsDQogICAgIjAuMDUiLA0KICAgICLCsTIuMjYyIiwNCiAgICAiWy0xLjM1LCAzLjM1XSBtaW51dGVzKiIsDQogICAgIkZhaWwgdG8gcmVqZWN0IEjigoAiLA0KICAgICJJbnN1ZmZpY2llbnQgZXZpZGVuY2UgYWdhaW5zdCBjbGFpbSINCiAgKSwNCiAgSW50ZXJwcmV0YXRpb24gPSBjKA0KICAgICJTdGFuZGFyZGl6ZWQgZGlmZmVyZW5jZSBmcm9tIM684oKAIiwNCiAgICAibiAtIDEgPSAxMCAtIDEiLA0KICAgICJQcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgc3VjaCBleHRyZW1lIHJlc3VsdHMgaWYgSOKCgCBpcyB0cnVlIiwNCiAgICAiTWF4aW11bSBhY2NlcHRhYmxlIFR5cGUgSSBlcnJvciByYXRlIiwNCiAgICAiQm91bmRhcnkgb2YgcmVqZWN0aW9uIHJlZ2lvbiIsDQogICAgIlBsYXVzaWJsZSByYW5nZSBmb3IgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4iLA0KICAgICJwLXZhbHVlID4gzrEg4oaSIFJldGFpbiBudWxsIGh5cG90aGVzaXMiLA0KICAgICJEYXRhIGNvbnNpc3RlbnQgd2l0aCAxMC1taW51dGUgYXZlcmFnZSINCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKHRfcmVzdWx0cywgDQogICAgICBhbGlnbiA9IGMoImwiLCAiciIsICJsIiksDQogICAgICBjYXB0aW9uID0gIk9uZS1TYW1wbGUgdC1UZXN0OiBSZXN1bHRzIFN1bW1hcnkiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxMw0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNmNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjRjbSIsIGNvbG9yID0gIiMxOTc2RDIiKSAlPiUNCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiMTBjbSIpICU+JQ0KICByb3dfc3BlYyg3LCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiMzODhFM0MiKSAlPiUgICMgR3JlZW4gZm9yICJmYWlsIHRvIHJlamVjdCINCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjRkZGM0NEIikgJT4lICAjIEhpZ2hsaWdodCBwLXZhbHVlDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiKkV4YW1wbGUgY29uZmlkZW5jZSBpbnRlcnZhbDsgYWN0dWFsIGRlcGVuZHMgb24gc2FtcGxlIG1lYW4gYW5kIFNEIiwNCiAgICAgICAgICAgbnVtYmVyID0gYygiSOKCgDogzrwgPSAxMCBtaW51dGVzIiwgIlNhbXBsZSBzaXplOiBuID0gMTAiLCAiVGVzdDogVHdvLXRhaWxlZCB0LXRlc3QiKSkNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyAxLiBJbnN0YWxsL0xvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KIyBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMi4gRGVmaW5lIHRoZSByZXN1bHRzIGZyb20geW91ciBjYXNlIHN0dWR5DQp0X3N0YXQgPC0gLTEuMTQ3DQpkZiA8LSA5DQphbHBoYSA8LSAwLjA1DQp0X2NyaXQgPC0gcXQoMSAtIGFscGhhLzIsIGRmKSAjIENyaXRpY2FsIHZhbHVlIGZvciB0d28tdGFpbGVkIHRlc3QNCg0KIyAzLiBDcmVhdGUgdGhlIGRpc3RyaWJ1dGlvbiBjdXJ2ZSBkYXRhDQp4X3NlcSA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeV9zZXEgPC0gZHQoeF9zZXEsIGRmKQ0KZGZfcGxvdCA8LSBkYXRhLmZyYW1lKHggPSB4X3NlcSwgeSA9IHlfc2VxKQ0KDQojIDQuIEJ1aWxkIHRoZSBJbnRlcmFjdGl2ZSBQbG90DQpmaWcgPC0gcGxvdF9seShkZl9wbG90LCB4ID0gfngsIHkgPSB+eSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgICAgbmFtZSA9ICd0LURpc3RyaWJ1dGlvbiAoZGY9OSknLCBsaW5lID0gbGlzdChjb2xvciA9ICdibGFjaycpKSAlPiUNCiAgDQogICMgSGlnaGxpZ2h0IExlZnQgUmVqZWN0aW9uIFJlZ2lvbg0KICBhZGRfcG9seWdvbnMoeCA9IGMoeF9zZXFbeF9zZXEgPD0gLXRfY3JpdF0sIC10X2NyaXQpLCANCiAgICAgICAgICAgICAgIHkgPSBjKHlfc2VxW3hfc2VxIDw9IC10X2NyaXRdLCAwKSwgDQogICAgICAgICAgICAgICBmaWxsY29sb3IgPSAncmdiYSgyNTUsIDAsIDAsIDAuNCknLCBsaW5lID0gbGlzdChjb2xvciA9ICd0cmFuc3BhcmVudCcpLA0KICAgICAgICAgICAgICAgbmFtZSA9ICdSZWplY3Rpb24gUmVnaW9uIChBbHBoYS8yKScpICU+JQ0KICANCiAgIyBIaWdobGlnaHQgUmlnaHQgUmVqZWN0aW9uIFJlZ2lvbg0KICBhZGRfcG9seWdvbnMoeCA9IGModF9jcml0LCB4X3NlcVt4X3NlcSA+PSB0X2NyaXRdKSwgDQogICAgICAgICAgICAgICB5ID0gYygwLCB5X3NlcVt4X3NlcSA+PSB0X2NyaXRdKSwgDQogICAgICAgICAgICAgICBmaWxsY29sb3IgPSAncmdiYSgyNTUsIDAsIDAsIDAuNCknLCBsaW5lID0gbGlzdChjb2xvciA9ICd0cmFuc3BhcmVudCcpLA0KICAgICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSAlPiUNCiAgDQogICMgQWRkIE9ic2VydmVkIHQtc3RhdGlzdGljIExpbmUNCiAgYWRkX3NlZ21lbnRzKHggPSB0X3N0YXQsIHhlbmQgPSB0X3N0YXQsIHkgPSAwLCB5ZW5kID0gZHQodF9zdGF0LCBkZikgKyAwLjA1LA0KICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIHdpZHRoID0gNCwgZGFzaCA9ICdkYXNoJyksDQogICAgICAgICAgICAgICBuYW1lID0gcGFzdGUoJ09ic2VydmVkIHQtc3RhdDonLCB0X3N0YXQpKSAlPiUNCiAgDQogICMgRm9ybWF0dGluZyBMYXlvdXQNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gbGlzdCh0ZXh0ID0gIjxiPk9uZS1TYW1wbGUgVC1UZXN0IFZpc3VhbGl6YXRpb248L2I+PGJyPjxzdXA+VVggVGFzayBDb21wbGV0aW9uIFRpbWUgKEgwOiBtdSA9IDEwKTwvc3VwPiIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJ0LXZhbHVlIiwgcmFuZ2UgPSBjKC00LCA0KSksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRlbnNpdHkiLCBzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KHggPSB0X3N0YXQsIHkgPSBkdCh0X3N0YXQsIGRmKSArIDAuMDcsIHRleHQgPSAiWW91ciBEYXRhIiwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3QoY29sb3IgPSAiYmx1ZSIpKSwNCiAgICAgIGxpc3QoeCA9IC10X2NyaXQgLSAwLjUsIHkgPSAwLjAyLCB0ZXh0ID0gIkNyaXRpY2FsIFZhbHVlIiwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3QoY29sb3IgPSAicmVkIikpDQogICAgKSwNCiAgICBsZWdlbmQgPSBsaXN0KG9yaWVudGF0aW9uID0gJ2gnLCB5ID0gLTAuMikNCiAgKQ0KDQojIERpc3BsYXkgdGhlIHBsb3QNCmZpZw0KYGBgDQoNCioqVmlzdWFsIEFuYWx5c2lzIG9mIHRoZSBQbG90KioNCg0KLSAqKlRoZSBDdXJ2ZSoqOlJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIHBvc3NpYmxlIG91dGNvbWVzIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKCRIXzAkKSB3ZXJlIHRydWUuDQoNCi0gKipUaGUgUmVkIEFyZWFzKio6IFRoZXNlIGFyZSB0aGUgIkRhbmdlciBab25lcyIgKFJlamVjdGlvbiBSZWdpb25zKS4gSWYgeW91ciBibHVlIGxpbmUgZmFsbHMgaGVyZSwgdGhlIHJlc3VsdCBpcyBzaWduaWZpY2FudC4NCg0KLSAqKlRoZSBCbHVlIERhc2hlZCBMaW5lKio6IFRoaXMgcmVwcmVzZW50cyB5b3VyIGFjdHVhbCByZXNlYXJjaCByZXN1bHQgKCR0ID0gLTEuMTQ3JCkuVGhlIFZlcmRpY3Q6IEJlY2F1c2UgdGhlIEJsdWUgTGluZSBpcyBpbiB0aGUgd2hpdGUgYXJlYSAodGhlICJGYWlsIHRvIFJlamVjdCIgem9uZSkgYW5kIG5vdCBpbiB0aGUgcmVkIGFyZWFzLCB3ZSBjb25jbHVkZSB0aGF0IHRoZSB0YXNrIGNvbXBsZXRpb24gdGltZSBpcyAqKm5vdCBzaWduaWZpY2FudGx5IGRpZmZlcmVudCoqIGZyb20gMTAgbWludXRlcy4NCg0KDQo0LiBNYWtlIGEgKipzdGF0aXN0aWNhbCBkZWNpc2lvbioqLg0KDQoNCioqRGVjaXNpb24gQ3JpdGVyaWEqKg0KDQpUaGVyZSBhcmUgdHdvIHdheXMgdG8gc3RhdGUgdGhlIGRlY2lzaW9uLCBib3RoIGxlYWRpbmcgdG8gdGhlIHNhbWUgcmVzdWx0Og0KDQoqKlAtdmFsdWUgQXBwcm9hY2g6IElmICRwXHRleHR7LXZhbHVlfSBcbGVxIFxhbHBoYSQsIHJlamVjdCAkSF8wJC4qKg0KDQotIE91ciAkcFx0ZXh0ey12YWx1ZX0gPSAwLjI4MSQNCg0KLSAkMC4yODEgPiAwLjA1JA0KDQoqKkNyaXRpY2FsIFZhbHVlIEFwcHJvYWNoOiBJZiAkfHRfe29ic318ID4gdF97Y3JpdH0kLCByZWplY3QgKioNCg0KLSAkSF8wJC4kfHstMS4xNDd9fCA9IDEuMTQ3JA0KDQotICR0X3tjcml0fSQgKGZvciAkZGY9OSwgXGFscGhhPTAuMDUkKSAkPSAyLjI2MiQNCg0KLSAkMS4xNDcgPCAyLjI2MiQNCg0KKipUaGUgU3RhdGlzdGljYWwgRGVjaXNpb24qKg0KDQoqKkJhc2VkIG9uIHRoZSBldmlkZW5jZToqKg0KDQoqKkZhaWwgdG8gUmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgKCRIXzAkKSoqDQoNCioqQ29uY2x1c2lvbiBpbiBDb250ZXh0KioNCg0KU2luY2Ugd2UgZmFpbGVkIHRvIHJlamVjdCAkSF8wJCwgdGhlIFVYIFJlc2VhcmNoIFRlYW0gY29uY2x1ZGVzIHRoYXQgdGhlcmUgaXMgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBldmlkZW5jZSB0byBzdWdnZXN0IHRoYXQgdGhlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgZGlmZmVycyBmcm9tIDEwIG1pbnV0ZXMuDQoNClRoZSBvYnNlcnZlZCBtZWFuIG9mICQ5Ljg2JCBtaW51dGVzIGlzIG51bWVyaWNhbGx5IGxvd2VyIHRoYW4gdGhlIHRhcmdldCwgYnV0IHRoZSBkaWZmZXJlbmNlIGlzIHNtYWxsIGVub3VnaCB0aGF0IGl0IGNvdWxkIHNpbXBseSBiZSBkdWUgdG8gcmFuZG9tIHNhbXBsaW5nIHZhcmlhdGlvbiByYXRoZXIgdGhhbiBhIHRydWUgY2hhbmdlIGluIHRoZSBhcHBsaWNhdGlvbidzIHBlcmZvcm1hbmNlLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFyYW1ldGVycw0KdF9zdGF0IDwtIC0xLjE0Nw0KdF9jcml0IDwtIDIuMjYyDQpkZiA8LSA5DQoNCiMgQ3JlYXRlIEN1cnZlDQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoLm91dCA9IDEwMDApDQp5IDwtIGR0KHgsIGRmKQ0KDQpwbG90X2x5KHggPSB4LCB5ID0geSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIG5hbWUgPSAndC1kaXN0JykgJT4lDQogIGFkZF9wb2x5Z29ucyh4ID0gYyh4W3g8PS10X2NyaXRdLCAtdF9jcml0KSwgeSA9IGMoeVt4PD0tdF9jcml0XSwgMCksIGZpbGxjb2xvcj0ncmVkJywgb3BhY2l0eT0wLjMsIG5hbWU9J1JlamVjdGlvbiBSZWdpb24nKSAlPiUNCiAgYWRkX3BvbHlnb25zKHggPSBjKHRfY3JpdCwgeFt4Pj10X2NyaXRdKSwgeSA9IGMoMCwgeVt4Pj10X2NyaXRdKSwgZmlsbGNvbG9yPSdyZWQnLCBvcGFjaXR5PTAuMywgc2hvd2xlZ2VuZD1GKSAlPiUNCiAgYWRkX3NlZ21lbnRzKHggPSB0X3N0YXQsIHhlbmQgPSB0X3N0YXQsIHkgPSAwLCB5ZW5kID0gZHQodF9zdGF0LCBkZiksIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsdWUnLCBkYXNoID0gJ2Rhc2gnKSwgbmFtZSA9ICdZb3VyIFJlc3VsdCcpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAiRGVjaXNpb246IEZhaWwgdG8gUmVqZWN0IEgwIiwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJ0LXZhbHVlIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGVuc2l0eSIpKQ0KYGBgDQoNCg0KNS4gRXhwbGFpbiBob3cgKipzYW1wbGUgc2l6ZSoqIGFmZmVjdHMgaW5mZXJlbnRpYWwgcmVsaWFiaWxpdHkuDQoNCkluIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSBPbmUtU2FtcGxlIHQtVGVzdCwgdGhlIHNhbXBsZSBzaXplICgkbiQpIGlzIGEgY3JpdGljYWwgbGV2ZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSByZWxpYWJpbGl0eSBhbmQgc2Vuc2l0aXZpdHkgb2YgeW91ciBmaW5kaW5ncy4ySGVyZSBpcyBob3cgdGhlIHNhbXBsZSBzaXplIG9mIDEwIHVzZXJzIGFmZmVjdHMgdGhlIHJlbGlhYmlsaXR5IG9mIHlvdXIgVVggcmVzZWFyY2g6DQoNCioqSW5mbHVlbmNlIG9uIHRoZSBTdGFuZGFyZCBFcnJvcioqDQoNClRoZSByZWxpYWJpbGl0eSBvZiBhbiBpbmZlcmVuY2UgZGVwZW5kcyBvbiB0aGUgU3RhbmRhcmQgRXJyb3IgKCRTRSQpLCB3aGljaCBtZWFzdXJlcyBob3cgbXVjaCB0aGUgc2FtcGxlIG1lYW4gaXMgZXhwZWN0ZWQgdG8gdmFyeSBmcm9tIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbi4NCg0KJCRTRSA9IFxmcmFje3N9e1xzcXJ0e259fSQkDQoNCi0gU21hbGwgU2FtcGxlICgkbj0xMCQpOiBTaW5jZSB5b3UgYXJlIGRpdmlkaW5nIGJ5IGEgc21hbGxlciBudW1iZXIgKCRcc3FydHsxMH0kKSwgdGhlICRTRSQgcmVtYWlucyByZWxhdGl2ZWx5IGxhcmdlLiBUaGlzIGNyZWF0ZXMgIm5vaXNlLCIgbWFraW5nIGl0IGhhcmRlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgcmVhbCBpbXByb3ZlbWVudCBpbiB0aGUgYXBwIGFuZCByYW5kb20gY2hhbmNlLg0KDQotIExhcmdlIFNhbXBsZTogQXMgNSRuJCBpbmNyZWFzZXMsIHRoZSAkU0UkIGRlY3JlYXNlcywgbWVhbmluZyB5b3VyIHNhbXBsZSBtZWFuIGJlY29tZXMgYSBtdWNoIG1vcmUgcHJlY2lzZSBlc3RpbWF0ZSBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIGJlaGF2aW9yLg0KDQoqKlRoZSBTaGFwZSBvZiB0aGUgdC1EaXN0cmlidXRpb24qKg0KDQpCZWNhdXNlIHlvdXIgc2FtcGxlIHNpemUgaXMgc21hbGwgKCRuIDwgMzAkKSwgd2UgbXVzdCB1c2UgdGhlIHQtZGlzdHJpYnV0aW9uIHJhdGhlciB0aGFuIHRoZSBaLWRpc3RyaWJ1dGlvbiAobm9ybWFsIGRpc3RyaWJ1dGlvbikuDQoNCi0gKipEZWdyZWVzIG9mIEZyZWVkb20gKCRkZiQpKio6IFdpdGggb25seSA5IGRlZ3JlZXMgb2YgZnJlZWRvbSAoOCRuIC0gMSQpLCB0aGUgdC1kaXN0cmlidXRpb24gaGFzICJoZWF2aWVyIHRhaWxzIg0KDQotICoqUmVsaWFiaWxpdHkgSW1wYWN0Kio6IEhlYXZpZXIgdGFpbHMgbWVhbiB0aGF0IGV4dHJlbWUgdmFsdWVzIGFyZSBtb3JlIGxpa2VseSB0byBvY2N1ciBieSBjaGFuY2UuMTAgVG8gY29tcGVuc2F0ZSBmb3IgdGhpcyB1bmNlcnRhaW50eSwgdGhlIENyaXRpY2FsIFZhbHVlIGJlY29tZXMgaGlnaGVyIChpbiB5b3VyIGNhc2UsICRccG0gMi4yNjIkKS4gVGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8gInJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIiB1bmxlc3MgdGhlIGVmZmVjdCBpcyB2ZXJ5IGxhcmdlLg0KDQoqKlN0YXRpc3RpY2FsIFBvd2VyIGFuZCBUeXBlIElJIEVycm9ycyoqDQoNClRoZSBtb3N0IHNpZ25pZmljYW50IGltcGFjdCBvbiByZWxpYWJpbGl0eSBoZXJlIGlzIFN0YXRpc3RpY2FsIFBvd2VyLg0KDQotICoqVGhlIFJpc2sqKjogV2l0aCBvbmx5IDEwIHVzZXJzLCB0aGUgdGVzdCBoYXMgbG93IHBvd2VyLjExIFRoaXMgbWVhbnMgdGhlcmUgaXMgYSBoaWdoIHJpc2sgb2YgYSBUeXBlIElJIEVycm9yIChmYWlsaW5nIHRvIGRldGVjdCBhIHJlYWwgZGlmZmVyZW5jZSB3aGVuIG9uZSBhY3R1YWxseSBleGlzdHMpLg0KDQotICoqVVggQ29udGV4dCoqOiBJZiB5b3VyIG5ldyBhcHAgYWN0dWFsbHkgcmVkdWNlZCBjb21wbGV0aW9uIHRpbWUgdG8gOS41IG1pbnV0ZXMsIGEgc2FtcGxlIG9mIDEwIG1pZ2h0IG5vdCBiZSBlbm91Z2ggdG8gcHJvdmUgaXQgc3RhdGlzdGljYWxseS4gWW91IG1pZ2h0IHdyb25nbHkgY29uY2x1ZGUgdGhlIGFwcCBpcyAibm8gZGlmZmVyZW50IiBmcm9tIHRoZSBvbGQgdmVyc2lvbiBzaW1wbHkgYmVjYXVzZSB0aGUgc2FtcGxlIHdhcyB0b28gc21hbGwgdG8gcHJvdmlkZSAiYmV5b25kIGEgcmVhc29uYWJsZSBkb3VidCIgZXZpZGVuY2UuDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIEluc3RhbGwgaWYgbmVlZGVkOiBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgQ3JlYXRlIGNvbXBhcmlzb24gdGFibGUNCnNpemVfY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBBc3BlY3QgPSBjKA0KICAgICJFc3RpbWF0aW9uIFByZWNpc2lvbiIsDQogICAgIlNhbXBsaW5nIERpc3RyaWJ1dGlvbiIsIA0KICAgICJFZmZlY3QgRGV0ZWN0aW9uIiwNCiAgICAiT3V0bGllciBJbXBhY3QiLA0KICAgICJTdGF0aXN0aWNhbCBUZXN0IiwNCiAgICAiQ29uZmlkZW5jZSBJbnRlcnZhbHMiLA0KICAgICJUeXBlIElJIEVycm9yIFJpc2siLA0KICAgICJDb3N0ICYgRmVhc2liaWxpdHkiDQogICksDQogIGBTbWFsbCBTYW1wbGUgKG49MTApYCA9IGMoDQogICAgIkxvdyAtIEhpZ2ggdW5jZXJ0YWludHkiLA0KICAgICJ0LWRpc3RyaWJ1dGlvbiAoZGY9OSkiLA0KICAgICJPbmx5IGxhcmdlIGVmZmVjdHMgZGV0ZWN0YWJsZSIsDQogICAgIlNpZ25pZmljYW50IGRpc3RvcnRpb24gcG9zc2libGUiLA0KICAgICJ0LXRlc3QgbWFuZGF0b3J5IiwNCiAgICAiV2lkZSAoZS5nLiwgwrEzLjUgdW5pdHMpIiwNCiAgICAiSGlnaCAoUG9vciBwb3dlcikiLA0KICAgICJMb3cgY29zdCwgcXVpY2siDQogICksDQogIGBMYXJnZSBTYW1wbGUgKG4+MzApYCA9IGMoDQogICAgIkhpZ2ggLSBMb3cgdW5jZXJ0YWludHkiLA0KICAgICJBcHByb2FjaGVzIG5vcm1hbCAoeikiLA0KICAgICJTbWFsbCBlZmZlY3RzIGRldGVjdGFibGUiLA0KICAgICJNaW5pbWFsIGltcGFjdCIsDQogICAgInotdGVzdCBvZnRlbiBhY2NlcHRhYmxlIiwNCiAgICAiTmFycm93IChlLmcuLCDCsTEuMCB1bml0cykiLA0KICAgICJMb3cgKEdvb2QgcG93ZXIpIiwNCiAgICAiSGlnaCBjb3N0LCB0aW1lLWNvbnN1bWluZyINCiAgKSwNCiAgSW1wbGljYXRpb24gPSBjKA0KICAgICJJbnRlcnByZXQgd2l0aCBjYXV0aW9uIiwNCiAgICAiRGlmZmVyZW50IGNyaXRpY2FsIHZhbHVlcyIsDQogICAgIlByYWN0aWNhbCB2cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UiLA0KICAgICJDaGVjayByb2J1c3RuZXNzIiwNCiAgICAiVGVzdCBzZWxlY3Rpb24gbWF0dGVycyIsDQogICAgIlByZWNpc2lvbiBvZiBlc3RpbWF0ZXMiLA0KICAgICJGYWxzZSBuZWdhdGl2ZSByaXNrIiwNCiAgICAiU3R1ZHkgZGVzaWduIHRyYWRlLW9mZiINCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgY29tcGFyaXNvbiB0YWJsZQ0Ka2FibGUoc2l6ZV9jb21wYXJpc29uLCANCiAgICAgIGFsaWduID0gYygibCIsICJsIiwgImwiLCAibCIpLA0KICAgICAgY2FwdGlvbiA9ICJTdGF0aXN0aWNhbCBJbXBsaWNhdGlvbnMgb2YgU2FtcGxlIFNpemUiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxMywNCiAgICBmaXhlZF90aGVhZCA9IFRSVUUNCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjVjbSIsIGJhY2tncm91bmQgPSAiI2Y4ZjlmYSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICI2Y20iLCBiYWNrZ3JvdW5kID0gIiNGRkYzQ0QiKSAlPiUgICMgWWVsbG93IGZvciBzbWFsbCBzYW1wbGUNCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiNmNtIiwgYmFja2dyb3VuZCA9ICIjRDRFRERBIikgJT4lICAjIEdyZWVuIGZvciBsYXJnZSBzYW1wbGUNCiAgY29sdW1uX3NwZWMoNCwgd2lkdGggPSAiNWNtIikgJT4lDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiU21hbGwgU2FtcGxlIENoYXJhY3RlcmlzdGljcyIgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICJMYXJnZSBTYW1wbGUgQWR2YW50YWdlcyIgPSAxLCAiS2V5IENvbnNpZGVyYXRpb24iID0gMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIk5vdGU6IFRoZSAnbiA+IDMwJyBydWxlIGlzIGEgZ3VpZGVsaW5lOyBpbiBwcmFjdGljZSwgc2FtcGxlIHNpemUgcmVxdWlyZW1lbnRzIGRlcGVuZCBvbiBlZmZlY3Qgc2l6ZSwgdmFyaWFiaWxpdHksIGFuZCBkZXNpcmVkIHBvd2VyLiIpDQpgYGANCg0KYGBge3IsZWNobz1GQUxTRX0NCmxpYnJhcnkocGxvdGx5KQ0KDQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoLm91dCA9IDEwMDApDQojIGRmPTkgKHlvdXIgc3R1ZHkpIHZzIGRmPTUwIChsYXJnZXIgc3R1ZHkpDQp5MSA8LSBkdCh4LCA5KQ0KeTIgPC0gZHQoeCwgNTApDQoNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKHggPSB4LCB5ID0geTEsIG5hbWUgPSAibj0xMCAoQ3VycmVudCkiLCBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnKSkgJT4lDQogIGFkZF9saW5lcyh4ID0geCwgeSA9IHkyLCBuYW1lID0gIm49NTEgKE1vcmUgUmVsaWFibGUpIiwgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nKSkgJT4lDQogIGxheW91dCh0aXRsZSA9ICJFZmZlY3Qgb2YgU2FtcGxlIFNpemUgb24gRGlzdHJpYnV0aW9uIFNoYXBlIiwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJ0LXZhbHVlIiksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGVuc2l0eSIpKQ0KYGBgDQoNCg0KIyBDYXNlIFN0dWR5IDMgDQoNCiMjIFR3by1TYW1wbGUgVC1UZXN0IChBL0IgVGVzdGluZykNCg0KQSAqKnByb2R1Y3QgYW5hbHl0aWNzIHRlYW0qKiBjb25kdWN0cyBhbiAqKkEvQiB0ZXN0KiogdG8gY29tcGFyZSB0aGUgKiphdmVyYWdlIHNlc3Npb24gZHVyYXRpb24gKG1pbnV0ZXMpKiogYmV0d2VlbiB0d28gdmVyc2lvbnMgb2YgYSBsYW5kaW5nIHBhZ2UuDQoNCnwgVmVyc2lvbiB8IFNhbXBsZSBTaXplIChuKSB8IE1lYW4gfCBTdGFuZGFyZCBEZXZpYXRpb24gfA0KfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgQSB8IDI1IHwgNC44IHwgMS4yIHwNCnwgQiB8IDI1IHwgNS40IHwgMS40IHwNCg0KIyMgVGFza3MNCg0KMS4gRm9ybXVsYXRlIHRoZSAqKm51bGwgYW5kIGFsdGVybmF0aXZlIGh5cG90aGVzZXMqKi4NCjIuIElkZW50aWZ5IHRoZSAqKnR5cGUgb2YgdC10ZXN0KiogcmVxdWlyZWQuDQozLiBDb21wdXRlIHRoZSAqKnRlc3Qgc3RhdGlzdGljKiogYW5kICoqcC12YWx1ZSoqLg0KNC4gRHJhdyBhICoqc3RhdGlzdGljYWwgY29uY2x1c2lvbioqIGF0ICRcYWxwaGEgPSAwLjA1JC4NCjUuIEludGVycHJldCB0aGUgcmVzdWx0IGZvciAqKnByb2R1Y3QgZGVjaXNpb24tbWFraW5nKiouDQoNCg0KIyMgIEFuc3dlciBDYXNlIFN0dWR5IDMNCg0KMS4gRm9ybXVsYXRlIHRoZSAqKm51bGwgYW5kIGFsdGVybmF0aXZlIGh5cG90aGVzZXMqKi4NCg0KKipGb3JtdWxhdGluZyB0aGUgSHlwb3RoZXNlcyoqDQoNCi0gVG8gcGVyZm9ybSBhIHR3by1zYW1wbGUgdC10ZXN0LCB3ZSBmaXJzdCBkZWZpbmUgd2hhdCB3ZSBhcmUgdGVzdGluZyBmb3IuIFdlIHVzZSAkXG11X0EkIHRvIHJlcHJlc2VudCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gb2YgVmVyc2lvbiBBIGFuZCAkXG11X0IkIGZvciBWZXJzaW9uIEIuDQoNCi0gTnVsbCBIeXBvdGhlc2lzICgkSF8wJClUaGUgbnVsbCBoeXBvdGhlc2lzIGFzc3VtZXMgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gbGFuZGluZyBwYWdlIHZlcnNpb25zLiBBbnkgb2JzZXJ2ZWQgZGlmZmVyZW5jZSBpbiB0aGUgc2FtcGxlIG1lYW5zIGlzIGR1ZSB0byByYW5kb20gY2hhbmNlLg0KDQotICRIXzA6IFxtdV9BID0gXG11X0IkIChvciAkXG11X0EgLSBcbXVfQiA9IDAkKQ0KDQotIEFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIX2EkKQ0KDQpUaGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBzdWdnZXN0cyB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMuIFNpbmNlIHRoZSB0YXNrIGRvZXNuJ3Qgc3BlY2lmeSBhIGRpcmVjdGlvbiAoZS5nLiwgIkIgaXMgYmV0dGVyIHRoYW4gQSIpLCB3ZSB0eXBpY2FsbHkgdXNlIGEgdHdvLXRhaWxlZCB0ZXN0Lg0KDQotICRIX2E6IFxtdV9BIFxuZXEgXG11X0IkIChvciAkXG11X0EgLSBcbXVfQiBcbmVxIDAkKQ0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBjb21wYXJpc29uIHRhYmxlIHdpdGggc3R5bGluZw0KdmVyc2lvbl9jb21wYXJpc29uIDwtIGRhdGEuZnJhbWUoDQogIFBhcmFtZXRlciA9IGMoDQogICAgIlNhbXBsZSBNZWFuICh4zIQpIiwNCiAgICAiU3RhbmRhcmQgRGV2aWF0aW9uIChzKSIsDQogICAgIlNhbXBsZSBTaXplIChuKSIsDQogICAgIlN0YW5kYXJkIEVycm9yIiwNCiAgICAiVmFyaWFuY2UgKHPCsikiLA0KICAgICJNaW5pbXVtIiwNCiAgICAiTWF4aW11bSIsDQogICAgIlJhbmdlIg0KICApLA0KICBgVmVyc2lvbiBBYCA9IGMoIjQuOCIsICIxLjIiLCAiMjUiLCAiMC4yNDAiLCAiMS40NCIsICJ+Mi40IiwgIn43LjIiLCAifjQuOCIpLA0KICBgVmVyc2lvbiBCYCA9IGMoIjUuNCIsICIxLjQiLCAiMjUiLCAiMC4yODAiLCAiMS45NiIsICJ+Mi42IiwgIn44LjIiLCAifjUuNiIpLA0KICBEaWZmZXJlbmNlID0gYygiKzAuNiIsICIrMC4yIiwgIjAiLCAiKzAuMDQwIiwgIiswLjUyIiwgIiswLjIiLCAiKzEuMCIsICIrMC44IiksDQogIGAlIENoYW5nZWAgPSBjKCIrMTIuNSUiLCAiKzE2LjclIiwgIjAlIiwgIisxNi43JSIsICIrMzYuMSUiLCAiKzguMyUiLCAiKzEzLjklIiwgIisxNi43JSIpLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUodmVyc2lvbl9jb21wYXJpc29uLCANCiAgICAgIGFsaWduID0gYygibCIsICJyIiwgInIiLCAiciIsICJyIiksDQogICAgICBjYXB0aW9uID0gIkEvQiBUZXN0aW5nOiBWZXJzaW9uIENvbXBhcmlzb24gU3RhdGlzdGljcyIsDQogICAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDEzDQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiM2NtIiwgYmFja2dyb3VuZCA9ICIjRTNGMkZEIikgJT4lICAjIEJsdWUgZm9yIFZlcnNpb24gQQ0KICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICIzY20iLCBiYWNrZ3JvdW5kID0gIiNGM0U1RjUiKSAlPiUgICMgUHVycGxlIGZvciBWZXJzaW9uIEINCiAgY29sdW1uX3NwZWMoNCwgd2lkdGggPSAiM2NtIiwgYm9sZCA9IFRSVUUpICU+JQ0KICBjb2x1bW5fc3BlYyg1LCB3aWR0aCA9ICIzY20iKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJDb250cm9sIEdyb3VwIiA9IDEsICJUZXN0IEdyb3VwIiA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgIkFic29sdXRlIM6UIiA9IDEsICJSZWxhdGl2ZSDOlCIgPSAxKSkgJT4lDQogIHJvd19zcGVjKDEsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICIjMEQ0N0ExIikgJT4lICAjIEhpZ2hsaWdodCBtZWFuDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiKk1pbmltdW0sIE1heGltdW0sIGFuZCBSYW5nZSBhcmUgZXN0aW1hdGVzIGJhc2VkIG9uIG5vcm1hbCBkaXN0cmlidXRpb24gYXBwcm94aW1hdGlvbiAowrEyU0QgZnJvbSBtZWFuKSIsDQogICAgICAgICAgIG51bWJlciA9IGMoIm4gPSAyNSBmb3IgYm90aCBncm91cHMiLCAiRGF0YSBzdWdnZXN0cyBWZXJzaW9uIEIgaGFzIGhpZ2hlciBtZWFuIGJ1dCBhbHNvIGhpZ2hlciB2YXJpYWJpbGl0eSIpKQ0KYGBgDQoNCioqTmV4dCBTdGVwcyBpbiB0aGUgQW5hbHlzaXMqKg0KDQpUbyBjb21wbGV0ZSB0aGlzIEEvQiB0ZXN0LCB0aGUgdHlwaWNhbCBuZXh0IHN0ZXBzIHdvdWxkIGludm9sdmU6DQoNCi0gQ2FsY3VsYXRpbmcgdGhlIFBvb2xlZCBTdGFuZGFyZCBEZXZpYXRpb24gKHNpbmNlIHNhbXBsZSBzaXplcyBhcmUgZXF1YWwpLg0KDQotIENvbXB1dGluZyB0aGUgVC1zdGF0aXN0aWMgdXNpbmcgdGhlIGZvcm11bGE6JCR0ID0gXGZyYWN7XGJhcnt4fV8xIC0gXGJhcnt4fV8yfXtcc3FydHtcZnJhY3tzXzFeMn17bl8xfSArIFxmcmFje3NfMl4yfXtuXzJ9fX0kJA0KDQotIERldGVybWluaW5nIHRoZSBwLXZhbHVlIGJhc2VkIG9uIGRlZ3JlZXMgb2YgZnJlZWRvbSAoJGRmID0gbl8xICsgbl8yIC0gMiQpLg0KDQoNCjIuIElkZW50aWZ5IHRoZSAqKnR5cGUgb2YgdC10ZXN0KiogcmVxdWlyZWQNCg0KKipUeXBlIG9mIFQtVGVzdDogSW5kZXBlbmRlbnQgVHdvLVNhbXBsZSBULVRlc3QqKg0KDQpGb3IgdGhpcyBBL0IgdGVzdCwgeW91IHNob3VsZCB1c2UgYW4gSW5kZXBlbmRlbnQgVHdvLVNhbXBsZSBULVRlc3QgKGFsc28ga25vd24gYXMgYW4gVW5wYWlyZWQgVC1UZXN0KS4NCg0KVGhpcyBpcyB0aGUgY29ycmVjdCBjaG9pY2UgYmVjYXVzZToNCg0KLSBJbmRlcGVuZGVudCBHcm91cHM6IFRoZSBwYXJ0aWNpcGFudHMgaW4gVmVyc2lvbiBBIGFyZSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgZnJvbSB0aG9zZSBpbiBWZXJzaW9uIEIuIFRoZSBzZXNzaW9uIGR1cmF0aW9uIG9mIG9uZSB1c2VyIGRvZXMgbm90IGluZmx1ZW5jZSBvciByZWxhdGUgdG8gdGhlIHNlc3Npb24gZHVyYXRpb24gb2YgYW5vdGhlci4NCg0KLSBDb21wYXJpc29uIG9mIE1lYW5zOiBUaGUgZ29hbCBpcyB0byBjb21wYXJlIHRoZSBhdmVyYWdlIChtZWFuKSBvZiBhIGNvbnRpbnVvdXMgdmFyaWFibGUgKHNlc3Npb24gZHVyYXRpb24pIGJldHdlZW4gdHdvIGRpc3RpbmN0IGNhdGVnb3JpZXMgKFZlcnNpb24gQSB2cy4gVmVyc2lvbiBCKS4NCg0KLSBTYW1wbGUgU2l6ZTogV2l0aCA0JG4gPSAyNSQgZm9yIGVhY2ggZ3JvdXAsIHRoZSBzYW1wbGUgc2l6ZSBpcyByZWxhdGl2ZWx5IHNtYWxsICh0eXBpY2FsbHkgNSRuIDwgMzAkIGlzIHRoZSB0aHJlc2hvbGQgd2hlcmUgVC10ZXN0cyBhcmUgcHJpb3JpdGl6ZWQgb3ZlciBaLXRlc3RzKSwgbWFraW5nIHRoZSBULWRpc3RyaWJ1dGlvbiBhcHByb3ByaWF0ZS4NCg0KKipTdWItdHlwZSBTZWxlY3Rpb246IFN0dWRlbnQncyB2cy4gV2VsY2gncyoqDQoNCldpdGhpbiB0aGUgY2F0ZWdvcnkgb2YgaW5kZXBlbmRlbnQgVC10ZXN0cywgdGhlcmUgYXJlIHR3byBjb21tb24gdmFyaWF0aW9ucyBiYXNlZCBvbiB0aGUgdmFyaWFuY2UgKFN0YW5kYXJkIERldmlhdGlvbiBzcXVhcmVkKSBvZiB0aGUgc2FtcGxlczoNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBDcmVhdGUgc3R5bGVkIGNvbXBhcmlzb24gdGFibGUNCnRlc3Rfc2VsZWN0aW9uIDwtIGRhdGEuZnJhbWUoDQogIGBUZXN0IFR5cGVgID0gYygNCiAgICAiUG9vbGVkIChTdHVkZW50J3MpIHQtdGVzdCIsDQogICAgIldlbGNoJ3MgKFVuZXF1YWwgVmFyaWFuY2UpIHQtdGVzdCIsDQogICAgIk1hbm4tV2hpdG5leSBVIHRlc3QiDQogICksDQogIGBLZXkgQXNzdW1wdGlvbmAgPSBjKA0KICAgICJFcXVhbCBwb3B1bGF0aW9uIHZhcmlhbmNlcyAoaG9tb3NjZWRhc3RpY2l0eSkiLA0KICAgICJObyBlcXVhbCB2YXJpYW5jZSBhc3N1bXB0aW9uIChoZXRlcm9zY2VkYXN0aWNpdHkgYWxsb3dlZCkiLA0KICAgICJObyBub3JtYWxpdHkgYXNzdW1wdGlvbiAobm9uLXBhcmFtZXRyaWMpIg0KICApLA0KICBgVmFyaWFuY2UgQ2hlY2tgID0gYygNCiAgICAiUmVxdWlyZWQ6IEYtdGVzdCBvciBMZXZlbmUncyB0ZXN0IGZvciBlcXVhbCB2YXJpYW5jZXMiLA0KICAgICJOb3QgcmVxdWlyZWQgLSBhdXRvbWF0aWNhbGx5IGFkanVzdHMgZm9yIHVuZXF1YWwgdmFyaWFuY2VzIiwNCiAgICAiTm90IGFwcGxpY2FibGUgLSB3b3JrcyBvbiByYW5rcywgbm90IHJhdyB2YWx1ZXMiDQogICksDQogIGBPdXIgQ2FzZSBBc3Nlc3NtZW50YCA9IGMoDQogICAgIlNEczogMS4yIHZzIDEuNCAocmF0aW8gPSAxLjE3IDwgMikgLSBMaWtlbHkgYWNjZXB0YWJsZSIsDQogICAgIkRlZmF1bHQgcmVjb21tZW5kYXRpb24gLSBNb3JlIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCIsDQogICAgIkZhbGxiYWNrIGlmIG5vcm1hbGl0eSB2aW9sYXRlZCAobj0yNSBtYXkgbmVlZCBjaGVja2luZykiDQogICksDQogIGBSZWNvbW1lbmRhdGlvbmAgPSBjKA0KICAgICJBY2NlcHRhYmxlIGZvciBwcmVsaW1pbmFyeSBhbmFseXNpcyIsDQogICAgInJlZmVycmVkIGZvciBmaW5hbCByZXN1bHRzIiwNCiAgICAiQ29uc2lkZXIgaWYgZGF0YSBub24tbm9ybWFsIg0KICApLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUodGVzdF9zZWxlY3Rpb24sIA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImwiLCAibCIsICJsIiwgImMiKSwNCiAgICAgIGNhcHRpb24gPSAiU3RhdGlzdGljYWwgVGVzdCBTZWxlY3Rpb246IEEvQiBUZXN0aW5nIE9wdGlvbnMiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxMw0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNWNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjZjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoNCwgd2lkdGggPSAiNmNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDUsIHdpZHRoID0gIjNjbSIpICU+JQ0KICByb3dfc3BlYygyLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiMyRTdEMzIiKSAlPiUgICMgR3JlZW4gZm9yIFdlbGNoJ3MNCiAgcm93X3NwZWMoMSwgYmFja2dyb3VuZCA9ICIjRkZGM0NEIikgJT4lICAjIFllbGxvdyBmb3IgcG9vbGVkDQogIHJvd19zcGVjKDMsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JSAgIyBCbHVlIGZvciBub24tcGFyYW1ldHJpYw0KICBmb290bm90ZShnZW5lcmFsID0gIlJ1bGUgb2YgdGh1bWI6IElmIGxhcmdlciBTRCAvIHNtYWxsZXIgU0QgPCAyLCBwb29sZWQgdC10ZXN0IGlzIG9mdGVuIGFjY2VwdGFibGUuIEluIG91ciBjYXNlOiAxLjQvMS4yID0gMS4xNyIpDQpgYGANCg0KKipOb3RlOioqIEJlY2F1c2UgdGhlIHNhbXBsZSBzaXplcyBhcmUgZXhhY3RseSBlcXVhbCAoNyRuPTI1JCBmb3IgYm90aCksIHRoZSBzdGFuZGFyZCBTdHVkZW50J3MgVC10ZXN0IGlzIGhpZ2hseSByb2J1c3QgZXZlbiBpZiB0aGUgdmFyaWFuY2VzIGRpZmZlciBzbGlnaHRseS4NCg0KDQozLiBDb21wdXRlIHRoZSAqKnRlc3Qgc3RhdGlzdGljKiogYW5kICoqcC12YWx1ZSoqLg0KDQoqKkNhbGN1bGF0ZSB0aGUgU3RhbmRhcmQgRXJyb3IgKCRTRSQpKioNCg0KU2luY2UgdGhlIHNhbXBsZSBzaXplcyBhcmUgZXF1YWwgKCRuX0EgPSBuX0IgPSAyNSQpLCB0aGUgc3RhbmRhcmQgZXJyb3IgZm9yIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbWVhbnMgaXMgY2FsY3VsYXRlZCBhczoNCiQkU0UgPSBcc3FydHtcZnJhY3tzX0FeMn17bl9BfSArIFxmcmFje3NfQl4yfXtuX0J9fSQkJCRTRSA9IFxzcXJ0e1xmcmFjezEuMl4yfXsyNX0gKyBcZnJhY3sxLjReMn17MjV9fSQkJCRTRSA9IFxzcXJ0e1xmcmFjezEuNDR9ezI1fSArIFxmcmFjezEuOTZ9ezI1fX0gPSBcc3FydHswLjA1NzYgKyAwLjA3ODR9JCQkJFNFID0gXHNxcnR7MC4xMzZ9IFxhcHByb3ggMC4zNjg4JCQNCg0KKipDb21wdXRlIHRoZSBUZXN0IFN0YXRpc3RpYyAoJHQkKSoqDQoNClRoZSAkdCQtc3RhdGlzdGljIG1lYXN1cmVzIGhvdyBtYW55IHN0YW5kYXJkIGVycm9ycyB0aGUgZGlmZmVyZW5jZSBpbiBzYW1wbGUgbWVhbnMgaXMgZnJvbSB6ZXJvOiQkdCA9IFxmcmFje1xiYXJ7eH1fQSAtIFxiYXJ7eH1fQn17U0V9JCQkJHQgPSBcZnJhY3s0LjggLSA1LjR9ezAuMzY4OH0kJCQkdCA9IFxmcmFjey0wLjZ9ezAuMzY4OH0gXGFwcHJveCAtMS42MjckJA0KDQoqKkRldGVybWluZSBEZWdyZWVzIG9mIEZyZWVkb20gKCRkZiQpKioNCg0KRm9yIGEgcG9vbGVkIHR3by1zYW1wbGUgdC10ZXN0OiQkZGYgPSBuX0EgKyBuX0IgLSAyID0gMjUgKyAyNSAtIDIgPSA0OCQkDQoNCioqQ2FsY3VsYXRlIHRoZSBQLXZhbHVlKioNCg0KVXNpbmcgYSAkdCQtZGlzdHJpYnV0aW9uIHRhYmxlIG9yIHN0YXRpc3RpY2FsIHNvZnR3YXJlIGZvciBhIHR3by10YWlsZWQgdGVzdCB3aXRoICR0ID0gLTEuNjI3JCBhbmQgJGRmID0gNDgkOiRwXHRleHR7LXZhbHVlfSBcYXBwcm94IDAuMTEwMyQNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBDcmVhdGUgc3R5bGVkIHJlc3VsdHMgdGFibGUNCnRlc3RfcmVzdWx0cyA8LSBkYXRhLmZyYW1lKA0KICBgU3RhdGlzdGljYWwgTWVhc3VyZWAgPSBjKA0KICAgICJUZXN0IFN0YXRpc3RpYyAodC12YWx1ZSkiLA0KICAgICJEZWdyZWVzIG9mIEZyZWVkb20gKGRmKSIsDQogICAgIlAtdmFsdWUgKHR3by10YWlsZWQpIiwNCiAgICAiU2lnbmlmaWNhbmNlIExldmVsICjOsSkiLA0KICAgICJDcml0aWNhbCBWYWx1ZSAodCopIiwNCiAgICAiTWVhbiBEaWZmZXJlbmNlIEVzdGltYXRlIiwNCiAgICAiU3RhbmRhcmQgRXJyb3IiLA0KICAgICJFZmZlY3QgU2l6ZSAoQ29oZW4ncyBkKSIsDQogICAgIlN0YXRpc3RpY2FsIERlY2lzaW9uIiwNCiAgICAiUHJhY3RpY2FsIFNpZ25pZmljYW5jZSINCiAgKSwNCiAgVmFsdWUgPSBjKA0KICAgICItMS42MjciLA0KICAgICI0OCIsDQogICAgIjAuMTEwMyIsDQogICAgIjAuMDUiLA0KICAgICLCsTIuMDExIiwNCiAgICAiMC42MDAiLA0KICAgICIwLjM2OSIsDQogICAgIjAuNDYxIiwNCiAgICAiRmFpbCB0byByZWplY3QgSOKCgCIsDQogICAgIk5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UiDQogICksDQogIEludGVycHJldGF0aW9uID0gYygNCiAgICAiU3RhbmRhcmRpemVkIGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cHMiLA0KICAgICJXZWxjaC1TYXR0ZXJ0aHdhaXRlIGFwcHJveGltYXRpb24iLA0KICAgICJQcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgc3VjaCBleHRyZW1lIHJlc3VsdHMgaWYgSOKCgCBpcyB0cnVlIiwNCiAgICAiTWF4aW11bSBhY2NlcHRhYmxlIFR5cGUgSSBlcnJvciByYXRlIiwNCiAgICAiQm91bmRhcnkgZm9yIHJlamVjdGlvbiByZWdpb24gKHR3by10YWlsZWQpIiwNCiAgICAiU2FtcGxlIG1lYW4gZGlmZmVyZW5jZSAoQiAtIEEpIiwNCiAgICAiU3RhbmRhcmQgZXJyb3Igb2YgdGhlIGRpZmZlcmVuY2UiLA0KICAgICJNZWRpdW0gZWZmZWN0IHNpemUgKGJ1dCBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCkiLA0KICAgICJJbnN1ZmZpY2llbnQgZXZpZGVuY2UgYWdhaW5zdCBudWxsIGh5cG90aGVzaXMiLA0KICAgICJEaWZmZXJlbmNlIG1heSBub3QgYmUgcHJhY3RpY2FsbHkgaW1wb3J0YW50Ig0KICApLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUodGVzdF9yZXN1bHRzLCANCiAgICAgIGFsaWduID0gYygibCIsICJyIiwgImwiKSwNCiAgICAgIGNhcHRpb24gPSAiVHdvLVNhbXBsZSBXZWxjaCdzIHQtVGVzdDogUmVzdWx0cyBTdW1tYXJ5IiwNCiAgICAgIGZvcm1hdCA9ICJodG1sIikgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgZm9udF9zaXplID0gMTMNCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjZjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIzY20iLCBjb2xvciA9ICIjMTk3NkQyIikgJT4lDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjljbSIpICU+JQ0KICByb3dfc3BlYyg5LCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiMzODhFM0MiKSAlPiUgICMgR3JlZW4gZm9yICJmYWlsIHRvIHJlamVjdCINCiAgcm93X3NwZWMoMywgYmFja2dyb3VuZCA9ICIjRkZGM0NEIikgJT4lICAjIEhpZ2hsaWdodCBwLXZhbHVlDQogIHJvd19zcGVjKDgsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JSAgIyBIaWdobGlnaHQgZWZmZWN0IHNpemUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJI4oKAOiDOvF9BID0gzrxfQiB2cyBI4oKBOiDOvF9BIOKJoCDOvF9CIHwgVGVzdDogV2VsY2gncyB0d28tc2FtcGxlIHQtdGVzdCAoZG9lcyBub3QgYXNzdW1lIGVxdWFsIHZhcmlhbmNlcykiKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb246KioNCkF0IGEgc3RhbmRhcmQgc2lnbmlmaWNhbmNlIGxldmVsIG9mICRcYWxwaGEgPSAwLjA1JCwgc2luY2UgdGhlICRwJC12YWx1ZSAoJDAuMTEwMyQpIGlzIGdyZWF0ZXIgdGhhbiAkMC4wNSQsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3RhdGlzdGljYWwgZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gYXZlcmFnZSBzZXNzaW9uIGR1cmF0aW9uIGJldHdlZW4gVmVyc2lvbiBBIGFuZCBWZXJzaW9uIEIuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBMb2FkIGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShkcGx5cikNCg0KIyAxLiBJbnB1dCBEYXRhDQpuX2EgPC0gMjU7IG1lYW5fYSA8LSA0Ljg7IHNkX2EgPC0gMS4yDQpuX2IgPC0gMjU7IG1lYW5fYiA8LSA1LjQ7IHNkX2IgPC0gMS40DQphbHBoYSA8LSAwLjA1DQoNCiMgMi4gSGl0dW5nIFN0YXRpc3Rpaw0Kc2UgPC0gc3FydCgoc2RfYV4yIC8gbl9hKSArIChzZF9iXjIgLyBuX2IpKQ0KdF9zdGF0IDwtIChtZWFuX2EgLSBtZWFuX2IpIC8gc2UNCmRmIDwtIG5fYSArIG5fYiAtIDINCnRfY3JpdGljYWwgPC0gcXQoMSAtIGFscGhhLzIsIGRmKQ0KDQojIDMuIEJ1YXQgRGF0YSB1bnR1ayBLdXJ2YSBEaXN0cmlidXNpIFQNCnhfdmFscyA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeV92YWxzIDwtIGR0KHhfdmFscywgZGYpDQpkZl9wbG90IDwtIGRhdGEuZnJhbWUoeCA9IHhfdmFscywgeSA9IHlfdmFscykNCg0KIyA0LiBQbG90dGluZyBkZW5nYW4gUGxvdGx5DQpmaWcgPC0gcGxvdF9seShkZl9wbG90KSAlPiUNCiAgYWRkX2xpbmVzKHggPSB+eCwgeSA9IH55LCBuYW1lID0gJ1QtRGlzdHJpYnV0aW9uJywgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScpKSAlPiUNCiAgDQogICMgU2hhZGVkIHJlZ2lvbnMgdW50dWsgQWxwaGEgKEFyZWEgUGVub2xha2FuKQ0KICBhZGRfcmliYm9ucyh4ID0gfnhbeCA8PSAtdF9jcml0aWNhbF0sIHltaW4gPSAwLCB5bWF4ID0gfnlbeCA8PSAtdF9jcml0aWNhbF0sDQogICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JyksDQogICAgICAgICAgICAgIG5hbWUgPSAnUmVqZWN0aW9uIFJlZ2lvbicpICU+JQ0KICBhZGRfcmliYm9ucyh4ID0gfnhbeCA+PSB0X2NyaXRpY2FsXSwgeW1pbiA9IDAsIHltYXggPSB+eVt4ID49IHRfY3JpdGljYWxdLA0KICAgICAgICAgICAgICBmaWxsY29sb3IgPSAncmdiYSgyNTUsIDAsIDAsIDAuMyknLCBsaW5lID0gbGlzdChjb2xvciA9ICd0cmFuc3BhcmVudCcpLA0KICAgICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpICU+JQ0KICANCiAgIyBQRVJCQUlLQU46IEd1bmFrYW4gbmlsYWkgZWtzcGxpc2l0IHVudHVrIHNlZ21lbnRzDQogIGFkZF9zZWdtZW50cyh4ID0gdF9zdGF0LCB4ZW5kID0gdF9zdGF0LCB5ID0gMCwgeWVuZCA9IGR0KHRfc3RhdCwgZGYpLA0KICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snLCBkYXNoID0gJ2Rhc2gnLCB3aWR0aCA9IDMpLA0KICAgICAgICAgICAgICAgbmFtZSA9IHBhc3RlKCdULVN0YXRpc3RpYzonLCByb3VuZCh0X3N0YXQsIDMpKSwNCiAgICAgICAgICAgICAgIGluaGVyaXQgPSBGQUxTRSkgJT4lICMgTWVuY2VnYWggZXJyb3IgcGV3YXJpc2FuIGF0cmlidXQNCiAgDQogICMgTGF5b3V0DQogIGxheW91dCh0aXRsZSA9ICJWaXN1YWxpc2FzaSBBL0IgVGVzdDogVmVyc2lvbiBBIHZzIFZlcnNpb24gQiIsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVC1WYWx1ZSIpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRlbnNpdHkiKSwNCiAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICAgICAgbGlzdCh4ID0gdF9zdGF0LCB5ID0gZHQodF9zdGF0LCBkZikgKyAwLjA1LCANCiAgICAgICAgICAgICAgICB0ZXh0ID0gIlQtU3RhdCAoR2FnYWwgVG9sYWsgSDApIiwgDQogICAgICAgICAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwgYXJyb3doZWFkID0gMikNCiAgICAgICAgICkpDQoNCmZpZw0KYGBgDQoNCioqVmlzdWFsaXphdGlvbiBFeHBsYW5hdGlvbjoqKg0KDQotICoqQmx1ZSBDdXJ2ZSoqOiBTaG93cyBhIFQtcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIHdpdGggNDggZGVncmVlcyBvZiBmcmVlZG9tLg0KDQotICoqUmVkIEFyZWEqKjogVGhpcyBpcyB0aGUgUmVqZWN0aW9uIFJlZ2lvbi4gSWYgdGhlIGJsYWNrIGxpbmUgZmFsbHMgd2l0aGluIHRoaXMgYXJlYSwgdGhlIGRpZmZlcmVuY2UgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4NCg0KLSAqKkJsYWNrIERhc2hlZCBMaW5lKio6IFRoaXMgaXMgdGhlIFQtc3RhdGlzdGljICgtMS42MjcpIHdlIGNhbGN1bGF0ZWQuDQoNCioqVmlzdWFsIENvbmNsdXNpb246KiogU2luY2UgdGhlIGJsYWNrIGxpbmUgZmFsbHMgb3V0c2lkZSB0aGUgcmVkIGFyZWEgKGluIHRoZSB3aGl0ZSBjZW50ZXIpLCB3ZSBjYW4gdmlzdWFsbHkgc2VlIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW4gc2Vzc2lvbiBkdXJhdGlvbiBiZXR3ZWVuIFZlcnNpb25zIEEgYW5kIEIgaXMgbm90IHN0cm9uZyBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCBzaWduaWZpY2FudCBhdCB0aGUgNSUgbGV2ZWwuDQoNCjQuIERyYXcgYSAqKnN0YXRpc3RpY2FsIGNvbmNsdXNpb24qKiBhdCAkXGFscGhhID0gMC4wNSQuDQoNCioqQ29tcGFyaXNvbiBvZiBWYWx1ZXMqKg0KDQpCYXNlZCBvbiB0aGUgY2FsY3VsYXRpb24gaW4gdGhlIHByZXZpb3VzIHN0ZXA6DQoNCi0gUC12YWx1ZTogJDAuMTEwMyQNCg0KLSBTaWduaWZpY2FuY2UgTGV2ZWwgKCRcYWxwaGEkKTogJDAuMDUkDQoNCi0gVC1zdGF0aXN0aWM6ICQtMS42MjckDQoNCi0gVC1jcml0aWNhbCAoJGRmPTQ4LCBcYWxwaGE9MC4wNSQpOiAkXHBtIDIuMDExJA0KDQoqKkh5cG90aGVzaXMgVGVzdCoqDQoNCldlIHVzZSB0aGUgc3RhbmRhcmQgZGVjaXNpb24gcnVsZToNCg0KLSBQLXZhbHVlIENyaXRlcmlhOiBJZiAkUCBcbGVxIFxhbHBoYSQsIFJlamVjdCAkSF8wJC4gSWYgJFAgPiBcYWxwaGEkLCBGYWlsIHRvIFJlamVjdCANCiRIXzAkLiQwLjExMDMgPiAwLjA1IFxyaWdodGFycm93JCBGYWlsIHRvIFJlamVjdCAkSF8wJA0KDQotIFQtc3RhdGlzdGljIENyaXRlcmlhOiBJZiAkfHR8ID4gdF97Y3JpdH0kLCBSZWplY3QgJEhfMCQuJHwtMS42Mjd8IDwgMi4wMTEgXHJpZ2h0YXJyb3ckIEZhaWwgdG8gUmVqZWN0ICRIXzAkDQoNCioqQ29uY2x1c2lvbjoqKiBBdCB0aGUgJDUlJCBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIGRvICoqbm90IGhhdmUgc3VmZmljaWVudCBzdGF0aXN0aWNhbCBldmlkZW5jZSoqIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzICgkSF8wJCkuDQoNCioqTWVhbmluZzoqKiBUaGUgZGlmZmVyZW5jZSBpbiBtZWFuIHNlc3Npb24gZHVyYXRpb24gYmV0d2VlbiBWZXJzaW9uIEEgKDQuOCBtaW51dGVzKSBhbmQgVmVyc2lvbiBCICg1LjQgbWludXRlcykgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlIGlzIG1vc3QgbGlrZWx5IGR1ZSB0byByYW5kb20gdmFyaWF0aW9uIGluIHRoZSBzYW1wbGUsIG5vdCB0byBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gbGFuZGluZyBwYWdlIHBlcmZvcm1hbmNlLg0KDQoqKkJ1c2luZXNzIFJlY29tbWVuZGF0aW9uKioNCg0KQWx0aG91Z2ggVmVyc2lvbiBCIGhhcyBhIG5vbWluYWxseSBoaWdoZXIgbWVhbiwgdGhlIHByb2R1Y3QgdGVhbSBzaG91bGQ6DQoNCi0gKipJbmNyZWFzZSB0aGUgc2FtcGxlIHNpemUgKCRuJCkqKjogV2l0aCAkbj0yNSQsIHN0YXRpc3RpY2FsIHBvd2VyIG1heSBiZSB0b28gbG93IHRvIGRldGVjdCBzbWFsbCBkaWZmZXJlbmNlcy4NCg0KLSAqKlJ1biB0aGUgdGVzdCBsb25nZXIqKjogVG8gc2VlIGlmIHRoaXMgdHJlbmQgYmVjb21lcyBzaWduaWZpY2FudCBhcyB0aGUgZGF0YSBncm93cy4NCg0KLSAqKk5vdCBpbW1lZGlhdGVseSBjaGFuZ2UgdGhlIGRlc2lnbioqOiBCYXNlZCBvbiB0aGlzIGRhdGEgYWxvbmUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IFZlcnNpb24gQiB3aWxsIHBlcmZvcm0gYmV0dGVyIGluIHRoZSBnZW5lcmFsIHBvcHVsYXRpb24uDQoNCg0KNS4gSW50ZXJwcmV0IHRoZSByZXN1bHQgZm9yICoqcHJvZHVjdCBkZWNpc2lvbi1tYWtpbmcqKi4NCg0KKipEb24ndCBHZXQgQ2F1Z2h0IFVwIGluIHRoZSAiTHVzdCBvZiBEYXRhIioqDQoNCk5vbWluYWxseSwgVmVyc2lvbiBCIGFwcGVhcnMgdG8gYmUgMTIuNSUg4oCL4oCLYmV0dGVyIChhIGRpZmZlcmVuY2Ugb2YgMC42IG1pbnV0ZXMpLiBIb3dldmVyLCBiZWNhdXNlIHRoZSB0ZXN0IHJlc3VsdHMgYXJlIG5vdCBzaWduaWZpY2FudCwgd2UgY2Fubm90IGJlIHN1cmUgdGhhdCB0aGlzIGluY3JlYXNlIHdpbGwgcGVyc2lzdCBpZiB0aGUgZmVhdHVyZSBpcyByb2xsZWQgb3V0IHRvIGFsbCB1c2Vycy4gVGhlcmUgaXMgYSBoaWdoIHJpc2sgdGhhdCB0aGlzIGRpZmZlcmVuY2UgaXMganVzdCAibm9pc2UiIG9yIGp1c3QgYSBjb2luY2lkZW5jZS4NCg0KKipFdmFsdWF0ZSB0aGUgRWZmZWN0IG9mIFNhbXBsZSBTaXplKioNCg0KVGhlIHNhbXBsZSBzaXplIG9mICRuID0gMjUkIHBlciBncm91cCBpcyB2ZXJ5IHNtYWxsIGZvciBhbiBBL0IgdGVzdCBvbiBhIGRpZ2l0YWwgcGxhdGZvcm0uDQoNCi0gKipQcm9ibGVtOioqIFRoaXMgc3RhdGlzdGljYWwgdGVzdCBtYXkgaGF2ZSBMb3cgUG93ZXIsIG1lYW5pbmcgdGhlIHRlc3QgaXMgbm90IHNlbnNpdGl2ZSBlbm91Z2ggdG8gZGV0ZWN0IGEgdHJ1ZSBkaWZmZXJlbmNlLg0KDQotICoqQWN0aW9uOioqIElmIHRoZSBvcGVyYXRpb25hbCBjb3N0cyBvZiBWZXJzaW9uIEIgYXJlIG5vdCBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIFZlcnNpb24gQSwgZG8gbm90IGRpc21pc3MgVmVyc2lvbiBCIG91dCBvZiBoYW5kLiBDb250aW51ZSB0ZXN0aW5nIHdpdGggYSBsYXJnZXIgc2FtcGxlIHNpemUgKGUuZy4sICRuID0gMTAwJCBvciBtb3JlKSB0byBnZXQgbW9yZSBjb25jbHVzaXZlIHJlc3VsdHMuDQoNCioqQ29uc2lkZXIgU3dpdGNoaW5nIENvc3RzKioNCg0KSW4gcHJvZHVjdCBtYW5hZ2VtZW50LCBldmVyeSBjaGFuZ2UgaGFzIGEgY29zdCAoZGV2ZWxvcGVyIHRpbWUsIGJ1ZyByaXNrLCB1c2VyIGNvbmZ1c2lvbikuIA0KDQotICoqRGVjaXNpb246KiogSWYgVmVyc2lvbiBCIHJlcXVpcmVzIHNpZ25pZmljYW50IGVmZm9ydCB0byBpbXBsZW1lbnQgcGVybWFuZW50bHksIHRoZW4gc3RpY2sgd2l0aCBWZXJzaW9uIEEgKHN0YXR1cyBxdW8pLiBUaGVyZSBpcyBubyBjb21wZWxsaW5nIGRhdGEtZHJpdmVuIHJlYXNvbiB0byB0YWtlIG9uIHRoZSB0ZWNobmljYWwgcmlzayBpZiBpdHMgcGVyZm9ybWFuY2UgaGFzIG5vdCBiZWVuIHByb3ZlbiB0byBiZSBzaWduaWZpY2FudGx5IHN1cGVyaW9yLg0KDQoqKkFuYWx5c2lzIG9mIFZhcmlhbmNlKioNCg0KVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBWZXJzaW9uIEIgKDEuNCkgaXMgaGlnaGVyIHRoYW4gdGhhdCBvZiBWZXJzaW9uIEEgKDEuMikuIFRoaXMgc3VnZ2VzdHMgdGhhdCB1c2VyIGJlaGF2aW9yIGluIFZlcnNpb24gQiBpcyAqKm1vcmUgaW5jb25zaXN0ZW50KiouIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSB1c2VycyByZWFsbHkgbGlrZSBpdCAodmVyeSBsb25nIGR1cmF0aW9uKSwgd2hpbGUgb3RoZXJzIGFyZSBjb25mdXNlZCAodmVyeSBzaG9ydCBkdXJhdGlvbikuDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBzdHlsZWQgcmVjb21tZW5kYXRpb25zIHRhYmxlDQphY3Rpb25fcGxhbiA8LSBkYXRhLmZyYW1lKA0KICBgUmVjb21tZW5kYXRpb25gID0gYygNCiAgICAiIFN0YXR1cyBRdW8gKEhvbGQpIiwNCiAgICAiIFRlc3QgSXRlcmF0aW9uIiwgDQogICAgIiBRdWFsaXRhdGl2ZSBBbmFseXNpcyIsDQogICAgIiBDb3N0LUJlbmVmaXQgQW5hbHlzaXMiLA0KICAgICIgSW1wbGVtZW50YXRpb24gUm9hZG1hcCINCiAgKSwNCiAgYEtleSBBY3Rpb25gID0gYygNCiAgICAiTWFpbnRhaW4gY3VycmVudCBkZXBsb3ltZW50IiwNCiAgICAiUnVuIHBvd2VyZWQgZm9sbG93LXVwIHN0dWR5IiwNCiAgICAiQ29uZHVjdCB1c2VyIGV4cGVyaWVuY2UgcmVzZWFyY2giLA0KICAgICJDYWxjdWxhdGUgUk9JIG9mIHBvdGVudGlhbCBjaGFuZ2UiLA0KICAgICJEZXZlbG9wIHBoYXNlZCByb2xsb3V0IHBsYW4iDQogICksDQogIGBSYXRpb25hbGVgID0gYygNCiAgICAiU3RhdGlzdGljYWwgZXZpZGVuY2UgaW5zdWZmaWNpZW50IChwPTAuMTEwMywgQ0kgaW5jbHVkZXMgMCkiLA0KICAgICJDdXJyZW50IHN0dWR5IHVuZGVycG93ZXJlZCAoMzUlKSAtIGhpZ2ggVHlwZSBJSSBlcnJvciByaXNrIiwNCiAgICAiSGlnaGVyIHZhcmlhbmNlIGluIFZlcnNpb24gQiAoU0Q9MS40KSBzdWdnZXN0cyBpbmNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIiwNCiAgICAiTmVlZCBidXNpbmVzcyBqdXN0aWZpY2F0aW9uIGZvciAwLjYtbWludXRlIGltcHJvdmVtZW50IiwNCiAgICAiUHJlcGFyZSBmb3IgcG90ZW50aWFsIGZ1dHVyZSBkZXBsb3ltZW50IGJhc2VkIG9uIG5ldyBldmlkZW5jZSINCiAgKSwNCiAgYFN1Y2Nlc3MgTWV0cmljc2AgPSBjKA0KICAgICJObyBuZWdhdGl2ZSBpbXBhY3Qgb24ga2V5IG1ldHJpY3MiLA0KICAgICJBY2hpZXZlIDgwJSBzdGF0aXN0aWNhbCBwb3dlciIsDQogICAgIklkZW50aWZ5IHJvb3QgY2F1c2Ugb2YgdmFyaWFuY2UgaW5jcmVhc2UiLA0KICAgICJDbGVhciBST0kgY2FsY3VsYXRpb24iLA0KICAgICJEb2N1bWVudGVkIGRlcGxveW1lbnQgcGxhbiINCiAgKSwNCiAgYE93bmVyYCA9IGMoIlByb2R1Y3QgTWFuYWdlciIsICJEYXRhIFNjaWVudGlzdCIsICJVWCBSZXNlYXJjaGVyIiwgIkJ1c2luZXNzIEFuYWx5c3QiLCAiUHJvamVjdCBNYW5hZ2VyIiksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCg0KIyBDcmVhdGUgc3R5bGVkIHRhYmxlDQprYWJsZShhY3Rpb25fcGxhbiwgDQogICAgICBhbGlnbiA9IGMoImwiLCAibCIsICJsIiwgImwiLCAiYyIpLA0KICAgICAgY2FwdGlvbiA9ICJTdHJhdGVnaWMgUmVjb21tZW5kYXRpb25zOiBBL0IgVGVzdGluZyBGb2xsb3ctdXAgQWN0aW9ucyIsDQogICAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDEzDQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjhjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoNSwgd2lkdGggPSAiM2NtIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0ZGRjNDRCIpICU+JSAgIyBZZWxsb3cgZm9yIHN0YXR1cyBxdW8NCiAgcm93X3NwZWMoMiwgYmFja2dyb3VuZCA9ICIjRDRFRERBIikgJT4lICAjIEdyZWVuIGZvciB0ZXN0IGl0ZXJhdGlvbg0KICByb3dfc3BlYygzLCBiYWNrZ3JvdW5kID0gIiNEMUVDRjEiKSAlPiUgICMgQmx1ZSBmb3IgcXVhbGl0YXRpdmUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJTdHJhdGVnaWMgRGlyZWN0aW9uIiA9IDEsICJJbW1lZGlhdGUgQWN0aW9uIiA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgIkV2aWRlbmNlLUJhc2VkIFJhdGlvbmFsZSIgPSAxLCAiTWVhc3VyYWJsZSBPdXRjb21lcyIgPSAxLCAiUmVzcG9uc2libGUiID0gMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIkJhc2VkIG9uIEEvQiB0ZXN0IHJlc3VsdHM6IHQoNDgpID0gLTEuNjI3LCBwID0gMC4xMTAzLCBtZWFuIGRpZmZlcmVuY2UgPSAwLjYgbWludXRlcyIpDQpgYGANCg0KDQojIENhc2UgU3R1ZHkgNCANCg0KIyMgQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZQ0KDQpBbiAqKmUtY29tbWVyY2UgY29tcGFueSoqIGV4YW1pbmVzIHdoZXRoZXIgKipkZXZpY2UgdHlwZSoqIGlzIGFzc29jaWF0ZWQgd2l0aCAqKnBheW1lbnQgbWV0aG9kIHByZWZlcmVuY2UqKi4NCg0KfCBEZXZpY2UgLyBQYXltZW50IHwgRS1XYWxsZXQgfCBDcmVkaXQgQ2FyZCB8IENhc2ggb24gRGVsaXZlcnkgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBNb2JpbGUgfCAxMjAgfCA4MCB8IDUwIHwNCnwgRGVza3RvcCB8IDYwIHwgOTAgfCA0MCB8DQoNCiMjIFRhc2tzDQoNCjEuIFN0YXRlIHRoZSAqKk51bGwgSHlwb3RoZXNpcyAoSOKCgCkqKiBhbmQgKipBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzIChI4oKBKSoqLg0KMi4gSWRlbnRpZnkgdGhlICoqYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgdGVzdCoqLg0KMy4gQ29tcHV0ZSB0aGUgKipDaGktU3F1YXJlIHN0YXRpc3RpYyAoz4fCsikqKi4NCjQuIERldGVybWluZSB0aGUgKipwLXZhbHVlKiogYXQgJFxhbHBoYSA9IDAuMDUkLg0KNS4gSW50ZXJwcmV0IHRoZSByZXN1bHRzIGluIHRlcm1zIG9mICoqZGlnaXRhbCBwYXltZW50IHN0cmF0ZWd5KiouDQoNCg0KIyMgIEFuc3dlciBDYXNlIFN0dWR5IDQNCg0KDQoxLiBTdGF0ZSB0aGUgKipOdWxsIEh5cG90aGVzaXMgKEjigoApKiogYW5kICoqQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoSOKCgSkqKi4NCg0KKipOdWxsIEh5cG90aGVzaXMgKCRIXzAkKSoqDQoNClRoZSBudWxsIGh5cG90aGVzaXMgYXNzdW1lcyB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMuMiBJbiBvdGhlciB3b3JkcywgdGhlIHZhcmlhYmxlcyBhcmUgaW5kZXBlbmRlbnQuDQoNCi0gJEhfMCQ6IERldmljZSB0eXBlIGFuZCBwYXltZW50IG1ldGhvZCBwcmVmZXJlbmNlIGFyZSBpbmRlcGVuZGVudC4NCg0KLSAoUHV0IHNpbXBseTogVGhlIHR5cGUgb2YgZGV2aWNlIGEgY3VzdG9tZXIgdXNlcyBkb2VzIG5vdCBhZmZlY3Qgd2hpY2ggcGF5bWVudCBtZXRob2QgdGhleSBjaG9vc2UuKQ0KDQoqKkFsdGVybmF0aXZlIEh5cG90aGVzaXMgKCRIXzEkKSoqDQoNClRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMuMyBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBvbmUgdmFyaWFibGUgZGVwZW5kcyBvbiB0aGUgb3RoZXIuDQoNCi0gJEhfMSQ6IERldmljZSB0eXBlIGFuZCBwYXltZW50IG1ldGhvZCBwcmVmZXJlbmNlIGFyZSBkZXBlbmRlbnQgKGFzc29jaWF0ZWQpLg0KDQotIChQdXQgc2ltcGx5OiBUaGUgY2hvaWNlIG9mIHBheW1lbnQgbWV0aG9kIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY3VzdG9tZXIgaXMgdXNpbmcgYSBtb2JpbGUgZGV2aWNlIG9yIGEgZGVza3RvcC4pDQoNCioqVW5kZXJzdGFuZGluZyB0aGUgVGVzdCoqIA0KDQpUbyB2YWxpZGF0ZSB0aGVzZSBoeXBvdGhlc2VzLCB5b3Ugd291bGQgdHlwaWNhbGx5IGNhbGN1bGF0ZSB0aGUgKipFeHBlY3RlZCBGcmVxdWVuY2llcyoqIGZvciBlYWNoIGNlbGwgaW4geW91ciB0YWJsZSB1c2luZyB0aGUgZm9ybXVsYToNCg0KJCRFID0gXGZyYWN7KFx0ZXh0e1JvdyBUb3RhbH0gXHRpbWVzIFx0ZXh0e0NvbHVtbiBUb3RhbH0pfXtcdGV4dHtHcmFuZCBUb3RhbH19JCQNCg0KVGhlbiwgeW91IHdvdWxkIHVzZSB0aGUgQ2hpLVNxdWFyZSBmb3JtdWxhIHRvIGZpbmQgdGhlIHRlc3Qgc3RhdGlzdGljICgkXGNoaV4yJCk6DQoNCiQkXGNoaV4yID0gXHN1bSBcZnJhY3soTyAtIEUpXjJ9e0V9JCQNCg0KV2hlcmUgJE8kIGlzIHRoZSAqKk9ic2VydmVkIGZyZXF1ZW5jeSoqICh0aGUgbnVtYmVycyBwcm92aWRlZCBpbiB5b3VyIHRhYmxlKSBhbmQgJEUkIGlzIHRoZSAqKkV4cGVjdGVkIGZyZXF1ZW5jeSoqLg0KDQoNCjIuIElkZW50aWZ5IHRoZSAqKmFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QqKi4NClRoZSBDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlIA0KDQoqKkNhdGVnb3JpY2FsIFZhcmlhYmxlcyoqOiBCb3RoIG9mIHlvdXIgdmFyaWFibGVzIGFyZSBjYXRlZ29yaWNhbCAobm9taW5hbCkuDQoNCi0gKipWYXJpYWJsZSAxIChEZXZpY2UgVHlwZSkqKjogTW9iaWxlIG9yIERlc2t0b3AuDQoNCi0gKipWYXJpYWJsZSAyIChQYXltZW50IE1ldGhvZCkqKjogRS1XYWxsZXQsIENyZWRpdCBDYXJkLCBvciBDYXNoIG9uIERlbGl2ZXJ5Lg0KDQoqKlJlbGF0aW9uc2hpcCBUZXN0aW5nKio6IFRoZSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIG9yIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzLCByYXRoZXIgdGhhbiBjb21wYXJpbmcgbWVhbnMgKHdoaWNoIHdvdWxkIHJlcXVpcmUgYSB0LXRlc3Qgb3IgQU5PVkEpLg0KDQoqKkNvbnRpbmdlbmN5IFRhYmxlIEZvcm1hdCoqOiBZb3VyIGRhdGEgaXMgb3JnYW5pemVkIGluIGEgJDIgXHRpbWVzIDMkIGNvbnRpbmdlbmN5IHRhYmxlICgyIHJvd3MgZm9yIGRldmljZXMgYW5kIDMgY29sdW1ucyBmb3IgcGF5bWVudCBtZXRob2RzKSwgd2hpY2ggaXMgdGhlIHN0YW5kYXJkIGlucHV0IGZvciB0aGlzIHRlc3QuDQoNCioqS2V5IEFzc3VtcHRpb25zIGZvciB0aGlzIFRlc3QqKg0KDQpUbyBlbnN1cmUgdGhlIHJlc3VsdHMgb2YgdGhpcyB0ZXN0IGFyZSB2YWxpZCwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHNob3VsZCBiZSBtZXQ6DQoNCi0gKipJbmRlcGVuZGVuY2U6KiogVGhlIG9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlciAob25lIGN1c3RvbWVyJ3MgY2hvaWNlIGRvZXNuJ3QgYWZmZWN0IGFub3RoZXIncykuDQoNCi0gKipTYW1wbGUgU2l6ZToqKiBUaGUgZXhwZWN0ZWQgZnJlcXVlbmN5IGluIGVhY2ggY2VsbCBzaG91bGQgZ2VuZXJhbGx5IGJlIDUgb3IgZ3JlYXRlci4NCg0KLSAqKlJhbmRvbSBTYW1wbGluZzoqKiBUaGUgZGF0YSBzaG91bGQgYmUgY29sbGVjdGVkIGZyb20gYSByYW5kb20gc2FtcGxlIG9mIHRoZSBwb3B1bGF0aW9uLg0KDQozLiAgQ29tcHV0ZSB0aGUgKipDaGktU3F1YXJlIHN0YXRpc3RpYyAoz4fCsikqKi4NCg0KVG8gY29tcHV0ZSB0aGUgQ2hpLVNxdWFyZSBzdGF0aXN0aWMgKCRcY2hpXjIkKSwgd2UgZm9sbG93IHRoZXNlIHN0ZXBzOg0KDQoqKkNhbGN1bGF0ZSBSb3cgYW5kIENvbHVtbiBUb3RhbHMqKg0KDQpGaXJzdCwgd2UgZmluZCB0aGUgc3VtcyBmb3IgZWFjaCByb3cgYW5kIGNvbHVtbiB0byBkZXRlcm1pbmUgdGhlIGdyYW5kIHRvdGFsLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBDcmVhdGUgY29udGluZ2VuY3kgdGFibGUgd2l0aCBzdHlsaW5nDQpjb250X3RhYmxlIDwtIG1hdHJpeCgNCiAgYygxMjAsIDgwLCA1MCwgMjUwLA0KICAgIDYwLCA5MCwgNDAsIDE5MCksDQogIG5yb3cgPSAyLCBieXJvdyA9IFRSVUUsDQogIGRpbW5hbWVzID0gbGlzdCgNCiAgICBjKCIgTW9iaWxlIiwgIu+4jyBEZXNrdG9wIiksDQogICAgYygiRS1XYWxsZXQiLCAiQ3JlZGl0IENhcmQiLCAiQ09EIiwgIlJvdyBUb3RhbCIpDQogICkNCikNCg0KIyBBZGQgY29sdW1uIGFuZCBncmFuZCB0b3RhbHMNCmNvbF90b3RhbHMgPC0gYygxODAsIDE3MCwgOTAsIDQ0MCkNCmZ1bGxfdGFibGUgPC0gcmJpbmQoY29udF90YWJsZSwgY29sX3RvdGFscykNCnJvd25hbWVzKGZ1bGxfdGFibGUpWzNdIDwtICIgQ29sdW1uIFRvdGFsIg0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKGZ1bGxfdGFibGUsIA0KICAgICAgYWxpZ24gPSBjKCJsIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGNhcHRpb24gPSAiQ29udGluZ2VuY3kgVGFibGU6IERldmljZSBUeXBlIMOXIFBheW1lbnQgTWV0aG9kIChOPTQ0MCkiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxNA0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDI6NCwgd2lkdGggPSAiM2NtIikgJT4lDQogIGNvbHVtbl9zcGVjKDUsIHdpZHRoID0gIjNjbSIsIGJvbGQgPSBUUlVFKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjMmMzZTUwIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0U4RjVFOSIpICU+JSAgIyBHcmVlbiBmb3IgbW9iaWxlDQogIHJvd19zcGVjKDIsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JSAgIyBCbHVlIGZvciBkZXNrdG9wDQogIHJvd19zcGVjKDMsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzVENDAzNyIpICU+JSAgIyBCcm93biBmb3IgdG90YWxzDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiUGF5bWVudCBNZXRob2QiID0gMywgIiAiID0gMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIk4gPSA0NDAgdG90YWwgdHJhbnNhY3Rpb25zIikNCmBgYA0KDQoqKkNhbGN1bGF0ZSBFeHBlY3RlZCBGcmVxdWVuY2llcyAoJEUkKSoqDQoNClRoZSBleHBlY3RlZCBmcmVxdWVuY3kgZm9yIGVhY2ggY2VsbCBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmb3JtdWxhOg0KDQokJEUgPSBcZnJhY3tcdGV4dHtSb3cgVG90YWx9IFx0aW1lcyBcdGV4dHtDb2x1bW4gVG90YWx9fXtcdGV4dHtHcmFuZCBUb3RhbCAoTil9fSQkDQoNCi0gKipNb2JpbGUgLyBFLVdhbGxldCoqOiAkXGZyYWN7MjUwIFx0aW1lcyAxODB9ezQ0MH0gXGFwcHJveCAxMDIuMjckDQoNCi0gKipNb2JpbGUgLyBDcmVkaXQgQ2FyZCoqOiAkXGZyYWN7MjUwIFx0aW1lcyAxNzB9ezQ0MH0gXGFwcHJveCA5Ni41OSQNCg0KLSAqKk1vYmlsZSAvIENPRCoqOiAkXGZyYWN7MjUwIFx0aW1lcyA5MH17NDQwfSBcYXBwcm94IDUxLjE0JA0KDQotICoqRGVza3RvcCAvIEUtV2FsbGV0Kio6ICRcZnJhY3sxOTAgXHRpbWVzIDE4MH17NDQwfSBcYXBwcm94IDc3LjczJA0KDQotICoqRGVza3RvcCAvIENyZWRpdCBDYXJkKio6ICRcZnJhY3sxOTAgXHRpbWVzIDE3MH17NDQwfSBcYXBwcm94IDczLjQxJA0KDQotICoqRGVza3RvcCAvIENPRCoqOiAkXGZyYWN7MTkwIFx0aW1lcyA5MH17NDQwfSBcYXBwcm94IDM4Ljg2JA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBleHBlY3RlZCBmcmVxdWVuY2llcyBtYXRyaXgNCmV4cGVjdGVkX21hdHJpeCA8LSBtYXRyaXgoDQogIGMoDQogICAgMTAyLjI3LCA5Ni41OSwgNTEuMTQsIDI1MCwNCiAgICA3Ny43MywgNzMuNDEsIDM4Ljg2LCAxOTAsDQogICAgMTgwLCAxNzAsIDkwLCA0NDANCiAgKSwNCiAgbnJvdyA9IDMsIGJ5cm93ID0gVFJVRSwNCiAgZGltbmFtZXMgPSBsaXN0KA0KICAgIGMoIk1vYmlsZSIsICJEZXNrdG9wIiwgIkNvbHVtbiBUb3RhbCIpLA0KICAgIGMoIkUtV2FsbGV0IiwgIkNyZWRpdCBDYXJkIiwgIkNPRCIsICJSb3cgVG90YWwiKQ0KICApDQopDQoNCiMgQ3JlYXRlIG9ic2VydmVkIG1hdHJpeCBmb3IgY29tcGFyaXNvbg0Kb2JzZXJ2ZWRfbWF0cml4IDwtIG1hdHJpeCgNCiAgYygNCiAgICAxMjAsIDgwLCA1MCwgMjUwLA0KICAgIDYwLCA5MCwgNDAsIDE5MCwNCiAgICAxODAsIDE3MCwgOTAsIDQ0MA0KICApLA0KICBucm93ID0gMywgYnlyb3cgPSBUUlVFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUoZXhwZWN0ZWRfbWF0cml4LCANCiAgICAgIGFsaWduID0gYygibCIsICJyIiwgInIiLCAiciIsICJyIiksDQogICAgICBjYXB0aW9uID0gIkV4cGVjdGVkIEZyZXF1ZW5jaWVzIChVbmRlciBJbmRlcGVuZGVuY2UgQXNzdW1wdGlvbikiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxNA0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDI6NSwgd2lkdGggPSAiM2NtIikgJT4lDQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzVENDAzNyIpICU+JQ0KICByb3dfc3BlYygxOjIsIGJhY2tncm91bmQgPSAiI0Y1RjVGNSIpICU+JQ0KICByb3dfc3BlYygzLCBib2xkID0gVFJVRSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiMzRTI3MjMiKSAlPiUNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJQYXltZW50IE1ldGhvZCIgPSAzLCAiICIgPSAxKSkgJT4lDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRm9ybXVsYTogRXhwZWN0ZWQgPSAoUm93IFRvdGFsIMOXIENvbHVtbiBUb3RhbCkgLyBHcmFuZCBUb3RhbCIpDQpgYGANCg0KKipDb21wdXRlIHRoZSBDaGktU3F1YXJlIFN0YXRpc3RpYyAoJFxjaGleMiQpKioNCg0KVXNpbmcgdGhlIGZvcm11bGEgJFxjaGleMiA9IFxzdW0gXGZyYWN7KE8gLSBFKV4yfXtFfSQsIHdoZXJlICRPJCBpcyB0aGUgb2JzZXJ2ZWQgZnJlcXVlbmN5Og0KDQoqKlN0ZXAgMTogQ2FsY3VsYXRlIEVhY2ggUGFydFdlIHdpbGwgY2FsY3VsYXRlIGVhY2ggZnJhY3Rpb24gb25lIGJ5IG9uZToqKg0KDQoqKlBhcnQgMToqKg0KJCRcZnJhY3soMTIwIC0gMTAyLjI3KV4yfXsxMDIuMjd9ID0gXGZyYWN7KDE3LjczKV4yfXsxMDIuMjd9ID0gXGZyYWN7MzE0LjM1fXsxMDIuMjd9IFxhcHByb3ggXG1hdGhiZnszLjA3NH0kJA0KDQoqKlBhcnQgMjoqKg0KJCRcZnJhY3soODAgLSA5Ni41OSleMn17OTYuNTl9ID0gXGZyYWN7KC0xNi41OSleMn17OTYuNTl9ID0gXGZyYWN7Mjc1LjIzfXs5Ni41OX0gXGFwcHJveCBcbWF0aGJmezIuODQ5fSQkDQoNCioqUGFydCAzOioqDQokJFxmcmFjeyg1MCAtIDUxLjE0KV4yfXs1MS4xNH0gPSBcZnJhY3soLTEuMTQpXjJ9ezUxLjE0fSA9IFxmcmFjezEuMzB9ezUxLjE0fSBcYXBwcm94IFxtYXRoYmZ7MC4wMjV9JCQNCioqUGFydCA0OioqDQokJFxmcmFjeyg2MCAtIDc3LjczKV4yfXs3Ny43M30gPSBcZnJhY3soLTE3LjczKV4yfXs3Ny43M30gPSBcZnJhY3szMTQuMzV9ezc3LjczfSBcYXBwcm94IFxtYXRoYmZ7NC4wNDR9JCQNCg0KKipQYXJ0IDU6KioNCiQkXGZyYWN7KDkwIC0gNzMuNDEpXjJ9ezczLjQxfSA9IFxmcmFjeygxNi41OSleMn17NzMuNDF9ID0gXGZyYWN7Mjc1LjIzfXs3My40MX0gXGFwcHJveCBcbWF0aGJmezMuNzQ5fSQkDQoNCioqUGFydCA2OioqDQokJFxmcmFjeyg0MCAtIDM4Ljg2KV4yfXszOC44Nn0gPSBcZnJhY3soMS4xNCleMn17MzguODZ9ID0gXGZyYWN7MS4zMH17MzguODZ9IFxhcHByb3ggXG1hdGhiZnswLjAzM30kJA0KKipTdGVwIDI6IEFkZCBVcCBBbGwgdGhlIFJlc3VsdHMqKg0KDQoqKk5vdyAgYWRkIHVwIGFsbCB0aGUgY2FsY3VsYXRlZCB2YWx1ZXM6KioNCiQkXGNoaV4yID0gMy4wNzQgKyAyLjg0OSArIDAuMDI1ICsgNC4wNDQgKyAzLjc0OSArIDAuMDMzJCQNCg0KJCRcY2hpXjIgXGFwcHJveCAxMy43NzQkJA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBjYWxjdWxhdGlvbiB0YWJsZQ0KY2hpX3NxdWFyZV9jYWxjIDwtIGRhdGEuZnJhbWUoDQogIGBDZWxsYCA9IGMoDQogICAgIk1vYmlsZSAvIEUtV2FsbGV0IiwNCiAgICAiTW9iaWxlIC8gQ3JlZGl0IENhcmQiLA0KICAgICJNb2JpbGUgLyBDT0QiLA0KICAgICJEZXNrdG9wIC8gRS1XYWxsZXQiLA0KICAgICJEZXNrdG9wIC8gQ3JlZGl0IENhcmQiLA0KICAgICJEZXNrdG9wIC8gQ09EIiwNCiAgICAiKipUT1RBTCAoz4fCsikqKiINCiAgKSwNCiAgYE9ic2VydmVkIChPKWAgPSBjKDEyMCwgODAsIDUwLCA2MCwgOTAsIDQwLCAi4oCUIiksDQogIGBFeHBlY3RlZCAoRSlgID0gYygxMDIuMjcsIDk2LjU5LCA1MS4xNCwgNzcuNzMsIDczLjQxLCAzOC44NiwgIuKAlCIpLA0KICBgTyAtIEVgID0gYygxNy43MywgLTE2LjU5LCAtMS4xNCwgLTE3LjczLCAxNi41OSwgMS4xNCwgIuKAlCIpLA0KICBgKE8gLSBFKcKyYCA9IGMoMzE0LjM1LCAyNzUuMjMsIDEuMzAsIDMxNC4zNSwgMjc1LjIzLCAxLjMwLCAi4oCUIiksDQogIGAoTyAtIEUpwrIgLyBFYCA9IGMoMy4wNzMsIDIuODUwLCAwLjAyNSwgNC4wNDQsIDMuNzQ5LCAwLjAzMywgIioqMTMuNzc0KioiKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKGNoaV9zcXVhcmVfY2FsYywgDQogICAgICBhbGlnbiA9IGMoImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIiksDQogICAgICBjYXB0aW9uID0gIkNoaS1TcXVhcmUgU3RhdGlzdGljIENhbGN1bGF0aW9uIiwNCiAgICAgIGVzY2FwZSA9IEZBTFNFKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwNCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsDQogICAgcG9zaXRpb24gPSAiY2VudGVyIiwNCiAgICBmb250X3NpemUgPSAxMw0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNWNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDI6Niwgd2lkdGggPSAiM2NtIikgJT4lDQogIGNvbHVtbl9zcGVjKDYsIGJvbGQgPSBUUlVFKSAlPiUNCiAgcm93X3NwZWMoMTozLCBiYWNrZ3JvdW5kID0gIiNFOEY1RTkiKSAlPiUgICMgR3JlZW4gZm9yIE1vYmlsZQ0KICByb3dfc3BlYyg0OjYsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JSAgIyBCbHVlIGZvciBEZXNrdG9wDQogIHJvd19zcGVjKDcsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzVENDAzNyIpICU+JSAgIyBCcm93biBmb3IgdG90YWwNCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICIgIiA9IDEsICIgIiA9IDEsICJDYWxjdWxhdGlvbiBTdGVwcyIgPSAzKSkgJT4lDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiRm9ybXVsYTogz4fCsiA9IM6jIFsoT+G1oiAtIEXhtaIpwrIgLyBF4bWiXSB3aGVyZSBPID0gT2JzZXJ2ZWQsIEUgPSBFeHBlY3RlZCIpDQpgYGANCg0KDQo0LiBEZXRlcm1pbmUgdGhlICoqcC12YWx1ZSoqIGF0ICRcYWxwaGEgPSAwLjA1JC4NCg0KDQpUbyBkZXRlcm1pbmUgdGhlIHAtdmFsdWUgZm9yIHRoaXMgQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZSwgd2UgdXNlIHRoZSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgQ2hpLVNxdWFyZSBzdGF0aXN0aWMgKDEkXGNoaV4yIFxhcHByb3ggMTMuNzc0JCkgYW5kIHRoZSBkZWdyZWVzIG9mIGZyZWVkb20uDQoNCioqRGVncmVlcyBvZiBGcmVlZG9tICgkZGYkKSoqDQoNClRoZSBkZWdyZWVzIG9mIGZyZWVkb20gZm9yIGEgY29udGluZ2VuY3kgdGFibGUgaXMgY2FsY3VsYXRlZCBhczokJGRmID0gKFx0ZXh0e1Jvd3N9IC0gMSkgXHRpbWVzIChcdGV4dHtDb2x1bW5zfSAtIDEpJCQkJGRmID0gKDIgLSAxKSBcdGltZXMgKDMgLSAxKSA9IDEgXHRpbWVzIDIgPSAyJCQNCg0KKipQLVZhbHVlIENhbGN1bGF0aW9uKioNCg0KVXNpbmcgdGhlIENoaS1TcXVhcmUgZGlzdHJpYnV0aW9uIHdpdGggJDIkIGRlZ3JlZXMgb2YgZnJlZWRvbSBhbmQgYSB0ZXN0IHN0YXRpc3RpYyBvZiAkMTMuNzc0JDoNCg0KLSBDaGktU3F1YXJlIFN0YXRpc3RpYyAoJFxjaGleMiQpOiAkMTMuNzczNiQNCg0KLSBQLXZhbHVlOiAkXGFwcHJveCAwLjAwMTAkDQoNCioqQ29uY2x1c2lvbiBhdCAkXGFscGhhID0gMC4wNSoqDQoNCi0gJFAtdmFsdWUgKCQwLjAwMTAkKSA8ICRcYWxwaGEkICgkMC4wNSQpDQoNClNpbmNlIHRoZSBwLXZhbHVlIGlzIHNpZ25pZmljYW50bHkgbGVzcyB0aGFuIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJDAuMDUkLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyAoJEhfMCQpLg0KDQoqKlJlc3VsdDoqKlRoZSBwLXZhbHVlIGlzICQwLjAwMTAkLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkZXZpY2UgdHlwZSB1c2VkIGFuZCB0aGUgY3VzdG9tZXIncyBwYXltZW50IG1ldGhvZCBwcmVmZXJlbmNlLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyAxLiBMb2FkIGxpYnJhcnkgeWFuZyBkaWJ1dHVoa2FuDQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KDQojIDIuIE1lbnlpYXBrYW4gZGF0YQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBQYXltZW50X01ldGhvZCA9IGMoIkUtV2FsbGV0IiwgIkNyZWRpdCBDYXJkIiwgIkNhc2ggb24gRGVsaXZlcnkiKSwNCiAgTW9iaWxlID0gYygxMjAsIDgwLCA1MCksDQogIERlc2t0b3AgPSBjKDYwLCA5MCwgNDApDQopDQoNCiMgMy4gTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIHBsb3RseQ0KZmlnIDwtIHBsb3RfbHkoZGF0YSwgeCA9IH5QYXltZW50X01ldGhvZCwgeSA9IH5Nb2JpbGUsIHR5cGUgPSAnYmFyJywgbmFtZSA9ICdNb2JpbGUnLA0KICAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICcjMWY3N2I0JykpICU+JQ0KICBhZGRfdHJhY2UoeSA9IH5EZXNrdG9wLCBuYW1lID0gJ0Rlc2t0b3AnLCBtYXJrZXIgPSBsaXN0KGNvbG9yID0gJyNmZjdmMGUnKSkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQYXltZW50IE1ldGhvZCBQcmVmZXJlbmNlIGJ5IERldmljZSBUeXBlIiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiUGF5bWVudCBNZXRob2QiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIFRyYW5zYWN0aW9ucyIpLA0KICAgIGJhcm1vZGUgPSAnZ3JvdXAnLCAjIE1lbWJ1YXQgYmFyIGJlcnNpc2lhbiAoZ3JvdXBlZCkNCiAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIkRldmljZSBUeXBlIikpDQogICkNCg0KIyA0LiBNZW5hbXBpbGthbiBwbG90DQpmaWcNCmBgYA0KDQoqKlZpc3VhbGl6YXRpb24gRXhwbGFuYXRpb246KioNCg0KLSAqKlgtYXhpcyAoSG9yaXpvbnRhbCk6KiogRGlzcGxheXMgcGF5bWVudCBtZXRob2QgY2F0ZWdvcmllcyAoRS1XYWxsZXQsIENyZWRpdCBDYXJkLCBDT0QpLg0KDQotICoqWS1heGlzIChWZXJ0aWNhbCk6KiogU2hvd3MgdGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgb3Igb2JzZXJ2YXRpb24gZnJlcXVlbmN5Lg0KDQotICoqQmFyIENvbG9yOioqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBtb2JpbGUgYW5kIGRlc2t0b3AgdXNlcnMuDQoNCi0gKipJbnRlcmFjdGl2aXR5OioqIEJlY2F1c2UgUGxvdGx5IGlzIHVzZWQsIHlvdSBjYW4gaG92ZXIgb3ZlciBlYWNoIGJhciBpbiBSU3R1ZGlvIFZpZXdlciB0byBzZWUgdGhlIGV4YWN0IG51bWJlcnMgaW4gZGV0YWlsLg0KDQo1LiBJbnRlcnByZXQgdGhlIHJlc3VsdHMgaW4gdGVybXMgb2YgKipkaWdpdGFsIHBheW1lbnQgc3RyYXRlZ3kqKi4NCiANCkJhc2VkIG9uIHRoZSBwcmV2aW91cyBDaGktU3F1YXJlIHRlc3QgcmVzdWx0cyAoJFxjaGleMiA9IDEzLjc3JCwgJHAgPCAwLjA1JCksIHdlIGhhdmUgc3RhdGlzdGljYWxseSBwcm92ZW4gdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuICoqZGV2aWNlIHR5cGUqKiBhbmQgKipwYXltZW50IG1ldGhvZCoqLiBIZXJlIGlzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGVzZSByZXN1bHRzIHRvIGZvcm11bGF0ZSBhICoqZGlnaXRhbCBwYXltZW50IHN0cmF0ZWd5KiogZm9yIGUtY29tbWVyY2UgY29tcGFuaWVzOg0KDQoqKiJNb2JpbGUtRmlyc3QiIE9wdGltaXphdGlvbiBmb3IgRS1XYWxsZXQqKg0KDQpEYXRhIHNob3dzIHRoZSBvdmVyd2hlbG1pbmcgZG9taW5hbmNlIG9mIE1vYmlsZSB1c2VycyBvbiBFLVdhbGxldCBtZXRob2RzICgxMjAgdnMgNjApLg0KDQoNCi0gKipTdHJhdGVneToqKiBDb21wYW5pZXMgc2hvdWxkIGVuc3VyZSB0aGUgZS13YWxsZXQgY2hlY2tvdXQgcHJvY2VzcyBpbiBtb2JpbGUgYXBwcyBpcyB2ZXJ5IHNtb290aCAoc3VjaCBhcyBvbmUtY2xpY2sgcGF5bWVudCBmZWF0dXJlcyBvciBiaW9tZXRyaWMgaW50ZWdyYXRpb24pLiBTaW5jZSBtb2JpbGUgdXNlcnMgdGVuZCB0byBwcmVmZXIgc3BlZWQsIGUtd2FsbGV0IGNhc2hiYWNrIHByb21vdGlvbmFsIGNhbXBhaWducyBzaG91bGQgYmUgdGFyZ2V0ZWQgc3BlY2lmaWNhbGx5IGF0IG1vYmlsZSBhcHAgdXNlcnMuDQoNCioqRGVza3RvcCBhcyBhIEhpZ2gtVmFsdWUgVHJhbnNhY3Rpb24gSHViIChDcmVkaXQgQ2FyZCkqKg0KDQoqKkRlc2t0b3AqKiB1c2VycyBhcmUgbW9yZSBsaWtlbHkgdG8gdXNlIENyZWRpdCBDYXJkcyAoOTApIHRoYW4gRS1XYWxsZXRzICg2MCksIGV2ZW4gc3VycGFzc2luZyBtb2JpbGUgY3JlZGl0IGNhcmQgdXNlcnMgKDgwKS4gDQoNCi0gKipTdHJhdGVneToqKiBEZXNrdG9wIHVzZXJzIG1heSBmZWVsIHNhZmVyIG1ha2luZyBsYXJnZSB0cmFuc2FjdGlvbnMgb3IgZW50ZXJpbmcgY2FyZCBkZXRhaWxzIG9uIGEgbGFyZ2VyIHNjcmVlbi4gVGhlIHJpZ2h0IHN0cmF0ZWd5IGlzIHRvIGhpZ2hsaWdodCBzZWN1cml0eSBmZWF0dXJlcyAoc3VjaCBhcyB0aGUgVmVyaWZpZWQgYnkgVmlzYSBvciBNYXN0ZXJjYXJkIElEIENoZWNrIGxvZ28pIGFuZCBvZmZlciBhIDAlIGluc3RhbGxtZW50IHByb2dyYW0gdGhhdCBpcyBtb3JlIHZpc2libGUgb24gdGhlIGRlc2t0b3Agd2ViIGRpc3BsYXkuDQoNCioqQ2FzaCBvbiBEZWxpdmVyeSAoQ09EKSoqDQoNCkV2YWx1YXRpb24gQ09EIGhhcyBhIHJlbGF0aXZlbHkgbG93IG51bWJlciBvbiBib3RoIGRldmljZXMsIGJ1dCBzdGlsbCBjb250cmlidXRlcy4NCg0KDQotICoqU3RyYXRlZ3k6KiogQmVjYXVzZSBDT0QgaXMgb3BlcmF0aW9uYWxseSByaXNraWVyIChoaWdoIHJldHVybnMpLCBjb21wYW5pZXMgY2FuIHNsb3dseSBzaGlmdCBDT0QgdXNlcnMgb24gbW9iaWxlIHRvIGUtd2FsbGV0cyBieSBwcm92aWRpbmcgIkZyZWUgU2hpcHBpbmciIGluY2VudGl2ZXMgb25seSBmb3IgZGlnaXRhbCBwYXltZW50cy4NCg0KKipVSS9VWCBQZXJzb25hbGl6YXRpb24gQmFzZWQgb24gRGV2aWNlKioNCg0KVGhlIHJlc3VsdHMgb2YgdGhpcyBpbmRlcGVuZGVuY2UgdGVzdCBzaG93IHRoYXQgY29uc3VtZXIgYmVoYXZpb3IgZGlmZmVycyBkZXBlbmRpbmcgb24gdGhlaXIgImVudHJ5IHBvaW50Ii4gDQoNCioqU3RyYXRlZ3k6KioNCg0KLSAqKk9uIE1vYmlsZToqKiBEaXNwbGF5IEUtV2FsbGV0IGFzIHRoZSBtYWluIHBheW1lbnQgb3B0aW9uICh0b3Btb3N0KS4NCg0KLSAqKk9uIERlc2t0b3A6KiogR2l2ZSBkaXNwbGF5IHByaW9yaXR5IHRvIENyZWRpdCBDYXJkIG9yIEJhbmsgVHJhbnNmZXIgb3B0aW9ucyB0aGF0IHJlcXVpcmUgbW9yZSBkZXRhaWxlZCB2ZXJpZmljYXRpb24uDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBzdHlsZWQgc2VnbWVudGF0aW9uIHRhYmxlDQpzdHJhdGVneV90YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBgRGV2aWNlIFNlZ21lbnRgID0gYygNCiAgICAi8J+TsSBNb2JpbGUiLA0KICAgICLwn5al77iPIERlc2t0b3AiLA0KICAgICLwn5OKIE92ZXJhbGwgU3RyYXRlZ3kiDQogICksDQogIGBQcmltYXJ5IEZvY3VzYCA9IGMoDQogICAgIlNwZWVkICYgQ29udmVuaWVuY2UiLA0KICAgICJTZWN1cml0eSAmIExhcmdlIFRyYW5zYWN0aW9ucyIsDQogICAgIlBlcnNvbmFsaXplZCBVc2VyIEV4cGVyaWVuY2UiDQogICksDQogIGBDb3JlIFZhbHVlIFByb3Bvc2l0aW9uYCA9IGMoDQogICAgIlF1aWNrLCBmcmljdGlvbmxlc3MgdHJhbnNhY3Rpb25zIGZvciBvbi10aGUtZ28gdXNlcnMiLA0KICAgICJTZWN1cmUsIGluZm9ybWVkIHB1cmNoYXNpbmcgZm9yIGhpZ2gtdmFsdWUgdHJhbnNhY3Rpb25zIiwNCiAgICAiU2VhbWxlc3MgY3Jvc3MtZGV2aWNlIGpvdXJuZXkgd2l0aCB0YWlsb3JlZCBvZmZlcmluZ3MiDQogICksDQogIGBLZXkgVGFjdGljc2AgPSBjKA0KICAgICLigKIgRS1XYWxsZXQgaW50ZWdyYXRpb25cbuKAoiBCaW9tZXRyaWMgYXV0aGVudGljYXRpb25cbuKAoiBPbmUtY2xpY2sgY2hlY2tvdXRcbuKAoiBQdXNoIG5vdGlmaWNhdGlvbnMiLA0KICAgIA0KICAgICLigKIgQ3JlZGl0IGNhcmQgcHJvbW90aW9uc1xu4oCiIEluc3RhbGxtZW50IHBsYW5zXG7igKIgRGV0YWlsZWQgcHJvZHVjdCBpbmZvXG7igKIgU2VjdXJpdHkgYmFkZ2VzIiwNCiAgICANCiAgICAi4oCiIFVuaWZpZWQgdXNlciBwcm9maWxlXG7igKIgQ3Jvc3MtZGV2aWNlIHN5bmNcbuKAoiBQZXJzb25hbGl6ZWQgcmVjb21tZW5kYXRpb25zXG7igKIgTG95YWx0eSBpbnRlZ3JhdGlvbiINCiAgKSwNCiAgYEV4cGVjdGVkIEltcGFjdGAgPSBjKA0KICAgICLihpEgTW9iaWxlIGNvbnZlcnNpb24gYnkgMTUtMjAlXG7ihpMgQ2FydCBhYmFuZG9ubWVudCBieSAyNSVcbuKGkSBBcHAgZW5nYWdlbWVudCBieSAzMCUiLA0KICAgICLihpEgQXZlcmFnZSBvcmRlciB2YWx1ZSBieSAyNS0zMCVcbuKGkSBDcmVkaXQgY2FyZCB1c2FnZSBieSA0MCVcbuKGkSBDdXN0b21lciB0cnVzdCBzY29yZXMiLA0KICAgICLihpEgQ3VzdG9tZXIgbGlmZXRpbWUgdmFsdWUgYnkgMzUlXG7ihpEgUmV0ZW50aW9uIHJhdGUgYnkgMjAlXG7ihpEgQ3Jvc3Mtc2VsbCBzdWNjZXNzIGJ5IDI1JSINCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKHN0cmF0ZWd5X3RhYmxlLCANCiAgICAgIGFsaWduID0gYygibCIsICJsIiwgImwiLCAibCIsICJsIiksDQogICAgICBjYXB0aW9uID0gIkRldmljZS1CYXNlZCBNYXJrZXRpbmcgJiBVWCBTdHJhdGVneSIsDQogICAgICBmb3JtYXQgPSAiaHRtbCIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDEzDQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjZjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICI2Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoNSwgd2lkdGggPSAiNmNtIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0U4RjVFOSIpICU+JSAgIyBHcmVlbiBmb3IgTW9iaWxlDQogIHJvd19zcGVjKDIsIGJhY2tncm91bmQgPSAiI0UzRjJGRCIpICU+JSAgIyBCbHVlIGZvciBEZXNrdG9wDQogIHJvd19zcGVjKDMsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzVENDAzNyIpICU+JSAgIyBCcm93biBmb3Igb3ZlcmFsbA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIlN0cmF0ZWdpYyBGb2N1cyIgPSAxLCAiVmFsdWUgUHJvcG9zaXRpb24iID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24gVGFjdGljcyIgPSAxLCAiQnVzaW5lc3MgSW1wYWN0IiA9IDEpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJCYXNlZCBvbiBjaGktc3F1YXJlIGFuYWx5c2lzIHNob3dpbmcgc2lnbmlmaWNhbnQgZGV2aWNlIMOXIHBheW1lbnQgbWV0aG9kIGFzc29jaWF0aW9uICjPh8KyPTEzLjc3LCBwPDAuMDEpIikNCmBgYA0KDQoNCg0KIyBDYXNlIFN0dWR5IDUgIA0KIyMgVHlwZSBJIGFuZCBUeXBlIElJIEVycm9ycyAoQ29uY2VwdHVhbCkNCg0KQSAqKmZpbnRlY2ggc3RhcnR1cCoqIHRlc3RzIHdoZXRoZXIgYSAqKm5ldyBmcmF1ZCBkZXRlY3Rpb24gYWxnb3JpdGhtKiogcmVkdWNlcyBmcmF1ZHVsZW50IHRyYW5zYWN0aW9ucy4NCg0KLSAqKkjigoA6KiogVGhlIG5ldyBhbGdvcml0aG0gZG9lcyAqKm5vdCByZWR1Y2UgZnJhdWQqKi4NCi0gKipI4oKBOioqIFRoZSBuZXcgYWxnb3JpdGhtICoqcmVkdWNlcyBmcmF1ZCoqLg0KDQojIyBUYXNrcw0KDQoxLiBFeHBsYWluIGEgKipUeXBlIEkgRXJyb3IgKM6xKSoqIGluIHRoaXMgY29udGV4dC4NCjIuIEV4cGxhaW4gYSAqKlR5cGUgSUkgRXJyb3IgKM6yKSoqIGluIHRoaXMgY29udGV4dC4NCjMuIElkZW50aWZ5IHdoaWNoIGVycm9yIGlzICoqbW9yZSBjb3N0bHkgZnJvbSBhIGJ1c2luZXNzIHBlcnNwZWN0aXZlKiouDQo0LiBEaXNjdXNzIGhvdyAqKnNhbXBsZSBzaXplKiogYWZmZWN0cyBUeXBlIElJIEVycm9yLg0KNS4gRXhwbGFpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gKirOsSwgzrIsIGFuZCBzdGF0aXN0aWNhbCBwb3dlcioqLg0KDQoNCiMjIEFuc3dlciBDYXNlIFN0dWR5IDUNCg0KMS4gIEV4cGxhaW4gYSAqKlR5cGUgSSBFcnJvciAozrEpKiogaW4gdGhpcyBjb250ZXh0Lg0KDQoqKkRlZmluaXRpb24gb2YgVHlwZSBJIEVycm9yICgkXGFscGhhJClBKioNCg0KVHlwZSBJIEVycm9yIG9jY3VycyB3aGVuIHRoZSBudWxsIGh5cG90aGVzaXMgKCRIXzAkKSBpcyB0cnVlLCBidXQgd2UgaW5jb3JyZWN0bHkgcmVqZWN0IGl0LjQgSXQgaXMgZXNzZW50aWFsbHkgYSAiZmFsc2UgcG9zaXRpdmUiIGF0IHRoZSBzdHJhdGVnaWMgbGV2ZWwuDQoNCioqSW4gVGhpcyBDb250ZXh0OioqDQoNCkluIHlvdXIgZnJhdWQgZGV0ZWN0aW9uIGNhc2Ugc3R1ZHksIGEgVHlwZSBJIEVycm9yIHdvdWxkIGxvb2sgbGlrZSB0aGlzOg0KDQotICoqVGhlIFJlYWxpdHk6KiogVGhlIG5ldyBhbGdvcml0aG0gaXMgbm90IGVmZmVjdGl2ZS4gSXQgZG9lcyBub3QgYWN0dWFsbHkgcmVkdWNlIHRoZSByYXRlIG9mIGZyYXVkdWxlbnQgdHJhbnNhY3Rpb25zIGNvbXBhcmVkIHRvIHRoZSBjdXJyZW50IHN5c3RlbS4gKCRIXzAkIGlzIHRydWUpLg0KDQotICoqVGhlIERlY2lzaW9uOioqIEJhc2VkIG9uIHRoZSB0ZXN0IGRhdGEsIHRoZSBzdGFydHVwIGNvbmNsdWRlcyB0aGF0IHRoZSBhbGdvcml0aG0gaXMgZWZmZWN0aXZlIGFuZCByZWR1Y2VzIGZyYXVkLiAoUmVqZWN0ICRIXzAkKS4NCg0KLSAqKlRoZSBFcnJvcjoqKiBUaGUgc3RhcnR1cCBiZWxpZXZlcyB0aGV5IGhhdmUgZm91bmQgYSAid2lubmVyIiBhbmQgaW1wbGVtZW50cyB0aGUgbmV3IGFsZ29yaXRobSwgd2hlbiBpbiBmYWN0LCB0aGUgcmVzdWx0cyB0aGV5IHNhdyB3ZXJlIGxpa2VseSBkdWUgdG8gcmFuZG9tIGNoYW5jZSBvciBhIGJpYXNlZCBzYW1wbGUuDQoNCioqQnVzaW5lc3MgQ29uc2VxdWVuY2VzIG9mIGEgVHlwZSBJIEVycm9yKioNCg0KRm9yIGEgZmludGVjaCBzdGFydHVwLCBtYWtpbmcgYSBUeXBlIEkgRXJyb3IgY2FuIGJlIHF1aXRlIGNvc3RseSBiZWNhdXNlIGl0IGxlYWRzIHRvIHVuanVzdGlmaWVkIGFjdGlvbi4gVGhlIGNvbnNlcXVlbmNlcyBpbmNsdWRlOg0KDQotICoqV2FzdGVkIFJlc291cmNlczoqKiBUaGUgY29tcGFueSBzcGVuZHMgdGltZSwgZW5naW5lZXJpbmcgZWZmb3J0LCBhbmQgbW9uZXkgZGVwbG95aW5nIGFuZCBtYWludGFpbmluZyBhbiBhbGdvcml0aG0gdGhhdCBwcm92aWRlcyBubyByZWFsIGJlbmVmaXQuDQoNCi0gKipGYWxzZSBTZW5zZSBvZiBTZWN1cml0eToqKiBUaGUgc3RhcnR1cCBtYXkgc3RvcCBsb29raW5nIGZvciBvdGhlciBmcmF1ZCBzb2x1dGlvbnMsIGJlbGlldmluZyB0aGUgcHJvYmxlbSBpcyBzb2x2ZWQsIHdoaWxlIGZyYXVkdWxlbnQgdHJhbnNhY3Rpb25zIGNvbnRpbnVlIGF0IHRoZSBzYW1lIHJhdGUuDQoNCi0gKipPcGVyYXRpb25hbCBSaXNrOioqIElmIHRoZSBuZXcgYWxnb3JpdGhtIGlzICJzdHJpY3RlciIgYnV0IG5vdCAic21hcnRlciwiIGl0IG1pZ2h0IGluY3JlYXNlIEZhbHNlIFBvc2l0aXZlcyBhdCB0aGUgdHJhbnNhY3Rpb24gbGV2ZWwgKGJsb2NraW5nIGxlZ2l0aW1hdGUgY3VzdG9tZXJzKSwgbGVhZGluZyB0byBjdXN0b21lciBmcnVzdHJhdGlvbiBhbmQgbG9zdCByZXZlbnVlLCB3aXRob3V0IGFjdHVhbGx5IGNhdGNoaW5nIG1vcmUgZnJhdWQuDQoNCi0gKipLZXkgVGFrZWF3YXk6KiogSWYgdGhlIHN0YXJ0dXAgc2V0cyBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAkXGFscGhhID0gMC4wNSQsIHRoZXkgYXJlIGFjY2VwdGluZyBhIDUlIHJpc2sgb2YgY29tbWl0dGluZyB0aGlzIGVycm9y4oCUZXNzZW50aWFsbHkgc2F5aW5nIHRoZXkgYXJlIG9rYXkgd2l0aCBhIDUlIGNoYW5jZSBvZiBhZG9wdGluZyBhICJkdWQiIGFsZ29yaXRobS4NCg0KMi4gIEV4cGxhaW4gYSAqKlR5cGUgSUkgRXJyb3IgKM6yKSoqIGluIHRoaXMgY29udGV4dC4NCg0KKipEZWZpbml0aW9uIG9mIFR5cGUgSUkgRXJyb3IgKCRcYmV0YSQpQSoqDQoNClR5cGUgSUkgRXJyb3Igb2NjdXJzIHdoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyAoNCRIXzAkKSBpcyBmYWxzZSwgYnV0IHdlIGZhaWwgdG8gcmVqZWN0IGl0LjUgSW4gc2ltcGxlciB0ZXJtcywgdGhlIG5ldyBhbGdvcml0aG0gYWN0dWFsbHkgd29ya3MsIGJ1dCB5b3VyIHRlc3QgcmVzdWx0cyBhcmUgbm90IHN0cm9uZyBlbm91Z2ggdG8gcHJvdmUgaXQsIHNvIHlvdSBjb25jbHVkZSBpdCdzIGEgZmFpbHVyZS4NCg0KKipJbiBUaGlzIENvbnRleHQ6KioNCg0KSW4geW91ciBmcmF1ZCBkZXRlY3Rpb24gY2FzZSBzdHVkeSwgYSBUeXBlIElJIEVycm9yIHdvdWxkIGxvb2sgbGlrZSB0aGlzOg0KDQotICoqVGhlIFJlYWxpdHk6KiogVGhlIG5ldyBhbGdvcml0aG0gaXMgaGlnaGx5IGVmZmVjdGl2ZS4gSXQgdHJ1bHkgcmVkdWNlcyBmcmF1ZCBhbmQgd291bGQgc2F2ZSB0aGUgY29tcGFueSBzaWduaWZpY2FudCBtb25leS4gKCRIXzAkIGlzIGZhbHNlOyAkSF8xJCBpcyB0cnVlKS4NCg0KXyAqKlRoZSBEZWNpc2lvbjoqKiBCYXNlZCBvbiB0aGUgdGVzdCBkYXRhIChwZXJoYXBzIGR1ZSB0byBhIHNtYWxsIHNhbXBsZSBzaXplIG9yIGEgbG93IHNpZ25pZmljYW5jZSBsZXZlbCksIHRoZSBzdGFydHVwIGNvbmNsdWRlcyB0aGF0IHRoZSBhbGdvcml0aG0gZG9lcyBub3Qgc2hvdyBhIHNpZ25pZmljYW50IGltcHJvdmVtZW50LiAoRmFpbCB0byByZWplY3QgJEhfMCQpLg0KDQotICoqVGhlIEVycm9yOioqIFRoZSBzdGFydHVwIHNoZWx2ZXMgYSBzdXBlcmlvciBwaWVjZSBvZiB0ZWNobm9sb2d5IGFuZCBjb250aW51ZXMgdXNpbmcgYW4gaW5mZXJpb3Igb3Igb3V0ZGF0ZWQgZnJhdWQgZGV0ZWN0aW9uIHN5c3RlbS4NCg0KKipCdXNpbmVzcyBDb25zZXF1ZW5jZXMgb2YgYSBUeXBlIElJIEVycm9yKioNCg0KV2hpbGUgYSBUeXBlIEkgZXJyb3IgbGVhZHMgdG8gIndhc3RlZCBlZmZvcnQsIiBhIFR5cGUgSUkgZXJyb3IgbGVhZHMgdG8gIm1pc3NlZCBvcHBvcnR1bml0aWVzLiIgRm9yIGEgZmludGVjaCBjb21wYW55LCB0aGlzIGlzIG9mdGVuIHRoZSBtb3JlIGRhbmdlcm91cyBlcnJvcjoNCg0KLSAqKkZpbmFuY2lhbCBMb3NzOioqIFRoZSBjb21wYW55IGNvbnRpbnVlcyB0byBsb3NlIG1vbmV5IHRvIGZyYXVkdWxlbnQgdHJhbnNhY3Rpb25zIHRoYXQgdGhlIG5ldyBhbGdvcml0aG0gY291bGQgaGF2ZSBjYXVnaHQuDQoNCi0gKipDb21wZXRpdGl2ZSBEaXNhZHZhbnRhZ2U6KiogSWYgYSBjb21wZXRpdG9yIGRldmVsb3BzIGFuZCBzdWNjZXNzZnVsbHkgaW1wbGVtZW50cyBhIHNpbWlsYXIgYWxnb3JpdGhtLCB0aGV5IHdpbGwgaGF2ZSBsb3dlciBmcmF1ZCBjb3N0cyBhbmQgY2FuIG9mZmVyIGJldHRlciByYXRlcyB0byBjdXN0b21lcnMsIHBvdGVudGlhbGx5IGRyaXZpbmcgdGhlIHN0YXJ0dXAgb3V0IG9mIHRoZSBtYXJrZXQuDQoNCi0gKipTdGFnbmF0aW9uOioqIFRoZSBzdGFydHVwIHJlbWFpbnMgc3R1Y2sgd2l0aCAibGVnYWN5IiBydWxlcyB0aGF0IGFyZSBlYXNpbHkgYnlwYXNzZWQgYnkgc29waGlzdGljYXRlZCBtb2Rlcm4gZnJhdWQgdGFjdGljcywgZmFpbGluZyB0byBldm9sdmUgd2l0aCB0aGUgdGhyZWF0IGxhbmRzY2FwZS4NCg0KKipUaGUgUmVsYXRpb25zaGlwIHRvIFN0YXRpc3RpY2FsIFBvd2VyKioNCg0KVGhlIHByb2JhYmlsaXR5IG9mIG5vdCBtYWtpbmcgYSBUeXBlIElJIGVycm9yIGlzIGNhbGxlZCBTdGF0aXN0aWNhbCBQb3dlciAoOCQxIC0gXGJldGEkKS4NCg0KLSBJZiB5b3VyIHRlc3QgaGFzICoqbG93IHBvd2VyKiosIHlvdSBoYXZlIGEgaGlnaCByaXNrIG9mIDEwJFxiZXRhJC4NCg0KLSBUaGlzIHVzdWFsbHkgaGFwcGVucyBpZiB0aGUgc2FtcGxlIHNpemUgaXMgdG9vIHNtYWxsIG9yIGlmIHRoZSBlZmZlY3QgKHRoZSByZWR1Y3Rpb24gaW4gZnJhdWQpIGlzIHN1YnRsZSBhbmQgaGFyZCB0byBkZXRlY3QgYWdhaW5zdCB0aGUgIm5vaXNlIiBvZiBkYWlseSB0cmFuc2FjdGlvbnMuDQoNCi0gKipLZXkgVGFrZWF3YXk6KiogQSBUeXBlIElJIGVycm9yIGlzIGxpa2UgYSBmaXJlIGFsYXJtIHRoYXQgZmFpbHMgdG8gZ28gb2ZmIHdoZW4gdGhlcmUgaXMgYWN0dWFsbHkgYSBmaXJlLjEzIFRoZSAiZmlyZSIgKGZyYXVkKSBjb250aW51ZXMgdG8gYnVybiB5b3VyIGNhcGl0YWwgYmVjYXVzZSB5b3UgdGhvdWdodCBldmVyeXRoaW5nIHdhcyBmaW5lLg0KDQozLiAgSWRlbnRpZnkgd2hpY2ggZXJyb3IgaXMgKiptb3JlIGNvc3RseSBmcm9tIGEgYnVzaW5lc3MgcGVyc3BlY3RpdmUqKi4NCg0KSGVyZSBpcyBhIGJyZWFrZG93biBvZiB3aHkgdGhlICJGYWxzZSBOZWdhdGl2ZSIgKFR5cGUgSUkpIHR5cGljYWxseSBjYXJyaWVzIGEgaGlnaGVyIHByaWNlIHRhZyB0aGFuIHRoZSAiRmFsc2UgUG9zaXRpdmUiIChUeXBlIEkpLg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsbCBpZiBuZWVkZWQ6IGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBDcmVhdGUgc3R5bGVkIGVycm9yIHR5cGVzIHRhYmxlDQplcnJvcl90eXBlcyA8LSBkYXRhLmZyYW1lKA0KICBgRXJyb3IgVHlwZWAgPSBjKA0KICAgICJUeXBlIEkgKEFscGhhKSBFcnJvciIsDQogICAgIlR5cGUgSUkgKEJldGEpIEVycm9yIiwNCiAgICAiVHlwZSBJIHZzIFR5cGUgSUkgVHJhZGUtb2ZmIg0KICApLA0KICBgU3RhdGlzdGljYWwgQ29uY2VwdGAgPSBjKA0KICAgICJGYWxzZSBQb3NpdGl2ZSIsDQogICAgIkZhbHNlIE5lZ2F0aXZlIiwNCiAgICAizrEgdnMgzrIgQmFsYW5jZSINCiAgKSwNCiAgYEJ1c2luZXNzIFNjZW5hcmlvYCA9IGMoDQogICAgIkFkb3B0aW5nIGluZWZmZWN0aXZlIGZyYXVkIGRldGVjdGlvbiIsDQogICAgIlJlamVjdGluZyBlZmZlY3RpdmUgZnJhdWQgZGV0ZWN0aW9uIiwNCiAgICAiQ2hvb3NpbmcgcmlzayB0b2xlcmFuY2UgbGV2ZWwiDQogICksDQogIGBIeXBvdGhlc2lzIFRlc3QgT3V0Y29tZWAgPSBjKA0KICAgICJSZWplY3QgSOKCgCB3aGVuIEjigoAgaXMgdHJ1ZSIsDQogICAgIkZhaWwgdG8gcmVqZWN0IEjigoAgd2hlbiBI4oKAIGlzIGZhbHNlIiwNCiAgICAiU2V0dGluZyBzaWduaWZpY2FuY2UgbGV2ZWwgKM6xKSINCiAgKSwNCiAgYEJ1c2luZXNzIEltcGFjdGAgPSBjKA0KICAgICI8Yj5TdW5rIENvc3RzOjwvYj48YnI+4oCiIERldmVsb3BtZW50IHJlc291cmNlcyB3YXN0ZWQ8YnI+4oCiIE1haW50ZW5hbmNlIGNvc3RzIGluY3VycmVkPGJyPuKAoiBDdXN0b21lciB0cnVzdCBlcm9kZWQiLA0KICAgICI8Yj5PcHBvcnR1bml0eSBDb3N0czo8L2I+PGJyPuKAoiBPbmdvaW5nIGZyYXVkIGxvc3Nlczxicj7igKIgUmVndWxhdG9yeSBwZW5hbHRpZXM8YnI+4oCiIENvbXBldGl0aXZlIGRpc2FkdmFudGFnZSIsDQogICAgIjxiPlN0cmF0ZWdpYyBEZWNpc2lvbjo8L2I+PGJyPuKAoiBSaXNrIGFwcGV0aXRlIGRldGVybWluYXRpb248YnI+4oCiIFJlc291cmNlIGFsbG9jYXRpb248YnI+4oCiIENvbXBldGl0aXZlIHBvc2l0aW9uaW5nIg0KICApLA0KICBgUmVjb21tZW5kZWQgTWl0aWdhdGlvbmAgPSBjKA0KICAgICLigKIgQ29uc2VydmF0aXZlIM6xIGxldmVscyAoMC4wMSk8YnI+4oCiIEV4dGVuc2l2ZSB0ZXN0aW5nPGJyPuKAoiBQaGFzZWQgcm9sbG91dCIsDQogICAgIuKAoiBBZGVxdWF0ZSBzdGF0aXN0aWNhbCBwb3dlcjxicj7igKIgQ29udGludW91cyBtb25pdG9yaW5nPGJyPuKAoiBTZW5zaXRpdml0eSBjaGVja3MiLA0KICAgICLigKIgQ29zdC1iZW5lZml0IGFuYWx5c2lzPGJyPuKAoiBTdGFrZWhvbGRlciBhbGlnbm1lbnQ8YnI+4oCiIEl0ZXJhdGl2ZSByZWZpbmVtZW50Ig0KICApLA0KICBjaGVjay5uYW1lcyA9IEZBTFNFDQopDQoNCiMgQ3JlYXRlIHN0eWxlZCB0YWJsZQ0Ka2FibGUoZXJyb3JfdHlwZXMsIA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImMiLCAibCIsICJsIiwgImwiLCAibCIpLA0KICAgICAgY2FwdGlvbiA9ICJTdGF0aXN0aWNhbCBFcnJvciBUeXBlczogQnVzaW5lc3MgSW1wbGljYXRpb25zICYgTWl0aWdhdGlvbiIsDQogICAgICBmb3JtYXQgPSAiaHRtbCIsDQogICAgICBlc2NhcGUgPSBGQUxTRSkgJT4lDQogIGthYmxlX3N0eWxpbmcoDQogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciIsDQogICAgZm9udF9zaXplID0gMTMNCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjRjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIzY20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDQsIHdpZHRoID0gIjRjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg1LCB3aWR0aCA9ICI2Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoNiwgd2lkdGggPSAiNWNtIikgJT4lDQogIHJvd19zcGVjKDEsIGJhY2tncm91bmQgPSAiI0ZGRUJFRSIpICU+JSAgIyBSZWQgZm9yIFR5cGUgSQ0KICByb3dfc3BlYygyLCBiYWNrZ3JvdW5kID0gIiNGRkYzQ0QiKSAlPiUgICMgWWVsbG93IGZvciBUeXBlIElJDQogIHJvd19zcGVjKDMsIGJvbGQgPSBUUlVFLCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzVENDAzNyIpICU+JSAgIyBCcm93biBmb3IgdHJhZGUtb2ZmDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiU3RhdGlzdGljYWwiID0gMSwgIkJ1c2luZXNzIENvbnRleHQiID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAiVGVzdCBPdXRjb21lIiA9IDEsICJDb25zZXF1ZW5jZXMiID0gMSwgIlJpc2sgTWFuYWdlbWVudCIgPSAxKSkgJT4lDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiVHlwZSBJIEVycm9yICjOsSk6IEZhbHNlIGFsYXJtIHwgVHlwZSBJSSBFcnJvciAozrIpOiBNaXNzZWQgZGV0ZWN0aW9uIHwgUG93ZXIgKDEtzrIpOiBDb3JyZWN0IGRldGVjdGlvbiIpDQpgYGANCg0KKipUeXBlIElJIGlzIHVzdWFsbHkgIk1vcmUgQ29zdGx5IioqDQoNCg0KSW4gZmludGVjaCwgZnJhdWQgaXMgb2Z0ZW4gYW4gKipleGlzdGVudGlhbCB0aHJlYXQqKi4gSGVyZSBhcmUgdGhyZWUgcmVhc29ucyB3aHkgbWlzc2luZyBvdXQgb24gYSB3b3JraW5nIGFsZ29yaXRobSAoVHlwZSBJSSkgaXMgd29yc2U6DQoNCi0gKipEaXJlY3QgQ2FwaXRhbCBMb3NzOioqIEZyYXVkIHJlcHJlc2VudHMgYSBkaXJlY3QgaGl0IHRvIHRoZSBib3R0b20gbGluZS4gSWYgdGhlIG5ldyBhbGdvcml0aG0gaGFkIHRoZSBwb3RlbnRpYWwgdG8gcmVkdWNlIGZyYXVkIGJ5IDIwJSwgZXZlcnkgZGF5IHRoZSBzdGFydHVwIGNvbW1pdHMgYSBUeXBlIElJIGVycm9yLCBpdCBpcyBlZmZlY3RpdmVseSAiYnVybmluZyIgbW9uZXkgdGhhdCBpdCBkaWRuJ3QgaGF2ZSB0by4NCg0KLSAqKlNjYWxhYmlsaXR5IFJpc2s6KiogU3RhcnR1cHMgbmVlZCB0byBzY2FsZSBmYXN0LiBJZiB5b3UgZmFpbCB0byBpbXBsZW1lbnQgYSB3b3JraW5nIGZyYXVkIHJlZHVjdGlvbiB0b29sLCB5b3VyIGxvc3NlcyB3aWxsIGdyb3cgZXhwb25lbnRpYWxseSBhcyB5b3VyIHVzZXIgYmFzZSBncm93cywgcG90ZW50aWFsbHkgbGVhZGluZyB0byBiYW5rcnVwdGN5IG9yIHRoZSBsb3NzIG9mIGJhbmtpbmcgbGljZW5zZXMuDQoNCi0gKipUaGUgIlNhZmV0eSBOZXQiIG9mIFR5cGUgSToqKiBJZiB5b3UgY29tbWl0IGEgVHlwZSBJIGVycm9yIGFuZCBkZXBsb3kgYSB1c2VsZXNzIGFsZ29yaXRobSwgeW91IHVzdWFsbHkgZmluZCBvdXQgZXZlbnR1YWxseSB0aHJvdWdoIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuIFlvdSBjYW4gdGhlbiByZXZlcnQgdG8gdGhlIG9sZCBzeXN0ZW0uIFRoZSBjb3N0IGlzIGxpbWl0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRpbWUuIEhvd2V2ZXIsIGlmIHlvdSBjb21taXQgYSBUeXBlIElJIGVycm9yLCB5b3UgKipuZXZlciBrbm93Kiogd2hhdCB5b3UgbWlzc2VkLCBhbmQgdGhlIGZyYXVkIGNvbnRpbnVlcyB1bmFiYXRlZC4NCg0KKipUaGUgT25lIEV4Y2VwdGlvbioqDQoNCkEgKipUeXBlIEkgRXJyb3IqKiBjb3VsZCBiZSBtb3JlIGNvc3RseSBvbmx5IGlmIHRoZSBuZXcgYWxnb3JpdGhtIGlzIHNvIGFnZ3Jlc3NpdmUgdGhhdCBpdCB0cmlnZ2VycyBhIG1hc3NpdmUgd2F2ZSBvZiAqKkZhbHNlIFBvc2l0aXZlcyBhdCB0aGUgdHJhbnNhY3Rpb24gbGV2ZWwqKiAoYmxvY2tpbmcgbGVnaXRpbWF0ZSBjdXN0b21lcnMpLiBUaGlzIHdvdWxkIGxlYWQgdG8gImNodXJuIiAoY3VzdG9tZXJzIGxlYXZpbmcgdGhlIHBsYXRmb3JtKSwgd2hpY2ggY2FuIGJlIGhhcmRlciB0byByZWNvdmVyIGZyb20gdGhhbiB0aGUgZnJhdWQgaXRzZWxmLg0KDQoqKkZpbmFsIFZlcmRpY3QqKg0KDQpGb3IgbW9zdCBmaW50ZWNoIHN0YXJ0dXBzLCAqKlR5cGUgSUkgaXMgdGhlIGdyZWF0ZXIgcmlzay4qKiBUaGUgZ29hbCBvZiB0aGUgc3RhcnR1cCBzaG91bGQgYmUgdG8gbWF4aW1pemUgKipTdGF0aXN0aWNhbCBQb3dlcioqLCBlbnN1cmluZyB0aGF0IGlmIGEgc29sdXRpb24gdG8gdGhlaXIgZnJhdWQgcHJvYmxlbSBleGlzdHMsIHRoZXkgYXJlIGNhcGFibGUgb2YgZGV0ZWN0aW5nIGl0IGFuZCBwdXR0aW5nIGl0IGludG8gcHJvZHVjdGlvbi4NCg0KDQo0LiBEaXNjdXNzIGhvdyAqKnNhbXBsZSBzaXplKiogYWZmZWN0cyBUeXBlIElJIEVycm9yDQoNClRoZSByZWxhdGlvbnNoaXAgaXMgaW52ZXJzZTogYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgdGhlIHByb2JhYmlsaXR5IG9mIGEgVHlwZSBJSSBFcnJvciBkZWNyZWFzZXMuDQoNCioqVGhlIFN0YXRpc3RpY2FsIFJlbGF0aW9uc2hpcCoqDQoNClRoZSBwcm9iYWJpbGl0eSBvZiBhIFR5cGUgSUkgRXJyb3IgaXMgdGllZCBkaXJlY3RseSB0byBTdGF0aXN0aWNhbCBQb3dlciAoJDEgLSBcYmV0YSQpLg0KDQoxLiAqKlNtYWxsIFNhbXBsZSBTaXplOioqIExlYWRzIHRvICJub2lzeSIgZGF0YSB3aXRoIGEgd2lkZSBzdGFuZGFyZCBlcnJvci4gSXQgaXMgZGlmZmljdWx0IHRvIHRlbGwgaWYgYSBzbGlnaHQgZHJvcCBpbiBmcmF1ZCBpcyBhIHJlYWwgcmVzdWx0IG9mIHRoZSBhbGdvcml0aG0gb3IganVzdCBhIHJhbmRvbSBmbHVrZSBpbiB0aGF0IGRheSdzIHRyYW5zYWN0aW9ucy4gVGhpcyByZXN1bHRzIGluICoqaGlnaCoqICRcYmV0YSQgKGhpZ2ggcmlzayBvZiBhIEZhbHNlIE5lZ2F0aXZlKS4NCg0KMi4gKipMYXJnZSBTYW1wbGUgU2l6ZToqKiBSZWR1Y2VzIHRoZSBzdGFuZGFyZCBlcnJvciwgbWFraW5nIHRoZSB0ZXN0IG1vcmUgInNlbnNpdGl2ZS4iIEl0IG5hcnJvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdGVzdCByZXN1bHRzLCBhbGxvd2luZyB0aGUgc3RhcnR1cCB0byBkZXRlY3QgZXZlbiBzbWFsbCBpbXByb3ZlbWVudHMgaW4gZnJhdWQgcmVkdWN0aW9uLjggVGhpcyByZXN1bHRzIGluICoqbG93KiogJFxiZXRhJCAobG93IHJpc2sgb2YgYSBGYWxzZSBOZWdhdGl2ZSkuDQoNCioqU2FtcGxlIFNpemUgTWF0dGVycyBmb3IgRnJhdWQgRGV0ZWN0aW9uKioNCg0KRnJhdWR1bGVudCB0cmFuc2FjdGlvbnMgYXJlIG9mdGVuICoqInJhcmUgZXZlbnRzIiAqKihlLmcuLCBvbmx5IDAuMSUgb2YgYWxsIHRyYW5zYWN0aW9ucykuDQoNCi0gKipUaGUgUHJvYmxlbToqKiBJZiB0aGUgc3RhcnR1cCBvbmx5IHRlc3RzIHRoZSBhbGdvcml0aG0gb24gMSwwMDAgdHJhbnNhY3Rpb25zLCB0aGV5IG1pZ2h0IG9ubHkgc2VlIDEgZnJhdWQgY2FzZSBieSBjaGFuY2UuIEV2ZW4gaWYgdGhlIGFsZ29yaXRobSBpcyBwZXJmZWN0LCAxIGNhc2UgaXNuJ3QgZW5vdWdoIGRhdGEgdG8gcHJvdmUgaXQgd29ya3MuDQoNCi0gKipUaGUgU29sdXRpb246KiogQnkgaW5jcmVhc2luZyB0aGUgc2FtcGxlIHNpemUgdG8gMSwwMDAsMDAwIHRyYW5zYWN0aW9ucywgdGhlIHN0YXJ0dXAgbWlnaHQgc2VlIDEsMDAwIGZyYXVkIGNhc2VzLiBXaXRoIHRoaXMgbXVjaCBkYXRhLCB0aGV5IGNhbiBzdGF0aXN0aWNhbGx5IHByb3ZlIHdoZXRoZXIgdGhlIGFsZ29yaXRobSByZWR1Y2VkIHRoYXQgbnVtYmVyIHRvIDgwMCAoYSAyMCUgcmVkdWN0aW9uKSB3aXRoIGhpZ2ggY29uZmlkZW5jZS4NCg0KKipUaGUgVHJhZGUtb2ZmcyBvZiBJbmNyZWFzaW5nIFNhbXBsZSBTaXplKioNCg0KV2hpbGUgYSBsYXJnZXIgc2FtcGxlIHNpemUgcmVkdWNlcyB0aGUgcmlzayBvZiBtaXNzaW5nIGEgZ3JlYXQgYWxnb3JpdGhtIChUeXBlIElJIEVycm9yKSwgaXQgY29tZXMgd2l0aCBwcmFjdGljYWwgYnVzaW5lc3MgY29zdHM6DQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxsIGlmIG5lZWRlZDogaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIENyZWF0ZSBzdHlsZWQgZWZmZWN0cyB0YWJsZQ0Kc2FtcGxlX2VmZmVjdHNfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgYENvbnNpZGVyYXRpb25gID0gYygNCiAgICAiIFRlc3RpbmcgVGltZWxpbmUiLA0KICAgICIgQ29tcHV0YXRpb25hbCBDb3N0IiwNCiAgICAiIFN0YXRpc3RpY2FsIFBvd2VyIiwNCiAgICAiIFR5cGUgSSBFcnJvciBSYXRlIiwNCiAgICAiIEJ1c2luZXNzIFZlbG9jaXR5IiwNCiAgICAiIERldGVjdGlvbiBTZW5zaXRpdml0eSINCiAgKSwNCiAgYExhcmdlIFNhbXBsZSBJbXBhY3RgID0gYygNCiAgICAiPGI+U2lnbmlmaWNhbnQgRGVsYXk6PC9iPjxicj7igKIgV2Vla3MgdG8gbW9udGhzIGZvciBkYXRhIGNvbGxlY3Rpb248YnI+4oCiIFNsb3dlciBpdGVyYXRpb24gY3ljbGVzPGJyPuKAoiBEZWxheWVkIGJ1c2luZXNzIGRlY2lzaW9ucyIsDQogICAgIjxiPkhpZ2ggRXhwZW5zZTo8L2I+PGJyPuKAoiBDbG91ZCBjb21wdXRpbmcgY29zdHMgc2NhbGUgbGluZWFybHk8YnI+4oCiIFN0b3JhZ2UgYW5kIHByb2Nlc3NpbmcgY29zdHMgaW5jcmVhc2U8YnI+4oCiIEluZnJhc3RydWN0dXJlIGludmVzdG1lbnQgbmVlZGVkIiwNCiAgICAiPGI+VmVyeSBIaWdoIFBvd2VyICjiiYgwLjk1Kyk6PC9iPjxicj7igKIgTG93IFR5cGUgSUkgZXJyb3Igcmlzazxicj7igKIgQ2FuIGRldGVjdCB2ZXJ5IHNtYWxsIGVmZmVjdHM8YnI+4oCiIEhpZ2ggY29uZmlkZW5jZSBpbiBuZWdhdGl2ZSByZXN1bHRzIiwNCiAgICAiPGI+Tm8gSW1wYWN0OjwvYj48YnI+4oCiIM6xIGlzIHJlc2VhcmNoZXItc2V0IHRocmVzaG9sZDxicj7igKIgSW5kZXBlbmRlbnQgb2Ygc2FtcGxlIHNpemU8YnI+4oCiIFR5cGljYWxseSBmaXhlZCBhdCAwLjA1IiwNCiAgICAiPGI+U2xvd2VyIFRpbWUtdG8tTWFya2V0OjwvYj48YnI+4oCiIERlbGF5ZWQgZmVhdHVyZSByZWxlYXNlczxicj7igKIgU2xvd2VyIGxlYXJuaW5nIGN5Y2xlczxicj7igKIgTWlzc2VkIGNvbXBldGl0aXZlIG9wcG9ydHVuaXRpZXMiLA0KICAgICI8Yj5FeHRyZW1lIFNlbnNpdGl2aXR5OjwvYj48YnI+4oCiIENhbiBkZXRlY3QgdHJpdmlhbCBlZmZlY3RzPGJyPuKAoiBNYXkgZmluZCAnc2lnbmlmaWNhbnQnIGJ1dCB1bmltcG9ydGFudCBlZmZlY3RzPGJyPuKAoiBSaXNrIG9mIG92ZXJmaXR0aW5nIg0KICApLA0KICBgU21hbGwgU2FtcGxlIEltcGFjdGAgPSBjKA0KICAgICI8Yj5SYXBpZCBUZXN0aW5nOjwvYj48YnI+4oCiIERheXMgdG8gd2Vla3MgZm9yIHJlc3VsdHM8YnI+4oCiIEZhc3QgaXRlcmF0aW9uIHBvc3NpYmxlPGJyPuKAoiBRdWljayBidXNpbmVzcyBkZWNpc2lvbnMiLA0KICAgICI8Yj5Mb3cgQ29zdDo8L2I+PGJyPuKAoiBNaW5pbWFsIGNsb3VkIGV4cGVuc2VzPGJyPuKAoiBTdGFuZGFyZCBpbmZyYXN0cnVjdHVyZSBzdWZmaWNpZW50PGJyPuKAoiBMb3cgb3BlcmF0aW9uYWwgb3ZlcmhlYWQiLA0KICAgICI8Yj5Nb2RlcmF0ZSBQb3dlciAo4omIMC4zMC0wLjcwKTo8L2I+PGJyPuKAoiBIaWdoZXIgVHlwZSBJSSBlcnJvciByaXNrPGJyPuKAoiBPbmx5IGRldGVjdHMgc3Vic3RhbnRpYWwgZWZmZWN0czxicj7igKIgVW5jZXJ0YWludHkgaW4gbmVnYXRpdmUgcmVzdWx0cyIsDQogICAgIjxiPk5vIEltcGFjdDo8L2I+PGJyPuKAoiDOsSByZW1haW5zIGZpeGVkIGJ5IGRlc2lnbjxicj7igKIgU2FtZSBUeXBlIEkgZXJyb3IgY29udHJvbDxicj7igKIgQ29uc2lzdGVudCBkZWNpc2lvbiB0aHJlc2hvbGQiLA0KICAgICI8Yj5GYXN0ZXIgSW5ub3ZhdGlvbjo8L2I+PGJyPuKAoiBRdWljayBmZWF0dXJlIGl0ZXJhdGlvbnM8YnI+4oCiIFJhcGlkIGV4cGVyaW1lbnRhdGlvbjxicj7igKIgQ29tcGV0aXRpdmUgcmVzcG9uc2l2ZW5lc3MiLA0KICAgICI8Yj5QcmFjdGljYWwgU2Vuc2l0aXZpdHk6PC9iPjxicj7igKIgRGV0ZWN0cyBtZWFuaW5nZnVsIGVmZmVjdHMgb25seTxicj7igKIgRm9jdXNlcyBvbiBpbXBvcnRhbnQgZGlmZmVyZW5jZXM8YnI+4oCiIFJlZHVjZXMgb3ZlcmZpdHRpbmcgcmlzayINCiAgKSwNCiAgYFJlY29tbWVuZGF0aW9uYCA9IGMoDQogICAgIlVzZSBzZXF1ZW50aWFsIHRlc3RpbmciLA0KICAgICJDb25kdWN0IGNvc3QtYmVuZWZpdCBhbmFseXNpcyIsDQogICAgIlRhcmdldCBwb3dlciA9IDAuODAtMC45MCIsDQogICAgIkZpeCDOsSA9IDAuMDUgKHN0YW5kYXJkKSIsDQogICAgIkJhbGFuY2Ugc3BlZWQgd2l0aCBjb25maWRlbmNlIiwNCiAgICAiQ29uc2lkZXIgcHJhY3RpY2FsIHNpZ25pZmljYW5jZSINCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQojIENyZWF0ZSBzdHlsZWQgdGFibGUNCmthYmxlKHNhbXBsZV9lZmZlY3RzX3RhYmxlLCANCiAgICAgIGFsaWduID0gYygibCIsICJsIiwgImwiLCAibCIpLA0KICAgICAgY2FwdGlvbiA9ICJTYW1wbGUgU2l6ZSBFZmZlY3RzOiBTdGF0aXN0aWNhbCB2cyBQcmFjdGljYWwgQ29uc2lkZXJhdGlvbnMiLA0KICAgICAgZm9ybWF0ID0gImh0bWwiLA0KICAgICAgZXNjYXBlID0gRkFMU0UpICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiLA0KICAgIGZvbnRfc2l6ZSA9IDEzDQogICkgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFLCB3aWR0aCA9ICI0Y20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiOGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDMsIHdpZHRoID0gIjhjbSIpICU+JQ0KICBjb2x1bW5fc3BlYyg0LCB3aWR0aCA9ICI1Y20iKSAlPiUNCiAgcm93X3NwZWMoNCwgYmFja2dyb3VuZCA9ICIjRThGNUU5IikgJT4lICAjIEhpZ2hsaWdodCBUeXBlIEkgZXJyb3IgaW5zaWdodA0KICByb3dfc3BlYygzLCBiYWNrZ3JvdW5kID0gIiNFM0YyRkQiKSAlPiUgICMgSGlnaGxpZ2h0IHBvd2VyDQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCAiTGFyZ2UgU2FtcGxlIChuID4gMTAsMDAwKSIgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICJTbWFsbCBTYW1wbGUgKG4gPCAxLDAwMCkiID0gMSwgIkJlc3QgUHJhY3RpY2UiID0gMSkpICU+JQ0KICBmb290bm90ZShnZW5lcmFsID0gIktleSBJbnNpZ2h0OiBUeXBlIEkgZXJyb3IgcmF0ZSAozrEpIGlzIGluZGVwZW5kZW50IG9mIHNhbXBsZSBzaXplIC0gaXQncyBhIGRlc2lnbiBjaG9pY2UsIG5vdCBhIGRhdGEgcHJvcGVydHkiKQ0KYGBgDQoNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIEluc3RhbGwgcGFja2FnZXMgamlrYSBiZWx1bSBhZGENCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQojIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIDEuIFNldHVwIFBhcmFtZXRlcg0KbXUwIDwtIDAgICAgICAjIE1lYW4gZGkgYmF3YWggSDAgKEFsZ29yaXRtYSB0aWRhayBiZXJwZW5nYXJ1aCkNCm11MSA8LSAyLjUgICAgIyBNZWFuIGRpIGJhd2FoIEgxIChBbGdvcml0bWEgbWVuZ3VyYW5naSBmcmF1ZCkNCnNkIDwtIDEgICAgICAgIyBTdGFuZGFyIGRldmlhc2kNCmFscGhhIDwtIDAuMDUgIyBTaWduaWZpa2Fuc2kgbGV2ZWwNCnpfY3JpdCA8LSBxbm9ybSgxIC0gYWxwaGEsIG1lYW4gPSBtdTAsIHNkID0gc2QpICMgTmlsYWkga3JpdGlzDQoNCiMgMi4gQnVhdCBEYXRhIHVudHVrIEt1cnZhDQp4IDwtIHNlcSgtNCwgNiwgbGVuZ3RoLm91dCA9IDEwMDApDQp5MCA8LSBkbm9ybSh4LCBtZWFuID0gbXUwLCBzZCA9IHNkKQ0KeTEgPC0gZG5vcm0oeCwgbWVhbiA9IG11MSwgc2QgPSBzZCkNCmRmIDwtIGRhdGEuZnJhbWUoeCwgeTAsIHkxKQ0KDQojIDMuIEJ1YXQgUGxvdCBkZW5nYW4gZ2dwbG90Mg0KcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0geCkpICsNCiAgIyBLdXJ2YSBIMA0KICBnZW9tX2xpbmUoYWVzKHkgPSB5MCksIGNvbG9yID0gImJsdWUiLCBzaXplID0gMSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtdTAsIHkgPSAwLjQyLCBsYWJlbCA9ICJIMDogTm8gUmVkdWN0aW9uIiwgY29sb3IgPSAiYmx1ZSIpICsNCiAgDQogICMgS3VydmEgSDENCiAgZ2VvbV9saW5lKGFlcyh5ID0geTEpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSBtdTEsIHkgPSAwLjQyLCBsYWJlbCA9ICJIMTogUmVkdWNlcyBGcmF1ZCIsIGNvbG9yID0gInJlZCIpICsNCiAgDQogICMgQXJlYSBUeXBlIEkgRXJyb3IgKEFscGhhKSAtIEFyc2lyIE1lcmFoIGRpIGJhd2FoIEgwDQogIGdlb21fYXJlYShkYXRhID0gZmlsdGVyKGRmLCB4ID49IHpfY3JpdCksIGFlcyh5ID0geTApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC40KSArDQogIA0KICAjIEFyZWEgVHlwZSBJSSBFcnJvciAoQmV0YSkgLSBBcnNpciBCaXJ1IGRpIGJhd2FoIEgxDQogIGdlb21fYXJlYShkYXRhID0gZmlsdGVyKGRmLCB4IDwgel9jcml0KSwgYWVzKHkgPSB5MSksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC40KSArDQogIA0KICAjIEdhcmlzIE5pbGFpIEtyaXRpcw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSB6X2NyaXQsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBhbm5vdGF0ZSgidGV4dCIsIHggPSB6X2NyaXQgKyAwLjUsIHkgPSAwLjIsIGxhYmVsID0gIkNyaXRpY2FsIFZhbHVlIiwgYW5nbGUgPSA5MCkgKw0KICANCiAgbGFicyh0aXRsZSA9ICJWaXN1YWxpc2FzaSBFcnJvciBkYWxhbSBGcmF1ZCBEZXRlY3Rpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIk1lcmFoID0gVHlwZSBJIEVycm9yIChBbHBoYSksIEJpcnUgPSBUeXBlIElJIEVycm9yIChCZXRhKSIsDQogICAgICAgeCA9ICJFZmZlY3QgU2l6ZSAoUmVkdWN0aW9uIGluIEZyYXVkKSIsDQogICAgICAgeSA9ICJEZW5zaXR5IikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyA0LiBVYmFoIG1lbmphZGkgUGxvdGx5IHlhbmcgSW50ZXJha3RpZg0KZ2dwbG90bHkocCkNCmBgYA0KDQoNCioqVmlzdWFsaXphdGlvbiBFeHBsYW5hdGlvbjoqKg0KDQoxLiAqKkJsdWUgQ3VydmUgKCRIXzAkKToqKiBSZXByZXNlbnRzIHRoZSBjb25kaXRpb24gd2hlcmUgdGhlIG5ldyBhbGdvcml0aG0gaXMgYWN0dWFsbHkgdGhlIHNhbWUgYXMgdGhlIG9sZCBvbmUgKG5vIHJlZHVjdGlvbiBpbiBmcmF1ZCkuIA0KDQoyLiAqKlJlZCBDdXJ2ZSAoJEhfMSQpOioqIFJlcHJlc2VudHMgdGhlIGNvbmRpdGlvbiB3aGVyZSB0aGUgbmV3IGFsZ29yaXRobSBpcyBjb21wbGV0ZWx5IGVmZmVjdGl2ZSBpbiByZWR1Y2luZyBmcmF1ZC4gDQoNCjMuICoqVHlwZSBJIEVycm9yIChSZWQgQXJlYSBvbiB0aGUgUmlnaHQpOioqIFRoaXMgaXMgdGhlIHJpc2sgdGhhdCB3ZSByZWplY3QgJEhfMCQgd2hlbiBpdCBpcyBhY3R1YWxseSB0cnVlLiBXZSB0aGluayB0aGUgYWxnb3JpdGhtIGlzIHN1Y2Nlc3NmdWwsIHdoZW4gaXQgaXMganVzdCBhIGNvaW5jaWRlbmNlIChGYWxzZSBQb3NpdGl2ZSkuIA0KDQo0LiAqKlR5cGUgSUkgRXJyb3IgKEJsdWUgQXJlYSBvbiB0aGUgTGVmdCk6KiogVGhpcyBpcyB0aGUgcmlzayB0aGF0IHdlIGZhaWwgdG8gcmVqZWN0ICRIXzAkIHdoZW4gaXQgaXMgYWN0dWFsbHkgZmFsc2UuIFRoZSBhbGdvcml0aG0gaXMgYWN0dWFsbHkgZ29vZCwgYnV0IG91ciBkYXRhIGlzIG5vdCBzdHJvbmcgZW5vdWdoIHRvIHByb3ZlIGl0IChGYWxzZSBOZWdhdGl2ZSkuDQoNCg0KNS4gRXhwbGFpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gKirOsSwgzrIsIGFuZCBzdGF0aXN0aWNhbCBwb3dlcioqLg0KDQpJbiBzdGF0aXN0aWNzLCAkXGFscGhhJCAoQWxwaGEpLCAkXGJldGEkIChCZXRhKSwgYW5kIFN0YXRpc3RpY2FsIFBvd2VyIGFyZSB0aHJlZSBjb21wb25lbnRzIHRoYXQgYXJlIGludGVyY29ubmVjdGVkIGluIGEgZGVjaXNpb24tbWFraW5nIGVjb3N5c3RlbS4gVW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHRocmVlIGlzIGNydWNpYWwgZm9yIGZpbnRlY2ggc3RhcnR1cHMgdG8gYmFsYW5jZSBvcGVyYXRpb25hbCByaXNrcyBhbmQgaW5ub3ZhdGlvbiBvcHBvcnR1bml0aWVzLg0KDQpUaGUgZm9sbG93aW5nIGlzIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbnRlcnJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0aHJlZToNCg0KKipNYXRoZW1hdGljYWwgRGVmaW5pdGlvbnMgYW5kIFJlbGF0aW9uc2hpcHMqKg0KDQpUaGVzZSB0aHJlZSBjb25jZXB0cyB3b3JrIG9uIHR3byBkaWZmZXJlbnQgcmVhbGl0eSBzY2VuYXJpb3MgKHdoZW4gJEhfMCQgaXMgdHJ1ZSB2cyB3aGVuICRIXzEkIGlzIHRydWUpOg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgSmlrYSBiZWx1bSBpbnN0YWxsIGtuaXRyDQojIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCg0KbGlicmFyeShrbml0cikNCg0Kc3RhdGlzdGljYWxfdGVybXMgPC0gZGF0YS5mcmFtZSgNCiAgUGFyYW1ldGVyID0gYygizrEgKEFscGhhKSIsICLOsiAoQmV0YSkiLCAiUG93ZXIgKDHiiJLOsikiKSwNCiAgT3RoZXJfTmFtZSA9IGMoIlR5cGUgSSBFcnJvciIsICJUeXBlIElJIEVycm9yIiwgIlN0YXRpc3RpY2FsIFBvd2VyIiksDQogIFNpbXBsZV9EZWZpbml0aW9uID0gYygNCiAgICAiUmlzayBvZiAnV3JvbmdmdWwgQWNjdXNhdGlvbic6IEFzc3VtaW5nIGFuIGFsZ29yaXRobSBpcyBlZmZlY3RpdmUgd2hlbiBpdCBpcyBub3QuIiwNCiAgICAiUmlzayBvZiAnTWlzc2luZyc6IEFzc3VtaW5nIGFuIGFsZ29yaXRobSBpcyBmYWlsaW5nIHdoZW4gaXQgaXMgYWN0dWFsbHkgZWZmZWN0aXZlLiIsDQogICAgIlRoZSBhYmlsaXR5IHRvIGRldGVjdCBhIHRydWx5IHByZXNlbnQgZWZmZWN0LiINCiAgKSwNCiAgUmVsYXRpb25zaGlwID0gYygNCiAgICAiU2V0IGJ5IHRoZSByZXNlYXJjaGVyIChlLmcuLCAwLjA1KS4iLA0KICAgICJJbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIFBvd2VyLiIsDQogICAgIlRoZSBpZGVhbCB0YXJnZXQgaXMgdXN1YWxseSDiiaUwLjgwLiINCiAgKSwNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFDQopDQoNCiMgTWVtYnVhdCB0YWJlbCBkZW5nYW4gZm9ybWF0IHlhbmcgYmFndXMNCmthYmxlKHN0YXRpc3RpY2FsX3Rlcm1zLCANCiAgICAgIGNhcHRpb24gPSAiU3RhdGlzdGljYWwgSHlwb3RoZXNpcyBUZXN0aW5nIFBhcmFtZXRlcnMiLA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImwiLCAibCIsICJsIikpDQpgYGANCg0KDQoqKkludmVyc2UgUmVsYXRpb25zaGlwIChUcmFkZS1vZmYpIGJldHdlZW4gJFxhbHBoYSQgYW5kICRcYmV0YSQqKg0KDQpJbiBhIGZpeGVkIHNhbXBsZSwgJFxhbHBoYSQgYW5kICRcYmV0YSQgaGF2ZSBhbiBpbnZlcnNlIHJlbGF0aW9uc2hpcC4gSWYgeW91IHRyeSB0byBsb3dlciB0aGUgVHlwZSBJIHJpc2sgKCRcYWxwaGEkKSwgdGhlIFR5cGUgSUkgcmlzayAoJFxiZXRhJCkgd2lsbCBhdXRvbWF0aWNhbGx5IGluY3JlYXNlLg0KDQotICoqSWYgJFxhbHBoYSQgaXMgbG93ZXJlZCAoZS5nLiwgZnJvbSAwLjA1IHRvIDAuMDEpOioqIFlvdSBiZWNvbWUgdmVyeSBzdHJpY3QgYW5kIGRvIG5vdCB3YW50IHRvIG1ha2UgbWlzdGFrZXMgaW4gYWRvcHRpbmcgbmV3IGFsZ29yaXRobXMuICoqVGhlIGNvbnNlcXVlbmNlOioqIFRoZSBzdGFuZGFyZCBvZiBwcm9vZiBiZWNvbWVzIHRvbyBoaWdoLCBzbyB5b3UgYXJlIG1vcmUgbGlrZWx5IHRvIG1pc3MgYWxnb3JpdGhtcyB0aGF0IGFyZSBhY3R1YWxseSBnb29kICgkXGJldGEkICoqaW5jcmVhc2VzLCBQb3dlciBkZWNyZWFzZXMqKikuDQoNCi0gKipJZiAkXGFscGhhJCBpcyByYWlzZWQgKGUuZy4sIGZyb20gMC4wNSB0byAwLjEwKToqKiBZb3UgYXJlIG1vcmUgImxheCIgYW5kIHdpbGxpbmcgdG8gdGFrZSB0aGUgcmlzayBvZiB3cm9uZyBhZG9wdGlvbi4gKipUaGUgY29uc2VxdWVuY2U6KiogWW91IGFyZSBtb3JlIGxpa2VseSB0byBkZXRlY3QgZWZmZWN0aXZlIGFsZ29yaXRobXMgKCRcYmV0YSQgKipkZWNyZWFzZXMsIFBvd2VyIGluY3JlYXNlcyoqKS4NCg0KKipUaGUgUm9sZSBvZiBTdGF0aXN0aWNhbCBQb3dlciAoJDEgLSBcYmV0YSQpKioNCg0KKipQb3dlcioqIGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSB0ZXN0IHdpbGwgcmVqZWN0IDYkSF8wJCB3aGVuIDckSF8xJCBpcyBpbmRlZWQgdHJ1ZS44IEluIHRoZSBmaW50ZWNoIGNvbnRleHQ6DQoNCi0gKipIaWdoIFBvd2VyICgwLjgwIC0gMC45NSk6KiogU3RhcnR1cHMgaGF2ZSBrZWVuICJleWVzLiIgSWYgdGhlIG5ldyBhbGdvcml0aG0gcmVhbGx5IHJlZHVjZXMgZnJhdWQsIHRoZSB0ZXN0IHdpbGwgYWxtb3N0IGNlcnRhaW5seSBmaW5kIGl0Lg0KDQotICoqTG93IFBvd2VyICg8IDAuNTApOioqIEl0J3MgbGlrZSBmbGlwcGluZyBhIGNvaW4uIEV2ZW4gaWYgeW91ciBhbGdvcml0aG0gaXMgZ3JlYXQsIHRoZSB0ZXN0IHdpbGwgbW9zdCBsaWtlbHkgY29uY2x1ZGUgIm5vIHNpZ25pZmljYW50IHJlc3VsdHMuIg0KDQoqKlNhbXBsZSBTaXplIEJlY29tZSBhICJTYXZpb3IiKioNCg0KVGhlIG9ubHkgd2F5IHRvIHNpbXVsdGFuZW91c2x5IGRlY3JlYXNlICRcYWxwaGEkIGFuZCAkXGJldGEkIChvciBpbmNyZWFzZSBQb3dlciB3aXRob3V0IGluY3JlYXNpbmcgJFxhbHBoYSQpIGlzIHRvIGluY3JlYXNlIHRoZSBTYW1wbGUgU2l6ZSAoJG4kKS4gQXMgJG4kIGluY3JlYXNlcywgdGhlIGRhdGEgZGlzdHJpYnV0aW9uIGJlY29tZXMgbmFycm93ZXIgKHByZWNpc2lvbiBpbmNyZWFzZXMpLiBUaGlzIHJlZHVjZXMgdGhlIG92ZXJsYXAgYXJlYSBiZXR3ZWVuIHRoZSAkSF8wJCBhbmQgJEhfMSQgY3VydmVzLCBzbyB0aGUgcmlzayBvZiBtaXNyZXByZXNlbnRhdGlvbiAoJFxhbHBoYSQpIGFuZCB0aGUgcmlzayBvZiBvbWlzc2lvbiAoJFxiZXRhJCkgYXJlIGJvdGggbWluaW1pemVkLg0KDQoqKlN1bW1hcnkgZm9yIEJ1c2luZXNzIERlY2lzaW9ucyBGaW50ZWNoIHN0YXJ0dXBzIHNob3VsZCBjaG9vc2U6ICoqIA0KDQotICoqV2FudCB0byBiZSBleHRyZW1lbHkgc2FmZSBmcm9tIHdhc3RlZCBpbXBsZW1lbnRhdGlvbiBjb3N0cz8qKiBVc2UgbG93ICRcYWxwaGEkIChyaXNrOiBsb3cgUG93ZXIpLg0KDQotICoqV2FudCB0byBiZSBzdXJlIG5vdCB0byBtaXNzIG9wcG9ydHVuaXRpZXMgdG8gY2F0Y2ggZnJhdWQ/KiogR28gZm9yIGhpZ2ggUG93ZXIgKHJpc2s6IG5lZWQgYSBsYXJnZSBzYW1wbGUgc2l6ZSBvciBhIGxvb3NlciAkXGFscGhhJCkuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBMb2FkIGxpYnJhcnkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShkcGx5cikNCg0KIyAxLiBQYXJhbWV0ZXIgU2ltdWxhc2kNCm11MCA8LSAwICAgICAgICMgUmF0YS1yYXRhIGppa2EgYWxnb3JpdG1hIHRpZGFrIGJlcmVmZWsgKEgwKQ0KbXUxIDwtIDIuOCAgICAgIyBSYXRhLXJhdGEgamlrYSBhbGdvcml0bWEgYmVyZWZlayAoSDEpDQpzZCA8LSAxICAgICAgICAjIFN0YW5kYXIgZGV2aWFzaQ0KYWxwaGEgPC0gMC4wNSAgIyBBbWJhbmcgYmF0YXMgc2lnbmlmaWthbnNpDQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhLCBtZWFuID0gbXUwLCBzZCA9IHNkKSAjIEdhcmlzIGJhdGFzIGtlcHV0dXNhbg0KDQojIDIuIE1lbWJ1YXQgRGF0YSBEaXN0cmlidXNpDQp4IDwtIHNlcSgtNCwgNywgbGVuZ3RoLm91dCA9IDEwMDApDQp5MCA8LSBkbm9ybSh4LCBtZWFuID0gbXUwLCBzZCA9IHNkKQ0KeTEgPC0gZG5vcm0oeCwgbWVhbiA9IG11MSwgc2QgPSBzZCkNCmRmIDwtIGRhdGEuZnJhbWUoeCwgeTAsIHkxKQ0KDQojIDMuIE1lbWJ1YXQgUGxvdCBkZW5nYW4gZ2dwbG90Mg0KcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0geCkpICsNCiAgIyBEaXN0cmlidXNpIEgwIChOb3JtYWwpDQogIGdlb21fbGluZShhZXMoeSA9IHkwKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIGdlb21fYXJlYShkYXRhID0gZmlsdGVyKGRmLCB4IDw9IHpfY3JpdCksIGFlcyh5ID0geTApLCBmaWxsID0gImdyYXkiLCBhbHBoYSA9IDAuMikgKw0KICANCiAgIyBUeXBlIEkgRXJyb3IgKEFscGhhKSAtIE1lcmFoDQogIGdlb21fYXJlYShkYXRhID0gZmlsdGVyKGRmLCB4ID49IHpfY3JpdCksIGFlcyh5ID0geTApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC43KSArDQogIA0KICAjIERpc3RyaWJ1c2kgSDEgKEtvbmRpc2kgTnlhdGEgQWxnb3JpdG1hIEJhZ3VzKQ0KICBnZW9tX2xpbmUoYWVzKHkgPSB5MSksIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICANCiAgIyBUeXBlIElJIEVycm9yIChCZXRhKSAtIEJpcnUNCiAgZ2VvbV9hcmVhKGRhdGEgPSBmaWx0ZXIoZGYsIHggPD0gel9jcml0KSwgYWVzKHkgPSB5MSksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC41KSArDQogIA0KICAjIFN0YXRpc3RpY2FsIFBvd2VyICgxIC0gQmV0YSkgLSBIaWphdQ0KICBnZW9tX2FyZWEoZGF0YSA9IGZpbHRlcihkZiwgeCA+PSB6X2NyaXQpLCBhZXMoeSA9IHkxKSwgZmlsbCA9ICJncmVlbiIsIGFscGhhID0gMC41KSArDQogIA0KICAjIEdhcmlzIEJhdGFzIEtlcHV0dXNhbiAoQ3JpdGljYWwgVmFsdWUpDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHpfY3JpdCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMSkgKw0KICANCiAgIyBMYWJlbCBkYW4gVGVtYQ0KICBsYWJzKHRpdGxlID0gIlZpc3VhbGlzYXNpIEh1YnVuZ2FuIEFscGhhLCBCZXRhLCBkYW4gUG93ZXIiLA0KICAgICAgIHggPSAiRWZla3Rpdml0YXMgQWxnb3JpdG1hIChSZWR1Y3Rpb24gaW4gRnJhdWQpIiwNCiAgICAgICB5ID0gIlByb2JhYmlsaXRhcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCiMgNC4gTWVuamFkaWthbiBJbnRlcmFrdGlmIGRlbmdhbiBQbG90bHkNCmdncGxvdGx5KHApICU+JSANCiAgbGF5b3V0KGFubm90YXRpb25zID0gbGlzdCgNCiAgICBsaXN0KHggPSBtdTAsIHkgPSAwLjQyLCB0ZXh0ID0gIkgwOiBBbGdvcml0bWEgR2FnYWwiLCBzaG93YXJyb3cgPSBGKSwNCiAgICBsaXN0KHggPSBtdTEsIHkgPSAwLjQyLCB0ZXh0ID0gIkgxOiBBbGdvcml0bWEgU3Vrc2VzIiwgc2hvd2Fycm93ID0gRiksDQogICAgbGlzdCh4ID0gel9jcml0LCB5ID0gMC40NSwgdGV4dCA9ICJHYXJpcyBLZXB1dHVzYW4iLCBzaG93YXJyb3cgPSBULCBheCA9IDQwKQ0KICApKQ0KYGBgDQoNCioqUmVhZCBUaGlzIFZpc3VhbGl6YXRpb246KiogDQoNCi0gKipEYXNoZWQgTGluZSAoRGVjaXNpb24gTGluZSk6KiogVGhpcyBpcyB0aGUgYm91bmRhcnkgeW91IGRlZmluZWQuIElmIHRoZSB0ZXN0IHJlc3VsdHMgYXJlIHRvIHRoZSByaWdodCBvZiB0aGlzIGxpbmUsIHlvdSBhZG9wdCB0aGUgbmV3IGFsZ29yaXRobS4NCg0KLSAqKlJFRCBBcmVhICgkXGFscGhhJCAtIFR5cGUgSSBFcnJvcik6KiogWW91IGFyZSBvbiB0aGUgbGVmdCBjdXJ2ZSAoSDApLCBidXQgdGhlIHRlc3QgcmVzdWx0cyBjcm9zcyB0aGUgYm91bmRhcnkgbGluZS4gWW91IHRoaW5rIHlvdSB3b24sIGJ1dCBpdCB3YXMganVzdCBhIGZsdWtlLg0KDQotICoqQkxVRSBBcmVhICgkXGJldGEkIC0gVHlwZSBJSSBFcnJvcik6KiogWW91IGFyZSBvbiB0aGUgcmlnaHQgY3VydmUgKEgxKSwgbWVhbmluZyB0aGUgYWxnb3JpdGhtIGlzIGFjdHVhbGx5IGdvb2QuIEJ1dCBiZWNhdXNlIHRoZSB0ZXN0IHJlc3VsdHMgYXJlIHRvIHRoZSBsZWZ0IG9mIHRoZSBib3VuZGFyeSBsaW5lLCB5b3UgdGhpbmsgdGhlIGFsZ29yaXRobSBmYWlsZWQuIFlvdSBtaXNzZWQgYSBnb2xkZW4gb3Bwb3J0dW5pdHkuIA0KDQotICoqR1JFRU4gQXJlYSAoUG93ZXIgLSAkMS1cYmV0YSQpOioqIFRoaXMgaXMgdGhlIGlkZWFsIHNpdHVhdGlvbi4gVGhlIGFsZ29yaXRobSBpcyBnb29kLCBhbmQgeW91ciB0ZXN0cyBwcm92ZSBpdC4gVGhlIHdpZGVyIHRoZSBncmVlbiBhcmVhLCB0aGUgbW9yZSBzb3BoaXN0aWNhdGVkIHlvdXIgc3RhcnR1cCdzIHRlc3RzIGFyZS4NCg0KDQojIENhc2UgU3R1ZHkgNiAgDQojIyBQLVZhbHVlIGFuZCBTdGF0aXN0aWNhbCBEZWNpc2lvbiBNYWtpbmcNCg0KQSBjaHVybiBwcmVkaWN0aW9uIG1vZGVsIGV2YWx1YXRpb24geWllbGRzIHRoZSBmb2xsb3dpbmcgcmVzdWx0czoNCg0KLSBUZXN0IHN0YXRpc3RpYyA9IDIuMzEgIA0KLSBwLXZhbHVlID0gMC4wMjEgIA0KLSBTaWduaWZpY2FuY2UgbGV2ZWw6ICRcYWxwaGEgPSAwLjA1JA0KDQojIyBUYXNrcw0KDQoxLiBFeHBsYWluIHRoZSAqKm1lYW5pbmcgb2YgdGhlIHAtdmFsdWUqKi4NCjIuIE1ha2UgYSAqKnN0YXRpc3RpY2FsIGRlY2lzaW9uKiouDQozLiBUcmFuc2xhdGUgdGhlIGRlY2lzaW9uIGludG8gKipub24tdGVjaG5pY2FsIGxhbmd1YWdlKiogZm9yIG1hbmFnZW1lbnQuDQo0LiBEaXNjdXNzIHRoZSByaXNrIGlmIHRoZSAqKnNhbXBsZSBpcyBub3QgcmVwcmVzZW50YXRpdmUqKi4NCjUuIEV4cGxhaW4gd2h5IHRoZSBwLXZhbHVlIGRvZXMgKipub3QgbWVhc3VyZSBlZmZlY3Qgc2l6ZSoqLg0KDQojIyAgQW5zd2VyIENhc2UgU3R1ZHkgNg0KDQoxLiAgRXhwbGFpbiB0aGUgKiptZWFuaW5nIG9mIHRoZSBwLXZhbHVlKiouDQoNCg0KKipUaGUgQ29yZSBNZWFuaW5nIG9mIHRoZSBQLVZhbHVlKioNCg0KVGhlIHAtdmFsdWUgb2YgMC4wMjEgcmVwcmVzZW50cyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2J0YWluaW5nIGEgdGVzdCBzdGF0aXN0aWMgYXMgZXh0cmVtZSBhcyAob3IgbW9yZSBleHRyZW1lIHRoYW4pIDIuMzEsIGFzc3VtaW5nIHRoYXQgdGhlIG51bGwgaHlwb3RoZXNpcyAoJEhfMCQpIGlzIHRydWUuDQoNCkluIGNodXJuIHByZWRpY3Rpb24sIHRoZSBudWxsIGh5cG90aGVzaXMgdXN1YWxseSBzdGF0ZXMgdGhhdCB0aGVyZSBpcyBubyBlZmZlY3TigJRmb3IgZXhhbXBsZSwgdGhhdCBhIHNwZWNpZmljIGZlYXR1cmUgZG9lcyBub3QgaW5mbHVlbmNlIGNodXJuLCBvciB0aGF0IHRoZSBtb2RlbCdzIHBlcmZvcm1hbmNlIGlzIG5vIGJldHRlciB0aGFuIGEgYmFzZWxpbmUgKHJhbmRvbSBndWVzc2luZykuDQoNClRoZXJlZm9yZSwgYSBwLXZhbHVlIG9mIDAuMDIxIG1lYW5zOg0KDQotIFRoZXJlIGlzIG9ubHkgYSAqKjIuMSUgY2hhbmNlKiogdGhhdCB5b3Ugd291bGQgc2VlIHRoZXNlIHJlc3VsdHMgaWYgdGhlIG1vZGVsIGFjdHVhbGx5IGhhZCBubyBwcmVkaWN0aXZlIHBvd2VyLg0KDQotIEJlY2F1c2UgMi4xJSBpcyBhIHZlcnkgbG93IHByb2JhYmlsaXR5LCBpdCBzdWdnZXN0cyB0aGF0IHRoZSAibm8gZWZmZWN0IiBhc3N1bXB0aW9uIGlzIGxpa2VseSBpbmNvcnJlY3QuDQoNCioqU3RhdGlzdGljYWwgRGVjaXNpb246IENvbXBhcmluZyBQLVZhbHVlIGFuZCBBbHBoYSAoJFxhbHBoYSQpKioNCg0KVG8gbWFrZSBhIGZvcm1hbCBkZWNpc2lvbiwgd2UgY29tcGFyZSB0aGUgcC12YWx1ZSB0byB5b3VyIHByZS1kZWZpbmVkIHNpZ25pZmljYW5jZSBsZXZlbCAoJFxhbHBoYSQpOg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCg0KdGVzdF9yZXN1bHRzIDwtIGRhdGEuZnJhbWUoDQogIE1ldHJpYyA9IGMoIlAtVmFsdWUiLCAiU2lnbmlmaWNhbmNlIExldmVsICjOsSkiLCAiQ29uY2x1c2lvbiIpLA0KICBWYWx1ZSA9IGMoIjAuMDIxIiwgIjAuMDUiLCAiIiksDQogIENvbXBhcmlzb24gPSBjKCJwIDwgzrEiLCAiKDAuMDIxIDwgMC4wNSkiLCAiU3RhdGlzdGljYWxseSBTaWduaWZpY2FudCIpLA0KICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCikNCg0KIyBUYWJlbCBkZW5nYW4gZm9ybWF0IGJhZ3VzDQprYWJsZSh0ZXN0X3Jlc3VsdHMsIA0KICAgICAgY2FwdGlvbiA9ICJIeXBvdGhlc2lzIFRlc3QgUmVzdWx0cyIsDQogICAgICBhbGlnbiA9IGMoImwiLCAiYyIsICJsIiksDQogICAgICBjb2wubmFtZXMgPSBjKCJNZXRyaWMiLCAiVmFsdWUiLCAiQ29tcGFyaXNvbi9SZXN1bHQiKSkNCmBgYA0KDQoqKlRoZSBEZWNpc2lvbjoqKg0KU2luY2UgdGhlIHAtdmFsdWUgKDUkMC4wMjEkKSAqKmlzIGxlc3MgdGhhbioqIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgKDYkMC4wNSQpLCB5b3UgKipyZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4qKg0KDQoNCioqQnVzaW5lc3MgSW50ZXJwcmV0YXRpb246ICoqDQoNCkluIHByYWN0aWNhbCB0ZXJtcyBmb3IgeW91ciBjaHVybiBtb2RlbCwgdGhpcyByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbmRpbmdzIGFyZSAqKnN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQqKi4gWW91IGNhbiBjb25jbHVkZSB3aXRoIDk1JSBjb25maWRlbmNlIHRoYXQgdGhlIG1vZGVsIGhhcyBpZGVudGlmaWVkIGEgcmVhbCBwYXR0ZXJuIGluIGN1c3RvbWVyIGJlaGF2aW9yIHJhdGhlciB0aGFuIGp1c3QgIm5vaXNlIiBpbiB0aGUgZGF0YS4gWW91IG5vdyBoYXZlIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gbW92ZSBmb3J3YXJkIHdpdGggdGhlIG1vZGVsJ3MgaW5zaWdodHMgZm9yIHJldGVudGlvbiBzdHJhdGVnaWVzLg0KDQoyLiAgTWFrZSBhICoqc3RhdGlzdGljYWwgZGVjaXNpb24qKi4NCg0KVG8gbWFrZSBhIHN0YXRpc3RpY2FsIGRlY2lzaW9uIGZvciB5b3VyIGNodXJuIHByZWRpY3Rpb24gbW9kZWwsIHdlIGNvbXBhcmUgdGhlIGNhbGN1bGF0ZWQgcC12YWx1ZSBhZ2FpbnN0IHRoZSBwcmUtZGV0ZXJtaW5lZCBzaWduaWZpY2FuY2UgbGV2ZWwgKCRcYWxwaGEkKS4NCg0KKipUaGUgU3RhdGlzdGljYWwgRGVjaXNpb24qKg0KDQpCYXNlZCBvbiB0aGUgcmVzdWx0cyBwcm92aWRlZCwgdGhlIGRlY2lzaW9uIGlzIHRvICoqUmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMqKiAoJEhfMCQpLg0KDQoqKkp1c3RpZmljYXRpb24qKg0KDQpUaGUgZGVjaXNpb24tbWFraW5nIHJ1bGUgaW4gaHlwb3RoZXNpcyB0ZXN0aW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZDoNCg0KLSBJZiAkcCBcbGVxIFxhbHBoYSQ6IFJlamVjdCAkSF8wJCAoVGhlIHJlc3VsdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50KS4NCg0KLSBJZiAkcCA+IFxhbHBoYSQ6IEZhaWwgdG8gUmVqZWN0ICRIXzAkIChUaGUgcmVzdWx0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50KS4NCg0KSW4gdGhpcyBjYXNlIHN0dWR5Og0KDQotIFAtdmFsdWUgPSAkMC4wMjEkDQoNCi0gU2lnbmlmaWNhbmNlIExldmVsICgkXGFscGhhJCkgPSAkMC4wNSQNCg0KU2luY2UgJDAuMDIxIDwgMC4wNSQsIHRoZSBwLXZhbHVlIGZhbGxzIHdpdGhpbiB0aGUgInJlamVjdGlvbiByZWdpb24uIiBUaGlzIG1lYW5zIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgYSB0ZXN0IHN0YXRpc3RpYyBvZiAkMi4zMSQgYnkgcHVyZSBjaGFuY2UgaXMgbG93ZXIgdGhhbiB0aGUgJDVcJSQgdGhyZXNob2xkIHlvdSBzZXQuDQoNCioqQ29uY2x1c2lvbiBhbmQgQnVzaW5lc3MgSW1wYWN0KioNCg0KQnkgcmVqZWN0aW5nIHRoZSBudWxsIGh5cG90aGVzaXMsIHlvdSBhcmUgY29uY2x1ZGluZyB0aGF0Og0KDQotIFN0YXRpc3RpY2FsIFNpZ25pZmljYW5jZTogVGhlIGZpbmRpbmdzIG9mIHRoZSBjaHVybiBwcmVkaWN0aW9uIG1vZGVsIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSAkOTVcJSQgY29uZmlkZW5jZSBsZXZlbC4NCg0KLSBNb2RlbCBWYWxpZGl0eTogVGhlcmUgaXMgc3Ryb25nIGV2aWRlbmNlIHRvIHN1Z2dlc3QgdGhhdCB0aGUgbW9kZWwncyBwcmVkaWN0b3JzIGFyZSBhY3R1YWxseSByZWxhdGVkIHRvIGN1c3RvbWVyIGNodXJuLCByYXRoZXIgdGhhbiB0aGUgcmVzdWx0cyBiZWluZyBhIHByb2R1Y3Qgb2YgcmFuZG9tIHNhbXBsaW5nIGVycm9yLg0KDQotIEFjdGlvbmFibGUgSW5zaWdodDogVGhlIGJ1c2luZXNzIGNhbiBwcm9jZWVkIHdpdGggdXNpbmcgdGhpcyBtb2RlbCB0byBpbmZvcm0gcmV0ZW50aW9uIHN0cmF0ZWdpZXMsIGFzIHRoZSByZWxhdGlvbnNoaXAgaXQgaGFzIGlkZW50aWZpZWQgaXMgdW5saWtlbHkgdG8gYmUgYSBmbHVrZS4NCg0KDQoqKkRlY2lzaW9uIHZpYSBQLVZhbHVlIENvbXBhcmlzb24qKg0KDQpUaGUgc3RhbmRhcmQgcnVsZSBmb3IgYW55IGh5cG90aGVzaXMgdGVzdCBpczogUmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgaWYgJHAgXGxlcSBcYWxwaGEkLg0KDQotIFAtVmFsdWU6IDAuMDIxDQoNCi0gU2lnbmlmaWNhbmNlIExldmVsICgkXGFscGhhJCk6IDAuMDUNCg0KLSBDb21wYXJpc29uOiAkMC4wMjEgPCAwLjA1JA0KDQpTdGF0aXN0aWNhbCBEZWNpc2lvbjogUmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMgKCRIXzAkKS4NCg0KDQoqKkRlY2lzaW9uIHZpYSBUZXN0IFN0YXRpc3RpYyBDb21wYXJpc29uKioNCg0KV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoaXMgYnkgY29tcGFyaW5nIHlvdXIgdGVzdCBzdGF0aXN0aWMgdG8gdGhlIGNyaXRpY2FsIHZhbHVlLiBGb3IgYSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uIChaLXRlc3QpIGF0ICRcYWxwaGEgPSAwLjA1JDoNCg0KLSBUd28tVGFpbGVkIENyaXRpY2FsIFZhbHVlOiAkXHBtIDEuOTYkDQoNCi0gT25lLVRhaWxlZCAoUmlnaHQpIENyaXRpY2FsIFZhbHVlOiAkKzEuNjQ1JA0KDQotIFlvdXIgVGVzdCBTdGF0aXN0aWM6IDIuMzENCg0KU2luY2UgeW91ciB0ZXN0IHN0YXRpc3RpYyBvZiAyLjMxIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgKGUuZy4sICQxLjk2JCBvciAkMS42NDUkKSwgaXQgZmFsbHMgZGVlcCBpbnRvIHRoZSByZWplY3Rpb24gcmVnaW9uICh0aGUgInRhaWwiIG9mIHRoZSBjdXJ2ZSkuDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyAxLiBNZW55aWFwa2FuIGRhdGEga3VydmEgbm9ybWFsIHV0YW1hICgxMDAwIHRpdGlrKQ0KeF92YWwgPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFsIDwtIGRub3JtKHhfdmFsKQ0KZGZfbWFpbiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbCwgeSA9IHlfdmFsKQ0KDQojIDIuIE1lbnlpYXBrYW4gcGFyYW1ldGVyIHN0YXRpc3Rpaw0Kel9jcml0IDwtIDEuOTYNCnRlc3Rfc3RhdCA8LSAyLjMxDQphbHBoYV92YWwgPC0gMC4wNQ0KcF92YWwgPC0gMC4wMjENCg0KIyAzLiBNZW55aWFwa2FuIGRhdGEga2h1c3VzIHVudHVrIHdpbGF5YWggcGVub2xha2FuIChhZ2FyIHVrdXJhbiBrb2xvbSBrb25zaXN0ZW4pDQpkZl9yZWpfcmlnaHQgPC0gZGF0YS5mcmFtZSgNCiAgeCA9IHNlcSh6X2NyaXQsIDQsIGxlbmd0aC5vdXQgPSAxMDApLA0KICB5ID0gZG5vcm0oc2VxKHpfY3JpdCwgNCwgbGVuZ3RoLm91dCA9IDEwMCkpDQopDQoNCmRmX3Jlal9sZWZ0IDwtIGRhdGEuZnJhbWUoDQogIHggPSBzZXEoLTQsIC16X2NyaXQsIGxlbmd0aC5vdXQgPSAxMDApLA0KICB5ID0gZG5vcm0oc2VxKC00LCAtel9jcml0LCBsZW5ndGgub3V0ID0gMTAwKSkNCikNCg0KIyA0LiBNZW1idWF0IFBsb3QNCmZpZyA8LSBwbG90X2x5KCkgJT4lDQogICMgS3VydmEgRGlzdHJpYnVzaSBOb3JtYWwNCiAgYWRkX3RyYWNlKGRhdGEgPSBkZl9tYWluLCB4ID0gfngsIHkgPSB+eSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgbmFtZSA9ICdOb3JtYWwgRGlzdC4nLCBsaW5lID0gbGlzdChjb2xvciA9ICcjMmMzZTUwJywgd2lkdGggPSAzKSkgJT4lDQogICMgV2lsYXlhaCBQZW5vbGFrYW4gS2FuYW4NCiAgYWRkX3JpYmJvbnMoZGF0YSA9IGRmX3Jlal9yaWdodCwgeCA9IH54LCB5bWluID0gMCwgeW1heCA9IH55LA0KICAgICAgICAgICAgICBuYW1lID0gJ1JlamVjdGlvbiBSZWdpb24nLCBmaWxsY29sb3IgPSAncmdiYSgyMzEsIDc2LCA2MCwgMC40KScsIA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICd0cmFuc3BhcmVudCcpKSAlPiUNCiAgIyBXaWxheWFoIFBlbm9sYWthbiBLaXJpDQogIGFkZF9yaWJib25zKGRhdGEgPSBkZl9yZWpfbGVmdCwgeCA9IH54LCB5bWluID0gMCwgeW1heCA9IH55LA0KICAgICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UsIGZpbGxjb2xvciA9ICdyZ2JhKDIzMSwgNzYsIDYwLCAwLjQpJywgDQogICAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JykpICU+JQ0KICAjIEdhcmlzIFRlc3QgU3RhdGlzdGljIChaID0gMi4zMSkNCiAgYWRkX3NlZ21lbnRzKHggPSB0ZXN0X3N0YXQsIHhlbmQgPSB0ZXN0X3N0YXQsIHkgPSAwLCB5ZW5kID0gZG5vcm0odGVzdF9zdGF0KSArIDAuMDUsIA0KICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnIzI3YWU2MCcsIHdpZHRoID0gNCwgZGFzaCA9ICdkb3QnKSwgDQogICAgICAgICAgICAgICBuYW1lID0gcGFzdGUoJ1Rlc3QgU3RhdCAoWik6JywgdGVzdF9zdGF0KSkgJT4lDQogICMgTGF5b3V0IGRhbiBBbm90YXNpDQogIGxheW91dCgNCiAgICB0aXRsZSA9IGxpc3QodGV4dCA9ICI8Yj5LZXB1dHVzYW4gU3RhdGlzdGlrOiBUb2xhayBOdWxsIEh5cG90aGVzaXM8L2I+IiwgeSA9IDAuOTUpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJaLXNjb3JlIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkRlbnNpdHkiLCBzaG93Z3JpZCA9IEZBTFNFKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KHggPSB0ZXN0X3N0YXQsIHkgPSBkbm9ybSh0ZXN0X3N0YXQpICsgMC4wNywgDQogICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIlogPSAiLCB0ZXN0X3N0YXQsICI8YnI+cCA9ICIsIHBfdmFsKSwgDQogICAgICAgICAgIHNob3dhcnJvdyA9IFRSVUUsIGFycm93aGVhZCA9IDIsIGNvbG9yID0gIiMyN2FlNjAiLCBmb250d2VpZ2h0ID0gImJvbGQiKSwNCiAgICAgIGxpc3QoeCA9IHpfY3JpdCwgeSA9IDAuMDIsIHRleHQgPSBwYXN0ZSgiWiBjcml0ID0iLCB6X2NyaXQpLCANCiAgICAgICAgICAgc2hvd2Fycm93ID0gRkFMU0UsIHlzaGlmdCA9IC0xMCksDQogICAgICBsaXN0KHggPSAtel9jcml0LCB5ID0gMC4wMiwgdGV4dCA9IHBhc3RlKCJaIGNyaXQgPSAtIiwgel9jcml0KSwgDQogICAgICAgICAgIHNob3dhcnJvdyA9IEZBTFNFLCB5c2hpZnQgPSAtMTApDQogICAgKSwNCiAgICBtYXJnaW4gPSBsaXN0KHQgPSA4MCkNCiAgKQ0KDQojIFRhbXBpbGthbiBQbG90DQpmaWcNCmBgYA0KDQoqKlZpc3VhbCBFeHBsYW5hdGlvbjoqKg0KDQotIEJsdWUgQ3VydmU6IFNob3dzIHRoZSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uIChhc3N1bWluZyAkSF8wJCBpcyB0cnVlKS4gDQoNCi0gUmVkIEFyZWE6IFJlamVjdGlvbiByZWdpb24gKCRcYWxwaGEgPSAwLjA1JCkuIElmIHRoZSBncmVlbiBsaW5lIGZhbGxzIGhlcmUsIHdlIHJlamVjdCAkSF8wJC4gDQoNCi0gR3JlZW4gRGFzaGVkIExpbmU6IFNob3dzIHRoZSBwb3NpdGlvbiBvZiB5b3VyIG1vZGVsICgkMi4zMSQpLiBTaW5jZSB0aGlzIGxpbmUgaXMgd2VsbCB3aXRoaW4gdGhlIHJlZCBhcmVhLCBpdCB2aXN1YWxseSBwcm92ZXMgdGhhdCB5b3VyIG1vZGVsJ3MgcmVzdWx0cyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4NCg0KMy4gVHJhbnNsYXRlIHRoZSBkZWNpc2lvbiBpbnRvICoqbm9uLXRlY2huaWNhbCBsYW5ndWFnZSoqIGZvciBtYW5hZ2VtZW50Lg0KDQoqKlRoZSBSZXN1bHRzIEFyZSBObyBDb2luY2lkZW5jZSoqDQoNClRoZSBhbmFseXNpcyBzaG93cyB0aGF0IHRoZSBwYXR0ZXJucyBpZGVudGlmaWVkIGJ5IG91ciBtb2RlbCBhcmUgdmVyeSByb2J1c3QgYW5kIHJlYWwuIFNpbXBseSBwdXQsIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZXNlIHBhdHRlcm5zIG9jY3VycmVkIGR1ZSB0byAibHVjayIgb3IgcHVyZSBjaGFuY2UgaXMgZXh0cmVtZWx5IHNtYWxs4oCUb25seSBhYm91dCAyJS4NCg0KKipEZWNpc2lvbioqDQoNClRoZSBNb2RlbCBpcyBSZWFkeSB0byBVc2UNCkJlY2F1c2Ugb3VyIGNvbmZpZGVuY2UgbGV2ZWwgZXhjZWVkcyBpbmR1c3RyeSBzdGFuZGFyZHMgKHdoaWNoIHR5cGljYWxseSBzZXQgYSBtYXJnaW4gb2YgZXJyb3Igb2YgNSUpLCB3ZSBvZmZpY2lhbGx5IGFjY2VwdCB0aGUgbW9kZWwncyByZXN1bHRzLiBXZSBoYXZlIHN1ZmZpY2llbnQgZXZpZGVuY2UgdG8gc3RhdGUgdGhhdCB0aGUgZmFjdG9ycyBpZGVudGlmaWVkIGJ5IHRoZSBtb2RlbCB0cnVseSBpbmZsdWVuY2UgY3VzdG9tZXJzJyBkZWNpc2lvbnMgdG8gY2h1cm4uDQoNCioqQnVzaW5lc3MgSW1wYWN0KioNCg0KUHJlZGljdGlvbiBBY2N1cmFjeTogV2UgY2FuIGJlIG1vcmUgY29uZmlkZW50IGluIGFsbG9jYXRpbmcgbWFya2V0aW5nIGJ1ZGdldHMgdG8gcmV0YWluIGN1c3RvbWVycyBpZGVudGlmaWVkIGJ5IHRoZSBtb2RlbCBhcyAiaGlnaC1yaXNrLiINCg0KKipOZXh0IFN0ZXBzOioqIFdlIGNhbiBpbW1lZGlhdGVseSBsYXVuY2ggcmV0ZW50aW9uIGNhbXBhaWducyAoc3VjaCBhcyBzcGVjaWFsIHByb21vdGlvbnMgb3IgZGlzY291bnRzKSB0byB0aGVzZSB0YXJnZXRlZCBjdXN0b21lcnMgYmVjYXVzZSB0aGUgc3VwcG9ydGluZyBkYXRhIGhhcyBiZWVuIHNjaWVudGlmaWNhbGx5IHByb3Zlbi4NCg0KKipDb25jbHVzaW9uIGZvciBNYW5hZ2VtZW50KioNCiJUaGUgZGF0YSBzaG93cyB3aXRoIDk3LjklIGNlcnRhaW50eSB0aGF0IHRoaXMgbW9kZWwgaXMgd29ya2luZyBjb3JyZWN0bHkuIFdlJ3JlIG5vdCBndWVzc2luZzsgdGhlIGNodXJuIHBhdHRlcm5zIHdlJ3JlIHNlZWluZyBhcmUgcmVhbCBhbmQgYWN0aW9uYWJsZSB0byBwcmV2ZW50IGxvc3QgcmV2ZW51ZS4iDQoNCg0KNC4gRGlzY3VzcyB0aGUgcmlzayBpZiB0aGUgKipzYW1wbGUgaXMgbm90IHJlcHJlc2VudGF0aXZlKiouIA0KDQpJZiB0aGUgZGF0YSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGF0IHAtdmFsdWUgKCQwLjAyMSQpIGRvZXNuJ3QgcmVmbGVjdCB0aGUgZGl2ZXJzaXR5IG9mIHlvdXIgcmVhbCBjdXN0b21lciBiYXNlLCB5b3UgZmFjZSB0aGUgZm9sbG93aW5nIHJpc2tzOg0KDQoqKkZhbHNlIFNlbnNlIG9mIENlcnRhaW50eSAoVGhlICJQYXBlciBUaWdlciIgTW9kZWwpKioNCg0KQSBwLXZhbHVlIG9mICQwLjAyMSQgc3VnZ2VzdHMgeW91ciByZXN1bHRzIGFyZSAic3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4iIEhvd2V2ZXIsIHNpZ25pZmljYW5jZSBvbmx5IG1lYW5zIHRoZSBwYXR0ZXJuIGlzIHN0cm9uZyB3aXRoaW4gdGhlIGRhdGEgcHJvdmlkZWQuDQoNCg0KLSAqKlRoZSBSaXNrOioqIElmIHlvdXIgc2FtcGxlIG9ubHkgaW5jbHVkZXMgbG9uZy10ZXJtIHByZW1pdW0gdXNlcnMgYnV0IHRoZSBtb2RlbCBpcyBhcHBsaWVkIHRvIG5ldyAiZnJlZW1pdW0iIHVzZXJzLCB0aGUgbW9kZWwgbWF5IHByZWRpY3QgY2h1cm4gcGVyZmVjdGx5IGZvciB0aGUgc2FtcGxlIGJ1dCBmYWlsIG1pc2VyYWJseSBpbiB0aGUgcmVhbCB3b3JsZC4gWW91IGFyZSBlc3NlbnRpYWxseSBtYWtpbmcgYSBoaWdobHkgY29uZmlkZW50IGRlY2lzaW9uIGJhc2VkIG9uIHRoZSB3cm9uZyBpbmZvcm1hdGlvbi4NCg0KKipNaXNhbGxvY2F0aW9uIG9mIFJldGVudGlvbiBCdWRnZXQqKg0KDQpNYW5hZ2VtZW50IHVzZXMgY2h1cm4gbW9kZWxzIHRvIGRlY2lkZSB3aGVyZSB0byBzcGVuZCBtb25leSAoZS5nLiwgZGlzY291bnRzLCBvdXRyZWFjaCkuDQoNCi0gKipUaGUgUmlzazoqKiBJZiB0aGUgbm9uLXJlcHJlc2VudGF0aXZlIHNhbXBsZSBvdmVyLXJlcHJlc2VudHMgYSBzcGVjaWZpYyBkZW1vZ3JhcGhpYyAoZS5nLiwgdXNlcnMgZnJvbSBhIGNlcnRhaW4gcmVnaW9uKSwgdGhlIG1vZGVsIHdpbGwgaWRlbnRpZnkgImNodXJuIHNpZ25hbHMiIHVuaXF1ZSB0byB0aGF0IGdyb3VwLiBXaGVuIHlvdSBzY2FsZSB0aGlzLCB5b3UgbWlnaHQgc2VuZCBleHBlbnNpdmUgcmV0ZW50aW9uIG9mZmVycyB0byBwZW9wbGUgd2hvIHdlcmVuJ3QgZ29pbmcgdG8gbGVhdmUsIHdoaWxlIGlnbm9yaW5nIHRoZSBhY3R1YWwgImF0LXJpc2siIGN1c3RvbWVycyB0aGUgc2FtcGxlIG1pc3NlZC4NCg0KDQoNCioqTWFza2luZyBIaWRkZW4gVmFyaWFibGVzIChPbWl0dGVkIFZhcmlhYmxlIEJpYXMpKioNCg0KQSBub24tcmVwcmVzZW50YXRpdmUgc2FtcGxlIG9mdGVuIGNvcnJlbGF0ZXMgd2l0aCBtaXNzaW5nIGRhdGEuDQoNCi0gKipUaGUgUmlzazoqKiBJZiB5b3Ugb25seSBzYW1wbGVkIGN1c3RvbWVycyB3aG8gY29udGFjdGVkIHN1cHBvcnQsIHlvdXIgJDIuMzEkIHRlc3Qgc3RhdGlzdGljIG1pZ2h0IGFjdHVhbGx5IGJlIG1lYXN1cmluZyAiY3VzdG9tZXIgZnJ1c3RyYXRpb24iIHJhdGhlciB0aGFuICJjaHVybiBpbnRlbnQuIiBZb3UgbWlnaHQgY29uY2x1ZGUgdGhhdCBhIHNwZWNpZmljIGFwcCBmZWF0dXJlIGlzIGNhdXNpbmcgY2h1cm4sIHdoZW4gaW4gcmVhbGl0eSwgaXQncyB0aGUgbGFjayBvZiBzdXBwb3J0IHJlc3BvbnNlIHRpbWUgdGhhdCB0aGUgc2FtcGxlIGZhaWxlZCB0byBjYXB0dXJlIGdsb2JhbGx5Lg0KDQoqKlBvb3IgR2VuZXJhbGl6YXRpb24gKExvdyBFeHRlcm5hbCBWYWxpZGl0eSkqKg0KDQpJbiBzdGF0aXN0aWNzLCB3ZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGludGVybmFsIGFuZCBleHRlcm5hbCB2YWxpZGl0eS4NCg0KLSAqKkludGVybmFsIFZhbGlkaXR5OioqIERpZCB0aGUgZXhwZXJpbWVudCB3b3JrIGZvciB0aGlzIHNwZWNpZmljIGdyb3VwPyAoWWVzLCAkcCA8IDAuMDUkKS4NCg0KLSAqKkV4dGVybmFsIFZhbGlkaXR5OioqIERvZXMgdGhpcyBhcHBseSB0byB0aGUgd2hvbGUgY29tcGFueT8gKE5vLCBiZWNhdXNlIHRoZSBzYW1wbGUgaXMgYmlhc2VkKS4NCg0KKipTdW1tYXJ5IG9mIFJpc2tzOioqDQotLS0NCjx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmOyBtYXJnaW46IDI1cHggMDsgYm9yZGVyLXJhZGl1czogMTJweDsgb3ZlcmZsb3c6IGhpZGRlbjsgYm9yZGVyOiAxcHggc29saWQgI2NiZDVlMTsgYm94LXNoYWRvdzogMCA0cHggNnB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjEpOyI+DQogICAgPHRoZWFkPg0KICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICNmOGZhZmM7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAzNSU7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzM0MTU1OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTJlOGYwOyI+DQogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICMxZTQwYWY7IGNvbG9yOiAjZmZmZmZmOyBwYWRkaW5nOiA2cHggMTRweDsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA4MDA7IGxldHRlci1zcGFjaW5nOiAxcHg7IGRpc3BsYXk6IGlubGluZS1ibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICBSSVNLIFRZUEUNCiAgICAgICAgICAgICAgICA8L3NwYW4+DQogICAgICAgICAgICA8L3RoPg0KICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmYWZjOyB0ZXh0LWFsaWduOiBsZWZ0OyBib3JkZXItYm90dG9tOiAycHggc29saWQgIzMzNDE1NTsiPg0KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjNDc1NTY5OyBjb2xvcjogI2ZmZmZmZjsgcGFkZGluZzogNnB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogODAwOyBsZXR0ZXItc3BhY2luZzogMXB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij4NCiAgICAgICAgICAgICAgICAgICAgQlVTSU5FU1MgSU1QQUNUDQogICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgPC90aD4NCiAgICAgICAgPC90cj4NCiAgICA8L3RoZWFkPg0KICAgIDx0Ym9keT4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAyNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICMzMzQxNTU7IGNvbG9yOiAjMzhiZGY4OyBmb250LXdlaWdodDogODAwOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzQ3NTU2OTsgYm9yZGVyLXJpZ2h0OiA0cHggc29saWQgIzBlYTVlOTsgZm9udC1zaXplOiAxNHB4OyI+DQogICAgICAgICAgICAgICAgR0VORVJBTElaQVRJT04gRVJST1INCiAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDI1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogI2YxZjVmOTsgY29sb3I6ICMxZTI5M2I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTJlOGYwOyBsaW5lLWhlaWdodDogMS42OyI+DQogICAgICAgICAgICAgICAgVGhlIG1vZGVsIHdvcmtzIGluIHRoZSAibGFiIiBlbnZpcm9ubWVudCBidXQgZmFpbHMgd2hlbiBkZXBsb3llZCB0byB0aGUgYWN0dWFsIHByb2R1Y3Rpb24gcG9wdWxhdGlvbi4NCiAgICAgICAgICAgIDwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgICAgIDx0cj4NCiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMjVweCAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjMzM0MTU1OyBjb2xvcjogIzM4YmRmODsgZm9udC13ZWlnaHQ6IDgwMDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM0NzU1Njk7IGJvcmRlci1yaWdodDogNHB4IHNvbGlkICMwZWE1ZTk7IGZvbnQtc2l6ZTogMTRweDsiPg0KICAgICAgICAgICAgICAgIFNUUkFURUdJQyBNSVNBTElHTk1FTlQNCiAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDI1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogI2UyZThmMDsgY29sb3I6ICMxZTI5M2I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2JkNWUxOyBsaW5lLWhlaWdodDogMS42OyI+DQogICAgICAgICAgICAgICAgTWFya2V0aW5nIHRyZWF0cyB0aGUgd3Jvbmcgc3ltcHRvbXMgYmFzZWQgb24gYmlhc2VkIGRhdGEsIGxlYWRpbmcgdG8gaW5lZmZlY3RpdmUgY2FtcGFpZ25zIGFuZCBsb3N0IHJldmVudWUuDQogICAgICAgICAgICA8L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDI1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogIzMzNDE1NTsgY29sb3I6ICMzOGJkZjg7IGZvbnQtd2VpZ2h0OiA4MDA7IGJvcmRlci1yaWdodDogNHB4IHNvbGlkICMwZWE1ZTk7IGZvbnQtc2l6ZTogMTRweDsiPg0KICAgICAgICAgICAgICAgIE1PREVMIERSSUZUDQogICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAyNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICNmMWY1Zjk7IGNvbG9yOiAjMWUyOTNiOyBsaW5lLWhlaWdodDogMS42OyI+DQogICAgICAgICAgICAgICAgQXMgdGhlIGFjdHVhbCBjdXN0b21lciBwb3B1bGF0aW9uIG5hdHVyYWxseSBldm9sdmVzLCBhIGJpYXNlZCBtb2RlbCBkZWNheXMgbXVjaCBmYXN0ZXIgYW5kIHByb3ZpZGVzIGluY3JlYXNpbmdseSBpbmFjY3VyYXRlIHByZWRpY3Rpb25zLg0KICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgPC90cj4NCiAgICA8L3Rib2R5Pg0KPC90YWJsZT4NCi0tLQ0KDQoNCjUuIEV4cGxhaW4gd2h5IHRoZSBwLXZhbHVlIGRvZXMgKipub3QgbWVhc3VyZSBlZmZlY3Qgc2l6ZSoqLg0KDQpJbiBzdGF0aXN0aWNhbCBkZWNpc2lvbi1tYWtpbmcsIGl0IGlzIGEgY29tbW9uIG1pc2NvbmNlcHRpb24gdGhhdCBhICJzbWFsbCBwLXZhbHVlIiBpbXBsaWVzIGEgImxhcmdlIGVmZmVjdC4iIEhvd2V2ZXIsIHRoZXNlIHR3byBtZXRyaWNzIGFuc3dlciBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBxdWVzdGlvbnMuIEluIHlvdXIgY2h1cm4gcHJlZGljdGlvbiBjYXNlIHN0dWR5LCB0aGUgJHAgPSAwLjAyMSQgdGVsbHMgeW91IHRoYXQgdGhlIHJlc3VsdCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0ICRcYWxwaGEgPSAwLjA1JCwgYnV0IGl0IHNheXMgbm90aGluZyBhYm91dCBob3cgbXVjaCB0aGUgbW9kZWwgYWN0dWFsbHkgaW1wcm92ZXMgcmV0ZW50aW9uIG9yIHJlZHVjZXMgY2h1cm4uDQoNClRoZSBwLXZhbHVlIGRvZXMgbm90IG1lYXN1cmUgZWZmZWN0IHNpemUgZm9yIHRoZSBmb2xsb3dpbmcgcHJpbWFyeSByZWFzb25zOg0KDQoqKkNvbmZvdW5kaW5nIHdpdGggU2FtcGxlIFNpemUqKg0KDQpUaGUgbW9zdCBjcml0aWNhbCByZWFzb24gaXMgdGhhdCBwLXZhbHVlcyBhcmUgaGlnaGx5IGRlcGVuZGVudCBvbiBzYW1wbGUgc2l6ZSAoJG4kKS4NCg0KLSAqKkxhcmdlIFNhbXBsZXM6KiogSW4gYSBsYXJnZSBkYXRhc2V0IChlLmcuLCAxMDAsMDAwIGN1c3RvbWVycyksIGV2ZW4gYSB0aW55LCB0cml2aWFsIGRpZmZlcmVuY2UgaW4gY2h1cm4gcmF0ZXMgY2FuIHByb2R1Y2UgYSB2ZXJ5IHNtYWxsIHAtdmFsdWUuDQoNCi0gKipTbWFsbCBTYW1wbGVzOioqIENvbnZlcnNlbHksIGEgbWFzc2l2ZSwgYnVzaW5lc3MtY2hhbmdpbmcgZWZmZWN0IG1pZ2h0IHByb2R1Y2UgYSBoaWdoIChub24tc2lnbmlmaWNhbnQpIHAtdmFsdWUgc2ltcGx5IGJlY2F1c2UgdGhlIHNhbXBsZSBzaXplIHdhcyB0b28gc21hbGwgdG8gcHJvdmlkZSBjZXJ0YWludHkuDQoNCioqRGlmZmVyZW5jZSBpbiBPYmplY3RpdmVzKioNCg0KVGhlIHR3byBtZXRyaWNzIHJlcHJlc2VudCBkaWZmZXJlbnQgZGltZW5zaW9ucyBvZiB5b3VyIGRhdGE6DQoNCi0gKipQLVZhbHVlIChTdGF0aXN0aWNhbCBTaWduaWZpY2FuY2UpOioqIE1lYXN1cmVzIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgcmVzdWx0LiBJdCBhbnN3ZXJzOiAiSG93IGxpa2VseSBpcyBpdCB0aGF0IHRoZSBkaWZmZXJlbmNlIHdlIHNlZSBpcyBkdWUgdG8gcmFuZG9tIG5vaXNlPyINCg0KLSAqKkVmZmVjdCBTaXplIChQcmFjdGljYWwgU2lnbmlmaWNhbmNlKToqKiBNZWFzdXJlcyB0aGUgbWFnbml0dWRlIG9mIHRoZSByZXN1bHQuIEl0IGFuc3dlcnM6ICJIb3cgbGFyZ2UgaXMgdGhlIGRpZmZlcmVuY2UsIGFuZCBkb2VzIGl0IG1hdHRlciBmb3IgdGhlIGJ1c2luZXNzPyINCg0KKipFeGFtcGxlOioqIEluIHlvdXIgY2h1cm4gbW9kZWwsIGEgcC12YWx1ZSBvZiAwLjAyMSBzdWdnZXN0cyB0aGUgbW9kZWwncyBwcmVkaWN0b3JzIGFyZSBsaWtlbHkgInJlYWwiIGFuZCBub3QganVzdCBsdWNrLiBIb3dldmVyLCB0aGUgRWZmZWN0IFNpemUgKGUuZy4sIENvaGVuJ3MgJGQkIG9yIGFuIE9kZHMgUmF0aW8pIHdvdWxkIHRlbGwgeW91IGlmIHRoZSBtb2RlbCByZWR1Y2VzIGNodXJuIGJ5IDAuMSUgKHRyaXZpYWwpIG9yIDEwJSAoc3Vic3RhbnRpYWwpLg0KDQoqKlRoZSBQLVZhbHVlIFNjYWxlIGlzIE5vdCBMaW5lYXIqKg0KDQpUaGUgcC12YWx1ZSBpcyBhIHByb2JhYmlsaXR5LCBub3QgYSBwaHlzaWNhbCBtZWFzdXJlbWVudC44IEEgcC12YWx1ZSBvZiAwLjAxIGlzIG5vdCAidHdpY2UgYXMgbXVjaCBlZmZlY3QiIGFzIGEgcC12YWx1ZSBvZiAwLjAyLiBCZWNhdXNlIHRoZSBwLXZhbHVlIGlzIGEgZnVuY3Rpb24gb2YgYm90aCB0aGUgZWZmZWN0IG1hZ25pdHVkZSBhbmQgdGhlIHByZWNpc2lvbiAoc3RhbmRhcmQgZXJyb3IpIG9mIHRoZSBlc3RpbWF0ZSwgeW91IGNhbm5vdCBkZWNvdXBsZSB0aGUgInNpemUiIG9mIHRoZSBlZmZlY3QgZnJvbSB0aGUgImNlcnRhaW50eSIgb2YgdGhlIGVzdGltYXRlIHVzaW5nIG9ubHkgdGhlIHAtdmFsdWUuDQoNCioqU3VtbWFyeSBDb21wYXJpc29uOioqDQoNCjx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7IG1hcmdpbjogMjVweCAwOyBib3JkZXItcmFkaXVzOiAxMnB4OyBvdmVyZmxvdzogaGlkZGVuOyBib3JkZXI6IDFweCBzb2xpZCAjY2JkNWUxOyBib3gtc2hhZG93OiAwIDRweCAxNXB4IHJnYmEoMCwwLDAsMC4xKTsiPg0KICAgIDx0aGVhZD4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRoIHN0eWxlPSJwYWRkaW5nOiAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmYWZjOyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMjUlOyBib3JkZXItYm90dG9tOiAycHggc29saWQgIzMzNDE1NTsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2UyZThmMDsiPg0KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjMWU0MGFmOyBjb2xvcjogI2ZmZmZmZjsgcGFkZGluZzogNnB4IDE0cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogODAwOyBsZXR0ZXItc3BhY2luZzogMXB4OyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij4NCiAgICAgICAgICAgICAgICAgICAgRkVBVFVSRQ0KICAgICAgICAgICAgICAgIDwvc3Bhbj4NCiAgICAgICAgICAgIDwvdGg+DQogICAgICAgICAgICA8dGggc3R5bGU9InBhZGRpbmc6IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICNmOGZhZmM7IHRleHQtYWxpZ246IGxlZnQ7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjMzM0MTU1OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTJlOGYwOyI+DQogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICM0NzU1Njk7IGNvbG9yOiAjZmZmZmZmOyBwYWRkaW5nOiA2cHggMTRweDsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA4MDA7IGxldHRlci1zcGFjaW5nOiAxcHg7IGRpc3BsYXk6IGlubGluZS1ibG9jazsiPg0KICAgICAgICAgICAgICAgICAgICBQLVZBTFVFDQogICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgPC90aD4NCiAgICAgICAgICAgIDx0aCBzdHlsZT0icGFkZGluZzogMjBweDsgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZmFmYzsgdGV4dC1hbGlnbjogbGVmdDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICMzMzQxNTU7Ij4NCiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogIzBkOTQ4ODsgY29sb3I6ICNmZmZmZmY7IHBhZGRpbmc6IDZweCAxNHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDgwMDsgbGV0dGVyLXNwYWNpbmc6IDFweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyI+DQogICAgICAgICAgICAgICAgICAgIEVGRkVDVCBTSVpFDQogICAgICAgICAgICAgICAgPC9zcGFuPg0KICAgICAgICAgICAgPC90aD4NCiAgICAgICAgPC90cj4NCiAgICA8L3RoZWFkPg0KICAgIDx0Ym9keT4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAxNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICMzMzQxNTU7IGNvbG9yOiAjMzhiZGY4OyBmb250LXdlaWdodDogODAwOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzQ3NTU2OTsgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzBlYTVlOTsiPlF1ZXN0aW9uPC90ZD4NCiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMTVweCAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNWY5OyBjb2xvcjogIzFlMjkzYjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNjYmQ1ZTE7Ij5JcyB0aGVyZSBhbiBlZmZlY3Q/PC90ZD4NCiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMTVweCAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNWY5OyBjb2xvcjogIzFlMjkzYjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7Ij5Ib3cgYmlnIGlzIHRoZSBlZmZlY3Q/PC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAxNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICMzMzQxNTU7IGNvbG9yOiAjMzhiZGY4OyBmb250LXdlaWdodDogODAwOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzQ3NTU2OTsgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzBlYTVlOTsiPlNhbXBsZSBTaXplPC90ZD4NCiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMTVweCAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlOGYwOyBjb2xvcjogIzFlMjkzYjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjYmQ1ZTE7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNjYmQ1ZTE7Ij5IaWdobHkgc2Vuc2l0aXZlIHRvIDxpPm48L2k+LjwvdGQ+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDE1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogI2UyZThmMDsgY29sb3I6ICMxZTI5M2I7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2JkNWUxOyI+SW5kZXBlbmRlbnQgb2YgPGk+bjwvaT4uPC90ZD4NCiAgICAgICAgPC90cj4NCiAgICAgICAgPHRyPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAxNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICMzMzQxNTU7IGNvbG9yOiAjMzhiZGY4OyBmb250LXdlaWdodDogODAwOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzQ3NTU2OTsgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzBlYTVlOTsiPlJlc3VsdCBUeXBlPC90ZD4NCiAgICAgICAgICAgIDx0ZCBzdHlsZT0icGFkZGluZzogMTVweCAyMHB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjFmNWY5OyBjb2xvcjogIzFlMjkzYjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlMmU4ZjA7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNjYmQ1ZTE7Ij5Qcm9iYWJpbGl0eSAoMCB0byAxKS48L3RkPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAxNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICNmMWY1Zjk7IGNvbG9yOiAjMWUyOTNiOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2UyZThmMDsiPk1hZ25pdHVkZSAoZS5nLiwgbWVhbiBkaWZmZXJlbmNlKS48L3RkPg0KICAgICAgICA8L3RyPg0KICAgICAgICA8dHI+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDE1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogIzMzNDE1NTsgY29sb3I6ICMzOGJkZjg7IGZvbnQtd2VpZ2h0OiA4MDA7IGJvcmRlci1yaWdodDogMnB4IHNvbGlkICMwZWE1ZTk7Ij5CdXNpbmVzcyBVc2U8L3RkPg0KICAgICAgICAgICAgPHRkIHN0eWxlPSJwYWRkaW5nOiAxNXB4IDIwcHg7IGJhY2tncm91bmQtY29sb3I6ICNlMmU4ZjA7IGNvbG9yOiAjMWUyOTNiOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjY2JkNWUxOyI+RGVjaXNpb24gdG8gdHJ1c3QgdGhlIG1vZGVsLjwvdGQ+DQogICAgICAgICAgICA8dGQgc3R5bGU9InBhZGRpbmc6IDE1cHggMjBweDsgYmFja2dyb3VuZC1jb2xvcjogI2UyZThmMDsgY29sb3I6ICMxZTI5M2I7Ij5EZWNpc2lvbiBvbiBST0kgYW5kIGltcGxlbWVudGF0aW9uLjwvdGQ+DQogICAgICAgIDwvdHI+DQogICAgPC90Ym9keT4NCjwvdGFibGU+DQo=