library(tidyverse)
library(openintro)
library(mosaic)
library(ggformula)
data("kobe_basket")
glimpse(kobe_basket)
## Rows: 133
## Columns: 6
## $ vs <fct> ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL…
## $ game <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ quarter <fct> 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3…
## $ time <fct> 9:47, 9:07, 8:11, 7:41, 7:03, 6:01, 4:07, 0:52, 0:00, 6:35…
## $ description <fct> Kobe Bryant makes 4-foot two point shot, Kobe Bryant misse…
## $ shot <chr> "H", "M", "M", "H", "H", "M", "M", "M", "M", "H", "H", "H"…
Exercise 1
#The code in this section creates the variable kobe_streak which is a
list of 76 observations and the corresponding length of the streak for
each observation. The command gf_bar() is used to create a bar graph to
visually analyze the data from kobe_streak.
##ANSWER## A streak length of 1 means that he only made one basket
before missing in the following attempt. A streak length of 0 means that
Kobe did not make a basket.
kobe_streak <- calc_streak(kobe_basket$shot)
gf_bar(~length,data=kobe_streak)

Exercise 2
#In order to look into the distribution of kobe_streak, the command
favstats() was used to find useful information regarding the data. The
code following this was used to experiment with the generation of random
variabls. This code simulates a coin flip and generates heads/tails,
assigns it to the variabl sim_fair_coin, and does this 100 times.
Finally this data is displayed using the table() function. With this it
is clear that with a fair coin the probability of reciving a head or
tail is nearly 50/50 with the actual probabilities being p(heads)=0.49
and p(tails)=0.51.
##ANSWER## This distribution of Kobe’s streak length from the 2009
NBA finals can be determined by analyzing a histogram, boxplot, and a
summary of the statistics of the data set. Based on the above histogram
this data is unimodal, with the peak being at 0. Using both the
histogram and the box plot it can be determined that this data has a
right skew. Using the box plot created, it was found that there are a
few data points that are outlies, which were streaks of 3 and 4. Using
the favstats() command, it can be determined from the median, which the
number that tells the typical streak length. The typical streak length
is 0. The longest streak of baskets is represented by the maximum value
in the data set, which is 4. Additional data that can be found with
favstats() is the mean, which is 0.7631579, the standard deviation of
0.9915432, Q1 = 0, and Q3 = 1.
gf_boxplot(~length,data=kobe_streak)

gf_bar(~length,data=kobe_streak)

