library(tidyverse)
library(openintro)
library(infer)

Exercise 1

global_monitor <- tibble(
  scientist_work = c(rep("Benefits", 80000), rep("Doesn't benefit", 20000))
)

ggplot(global_monitor, aes(x = scientist_work)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you believe that the work scientists do benefit people like you?"
  ) +
  coord_flip() 

In our first sample of size 50 the distribution is different compared to the total population. The proportion in the sample is 86% “Benefits” and 14% “Doesn’t Benefit”, compared to 80/20 in the population. We expect the sample to not line up directly with the population, however it’s pretty close.

set.seed(100000)

samp1 <- global_monitor %>%
  sample_n(50)


ggplot(samp1, aes(x = scientist_work)) +
  geom_bar() +
  labs(
    x = "", y = "",
    title = "Do you believe that the work scientists do benefit people like you?"
  ) +
  coord_flip() 

samp1 %>%
  count(scientist_work) %>%
  mutate(sample_p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n sample_p
## * <chr>           <int>    <dbl>
## 1 Benefits           43     0.86
## 2 Doesn't benefit     7     0.14

Exercise 2

I would suspect another students sample would not match up with mine. Since I do not have another student to ask, I run my sample multiple times and never got the same result. So the proportion would be different, but only somewhat different. Since the proportions I was generating we all fairly close to the 80/20 split.

Exercise 3

Sample 2 has different proportions compared to my first sample.

samp2 <- global_monitor %>%
  sample_n(50)

samp2 %>%
  count(scientist_work) %>%
  mutate(sample_p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n sample_p
## * <chr>           <int>    <dbl>
## 1 Benefits           34     0.68
## 2 Doesn't benefit    16     0.32

The more I increase the number of samples the closer the sample proportion gets the the actual population. Sample 4, with a size of 1,000, is almost identical to the population.

samp3 <- global_monitor %>%
  sample_n(100)

samp3 %>%
  count(scientist_work) %>%
  mutate(sample_p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n sample_p
## * <chr>           <int>    <dbl>
## 1 Benefits           84     0.84
## 2 Doesn't benefit    16     0.16
samp4 <- global_monitor %>%
  sample_n(1000)

samp4 %>%
  count(scientist_work) %>%
  mutate(sample_p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n sample_p
## * <chr>           <int>    <dbl>
## 1 Benefits          799    0.799
## 2 Doesn't benefit   201    0.201

Exercise 4

The code is taking 15,000 samples of size 50. Then calculating the proportions and filtering to the “Doesn’t benefit” results. Plotting the proportions in a histogram shows a normal distribution around 0.2, which we know is the proportion of the population.

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 5

In this case there are 22 observations when I filter the dataframe to “Doesn’t Benefit” answers only. Since the sample size is only 10 there are a few samples that have 0 “Doesn’t Benefit” answers. Each observation in the dataframe represents the proportion of the sample that answered “Doesn’t Benefit”.

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")

print(sample_props_small)
## # A tibble: 20 x 4
## # Groups:   replicate [20]
##    replicate scientist_work      n p_hat
##        <int> <chr>           <int> <dbl>
##  1         1 Doesn't benefit     1   0.1
##  2         2 Doesn't benefit     4   0.4
##  3         4 Doesn't benefit     2   0.2
##  4         6 Doesn't benefit     2   0.2
##  5         7 Doesn't benefit     2   0.2
##  6         9 Doesn't benefit     3   0.3
##  7        10 Doesn't benefit     3   0.3
##  8        11 Doesn't benefit     2   0.2
##  9        12 Doesn't benefit     3   0.3
## 10        13 Doesn't benefit     3   0.3
## 11        14 Doesn't benefit     1   0.1
## 12        16 Doesn't benefit     1   0.1
## 13        17 Doesn't benefit     1   0.1
## 14        18 Doesn't benefit     4   0.4
## 15        20 Doesn't benefit     1   0.1
## 16        21 Doesn't benefit     2   0.2
## 17        22 Doesn't benefit     3   0.3
## 18        23 Doesn't benefit     2   0.2
## 19        24 Doesn't benefit     4   0.4
## 20        25 Doesn't benefit     3   0.3

Exercise 6

The distribution of n=10 is pretty sparce. The peak of the distribution is at 0.2, but I don’t think the sample size is large enough to produce a normal distribution. Comparing the distributions between n=50 and n=100 are actually extremely similar. The mean, spread, and shape are close.

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

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


sample_reps100 <- global_monitor %>%
                    rep_sample_n(size = 100, reps = 5000, replace = TRUE) %>%
                    count(scientist_work) %>%
                    mutate(p_hat = n /sum(n)) %>%
                    filter(scientist_work == "Doesn't benefit")
ggplot(data = sample_reps10, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.02)

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

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

### Exercise 7

Using this sample my best estimate of the proportion would be 0.8. Which lines up with the actual population, but I just got lucky :)

samp_15 <- global_monitor %>%
  sample_n(15)

samp_15 %>%
  count(scientist_work) %>%
  mutate(sample_p = n /sum(n))
## # A tibble: 2 x 3
##   scientist_work      n sample_p
## * <chr>           <int>    <dbl>
## 1 Benefits           12      0.8
## 2 Doesn't benefit     3      0.2

Exercise 8

The distribution looks kind of normal, but is pretty sparse due to the sample size being pretty small. Based on the distribution of “sample_props15” I would say the sample proportion’s mean is around 0.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")

ggplot(data = sample_props15, aes(x = p_hat)) +
  geom_histogram(binwidth = 0.05)

Exercise 9

Changing the sample size to 150 makes the distribution look much better, and much closer to normal. The peak is around 0.8 which matches with the population proportion.

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")

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

Exercise 10

The collections of samples with n=150 has the smaller spread. I would choose the sample with a large size and smaller spread to represent the true population.

LS0tCnRpdGxlOiAiTGFiIE5hbWUiCmF1dGhvcjogIkpvcmRhbiBHbGVuZHJhbmdlIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0Ci0tLQoKYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkob3BlbmludHJvKQpsaWJyYXJ5KGluZmVyKQpgYGAKCiMjIyBFeGVyY2lzZSAxCgpgYGB7ciBjb2RlLWNodW5rLWxhYmVsfQpnbG9iYWxfbW9uaXRvciA8LSB0aWJibGUoCiAgc2NpZW50aXN0X3dvcmsgPSBjKHJlcCgiQmVuZWZpdHMiLCA4MDAwMCksIHJlcCgiRG9lc24ndCBiZW5lZml0IiwgMjAwMDApKQopCgpnZ3Bsb3QoZ2xvYmFsX21vbml0b3IsIGFlcyh4ID0gc2NpZW50aXN0X3dvcmspKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicygKICAgIHggPSAiIiwgeSA9ICIiLAogICAgdGl0bGUgPSAiRG8geW91IGJlbGlldmUgdGhhdCB0aGUgd29yayBzY2llbnRpc3RzIGRvIGJlbmVmaXQgcGVvcGxlIGxpa2UgeW91PyIKICApICsKICBjb29yZF9mbGlwKCkgCmBgYAoKSW4gb3VyIGZpcnN0IHNhbXBsZSBvZiBzaXplIDUwIHRoZSBkaXN0cmlidXRpb24gaXMgZGlmZmVyZW50IGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uLiBUaGUgcHJvcG9ydGlvbiBpbiB0aGUgc2FtcGxlIGlzIDg2JSAiQmVuZWZpdHMiIGFuZCAxNCUgIkRvZXNuJ3QgQmVuZWZpdCIsIGNvbXBhcmVkIHRvIDgwLzIwIGluIHRoZSBwb3B1bGF0aW9uLiBXZSBleHBlY3QgdGhlIHNhbXBsZSB0byBub3QgbGluZSB1cCBkaXJlY3RseSB3aXRoIHRoZSBwb3B1bGF0aW9uLCBob3dldmVyIGl0J3MgcHJldHR5IGNsb3NlLgoKYGBge3J9CnNldC5zZWVkKDEwMDAwMCkKCnNhbXAxIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIHNhbXBsZV9uKDUwKQoKCmdncGxvdChzYW1wMSwgYWVzKHggPSBzY2llbnRpc3Rfd29yaykpICsKICBnZW9tX2JhcigpICsKICBsYWJzKAogICAgeCA9ICIiLCB5ID0gIiIsCiAgICB0aXRsZSA9ICJEbyB5b3UgYmVsaWV2ZSB0aGF0IHRoZSB3b3JrIHNjaWVudGlzdHMgZG8gYmVuZWZpdCBwZW9wbGUgbGlrZSB5b3U/IgogICkgKwogIGNvb3JkX2ZsaXAoKSAKYGBgCmBgYHtyfQpzYW1wMSAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHNhbXBsZV9wID0gbiAvc3VtKG4pKQpgYGAKCiMjIyBFeGVyY2lzZSAyCgpJIHdvdWxkIHN1c3BlY3QgYW5vdGhlciBzdHVkZW50cyBzYW1wbGUgd291bGQgbm90IG1hdGNoIHVwIHdpdGggbWluZS4gU2luY2UgSSBkbyBub3QgaGF2ZSBhbm90aGVyIHN0dWRlbnQgdG8gYXNrLCBJIHJ1biBteSBzYW1wbGUgbXVsdGlwbGUgdGltZXMgYW5kIG5ldmVyIGdvdCB0aGUgc2FtZSByZXN1bHQuIFNvIHRoZSBwcm9wb3J0aW9uIHdvdWxkIGJlIGRpZmZlcmVudCwgYnV0IG9ubHkgc29tZXdoYXQgZGlmZmVyZW50LiBTaW5jZSB0aGUgcHJvcG9ydGlvbnMgSSB3YXMgZ2VuZXJhdGluZyB3ZSBhbGwgZmFpcmx5IGNsb3NlIHRvIHRoZSA4MC8yMCBzcGxpdC4KCiMjIyBFeGVyY2lzZSAzCgpTYW1wbGUgMiBoYXMgZGlmZmVyZW50IHByb3BvcnRpb25zIGNvbXBhcmVkIHRvIG15IGZpcnN0IHNhbXBsZS4gCgpgYGB7cn0Kc2FtcDIgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgc2FtcGxlX24oNTApCgpzYW1wMiAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHNhbXBsZV9wID0gbiAvc3VtKG4pKQpgYGAKClRoZSBtb3JlIEkgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoZSBjbG9zZXIgdGhlIHNhbXBsZSBwcm9wb3J0aW9uIGdldHMgdGhlIHRoZSBhY3R1YWwgcG9wdWxhdGlvbi4gU2FtcGxlIDQsIHdpdGggYSBzaXplIG9mIDEsMDAwLCBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBwb3B1bGF0aW9uLgoKYGBge3J9CnNhbXAzIDwtIGdsb2JhbF9tb25pdG9yICU+JQogIHNhbXBsZV9uKDEwMCkKCnNhbXAzICU+JQogIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUKICBtdXRhdGUoc2FtcGxlX3AgPSBuIC9zdW0obikpCmBgYAoKYGBge3J9CnNhbXA0IDwtIGdsb2JhbF9tb25pdG9yICU+JQogIHNhbXBsZV9uKDEwMDApCgpzYW1wNCAlPiUKICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgbXV0YXRlKHNhbXBsZV9wID0gbiAvc3VtKG4pKQpgYGAKCiMjIyBFeGVyY2lzZSA0CgpUaGUgY29kZSBpcyB0YWtpbmcgMTUsMDAwIHNhbXBsZXMgb2Ygc2l6ZSA1MC4gVGhlbiBjYWxjdWxhdGluZyB0aGUgcHJvcG9ydGlvbnMgYW5kIGZpbHRlcmluZyB0byB0aGUgIkRvZXNuJ3QgYmVuZWZpdCIgcmVzdWx0cy4gUGxvdHRpbmcgdGhlIHByb3BvcnRpb25zIGluIGEgaGlzdG9ncmFtIHNob3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcm91bmQgMC4yLCB3aGljaCB3ZSBrbm93IGlzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uLgoKYGBge3J9CnNhbXBsZV9wcm9wczUwIDwtIGdsb2JhbF9tb25pdG9yICU+JQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gNTAsIHJlcHMgPSAxNTAwMCwgcmVwbGFjZSA9IFRSVUUpICU+JQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiRG9lc24ndCBiZW5lZml0IikKCgpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9wcm9wczUwLCBhZXMoeCA9IHBfaGF0KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikgKwogIGxhYnMoCiAgICB4ID0gInBfaGF0IChEb2Vzbid0IGJlbmVmaXQpIiwKICAgIHRpdGxlID0gIlNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBwX2hhdCIsCiAgICBzdWJ0aXRsZSA9ICJTYW1wbGUgc2l6ZSA9IDUwLCBOdW1iZXIgb2Ygc2FtcGxlcyA9IDE1MDAwIgogICkKCmBgYAoKIyMjIEV4ZXJjaXNlIDUKCkluIHRoaXMgY2FzZSB0aGVyZSBhcmUgMjIgb2JzZXJ2YXRpb25zIHdoZW4gSSBmaWx0ZXIgdGhlIGRhdGFmcmFtZSB0byAiRG9lc24ndCBCZW5lZml0IiBhbnN3ZXJzIG9ubHkuIFNpbmNlIHRoZSBzYW1wbGUgc2l6ZSBpcyBvbmx5IDEwIHRoZXJlIGFyZSBhIGZldyBzYW1wbGVzIHRoYXQgaGF2ZSAwICJEb2Vzbid0IEJlbmVmaXQiIGFuc3dlcnMuIEVhY2ggb2JzZXJ2YXRpb24gaW4gdGhlIGRhdGFmcmFtZSByZXByZXNlbnRzIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBzYW1wbGUgdGhhdCBhbnN3ZXJlZCAiRG9lc24ndCBCZW5lZml0Ii4KCmBgYHtyfQpzYW1wbGVfcHJvcHNfc21hbGwgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxMCwgcmVwcyA9IDI1LCByZXBsYWNlID0gVFJVRSkgJT4lCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQoKcHJpbnQoc2FtcGxlX3Byb3BzX3NtYWxsKQpgYGAKCiMjIyBFeGVyY2lzZSA2CgpUaGUgZGlzdHJpYnV0aW9uIG9mIG49MTAgaXMgcHJldHR5IHNwYXJjZS4gVGhlIHBlYWsgb2YgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhdCAwLjIsIGJ1dCBJIGRvbid0IHRoaW5rIHRoZSBzYW1wbGUgc2l6ZSBpcyBsYXJnZSBlbm91Z2ggdG8gcHJvZHVjZSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIENvbXBhcmluZyB0aGUgZGlzdHJpYnV0aW9ucyBiZXR3ZWVuIG49NTAgYW5kIG49MTAwIGFyZSBhY3R1YWxseSBleHRyZW1lbHkgc2ltaWxhci4gVGhlIG1lYW4sIHNwcmVhZCwgYW5kIHNoYXBlIGFyZSBjbG9zZS4gCgpgYGB7cn0Kc2FtcGxlX3JlcHMxMCA8LSBnbG9iYWxfbW9uaXRvciAlPiUKICAgICAgICAgICAgICAgICAgICByZXBfc2FtcGxlX24oc2l6ZSA9IDEwLCByZXBzID0gNTAwMCwgcmVwbGFjZSA9IFRSVUUpICU+JQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiRG9lc24ndCBiZW5lZml0IikKCnNhbXBsZV9yZXBzNTAgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSA1MCwgcmVwcyA9IDUwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUKICAgICAgICAgICAgICAgICAgICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkRvZXNuJ3QgYmVuZWZpdCIpCgoKc2FtcGxlX3JlcHMxMDAgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxMDAsIHJlcHMgPSA1MDAwLCByZXBsYWNlID0gVFJVRSkgJT4lCiAgICAgICAgICAgICAgICAgICAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogICAgICAgICAgICAgICAgICAgIG11dGF0ZShwX2hhdCA9IG4gL3N1bShuKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHNjaWVudGlzdF93b3JrID09ICJEb2Vzbid0IGJlbmVmaXQiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9yZXBzMTAsIGFlcyh4ID0gcF9oYXQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9yZXBzNTAsIGFlcyh4ID0gcF9oYXQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHNhbXBsZV9yZXBzMTAwLCBhZXMoeCA9IHBfaGF0KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4wMikKYGBgCiMjIyBFeGVyY2lzZSA3CgpVc2luZyB0aGlzIHNhbXBsZSBteSBiZXN0IGVzdGltYXRlIG9mIHRoZSBwcm9wb3J0aW9uIHdvdWxkIGJlIDAuOC4gV2hpY2ggbGluZXMgdXAgd2l0aCB0aGUgYWN0dWFsIHBvcHVsYXRpb24sIGJ1dCBJIGp1c3QgZ290IGx1Y2t5IDopCgpgYGB7cn0Kc2FtcF8xNSA8LSBnbG9iYWxfbW9uaXRvciAlPiUKICBzYW1wbGVfbigxNSkKCnNhbXBfMTUgJT4lCiAgY291bnQoc2NpZW50aXN0X3dvcmspICU+JQogIG11dGF0ZShzYW1wbGVfcCA9IG4gL3N1bShuKSkKYGBgCgojIyMgRXhlcmNpc2UgOAoKVGhlIGRpc3RyaWJ1dGlvbiBsb29rcyBraW5kIG9mIG5vcm1hbCwgYnV0IGlzIHByZXR0eSBzcGFyc2UgZHVlIHRvIHRoZSBzYW1wbGUgc2l6ZSBiZWluZyBwcmV0dHkgc21hbGwuIEJhc2VkIG9uIHRoZSBkaXN0cmlidXRpb24gb2YgInNhbXBsZV9wcm9wczE1IiBJIHdvdWxkIHNheSB0aGUgc2FtcGxlIHByb3BvcnRpb24ncyBtZWFuIGlzIGFyb3VuZCAwLjguCgpgYGB7cn0Kc2FtcGxlX3Byb3BzMTUgPC0gZ2xvYmFsX21vbml0b3IgJT4lCiAgICAgICAgICAgICAgICAgICAgcmVwX3NhbXBsZV9uKHNpemUgPSAxNSwgcmVwcyA9IDIwMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUKICAgICAgICAgICAgICAgICAgICBjb3VudChzY2llbnRpc3Rfd29yaykgJT4lCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHBfaGF0ID0gbiAvc3VtKG4pKSAlPiUKICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc2NpZW50aXN0X3dvcmsgPT0gIkJlbmVmaXRzIikKCmdncGxvdChkYXRhID0gc2FtcGxlX3Byb3BzMTUsIGFlcyh4ID0gcF9oYXQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjA1KQpgYGAKCgojIyMgRXhlcmNpc2UgOQoKQ2hhbmdpbmcgdGhlIHNhbXBsZSBzaXplIHRvIDE1MCBtYWtlcyB0aGUgZGlzdHJpYnV0aW9uIGxvb2sgbXVjaCBiZXR0ZXIsIGFuZCBtdWNoIGNsb3NlciB0byBub3JtYWwuIFRoZSBwZWFrIGlzIGFyb3VuZCAwLjggd2hpY2ggbWF0Y2hlcyB3aXRoIHRoZSBwb3B1bGF0aW9uIHByb3BvcnRpb24uCgpgYGB7cn0Kc2FtcGxlX3Byb3BzMTUwIDwtIGdsb2JhbF9tb25pdG9yICU+JQogICAgICAgICAgICAgICAgICAgIHJlcF9zYW1wbGVfbihzaXplID0gMTUwLCByZXBzID0gMjAwMCwgcmVwbGFjZSA9IFRSVUUpICU+JQogICAgICAgICAgICAgICAgICAgIGNvdW50KHNjaWVudGlzdF93b3JrKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdXRhdGUocF9oYXQgPSBuIC9zdW0obikpICU+JQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihzY2llbnRpc3Rfd29yayA9PSAiQmVuZWZpdHMiKQoKZ2dwbG90KGRhdGEgPSBzYW1wbGVfcHJvcHMxNTAsIGFlcyh4ID0gcF9oYXQpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAwLjAyKQpgYGAKCiMjIyBFeGVyY2lzZSAxMAoKVGhlIGNvbGxlY3Rpb25zIG9mIHNhbXBsZXMgd2l0aCBuPTE1MCBoYXMgdGhlIHNtYWxsZXIgc3ByZWFkLiBJIHdvdWxkIGNob29zZSB0aGUgc2FtcGxlIHdpdGggYSBsYXJnZSBzaXplIGFuZCBzbWFsbGVyIHNwcmVhZCB0byByZXByZXNlbnQgdGhlIHRydWUgcG9wdWxhdGlvbi4gCg==