We can test the proportions in a probability model using a variant of \(\chi^2\) called Goodness of Fit (GOF). The \(\chi^2\) GOF hypothesis compares observed data to theoretical probabilities. Rejecting the null indicates evidence for a lack of fit.

I. Example: Doberman Breeding

Dobermans can be bred in 4 colors: black, red, blue and fawn, all of which have rust colored highlights. Fawn-colored Dobermans are the rarest and most prized color. If a black male Doberman (hetero dominant allele) and a fawn female Doberman (homo recessive allele) were bred, on average half their pups would be black, a quarter blue and the remaining quarter fawn. Over the course of several years, a certain Doberman breeder had a pair of dogs from which 28 pups were born: 11 black, 11 blue and 6 fawn. Test the hypothesis that these dogs have the predicted genetics at the \(\alpha= 0.1\) level of significance.

1. Hypotheses

Our hypothesis just tests theoretical probabilities, so the list of probabilities is the null hypothesis.

\[H_0 : p_\text{black}=\frac{1}{2}, p_\text{blue}=\frac{1}{4}, p_\text{fawn}=\frac{1}{4}\] The alternative hypothesis is that at least one of the probabilities is not correct. The Doberman breeder is hoping to fail to reject the null indicating the parent dogs have the hypothesized genetics which, if true, will be valuable.

2. Data: Expected vs. Observed

We must set up the Observed vs. Expected table which allows for the verification procedure. How do we determine the expected cells? We multiply the sample size by the probabilities in the hypothesis. For example, the probability of a black colored Doberman (given the hypothesized genetics) would be \(\frac{1}{2}\), so the expected number of black Doberman pups out 28 total would be 14.

\[\begin{array}{cccc}&\text{Black} & \text{Blue} & \text{Fawn}\\ \text{Observed} & 11 & 11 & 6\\ \text{Expected} & 14 & 7 & 7 \end{array}\]

3. Verification

As with other proportion tests, as long as we ensure the sample size is adequate, our category data will be appropriate for the test. For all \(\chi^2\) procedures, we require that no more than 20% of Expected cell counts can be less than 5.

Since the smallest Expected cell count is 7 which is \(\geq\) 5, we have no low Expected cell counts at all (0%) which is clearly less than 20%.

4. The GOF Procedure

Let’s put the rows from the above table into vectors so R can analyze them. Naming the vectors “observed” and “expected” will us understand the code block where we actually calcuate the GOF statistics.

observed = c(11, 11, 6)
expected = c(0.5, 0.25, 0.25)

We run the \(\text{xchisq.test}\) procedure after ensuring the Mosaic package is running. (Remove the hashtag comment symbol as needed to initialize Mosaic.)

library(mosaic)
xchisq.test(x = observed,
           p = expected)

    Chi-squared test for given probabilities

data:  x
X-squared = 3.0714, df = 2, p-value = 0.2153

 11.00    11.00     6.00  
(14.00)  ( 7.00)  ( 7.00) 
 [0.64]   [2.29]   [0.14] 
<-0.80>  < 1.51>  <-0.38> 
     
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The top two rows of the table in the output provide an Observed vs. Expected cell count table which matches our work.

\[\begin{array}{cccc} & \text{Black} & \text{Blue} & \text{Fawn}\\ \text{Observed} & 11 & 11 & 6 \\ \text{Expected} & 14 & 7 & 7\end{array}\]

The third row of the table in the output shows the terms of the \(\chi^2\) calculation. The \(\chi^2\) formula is \[\chi^2=\sum \frac{(O-E)^2}{E}\] where, for each corresponding pair of cells, we calculate \[\frac{(\text{Observed Cell Count} - \text{Expected Cell Count})^2}{\text{Expected Cell Count}}\] For the first pair of values (Black pups), we have \[\frac{(11-14)^2}{14}=\frac{9}{14}\approx 0.642857\] which is why the first entry of the third row in the R output table is \([0.64]\).

5. Conclusion and Discussion

Because \(p=0.2153 > 0.1\), we fail to reject the null. Be careful. We never “accept the null hypothesis.” The Doberman breeder found no evidence her hypothesized genetics model was incorrect. Remember that Fischer’s whole point when he developed the null hypothesis was that it could only be falsified, never proven.

What else can the breeder do? Her dogs won’t live forever, so she’s stuck with a small sample size. She can’t repeat the test on a larger sample. She needs to make money breeding them while they’re still young enough.

II. A Randomization Approach

Why not test the hypothesis by repeatedly drawing samples of 28 pups from the hypothesized distribution? I will show a couple of the code blocks that accomplish this, but you don’t have to learn how to code this up.

First, we need to draw a sample named “pups” that has 28 randomly generated dogs.

pups = sample(c("black","blue","fawn"), 28, replace=TRUE, prob = c(0.5, 0.25, 0.25))
tally(pups)
X
black  blue  fawn 
   13     9     6 

Repeatedly execute the above code block to see several samples. How do we tell if the observed data is a “low probability” pattern? Consider the formula for calculating the test statistic. \[\chi^2 = \sum \frac{(O - E)^2}{E}\] For our observed data: \[\chi^2 = \frac{(11 - 14)^2}{14}+\frac{(11 - 7)^2}{7}+\frac{(6 - 7)^2}{7}=\frac{43}{14}\]

How do we tell if one of our randomly generated results is more or less likely than our observed data? Easy, we just calculated it’s \(\chi^2\) statistic. Consider the random draw above: 12 black, 9 blue, 7 fawn.

\[\chi^2 = \frac{(12 - 14)^2}{14}+\frac{(9 - 7)^2}{7}+\frac{(7 - 7)^2}{7}=\frac{6}{7} < \frac{14}{43}\]

The statistic measures the sum of the absolute errors between the observed and expected data corrected by the relative size of the proportions.

R Coding. The type of randomization needed for
\(\chi^2\) GOF is beyond the scope of this course. The
comments help show what’s happening, but do not
worry about learning to do this type of coding.

