What is normal?
Let’s draw \(X_i\) from \(1\) to \(n\) successes independently from a population where \(\mu\) and \(\sigma\) are known, then we would discover that the standardized average
\[
\frac{\bar{x} - \mu}{\sigma / \sqrt{n}}
\]
is asymptotically normal with mean 0 and variance 1 (often called normal(0,1)). * This can be interpreted as when \(n\) is large enough the average is approximately normal with mean \(\mu\) and standard deviation \(\sigma / \sqrt{n}\) .
This result is also known as the Central Limit Theorem (CLT), a cornerstone of classical statistics.
Normal means a symmetric distribution with mesokurtic “tailedness”, or kurtosis of 3. This implies there are not too many rare outcomes in the tails of the distribution.
How can we check this?
Simulation is an excellent way. Now to get your feet good and wet…
Let’s first do this for the binomial distribution, the CLT translates into saying that if \(x_n\) are binomial distribution outcomes with parameters \(n\) and \(p\) then
\[
z = \frac{x_n - np}{\sqrt{np(1-p)}}
\]
then the standardized \(x\) , called \(z\) , is approximately Normal(0,1)
.
Let’s investigate
Create binomial random numbers in Excel using BINOM.INV(n, p, RAND())
.
RAND()
is the randomly generated cumulative probability of a successful binomial outcome.
Start with just a few trials: \(n = 10\) and \(p = 0.20\) .
Then generate in 1000 separate cells
Almost bell-shaped. A little lop-sided too… Here are some statistics on our experimental runs.
-0.027
0.9983
-0.3651
0.3635
3.0047
Almost a “normal” mesokurtotic result of 3.0. A small skewness indicating a little asymmetry.
Now try this
Much more symmetric. Here are some summary statistics.
0.0096
1.0005
0
-0.0524
3.1849
Slightly negatively skewed tail we can eyeball, but very small.
Mean is near zero, and median not far from zero too.
Standard deviation is nearly 1.
Kurtosis is almost on that magic normal mesokurtic number of 3.0.
Let’s look at this
Here is a standard normal distribution, \(\mu = 0\) , and \(\sigma = 1\) . This is a distribution centered on 0. How is this like the calculated \(z\) -score?
show / hide
We can center any distribution’s outcomes \(x\) around zero by simply calculating the deviation of the outcome from the mean of all outcomes. Then, we can standardize the deviations by dividing the deviations by the standard deviation of outcomes. The result is a mean of zero and a standard deviation of 1.
\[
z = \frac{x - \mu}{\sigma}
\] In a spread sheet generate 10 outcomes sampled from the uniform distribution drawn from the unit interval \((0,1)\) . You can do this by oopening up a fresh new workbook in Excel.
Put your cursor on cell B3 and type \(=rand()\) . Copy and paste this cell down another 9 rows. Label this column x
.
Calculate the mean and standard deviation three columns to the right in cells D3 and D4.
In column C next to the random outcomes calculate the z score using a formula like \(=(B3 - \$D\$3)/\$D\$4\) .
Copy and paste this cell down next to the outcomes column. Label this new column z
.
Next calculate the mean and standard deviation of the ‘z’ random variable samples.
Every time you change something on the spread sheet new random numbers are sampled. But what does not change?
Here is a graph of the z-score you generated above.
gnorm(0, 1, a = -2, b = 2, calcProb = TRUE)
What is the interpretation of the \(-2\) and \(+2\)
show / hide
These are z-scores which measure the number of standard deviations an outcome is from zero.
What is probability that an outcome is not 2 standard deviations from the mean?
show / hide
From the graph, the probability that either \(z > 2\) or \(z < -2\) is the probability of the union of these two events.
\[
Pr[(z < -2) \cup (z > 2)] = Pr(z<-2) + Pr(z>2) = 0.0228 + 0.0228 = 0.0456
\]
Where do normal outcomes come from?
Is anything normal? Normal distributions very naturally come from a very interesting source: sums and averages of random samples of any set of outcomes.
Suppose we think that the number of students out of a random sample of 15 students from course sections (classes) that voted in last year’s election is 1.2 students/year-class. Lets sample this intensity using the Poisson distribution with \(\lambda = 1.2\) 10,000 times. When we do this, we calculate the sums, averages, and variances of each and every of the 10,000 samples. Then we plot. Here’s the result.
clt_sim(15, source = "P", param1 = 1.89)
What do we notice?
show / hide
The original distribution of students is heavily skewed to the right. This is a poisson distribution, that if we interpret as a binomial means that the proportion of voting students is
\[
p = \frac{\lambda}{n} = \frac{1.2}{15} = 0.08
\] 2. The sum and the means of each random sample seem to be symmetrical and with a nice, calm kurtosis (maybe a kurtosis = 3.0). In fact this distribution is the normal distribution.
The distribution of the variance of outcomes is skewed to the right. This distribution is the chi-squared distribution.
LS0tDQp0aXRsZTogIlByb2JhYmlsaXR5IERpc3RyaWJ1dGlvbnM6IE5vcm1hbCINCmF1dGhvcjogIkNvcHlyaWdodCAyMDE4LiBXaWxsaWFtIEcuIEZvb3RlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgZm9udHNpemU6IDhwdA0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBzb3VyY2VfY29kZTogZW1iZWQNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQotLS0NCg0KPHNjcmlwdD4NCmZ1bmN0aW9uIHNob3dUZXh0KHkpIHsNCiAgICB2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHkpOw0KICAgIGlmICh4LnN0eWxlLmRpc3BsYXkgPT09ICJub25lIikgew0KICAgICAgICB4LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHguc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCiAgICB9DQp9DQo8L3NjcmlwdD4NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldCh0aWR5ID0gVFJVRSkNCmtuaXRyOjpvcHRzX2NodW5rJHNldCh0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9MzYpKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHNpemUgPSAic21hbGwiKQ0Ka25pdHI6Om9wdHNfaG9va3Mkc2V0KGZpZy53aWR0aCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsNCiAgaWYgKG9wdGlvbnMkZmlnLndpZHRoIDwgb3B0aW9ucyRmaWcuaGVpZ2h0KSB7DQogICAgb3B0aW9ucyRmaWcud2lkdGggPSBvcHRpb25zJGZpZy5oZWlnaHQNCiAgfQ0KICBvcHRpb25zDQp9KQ0Ka25pdHI6OmtuaXRfaG9va3Mkc2V0KG15c2l6ZSA9IGZ1bmN0aW9uKGJlZm9yZSwgb3B0aW9ucywgZW52aXIpIHsNCiAgaWYgKGJlZm9yZSkgDQogICAgcmV0dXJuKG9wdGlvbnMkc2l6ZSkNCn0pDQoNCmdub3JtIDwtICBmdW5jdGlvbihtdSwgc2lnbWEsYT1OQSxiPU5BLGNhbGNQcm9iPSFhbGwoaXMubmEoYyhhLGIpKSkscXVhbnRpbGU9TkEsY2FsY1F1YW50PSFpcy5uYShxdWFudGlsZSkpDQp7DQogIHZhbHVlcyA8LSAgc2VxKC0xLDEsLjAwNSkgKiA0ICogc2lnbWEgKyBtdQ0KICBwcm9icyA8LSAgZG5vcm0odmFsdWVzLCBtdSwgc2lnbWEpDQogIHBsb3QodmFsdWVzLCBwcm9icywgYXhlcyA9IEYsIHR5cGUgPSAibiIsIHhsYWIgPSAiVmFsdWVzIiwgDQogICAgeWxhYiA9ICJQcm9iYWJpbGl0eSBEZW5zaXR5IiwNCiAgICBtYWluID0gc3Vic3RpdHV0ZShwYXN0ZSgiTm9ybWFsIERpc3RyaWJ1dGlvbiB3aXRoICIsbXUgPT0gbSwiLCAiLHNpZ21hID09IHMpLGxpc3QobT1tdSxzPXNpZ21hKSkpDQogIGF4aXMoMSwgcG9zID0gMCkNCiAgYWJsaW5lKDAsMCxjb2w9MSkNCiAgbGluZXModmFsdWVzLCBwcm9icywgY29sID0gMikNCiAgbG8gPC0gIG11IC0gNCAqIHNpZ21hDQogIGhpIDwtICBtdSArIDQgKiBzaWdtYQ0KICBoIDwtICBkbm9ybShtdSxtdSxzaWdtYSkNCiAgY2V4IDwtIDAuOA0KICBpZihjYWxjUHJvYj09VCkNCiAgew0KICAgIGlmKCFpcy5uYShhKSAmJiAhaXMubmEoYikgJiYgYSA+IGIpew0KICAgICAgZCA9IGE7IGEgPSBiOyBiID0gZA0KICAgIH0NCiAgICBpZihpcy5uYShhKSB8fCBhIDw9IGxvKXsgdWxvID0gbG8gfQ0KICAgIGVsc2UgaWYoYSA8PSBoaSl7IHVsbyA9IGEgfQ0KICAgIGVsc2UgeyB1bG8gPSBoaSB9DQogICAgaWYoaXMubmEoYikgfHwgYiA+PSBoaSl7IHVoaSA9IGhpIH0NCiAgICBlbHNlIGlmKGIgPj0gbG8peyB1aGkgPSBiIH0NCiAgICBlbHNlIHsgdWhpID0gbG8gfQ0KICAgIHUgPC0gIHNlcSh1bG8sdWhpLGxlbmd0aD02MDEpDQogICAgbGluZXModSxkbm9ybSh1LG11LHNpZ21hKSx0eXBlPSJoIixjb2w9MikNCiAgICBpZighaXMubmEoYSkgJiYgIWlzLm5hKGIpKXsNCiAgICAgIHRleHQobXUgLSAzLjkgKiBzaWdtYSwgMC44ICogaCwNCiAgICAgICAgcGFzdGUoIlAoICIsYSwiIDwgWCA8ICIsYiwiICkgPSAiLA0KICAJcm91bmQocG5vcm0oYixtdSxzaWdtYSktcG5vcm0oYSxtdSxzaWdtYSksZGlnaXRzPTQpLHNlcD0iIiksDQogICAgICAgIGFkaj0wLGNvbD00LGNleD1jZXgpDQogICAgICB0ZXh0KG11IC0gMy45ICogc2lnbWEsIDAuNiAqIGgsDQogICAgICAgIHBhc3RlKCJQKCBYIDwgIixhLCIgKSA9ICIsDQogICAgICAgICAgcm91bmQocG5vcm0oYSxtdSxzaWdtYSksZGlnaXRzPTQpLHNlcD0iIiksYWRqPTAsY29sPTQsY2V4PWNleCkNCiAgICAgIHRleHQobXUgKyAzLjkgKiBzaWdtYSwgMC41ICogaCwNCiAgICAgICAgcGFzdGUoIlAoIFggPiAiLGIsIiApID0gIiwNCiAgICAgICAJcm91bmQoMS1wbm9ybShiLG11LHNpZ21hKSxkaWdpdHM9NCksc2VwPSIiKSxhZGo9MSxjb2w9NCxjZXg9Y2V4KQ0KICAgIH0NCiAgICBlbHNlIGlmKCFpcy5uYShhKSAmJiBpcy5uYShiKSl7DQogICAgICB0ZXh0KG11IC0gMy45ICogc2lnbWEsIDAuNiAqIGgsDQogICAgICAgIHBhc3RlKCJQKCBYIDwgIixhLCIgKSA9ICIsDQogICAgICAgICAgcm91bmQocG5vcm0oYSxtdSxzaWdtYSksZGlnaXRzPTQpLHNlcD0iIiksYWRqPTAsY29sPTQsY2V4PWNleCkNCiAgICAgIHRleHQobXUgKyAzLjkgKiBzaWdtYSwgMC41ICogaCwNCiAgICAgICAgcGFzdGUoIlAoIFggPiAiLGEsIiApID0gIiwNCiAgICAgICAJcm91bmQoMS1wbm9ybShhLG11LHNpZ21hKSxkaWdpdHM9NCksc2VwPSIiKSxhZGo9MSxjb2w9NCxjZXg9Y2V4KQ0KICAgIH0NCiAgICBlbHNlIGlmKGlzLm5hKGEpICYmICFpcy5uYShiKSl7DQogICAgICB0ZXh0KG11IC0gMy45ICogc2lnbWEsIDAuNiAqIGgsDQogICAgICAgIHBhc3RlKCJQKCBYIDwgIixiLCIgKSA9ICIsDQogICAgICAgICAgcm91bmQocG5vcm0oYixtdSxzaWdtYSksZGlnaXRzPTQpLHNlcD0iIiksYWRqPTAsY29sPTQsY2V4PWNleCkNCiAgICAgIHRleHQobXUgKyAzLjkgKiBzaWdtYSwgMC41ICogaCwNCiAgICAgICAgcGFzdGUoIlAoIFggPiAiLGIsIiApID0gIiwNCiAgICAgICAJcm91bmQoMS1wbm9ybShiLG11LHNpZ21hKSxkaWdpdHM9NCksc2VwPSIiKSxhZGo9MSxjb2w9NCxjZXg9Y2V4KQ0KICAgIH0NCiAgfQ0KICBlbHNlIGlmKGNhbGNRdWFudD09VCkNCiAgew0KICAgIHpvZmZzZXQgPSAtMC4wMg0KICAgIGlmKCBxdWFudGlsZSA8PSAwIHx8IHF1YW50aWxlID49IDEpIHF1YW50aWxlID0gMC41DQogICAgeCA9IHFub3JtKHF1YW50aWxlLG11LHNpZ21hKQ0KICAgIGlmKCB4ID4gbG8gJiYgeCA8IGhpKQ0KICAgIHsNCiAgICAgIHUgPSBzZXEobG8seCxsZW5ndGg9NjAxKQ0KICAgICAgbGluZXModSxkbm9ybSh1LG11LHNpZ21hKSx0eXBlPSJoIixjb2w9MikNCiAgICAgIHRleHQoeCwgem9mZnNldCAqIGgsDQogIAlwYXN0ZSgieiA9ICIscm91bmQocW5vcm0ocXVhbnRpbGUpLDIpLHNlcD0iIiksYWRqPTAuNSxjb2w9NCxjZXg9Y2V4KQ0KICAgIH0NCiAgICBlbHNlIGlmKHggPj0gaGkpDQogICAgew0KICAgICAgdSA9IHNlcShsbyxoaSxsZW5ndGg9NjAxKQ0KICAgICAgbGluZXModSxkbm9ybSh1LG11LHNpZ21hKSx0eXBlPSJoIixjb2w9MikNCiAgICAgIHRleHQoaGksIHpvZmZzZXQgKiBoLA0KICAJcGFzdGUoInogPSAiLHJvdW5kKHFub3JtKHF1YW50aWxlKSwyKSxzZXA9IiIpLGFkaj0wLjUsY29sPTQsY2V4PWNleCkNCiAgICB9DQogICAgZWxzZSBpZiggeCA8PSBsbykNCiAgICB7DQogICAgICB0ZXh0KGxvLCB6b2Zmc2V0ICogaCwNCiAgCXBhc3RlKCJ6ID0gIixyb3VuZChxbm9ybShxdWFudGlsZSksMiksc2VwPSIiKSxhZGo9MC41LGNvbD00LGNleD1jZXgpDQogICAgfQ0KICAgIHRleHQobXUgLSAzLjkgKiBzaWdtYSwgMC41ICogaCwNCiAgICAgIHBhc3RlKCJQKCBYIDwgIixzaWduaWYoeCw0KSwiICkgPSAiLA0KICAJcm91bmQocXVhbnRpbGUsZGlnaXRzPTQpLHNlcD0iIiksYWRqPTAsY29sPTQsY2V4PWNleCkNCiAgfQ0KICByZXR1cm4oaW52aXNpYmxlKCkpDQp9DQoNCmNsdF9zaW0gPC0gZnVuY3Rpb24obiwgc291cmNlPU5VTEwsIHBhcmFtMT1OVUxMLCBwYXJhbTI9TlVMTCkgew0KICByIDwtIDEwMDAwICAjIE51bWJlciBvZiByZXBsaWNhdGlvbnMvc2FtcGxlcyAtIERPIE5PVCBBREpVU1QNCiAgIyBUaGlzIHByb2R1Y2VzIGEgbWF0cml4IG9mIG9ic2VydmF0aW9ucyB3aXRoICANCiAgIyBuIGNvbHVtbnMgYW5kIHIgcm93cy4gRWFjaCByb3cgaXMgb25lIHNhbXBsZToNCiAgbXkuc2FtcGxlcyA8LSBzd2l0Y2goc291cmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAiRSIgPSBtYXRyaXgocmV4cChuKnIscGFyYW0xKSxyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIk4iID0gbWF0cml4KHJub3JtKG4qcixwYXJhbTEscGFyYW0yKSxyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIlUiID0gbWF0cml4KHJ1bmlmKG4qcixwYXJhbTEscGFyYW0yKSxyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIlAiID0gbWF0cml4KHJwb2lzKG4qcixwYXJhbTEpLHIpLA0KICAgICAgICAgICAgICAgICAgICAgICAiQyIgPSBtYXRyaXgocmNhdWNoeShuKnIscGFyYW0xLHBhcmFtMiksciksDQogICAgICAgICAgICAgICAgICAgICAgICJCIiA9IG1hdHJpeChyYmlub20obipyLHBhcmFtMSxwYXJhbTIpLHIpLA0KICAgICAgICAgICAgICAgICAgICAgICAiRyIgPSBtYXRyaXgocmdhbW1hKG4qcixwYXJhbTEscGFyYW0yKSxyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIlgiID0gbWF0cml4KHJjaGlzcShuKnIscGFyYW0xKSxyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIlQiID0gbWF0cml4KHJ0KG4qcixwYXJhbTEpLHIpKQ0KICBhbGwuc2FtcGxlLnN1bXMgPC0gYXBwbHkobXkuc2FtcGxlcywxLHN1bSkNCiAgYWxsLnNhbXBsZS5tZWFucyA8LSBhcHBseShteS5zYW1wbGVzLDEsbWVhbikgICANCiAgYWxsLnNhbXBsZS52YXJzIDwtIGFwcGx5KG15LnNhbXBsZXMsMSx2YXIpIA0KICBwYXIobWZyb3c9YygyLDIpKQ0KICBoaXN0KG15LnNhbXBsZXNbMSxdLGNvbD0iZ3JheSIsbWFpbj0iRGlzdHJpYnV0aW9uIG9mIE9uZSBTYW1wbGUiKQ0KICBoaXN0KGFsbC5zYW1wbGUuc3Vtcyxjb2w9ImdyYXkiLG1haW49IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBcbiBvZg0KICAgICAgIHRoZSBTdW0iKQ0KICBoaXN0KGFsbC5zYW1wbGUubWVhbnMsY29sPSJncmF5IixtYWluPSJTYW1wbGluZyBEaXN0cmlidXRpb24gXG4gb2YgdGhlIE1lYW4iKQ0KICBoaXN0KGFsbC5zYW1wbGUudmFycyxjb2w9ImdyYXkiLG1haW49IlNhbXBsaW5nIERpc3RyaWJ1dGlvbiBcbiBvZg0KICAgICAgIHRoZSBWYXJpYW5jZSIpDQp9DQojY2x0X3NpbSgxMDAsc291cmNlPSJQIixwYXJhbTE9MS44OSkNCg0KZ25vcm0oMCwxLCBhID0gLTIsIGIgPSAyLCBjYWxjUHJvYiA9IFRSVUUpDQpgYGANCg0KIyBXaGF0IGlzIG5vcm1hbD8NCg0KTGV0J3MgZHJhdyAkWF9pJCBmcm9tICQxJCB0byAkbiQgc3VjY2Vzc2VzIGluZGVwZW5kZW50bHkgZnJvbSBhIHBvcHVsYXRpb24gd2hlcmUgJFxtdSQgYW5kICRcc2lnbWEkIGFyZSBrbm93biwgdGhlbiB3ZSB3b3VsZCBkaXNjb3ZlciB0aGF0IHRoZSBzdGFuZGFyZGl6ZWQgYXZlcmFnZQ0KDQpcWw0KXGZyYWN7XGJhcnt4fSAtIFxtdX17XHNpZ21hIC8gXHNxcnR7bn19DQpcXQ0KDQppcyBhc3ltcHRvdGljYWxseSBub3JtYWwgd2l0aCBtZWFuIDAgYW5kIHZhcmlhbmNlIDEgKG9mdGVuIGNhbGxlZCBub3JtYWwoMCwxKSkuIA0KKiBUaGlzIGNhbiBiZSBpbnRlcnByZXRlZCBhcyB3aGVuICRuJCBpcyBsYXJnZSBlbm91Z2ggdGhlDQphdmVyYWdlIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIHdpdGggbWVhbiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEgLyBcc3FydHtufSQuDQoNCiogVGhpcyByZXN1bHQgaXMgYWxzbyBrbm93biBhcyB0aGUgX0NlbnRyYWwgTGltaXQgVGhlb3JlbV8gKENMVCksIGEgY29ybmVyc3RvbmUgb2YgY2xhc3NpY2FsIHN0YXRpc3RpY3MuDQoNCiogTm9ybWFsIG1lYW5zIGEgc3ltbWV0cmljIGRpc3RyaWJ1dGlvbiB3aXRoIF9tZXNva3VydGljXyAidGFpbGVkbmVzcyIsIG9yIGt1cnRvc2lzIG9mIDMuIFRoaXMgaW1wbGllcyB0aGVyZSBhcmUgbm90IHRvbyBtYW55IHJhcmUgb3V0Y29tZXMgaW4gdGhlIHRhaWxzIG9mIHRoZSBkaXN0cmlidXRpb24uDQoNCiMgSG93IGNhbiB3ZSBjaGVjayB0aGlzPyANCg0KU2ltdWxhdGlvbiBpcyBhbiBleGNlbGxlbnQgd2F5LiBOb3cgdG8gZ2V0IHlvdXIgZmVldCBnb29kIGFuZCB3ZXQuLi4NCg0KTGV0J3MgZmlyc3QgZG8gdGhpcyBmb3IgdGhlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiwgdGhlIENMVCB0cmFuc2xhdGVzIGludG8gc2F5aW5nIHRoYXQgaWYgJHhfbiQgYXJlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiBvdXRjb21lcyB3aXRoIHBhcmFtZXRlcnMgJG4kIGFuZCAkcCQgdGhlbg0KDQpcWw0KeiA9IFxmcmFje3hfbiAtIG5wfXtcc3FydHtucCgxLXApfX0NClxdDQoNCnRoZW4gdGhlIHN0YW5kYXJkaXplZCAkeCQsIGNhbGxlZCAkeiQsIGlzIGFwcHJveGltYXRlbHkgYE5vcm1hbCgwLDEpYC4NCg0KIyBMZXQncyBpbnZlc3RpZ2F0ZQ0KDQoqIENyZWF0ZSBiaW5vbWlhbCByYW5kb20gbnVtYmVycyBpbiBFeGNlbCB1c2luZyBgQklOT00uSU5WKG4sIHAsIFJBTkQoKSlgLiANCg0KKiBgUkFORCgpYCBpcyB0aGUgcmFuZG9tbHkgZ2VuZXJhdGVkIGN1bXVsYXRpdmUgcHJvYmFiaWxpdHkgb2YgYSBzdWNjZXNzZnVsIGJpbm9taWFsIG91dGNvbWUuIA0KDQoqIFN0YXJ0IHdpdGgganVzdCBhIGZldyB0cmlhbHM6ICRuID0gMTAkIGFuZCAkcCA9IDAuMjAkLg0KDQoqIFRoZW4gZ2VuZXJhdGUgaW4gMTAwMCBzZXBhcmF0ZSBjZWxscyANCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCm4gPC0gMTA7cCA8LSAuMjU7IG4uc2ltIDwtIDEwMDANCnggPC0gIHJiaW5vbShuLnNpbSwgbiwgcCkNCnogPC0gKHggLSBuKnApIC8gc3FydChuKnAqKDEtcCkpDQp6Lm1lYW4gPC0gbWVhbih6KQ0Kei5zZCA8LSBzZCh6KQ0KaGlzdCh6LCBwcm9iID0gVFJVRSwgbWFpbiA9IHBhc3RlKCJCaW5vbWlhbCAobiA9ICIsbiwgIiwgcCA9ICIsIHAsICIpIikpDQpgYGANCg0KQWxtb3N0IGJlbGwtc2hhcGVkLiBBIGxpdHRsZSBsb3Atc2lkZWQgdG9vLi4uIEhlcmUgYXJlIHNvbWUgc3RhdGlzdGljcyBvbiBvdXIgZXhwZXJpbWVudGFsIHJ1bnMuDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBteXNpemU9VFJVRSwgc2l6ZT0nXFxmb290bm90ZXNpemUnfQ0KIyByX21vbWVudHMgZnVuY3Rpb24NCiMgSU5QVVRTOiByIHZlY3Rvcg0KIyBPVVRQVVRTOiBsaXN0IG9mIHNjYWxhcnMgKG1lYW4sIHNkLCBtZWRpYW4sIHNrZXduZXNzLCBrdXJ0b3NpcykNCmRhdGFfbW9tZW50cyA8LSBmdW5jdGlvbihkYXRhKXsNCiAgcmVxdWlyZShtb21lbnRzKQ0KICBtZWFuLnIgPC0gbWVhbihkYXRhKQ0KICBzZC5yIDwtIHNkKGRhdGEpDQogIG1lZGlhbi5yIDwtIG1lZGlhbihkYXRhKQ0KICBza2V3bmVzcy5yIDwtIHNrZXduZXNzKGRhdGEpDQogIGt1cnRvc2lzLnIgPC0ga3VydG9zaXMoZGF0YSkNCiAgcmVzdWx0IDwtIGRhdGEuZnJhbWUobWVhbiA9IG1lYW4uciwgc3RkX2RldiA9IHNkLnIsIG1lZGlhbiA9IG1lZGlhbi5yLCBza2V3bmVzcyA9IHNrZXduZXNzLnIsIGt1cnRvc2lzID0ga3VydG9zaXMucikNCiAgI3Jlc3VsdCA8LSBkYXRhLmZyYW1lKHJlc3VsdCwgdGFibGUgPSB0KHJlc3VsdCkpDQogIHJldHVybihyZXN1bHQpDQp9DQpuIDwtIDEwO3AgPC0gLjI1OyBuLnNpbSA8LSAxMDAwDQp4IDwtICByYmlub20obi5zaW0sIG4sIHApDQp6IDwtICh4IC0gbipwKSAvIHNxcnQobipwKigxLXApKQ0KYW5zIDwtIGRhdGFfbW9tZW50cyh6KQ0KYW5zIDwtIHJvdW5kKGFucywgNCkNCnJlcXVpcmUoa25pdHIpDQprbml0cjo6a2FibGUoYW5zKQ0KYGBgDQoNCkFsbW9zdCBhICJub3JtYWwiIF9tZXNva3VydG90aWNfIHJlc3VsdCBvZiAzLjAuIEEgc21hbGwgc2tld25lc3MgaW5kaWNhdGluZyBhIGxpdHRsZSBhc3ltbWV0cnkuDQoNCk5vdyB0cnkgdGhpcw0KDQoqIFVzZSBhIGxvdCBtb3JlIHRoYW4gYSBmZXcgdHJpYWxzOiAkbiA9IDEwMDAkIGFuZCAkcCA9IDAuMjAkLg0KDQoqIFRoZW4gZ2VuZXJhdGUgaW4gMTAwMCBzZXBhcmF0ZSBjZWxscyANCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCm4gPC0gMTAwMDtwIDwtIC4yNTsgbi5zaW0gPC0gMTAwMA0KeCA8LSAgcmJpbm9tKG4uc2ltLCBuLCBwKQ0KeiA8LSAoeCAtIG4qcCkgLyBzcXJ0KG4qcCooMS1wKSkNCmhpc3QoeiwgcHJvYiA9IFRSVUUsIG1haW4gPSBwYXN0ZSgiQmlub21pYWwgKG4gPSAiLG4sICIsIHAgPSAiLCBwLCAiKSIpKQ0KYW5zIDwtIGRhdGFfbW9tZW50cyh6KQ0KYW5zIDwtIHJvdW5kKGFucywgNCkNCg0KYGBgDQoNCk11Y2ggbW9yZSBzeW1tZXRyaWMuIEhlcmUgYXJlIHNvbWUgc3VtbWFyeSBzdGF0aXN0aWNzLg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Ka25pdHI6OmthYmxlKGFucykNCmBgYA0KDQoqIFNsaWdodGx5IG5lZ2F0aXZlbHkgc2tld2VkIHRhaWwgd2UgY2FuIGV5ZWJhbGwsIGJ1dCB2ZXJ5IHNtYWxsLg0KDQoqIE1lYW4gaXMgbmVhciB6ZXJvLCBhbmQgbWVkaWFuIG5vdCBmYXIgZnJvbSB6ZXJvIHRvby4NCg0KKiBTdGFuZGFyZCBkZXZpYXRpb24gaXMgbmVhcmx5IDEuDQoNCiogS3VydG9zaXMgaXMgYWxtb3N0IG9uIHRoYXQgbWFnaWMgbm9ybWFsIG1lc29rdXJ0aWMgbnVtYmVyIG9mIDMuMC4NCg0KIyMgTGV0J3MgbG9vayBhdCB0aGlzDQoNCkhlcmUgaXMgYSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uLCAkXG11ID0gMCQsIGFuZCAkXHNpZ21hID0gMSQuIFRoaXMgaXMgYSBkaXN0cmlidXRpb24gY2VudGVyZWQgb24gMC4gSG93IGlzIHRoaXMgbGlrZSB0aGUgY2FsY3VsYXRlZCAkeiQtc2NvcmU/DQoNCjxidXR0b24gb25jbGljaz0ic2hvd1RleHQoJ215RElWMScpIj5zaG93IC8gaGlkZTwvYnV0dG9uPg0KPGRpdiBpZD0ibXlESVYxIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQoNCldlIGNhbiBjZW50ZXIgYW55IGRpc3RyaWJ1dGlvbidzIG91dGNvbWVzICR4JCBhcm91bmQgemVybyBieSBzaW1wbHkgY2FsY3VsYXRpbmcgdGhlIGRldmlhdGlvbiBvZiB0aGUgb3V0Y29tZSBmcm9tIHRoZSBtZWFuIG9mIGFsbCBvdXRjb21lcy4gVGhlbiwgd2UgY2FuIHN0YW5kYXJkaXplIHRoZSBkZXZpYXRpb25zIGJ5IGRpdmlkaW5nIHRoZSBkZXZpYXRpb25zIGJ5IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2Ygb3V0Y29tZXMuIFRoZSByZXN1bHQgaXMgYSBtZWFuIG9mIHplcm8gYW5kIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEuIA0KDQokJA0KeiA9IFxmcmFje3ggLSBcbXV9e1xzaWdtYX0NCiQkDQpJbiBhIHNwcmVhZCBzaGVldCBnZW5lcmF0ZSAxMCBvdXRjb21lcyBzYW1wbGVkIGZyb20gdGhlIHVuaWZvcm0gZGlzdHJpYnV0aW9uIGRyYXduIGZyb20gdGhlIHVuaXQgaW50ZXJ2YWwgJCgwLDEpJC4gWW91IGNhbiBkbyB0aGlzIGJ5IG9vcGVuaW5nIHVwIGEgZnJlc2ggbmV3IHdvcmtib29rIGluIEV4Y2VsLiANCg0KMS4gUHV0IHlvdXIgY3Vyc29yIG9uIGNlbGwgQjMgYW5kIHR5cGUgJD1yYW5kKCkkLiBDb3B5IGFuZCBwYXN0ZSB0aGlzIGNlbGwgZG93biBhbm90aGVyIDkgcm93cy4gTGFiZWwgdGhpcyBjb2x1bW4gYHhgLiANCjIuIENhbGN1bGF0ZSB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIHRocmVlIGNvbHVtbnMgdG8gdGhlIHJpZ2h0IGluIGNlbGxzIEQzIGFuZCBENC4gDQozLiBJbiBjb2x1bW4gQyBuZXh0IHRvIHRoZSByYW5kb20gb3V0Y29tZXMgY2FsY3VsYXRlIHRoZSB6IHNjb3JlIHVzaW5nIGEgZm9ybXVsYSBsaWtlICQ9KEIzIC0gXCREXCQzKS9cJERcJDQkLiANCjQuIENvcHkgYW5kIHBhc3RlIHRoaXMgY2VsbCBkb3duIG5leHQgdG8gdGhlIG91dGNvbWVzIGNvbHVtbi4gTGFiZWwgdGhpcyBuZXcgY29sdW1uIGB6YC4NCjUuIE5leHQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlICd6JyByYW5kb20gdmFyaWFibGUgc2FtcGxlcy4NCjYuIEV2ZXJ5IHRpbWUgeW91IGNoYW5nZSBzb21ldGhpbmcgb24gdGhlIHNwcmVhZCBzaGVldCBuZXcgcmFuZG9tIG51bWJlcnMgYXJlIHNhbXBsZWQuIEJ1dCB3aGF0IGRvZXMgbm90IGNoYW5nZT8NCg0KPC9kaXY+DQoNCkhlcmUgaXMgYSBncmFwaCBvZiB0aGUgei1zY29yZSB5b3UgZ2VuZXJhdGVkIGFib3ZlLg0KDQpgYGB7cn0NCmdub3JtKDAsMSwgYSA9IC0yLCBiID0gMiwgY2FsY1Byb2IgPSBUUlVFKQ0KYGBgDQoNCldoYXQgaXMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSAkLTIkIGFuZCAkKzIkDQoNCjxidXR0b24gb25jbGljaz0ic2hvd1RleHQoJ215RElWMicpIj5zaG93IC8gaGlkZTwvYnV0dG9uPg0KPGRpdiBpZD0ibXlESVYyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQoNClRoZXNlIGFyZSB6LXNjb3JlcyB3aGljaCBtZWFzdXJlIHRoZSBudW1iZXIgb2Ygc3RhbmRhcmQgZGV2aWF0aW9ucyBhbiBvdXRjb21lIGlzIGZyb20gemVyby4gDQoNCi0gTWludXMgMiBtZWFucyB0aGUgb3V0Y29tZSBpcyAyIHN0YW5kYXJkIGRldmlhdGlvbnMgYmVsb3cgdGhlIG1lYW4uIA0KDQotIFBsdXMgMiBtZWFucyB0aGUgb3V0Y29tZSBpcyAyIHN0YW5kYXJkIGRldmlhdGlvbnMgYWJvdmUgdGhlIG1lYW4uDQoNCjwvZGl2Pg0KDQpXaGF0IGlzIHByb2JhYmlsaXR5IHRoYXQgYW4gb3V0Y29tZSBpcyBub3QgMiBzdGFuZGFyZCBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4/DQoNCjxidXR0b24gb25jbGljaz0ic2hvd1RleHQoJ215RElWMycpIj5zaG93IC8gaGlkZTwvYnV0dG9uPg0KPGRpdiBpZD0ibXlESVYzIiBzdHlsZT0iZGlzcGxheTpub25lOyI+DQoNCkZyb20gdGhlIGdyYXBoLCB0aGUgcHJvYmFiaWxpdHkgdGhhdCBlaXRoZXIgJHogPiAyJCBvciAkeiA8IC0yJCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIHVuaW9uIG9mIHRoZXNlIHR3byBldmVudHMuDQoNCiQkDQpQclsoeiA8IC0yKSBcY3VwICh6ID4gMildID0gUHIoejwtMikgKyBQcih6PjIpID0gMC4wMjI4ICsgMC4wMjI4ID0gMC4wNDU2DQokJA0KPC9kaXY+DQoNCiMjIFdoZXJlIGRvIG5vcm1hbCBvdXRjb21lcyBjb21lIGZyb20/DQoNCklzIGFueXRoaW5nIG5vcm1hbD8gTm9ybWFsIGRpc3RyaWJ1dGlvbnMgdmVyeSBuYXR1cmFsbHkgY29tZSBmcm9tIGEgdmVyeSBpbnRlcmVzdGluZyBzb3VyY2U6IHN1bXMgYW5kIGF2ZXJhZ2VzIG9mIHJhbmRvbSBzYW1wbGVzIG9mIGFueSBzZXQgb2Ygb3V0Y29tZXMuDQoNClN1cHBvc2Ugd2UgdGhpbmsgdGhhdCB0aGUgbnVtYmVyIG9mIHN0dWRlbnRzIG91dCBvZiBhIHJhbmRvbSBzYW1wbGUgb2YgMTUgc3R1ZGVudHMgZnJvbSBjb3Vyc2Ugc2VjdGlvbnMgKGNsYXNzZXMpIHRoYXQgdm90ZWQgaW4gbGFzdCB5ZWFyJ3MgZWxlY3Rpb24gaXMgMS4yIHN0dWRlbnRzL3llYXItY2xhc3MuIExldHMgc2FtcGxlIHRoaXMgaW50ZW5zaXR5IHVzaW5nIHRoZSBQb2lzc29uIGRpc3RyaWJ1dGlvbiB3aXRoICRcbGFtYmRhID0gMS4yJCAxMCwwMDAgdGltZXMuIFdoZW4gd2UgZG8gdGhpcywgd2UgY2FsY3VsYXRlIHRoZSBzdW1zLCBhdmVyYWdlcywgYW5kIHZhcmlhbmNlcyBvZiBlYWNoIGFuZCBldmVyeSBvZiB0aGUgMTAsMDAwIHNhbXBsZXMuIFRoZW4gd2UgcGxvdC4gSGVyZSdzIHRoZSByZXN1bHQuDQoNCmBgYHtyfQ0KY2x0X3NpbSgxNSxzb3VyY2U9IlAiLHBhcmFtMT0xLjg5KQ0KYGBgDQoNCldoYXQgZG8gd2Ugbm90aWNlPw0KDQo8YnV0dG9uIG9uY2xpY2s9InNob3dUZXh0KCdteURJVjQnKSI+c2hvdyAvIGhpZGU8L2J1dHRvbj4NCjxkaXYgaWQ9Im15RElWNCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPg0KDQoxLiBUaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIG9mIHN0dWRlbnRzIGlzIGhlYXZpbHkgc2tld2VkIHRvIHRoZSByaWdodC4gVGhpcyBpcyBhIHBvaXNzb24gZGlzdHJpYnV0aW9uLCB0aGF0IGlmIHdlIGludGVycHJldCBhcyBhIGJpbm9taWFsIG1lYW5zIHRoYXQgdGhlIHByb3BvcnRpb24gb2Ygdm90aW5nIHN0dWRlbnRzIGlzDQoNCiQkDQpwID0gXGZyYWN7XGxhbWJkYX17bn0gPSBcZnJhY3sxLjJ9ezE1fSA9IGByIDEuMi8xNWANCiQkDQoyLiBUaGUgc3VtIGFuZCB0aGUgbWVhbnMgb2YgZWFjaCByYW5kb20gc2FtcGxlIHNlZW0gdG8gYmUgc3ltbWV0cmljYWwgYW5kIHdpdGggYSBuaWNlLCBjYWxtIGt1cnRvc2lzIChtYXliZSBhIGt1cnRvc2lzID0gMy4wKS4gSW4gZmFjdCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCg0KMy4gVGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdmFyaWFuY2Ugb2Ygb3V0Y29tZXMgaXMgc2tld2VkIHRvIHRoZSByaWdodC4gVGhpcyBkaXN0cmlidXRpb24gaXMgdGhlIGNoaS1zcXVhcmVkIGRpc3RyaWJ1dGlvbi4NCg0KPC9kaXY+