favstats(~length, data = kobe_streak)
## min Q1 median Q3 max mean sd n missing
## 0 0 0 1 4 0.7631579 0.9915432 76 0
coin_outcomes <- c("heads", "tails")
set.seed(94720)
sample(coin_outcomes, size = 1, replace = TRUE)
## [1] "tails"
sim_fair_coin <- sample(coin_outcomes, size = 100, replace = TRUE)
sim_fair_coin
## [1] "heads" "tails" "tails" "tails" "tails" "tails" "heads" "tails" "heads"
## [10] "heads" "heads" "heads" "heads" "tails" "heads" "heads" "tails" "heads"
## [19] "heads" "tails" "heads" "tails" "tails" "tails" "tails" "heads" "tails"
## [28] "tails" "heads" "heads" "heads" "heads" "tails" "heads" "tails" "heads"
## [37] "tails" "tails" "heads" "heads" "heads" "heads" "tails" "heads" "heads"
## [46] "heads" "tails" "heads" "heads" "heads" "heads" "tails" "tails" "heads"
## [55] "tails" "heads" "tails" "heads" "tails" "heads" "tails" "heads" "heads"
## [64] "tails" "tails" "tails" "tails" "heads" "heads" "tails" "tails" "heads"
## [73] "heads" "heads" "tails" "tails" "tails" "tails" "tails" "tails" "tails"
## [82] "tails" "tails" "tails" "tails" "heads" "heads" "tails" "heads" "tails"
## [91] "heads" "tails" "heads" "tails" "heads" "tails" "tails" "heads" "tails"
## [100] "heads"
## sim_fair_coin
## heads tails
## 49 51
Exercise 3
#For this exercise, very similar code was used as to Exercise 2. A
new variable “sim_unfair_coin” was created and assigned outcomes of
eaither heads or tails to simulate a coin flip. Since this is an unfair
coin the assignment said to sent the probabilities to as follows:
p(heads)=0.2 and p(tails)=0.8, this is done with this line of code: prob
= c(0.2, 0.8). The size portion of this command was set to 100 in order
to generate 100 flips of the coin and the table() function was used to
display how many heads and tails were recorded.
##ANSWER## The coin landed heads 21 times.
set.seed(27940)
sim_unfair_coin <- sample(coin_outcomes, size = 100, replace = TRUE,
prob = c(0.2, 0.8))
table(sim_unfair_coin)
## sim_unfair_coin
## heads tails
## 21 79
## Help on topic 'sample' was found in the following packages:
##
## Package Library
## mosaic /cloud/lib/x86_64-pc-linux-gnu-library/4.3
## base /opt/R/4.3.3/lib/R/library
##
##
## Using the first match ...
Exercise 4
#The same general code was used to answer this question except now it
is used to record shot outcomes as either a H (hit) or M (miss). The
variable sim_basket was created to record this data.
##ANSWER##In order to have the sample function reflect a shooting
percentage of 45% the section of the command needed to be altered to
read “prob = c(0.45, 0.55).” This section of the code represents there
is a probability of 0.45 that the shot will be hade and a 0.55
probability that it will not. In order to create a sample of 133 shots,
the “size” was set to equal 133 rather than one.
set.seed(38564)
shot_outcomes <- c("H", "M")
sim_basket <- sample(shot_outcomes, size = 133, replace = TRUE, prob = c(0.45, 0.55))
table(sim_basket)
## sim_basket
## H M
## 61 72
Exercise 5
#The variable “sim_streak” was created and used to store the computed
strak lengths for the simulated shooter that is being used to compare
with Kobe’s record. This will then be used in subsequent exercises in
order to analyze this data.
sim_streak <- calc_streak(sim_basket)
Exercise 6
#This exercise called for an analysis of the streak length of the
simulated independent shooter. In order to do this, a bar plot, a box
plot and the favstats() command.
##ANSWER## Some information based on the bar graph and box plot are
that this data is unimodal, with the peak being at 0, and there is a
right skew to this data. There are some data points that are outliers,
which fall at streaks of 3 and 4. The median tells what the typical
streak length is for this simulated independent shooter with a 45%
shooting percent, and the favstats() command reports this as 0. The
players longest streak of baskets in 133 shots is represented by the
maximum value in the data set, which is 4. Additional data that can be
found with favstats() is the mean, which is 0.8356164, the standard
deviation of 1.09308, Q1 = 0, and Q3 = 1.
gf_bar(~length,data=sim_streak)

gf_boxplot(~length,data=sim_streak)

favstats(~length, data = sim_streak)
## min Q1 median Q3 max mean sd n missing
## 0 0 0 1 4 0.8356164 1.09308 73 0
Exercise 7
##ANSWER## I would expact the result to be somewhat similar. This is
because there would be the exact same probability of getting hits and
misses, but since this is a random generator, these hits and misses can
occur in any order. This could create different streak lengths for each
time this code is run.
##Below the exact code from above was run again the distribution is
completely different from the last. While some data is the same, such as
the median, the mean and standard deviation vary. Also the maximum for
this data set is 6, which differs from the last trial.
set.seed(98753)
shot_outcomes <- c("H", "M")
sim_basket2 <- sample(shot_outcomes, size = 133, replace = TRUE, prob = c(0.45, 0.55))
table(sim_basket2)
## sim_basket2
## H M
## 55 78
sim_streak2 <- calc_streak(sim_basket2)
gf_bar(~length,data=sim_streak2)

gf_boxplot(~length,data=sim_streak2)

