library(tidyverse)
library(openintro)
library(infer)
library(skimr)
## Warning: package 'skimr' was built under R version 4.0.3
library(ggplot2)

Exercise 1

What are the cases in this data set? How many cases are there in our sample?

# Insert code for Exercise 1 here
data(yrbss)
?yrbss
## starting httpd help server ... done
glimpse(yrbss)
## Rows: 13,583
## Columns: 13
## $ age                      <int> 14, 14, 15, 15, 15, 15, 15, 14, 15, 15, 15...
## $ gender                   <chr> "female", "female", "female", "female", "f...
## $ grade                    <chr> "9", "9", "9", "9", "9", "9", "9", "9", "9...
## $ hispanic                 <chr> "not", "not", "hispanic", "not", "not", "n...
## $ race                     <chr> "Black or African American", "Black or Afr...
## $ height                   <dbl> NA, NA, 1.73, 1.60, 1.50, 1.57, 1.65, 1.88...
## $ weight                   <dbl> NA, NA, 84.37, 55.79, 46.72, 67.13, 131.54...
## $ helmet_12m               <chr> "never", "never", "never", "never", "did n...
## $ text_while_driving_30d   <chr> "0", NA, "30", "0", "did not drive", "did ...
## $ physically_active_7d     <int> 4, 2, 7, 0, 2, 1, 4, 4, 5, 0, 0, 0, 4, 7, ...
## $ hours_tv_per_school_day  <chr> "5+", "5+", "5+", "2", "3", "5+", "5+", "5...
## $ strength_training_7d     <int> 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 3, 0, 0, 7, ...
## $ school_night_hours_sleep <chr> "8", "6", "<5", "6", "9", "8", "9", "6", "...
yrbss %>% 
  skim()
Data summary
Name Piped data
Number of rows 13583
Number of columns 13
_______________________
Column type frequency:
character 8
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
gender 12 1.00 4 6 0 2 0
grade 79 0.99 1 5 0 5 0
hispanic 231 0.98 3 8 0 2 0
race 2805 0.79 5 41 0 5 0
helmet_12m 311 0.98 5 12 0 6 0
text_while_driving_30d 918 0.93 1 13 0 8 0
hours_tv_per_school_day 338 0.98 1 12 0 7 0
school_night_hours_sleep 1248 0.91 1 3 0 7 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
age 77 0.99 16.16 1.26 12.00 15.00 16.00 17.00 18.00 ▁▂▅▅▇
height 1004 0.93 1.69 0.10 1.27 1.60 1.68 1.78 2.11 ▁▅▇▃▁
weight 1004 0.93 67.91 16.90 29.94 56.25 64.41 76.20 180.99 ▆▇▂▁▁
physically_active_7d 273 0.98 3.90 2.56 0.00 2.00 4.00 7.00 7.00 ▆▂▅▃▇
strength_training_7d 1176 0.91 2.95 2.58 0.00 0.00 3.00 5.00 7.00 ▇▂▅▂▅

There are 13 columns in the sample. These cases include age,gender,grade, hispanic or not, height, race, weight, if they wear a helmet while biking, if they text while driving, if they are physically active, how many hours they watch TV per night, if they weight lift and how many hours they typically get per night. There are 13,583 rows/cases in the data set.

Exercise 2

How many observations are we missing weights from?

# Insert code for Exercise 2 here
data(yrbss)
?yrbss
glimpse(yrbss)
## Rows: 13,583
## Columns: 13
## $ age                      <int> 14, 14, 15, 15, 15, 15, 15, 14, 15, 15, 15...
## $ gender                   <chr> "female", "female", "female", "female", "f...
## $ grade                    <chr> "9", "9", "9", "9", "9", "9", "9", "9", "9...
## $ hispanic                 <chr> "not", "not", "hispanic", "not", "not", "n...
## $ race                     <chr> "Black or African American", "Black or Afr...
## $ height                   <dbl> NA, NA, 1.73, 1.60, 1.50, 1.57, 1.65, 1.88...
## $ weight                   <dbl> NA, NA, 84.37, 55.79, 46.72, 67.13, 131.54...
## $ helmet_12m               <chr> "never", "never", "never", "never", "did n...
## $ text_while_driving_30d   <chr> "0", NA, "30", "0", "did not drive", "did ...
## $ physically_active_7d     <int> 4, 2, 7, 0, 2, 1, 4, 4, 5, 0, 0, 0, 4, 7, ...
## $ hours_tv_per_school_day  <chr> "5+", "5+", "5+", "2", "3", "5+", "5+", "5...
## $ strength_training_7d     <int> 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 3, 0, 0, 7, ...
## $ school_night_hours_sleep <chr> "8", "6", "<5", "6", "9", "8", "9", "6", "...
yrbss %>% 
  skim()