If we generate, say, 1000 samples, how many of them would have a more error than our observed data? The code below adds an inner FOR loop that counts the colors of the pups in each sample, and an outer FOR loop that repeats the process 1,000 times. The output \(N\) equals the number of randomly drawn samples which have \(\chi^2\) statistics greater than \(\frac{14}{43}\).

N = 0
# Do the randomization 1,000 time
for (j in 1:1000) {
# Create random sample of 28 pups
pups = sample(c("black","blue","fawn"), 28, replace=TRUE, prob = c(0.5, 0.25, 0.25))
black = 0
blue = 0
fawn = 0
# Count number of pups for each color
for (i in 1:28) {
  if (pups[i] == "black") { black = black + 1}
  if (pups[i] == "blue") { blue = blue + 1}
  if (pups[i] == "fawn") { fawn = fawn + 1}
}
# Calculate Chi-Squared statistic
chiObserved = (black - 14)^2/14 +(blue - 7)^2/7+(fawn - 7)^2/7
if ( chiObserved > 43/14) {N = N + 1}
} 
N
[1] 224

Run several iterations of the code block above and compare to our theoretical \(p\)-value of 0.215. You’ll find that the randomized approach is working properly, and these results are not too unlikely if the dogs have the proposed genetics.

III. \(\chi^2\) Caution

The \(\chi^2\) GOF procedure is an example of a backwards statistical test since we’re usually trying to verify a model (null hypothesis) rather than show it’s false (alternative hypothesis). Fischer’s null hypothesis was definitely not designed for this. However, the \(\chi^2\) GOF test has been incredibly helpful to geneticists when used where large samples are readily available. One example is testing crop genetics where huge samples of hybrids are easy and inexpensive. Despite using this backwards statistical approach, we still generate a great deal of evidence the null is likely to be true when we examine multiple, large-scale experiments all of which produce the same results.

IV. Example 2: Mouse Genetics

Suppose researchers cross a pure breeding white mouse with a pure breeding brown mouse. All F1 (first filial generation) progeny are brown. The researchers then construct an F2 (second filial generation) cross by breeding pairs from F1 group. If the researchers’ genetics model is correct, the brown-to-white ratio in the F2 group should be \(3:1\).

In total, researchers raise 200 of the F2 offspring and observe 164 brown and and the rest white. Test the hypothesis that the genetics model is correct at the \(\alpha = 0.1\).

Our hypotheses: \[\begin{align*}H_0 &: p_B = \frac{3}{4} , p_W = \frac{1}{4}\\ H_a &: \text{At least one probability significantly different}\end{align*}\]

Creating the cell count vectors:

observed = c(164,36)
expected = c(.75,.25)

Run the procedure:

xchisq.test(x = observed,
           p = expected)

    Chi-squared test for given probabilities

data:  x
X-squared = 5.2267, df = 1, p-value = 0.02224

 164.00    36.00 
(150.00) ( 50.00)
 [1.31]   [3.92] 
< 1.14>  <-1.98> 
   
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The expected cell counts are both far larger than 5, so the data passes verification. Given that \(p = 0.07245 < 0.1 = \alpha\), we reject the null. We have evidence that the genetic model for the mice is incorrect.

V. Example 3: Births on Week Days vs. Weekends

Are fewer human babies born on weekend days (proportionally) then week days?

Note that, naturally, 2 out of 7 babies would be born on weekend days while 5 out of 7 would be born on weekdays. Modern medicine produced a large increase in scheduled births (planned inductions or planned C-sections) in recent years. If parents and doctors work together to schedule a birth, it sure ain’t gonna be at midnight on a Saturday! Consider the following observed data for births in one county in Georgia for 2019. \[\begin{array}{ccccccc} \text{Su}&\text{M}&\text{T}&\text{W}&\text{R}&\text{F}&\text{Sa}\\ 11 & 29 & 16 & 14 & 17 & 23 & 9 \end{array}\]

Su M T W R F Sa 11 29 16 14 17 23 9

Is there evidence at the \(\alpha = 0.05\) level that fewer babies (proportionally) are born on weekends?

Our hypotheses: \[\begin{align*}H_0 &: p_{Su} = p_M = p_T = p_W = p_R = p_F= p_{Sa} = \frac{1}{7}\\ H_a &: \text{At least one probability significantly different}\end{align*}\]

Creating the cell count vectors:

observed = c(11, 29, 16, 14, 17, 23, 9)
expected = c(1/7,1/7,1/7,1/7,1/7,1/7,1/7)

Run the procedure:

xchisq.test(x = observed,
           p = expected)

    Chi-squared test for given probabilities

data:  x
X-squared = 17.059, df = 6, p-value = 0.009069

 11.00    29.00    16.00    14.00    17.00    23.00     9.00  
(17.00)  (17.00)  (17.00)  (17.00)  (17.00)  (17.00)  (17.00) 
[2.118]  [8.471]  [0.059]  [0.529]  [0.000]  [2.118]  [3.765] 
<-1.46>  < 2.91>  <-0.24>  <-0.73>  < 0.00>  < 1.46>  <-1.94> 
             
key:
    observed
    (expected)
    [contribution to X-squared]
    <Pearson residual>

The expected cell counts are all 17 and thus larger than 5, so the data are appropriate for the \(\chi^2\) GOF procedure. Given that \(p = 0.009069 < 0.05 = \alpha\), we reject the null. We have evidence that the the model stating babies are equally likely to be born each day of the week is false.

VI. Exercises

  1. A baseball card company claims that 25% of its cards are rookies, 65% are veterans but not All-Stars, and 10% are veteran All-Stars. Suppose a random sample of 200 cards has 70 rookies, 120 veterans, and 10 All-Stars. Is the company’s claimed distribution credible? Test using \(\chi^2\) GOF with a 0.05 level of significance.

  2. A supposedly fair die is rolled 50 times with the following results: 9 ones, 15 twos, 9 threes, 8 fours, 6 fives and 13 sixes. Test at the 0.05 level whether the die is actually fair using \(\chi^2\) GOF.

  3. Helena buys custom M&M’s for a bridal shower she’s throwing for her sister. She orders 10% yellow, 20% pale blue, 30% red and 40% pink. When she receives her 10 lb. package, she sees almost not yellow and far too many pale blue. She randomly selects 200 of the M&M’s and finds the following observed counts: \[\begin{array}{cccc}\text{Yellow}&\text{Blue}&\text{Red}&\text{Pink}\\ \hline 8&54&64&74\end{array}\]