favstats(~length, data = sim_streak2)
## min Q1 median Q3 max mean sd n missing
## 0 0 0 1 6 0.6962025 1.090218 79 0
Exercise 8
#The below code uses the bind_rows() command to combine the data from
“kobe_streak” and “sim_streak” in order to display then together on one
graph. The the gf_histogram() command is used to create the graph, where
data is set to both in order to disply both information from both
“kobe_streak” and “sim_streak,” and the bin width is set to 20 to make
the histogram very readable and a great way to compare the data from the
two sets.
##ANSWER## This histogram suggests that Kobe’s trends in streak
length are very similar to a independent simulated shooter. While there
is some variation, the histogram shows the same general trend of a peak
at 0 and a right skew. Coming from the title of the simulation, it is
independent, meaning that the outcome of one shot does not affect the
next, or any other shot thereafter. The lab defines a shooter as a hot
hand as someone who “will have shots that are not independent of one
another,” and “the hot hand model says he will have a higher probability
of making his second shot” Since Kobe’s trends show that his shots are
independent, he does not comply with this definition, and is therefore,
not a hot hand.
both <- bind_rows(
kobe_streak %>% mutate(source = "kobe_streak"),
sim_streak %>% mutate(source = "sim_streak"))
gf_histogram(~ length, data = both, fill = ~source, position = "dodge",
bins = 20, alpha = 0.7)