Data summary
Name Piped data
Number of rows 13583
Number of columns 13
_______________________
Column type frequency:
character 8
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
gender 12 1.00 4 6 0 2 0
grade 79 0.99 1 5 0 5 0
hispanic 231 0.98 3 8 0 2 0
race 2805 0.79 5 41 0 5 0
helmet_12m 311 0.98 5 12 0 6 0
text_while_driving_30d 918 0.93 1 13 0 8 0
hours_tv_per_school_day 338 0.98 1 12 0 7 0
school_night_hours_sleep 1248 0.91 1 3 0 7 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
age 77 0.99 16.16 1.26 12.00 15.00 16.00 17.00 18.00 ▁▂▅▅▇
height 1004 0.93 1.69 0.10 1.27 1.60 1.68 1.78 2.11 ▁▅▇▃▁
weight 1004 0.93 67.91 16.90 29.94 56.25 64.41 76.20 180.99 ▆▇▂▁▁
physically_active_7d 273 0.98 3.90 2.56 0.00 2.00 4.00 7.00 7.00 ▆▂▅▃▇
strength_training_7d 1176 0.91 2.95 2.58 0.00 0.00 3.00 5.00 7.00 ▇▂▅▂▅
data(yrbss)
sum(is.na(yrbss))
## [1] 9476

We are missing 1004 observations related to weight using skim().

Exercise 3

Make a side-by-side violin plots of physical_3plus and weight. Is there a relationship between these two variables? What did you expect and why?

# Insert code for Exercise 3 here
yrbss2 <- yrbss %>% 
  mutate(physical_3plus = ifelse(yrbss$physically_active_7d >= 3, "yes", "no")) %>%
  na.exclude()
ggplot(yrbss2, aes(x=weight, y=physical_3plus)) + geom_violin()

It seems as though the people who were active more actually weigh more on average than those who are less active.I would expect it to be the other way around as if you are active you tend to be skinnier/weigh less. However, it might make sense as you would have more muscle and muscle weighs more than fat.

Exercise 4

Are all conditions necessary for inference satisfied? Comment on each. You can compute the group sizes with the summarize command above by defining a new variable with the definition n().

# Insert code for Exercise 4 here
yrbss <- yrbss %>% 
  mutate(physical_3plus = if_else(physically_active_7d > 2, "yes", "no"))
yrbss %>% 
  group_by(physical_3plus) %>% 
  summarise(freq = table(weight)) %>%
  summarise(n = sum(freq))
## `summarise()` regrouping output by 'physical_3plus' (override with `.groups` argument)
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   physical_3plus     n
##   <chr>          <int>
## 1 no              4022
## 2 yes             8342
## 3 <NA>             215

The data does seem to be random and the results seem to be independent of each other.The sample size is also large enough that it probably has approximately normal distribution although there are long right tails as indicated by the violin plots.

Exercise 5

Write the hypotheses for testing if the average weights are different for those who exercise at least times a week and those who don’t.

# Insert code for Exercise 5 here
obs_diff <- yrbss %>%
  specify(weight ~ physical_3plus) %>%
  calculate(stat = "diff in means", order = c("yes", "no"))
## Warning: Removed 1219 rows containing missing values.
null_dist <- yrbss %>%
  specify(weight ~ physical_3plus) %>%
  hypothesize(null = "independence") %>%
  generate(reps = 1000, type = "permute") %>%
  calculate(stat = "diff in means", order = c("yes", "no"))
## Warning: Removed 1219 rows containing missing values.

H0: Students who are physically active 3 or more days per week will have the same average weight as students who are not physically active 3 or more days a week

HA: Students who are physically active 3 or more days per week have a different average weight than those who are not physically active 3 or more days a week.

Exercise 6

Add a vertical red line to the plot above, demonstrating where the observed difference in means (obs_diff) falls on the distribution.

# Insert code for Exercise 6 here
yrbss <- yrbss %>% 
  mutate(physical_3plus = if_else(physically_active_7d > 2, "yes", "no"))
yrbss %>%
  group_by(physical_3plus) %>%
  summarise(mean_weight = mean(weight, na.rm = TRUE))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   physical_3plus mean_weight
##   <chr>                <dbl>
## 1 no                    66.7
## 2 yes                   68.4
## 3 <NA>                  69.9
obs_diff <- yrbss %>%
  specify(weight ~ physical_3plus) %>%
  calculate(stat = "diff in means", order = c("yes", "no"))
