#install.packages("infer")
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.2
## Warning: package 'tibble' was built under R version 4.0.2
## Warning: package 'tidyr' was built under R version 4.0.2
## Warning: package 'dplyr' was built under R version 4.0.2
library(openintro)
## Warning: package 'openintro' was built under R version 4.0.2
## Warning: package 'airports' was built under R version 4.0.2
## Warning: package 'cherryblossom' was built under R version 4.0.2
## Warning: package 'usdata' was built under R version 4.0.2
library(infer)
## Warning: package 'infer' was built under R version 4.0.2
set.seed(011774)

Introductory Stuff

global_monitor <- tibble(
  scientist_work = c(rep("Benefits", 80000), rep("Doesn't benefit", 20000))
)
write.csv(global_monitor, "gm.csv")
scientist_work <- read.csv("gm.csv")
gm <- read.csv("gm.csv")
rownames(gm) <- NULL
ggplot(global_monitor, aes(x = scientist_work)) +
  geom_bar() +
  labs(x = "" , y = "",
       title = "Do you believe that the work scientists do benefits people like you?") +
  coord_flip()

global_monitor %>%
  count(scientist_work) %>%
  mutate(p = n/sum(n))
## # A tibble: 2 x 3
##   scientist_work      n     p
##   <chr>           <int> <dbl>
## 1 Benefits        80000   0.8
## 2 Doesn't benefit 20000   0.2

Exercise 1

samp1 <- global_monitor %>%
  sample_n(50)
 samp1 %>%
count(scientist_work) %>%
   mutate(s = n/sum(n))
## # A tibble: 2 x 3
##   scientist_work      n     s
##   <chr>           <int> <dbl>
## 1 Benefits           40   0.8
## 2 Doesn't benefit    10   0.2

Describe the distribution of responses from this sample.

This distribution is off by 0.04. But notice, if I multiply the sample size by 10, I get a sampling distribution closer to the population mean. Now it’s less than 0.2.

samp2 <- global_monitor %>%
  sample_n(500)
 samp2 %>%
count(scientist_work) %>%
   mutate(s2 = n/sum(n))
## # A tibble: 2 x 3
##   scientist_work      n    s2
##   <chr>           <int> <dbl>
## 1 Benefits          407 0.814
## 2 Doesn't benefit    93 0.186
samp1 %>%
count(scientist_work) %>%
  mutate(p_hat =n/sum(n))
## # A tibble: 2 x 3
##   scientist_work      n p_hat
##   <chr>           <int> <dbl>
## 1 Benefits           40   0.8
## 2 Doesn't benefit    10   0.2

Exercise 2

According to Lohr, Sampling Design and Analysis, 2nd Edition, p. 29, sampling distributions operate the same as confidence intervals. Take one sampling distribution, it may or may not represent the population parameters. But if multiple sampling distributions are taken, 95% of them will be close to the population parameters. Thus the sampling distribution from another student may or may not be close to the population parameters, but if we took the sampling distributions from all the students in the class, most of them would be at or near the population parameters.

Exercise 3

samp3 <- global_monitor %>%
  sample_n(50)
 samp3 %>%
count(scientist_work) %>%
   mutate(s3 = n/sum(n))
## # A tibble: 2 x 3
##   scientist_work      n    s3
##   <chr>           <int> <dbl>
## 1 Benefits           34  0.68
## 2 Doesn't benefit    16  0.32

In this case, my two samples of 50 were the same.

