Assignment Objectives

  • Understand the theoretical basis of Bootstrap sampling methods for approximating sampling distributions.

  • Assess the performance of Bootstrap sampling distributions against exact and asymptotic sampling distributions.

  • Implement Bootstrap sampling algorithm and construct sampling distributions using R.


Use of AI Tools

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

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


Asymptotic Distribution of Sample Variance

Assume that \(\{ x_1, x_2, \cdots, x_n \} \to F(x)\) with \(\mu = E[X]\) and \(\sigma^2 = \text{var}(X)\). Denote

\[ s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \mu)^2 \]

If \(n\) is large,

\[ s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right) \]

where \(\mu_4 = E[(X_i - \mu)^4]\) is tje 4th central moment which can be estimated by

\[ \hat{\mu}_4 = \frac{1}{n}\sum_{i=1}^n(x_i-\bar{x})^4. \]

Note: This describes the asymptotic convergence of the sample variance, following from the central limit theorem (CLT). The sample size required for this approximation to hold is situation-dependent.


Question 1: Asymptotic vs Bootstrap Sampling Distributions

Write an essay summarizing the concepts of Asymptotic and Bootstrap Sampling Distributions, along with their key applications. Your discussion should be grounded in your personal understanding of the material. Any external sources including AI tools consulted must be clearly cited.

Essay Prompt: Discuss the concepts of the bootstrap sampling plan, the bootstrap sampling distribution, and the asymptotic sampling distribution in the context of statistics (e.g., sample mean and variance) computed from an independent and identically distributed (i.i.d.) sample. Your discussion should:

  • Clearly outline the key assumptions required for each method.

  • Explain the practical application of each distribution.

  • Provide guidance on when and why one should be preferred over the other in statistical inference.

The statistical sampling process is done to understand the population of interest in question. Due to the total population distribution often being unknown, a sampling distribution can be used to make assumptions and gain a better understanding of how the data is distributed. This can be used to make predictions and estimations, based upon sample statistics and the sampling distribution. There are a few approaches to estimating the sampling distribution and two of these include the asymptotic sampling distribution and the bootstrap sampling distribution. Both of these methods are useful in approximating the sampling distribution and gaining a better understanding of the data in question.

The asymptotic sampling distribution is one way to create a sampling distribution that can be used to make assumptions and inferences about the overall population distribution of a particular data set of interest. The asymptotic sampling distribution describes the distribution as the sample size n grows infinitely large. As n grows large \(s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right)\). This serves as the sample variance for that of an asymptotic sampling distribution. This means that the asymptotic sampling distribution is useful for calculating sample statistics that can be used to make inferences about the population, as the population parameters often are unknown in the random sampling process.

The key assumptions of the asymptotic sampling distribution are that the observations must be independent and identically distributed, the sample size must be sufficiently large, and the population must have finite mean and variance. An important outcome of the asymptotic distribution is that it will result in a normal distribution as long as the assumptions are followed. This is due in part to the Central Limit Theorem which states that as the sample size grows sufficiently large, the sampling distribution will reach an approximately normal distribution, regardless of the population distribution.

The bootstrap sampling distribution method is another valuable choice in approximating a sampling distribution. This bootstrap method involves repeatedly drawing samples from the observed data’s empirical distribution, with replacement. This sampling process serves as a stand-in for the unknown population distribution, and allows for conclusions to be made regarding the distribution of the data. As the sample size grows larger and larger, the sampling distribution will get closer to that of the population distribution. The bootstrap method uses the empirical distribution, \(\hat{F}_n\) as an approximation to the true \({F}_n\) of the population. Then the bootstrap sampling process draws many samples of size n with replacement, to simulate what repeated data collection as an experiment would do.

The key assumption of the bootstrap sampling method are that the data are independently and identically distributed, and that the original sample is representative of the overall population. The bootstrap method is a nonparametric sampling method, so no assumption of a normal distribution is required.