## Warning: Removed 1219 rows containing missing values.
null_dist <- yrbss %>%
  specify(weight ~ physical_3plus) %>%
  hypothesize(null = "independence") %>%
  generate(reps = 1000, type = "permute") %>%
  calculate(stat = "diff in means", order = c("yes", "no"))
## Warning: Removed 1219 rows containing missing values.
data(yrbss)
ggplot(data = null_dist, aes(x = stat)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

visualize(null_dist) + 
  shade_p_value(obs_stat = obs_diff, direction = "two_sided")

Exercise 10

Calculate a 95% confidence interval for the average height in meters (height) and interpret it in context

# Insert code for Exercise 10 here 

t.test(yrbss$height, mu = mean(yrbss$height, na.rm = TRUE), conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  yrbss$height
## t = 0, df = 12578, p-value = 1
## alternative hypothesis: true mean is not equal to 1.691241
## 95 percent confidence interval:
##  1.689411 1.693071
## sample estimates:
## mean of x 
##  1.691241

We are 95% confident that the average height for the entire population is between 1.689411 and 1.693071 meters.

Exercise 11

Calculate a new confidence interval for the same parameter at the 90% confidence level. Comment on the width of this interval versus the one obtained in the previous exercise.

# Insert code for Exercise 11 here 
t.test(yrbss$height, mu = mean(yrbss$height, na.rm = TRUE), conf.level = 0.9)
## 
##  One Sample t-test
## 
## data:  yrbss$height
## t = 0, df = 12578, p-value = 1
## alternative hypothesis: true mean is not equal to 1.691241
## 90 percent confidence interval:
##  1.689705 1.692777
## sample estimates:
## mean of x 
##  1.691241

We are 90% confident that the average height for the entire population is between 1.689705 and 1.692777 meters. The width of the confidence interval gets larger if the confidence level increases.

Exercise 12

Conduct a hypothesis test evaluating whether the average height is different for those who exercise at least three times a week and those who don’t.

# Insert code for Exercise 12 here 

yrbss$physical_3plus <-ifelse(yrbss$physically_active_7d >= 3, "yes", "no")
t.test(height ~ physical_3plus, data = yrbss)
## 
##  Welch Two Sample t-test
## 
## data:  height by physical_3plus
## t = -19.029, df = 7973.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.04150183 -0.03374994
## sample estimates:
##  mean in group no mean in group yes 
##          1.665587          1.703213

Null: The average height is not different for those who exercise at least three times a week Alternative: The average height is different for those who exercise at least three times a week We reject the null hypothesis as the p value is very small; p value < 0.05.

Exercise 13

Now, a non-inference task: Determine the number of different options there are in the dataset for the hours_tv_per_school_day there are.

# Insert code for Exercise 13 here 
table(yrbss$hours_tv_per_school_day)
## 
##           <1            1            2            3            4           5+ 
##         2168         1750         2705         2139         1048         1595 
## do not watch 
##         1840

There are seven options.

Exercise 14

Come up with a research question evaluating the relationship between height or weight and sleep. Formulate the question in a way that it can be answered using a hypothesis test and/or a confidence interval. Report the statistical results, and also provide an explanation in plain language. Be sure to check all assumptions, state your α level, and conclude in context.

# Insert code for Exercise 14 here 

yrbss1<-yrbss %>%
  
mutate(school_night_hours_sleep1 = case_when(
school_night_hours_sleep == "<5" ~ "4",
school_night_hours_sleep == "5" ~ "5",
school_night_hours_sleep == "6" ~ "6",
school_night_hours_sleep == "7" ~ "7",
school_night_hours_sleep == "8" ~ "8",
school_night_hours_sleep == "9" ~ "9",
school_night_hours_sleep == "10+" ~ "10",
TRUE ~ "NA"))

yrbss1$school_night_hours_sleep1<-as.numeric(yrbss1$school_night_hours_sleep1)
## Warning: NAs introduced by coercion
summary(lm(weight ~ school_night_hours_sleep1, data= yrbss1))
## 
## Call:
## lm(formula = weight ~ school_night_hours_sleep1, data = yrbss1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -37.806 -12.032  -3.175   8.251 111.637 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                71.4964     0.7764  92.091  < 2e-16 ***
## school_night_hours_sleep1  -0.5357     0.1130  -4.741 2.16e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.95 on 11479 degrees of freedom
##   (2102 observations deleted due to missingness)
## Multiple R-squared:  0.001954,   Adjusted R-squared:  0.001867 
## F-statistic: 22.47 on 1 and 11479 DF,  p-value: 2.157e-06
summary(lm(height ~ school_night_hours_sleep1, data= yrbss1))
## 
## Call:
## lm(formula = height ~ school_night_hours_sleep1, data = yrbss1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.42185 -0.08920 -0.00831  0.08727  0.42169 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)               1.6847801  0.0047919 351.590   <2e-16 ***
## school_night_hours_sleep1 0.0008833  0.0006975   1.266    0.205    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1046 on 11479 degrees of freedom
##   (2102 observations deleted due to missingness)
## Multiple R-squared:  0.0001397,  Adjusted R-squared:  5.259e-05 
## F-statistic: 1.604 on 1 and 11479 DF,  p-value: 0.2054

The data is random and large enough. The α level is 0.05.

My research question is does the amount of hours you sleep per night affect your weight?

HO: The student’s weight is not dependent on the amount of hours they sleep per night. HA: The student’s weight is dependent on the amount of hours they sleep per night.

Based on the p value of 2.157e-06, we would reject the null hypothesis as it is < 0.05 which is our α level. We can conclude that weight is dependent on the amount of hours the student sleeps per night. With a slope of -0.5357, this means that for every one additional hour of sleep a student gets each night, on average they weigh .54 kg less. The more sleep a student gets the less that they weigh.

LS0tDQp0aXRsZTogIkxhYiA3OiBJbmZlcmVuY2UgRm9yIE51bWVyaWNhbCBEYXRhIChOTyA3LTkpIg0KYXV0aG9yOiAiVGVyZXNhIERvbGV5Ig0KZGF0ZTogImByIFN5cy5EYXRlKDEwLzI2LzIwKSINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpsaWJyYXJ5KGluZmVyKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpXaGF0IGFyZSB0aGUgY2FzZXMgaW4gdGhpcyBkYXRhIHNldD8gSG93IG1hbnkgY2FzZXMgYXJlIHRoZXJlIGluIG91ciBzYW1wbGU/DQoNCg0KYGBge3Igdmlldy1naXJscy1jb3VudHN9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxIGhlcmUNCmRhdGEoeXJic3MpDQo/eXJic3MNCmdsaW1wc2UoeXJic3MpDQp5cmJzcyAlPiUgDQogIHNraW0oKQ0KYGBgDQoNCg0KVGhlcmUgYXJlIDEzIGNvbHVtbnMgaW4gdGhlIHNhbXBsZS4gVGhlc2UgY2FzZXMgaW5jbHVkZSBhZ2UsZ2VuZGVyLGdyYWRlLCBoaXNwYW5pYyBvciBub3QsIGhlaWdodCwgcmFjZSwgd2VpZ2h0LCBpZiB0aGV5IHdlYXIgYSBoZWxtZXQgd2hpbGUgYmlraW5nLCBpZiB0aGV5IHRleHQgd2hpbGUgZHJpdmluZywgaWYgdGhleSBhcmUgcGh5c2ljYWxseSBhY3RpdmUsIGhvdyBtYW55IGhvdXJzIHRoZXkgd2F0Y2ggVFYgcGVyIG5pZ2h0LCBpZiB0aGV5IHdlaWdodCBsaWZ0IGFuZCBob3cgbWFueSBob3VycyB0aGV5IHR5cGljYWxseSBnZXQgcGVyIG5pZ2h0Lg0KVGhlcmUgYXJlIDEzLDU4MyByb3dzL2Nhc2VzIGluIHRoZSBkYXRhIHNldC4NCg0KIyMjIEV4ZXJjaXNlIDINCg0KSG93IG1hbnkgb2JzZXJ2YXRpb25zIGFyZSB3ZSBtaXNzaW5nIHdlaWdodHMgZnJvbT8NCg0KYGBge3IgdHJlbmQtZ2lybHN9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAyIGhlcmUNCmRhdGEoeXJic3MpDQo/eXJic3MNCmdsaW1wc2UoeXJic3MpDQp5cmJzcyAlPiUgDQogIHNraW0oKQ0KZGF0YSh5cmJzcykNCnN1bShpcy5uYSh5cmJzcykpDQpgYGANCg0KV2UgYXJlIG1pc3NpbmcgMTAwNCBvYnNlcnZhdGlvbnMgcmVsYXRlZCB0byB3ZWlnaHQgdXNpbmcgc2tpbSgpLiANCg0KIyMjIEV4ZXJjaXNlIDMNCg0KTWFrZSBhIHNpZGUtYnktc2lkZSB2aW9saW4gcGxvdHMgb2YgcGh5c2ljYWxfM3BsdXMgYW5kIHdlaWdodC4gSXMgdGhlcmUgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzPyBXaGF0IGRpZCB5b3UgZXhwZWN0IGFuZCB3aHk/DQoNCg0KYGBge3IgcGxvdC1wcm9wLWJveXMtYXJidXRobm90fQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgMyBoZXJlDQp5cmJzczIgPC0geXJic3MgJT4lIA0KICBtdXRhdGUocGh5c2ljYWxfM3BsdXMgPSBpZmVsc2UoeXJic3MkcGh5c2ljYWxseV9hY3RpdmVfN2QgPj0gMywgInllcyIsICJubyIpKSAlPiUNCiAgbmEuZXhjbHVkZSgpDQpnZ3Bsb3QoeXJic3MyLCBhZXMoeD13ZWlnaHQsIHk9cGh5c2ljYWxfM3BsdXMpKSArIGdlb21fdmlvbGluKCkNCg0KDQpgYGANCg0KSXQgc2VlbXMgYXMgdGhvdWdoIHRoZSBwZW9wbGUgd2hvIHdlcmUgYWN0aXZlIG1vcmUgYWN0dWFsbHkgd2VpZ2ggbW9yZSBvbiBhdmVyYWdlIHRoYW4gdGhvc2Ugd2hvIGFyZSBsZXNzIGFjdGl2ZS5JIHdvdWxkIGV4cGVjdCBpdCB0byBiZSB0aGUgb3RoZXIgd2F5IGFyb3VuZCBhcyBpZiB5b3UgYXJlIGFjdGl2ZSB5b3UgdGVuZCB0byBiZSBza2lubmllci93ZWlnaCBsZXNzLiBIb3dldmVyLCBpdCBtaWdodCBtYWtlIHNlbnNlIGFzIHlvdSB3b3VsZCBoYXZlIG1vcmUgbXVzY2xlIGFuZCBtdXNjbGUgd2VpZ2hzIG1vcmUgdGhhbiBmYXQuDQoNCiMjIyBFeGVyY2lzZSA0DQoNCkFyZSBhbGwgY29uZGl0aW9ucyBuZWNlc3NhcnkgZm9yIGluZmVyZW5jZSBzYXRpc2ZpZWQ/IENvbW1lbnQgb24gZWFjaC4gWW91IGNhbiBjb21wdXRlIHRoZSBncm91cCBzaXplcyB3aXRoIHRoZSBzdW1tYXJpemUgY29tbWFuZCBhYm92ZSBieSBkZWZpbmluZyBhIG5ldyB2YXJpYWJsZSB3aXRoIHRoZSBkZWZpbml0aW9uIG4oKS4NCg0KYGBge3IgZGltLXByZXNlbnR9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA0IGhlcmUNCnlyYnNzIDwtIHlyYnNzICU+JSANCiAgbXV0YXRlKHBoeXNpY2FsXzNwbHVzID0gaWZfZWxzZShwaHlzaWNhbGx5X2FjdGl2ZV83ZCA+IDIsICJ5ZXMiLCAibm8iKSkNCnlyYnNzICU+JSANCiAgZ3JvdXBfYnkocGh5c2ljYWxfM3BsdXMpICU+JSANCiAgc3VtbWFyaXNlKGZyZXEgPSB0YWJsZSh3ZWlnaHQpKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBzdW0oZnJlcSkpDQoNCmBgYA0KDQpUaGUgZGF0YSBkb2VzIHNlZW0gdG8gYmUgcmFuZG9tIGFuZCB0aGUgcmVzdWx0cyBzZWVtIHRvIGJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuVGhlIHNhbXBsZSBzaXplIGlzIGFsc28gbGFyZ2UgZW5vdWdoIHRoYXQgaXQgcHJvYmFibHkgaGFzIGFwcHJveGltYXRlbHkgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhbHRob3VnaCB0aGVyZSBhcmUgbG9uZyByaWdodCB0YWlscyBhcyBpbmRpY2F0ZWQgYnkgdGhlIHZpb2xpbiBwbG90cy4NCg0KDQojIyMgRXhlcmNpc2UgNQ0KDQpXcml0ZSB0aGUgaHlwb3RoZXNlcyBmb3IgdGVzdGluZyBpZiB0aGUgYXZlcmFnZSB3ZWlnaHRzIGFyZSBkaWZmZXJlbnQgZm9yIHRob3NlIHdobyBleGVyY2lzZSBhdCBsZWFzdCB0aW1lcyBhIHdlZWsgYW5kIHRob3NlIHdobyBkb27igJl0Lg0KDQoNCmBgYHtyIGNvdW50LWNvbXBhcmV9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA1IGhlcmUNCm9ic19kaWZmIDwtIHlyYnNzICU+JQ0KICBzcGVjaWZ5KHdlaWdodCB+IHBoeXNpY2FsXzNwbHVzKSAlPiUNCiAgY2FsY3VsYXRlKHN0YXQgPSAiZGlmZiBpbiBtZWFucyIsIG9yZGVyID0gYygieWVzIiwgIm5vIikpDQoNCm51bGxfZGlzdCA8LSB5cmJzcyAlPiUNCiAgc3BlY2lmeSh3ZWlnaHQgfiBwaHlzaWNhbF8zcGx1cykgJT4lDQogIGh5cG90aGVzaXplKG51bGwgPSAiaW5kZXBlbmRlbmNlIikgJT4lDQogIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gInBlcm11dGUiKSAlPiUNCiAgY2FsY3VsYXRlKHN0YXQgPSAiZGlmZiBpbiBtZWFucyIsIG9yZGVyID0gYygieWVzIiwgIm5vIikpDQpgYGANCg0KSDA6IFN0dWRlbnRzIHdobyBhcmUgcGh5c2ljYWxseSBhY3RpdmUgMyBvciBtb3JlIGRheXMgcGVyIHdlZWsgd2lsbCBoYXZlIHRoZSBzYW1lIGF2ZXJhZ2Ugd2VpZ2h0IGFzIHN0dWRlbnRzIHdobyBhcmUgbm90IHBoeXNpY2FsbHkgYWN0aXZlIDMgb3IgbW9yZSBkYXlzIGEgd2Vlaw0KDQpIQTogU3R1ZGVudHMgd2hvIGFyZSBwaHlzaWNhbGx5IGFjdGl2ZSAzIG9yIG1vcmUgZGF5cyBwZXIgd2VlayBoYXZlIGEgZGlmZmVyZW50IGF2ZXJhZ2Ugd2VpZ2h0IHRoYW4gdGhvc2Ugd2hvIGFyZSBub3QgcGh5c2ljYWxseSBhY3RpdmUgMyBvciBtb3JlIGRheXMgYSB3ZWVrLg0KDQojIyMgRXhlcmNpc2UgNiANCg0KQWRkIGEgdmVydGljYWwgcmVkIGxpbmUgdG8gdGhlIHBsb3QgYWJvdmUsIGRlbW9uc3RyYXRpbmcgd2hlcmUgdGhlIG9ic2VydmVkIGRpZmZlcmVuY2UgaW4gbWVhbnMgKG9ic19kaWZmKSBmYWxscyBvbiB0aGUgZGlzdHJpYnV0aW9uLg0KYGBge3IgcGxvdC1wcm9wLWJveXMtcHJlc2VudH0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDYgaGVyZQ0KeXJic3MgPC0geXJic3MgJT4lIA0KICBtdXRhdGUocGh5c2ljYWxfM3BsdXMgPSBpZl9lbHNlKHBoeXNpY2FsbHlfYWN0aXZlXzdkID4gMiwgInllcyIsICJubyIpKQ0KeXJic3MgJT4lDQogIGdyb3VwX2J5KHBoeXNpY2FsXzNwbHVzKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fd2VpZ2h0ID0gbWVhbih3ZWlnaHQsIG5hLnJtID0gVFJVRSkpDQpvYnNfZGlmZiA8LSB5cmJzcyAlPiUNCiAgc3BlY2lmeSh3ZWlnaHQgfiBwaHlzaWNhbF8zcGx1cykgJT4lDQogIGNhbGN1bGF0ZShzdGF0ID0gImRpZmYgaW4gbWVhbnMiLCBvcmRlciA9IGMoInllcyIsICJubyIpKQ0KbnVsbF9kaXN0IDwtIHlyYnNzICU+JQ0KICBzcGVjaWZ5KHdlaWdodCB+IHBoeXNpY2FsXzNwbHVzKSAlPiUNCiAgaHlwb3RoZXNpemUobnVsbCA9ICJpbmRlcGVuZGVuY2UiKSAlPiUNCiAgZ2VuZXJhdGUocmVwcyA9IDEwMDAsIHR5cGUgPSAicGVybXV0ZSIpICU+JQ0KICBjYWxjdWxhdGUoc3RhdCA9ICJkaWZmIGluIG1lYW5zIiwgb3JkZXIgPSBjKCJ5ZXMiLCAibm8iKSkNCmRhdGEoeXJic3MpDQpnZ3Bsb3QoZGF0YSA9IG51bGxfZGlzdCwgYWVzKHggPSBzdGF0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpDQp2aXN1YWxpemUobnVsbF9kaXN0KSArIA0KICBzaGFkZV9wX3ZhbHVlKG9ic19zdGF0ID0gb2JzX2RpZmYsIGRpcmVjdGlvbiA9ICJ0d29fc2lkZWQiKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDEwDQoNCkNhbGN1bGF0ZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgYXZlcmFnZSBoZWlnaHQgaW4gbWV0ZXJzIChoZWlnaHQpIGFuZCBpbnRlcnByZXQgaXQgaW4gY29udGV4dA0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDEwIGhlcmUgDQoNCnQudGVzdCh5cmJzcyRoZWlnaHQsIG11ID0gbWVhbih5cmJzcyRoZWlnaHQsIG5hLnJtID0gVFJVRSksIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQpXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSBhdmVyYWdlIGhlaWdodCBmb3IgdGhlIGVudGlyZSBwb3B1bGF0aW9uIGlzIGJldHdlZW4gMS42ODk0MTEgYW5kIDEuNjkzMDcxIG1ldGVycy4NCg0KIyMjIEV4ZXJjaXNlIDExDQoNCkNhbGN1bGF0ZSBhIG5ldyBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgc2FtZSBwYXJhbWV0ZXIgYXQgdGhlIDkwJSBjb25maWRlbmNlIGxldmVsLiBDb21tZW50IG9uIHRoZSB3aWR0aCBvZiB0aGlzIGludGVydmFsIHZlcnN1cyB0aGUgb25lIG9idGFpbmVkIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZS4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxMSBoZXJlIA0KdC50ZXN0KHlyYnNzJGhlaWdodCwgbXUgPSBtZWFuKHlyYnNzJGhlaWdodCwgbmEucm0gPSBUUlVFKSwgY29uZi5sZXZlbCA9IDAuOSkNCmBgYA0KV2UgYXJlIDkwJSBjb25maWRlbnQgdGhhdCB0aGUgYXZlcmFnZSBoZWlnaHQgZm9yIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiBpcyBiZXR3ZWVuIDEuNjg5NzA1IGFuZCAxLjY5Mjc3NyBtZXRlcnMuIFRoZSB3aWR0aCBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBnZXRzIGxhcmdlciBpZiB0aGUgY29uZmlkZW5jZSBsZXZlbCBpbmNyZWFzZXMuDQoNCiMjIyBFeGVyY2lzZSAxMg0KDQpDb25kdWN0IGEgaHlwb3RoZXNpcyB0ZXN0IGV2YWx1YXRpbmcgd2hldGhlciB0aGUgYXZlcmFnZSBoZWlnaHQgaXMgZGlmZmVyZW50IGZvciB0aG9zZSB3aG8gZXhlcmNpc2UgYXQgbGVhc3QgdGhyZWUgdGltZXMgYSB3ZWVrIGFuZCB0aG9zZSB3aG8gZG9u4oCZdC4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxMiBoZXJlIA0KDQp5cmJzcyRwaHlzaWNhbF8zcGx1cyA8LWlmZWxzZSh5cmJzcyRwaHlzaWNhbGx5X2FjdGl2ZV83ZCA+PSAzLCAieWVzIiwgIm5vIikNCnQudGVzdChoZWlnaHQgfiBwaHlzaWNhbF8zcGx1cywgZGF0YSA9IHlyYnNzKQ0KYGBgDQpOdWxsOiBUaGUgYXZlcmFnZSBoZWlnaHQgaXMgbm90IGRpZmZlcmVudCBmb3IgdGhvc2Ugd2hvIGV4ZXJjaXNlIGF0IGxlYXN0IHRocmVlIHRpbWVzIGEgd2Vlaw0KQWx0ZXJuYXRpdmU6IFRoZSBhdmVyYWdlIGhlaWdodCBpcyBkaWZmZXJlbnQgZm9yIHRob3NlIHdobyBleGVyY2lzZSBhdCBsZWFzdCB0aHJlZSB0aW1lcyBhIHdlZWsNCldlIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGFzIHRoZSBwIHZhbHVlIGlzIHZlcnkgc21hbGw7IHAgdmFsdWUgPCAwLjA1Lg0KDQojIyMgRXhlcmNpc2UgMTMNCg0KTm93LCBhIG5vbi1pbmZlcmVuY2UgdGFzazogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IG9wdGlvbnMgdGhlcmUgYXJlIGluIHRoZSBkYXRhc2V0IGZvciB0aGUgaG91cnNfdHZfcGVyX3NjaG9vbF9kYXkgdGhlcmUgYXJlLg0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDEzIGhlcmUgDQp0YWJsZSh5cmJzcyRob3Vyc190dl9wZXJfc2Nob29sX2RheSkNCg0KYGBgDQpUaGVyZSBhcmUgc2V2ZW4gb3B0aW9ucy4NCg0KIyMjIEV4ZXJjaXNlIDE0DQoNCkNvbWUgdXAgd2l0aCBhIHJlc2VhcmNoIHF1ZXN0aW9uIGV2YWx1YXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGhlaWdodCBvciB3ZWlnaHQgYW5kIHNsZWVwLiBGb3JtdWxhdGUgdGhlIHF1ZXN0aW9uIGluIGEgd2F5IHRoYXQgaXQgY2FuIGJlIGFuc3dlcmVkIHVzaW5nIGEgaHlwb3RoZXNpcyB0ZXN0IGFuZC9vciBhIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFJlcG9ydCB0aGUgc3RhdGlzdGljYWwgcmVzdWx0cywgYW5kIGFsc28gcHJvdmlkZSBhbiBleHBsYW5hdGlvbiBpbiBwbGFpbiBsYW5ndWFnZS4gQmUgc3VyZSB0byBjaGVjayBhbGwgYXNzdW1wdGlvbnMsIHN0YXRlIHlvdXIgzrEgbGV2ZWwsIGFuZCBjb25jbHVkZSBpbiBjb250ZXh0Lg0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDE0IGhlcmUgDQoNCnlyYnNzMTwteXJic3MgJT4lDQogIA0KbXV0YXRlKHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcDEgPSBjYXNlX3doZW4oDQpzY2hvb2xfbmlnaHRfaG91cnNfc2xlZXAgPT0gIjw1IiB+ICI0IiwNCnNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCA9PSAiNSIgfiAiNSIsDQpzY2hvb2xfbmlnaHRfaG91cnNfc2xlZXAgPT0gIjYiIH4gIjYiLA0Kc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwID09ICI3IiB+ICI3IiwNCnNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCA9PSAiOCIgfiAiOCIsDQpzY2hvb2xfbmlnaHRfaG91cnNfc2xlZXAgPT0gIjkiIH4gIjkiLA0Kc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwID09ICIxMCsiIH4gIjEwIiwNClRSVUUgfiAiTkEiKSkNCg0KeXJic3MxJHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcDE8LWFzLm51bWVyaWMoeXJic3MxJHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcDEpDQoNCnN1bW1hcnkobG0od2VpZ2h0IH4gc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwMSwgZGF0YT0geXJic3MxKSkNCnN1bW1hcnkobG0oaGVpZ2h0IH4gc2Nob29sX25pZ2h0X2hvdXJzX3NsZWVwMSwgZGF0YT0geXJic3MxKSkNCmBgYA0KVGhlIGRhdGEgaXMgcmFuZG9tIGFuZCBsYXJnZSBlbm91Z2guIFRoZSDOsSBsZXZlbCBpcyAwLjA1LiANCg0KTXkgcmVzZWFyY2ggcXVlc3Rpb24gaXMgZG9lcyB0aGUgYW1vdW50IG9mIGhvdXJzIHlvdSBzbGVlcCBwZXIgbmlnaHQgYWZmZWN0IHlvdXIgd2VpZ2h0Pw0KDQpITzogVGhlIHN0dWRlbnQncyB3ZWlnaHQgaXMgbm90IGRlcGVuZGVudCBvbiB0aGUgYW1vdW50IG9mIGhvdXJzIHRoZXkgc2xlZXAgcGVyIG5pZ2h0Lg0KSEE6IFRoZSBzdHVkZW50J3Mgd2VpZ2h0IGlzIGRlcGVuZGVudCBvbiB0aGUgYW1vdW50IG9mIGhvdXJzIHRoZXkgc2xlZXAgcGVyIG5pZ2h0Lg0KDQpCYXNlZCBvbiB0aGUgcCB2YWx1ZSBvZiAyLjE1N2UtMDYsIHdlIHdvdWxkIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGFzIGl0IGlzIDwgMC4wNSB3aGljaCBpcyBvdXIgzrEgbGV2ZWwuIA0KV2UgY2FuIGNvbmNsdWRlIHRoYXQgd2VpZ2h0IGlzIGRlcGVuZGVudCBvbiB0aGUgYW1vdW50IG9mIGhvdXJzIHRoZSBzdHVkZW50IHNsZWVwcyBwZXIgbmlnaHQuIFdpdGggYSBzbG9wZSBvZiAtMC41MzU3LCB0aGlzIG1lYW5zIHRoYXQgZm9yIGV2ZXJ5IG9uZSBhZGRpdGlvbmFsIGhvdXIgb2Ygc2xlZXAgYSBzdHVkZW50IGdldHMgZWFjaCBuaWdodCwgb24gYXZlcmFnZSB0aGV5IHdlaWdoIC41NCBrZyBsZXNzLiBUaGUgbW9yZSBzbGVlcCBhIHN0dWRlbnQgZ2V0cyB0aGUgbGVzcyB0aGF0IHRoZXkgd2VpZ2guDQoNCg0KDQo=