LS0tCnRpdGxlOiAiVGhlIEhvdCBIYW5kIgphdXRob3I6ICJMYXVyYSBIdWVsc2thbXAiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShvcGVuaW50cm8pCmxpYnJhcnkobW9zYWljKQpsaWJyYXJ5KGdnZm9ybXVsYSkKZGF0YSgia29iZV9iYXNrZXQiKQpnbGltcHNlKGtvYmVfYmFza2V0KQo/a29iZV9iYXNrZXQKYGBgCgojIyMgRXhlcmNpc2UgMQojVGhlIGNvZGUgaW4gdGhpcyBzZWN0aW9uIGNyZWF0ZXMgdGhlIHZhcmlhYmxlIGtvYmVfc3RyZWFrIHdoaWNoIGlzIGEgbGlzdCBvZiA3NiBvYnNlcnZhdGlvbnMgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aCBvZiB0aGUgc3RyZWFrIGZvciBlYWNoIG9ic2VydmF0aW9uLiBUaGUgY29tbWFuZCBnZl9iYXIoKSBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJhciBncmFwaCB0byB2aXN1YWxseSBhbmFseXplIHRoZSBkYXRhIGZyb20ga29iZV9zdHJlYWsuCgojI0FOU1dFUiMjIEEgc3RyZWFrIGxlbmd0aCBvZiAxIG1lYW5zIHRoYXQgaGUgb25seSBtYWRlIG9uZSBiYXNrZXQgYmVmb3JlIG1pc3NpbmcgaW4gdGhlIGZvbGxvd2luZyBhdHRlbXB0LiBBIHN0cmVhayBsZW5ndGggb2YgMCBtZWFucyB0aGF0IEtvYmUgZGlkIG5vdCBtYWtlIGEgYmFza2V0LgoKYGBge3IgY29kZS1jaHVuay1sYWJlbH0Ka29iZV9zdHJlYWsgPC0gY2FsY19zdHJlYWsoa29iZV9iYXNrZXQkc2hvdCkKZ2ZfYmFyKH5sZW5ndGgsZGF0YT1rb2JlX3N0cmVhaykKYGBgCgoKIyMjIEV4ZXJjaXNlIDIKI0luIG9yZGVyIHRvIGxvb2sgaW50byB0aGUgZGlzdHJpYnV0aW9uIG9mIGtvYmVfc3RyZWFrLCB0aGUgY29tbWFuZCBmYXZzdGF0cygpIHdhcyB1c2VkIHRvIGZpbmQgdXNlZnVsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZGF0YS4gVGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgd2FzIHVzZWQgdG8gZXhwZXJpbWVudCB3aXRoIHRoZSBnZW5lcmF0aW9uIG9mIHJhbmRvbSB2YXJpYWJscy4gVGhpcyBjb2RlIHNpbXVsYXRlcyBhIGNvaW4gZmxpcCBhbmQgZ2VuZXJhdGVzIGhlYWRzL3RhaWxzLCBhc3NpZ25zIGl0IHRvIHRoZSB2YXJpYWJsIHNpbV9mYWlyX2NvaW4sIGFuZCBkb2VzIHRoaXMgMTAwIHRpbWVzLiBGaW5hbGx5IHRoaXMgZGF0YSBpcyBkaXNwbGF5ZWQgdXNpbmcgdGhlIHRhYmxlKCkgZnVuY3Rpb24uIFdpdGggdGhpcyBpdCBpcyBjbGVhciB0aGF0IHdpdGggYSBmYWlyIGNvaW4gdGhlIHByb2JhYmlsaXR5IG9mIHJlY2l2aW5nIGEgaGVhZCBvciB0YWlsIGlzIG5lYXJseSA1MC81MCB3aXRoIHRoZSBhY3R1YWwgcHJvYmFiaWxpdGllcyBiZWluZyBwKGhlYWRzKT0wLjQ5IGFuZCBwKHRhaWxzKT0wLjUxLiAKCiMjQU5TV0VSIyMgVGhpcyBkaXN0cmlidXRpb24gb2YgS29iZSdzIHN0cmVhayBsZW5ndGggZnJvbSB0aGUgMjAwOSBOQkEgZmluYWxzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGFuYWx5emluZyBhIGhpc3RvZ3JhbSwgYm94cGxvdCwgYW5kIGEgc3VtbWFyeSBvZiB0aGUgc3RhdGlzdGljcyBvZiB0aGUgZGF0YSBzZXQuIEJhc2VkIG9uIHRoZSBhYm92ZSBoaXN0b2dyYW0gdGhpcyBkYXRhIGlzIHVuaW1vZGFsLCB3aXRoIHRoZSBwZWFrIGJlaW5nIGF0IDAuIFVzaW5nIGJvdGggdGhlIGhpc3RvZ3JhbSBhbmQgdGhlIGJveCBwbG90IGl0IGNhbiBiZSBkZXRlcm1pbmVkIHRoYXQgdGhpcyBkYXRhIGhhcyBhIHJpZ2h0IHNrZXcuIFVzaW5nIHRoZSBib3ggcGxvdCBjcmVhdGVkLCBpdCB3YXMgZm91bmQgdGhhdCB0aGVyZSBhcmUgYSBmZXcgZGF0YSBwb2ludHMgdGhhdCBhcmUgb3V0bGllcywgd2hpY2ggd2VyZSBzdHJlYWtzIG9mIDMgYW5kIDQuIFVzaW5nIHRoZSBmYXZzdGF0cygpIGNvbW1hbmQsIGl0IGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIG1lZGlhbiwgd2hpY2ggdGhlIG51bWJlciB0aGF0IHRlbGxzIHRoZSB0eXBpY2FsIHN0cmVhayBsZW5ndGguIFRoZSB0eXBpY2FsIHN0cmVhayBsZW5ndGggaXMgMC4gVGhlIGxvbmdlc3Qgc3RyZWFrIG9mIGJhc2tldHMgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIGRhdGEgc2V0LCB3aGljaCBpcyA0LiBBZGRpdGlvbmFsIGRhdGEgdGhhdCBjYW4gYmUgZm91bmQgd2l0aCBmYXZzdGF0cygpIGlzIHRoZSBtZWFuLCB3aGljaCBpcyAwLjc2MzE1NzksIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgMC45OTE1NDMyLCBRMSA9IDAsIGFuZCBRMyA9IDEuCgpgYGB7ciB0cmVuZC1naXJsc30KZ2ZfYm94cGxvdCh+bGVuZ3RoLGRhdGE9a29iZV9zdHJlYWspCmdmX2Jhcih+bGVuZ3RoLGRhdGE9a29iZV9zdHJlYWspCmZhdnN0YXRzKH5sZW5ndGgsIGRhdGEgPSBrb2JlX3N0cmVhaykKY29pbl9vdXRjb21lcyA8LSBjKCJoZWFkcyIsICJ0YWlscyIpCnNldC5zZWVkKDk0NzIwKQpzYW1wbGUoY29pbl9vdXRjb21lcywgc2l6ZSA9IDEsIHJlcGxhY2UgPSBUUlVFKQpzaW1fZmFpcl9jb2luIDwtIHNhbXBsZShjb2luX291dGNvbWVzLCBzaXplID0gMTAwLCByZXBsYWNlID0gVFJVRSkKc2ltX2ZhaXJfY29pbgp0YWJsZShzaW1fZmFpcl9jb2luKQoKYGBgCgoKIyMjIEV4ZXJjaXNlIDMKI0ZvciB0aGlzIGV4ZXJjaXNlLCB2ZXJ5IHNpbWlsYXIgY29kZSB3YXMgdXNlZCBhcyB0byBFeGVyY2lzZSAyLiBBIG5ldyB2YXJpYWJsZSAic2ltX3VuZmFpcl9jb2luIiB3YXMgY3JlYXRlZCBhbmQgYXNzaWduZWQgb3V0Y29tZXMgb2YgZWFpdGhlciBoZWFkcyBvciB0YWlscyB0byBzaW11bGF0ZSBhIGNvaW4gZmxpcC4gU2luY2UgdGhpcyBpcyBhbiB1bmZhaXIgY29pbiB0aGUgYXNzaWdubWVudCBzYWlkIHRvIHNlbnQgdGhlIHByb2JhYmlsaXRpZXMgdG8gYXMgZm9sbG93czogcChoZWFkcyk9MC4yIGFuZCBwKHRhaWxzKT0wLjgsIHRoaXMgaXMgZG9uZSB3aXRoIHRoaXMgbGluZSBvZiBjb2RlOiBwcm9iID0gYygwLjIsIDAuOCkuIFRoZSBzaXplIHBvcnRpb24gb2YgdGhpcyBjb21tYW5kIHdhcyBzZXQgdG8gMTAwIGluIG9yZGVyIHRvIGdlbmVyYXRlIDEwMCBmbGlwcyBvZiB0aGUgY29pbiBhbmQgdGhlIHRhYmxlKCkgZnVuY3Rpb24gd2FzIHVzZWQgdG8gZGlzcGxheSBob3cgbWFueSBoZWFkcyBhbmQgdGFpbHMgd2VyZSByZWNvcmRlZC4gCgojI0FOU1dFUiMjIFRoZSBjb2luIGxhbmRlZCBoZWFkcyAyMSB0aW1lcy4KCmBgYHtyIHBsb3QtcHJvcC1ib3lzLWFyYnV0aG5vdH0Kc2V0LnNlZWQoMjc5NDApCnNpbV91bmZhaXJfY29pbiA8LSBzYW1wbGUoY29pbl9vdXRjb21lcywgc2l6ZSA9IDEwMCwgcmVwbGFjZSA9IFRSVUUsIApwcm9iID0gYygwLjIsIDAuOCkpCnRhYmxlKHNpbV91bmZhaXJfY29pbikKP3NhbXBsZQoKYGBgCgoKIyMjIEV4ZXJjaXNlIDQKI1RoZSBzYW1lIGdlbmVyYWwgY29kZSB3YXMgdXNlZCB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiBleGNlcHQgbm93IGl0IGlzIHVzZWQgdG8gcmVjb3JkIHNob3Qgb3V0Y29tZXMgYXMgZWl0aGVyIGEgSCAoaGl0KSBvciBNIChtaXNzKS4gVGhlIHZhcmlhYmxlIHNpbV9iYXNrZXQgd2FzIGNyZWF0ZWQgdG8gcmVjb3JkIHRoaXMgZGF0YS4gCgojI0FOU1dFUiMjSW4gb3JkZXIgdG8gaGF2ZSB0aGUgc2FtcGxlIGZ1bmN0aW9uIHJlZmxlY3QgYSBzaG9vdGluZyBwZXJjZW50YWdlIG9mIDQ1JSB0aGUgc2VjdGlvbiBvZiB0aGUgY29tbWFuZCBuZWVkZWQgdG8gYmUgYWx0ZXJlZCB0byByZWFkICJwcm9iID0gYygwLjQ1LCAwLjU1KS4iIFRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSByZXByZXNlbnRzIHRoZXJlIGlzIGEgcHJvYmFiaWxpdHkgb2YgMC40NSB0aGF0IHRoZSBzaG90IHdpbGwgYmUgaGFkZSBhbmQgYSAwLjU1IHByb2JhYmlsaXR5IHRoYXQgaXQgd2lsbCBub3QuIEluIG9yZGVyIHRvIGNyZWF0ZSBhIHNhbXBsZSBvZiAxMzMgc2hvdHMsIHRoZSAic2l6ZSIgd2FzIHNldCB0byBlcXVhbCAxMzMgcmF0aGVyIHRoYW4gb25lLiAgCgpgYGB7ciBkaW0tcHJlc2VudH0Kc2V0LnNlZWQoMzg1NjQpCnNob3Rfb3V0Y29tZXMgPC0gYygiSCIsICJNIikKc2ltX2Jhc2tldCA8LSBzYW1wbGUoc2hvdF9vdXRjb21lcywgc2l6ZSA9IDEzMywgcmVwbGFjZSA9IFRSVUUsIHByb2IgPSBjKDAuNDUsIDAuNTUpKQp0YWJsZShzaW1fYmFza2V0KQpgYGAKCgojIyMgRXhlcmNpc2UgNQoKI1RoZSB2YXJpYWJsZSAic2ltX3N0cmVhayIgd2FzIGNyZWF0ZWQgYW5kIHVzZWQgdG8gc3RvcmUgdGhlIGNvbXB1dGVkIHN0cmFrIGxlbmd0aHMgZm9yIHRoZSBzaW11bGF0ZWQgc2hvb3RlciB0aGF0IGlzIGJlaW5nIHVzZWQgdG8gY29tcGFyZSB3aXRoIEtvYmUncyByZWNvcmQuIFRoaXMgd2lsbCB0aGVuIGJlIHVzZWQgaW4gc3Vic2VxdWVudCBleGVyY2lzZXMgaW4gb3JkZXIgdG8gYW5hbHl6ZSB0aGlzIGRhdGEuIAoKYGBge3IgY291bnQtY29tcGFyZX0Kc2ltX3N0cmVhayA8LSBjYWxjX3N0cmVhayhzaW1fYmFza2V0KQpgYGAKCgojIyMgRXhlcmNpc2UgNgoKI1RoaXMgZXhlcmNpc2UgY2FsbGVkIGZvciBhbiBhbmFseXNpcyBvZiB0aGUgc3RyZWFrIGxlbmd0aCBvZiB0aGUgc2ltdWxhdGVkIGluZGVwZW5kZW50IHNob290ZXIuIEluIG9yZGVyIHRvIGRvIHRoaXMsIGEgYmFyIHBsb3QsIGEgYm94IHBsb3QgYW5kIHRoZSBmYXZzdGF0cygpIGNvbW1hbmQuCgojI0FOU1dFUiMjIFNvbWUgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIGJhciBncmFwaCBhbmQgYm94IHBsb3QgYXJlIHRoYXQgdGhpcyBkYXRhIGlzIHVuaW1vZGFsLCB3aXRoIHRoZSBwZWFrIGJlaW5nIGF0IDAsIGFuZCB0aGVyZSBpcyBhIHJpZ2h0IHNrZXcgdG8gdGhpcyBkYXRhLiBUaGVyZSBhcmUgc29tZSBkYXRhIHBvaW50cyB0aGF0IGFyZSBvdXRsaWVycywgd2hpY2ggZmFsbCBhdCBzdHJlYWtzIG9mIDMgYW5kIDQuIFRoZSBtZWRpYW4gdGVsbHMgd2hhdCB0aGUgdHlwaWNhbCBzdHJlYWsgbGVuZ3RoIGlzIGZvciB0aGlzIHNpbXVsYXRlZCBpbmRlcGVuZGVudCBzaG9vdGVyIHdpdGggYSA0NSUgc2hvb3RpbmcgcGVyY2VudCwgYW5kIHRoZSBmYXZzdGF0cygpIGNvbW1hbmQgcmVwb3J0cyB0aGlzIGFzIDAuIFRoZSBwbGF5ZXJzIGxvbmdlc3Qgc3RyZWFrIG9mIGJhc2tldHMgaW4gMTMzIHNob3RzIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBkYXRhIHNldCwgd2hpY2ggaXMgNC4gQWRkaXRpb25hbCBkYXRhIHRoYXQgY2FuIGJlIGZvdW5kIHdpdGggZmF2c3RhdHMoKSBpcyB0aGUgbWVhbiwgd2hpY2ggaXMgMC44MzU2MTY0LCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDEuMDkzMDgsIFExID0gMCwgYW5kIFEzID0gMS4KCmBgYHtyIHBsb3QtcHJvcC1ib3lzLXByZXNlbnR9CmdmX2Jhcih+bGVuZ3RoLGRhdGE9c2ltX3N0cmVhaykKZ2ZfYm94cGxvdCh+bGVuZ3RoLGRhdGE9c2ltX3N0cmVhaykKZmF2c3RhdHMofmxlbmd0aCwgZGF0YSA9IHNpbV9zdHJlYWspCmBgYAoKCiMjIyBFeGVyY2lzZSA3CgojI0FOU1dFUiMjIEkgd291bGQgZXhwYWN0IHRoZSByZXN1bHQgdG8gYmUgc29tZXdoYXQgc2ltaWxhci4gVGhpcyBpcyBiZWNhdXNlIHRoZXJlIHdvdWxkIGJlIHRoZSBleGFjdCBzYW1lIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgaGl0cyBhbmQgbWlzc2VzLCBidXQgc2luY2UgdGhpcyBpcyBhIHJhbmRvbSBnZW5lcmF0b3IsIHRoZXNlIGhpdHMgYW5kIG1pc3NlcyBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBUaGlzIGNvdWxkIGNyZWF0ZSBkaWZmZXJlbnQgc3RyZWFrIGxlbmd0aHMgZm9yIGVhY2ggdGltZSB0aGlzIGNvZGUgaXMgcnVuLiAKCiMjQmVsb3cgdGhlIGV4YWN0IGNvZGUgZnJvbSBhYm92ZSB3YXMgcnVuIGFnYWluIHRoZSBkaXN0cmlidXRpb24gaXMgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdC4gV2hpbGUgc29tZSBkYXRhIGlzIHRoZSBzYW1lLCBzdWNoIGFzIHRoZSBtZWRpYW4sIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gdmFyeS4gQWxzbyB0aGUgbWF4aW11bSBmb3IgdGhpcyBkYXRhIHNldCBpcyA2LCB3aGljaCBkaWZmZXJzIGZyb20gdGhlIGxhc3QgdHJpYWwuCgpgYGB7ciBmaW5kLW1heC10b3RhbH0Kc2V0LnNlZWQoOTg3NTMpCnNob3Rfb3V0Y29tZXMgPC0gYygiSCIsICJNIikKc2ltX2Jhc2tldDIgPC0gc2FtcGxlKHNob3Rfb3V0Y29tZXMsIHNpemUgPSAxMzMsIHJlcGxhY2UgPSBUUlVFLCBwcm9iID0gYygwLjQ1LCAwLjU1KSkKdGFibGUoc2ltX2Jhc2tldDIpCnNpbV9zdHJlYWsyIDwtIGNhbGNfc3RyZWFrKHNpbV9iYXNrZXQyKQpnZl9iYXIofmxlbmd0aCxkYXRhPXNpbV9zdHJlYWsyKQpnZl9ib3hwbG90KH5sZW5ndGgsZGF0YT1zaW1fc3RyZWFrMikKZmF2c3RhdHMofmxlbmd0aCwgZGF0YSA9IHNpbV9zdHJlYWsyKQpgYGAKCiMjIyBFeGVyY2lzZSA4CiNUaGUgYmVsb3cgY29kZSB1c2VzIHRoZSBiaW5kX3Jvd3MoKSBjb21tYW5kIHRvIGNvbWJpbmUgdGhlIGRhdGEgZnJvbSAia29iZV9zdHJlYWsiIGFuZCAic2ltX3N0cmVhayIgaW4gb3JkZXIgdG8gZGlzcGxheSB0aGVuIHRvZ2V0aGVyIG9uIG9uZSBncmFwaC4gVGhlIHRoZSBnZl9oaXN0b2dyYW0oKSBjb21tYW5kIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBncmFwaCwgd2hlcmUgZGF0YSBpcyBzZXQgdG8gYm90aCBpbiBvcmRlciB0byBkaXNwbHkgYm90aCBpbmZvcm1hdGlvbiBmcm9tIGJvdGggImtvYmVfc3RyZWFrIiBhbmQgInNpbV9zdHJlYWssIiBhbmQgdGhlIGJpbiB3aWR0aCBpcyBzZXQgdG8gMjAgdG8gbWFrZSB0aGUgaGlzdG9ncmFtIHZlcnkgcmVhZGFibGUgYW5kIGEgZ3JlYXQgd2F5IHRvIGNvbXBhcmUgdGhlIGRhdGEgZnJvbSB0aGUgdHdvIHNldHMuIAoKIyNBTlNXRVIjIyBUaGlzIGhpc3RvZ3JhbSBzdWdnZXN0cyB0aGF0IEtvYmUncyB0cmVuZHMgaW4gc3RyZWFrIGxlbmd0aCBhcmUgdmVyeSBzaW1pbGFyIHRvIGEgaW5kZXBlbmRlbnQgc2ltdWxhdGVkIHNob290ZXIuIFdoaWxlIHRoZXJlIGlzIHNvbWUgdmFyaWF0aW9uLCB0aGUgaGlzdG9ncmFtIHNob3dzIHRoZSBzYW1lIGdlbmVyYWwgdHJlbmQgb2YgYSBwZWFrIGF0IDAgYW5kIGEgcmlnaHQgc2tldy4gQ29taW5nIGZyb20gdGhlIHRpdGxlIG9mIHRoZSBzaW11bGF0aW9uLCBpdCBpcyBpbmRlcGVuZGVudCwgbWVhbmluZyB0aGF0IHRoZSBvdXRjb21lIG9mIG9uZSBzaG90IGRvZXMgbm90IGFmZmVjdCB0aGUgbmV4dCwgb3IgYW55IG90aGVyIHNob3QgdGhlcmVhZnRlci4gVGhlIGxhYiBkZWZpbmVzIGEgc2hvb3RlciBhcyBhIGhvdCBoYW5kIGFzIHNvbWVvbmUgd2hvICJ3aWxsIGhhdmUgc2hvdHMgdGhhdCBhcmUgbm90IGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyLCIgYW5kICJ0aGUgaG90IGhhbmQgbW9kZWwgc2F5cyBoZSB3aWxsIGhhdmUgYSBoaWdoZXIgcHJvYmFiaWxpdHkgb2YgbWFraW5nIGhpcyBzZWNvbmQgc2hvdCIgU2luY2UgS29iZSdzIHRyZW5kcyBzaG93IHRoYXQgaGlzIHNob3RzIGFyZSBpbmRlcGVuZGVudCwgaGUgZG9lcyBub3QgY29tcGx5IHdpdGggdGhpcyBkZWZpbml0aW9uLCBhbmQgaXMgdGhlcmVmb3JlLCBub3QgYSBob3QgaGFuZC4gCmBgYHtyfQpib3RoIDwtIGJpbmRfcm93cygKICBrb2JlX3N0cmVhayAlPiUgbXV0YXRlKHNvdXJjZSA9ICJrb2JlX3N0cmVhayIpLAogICAgIHNpbV9zdHJlYWsgJT4lIG11dGF0ZShzb3VyY2UgPSAic2ltX3N0cmVhayIpKQpnZl9oaXN0b2dyYW0ofiBsZW5ndGgsIGRhdGEgPSBib3RoLCBmaWxsID0gfnNvdXJjZSwgcG9zaXRpb24gPSAiZG9kZ2UiLCAKICAgICAgICAgICAgIGJpbnMgPSAyMCwgYWxwaGEgPSAwLjcpCmBgYAoK