A bootstrap method can be used the created bootstrap confidence intervals which can be interpreted as standard statistical confidence intervals. For example, a bootstrap confidence interval would tell how confident one can be that the true value is between the lower and upper bound of the confidence interval. Additionally, the bootstrap method could be used to estimate the standard error and create approximate sampling distributions which can be used to make assumptions about the overall population distribution.

While both the asymptotic and bootstrap sampling distributions are great ways to visualize sampling distributions in order to see how they are distributed and calculate useful sample statistics, there are cases where one would be ideal to use over the other. The asymptotic sampling distribution is ideal for large samples, however, if a sample size is not sufficiently large, the assumptions for the asymptotic sampling distribution would not be met. So, in the case of a small sample size, the bootstrap method would be the better choice. However, if the sample size is sufficiently large, then the asymptotic sampling distribution would be the ideal choice, as long as all other assumptions of the asymptotic distribution are indeed met. Overall, both sampling methods provide for useful statistical analysis and learning more about how a particular sample of data is distributed, which can be used to further understand the likely trends of the overall population.


Question 2: Daily Coffee Sales (in mL) at Two Different Cafe Locations

This data set represents the volume of regular brewed coffee sold per day (in milliliters) at two different cafe locations over a period of 50 days.

2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050, 4000, 4200, 3150, 3400, 7700, 8200, 
3250, 4400, 3100, 4200, 4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600, 4100, 8400, 
8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100, 3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600, 
8400, 3300, 4200, 4500, 4800, 4300, 8500

We are interested in finding the sampling distribution of sample means that will be used for various inferences about the underlying population mean.

  1. Based on the given data, can the Central Limit Theorem be used to derive the asymptotic sampling distribution of the sample mean? Justify your answer.

Before doing anything else, I will create a data set called ‘coffee’ with the given values above. An create a histogram of these values.

coffee <- c(2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050, 4000, 4200, 3150, 3400, 7700, 8200, 3250, 4400, 3100, 4200, 4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600, 4100, 8400, 8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100, 3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600, 8400, 3300, 4200, 4500, 4800, 4300, 8500)
hist(coffee)

The histogram shows that the distribution of the coffee observations appear to be bimodal. The asymptotic sampling distribution does not require normality, only finite mean and variance and that the sample size is sufficiently large. The sample size is sufficiently large, so the Central Limit Theorem be used to derive the asymptotic sampling distribution in this case. However, it is still worth noting that the data does not follow a normal distribution, but the Central Limit Theorem can still be used.

  1. Apply the bootstrap method to estimate the sampling distribution (often called the bootstrap sampling distribution) of the sample mean. Generate a kernel density estimate from the bootstrap sample means and plot it. Then, use this bootstrap distribution to validate your conclusion from part (a). Make sure your visuals are effective in enhancing the presentation of these results.
B <- 10000
boot_means <- replicate(B, mean(sample(coffee, replace = TRUE)))

# Kernel Density Plot
plot(density(boot_means),
     main="Bootstrap Sampling Distribution of Sample Mean",
     xlab="Sample Mean")

abline(v=mean(coffee), col="red", lwd=2)

The bootstrap approach shows that the distribution of the sample follows an approximately normal distribution. The above graph shows the kernel density estimate. This validates the conclusion made in part a that it is alright to apply the Central Limit Theorem, and that because the sample size is sufficiently large following the random sampling approach will result in a distribution that is approximately normal even if the original distribution was not. The bootstrap method works well in this case for providing a distribution of the sampling mean.

  1. Repeat the analysis in parts (a) and (b) for the sample variance.
boot_vars <- replicate(B, var(sample(coffee, replace = TRUE)))

plot(density(boot_vars),
     main="Bootstrap Sampling Distribution of Sample Variance",
     xlab="Sample Variance")

abline(v=var(coffee), col="red", lwd=2)