LS0tDQp0aXRsZTogIkNoaS1TcXVhcmVkIEdvb2RuZXNzIG9mIEZpdCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpXZSBjYW4gdGVzdCB0aGUgcHJvcG9ydGlvbnMgaW4gYSBwcm9iYWJpbGl0eSBtb2RlbCB1c2luZyBhIHZhcmlhbnQgb2YgJFxjaGleMiQgY2FsbGVkIEdvb2RuZXNzIG9mIEZpdCAoR09GKS4gVGhlICRcY2hpXjIkIEdPRiBoeXBvdGhlc2lzIGNvbXBhcmVzIG9ic2VydmVkIGRhdGEgdG8gdGhlb3JldGljYWwgcHJvYmFiaWxpdGllcy4gUmVqZWN0aW5nIHRoZSBudWxsIGluZGljYXRlcyBldmlkZW5jZSBmb3IgYSBsYWNrIG9mIGZpdC4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JLiBFeGFtcGxlOiBEb2Jlcm1hbiBCcmVlZGluZzwvc3Bhbj4NCg0KRG9iZXJtYW5zIGNhbiBiZSBicmVkIGluIDQgY29sb3JzOiBibGFjaywgcmVkLCBibHVlIGFuZCBmYXduLCBhbGwgb2Ygd2hpY2ggaGF2ZSBydXN0IGNvbG9yZWQgaGlnaGxpZ2h0cy4gRmF3bi1jb2xvcmVkIERvYmVybWFucyBhcmUgdGhlIHJhcmVzdCBhbmQgbW9zdCBwcml6ZWQgY29sb3IuIElmIGEgYmxhY2sgbWFsZSBEb2Jlcm1hbiAoaGV0ZXJvIGRvbWluYW50IGFsbGVsZSkgYW5kIGEgZmF3biBmZW1hbGUgRG9iZXJtYW4gKGhvbW8gcmVjZXNzaXZlIGFsbGVsZSkgd2VyZSBicmVkLCBvbiBhdmVyYWdlIGhhbGYgdGhlaXIgcHVwcyB3b3VsZCBiZSBibGFjaywgYSBxdWFydGVyIGJsdWUgYW5kIHRoZSByZW1haW5pbmcgcXVhcnRlciBmYXduLiBPdmVyIHRoZSBjb3Vyc2Ugb2Ygc2V2ZXJhbCB5ZWFycywgYSBjZXJ0YWluIERvYmVybWFuIGJyZWVkZXIgaGFkIGEgcGFpciBvZiBkb2dzIGZyb20gd2hpY2ggMjggcHVwcyB3ZXJlIGJvcm46IDExIGJsYWNrLCAxMSBibHVlIGFuZCA2IGZhd24uIFRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGVzZSBkb2dzIGhhdmUgdGhlIHByZWRpY3RlZCBnZW5ldGljcyBhdCB0aGUgJFxhbHBoYT0gMC4xJCBsZXZlbCBvZiBzaWduaWZpY2FuY2UuDQoNCiMjIDEuIEh5cG90aGVzZXMNCg0KT3VyIGh5cG90aGVzaXMganVzdCB0ZXN0cyB0aGVvcmV0aWNhbCBwcm9iYWJpbGl0aWVzLCBzbyB0aGUgbGlzdCBvZiBwcm9iYWJpbGl0aWVzIGlzIHRoZSBudWxsIGh5cG90aGVzaXMuDQoNCiQkSF8wIDogcF9cdGV4dHtibGFja309XGZyYWN7MX17Mn0sIHBfXHRleHR7Ymx1ZX09XGZyYWN7MX17NH0sIHBfXHRleHR7ZmF3bn09XGZyYWN7MX17NH0kJA0KVGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgaXMgdGhhdCBhdCBsZWFzdCBvbmUgb2YgdGhlIHByb2JhYmlsaXRpZXMgaXMgbm90IGNvcnJlY3QuIFRoZSBEb2Jlcm1hbiBicmVlZGVyIGlzIGhvcGluZyB0byBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBpbmRpY2F0aW5nIHRoZSBwYXJlbnQgZG9ncyBoYXZlIHRoZSBoeXBvdGhlc2l6ZWQgZ2VuZXRpY3Mgd2hpY2gsIGlmIHRydWUsIHdpbGwgYmUgdmFsdWFibGUuDQoNCiMjIDIuIERhdGE6IEV4cGVjdGVkIHZzLiBPYnNlcnZlZCANCg0KV2UgbXVzdCBzZXQgdXAgdGhlIE9ic2VydmVkIHZzLiBFeHBlY3RlZCB0YWJsZSB3aGljaCBhbGxvd3MgZm9yIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VkdXJlLiBIb3cgZG8gd2UgZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBjZWxscz8gV2UgbXVsdGlwbHkgdGhlIHNhbXBsZSBzaXplIGJ5IHRoZSBwcm9iYWJpbGl0aWVzIGluIHRoZSBoeXBvdGhlc2lzLiBGb3IgZXhhbXBsZSwgdGhlIHByb2JhYmlsaXR5IG9mIGEgYmxhY2sgY29sb3JlZCBEb2Jlcm1hbiAoZ2l2ZW4gdGhlIGh5cG90aGVzaXplZCBnZW5ldGljcykgd291bGQgYmUgJFxmcmFjezF9ezJ9JCwgc28gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBibGFjayBEb2Jlcm1hbiBwdXBzIG91dCAyOCB0b3RhbCB3b3VsZCBiZSAxNC4NCg0KJCRcYmVnaW57YXJyYXl9e2NjY2N9Jlx0ZXh0e0JsYWNrfSAmIFx0ZXh0e0JsdWV9ICYgXHRleHR7RmF3bn1cXA0KXHRleHR7T2JzZXJ2ZWR9ICYgMTEgJiAxMSAmIDZcXA0KXHRleHR7RXhwZWN0ZWR9ICYgMTQgJiA3ICYgNw0KXGVuZHthcnJheX0kJA0KDQoNCg0KIyMgMy4gVmVyaWZpY2F0aW9uDQoNCkFzIHdpdGggb3RoZXIgcHJvcG9ydGlvbiB0ZXN0cywgYXMgbG9uZyBhcyB3ZSBlbnN1cmUgdGhlIHNhbXBsZSBzaXplIGlzIGFkZXF1YXRlLCBvdXIgY2F0ZWdvcnkgZGF0YSB3aWxsIGJlIGFwcHJvcHJpYXRlIGZvciB0aGUgdGVzdC4gRm9yIGFsbCAkXGNoaV4yJCBwcm9jZWR1cmVzLCB3ZSByZXF1aXJlIHRoYXQgbm8gbW9yZSB0aGFuIDIwJSBvZiBFeHBlY3RlZCBjZWxsIGNvdW50cyBjYW4gYmUgbGVzcyB0aGFuIDUuDQoNClNpbmNlIHRoZSBzbWFsbGVzdCBFeHBlY3RlZCBjZWxsIGNvdW50IGlzIDcgd2hpY2ggaXMgJFxnZXEkIDUsIHdlIGhhdmUgbm8gbG93IEV4cGVjdGVkIGNlbGwgY291bnRzIGF0IGFsbCAoMCUpIHdoaWNoIGlzIGNsZWFybHkgbGVzcyB0aGFuIDIwJS4NCg0KIyMgNC4gVGhlIEdPRiBQcm9jZWR1cmUNCg0KTGV0J3MgcHV0IHRoZSByb3dzIGZyb20gdGhlIGFib3ZlIHRhYmxlIGludG8gdmVjdG9ycyBzbyBSIGNhbiBhbmFseXplIHRoZW0uIE5hbWluZyB0aGUgdmVjdG9ycyAib2JzZXJ2ZWQiIGFuZCAiZXhwZWN0ZWQiIHdpbGwgdXMgdW5kZXJzdGFuZCB0aGUgY29kZSBibG9jayB3aGVyZSB3ZSBhY3R1YWxseSBjYWxjdWF0ZSB0aGUgR09GIHN0YXRpc3RpY3MuDQoNCmBgYHtyfQ0Kb2JzZXJ2ZWQgPSBjKDExLCAxMSwgNikNCmV4cGVjdGVkID0gYygwLjUsIDAuMjUsIDAuMjUpDQpgYGANCg0KV2UgcnVuIHRoZSAkXHRleHR7eGNoaXNxLnRlc3R9JCBwcm9jZWR1cmUgYWZ0ZXIgZW5zdXJpbmcgdGhlIE1vc2FpYyBwYWNrYWdlIGlzIHJ1bm5pbmcuIChSZW1vdmUgdGhlIGhhc2h0YWcgY29tbWVudCBzeW1ib2wgYXMgbmVlZGVkIHRvIGluaXRpYWxpemUgTW9zYWljLikNCg0KYGBge3J9DQpsaWJyYXJ5KG1vc2FpYykNCnhjaGlzcS50ZXN0KHggPSBvYnNlcnZlZCwNCiAgICAgICAgICAgcCA9IGV4cGVjdGVkKQ0KYGBgDQpUaGUgdG9wIHR3byByb3dzIG9mIHRoZSB0YWJsZSBpbiB0aGUgb3V0cHV0IHByb3ZpZGUgYW4gT2JzZXJ2ZWQgdnMuIEV4cGVjdGVkIGNlbGwgY291bnQgdGFibGUgd2hpY2ggbWF0Y2hlcyBvdXIgd29yay4NCg0KJCRcYmVnaW57YXJyYXl9e2NjY2N9ICYgXHRleHR7QmxhY2t9ICYgXHRleHR7Qmx1ZX0gJiBcdGV4dHtGYXdufVxcDQpcdGV4dHtPYnNlcnZlZH0gJiAxMSAmIDExICYgNiBcXA0KXHRleHR7RXhwZWN0ZWR9ICYgMTQgJiA3ICYgIDdcZW5ke2FycmF5fSQkDQoNClRoZSB0aGlyZCByb3cgb2YgdGhlIHRhYmxlIGluIHRoZSBvdXRwdXQgc2hvd3MgdGhlIHRlcm1zIG9mIHRoZSAkXGNoaV4yJCBjYWxjdWxhdGlvbi4gVGhlICRcY2hpXjIkIGZvcm11bGEgaXMNCiQkXGNoaV4yPVxzdW0gXGZyYWN7KE8tRSleMn17RX0kJA0Kd2hlcmUsIGZvciBlYWNoIGNvcnJlc3BvbmRpbmcgcGFpciBvZiBjZWxscywgd2UgY2FsY3VsYXRlIA0KJCRcZnJhY3soXHRleHR7T2JzZXJ2ZWQgQ2VsbCBDb3VudH0gLSBcdGV4dHtFeHBlY3RlZCBDZWxsIENvdW50fSleMn17XHRleHR7RXhwZWN0ZWQgQ2VsbCBDb3VudH19JCQNCkZvciB0aGUgZmlyc3QgcGFpciBvZiB2YWx1ZXMgKEJsYWNrIHB1cHMpLCB3ZSBoYXZlDQokJFxmcmFjeygxMS0xNCleMn17MTR9PVxmcmFjezl9ezE0fVxhcHByb3ggMC42NDI4NTckJA0Kd2hpY2ggaXMgd2h5IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgdGhpcmQgcm93IGluIHRoZSBSIG91dHB1dCB0YWJsZSBpcyAkWzAuNjRdJC4NCg0KIyMgNS4gQ29uY2x1c2lvbiBhbmQgRGlzY3Vzc2lvbg0KDQpCZWNhdXNlICRwPTAuMjE1MyA+IDAuMSQsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsLiBCZSBjYXJlZnVsLiBXZSBuZXZlciAiYWNjZXB0IHRoZSBudWxsIGh5cG90aGVzaXMuIiBUaGUgRG9iZXJtYW4gYnJlZWRlciBmb3VuZCBubyBldmlkZW5jZSBoZXIgaHlwb3RoZXNpemVkIGdlbmV0aWNzIG1vZGVsIHdhcyBpbmNvcnJlY3QuIFJlbWVtYmVyIHRoYXQgRmlzY2hlcidzIHdob2xlIHBvaW50IHdoZW4gaGUgZGV2ZWxvcGVkIHRoZSBudWxsIGh5cG90aGVzaXMgd2FzIHRoYXQgaXQgY291bGQgb25seSBiZSBmYWxzaWZpZWQsIG5ldmVyIHByb3Zlbi4gDQoNCldoYXQgZWxzZSBjYW4gdGhlIGJyZWVkZXIgZG8/IEhlciBkb2dzIHdvbid0IGxpdmUgZm9yZXZlciwgc28gc2hlJ3Mgc3R1Y2sgd2l0aCBhIHNtYWxsIHNhbXBsZSBzaXplLiBTaGUgY2FuJ3QgcmVwZWF0IHRoZSB0ZXN0IG9uIGEgbGFyZ2VyIHNhbXBsZS4gU2hlIG5lZWRzIHRvIG1ha2UgbW9uZXkgYnJlZWRpbmcgdGhlbSB3aGlsZSB0aGV5J3JlIHN0aWxsIHlvdW5nIGVub3VnaC4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JSS4gQSBSYW5kb21pemF0aW9uIEFwcHJvYWNoPC9zcGFuPg0KDQpXaHkgbm90IHRlc3QgdGhlIGh5cG90aGVzaXMgYnkgcmVwZWF0ZWRseSBkcmF3aW5nIHNhbXBsZXMgb2YgMjggcHVwcyBmcm9tIHRoZSBoeXBvdGhlc2l6ZWQgZGlzdHJpYnV0aW9uPyBJIHdpbGwgc2hvdyBhIGNvdXBsZSBvZiB0aGUgY29kZSBibG9ja3MgdGhhdCBhY2NvbXBsaXNoIHRoaXMsIGJ1dCB5b3UgZG9uJ3QgaGF2ZSB0byBsZWFybiBob3cgdG8gY29kZSB0aGlzIHVwLg0KDQpGaXJzdCwgd2UgbmVlZCB0byBkcmF3IGEgc2FtcGxlIG5hbWVkICJwdXBzIiB0aGF0IGhhcyAyOCByYW5kb21seSBnZW5lcmF0ZWQgZG9ncy4NCg0KYGBge3J9DQpwdXBzID0gc2FtcGxlKGMoImJsYWNrIiwiYmx1ZSIsImZhd24iKSwgMjgsIHJlcGxhY2U9VFJVRSwgcHJvYiA9IGMoMC41LCAwLjI1LCAwLjI1KSkNCnRhbGx5KHB1cHMpDQpgYGANCg0KUmVwZWF0ZWRseSBleGVjdXRlIHRoZSBhYm92ZSBjb2RlIGJsb2NrIHRvIHNlZSBzZXZlcmFsIHNhbXBsZXMuIEhvdyBkbyB3ZSB0ZWxsIGlmIHRoZSBvYnNlcnZlZCBkYXRhIGlzIGEgImxvdyBwcm9iYWJpbGl0eSIgcGF0dGVybj8gQ29uc2lkZXIgdGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoZSB0ZXN0IHN0YXRpc3RpYy4gDQokJFxjaGleMiA9IFxzdW0gXGZyYWN7KE8gLSBFKV4yfXtFfSQkDQpGb3Igb3VyIG9ic2VydmVkIGRhdGE6DQokJFxjaGleMiA9IFxmcmFjeygxMSAtIDE0KV4yfXsxNH0rXGZyYWN7KDExIC0gNyleMn17N30rXGZyYWN7KDYgLSA3KV4yfXs3fT1cZnJhY3s0M317MTR9JCQNCg0KSG93IGRvIHdlIHRlbGwgaWYgb25lIG9mIG91ciByYW5kb21seSBnZW5lcmF0ZWQgcmVzdWx0cyBpcyBtb3JlIG9yIGxlc3MgbGlrZWx5IHRoYW4gb3VyIG9ic2VydmVkIGRhdGE/IEVhc3ksIHdlIGp1c3QgY2FsY3VsYXRlZCBpdCdzICRcY2hpXjIkIHN0YXRpc3RpYy4gQ29uc2lkZXIgdGhlIHJhbmRvbSBkcmF3IGFib3ZlOiAxMiBibGFjaywgOSBibHVlLCA3IGZhd24uDQoNCiQkXGNoaV4yID0gXGZyYWN7KDEyIC0gMTQpXjJ9ezE0fStcZnJhY3soOSAtIDcpXjJ9ezd9K1xmcmFjeyg3IC0gNyleMn17N309XGZyYWN7Nn17N30gPCBcZnJhY3sxNH17NDN9JCQNCg0KVGhlIHN0YXRpc3RpYyBtZWFzdXJlcyB0aGUgc3VtIG9mIHRoZSBhYnNvbHV0ZSBlcnJvcnMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgYW5kIGV4cGVjdGVkIGRhdGEgY29ycmVjdGVkIGJ5IHRoZSByZWxhdGl2ZSBzaXplIG9mIHRoZSBwcm9wb3J0aW9ucy4NCg0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KKio8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5SIENvZGluZzwvc3Bhbj4qKi4gVGhlIHR5cGUgb2YgcmFuZG9taXphdGlvbiBuZWVkZWQgZm9yPC9icj4NCiRcY2hpXjIkIEdPRiBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgY291cnNlLiBUaGU8L2JyPg0KY29tbWVudHMgaGVscCBzaG93IHdoYXQncyBoYXBwZW5pbmcsIGJ1dCBkbyBub3Q8L2JyPg0Kd29ycnkgYWJvdXQgbGVhcm5pbmcgdG8gZG8gIHRoaXMgdHlwZSBvZiBjb2RpbmcuDQo8L2Rpdj4NCg0KSWYgd2UgZ2VuZXJhdGUsIHNheSwgMTAwMCBzYW1wbGVzLCBob3cgbWFueSBvZiB0aGVtIHdvdWxkIGhhdmUgYSBtb3JlIGVycm9yIHRoYW4gb3VyIG9ic2VydmVkIGRhdGE/IFRoZSBjb2RlIGJlbG93IGFkZHMgYW4gaW5uZXIgRk9SIGxvb3AgdGhhdCBjb3VudHMgdGhlIGNvbG9ycyBvZiB0aGUgcHVwcyBpbiBlYWNoIHNhbXBsZSwgYW5kIGFuIG91dGVyIEZPUiBsb29wIHRoYXQgcmVwZWF0cyB0aGUgcHJvY2VzcyAxLDAwMCB0aW1lcy4gVGhlIG91dHB1dCAkTiQgZXF1YWxzIHRoZSBudW1iZXIgb2YgcmFuZG9tbHkgZHJhd24gc2FtcGxlcyB3aGljaCBoYXZlICRcY2hpXjIkIHN0YXRpc3RpY3MgZ3JlYXRlciB0aGFuICRcZnJhY3sxNH17NDN9JC4NCg0KYGBge3J9DQpOID0gMA0KIyBEbyB0aGUgcmFuZG9taXphdGlvbiAxLDAwMCB0aW1lDQpmb3IgKGogaW4gMToxMDAwKSB7DQojIENyZWF0ZSByYW5kb20gc2FtcGxlIG9mIDI4IHB1cHMNCnB1cHMgPSBzYW1wbGUoYygiYmxhY2siLCJibHVlIiwiZmF3biIpLCAyOCwgcmVwbGFjZT1UUlVFLCBwcm9iID0gYygwLjUsIDAuMjUsIDAuMjUpKQ0KYmxhY2sgPSAwDQpibHVlID0gMA0KZmF3biA9IDANCiMgQ291bnQgbnVtYmVyIG9mIHB1cHMgZm9yIGVhY2ggY29sb3INCmZvciAoaSBpbiAxOjI4KSB7DQogIGlmIChwdXBzW2ldID09ICJibGFjayIpIHsgYmxhY2sgPSBibGFjayArIDF9DQogIGlmIChwdXBzW2ldID09ICJibHVlIikgeyBibHVlID0gYmx1ZSArIDF9DQogIGlmIChwdXBzW2ldID09ICJmYXduIikgeyBmYXduID0gZmF3biArIDF9DQp9DQojIENhbGN1bGF0ZSBDaGktU3F1YXJlZCBzdGF0aXN0aWMNCmNoaU9ic2VydmVkID0gKGJsYWNrIC0gMTQpXjIvMTQgKyhibHVlIC0gNyleMi83KyhmYXduIC0gNyleMi83DQppZiAoIGNoaU9ic2VydmVkID4gNDMvMTQpIHtOID0gTiArIDF9DQp9IA0KTg0KYGBgDQpSdW4gc2V2ZXJhbCBpdGVyYXRpb25zIG9mIHRoZSBjb2RlIGJsb2NrIGFib3ZlIGFuZCBjb21wYXJlIHRvIG91ciB0aGVvcmV0aWNhbCAkcCQtdmFsdWUgb2YgMC4yMTUuIFlvdSdsbCBmaW5kIHRoYXQgdGhlIHJhbmRvbWl6ZWQgYXBwcm9hY2ggaXMgd29ya2luZyBwcm9wZXJseSwgYW5kIHRoZXNlIHJlc3VsdHMgYXJlIG5vdCB0b28gdW5saWtlbHkgaWYgdGhlIGRvZ3MgaGF2ZSB0aGUgcHJvcG9zZWQgZ2VuZXRpY3MuDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+SUlJLiAkXGNoaV4yJCBDYXV0aW9uPC9zcGFuPg0KDQpUaGUgJFxjaGleMiQgR09GIHByb2NlZHVyZSBpcyBhbiBleGFtcGxlIG9mIGEgYmFja3dhcmRzIHN0YXRpc3RpY2FsIHRlc3Qgc2luY2Ugd2UncmUgdXN1YWxseSB0cnlpbmcgdG8gdmVyaWZ5IGEgbW9kZWwgKG51bGwgaHlwb3RoZXNpcykgcmF0aGVyIHRoYW4gc2hvdyBpdCdzIGZhbHNlIChhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzKS4gRmlzY2hlcidzIG51bGwgaHlwb3RoZXNpcyB3YXMgZGVmaW5pdGVseSBub3QgZGVzaWduZWQgZm9yIHRoaXMuIEhvd2V2ZXIsIHRoZSAkXGNoaV4yJCBHT0YgdGVzdCBoYXMgYmVlbiBpbmNyZWRpYmx5IGhlbHBmdWwgdG8gZ2VuZXRpY2lzdHMgd2hlbiB1c2VkIHdoZXJlIGxhcmdlIHNhbXBsZXMgYXJlIHJlYWRpbHkgYXZhaWxhYmxlLiBPbmUgZXhhbXBsZSBpcyB0ZXN0aW5nIGNyb3AgZ2VuZXRpY3Mgd2hlcmUgaHVnZSBzYW1wbGVzIG9mIGh5YnJpZHMgYXJlIGVhc3kgYW5kIGluZXhwZW5zaXZlLiBEZXNwaXRlIHVzaW5nIHRoaXMgYmFja3dhcmRzIHN0YXRpc3RpY2FsIGFwcHJvYWNoLCB3ZSBzdGlsbCBnZW5lcmF0ZSBhIGdyZWF0IGRlYWwgb2YgZXZpZGVuY2UgdGhlIG51bGwgaXMgbGlrZWx5IHRvIGJlIHRydWUgd2hlbiB3ZSBleGFtaW5lIG11bHRpcGxlLCBsYXJnZS1zY2FsZSBleHBlcmltZW50cyBhbGwgb2Ygd2hpY2ggcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzLiANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JVi4gRXhhbXBsZSAyOiBNb3VzZSBHZW5ldGljczwvc3Bhbj4NCg0KU3VwcG9zZSByZXNlYXJjaGVycyBjcm9zcyBhIHB1cmUgYnJlZWRpbmcgd2hpdGUgbW91c2Ugd2l0aCBhIHB1cmUgYnJlZWRpbmcgYnJvd24gbW91c2UuIEFsbCBGMSAoZmlyc3QgZmlsaWFsIGdlbmVyYXRpb24pIHByb2dlbnkgYXJlIGJyb3duLiBUaGUgcmVzZWFyY2hlcnMgdGhlbiBjb25zdHJ1Y3QgYW4gRjIgKHNlY29uZCBmaWxpYWwgZ2VuZXJhdGlvbikgY3Jvc3MgYnkgYnJlZWRpbmcgcGFpcnMgZnJvbSBGMSBncm91cC4gSWYgdGhlIHJlc2VhcmNoZXJzJyBnZW5ldGljcyBtb2RlbCBpcyBjb3JyZWN0LCB0aGUgYnJvd24tdG8td2hpdGUgcmF0aW8gaW4gdGhlIEYyIGdyb3VwIHNob3VsZCBiZSAkMzoxJC4NCg0KSW4gdG90YWwsIHJlc2VhcmNoZXJzIHJhaXNlIDIwMCBvZiB0aGUgRjIgb2Zmc3ByaW5nIGFuZCBvYnNlcnZlIDE2NCBicm93biBhbmQgYW5kIHRoZSByZXN0IHdoaXRlLiBUZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgdGhlIGdlbmV0aWNzIG1vZGVsIGlzIGNvcnJlY3QgYXQgdGhlICRcYWxwaGEgPSAwLjEkLg0KDQpPdXIgaHlwb3RoZXNlczoNCiQkXGJlZ2lue2FsaWduKn1IXzAgJjogcF9CID0gXGZyYWN7M317NH0gLCBwX1cgPSBcZnJhY3sxfXs0fVxcDQpIX2EgJjogXHRleHR7QXQgbGVhc3Qgb25lIHByb2JhYmlsaXR5IHNpZ25pZmljYW50bHkgZGlmZmVyZW50fVxlbmR7YWxpZ24qfSQkDQoNCkNyZWF0aW5nIHRoZSBjZWxsIGNvdW50IHZlY3RvcnM6DQoNCmBgYHtyfQ0Kb2JzZXJ2ZWQgPSBjKDE2NCwzNikNCmV4cGVjdGVkID0gYyguNzUsLjI1KQ0KYGBgDQoNClJ1biB0aGUgcHJvY2VkdXJlOg0KDQpgYGB7cn0NCnhjaGlzcS50ZXN0KHggPSBvYnNlcnZlZCwNCiAgICAgICAgICAgcCA9IGV4cGVjdGVkKQ0KYGBgDQoNClRoZSBleHBlY3RlZCBjZWxsIGNvdW50cyBhcmUgYm90aCBmYXIgbGFyZ2VyIHRoYW4gNSwgc28gdGhlIGRhdGEgcGFzc2VzIHZlcmlmaWNhdGlvbi4gR2l2ZW4gdGhhdCAkcCA9IDAuMDcyNDUgPCAwLjEgPSBcYWxwaGEkLCB3ZSByZWplY3QgdGhlIG51bGwuIFdlIGhhdmUgZXZpZGVuY2UgdGhhdCB0aGUgZ2VuZXRpYyBtb2RlbCBmb3IgdGhlIG1pY2UgaXMgaW5jb3JyZWN0Lg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlYuIEV4YW1wbGUgMzogQmlydGhzIG9uIFdlZWsgRGF5cyB2cy4gV2Vla2VuZHM8L3NwYW4+DQoNCkFyZSBmZXdlciBodW1hbiBiYWJpZXMgYm9ybiBvbiB3ZWVrZW5kIGRheXMgKHByb3BvcnRpb25hbGx5KSB0aGVuIHdlZWsgZGF5cz8NCg0KTm90ZSB0aGF0LCBuYXR1cmFsbHksIDIgb3V0IG9mIDcgYmFiaWVzIHdvdWxkIGJlIGJvcm4gb24gd2Vla2VuZCBkYXlzIHdoaWxlIDUgb3V0IG9mIDcgd291bGQgYmUgYm9ybiBvbiB3ZWVrZGF5cy4gTW9kZXJuIG1lZGljaW5lIHByb2R1Y2VkIGEgbGFyZ2UgaW5jcmVhc2UgaW4gc2NoZWR1bGVkIGJpcnRocyAocGxhbm5lZCBpbmR1Y3Rpb25zIG9yIHBsYW5uZWQgQy1zZWN0aW9ucykgaW4gcmVjZW50IHllYXJzLiBJZiBwYXJlbnRzIGFuZCBkb2N0b3JzIHdvcmsgdG9nZXRoZXIgdG8gc2NoZWR1bGUgYSBiaXJ0aCwgaXQgc3VyZSBhaW4ndCBnb25uYSBiZSBhdCBtaWRuaWdodCBvbiBhIFNhdHVyZGF5ISBDb25zaWRlciB0aGUgZm9sbG93aW5nIG9ic2VydmVkIGRhdGEgZm9yIGJpcnRocyBpbiBvbmUgY291bnR5IGluIEdlb3JnaWEgZm9yIDIwMTkuDQokJFxiZWdpbnthcnJheX17Y2NjY2NjY30NClx0ZXh0e1N1fSZcdGV4dHtNfSZcdGV4dHtUfSZcdGV4dHtXfSZcdGV4dHtSfSZcdGV4dHtGfSZcdGV4dHtTYX1cXA0KMTEgJiAyOSAmIDE2ICYgMTQgJiAxNyAmIDIzICYgOQ0KXGVuZHthcnJheX0kJA0KDQpTdSBNIFQgVyBSIEYgU2ENCjExIDI5IDE2IDE0IDE3IDIzIDkNCg0KSXMgdGhlcmUgZXZpZGVuY2UgYXQgdGhlICRcYWxwaGEgPSAwLjA1JCBsZXZlbCB0aGF0IGZld2VyIGJhYmllcyAocHJvcG9ydGlvbmFsbHkpIGFyZSBib3JuIG9uIHdlZWtlbmRzPw0KDQpPdXIgaHlwb3RoZXNlczoNCiQkXGJlZ2lue2FsaWduKn1IXzAgJjogcF97U3V9ID0gIHBfTSA9IHBfVCA9IHBfVyA9IHBfUiA9IHBfRj0gcF97U2F9ID0gXGZyYWN7MX17N31cXA0KSF9hICY6IFx0ZXh0e0F0IGxlYXN0IG9uZSBwcm9iYWJpbGl0eSBzaWduaWZpY2FudGx5IGRpZmZlcmVudH1cZW5ke2FsaWduKn0kJA0KDQpDcmVhdGluZyB0aGUgY2VsbCBjb3VudCB2ZWN0b3JzOg0KDQpgYGB7cn0NCm9ic2VydmVkID0gYygxMSwgMjksIDE2LCAxNCwgMTcsIDIzLCA5KQ0KZXhwZWN0ZWQgPSBjKDEvNywxLzcsMS83LDEvNywxLzcsMS83LDEvNykNCmBgYA0KDQpSdW4gdGhlIHByb2NlZHVyZToNCg0KYGBge3J9DQp4Y2hpc3EudGVzdCh4ID0gb2JzZXJ2ZWQsDQogICAgICAgICAgIHAgPSBleHBlY3RlZCkNCmBgYA0KDQpUaGUgZXhwZWN0ZWQgY2VsbCBjb3VudHMgYXJlIGFsbCAxNyBhbmQgdGh1cyBsYXJnZXIgdGhhbiA1LCBzbyB0aGUgZGF0YSBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSAkXGNoaV4yJCBHT0YgcHJvY2VkdXJlLiBHaXZlbiB0aGF0ICRwID0gMC4wMDkwNjkgPCAwLjA1ID0gXGFscGhhJCwgd2UgcmVqZWN0IHRoZSBudWxsLiBXZSBoYXZlIGV2aWRlbmNlIHRoYXQgdGhlIHRoZSBtb2RlbCBzdGF0aW5nIGJhYmllcyBhcmUgZXF1YWxseSBsaWtlbHkgdG8gYmUgYm9ybiBlYWNoIGRheSBvZiB0aGUgd2VlayBpcyBmYWxzZS4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5WSS4gRXhlcmNpc2VzPC9zcGFuPg0KDQoxLiBBIGJhc2ViYWxsIGNhcmQgY29tcGFueSBjbGFpbXMgdGhhdCAyNSUgb2YgaXRzIGNhcmRzIGFyZSByb29raWVzLCA2NSUgYXJlIHZldGVyYW5zIGJ1dCBub3QgQWxsLVN0YXJzLCBhbmQgMTAlIGFyZSB2ZXRlcmFuIEFsbC1TdGFycy4gU3VwcG9zZSBhIHJhbmRvbSBzYW1wbGUgb2YgMjAwIGNhcmRzIGhhcyA3MCByb29raWVzLCAxMjAgdmV0ZXJhbnMsIGFuZCAxMCBBbGwtU3RhcnMuIElzIHRoZSBjb21wYW55J3MgY2xhaW1lZCBkaXN0cmlidXRpb24gY3JlZGlibGU/IFRlc3QgdXNpbmcgJFxjaGleMiQgR09GIHdpdGggYSAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCg0KMi4gQSBzdXBwb3NlZGx5IGZhaXIgZGllIGlzIHJvbGxlZCA1MCB0aW1lcyB3aXRoIHRoZSBmb2xsb3dpbmcgcmVzdWx0czogOSBvbmVzLCAxNSB0d29zLCA5IHRocmVlcywgOCBmb3VycywgNiBmaXZlcyBhbmQgMTMgc2l4ZXMuIFRlc3QgYXQgdGhlIDAuMDUgbGV2ZWwgd2hldGhlciB0aGUgZGllIGlzIGFjdHVhbGx5IGZhaXIgdXNpbmcgJFxjaGleMiQgR09GLg0KDQozLiBIZWxlbmEgYnV5cyBjdXN0b20gTSZNJ3MgZm9yIGEgYnJpZGFsIHNob3dlciBzaGUncyB0aHJvd2luZyBmb3IgaGVyIHNpc3Rlci4gU2hlIG9yZGVycyAgMTAlIHllbGxvdywgMjAlIHBhbGUgYmx1ZSwgMzAlIHJlZCBhbmQgNDAlIHBpbmsuIFdoZW4gc2hlIHJlY2VpdmVzIGhlciAxMCBsYi4gcGFja2FnZSwgc2hlIHNlZXMgYWxtb3N0IG5vdCB5ZWxsb3cgYW5kIGZhciB0b28gbWFueSBwYWxlIGJsdWUuIFNoZSByYW5kb21seSBzZWxlY3RzIDIwMCBvZiB0aGUgTSZNJ3MgYW5kIGZpbmRzIHRoZSBmb2xsb3dpbmcgb2JzZXJ2ZWQgY291bnRzOg0KJCRcYmVnaW57YXJyYXl9e2NjY2N9XHRleHR7WWVsbG93fSZcdGV4dHtCbHVlfSZcdGV4dHtSZWR9Jlx0ZXh0e1Bpbmt9XFwgXGhsaW5lDQo4JjU0JjY0Jjc0XGVuZHthcnJheX0kJA==