sample_props50 <- global_monitor %>%
                    rep_sample_n(size = 50, reps = 15000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit")
ggplot(data = sample_props50, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02) +
  labs(
    x = "p_hat (Doesn't benefit)",
    title = "Sampling distribution of p_hat",
    subtitle = "Sample size = 50, Number of samples = 15000" )

Exercise 4

There are 14,999 observations in sample_props50. (Is this what is meant by elements?) The plot of sample_props50 appears to be normal, but see the long-winded explanation below, complete w/ Shapiro-Wilk and a histogram w/ a normal curve superimposed.

g =sample_props50
m <- mean(sample_props50$p_hat)
std <-sd(sample_props50$p_hat)
ggplot (data =sample_props50, aes(x=p_hat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density.. )) +
stat_function(fun = dnorm, args = c(mean = m, sd = std), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

write.csv(sample_props50, file = "sample_props50.csv")
  #### I tried running Shapiro-Wilk, but R wouldn't let me do it because the sample size was > 5,000. The NCSS Shapiro-Wilk documentation says "The test was developed by Shapiro and Wilk (1965) for samples up to 20. NCSS uses the approximations

suggested by Royston (1992) and Royston (1995) which allow unlimited sample sizes. Note that Royston only checked the results for sample sizes up to 5000, but indicated that he saw no reason larger sample sizes should not work." Therefore, NCSS allows unlimited sample sizes.

I saved the sample_props50.csv file, imported it into NCSS, and ran the normality tests. The curve looks normal, but the Shapiro-Wilks test said it wasn’t.

  As we discussed in class today, if you have a sufficiently large sample size, you will always have statistical significance. With a sample size of 14,999, the Shapiro-Wilk test found statistical significance, and thus said the sample was not normal. But see below. I ran the Shaprio-Wilk test against a sample of 50 and it showed strong evidence of not being normal. Large or small, samples seem to show the data are not normally distributed, in spite of the normal curve on the histogram.  
  
  This also proves the point of the author of the Stata book I mentioned in class a couple of weeks ago. He  told me we should all know multiple stats packages because one doesn't do everything. R doesn't do Shapiro-Wilk on datasets with > 5,000 observations. NCSS does. Gotta have both. 
   
                Test           Prob   10% Critical  5% Critical Decision

Test Name Value Level Value Value -5% Shapiro-Wilk W 0.9870675 0 Reject normality Anderson-Darling 81.54572 0 Reject normality Martinez-Iglewicz 0.9810345 0.9926747 0.9911315 Can’t reject normality Kolmogorov-Smirnov 0.08221351 0.011 0.012 Reject normality D’Agostino Skewness 10.17995 0 1.645 1.96 Reject normality D’Agostino Kurtosis -0.9085 0.363607 1.645 1.96 Can’t reject normality D’Agostino Omnibus 104.4567 0 4.605 5.991 Reject normality

#write.csv(samp3, file = "samp3.csv")
samp3 <- read.csv("samp3.csv")
shapiro.test(samp3$number)
## 
##  Shapiro-Wilk normality test
## 
## data:  samp3$number
## W = 0.44124, p-value = 1.573e-12

Exercise at the top of page 5, showing the code needed to generate 1 sample of 50. rep_sample_n saves doing this X number of times.

global_monitor %>%
sample_n(size = 50, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Doesn't benefit")
## # A tibble: 1 x 3
##   scientist_work      n p_hat
##   <chr>           <int> <dbl>
## 1 Doesn't benefit     8  0.16

Exercise 5 25 Sample proportions from samples of size 10.

sample_props_small <- global_monitor %>%
                    rep_sample_n(size = 10, reps = 25, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit")

There are 23 observations in this dataset. Each observation represents a different sample. p_hat in each row indicates the probability of getting a value of “Doesn’t Benefit” in that sample.

ggplot(data = sample_props50, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02)

### Exercise 6.

Each observation represents a sample As the sample size increases, the histogram bunches together. The mean doesn’t change much – w/ 10 observations, it is 0.22; with the rest (50, 100, 1,000) it stays at 0.2. The SE, however, decreases from 0.11 to 0.06 to 0.04 to 0.01. NB: I ran a sample size of 1,000 just to see what it would do.

Exercise 7. I assumed for this exercise we were to generate only 1 sample.

global_monitor %>%
sample_n(size = 15, replace = TRUE) %>%
count(scientist_work) %>%
mutate(p_hat = n /sum(n)) %>%
filter(scientist_work == "Benefits")
## # A tibble: 1 x 3
##   scientist_work     n p_hat
##   <chr>          <int> <dbl>
## 1 Benefits          11 0.733

I think this one sample would give a higher proportion of “Benefits” than a greater number of samples would give.

Exercise 8

sample_props15 <- global_monitor %>%
                    rep_sample_n(size = 15, reps = 2000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Benefits")
e8 =sample_props15
m8 <- mean(sample_props15$p_hat)
std8 <-sd(sample_props15$p_hat)
med <- median(sample_props15$p_hat)
ggplot (data =sample_props15, aes(x=p_hat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density.. )) +
stat_function(fun = dnorm, args = c(mean = m8, sd = std8), col = "Blue")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

In this histogram, it appears the proportion of “Benefits” in the population is ~ 80%. The distribution is skewed to the left, meaning more of the samples have a greater proportion of “Benefits.”

hist(sample_props15$p_hat, main = "Histogram of p_hat, sample size 15", xlab = "p_hat")
abline(v = m8, col = "red")
abline(v = med, col = "blue")

Based on the above histogram w/ the mean and medians overlaying, it seems the proportion of “Benefits” in the population is 80%.

Exercise 9

sample_props150 <- global_monitor %>%
                    rep_sample_n(size = 150, reps = 2000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Benefits")
e9 =sample_props15
m9 <- mean(sample_props150$p_hat)
std9 <-sd(sample_props150$p_hat)
med9 <- median(sample_props150$p_hat)
ggplot (data =sample_props150, aes(x=p_hat)) +
  geom_blank() +
  geom_histogram(aes(y = ..density.. )) +
stat_function(fun = dnorm, args = c(mean = m9, sd = std9), col = "Green")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

hist(sample_props150$p_hat, main = "Histogram of p_hat, sample size 150", xlab = "p_hat")
abline(v = m9, col = "red")
abline(v = med9, col = "blue")

Given the 2nd histogram, the population mean seems to always be 0.8, regardless of the size of the sample of the shape of the sampling distribution.

The second sampling distribution is shifted markedly to the left, but the curve seems to show a normal distribution. The 2nd histogram confirms that.

Exercise 10

NB: I assume the authors of this Lab mean 8 & 9, not 2 & 3. The distribution w/ the smaller sample size (15) actually has the larger spread, which is counterintuitive, but in line w/ the results generated by the app. If you want a sampling distribution w/ a more narrow spread, use a larger sample size.

LS0tDQp0aXRsZTogIkxhYiBOYW1lIg0KYXV0aG9yOiAiQXV0aG9yIE5hbWUiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImluZmVyIikNCmBgYA0KDQoNCg0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoaW5mZXIpDQpzZXQuc2VlZCgwMTE3NzQpDQpgYGANCg0KYGBge3J9DQpgYGANCiMjIyBJbnRyb2R1Y3RvcnkgU3R1ZmYNCg0KYGBge3J9DQpnbG9iYWxfbW9uaXRvciA8LSB0aWJibGUoDQogIHNjaWVudGlzdF93b3JrID0gYyhyZXAoIkJlbmVmaXRzIiwgODAwMDApLCByZXAoIkRvZXNuJ3QgYmVuZWZpdCIsIDIwMDAwKSkNCikNCmBgYA0KDQpgYGB7cn0NCndyaXRlLmNzdihnbG9iYWxfbW9uaXRvciwgImdtLmNzdiIpDQpzY2llbnRpc3Rfd29yayA8LSByZWFkLmNzdigiZ20uY3N2IikNCmdtIDwtIHJlYWQuY3N2KCJnbS5jc3YiKQ0Kcm93bmFtZXMoZ20pIDwtIE5VTEwNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChnbG9iYWxfbW9uaXRvciwgYWVzKHggPSBzY2llbnRpc3Rfd29yaykpICsNCiAgZ2VvbV9iYXIoKSArDQogIGxhYnMoeCA9ICIiICwgeSA9ICIiLA0KICAgICAgIHRpdGxlID0gIkRvIHlvdSBiZWxpZXZlIHRoYXQgdGhlIHdvcmsgc2NpZW50aXN0cyBkbyBiZW5lZml0cyBwZW9wbGUgbGlrZSB5b3U/IikgKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KYGBge3J9DQpnbG9iYWxfbW9uaXRvciAlPiUNCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICBtdXRhdGUocCA9IG4vc3VtKG4pKQ0KYGBgDQoNCg0KDQojIyMgRXhlcmNpc2UgMQ0KDQoNCg0KYGBge3IgY29kZS1jaHVuay1sYWJlbH0NCg0Kc2FtcDEgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogIHNhbXBsZV9uKDUwKQ0KIHNhbXAxICU+JQ0KY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgbXV0YXRlKHMgPSBuL3N1bShuKSkNCmBgYA0KDQojIyMjIERlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgcmVzcG9uc2VzIGZyb20gdGhpcyBzYW1wbGUuIA0KVGhpcyBkaXN0cmlidXRpb24gaXMgb2ZmIGJ5IDAuMDQuIEJ1dCBub3RpY2UsIGlmIEkgbXVsdGlwbHkgdGhlIHNhbXBsZSBzaXplIGJ5IDEwLCBJIGdldCBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBjbG9zZXIgdG8gdGhlIHBvcHVsYXRpb24gbWVhbi4gTm93IGl0J3MgbGVzcyB0aGFuIDAuMi4NCg0KYGBge3J9DQpzYW1wMiA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgc2FtcGxlX24oNTAwKQ0KIHNhbXAyICU+JQ0KY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgbXV0YXRlKHMyID0gbi9zdW0obikpDQpgYGANCg0KDQoNCg0KYGBge3J9DQpzYW1wMSAlPiUNCmNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCiAgbXV0YXRlKHBfaGF0ID1uL3N1bShuKSkNCg0KDQoNCg0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDINCg0KQWNjb3JkaW5nIHRvIExvaHIsIFNhbXBsaW5nIERlc2lnbiBhbmQgQW5hbHlzaXMsIDJuZCBFZGl0aW9uLCBwLiAyOSwgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBvcGVyYXRlIHRoZSBzYW1lIGFzIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBUYWtlIG9uZSBzYW1wbGluZyBkaXN0cmlidXRpb24sIGl0IG1heSBvciBtYXkgbm90IHJlcHJlc2VudCB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXJzLiBCdXQgaWYgbXVsdGlwbGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBhcmUgdGFrZW4sIDk1JSBvZiB0aGVtIHdpbGwgYmUgY2xvc2UgdG8gdGhlIHBvcHVsYXRpb24gcGFyYW1ldGVycy4gVGh1cyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZyb20gYW5vdGhlciBzdHVkZW50IG1heSBvciBtYXkgbm90IGJlIGNsb3NlIHRvIHRoZSBwb3B1bGF0aW9uIHBhcmFtZXRlcnMsIGJ1dCBpZiB3ZSB0b29rIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIGZyb20gYWxsIHRoZSBzdHVkZW50cyBpbiB0aGUgY2xhc3MsIG1vc3Qgb2YgdGhlbSB3b3VsZCBiZSBhdCBvciBuZWFyIHRoZSBwb3B1bGF0aW9uIHBhcmFtZXRlcnMuIA0KDQoNCiMjIyBFeGVyY2lzZSAzDQoNCmBgYHtyfQ0KDQpzYW1wMyA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgc2FtcGxlX24oNTApDQogc2FtcDMgJT4lDQpjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogICBtdXRhdGUoczMgPSBuL3N1bShuKSkNCg0KDQoNCg0KYGBgDQoNCiMjIyMgSW4gdGhpcyBjYXNlLCBteSB0d28gc2FtcGxlcyBvZiA1MCB3ZXJlIHRoZSBzYW1lLiANCg0KDQpgYGB7cn0NCnNhbXBsZV9wcm9wczUwIDwtIGdsb2JhbF9tb25pdG9yICU+JQ0KICAgICAgICAgICAgICAgICAgICByZXBfc2FtcGxlX24oc2l6ZSA9IDUwLCByZXBzID0gMTUwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpDQoNCg0KDQoNCg0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3BzNTAsIGFlcyh4ID0gcF9oYXQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikgKw0KICBsYWJzKA0KICAgIHggPSAicF9oYXQgKERvZXNuJ3QgYmVuZWZpdCkiLA0KICAgIHRpdGxlID0gIlNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBwX2hhdCIsDQogICAgc3VidGl0bGUgPSAiU2FtcGxlIHNpemUgPSA1MCwgTnVtYmVyIG9mIHNhbXBsZXMgPSAxNTAwMCIgKQ0KDQoNCg0KDQoNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0DQoNClRoZXJlIGFyZSAxNCw5OTkgb2JzZXJ2YXRpb25zIGluIHNhbXBsZV9wcm9wczUwLiAoSXMgdGhpcyB3aGF0IGlzIG1lYW50IGJ5IGVsZW1lbnRzPykgVGhlIHBsb3Qgb2Ygc2FtcGxlX3Byb3BzNTAgYXBwZWFycyB0byBiZSBub3JtYWwsIGJ1dCBzZWUgdGhlIGxvbmctd2luZGVkIGV4cGxhbmF0aW9uIGJlbG93LCBjb21wbGV0ZSB3LyBTaGFwaXJvLVdpbGsgYW5kIGEgaGlzdG9ncmFtIHcvIGEgbm9ybWFsIGN1cnZlIHN1cGVyaW1wb3NlZC4gDQogICAgICANCiAgICAgIA0KYGBge3J9DQoNCmcgPXNhbXBsZV9wcm9wczUwDQptIDwtIG1lYW4oc2FtcGxlX3Byb3BzNTAkcF9oYXQpDQpzdGQgPC1zZChzYW1wbGVfcHJvcHM1MCRwX2hhdCkNCmdncGxvdCAoZGF0YSA9c2FtcGxlX3Byb3BzNTAsIGFlcyh4PXBfaGF0KSkgKw0KICBnZW9tX2JsYW5rKCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IC4uZGVuc2l0eS4uICkpICsNCnN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sIGFyZ3MgPSBjKG1lYW4gPSBtLCBzZCA9IHN0ZCksIGNvbCA9ICJ0b21hdG8iKQ0KDQpgYGANCg0KYGBge3J9DQp3cml0ZS5jc3Yoc2FtcGxlX3Byb3BzNTAsIGZpbGUgPSAic2FtcGxlX3Byb3BzNTAuY3N2IikNCg0KYGBgDQogICAgICANCiAgICAgICMjIyMgSSB0cmllZCBydW5uaW5nIFNoYXBpcm8tV2lsaywgYnV0IFIgd291bGRuJ3QgbGV0IG1lIGRvIGl0IGJlY2F1c2UgdGhlIHNhbXBsZSBzaXplIHdhcyA+IDUsMDAwLiBUaGUgTkNTUyBTaGFwaXJvLVdpbGsgZG9jdW1lbnRhdGlvbiBzYXlzICJUaGUgdGVzdCB3YXMgZGV2ZWxvcGVkIGJ5IFNoYXBpcm8gYW5kIFdpbGsgKDE5NjUpIGZvciBzYW1wbGVzIHVwIHRvIDIwLiBOQ1NTIHVzZXMgdGhlIGFwcHJveGltYXRpb25zDQpzdWdnZXN0ZWQgYnkgUm95c3RvbiAoMTk5MikgYW5kIFJveXN0b24gKDE5OTUpIHdoaWNoIGFsbG93IHVubGltaXRlZCBzYW1wbGUgc2l6ZXMuIE5vdGUgdGhhdCBSb3lzdG9uIG9ubHkNCmNoZWNrZWQgdGhlIHJlc3VsdHMgZm9yIHNhbXBsZSBzaXplcyB1cCB0byA1MDAwLCBidXQgaW5kaWNhdGVkIHRoYXQgaGUgc2F3IG5vIHJlYXNvbiBsYXJnZXIgc2FtcGxlIHNpemVzIHNob3VsZCBub3QNCndvcmsuIiBUaGVyZWZvcmUsIE5DU1MgYWxsb3dzIHVubGltaXRlZCBzYW1wbGUgc2l6ZXMuIA0KDQpJIHNhdmVkIHRoZSBzYW1wbGVfcHJvcHM1MC5jc3YgZmlsZSwgaW1wb3J0ZWQgaXQgaW50byBOQ1NTLCBhbmQgcmFuIHRoZSBub3JtYWxpdHkgdGVzdHMuICBUaGUgY3VydmUgbG9va3Mgbm9ybWFsLCBidXQgdGhlIFNoYXBpcm8tV2lsa3MgdGVzdCBzYWlkIGl0IHdhc24ndC4gICANCiAgICAgIA0KICAgICAgQXMgd2UgZGlzY3Vzc2VkIGluIGNsYXNzIHRvZGF5LCBpZiB5b3UgaGF2ZSBhIHN1ZmZpY2llbnRseSBsYXJnZSBzYW1wbGUgc2l6ZSwgeW91IHdpbGwgYWx3YXlzIGhhdmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLiBXaXRoIGEgc2FtcGxlIHNpemUgb2YgMTQsOTk5LCB0aGUgU2hhcGlyby1XaWxrIHRlc3QgZm91bmQgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLCBhbmQgdGh1cyBzYWlkIHRoZSBzYW1wbGUgd2FzIG5vdCBub3JtYWwuIEJ1dCBzZWUgYmVsb3cuIEkgcmFuIHRoZSBTaGFwcmlvLVdpbGsgdGVzdCBhZ2FpbnN0IGEgc2FtcGxlIG9mIDUwIGFuZCBpdCBzaG93ZWQgc3Ryb25nIGV2aWRlbmNlIG9mIG5vdCBiZWluZyBub3JtYWwuIExhcmdlIG9yIHNtYWxsLCBzYW1wbGVzIHNlZW0gdG8gc2hvdyB0aGUgZGF0YSBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBpbiBzcGl0ZSBvZiB0aGUgbm9ybWFsIGN1cnZlIG9uIHRoZSBoaXN0b2dyYW0uICANCiAgICAgIA0KICAgICAgVGhpcyBhbHNvIHByb3ZlcyB0aGUgcG9pbnQgb2YgdGhlIGF1dGhvciBvZiB0aGUgU3RhdGEgYm9vayBJIG1lbnRpb25lZCBpbiBjbGFzcyBhIGNvdXBsZSBvZiB3ZWVrcyBhZ28uIEhlICB0b2xkIG1lIHdlIHNob3VsZCBhbGwga25vdyBtdWx0aXBsZSBzdGF0cyBwYWNrYWdlcyBiZWNhdXNlIG9uZSBkb2Vzbid0IGRvIGV2ZXJ5dGhpbmcuIFIgZG9lc24ndCBkbyBTaGFwaXJvLVdpbGsgb24gZGF0YXNldHMgd2l0aCA+IDUsMDAwIG9ic2VydmF0aW9ucy4gTkNTUyBkb2VzLiBHb3R0YSBoYXZlIGJvdGguIA0KICAgICAgIA0KICAgICAJICAgICAgICAgICAgVGVzdAkgICAgICAgUHJvYgkgIDEwJSBDcml0aWNhbAk1JSBDcml0aWNhbAlEZWNpc2lvbg0KVGVzdCBOYW1lCSAgICAgICAgVmFsdWUJICAgICAgIExldmVsCSAgIFZhbHVlICAgICAgCVZhbHVlCSAgICAgLTUlDQpTaGFwaXJvLVdpbGsgVwkgMC45ODcwNjc1CSAgICAgMAkJCSAgICAgICAgICAgICAgICAgICAgICAgIFJlamVjdCBub3JtYWxpdHkNCkFuZGVyc29uLURhcmxpbmcJODEuNTQ1NzIJICAgICAwCQkgICAgICAgICAgICAgICAgICAgICAgICAJUmVqZWN0IG5vcm1hbGl0eQ0KTWFydGluZXotSWdsZXdpY3oJMC45ODEwMzQ1CQkgICAgICAgIDAuOTkyNjc0NwkgICAgMC45OTExMzE1CSAgQ2FuJ3QgcmVqZWN0IG5vcm1hbGl0eQ0KS29sbW9nb3Jvdi1TbWlybm92CTAuMDgyMjEzNTEJCSAgICAgMC4wMTEJICAgICAgICAwLjAxMgkgICAgUmVqZWN0IG5vcm1hbGl0eQ0KRCdBZ29zdGlubyBTa2V3bmVzcwkxMC4xNzk5NQkgICAwCSAgIDEuNjQ1CSAgICAgICAgIDEuOTYJICAgIFJlamVjdCBub3JtYWxpdHkNCkQnQWdvc3Rpbm8gS3VydG9zaXMJLTAuOTA4NQkgIDAuMzYzNjA3CTEuNjQ1CSAgICAgICAgIDEuOTYJICAgIENhbid0IHJlamVjdCBub3JtYWxpdHkNCkQnQWdvc3Rpbm8gT21uaWJ1cwkxMDQuNDU2NwkgICAgICAgIDAJNC42MDUJICAgICAgICAgNS45OTEJICBSZWplY3Qgbm9ybWFsaXR5DQogDQpgYGB7cn0NCiN3cml0ZS5jc3Yoc2FtcDMsIGZpbGUgPSAic2FtcDMuY3N2IikNCnNhbXAzIDwtIHJlYWQuY3N2KCJzYW1wMy5jc3YiKQ0Kc2hhcGlyby50ZXN0KHNhbXAzJG51bWJlcikNCmBgYA0KIyMjIyBFeGVyY2lzZSBhdCB0aGUgdG9wIG9mIHBhZ2UgNSwgc2hvd2luZyB0aGUgY29kZSBuZWVkZWQgdG8gZ2VuZXJhdGUgMSBzYW1wbGUgb2YgNTAuICByZXBfc2FtcGxlX24gc2F2ZXMgZG9pbmcgdGhpcyBYIG51bWJlciBvZiB0aW1lcy4gIA0KDQpgYGB7cn0NCmdsb2JhbF9tb25pdG9yICU+JQ0Kc2FtcGxlX24oc2l6ZSA9IDUwLCByZXBsYWNlID0gVFJVRSkgJT4lDQpjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQptdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA1IDI1IFNhbXBsZSBwcm9wb3J0aW9ucyBmcm9tIHNhbXBsZXMgb2Ygc2l6ZSAxMC4gDQoNCg0KYGBge3J9DQpzYW1wbGVfcHJvcHNfc21hbGwgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gMTAsIHJlcHMgPSAyNSwgcmVwbGFjZSA9IFRSVUUpICU+JQ0KICAgICAgICAgICAgICAgICAgICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiRG9lc24ndCBiZW5lZml0IikNCmBgYA0KDQojIyMjIFRoZXJlIGFyZSAyMyBvYnNlcnZhdGlvbnMgaW4gdGhpcyBkYXRhc2V0LiBFYWNoIG9ic2VydmF0aW9uIHJlcHJlc2VudHMgYSBkaWZmZXJlbnQgc2FtcGxlLiBwX2hhdCBpbiBlYWNoIHJvdyBpbmRpY2F0ZXMgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYSB2YWx1ZSBvZiAiRG9lc24ndCBCZW5lZml0IiBpbiB0aGF0IHNhbXBsZS4gDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHM1MCwgYWVzKHggPSBwX2hhdCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQ0KYGBgDQojIyMgRXhlcmNpc2UgNi4NCg0KRWFjaCBvYnNlcnZhdGlvbiByZXByZXNlbnRzIGEgc2FtcGxlIEFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHRoZSBoaXN0b2dyYW0gYnVuY2hlcyB0b2dldGhlci4gIFRoZSBtZWFuIGRvZXNuJ3QgY2hhbmdlIG11Y2ggLS0gdy8gMTAgb2JzZXJ2YXRpb25zLCBpdCBpcyAwLjIyOyB3aXRoIHRoZSByZXN0ICg1MCwgMTAwLCAxLDAwMCkgaXQgc3RheXMgYXQgMC4yLiAgVGhlIFNFLCBob3dldmVyLCBkZWNyZWFzZXMgZnJvbSAwLjExIHRvIDAuMDYgdG8gMC4wNCB0byAwLjAxLiAgTkI6IEkgcmFuIGEgc2FtcGxlIHNpemUgb2YgMSwwMDAganVzdCB0byBzZWUgd2hhdCBpdCB3b3VsZCBkby4NCg0KIyMjIEV4ZXJjaXNlIDcuIEkgYXNzdW1lZCBmb3IgdGhpcyBleGVyY2lzZSB3ZSB3ZXJlIHRvIGdlbmVyYXRlIG9ubHkgMSBzYW1wbGUuIA0KDQpgYGB7cn0NCg0KZ2xvYmFsX21vbml0b3IgJT4lDQpzYW1wbGVfbihzaXplID0gMTUsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCmNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUNCm11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lDQpmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkJlbmVmaXRzIikNCg0KDQoNCg0KDQoNCmBgYA0KSSB0aGluayB0aGlzIG9uZSBzYW1wbGUgd291bGQgZ2l2ZSBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mICJCZW5lZml0cyIgdGhhbiBhIGdyZWF0ZXIgbnVtYmVyIG9mIHNhbXBsZXMgd291bGQgZ2l2ZS4gDQoNCiMjIyBFeGVyY2lzZSA4IA0KDQoNCmBgYHtyfQ0KDQpzYW1wbGVfcHJvcHMxNSA8LSBnbG9iYWxfbW9uaXRvciAlPiUNCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxNSwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQ0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkJlbmVmaXRzIikNCg0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQplOCA9c2FtcGxlX3Byb3BzMTUNCm04IDwtIG1lYW4oc2FtcGxlX3Byb3BzMTUkcF9oYXQpDQpzdGQ4IDwtc2Qoc2FtcGxlX3Byb3BzMTUkcF9oYXQpDQptZWQgPC0gbWVkaWFuKHNhbXBsZV9wcm9wczE1JHBfaGF0KQ0KZ2dwbG90IChkYXRhID1zYW1wbGVfcHJvcHMxNSwgYWVzKHg9cF9oYXQpKSArDQogIGdlb21fYmxhbmsoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4gKSkgKw0Kc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IG04LCBzZCA9IHN0ZDgpLCBjb2wgPSAiQmx1ZSIpDQoNCg0KDQoNCg0KDQpgYGANCg0KSW4gdGhpcyBoaXN0b2dyYW0sIGl0IGFwcGVhcnMgdGhlIHByb3BvcnRpb24gb2YgIkJlbmVmaXRzIiBpbiB0aGUgcG9wdWxhdGlvbiBpcyB+IDgwJS4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBza2V3ZWQgdG8gdGhlIGxlZnQsIG1lYW5pbmcgbW9yZSBvZiB0aGUgc2FtcGxlcyBoYXZlIGEgZ3JlYXRlciBwcm9wb3J0aW9uIG9mICJCZW5lZml0cy4iICANCg0KYGBge3J9DQoNCmhpc3Qoc2FtcGxlX3Byb3BzMTUkcF9oYXQsIG1haW4gPSAiSGlzdG9ncmFtIG9mIHBfaGF0LCBzYW1wbGUgc2l6ZSAxNSIsIHhsYWIgPSAicF9oYXQiKQ0KYWJsaW5lKHYgPSBtOCwgY29sID0gInJlZCIpDQphYmxpbmUodiA9IG1lZCwgY29sID0gImJsdWUiKQ0KDQoNCg0KYGBgDQoNCkJhc2VkIG9uIHRoZSBhYm92ZSBoaXN0b2dyYW0gdy8gdGhlIG1lYW4gYW5kIG1lZGlhbnMgb3ZlcmxheWluZywgaXQgc2VlbXMgdGhlIHByb3BvcnRpb24gb2YgIkJlbmVmaXRzIiBpbiB0aGUgcG9wdWxhdGlvbiBpcyA4MCUuDQoNCiMjIyBFeGVyY2lzZSA5DQoNCg0KYGBge3J9DQpzYW1wbGVfcHJvcHMxNTAgPC0gZ2xvYmFsX21vbml0b3IgJT4lDQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gMTUwLCByZXBzID0gMjAwMCwgcmVwbGFjZSA9IFRSVUUpICU+JQ0KICAgICAgICAgICAgICAgICAgICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lDQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiQmVuZWZpdHMiKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KZTkgPXNhbXBsZV9wcm9wczE1DQptOSA8LSBtZWFuKHNhbXBsZV9wcm9wczE1MCRwX2hhdCkNCnN0ZDkgPC1zZChzYW1wbGVfcHJvcHMxNTAkcF9oYXQpDQptZWQ5IDwtIG1lZGlhbihzYW1wbGVfcHJvcHMxNTAkcF9oYXQpDQpnZ3Bsb3QgKGRhdGEgPXNhbXBsZV9wcm9wczE1MCwgYWVzKHg9cF9oYXQpKSArDQogIGdlb21fYmxhbmsoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4gKSkgKw0Kc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IG05LCBzZCA9IHN0ZDkpLCBjb2wgPSAiR3JlZW4iKQ0KDQoNCg0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQpoaXN0KHNhbXBsZV9wcm9wczE1MCRwX2hhdCwgbWFpbiA9ICJIaXN0b2dyYW0gb2YgcF9oYXQsIHNhbXBsZSBzaXplIDE1MCIsIHhsYWIgPSAicF9oYXQiKQ0KYWJsaW5lKHYgPSBtOSwgY29sID0gInJlZCIpDQphYmxpbmUodiA9IG1lZDksIGNvbCA9ICJibHVlIikNCg0KDQoNCg0KYGBgDQpHaXZlbiB0aGUgMm5kIGhpc3RvZ3JhbSwgdGhlIHBvcHVsYXRpb24gbWVhbiBzZWVtcyB0byBhbHdheXMgYmUgMC44LCByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSBzYW1wbGUgb2YgdGhlIHNoYXBlIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24uIA0KDQpUaGUgc2Vjb25kIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBzaGlmdGVkIG1hcmtlZGx5IHRvIHRoZSBsZWZ0LCBidXQgdGhlIGN1cnZlIHNlZW1zIHRvIHNob3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiAgVGhlIDJuZCBoaXN0b2dyYW0gY29uZmlybXMgdGhhdC4gDQoNCiMjIyBFeGVyY2lzZSAxMA0KDQpOQjogSSBhc3N1bWUgdGhlIGF1dGhvcnMgb2YgdGhpcyBMYWIgbWVhbiA4ICYgOSwgbm90IDIgJiAzLiAgIFRoZSBkaXN0cmlidXRpb24gdy8gdGhlIHNtYWxsZXIgc2FtcGxlIHNpemUgKDE1KSBhY3R1YWxseSBoYXMgdGhlIGxhcmdlciBzcHJlYWQsIHdoaWNoIGlzIGNvdW50ZXJpbnR1aXRpdmUsIGJ1dCBpbiBsaW5lIHcvIHRoZSByZXN1bHRzIGdlbmVyYXRlZCBieSB0aGUgYXBwLiBJZiB5b3Ugd2FudCBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3LyBhIG1vcmUgbmFycm93IHNwcmVhZCwgdXNlIGEgbGFyZ2VyIHNhbXBsZSBzaXplLiANCg==