The distribution of the sample variance shows some noticeable skew to the left, however, this skew is not too incredibly severe. It is worth noting that variance measurements tend to be more sensitive to skewness than that of the mean. So, this is not surprising that the sample variance is not as close to that of a true normal distribution compared to the sample mean. In this case, the bootstrap method would be a good choice for approximating the sample variance distribution due to it being a nonparametric approach so that the assumption of normality is not required. This means that despite the sample variance distribution showing some slight skewness to the left, the bootstrap method is still a good choice for a sampling distribution.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiIER1ZTogMDItMTctMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMjIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQogXA0KIA0KIyMgKipBc3NpZ25tZW50IE9iamVjdGl2ZXMqKiANCg0KKiBVbmRlcnN0YW5kIHRoZSB0aGVvcmV0aWNhbCBiYXNpcyBvZiBCb290c3RyYXAgc2FtcGxpbmcgbWV0aG9kcyBmb3IgYXBwcm94aW1hdGluZyBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQoqIEFzc2VzcyB0aGUgcGVyZm9ybWFuY2Ugb2YgQm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgYWdhaW5zdCBleGFjdCBhbmQgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQoqIEltcGxlbWVudCBCb290c3RyYXAgc2FtcGxpbmcgYWxnb3JpdGhtIGFuZCBjb25zdHJ1Y3Qgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyB1c2luZyBSLg0KDQpcDQoNCioqVXNlIG9mIEFJIFRvb2xzKioNCg0KKipQb2xpY3kgb24gQUkgVG9vbCBVc2UqKjogU3R1ZGVudHMgbXVzdCBhZGhlcmUgdG8gdGhlIEFJIHRvb2wgcG9saWN5IHNwZWNpZmllZCBpbiB0aGUgY291cnNlIHN5bGxhYnVzLiBUaGUgZGlyZWN0IGNvcHlpbmcgb2YgQUktZ2VuZXJhdGVkIGNvbnRlbnQgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gQWxsIHN1Ym1pdHRlZCB3b3JrIG11c3QgcmVmbGVjdCB5b3VyIG93biB1bmRlcnN0YW5kaW5nOyB3aGVyZSBleHRlcm5hbCB0b29scyBhcmUgY29uc3VsdGVkLCBjb250ZW50IG11c3QgYmUgdGhvcm91Z2hseSByZXBocmFzZWQgYW5kIHN5bnRoZXNpemVkIGluIHlvdXIgb3duIHdvcmRzLg0KDQoqKkNvZGUgSW5jbHVzaW9uIFJlcXVpcmVtZW50Kio6IEFueSBjb2RlIGluY2x1ZGVkIGluIHlvdXIgZXNzYXkgbXVzdCBiZSBwcm9wZXJseSBjb21tZW50ZWQgdG8gZXhwbGFpbiB0aGUgcHVycG9zZSBhbmQvb3IgZXhwZWN0ZWQgb3V0cHV0IG9mIGtleSBjb2RlIGxpbmVzLiBTdWJtaXR0aW5nIEFJLWdlbmVyYXRlZCBjb2RlIHdpdGhvdXQgbWVhbmluZ2Z1bCwgc3R1ZGVudC1hZGRlZCBjb21tZW50cyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4NCg0KXA0KDQoqKkFzeW1wdG90aWMgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBWYXJpYW5jZSoqDQoNCkFzc3VtZSB0aGF0ICRceyB4XzEsIHhfMiwgXGNkb3RzLCB4X24gXH0gXHRvIEYoeCkkIHdpdGggJFxtdSA9IEVbWF0kIGFuZCAkXHNpZ21hXjIgPSBcdGV4dHt2YXJ9KFgpJC4gRGVub3RlIA0KDQokJA0Kc14yID0gXGZyYWN7MX17bi0xfVxzdW1fe2k9MX1ebiAoeF9pIC0gXG11KV4yDQokJA0KDQpJZiAkbiQgaXMgbGFyZ2UsIA0KDQokJA0Kc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNCg0Kd2hlcmUgJFxtdV80ID0gRVsoWF9pIC0gXG11KV40XSQgaXMgdGplIDR0aCBjZW50cmFsIG1vbWVudCB3aGljaCBjYW4gYmUgZXN0aW1hdGVkIGJ5DQoNCiQkDQpcaGF0e1xtdX1fNCA9IFxmcmFjezF9e259XHN1bV97aT0xfV5uKHhfaS1cYmFye3h9KV40Lg0KJCQNCg0KKipOb3RlKio6IFRoaXMgZGVzY3JpYmVzIHRoZSBhc3ltcHRvdGljIGNvbnZlcmdlbmNlIG9mIHRoZSBzYW1wbGUgdmFyaWFuY2UsIGZvbGxvd2luZyBmcm9tIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gKENMVCkuIFRoZSBzYW1wbGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhpcyBhcHByb3hpbWF0aW9uIHRvIGhvbGQgaXMgc2l0dWF0aW9uLWRlcGVuZGVudC4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb24gMTogQXN5bXB0b3RpYyB2cyBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyoqDQoNCldyaXRlIGFuIGVzc2F5IHN1bW1hcml6aW5nIHRoZSBjb25jZXB0cyBvZiBBc3ltcHRvdGljIGFuZCBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucywgYWxvbmcgd2l0aCB0aGVpciBrZXkgYXBwbGljYXRpb25zLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkIGJlIGdyb3VuZGVkIGluIHlvdXIgcGVyc29uYWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgbWF0ZXJpYWwuIEFueSBleHRlcm5hbCBzb3VyY2VzIGluY2x1ZGluZyBBSSB0b29scyBjb25zdWx0ZWQgbXVzdCBiZSBjbGVhcmx5IGNpdGVkLiANCg0KDQoqKkVzc2F5IFByb21wdCoqOiBEaXNjdXNzIHRoZSBjb25jZXB0cyBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHBsYW4sIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGluIHRoZSBjb250ZXh0IG9mIHN0YXRpc3RpY3MgKGUuZy4sIHNhbXBsZSBtZWFuIGFuZCB2YXJpYW5jZSkgY29tcHV0ZWQgZnJvbSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgKGkuaS5kLikgc2FtcGxlLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkOg0KDQoqIENsZWFybHkgb3V0bGluZSB0aGUga2V5IGFzc3VtcHRpb25zIHJlcXVpcmVkIGZvciBlYWNoIG1ldGhvZC4NCg0KKiBFeHBsYWluIHRoZSBwcmFjdGljYWwgYXBwbGljYXRpb24gb2YgZWFjaCBkaXN0cmlidXRpb24uDQoNCiogUHJvdmlkZSBndWlkYW5jZSBvbiB3aGVuIGFuZCB3aHkgb25lIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgb3RoZXIgaW4gc3RhdGlzdGljYWwgaW5mZXJlbmNlLg0KDQoNClRoZSBzdGF0aXN0aWNhbCBzYW1wbGluZyBwcm9jZXNzIGlzIGRvbmUgdG8gdW5kZXJzdGFuZCB0aGUgcG9wdWxhdGlvbiBvZiBpbnRlcmVzdCBpbiBxdWVzdGlvbi4gRHVlIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZnRlbiBiZWluZyB1bmtub3duLCBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBjYW4gYmUgdXNlZCB0byBtYWtlIGFzc3VtcHRpb25zIGFuZCBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkYXRhIGlzIGRpc3RyaWJ1dGVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgcHJlZGljdGlvbnMgYW5kIGVzdGltYXRpb25zLCBiYXNlZCB1cG9uIHNhbXBsZSBzdGF0aXN0aWNzIGFuZCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBUaGVyZSBhcmUgYSBmZXcgYXBwcm9hY2hlcyB0byBlc3RpbWF0aW5nIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gYW5kIHR3byBvZiB0aGVzZSBpbmNsdWRlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIEJvdGggb2YgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZnVsIGluIGFwcHJveGltYXRpbmcgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBhbmQgZ2FpbmluZyBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkYXRhIGluIHF1ZXN0aW9uLiANCg0KVGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIG9uZSB3YXkgdG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSBhc3N1bXB0aW9ucyBhbmQgaW5mZXJlbmNlcyBhYm91dCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhIHBhcnRpY3VsYXIgZGF0YSBzZXQgb2YgaW50ZXJlc3QuIFRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkZXNjcmliZXMgdGhlIGRpc3RyaWJ1dGlvbiBhcyB0aGUgc2FtcGxlIHNpemUgbiBncm93cyBpbmZpbml0ZWx5IGxhcmdlLiBBcyBuIGdyb3dzIGxhcmdlICRzXjIgXHRvIE5cbGVmdChcc2lnbWFeMiwgIFxmcmFje1xtdV80LVxzaWdtYV40fXtufSBccmlnaHQpJC4gVGhpcyBzZXJ2ZXMgYXMgdGhlIHNhbXBsZSB2YXJpYW5jZSBmb3IgdGhhdCBvZiBhbiBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyB1c2VmdWwgZm9yIGNhbGN1bGF0aW5nIHNhbXBsZSBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSBpbmZlcmVuY2VzIGFib3V0IHRoZSBwb3B1bGF0aW9uLCBhcyB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXJzIG9mdGVuIGFyZSB1bmtub3duIGluIHRoZSByYW5kb20gc2FtcGxpbmcgcHJvY2Vzcy4gDQoNClRoZSBrZXkgYXNzdW1wdGlvbnMgb2YgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGFyZSB0aGF0IHRoZSBvYnNlcnZhdGlvbnMgbXVzdCBiZSBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQsIHRoZSBzYW1wbGUgc2l6ZSBtdXN0IGJlIHN1ZmZpY2llbnRseSBsYXJnZSwgYW5kIHRoZSBwb3B1bGF0aW9uIG11c3QgaGF2ZSBmaW5pdGUgbWVhbiBhbmQgdmFyaWFuY2UuIEFuIGltcG9ydGFudCBvdXRjb21lIG9mIHRoZSBhc3ltcHRvdGljIGRpc3RyaWJ1dGlvbiBpcyB0aGF0IGl0IHdpbGwgcmVzdWx0IGluIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoZSBhc3N1bXB0aW9ucyBhcmUgZm9sbG93ZWQuIFRoaXMgaXMgZHVlIGluIHBhcnQgdG8gdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSB3aGljaCBzdGF0ZXMgdGhhdCBhcyB0aGUgc2FtcGxlIHNpemUgZ3Jvd3Mgc3VmZmljaWVudGx5IGxhcmdlLCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHdpbGwgcmVhY2ggYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uLCByZWdhcmRsZXNzIG9mIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gDQoNClRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG1ldGhvZCBpcyBhbm90aGVyIHZhbHVhYmxlIGNob2ljZSBpbiBhcHByb3hpbWF0aW5nIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBUaGlzIGJvb3RzdHJhcCBtZXRob2QgaW52b2x2ZXMgcmVwZWF0ZWRseSBkcmF3aW5nIHNhbXBsZXMgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YSdzIGVtcGlyaWNhbCBkaXN0cmlidXRpb24sIHdpdGggcmVwbGFjZW1lbnQuIFRoaXMgc2FtcGxpbmcgcHJvY2VzcyBzZXJ2ZXMgYXMgYSBzdGFuZC1pbiBmb3IgdGhlIHVua25vd24gcG9wdWxhdGlvbiBkaXN0cmlidXRpb24sIGFuZCBhbGxvd3MgZm9yIGNvbmNsdXNpb25zIHRvIGJlIG1hZGUgcmVnYXJkaW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEuIEFzIHRoZSBzYW1wbGUgc2l6ZSBncm93cyBsYXJnZXIgYW5kIGxhcmdlciwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3aWxsIGdldCBjbG9zZXIgdG8gdGhhdCBvZiB0aGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgbWV0aG9kIHVzZXMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24sICRcaGF0e0Z9X24kIGFzIGFuIGFwcHJveGltYXRpb24gdG8gdGhlIHRydWUgJHtGfV9uJCBvZiB0aGUgcG9wdWxhdGlvbi4gVGhlbiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHByb2Nlc3MgZHJhd3MgbWFueSBzYW1wbGVzIG9mIHNpemUgbiB3aXRoIHJlcGxhY2VtZW50LCB0byBzaW11bGF0ZSB3aGF0IHJlcGVhdGVkIGRhdGEgY29sbGVjdGlvbiBhcyBhbiBleHBlcmltZW50IHdvdWxkIGRvLiANCg0KVGhlIGtleSBhc3N1bXB0aW9uIG9mIHRoZSBib290c3RyYXAgc2FtcGxpbmcgbWV0aG9kIGFyZSB0aGF0IHRoZSBkYXRhIGFyZSBpbmRlcGVuZGVudGx5IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZCwgYW5kIHRoYXQgdGhlIG9yaWdpbmFsIHNhbXBsZSBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uLiBUaGUgYm9vdHN0cmFwIG1ldGhvZCBpcyBhIG5vbnBhcmFtZXRyaWMgc2FtcGxpbmcgbWV0aG9kLCBzbyBubyBhc3N1bXB0aW9uIG9mIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBpcyByZXF1aXJlZC4gDQoNCkEgYm9vdHN0cmFwIG1ldGhvZCBjYW4gYmUgdXNlZCB0aGUgY3JlYXRlZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2hpY2ggY2FuIGJlIGludGVycHJldGVkIGFzIHN0YW5kYXJkIHN0YXRpc3RpY2FsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBGb3IgZXhhbXBsZSwgYSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCB3b3VsZCB0ZWxsIGhvdyBjb25maWRlbnQgb25lIGNhbiBiZSB0aGF0IHRoZSB0cnVlIHZhbHVlIGlzIGJldHdlZW4gdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbC4gQWRkaXRpb25hbGx5LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb3VsZCBiZSB1c2VkIHRvIGVzdGltYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBhbmQgY3JlYXRlIGFwcHJveGltYXRlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gDQoNCldoaWxlIGJvdGggdGhlIGFzeW1wdG90aWMgYW5kIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIGFyZSBncmVhdCB3YXlzIHRvIHZpc3VhbGl6ZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIGluIG9yZGVyIHRvIHNlZSBob3cgdGhleSBhcmUgZGlzdHJpYnV0ZWQgYW5kIGNhbGN1bGF0ZSB1c2VmdWwgc2FtcGxlIHN0YXRpc3RpY3MsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBvbmUgd291bGQgYmUgaWRlYWwgdG8gdXNlIG92ZXIgdGhlIG90aGVyLiBUaGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgaWRlYWwgZm9yIGxhcmdlIHNhbXBsZXMsIGhvd2V2ZXIsIGlmIGEgc2FtcGxlIHNpemUgaXMgbm90IHN1ZmZpY2llbnRseSBsYXJnZSwgdGhlIGFzc3VtcHRpb25zIGZvciB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gd291bGQgbm90IGJlIG1ldC4gU28sIGluIHRoZSBjYXNlIG9mIGEgc21hbGwgc2FtcGxlIHNpemUsIHRoZSBib290c3RyYXAgbWV0aG9kIHdvdWxkIGJlIHRoZSBiZXR0ZXIgY2hvaWNlLiBIb3dldmVyLCBpZiB0aGUgc2FtcGxlIHNpemUgaXMgc3VmZmljaWVudGx5IGxhcmdlLCB0aGVuIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBhcyBsb25nIGFzIGFsbCBvdGhlciBhc3N1bXB0aW9ucyBvZiB0aGUgYXN5bXB0b3RpYyBkaXN0cmlidXRpb24gYXJlIGluZGVlZCBtZXQuIE92ZXJhbGwsIGJvdGggc2FtcGxpbmcgbWV0aG9kcyBwcm92aWRlIGZvciB1c2VmdWwgc3RhdGlzdGljYWwgYW5hbHlzaXMgYW5kIGxlYXJuaW5nIG1vcmUgYWJvdXQgaG93IGEgcGFydGljdWxhciBzYW1wbGUgb2YgZGF0YSBpcyBkaXN0cmlidXRlZCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZnVydGhlciB1bmRlcnN0YW5kIHRoZSBsaWtlbHkgdHJlbmRzIG9mIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24uDQoNCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuIA0KDQpgYGANCjI4NTAsIDMyMDAsIDI5MDAsIDMxMDAsIDI5NTAsIDc4MDAsIDgxMDAsIDc5MDAsIDMzMDAsIDMwNTAsIDQwMDAsIDQyMDAsIDMxNTAsIDM0MDAsIDc3MDAsIDgyMDAsIA0KMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgDQo4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCANCjg0MDAsIDMzMDAsIDQyMDAsIDQ1MDAsIDQ4MDAsIDQzMDAsIDg1MDANCmBgYA0KV2UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBtZWFucyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdmFyaW91cyBpbmZlcmVuY2VzIGFib3V0IHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gbWVhbi4NCg0KYSkgQmFzZWQgb24gdGhlIGdpdmVuIGRhdGEsIGNhbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4/IEp1c3RpZnkgeW91ciBhbnN3ZXIuDQoNCkJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLCBJIHdpbGwgY3JlYXRlIGEgZGF0YSBzZXQgY2FsbGVkICdjb2ZmZWUnIHdpdGggdGhlIGdpdmVuIHZhbHVlcyBhYm92ZS4gQW4gY3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZXNlIHZhbHVlcy4NCg0KYGBge3J9DQpjb2ZmZWUgPC0gYygyODUwLCAzMjAwLCAyOTAwLCAzMTAwLCAyOTUwLCA3ODAwLCA4MTAwLCA3OTAwLCAzMzAwLCAzMDUwLCA0MDAwLCA0MjAwLCAzMTUwLCAzNDAwLCA3NzAwLCA4MjAwLCAzMjUwLCA0NDAwLCAzMTAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLCA0MTAwLCA4NDAwLCA4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCA4NDAwLCAzMzAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwKQ0KaGlzdChjb2ZmZWUpDQpgYGANCg0KVGhlIGhpc3RvZ3JhbSBzaG93cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGNvZmZlZSBvYnNlcnZhdGlvbnMgYXBwZWFyIHRvIGJlIGJpbW9kYWwuIFRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCByZXF1aXJlIG5vcm1hbGl0eSwgb25seSBmaW5pdGUgbWVhbiBhbmQgdmFyaWFuY2UgYW5kIHRoYXQgdGhlIHNhbXBsZSBzaXplIGlzIHN1ZmZpY2llbnRseSBsYXJnZS4gVGhlIHNhbXBsZSBzaXplIGlzIHN1ZmZpY2llbnRseSBsYXJnZSwgc28gdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBiZSB1c2VkIHRvIGRlcml2ZSB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaW4gdGhpcyBjYXNlLiBIb3dldmVyLCBpdCBpcyBzdGlsbCB3b3J0aCBub3RpbmcgdGhhdCB0aGUgZGF0YSBkb2VzIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCBidXQgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBjYW4gc3RpbGwgYmUgdXNlZC4gDQoNCg0KYikgQXBwbHkgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZXN0aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiAob2Z0ZW4gY2FsbGVkIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uKSBvZiB0aGUgc2FtcGxlIG1lYW4uIEdlbmVyYXRlIGEga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUgZnJvbSB0aGUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucyBhbmQgcGxvdCBpdC4gVGhlbiwgdXNlIHRoaXMgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiB0byB2YWxpZGF0ZSB5b3VyIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChhKS4gTWFrZSBzdXJlIHlvdXIgdmlzdWFscyBhcmUgZWZmZWN0aXZlIGluIGVuaGFuY2luZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZXNlIHJlc3VsdHMuDQoNCmBgYHtyfQ0KQiA8LSAxMDAwMA0KYm9vdF9tZWFucyA8LSByZXBsaWNhdGUoQiwgbWVhbihzYW1wbGUoY29mZmVlLCByZXBsYWNlID0gVFJVRSkpKQ0KDQojIEtlcm5lbCBEZW5zaXR5IFBsb3QNCnBsb3QoZGVuc2l0eShib290X21lYW5zKSwNCiAgICAgbWFpbj0iQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBTYW1wbGUgTWVhbiIsDQogICAgIHhsYWI9IlNhbXBsZSBNZWFuIikNCg0KYWJsaW5lKHY9bWVhbihjb2ZmZWUpLCBjb2w9InJlZCIsIGx3ZD0yKQ0KYGBgDQoNClRoZSBib290c3RyYXAgYXBwcm9hY2ggc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgZm9sbG93cyBhbiBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZSBhYm92ZSBncmFwaCBzaG93cyB0aGUga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUuIFRoaXMgdmFsaWRhdGVzIHRoZSBjb25jbHVzaW9uIG1hZGUgaW4gcGFydCBhIHRoYXQgaXQgaXMgYWxyaWdodCB0byBhcHBseSB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtLCBhbmQgdGhhdCBiZWNhdXNlIHRoZSBzYW1wbGUgc2l6ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UgZm9sbG93aW5nIHRoZSByYW5kb20gc2FtcGxpbmcgYXBwcm9hY2ggd2lsbCByZXN1bHQgaW4gYSBkaXN0cmlidXRpb24gdGhhdCBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCBldmVuIGlmIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24gd2FzIG5vdC4gVGhlIGJvb3RzdHJhcCBtZXRob2Qgd29ya3Mgd2VsbCBpbiB0aGlzIGNhc2UgZm9yIHByb3ZpZGluZyBhIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxpbmcgbWVhbi4gDQoNCg0KYykgUmVwZWF0IHRoZSBhbmFseXNpcyBpbiBwYXJ0cyAoYSkgYW5kIChiKSBmb3IgdGhlIHNhbXBsZSB2YXJpYW5jZS4NCg0KDQoNCmBgYHtyfQ0KYm9vdF92YXJzIDwtIHJlcGxpY2F0ZShCLCB2YXIoc2FtcGxlKGNvZmZlZSwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KcGxvdChkZW5zaXR5KGJvb3RfdmFycyksDQogICAgIG1haW49IkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlIiwNCiAgICAgeGxhYj0iU2FtcGxlIFZhcmlhbmNlIikNCg0KYWJsaW5lKHY9dmFyKGNvZmZlZSksIGNvbD0icmVkIiwgbHdkPTIpDQoNCmBgYA0KDQoNClRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSBzaG93cyBzb21lIG5vdGljZWFibGUgc2tldyB0byB0aGUgbGVmdCwgaG93ZXZlciwgdGhpcyBza2V3IGlzIG5vdCB0b28gaW5jcmVkaWJseSBzZXZlcmUuIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHZhcmlhbmNlIG1lYXN1cmVtZW50cyB0ZW5kIHRvIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHNrZXduZXNzIHRoYW4gdGhhdCBvZiB0aGUgbWVhbi4gU28sIHRoaXMgaXMgbm90IHN1cnByaXNpbmcgdGhhdCB0aGUgc2FtcGxlIHZhcmlhbmNlIGlzIG5vdCBhcyBjbG9zZSB0byB0aGF0IG9mIGEgdHJ1ZSBub3JtYWwgZGlzdHJpYnV0aW9uIGNvbXBhcmVkIHRvIHRoZSBzYW1wbGUgbWVhbi4gSW4gdGhpcyBjYXNlLCB0aGUgYm9vdHN0cmFwIG1ldGhvZCB3b3VsZCBiZSBhIGdvb2QgY2hvaWNlIGZvciBhcHByb3hpbWF0aW5nIHRoZSBzYW1wbGUgdmFyaWFuY2UgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdCBiZWluZyBhIG5vbnBhcmFtZXRyaWMgYXBwcm9hY2ggc28gdGhhdCB0aGUgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgbm90IHJlcXVpcmVkLiBUaGlzIG1lYW5zIHRoYXQgZGVzcGl0ZSB0aGUgc2FtcGxlIHZhcmlhbmNlIGRpc3RyaWJ1dGlvbiBzaG93aW5nIHNvbWUgc2xpZ2h0IHNrZXduZXNzIHRvIHRoZSBsZWZ0LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBpcyBzdGlsbCBhIGdvb2QgY2hvaWNlIGZvciBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gDQoNCg0KDQo=