Learning Objectives


Upon completing today’s lab activity, students should be able to do the following using R and RStudio:

  1. Computing probabilities using the binomial probability mass function (PMF).

  2. Computing probabilities using the normal probability density function (PDF).

  3. Visualizing probability functions.


library(tidyverse)
library(ggplot2)
library(gghighlight)
library(openintro)


Binomial Distribution


The binomial distribution model is used to determine the likelihood of success of an event with just two possible outcomes.

Let the discrete random variable \(X\) to be the number successes - with probability \(p\) - and let \(n\) be the number of trials.

The general form of the Binomial probability mass function (PMF) is given by

\[P(X = x; n, p) = {n \choose x} p^x (1-p)^{(n-x)} \hspace{5px} \text{ for } x = 0,1,2,\cdots, n\] where the binomial coefficients are computed as \[{n \choose x} = \frac{n!}{x!(n-x)!}.\]

The binomial distribution assumes that \(p\) is fixed for all \(n\) trials.

The expected value or the mean of the binomial PMF is \(E[X] = np\).

The variance of the binomial PMF is \(Var[X] = np(1-p)\).

Notice that the term \(p^x (1-p)^{(n-x)}\) is the Bernoulli function. Here, a trial is also called a Bernoulli trial, a random experiment with exactly two possible outcomes.

The binomial cumulative distribution function (CDF) is given by

\[P(X \le k) = \sum_{i=0}^{k} {n \choose i} p^i (1-p)^{(n-i)}\] where \(k\) is an integer.

R commands

R has four built-in functions for generating binomial distributions. They are detailed further down including the descriptions of the settings.

dbinom(x, size, prob) # pdf
pbinom(x, size, prob) # cdf
qbinom(p, size, prob) # percentiles
rbinom(n, size, prob) # simulations
  • x is a vector of numbers.

  • p is a vector of probabilities.

  • n is number of observations.

  • size is the number of trials.

  • prob is the probability of success of each trial.

For explicitly computing the binomial coefficients - or the combination function, we can use the choose function.

choose(n,k)


Using the choose function

Example: How many ways can we pick 5 items from 10 items where order does not matter?

choose(10,5)
## [1] 252

There are 252 ways, which is \({10 \choose 5} = 252\).

Binomial PMF - dbinom

Example: Suppose that \(p=1/2\) and \(n=10\). What is \(P(X = 6)\)?

p <- 1/2
x1 <- 6
n <- 10
dbinom(x1,n,prob=p)
## [1] 0.2050781

Plotting the PMF.

# Create a sample of 50 numbers which are incremented by 1.
X <- seq(0,n,by = 1)

# Create the binomial distribution.
P_binom <- dbinom(X,n,p)

# create dataframe for ggplot
df <- data.frame(x=X,probability=P_binom)

# for highlighting
p_x1 <- dbinom(x = x1,
              size = n, 
              prob = p)

plt <- ggplot(df, aes(x=X, y=probability)) +
  geom_point(size=4) + ggtitle("PMF of the Binomial Distribution p = 1/2 and n = 10: P(X = 6)") +
  geom_point(x=x1,y=p_x1,color='red',size = 4) + 
  geom_segment(x=x1,y=0,xend=x1, yend=p_x1, color="red") +
  scale_x_discrete(limit = X)
## Warning: Continuous limits supplied to discrete scale.
## Did you mean `limits = factor(...)` or `scale_*_continuous()`?
plt

Binomial CDF - pbinom

Example: Suppose that \(p=1/2\) and \(n=10\). What is \(P(X \le 6)\)?

p <- 1/2
x2 <- 6
n <- 10
pbinom(x2,n,prob=p)
## [1] 0.828125

Plotting the PMF.

# Create a sample of n numbers which are incremented by 1.
X <- seq(0,n,by = 1)

# Create the binomial distribution.
P_binom <- dbinom(X,n,p)

# create dataframe for ggplot
df <- data.frame(x=X,probability=P_binom)

# for highlighting
x2_vect <- 0:x2
p2_vect <- P_binom[x2_vect+1]

plt <- ggplot(df, aes(x=X, y=P_binom)) +
  geom_point(size=4) + ggtitle("PMF of the Binomial Distribution p = 1/2 and n = 10: P(X <= 6)") +
  scale_x_discrete(limit = X)
## Warning: Continuous limits supplied to discrete scale.
## Did you mean `limits = factor(...)` or `scale_*_continuous()`?
for(i in 1:length(x2_vect)) {
    plt <- plt + geom_point(x=x2_vect[i],y=p2_vect[i],color='red',size = 4) + 
                 geom_segment(x=x2_vect[i],y=0,xend=x2_vect[i], yend=p2_vect[i], color="red")
  }
plt

Binomial Percentiles - qbinom

Example: What is the \(x\) value when \(P(X) = 0.2461\) and \(p=1/2\)?

p3 <- 0.2461
qbinom(p3,n,p)
## [1] 4


Normal Distribution


The distribution of data in a random sample is often seen to be normal. That is, when we plot a graph with the variable’s value in the horizontal axis and the count of the values in the vertical axis, we obtain a bell shape curve. The mean of the data set is represented by the middle of the curve. In the graph, half of the values are to the left of the mean, while the other half are to the right. In statistics, this is referred to as normal distribution - or the Gaussian distribution.

The general formula for the normal probability density function (PDF) is

\[P(X = x; \mu, \sigma) = \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{1}{2} \left( \frac{x - \mu}{\sigma} \right)^2}\] where \(X\) is some continuous random variable, \(\mu\) and \(\sigma\) are the shape parameters - or mean and standard deviations respectively.

The expected value or the mean of the normal PDF is \(E[X] = \mu\).

The variance of the normal PDF is \(Var[X] = \sigma^2\).

The forumal for the normal cumulative distribution function (cdf) is

\[P(X \le k; \mu, \sigma) = \int_{-\infty}^{k} \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{1}{2} \left( \frac{x - \mu}{\sigma} \right)^2} dx\] where \(k\) is come continuous value.

Notice that the z-score term is written in the functions as

\[z = \frac{x - \mu}{\sigma}.\]

The z-score is also called the standardized score describing the distance from some value \(x\) to the mean of any normal distrbution with mean \(\mu\) and standard deviation \(\sigma\). Standardization of the distribution is when we transform the data distribution to yield \(\mu=0\) and \(\sigma=1\).

R has four built-in functions for generating normal distributions. They are detailed further down including the descriptions of the settings.

dnorm(x, mean, sd) # PDF
pnorm(x, mean, sd) # CDF
qnorm(p, mean, sd) # percentiles
rnorm(n, mean, sd) # simulations
  • x is a vector of numbers.

  • p is a vector of probabilities.

  • n is number of observations(sample size).

  • mean is the mean value of the sample data. It’s default value is zero.

  • sd is the standard deviation. It’s default value is 1.


Normal PDF - dnorm

Example: Suppose that \(\mu=125\) and \(\sigma=20\). What is \(P(X = 100)\)?

mu <- 125
sigma <- 20
x1 <- 100
dnorm(x1,mu,sigma)
## [1] 0.009132454

Normal CDF - pnorm

Example: Suppose that \(\mu=125\) and \(\sigma=20\). What is \(P(X \le 100)\)?

mu <- 125
sigma <- 20
x2 <- 100
pnorm(x1,mu,sigma)
## [1] 0.1056498

Plotting the PDF.

normTail(mu, sigma, M = c(0,x2), col = "red")

Normal Percentiles - qnorm

Example: What is the \(x\) value when \(P(X) = 0.25\) with \(\mu=125\) and \(\sigma=20\)?

p3 <- 0.25
qnorm(p3,mu,sigma)
## [1] 111.5102

Checking.

pnorm(111.5102,mu,sigma)
## [1] 0.2499999


Mini Activities


Notification on changes to the HW and LB assignments: The mini activities below are designed to be done during lab time. The actual lab exercises are now part of your homework assignment, which will be posted tonight in the Homeworks page. This means that every week you will have a HW and LB assignment together as one, and it will be due in one week.

Binomial Distribution

Let the discrete random variable \(X\) to be the number of successes - with probability \(p = \frac{1}{3}\) - and let \(n = 10\) be the number of trials. Assuming the random variable follows a binomial distribution, compute the following probabilities and highlight the appropriate region(s) in the plot.

  1. \(P(X = 2)\)

  2. \(P(X \le 2)\)

  3. \(P(X \ge 2)\)

  4. \(P(2 \le X \le 4)\)

  5. \(P(X = 2 \cup X = 4)\)

  6. \(P(X = 2 \cap X = 4)\)

  7. \(P(X \le x) = 0.25\)

  8. \(P(X \ge x) = 0.25\)


Normal Distribution

Suppose that the random variable \(X\) follows a normal distribution with \(\mu = 10\) and \(\sigma=5\), compute the following probabilities and highlight the appropriate region(s) in the plot.

  1. \(P(X = 8)\)

  2. \(P(X \le 11)\)

  3. \(P(X \ge 11)\)

  4. \(P(8 \le X \le 11)\)

  5. \(P(X = 8 \cup X = 11)\)

  6. \(P(X = 8 \cap X = 9)\)

  7. \(P(X \le x) = 0.10\)

  8. \(P(X \ge x) = 0.10\)

  9. What is the corresponding z-score for \(P(X = 8)\)?

  10. What are the corresponding z-scores for \(P(8 \le X \le 11)\)?


LS0tCnRpdGxlOiAiNCAtIFN0YXRpc3RpY2FsIE1vZGVscyBQYXJ0IEkiCmF1dGhvcjogIkFsZXggSm9obiBRdWlqYW5vIgpkYXRlOiAiMTAvMjYvMjAyMSIKb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQKLS0tCgojIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKgoKPGJyPgoKVXBvbiBjb21wbGV0aW5nIHRvZGF5J3MgbGFiIGFjdGl2aXR5LCBzdHVkZW50cyBzaG91bGQgYmUgYWJsZSB0byBkbyB0aGUgZm9sbG93aW5nIHVzaW5nIFIgYW5kIFJTdHVkaW86CgogIDEuIENvbXB1dGluZyBwcm9iYWJpbGl0aWVzIHVzaW5nIHRoZSBiaW5vbWlhbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIChQTUYpLgogIAogIDIuIENvbXB1dGluZyBwcm9iYWJpbGl0aWVzIHVzaW5nIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiAoUERGKS4KICAKICAzLiBWaXN1YWxpemluZyBwcm9iYWJpbGl0eSBmdW5jdGlvbnMuCgo8YnI+CgpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2doaWdobGlnaHQpCmxpYnJhcnkob3BlbmludHJvKQpgYGAKCjxicj4KCiMjICoqQmlub21pYWwgRGlzdHJpYnV0aW9uKioKCjxicj4KClRoZSAqKmJpbm9taWFsIGRpc3RyaWJ1dGlvbioqIG1vZGVsIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBsaWtlbGlob29kIG9mIHN1Y2Nlc3Mgb2YgYW4gZXZlbnQgd2l0aCBqdXN0IHR3byBwb3NzaWJsZSBvdXRjb21lcy4KCkxldCB0aGUgKipkaXNjcmV0ZSByYW5kb20gdmFyaWFibGUqKiAkWCQgdG8gYmUgdGhlIG51bWJlciBzdWNjZXNzZXMgLSB3aXRoIHByb2JhYmlsaXR5ICRwJCAtIGFuZCBsZXQgJG4kIGJlIHRoZSBudW1iZXIgb2YgdHJpYWxzLgoKVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgKipCaW5vbWlhbCBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIChQTUYpKiogaXMgZ2l2ZW4gYnkKCiQkUChYID0geDsgbiwgcCkgPSB7biBcY2hvb3NlIHh9IHBeeCAoMS1wKV57KG4teCl9IFxoc3BhY2V7NXB4fSBcdGV4dHsgZm9yIH0geCA9IDAsMSwyLFxjZG90cywgbiQkCndoZXJlIHRoZSBiaW5vbWlhbCBjb2VmZmljaWVudHMgYXJlIGNvbXB1dGVkIGFzIAokJHtuIFxjaG9vc2UgeH0gPSBcZnJhY3tuIX17eCEobi14KSF9LiQkCiAgICAgIApUaGUgYmlub21pYWwgZGlzdHJpYnV0aW9uIGFzc3VtZXMgdGhhdCAkcCQgaXMgZml4ZWQgZm9yIGFsbCAkbiQgdHJpYWxzLgogIApUaGUgKipleHBlY3RlZCB2YWx1ZSoqIG9yIHRoZSAqKm1lYW4qKiBvZiB0aGUgYmlub21pYWwgUE1GIGlzICRFW1hdID0gbnAkLgoKVGhlICoqdmFyaWFuY2UqKiBvZiB0aGUgYmlub21pYWwgUE1GIGlzICRWYXJbWF0gPSBucCgxLXApJC4KICAKTm90aWNlIHRoYXQgdGhlIHRlcm0gJHBeeCAoMS1wKV57KG4teCl9JCBpcyB0aGUgKipCZXJub3VsbGkqKiBmdW5jdGlvbi4gSGVyZSwgYSB0cmlhbCBpcyBhbHNvIGNhbGxlZCBhICoqQmVybm91bGxpIHRyaWFsKiosIGEgcmFuZG9tIGV4cGVyaW1lbnQgd2l0aCBleGFjdGx5IHR3byBwb3NzaWJsZSBvdXRjb21lcy4KClRoZSAqKmJpbm9taWFsIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIChDREYpKiogaXMgZ2l2ZW4gYnkKCiQkUChYIFxsZSBrKSA9IFxzdW1fe2k9MH1ee2t9IHtuIFxjaG9vc2UgaX0gcF5pICgxLXApXnsobi1pKX0kJAp3aGVyZSAkayQgaXMgYW4gaW50ZWdlci4KCiMjIyBSIGNvbW1hbmRzCgpSIGhhcyBmb3VyIGJ1aWx0LWluIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhdGluZyBiaW5vbWlhbCBkaXN0cmlidXRpb25zLiBUaGV5IGFyZSBkZXRhaWxlZCBmdXJ0aGVyIGRvd24gaW5jbHVkaW5nIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHNldHRpbmdzLgoKYGBgCmRiaW5vbSh4LCBzaXplLCBwcm9iKSAjIHBkZgpwYmlub20oeCwgc2l6ZSwgcHJvYikgIyBjZGYKcWJpbm9tKHAsIHNpemUsIHByb2IpICMgcGVyY2VudGlsZXMKcmJpbm9tKG4sIHNpemUsIHByb2IpICMgc2ltdWxhdGlvbnMKYGBgCgogICogYHhgIGlzIGEgdmVjdG9yIG9mIG51bWJlcnMuCgogICogYHBgIGlzIGEgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMuCgogICogYG5gIGlzIG51bWJlciBvZiBvYnNlcnZhdGlvbnMuCgogICogYHNpemVgIGlzIHRoZSBudW1iZXIgb2YgdHJpYWxzLgoKICAqIGBwcm9iYCBpcyB0aGUgcHJvYmFiaWxpdHkgb2Ygc3VjY2VzcyBvZiBlYWNoIHRyaWFsLgogIApGb3IgZXhwbGljaXRseSBjb21wdXRpbmcgdGhlIGJpbm9taWFsIGNvZWZmaWNpZW50cyAtIG9yIHRoZSBjb21iaW5hdGlvbiBmdW5jdGlvbiwgd2UgY2FuIHVzZSB0aGUgYGNob29zZWAgZnVuY3Rpb24uCgpgYGAKY2hvb3NlKG4saykKYGBgCgo8YnI+CgojIyMgVXNpbmcgdGhlIGBjaG9vc2VgIGZ1bmN0aW9uCgpFeGFtcGxlOiBIb3cgbWFueSB3YXlzIGNhbiB3ZSBwaWNrIDUgaXRlbXMgZnJvbSAxMCBpdGVtcyB3aGVyZSBvcmRlciBkb2VzIG5vdCBtYXR0ZXI/CgpgYGB7cn0KY2hvb3NlKDEwLDUpCmBgYAoKVGhlcmUgYXJlIDI1MiB3YXlzLCB3aGljaCBpcyAkezEwIFxjaG9vc2UgNX0gPSAyNTIkLgoKIyMjIEJpbm9taWFsIFBNRiAtIGBkYmlub21gCgpFeGFtcGxlOiBTdXBwb3NlIHRoYXQgJHA9MS8yJCBhbmQgJG49MTAkLiBXaGF0IGlzICRQKFggPSA2KSQ/CgpgYGB7cn0KcCA8LSAxLzIKeDEgPC0gNgpuIDwtIDEwCmRiaW5vbSh4MSxuLHByb2I9cCkKYGBgCgpQbG90dGluZyB0aGUgUE1GLgoKYGBge3J9CiMgQ3JlYXRlIGEgc2FtcGxlIG9mIDUwIG51bWJlcnMgd2hpY2ggYXJlIGluY3JlbWVudGVkIGJ5IDEuClggPC0gc2VxKDAsbixieSA9IDEpCgojIENyZWF0ZSB0aGUgYmlub21pYWwgZGlzdHJpYnV0aW9uLgpQX2Jpbm9tIDwtIGRiaW5vbShYLG4scCkKCiMgY3JlYXRlIGRhdGFmcmFtZSBmb3IgZ2dwbG90CmRmIDwtIGRhdGEuZnJhbWUoeD1YLHByb2JhYmlsaXR5PVBfYmlub20pCgojIGZvciBoaWdobGlnaHRpbmcKcF94MSA8LSBkYmlub20oeCA9IHgxLAogICAgICAgICAgICAgIHNpemUgPSBuLCAKICAgICAgICAgICAgICBwcm9iID0gcCkKCnBsdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4PVgsIHk9cHJvYmFiaWxpdHkpKSArCiAgZ2VvbV9wb2ludChzaXplPTQpICsgZ2d0aXRsZSgiUE1GIG9mIHRoZSBCaW5vbWlhbCBEaXN0cmlidXRpb24gcCA9IDEvMiBhbmQgbiA9IDEwOiBQKFggPSA2KSIpICsKICBnZW9tX3BvaW50KHg9eDEseT1wX3gxLGNvbG9yPSdyZWQnLHNpemUgPSA0KSArIAogIGdlb21fc2VnbWVudCh4PXgxLHk9MCx4ZW5kPXgxLCB5ZW5kPXBfeDEsIGNvbG9yPSJyZWQiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdCA9IFgpCnBsdApgYGAKICAKIyMjIEJpbm9taWFsIENERiAtIGBwYmlub21gCgpFeGFtcGxlOiBTdXBwb3NlIHRoYXQgJHA9MS8yJCBhbmQgJG49MTAkLiBXaGF0IGlzICRQKFggXGxlIDYpJD8KCmBgYHtyfQpwIDwtIDEvMgp4MiA8LSA2Cm4gPC0gMTAKcGJpbm9tKHgyLG4scHJvYj1wKQpgYGAKClBsb3R0aW5nIHRoZSBQTUYuCgpgYGB7cn0KIyBDcmVhdGUgYSBzYW1wbGUgb2YgbiBudW1iZXJzIHdoaWNoIGFyZSBpbmNyZW1lbnRlZCBieSAxLgpYIDwtIHNlcSgwLG4sYnkgPSAxKQoKIyBDcmVhdGUgdGhlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbi4KUF9iaW5vbSA8LSBkYmlub20oWCxuLHApCgojIGNyZWF0ZSBkYXRhZnJhbWUgZm9yIGdncGxvdApkZiA8LSBkYXRhLmZyYW1lKHg9WCxwcm9iYWJpbGl0eT1QX2Jpbm9tKQoKIyBmb3IgaGlnaGxpZ2h0aW5nCngyX3ZlY3QgPC0gMDp4MgpwMl92ZWN0IDwtIFBfYmlub21beDJfdmVjdCsxXQoKcGx0IDwtIGdncGxvdChkZiwgYWVzKHg9WCwgeT1QX2Jpbm9tKSkgKwogIGdlb21fcG9pbnQoc2l6ZT00KSArIGdndGl0bGUoIlBNRiBvZiB0aGUgQmlub21pYWwgRGlzdHJpYnV0aW9uIHAgPSAxLzIgYW5kIG4gPSAxMDogUChYIDw9IDYpIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXQgPSBYKQpmb3IoaSBpbiAxOmxlbmd0aCh4Ml92ZWN0KSkgewogICAgcGx0IDwtIHBsdCArIGdlb21fcG9pbnQoeD14Ml92ZWN0W2ldLHk9cDJfdmVjdFtpXSxjb2xvcj0ncmVkJyxzaXplID0gNCkgKyAKICAgICAgICAgICAgICAgICBnZW9tX3NlZ21lbnQoeD14Ml92ZWN0W2ldLHk9MCx4ZW5kPXgyX3ZlY3RbaV0sIHllbmQ9cDJfdmVjdFtpXSwgY29sb3I9InJlZCIpCiAgfQpwbHQKYGBgCgojIyMgQmlub21pYWwgUGVyY2VudGlsZXMgLSBgcWJpbm9tYAoKRXhhbXBsZTogV2hhdCBpcyB0aGUgJHgkIHZhbHVlIHdoZW4gJFAoWCkgPSAwLjI0NjEkIGFuZCAkcD0xLzIkPwoKYGBge3J9CnAzIDwtIDAuMjQ2MQpxYmlub20ocDMsbixwKQpgYGAKCjxicj4KCiMjICoqTm9ybWFsIERpc3RyaWJ1dGlvbioqCgo8YnI+CgpUaGUgZGlzdHJpYnV0aW9uIG9mIGRhdGEgaW4gYSByYW5kb20gc2FtcGxlIGlzIG9mdGVuIHNlZW4gdG8gYmUgbm9ybWFsLiBUaGF0IGlzLCB3aGVuIHdlIHBsb3QgYSBncmFwaCB3aXRoIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGluIHRoZSBob3Jpem9udGFsIGF4aXMgYW5kIHRoZSBjb3VudCBvZiB0aGUgdmFsdWVzIGluIHRoZSB2ZXJ0aWNhbCBheGlzLCB3ZSBvYnRhaW4gYSBiZWxsIHNoYXBlIGN1cnZlLiBUaGUgbWVhbiBvZiB0aGUgZGF0YSBzZXQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG1pZGRsZSBvZiB0aGUgY3VydmUuIEluIHRoZSBncmFwaCwgaGFsZiBvZiB0aGUgdmFsdWVzIGFyZSB0byB0aGUgbGVmdCBvZiB0aGUgbWVhbiwgd2hpbGUgdGhlIG90aGVyIGhhbGYgYXJlIHRvIHRoZSByaWdodC4gSW4gc3RhdGlzdGljcywgdGhpcyBpcyByZWZlcnJlZCB0byBhcyAqKm5vcm1hbCBkaXN0cmlidXRpb24qKiAtIG9yIHRoZSAqKkdhdXNzaWFuIGRpc3RyaWJ1dGlvbioqLgoKVGhlIGdlbmVyYWwgZm9ybXVsYSBmb3IgdGhlICoqbm9ybWFsIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gKFBERikqKiBpcwoKJCRQKFggPSB4OyBcbXUsIFxzaWdtYSkgPSBcZnJhY3sxfXtcc2lnbWEgXHNxcnR7MiBccGl9fSBlXnstXGZyYWN7MX17Mn0gXGxlZnQoIFxmcmFje3ggLSBcbXV9e1xzaWdtYX0gXHJpZ2h0KV4yfSQkCndoZXJlICRYJCBpcyBzb21lICoqY29udGludW91cyByYW5kb20gdmFyaWFibGUqKiwgJFxtdSQgYW5kICRcc2lnbWEkIGFyZSB0aGUgc2hhcGUgcGFyYW1ldGVycyAtIG9yIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgcmVzcGVjdGl2ZWx5LgoKVGhlICoqZXhwZWN0ZWQgdmFsdWUqKiBvciB0aGUgKiptZWFuKiogb2YgdGhlIG5vcm1hbCBQREYgaXMgJEVbWF0gPSBcbXUkLgoKVGhlICoqdmFyaWFuY2UqKiBvZiB0aGUgbm9ybWFsIFBERiBpcyAkVmFyW1hdID0gXHNpZ21hXjIkLgoKVGhlIGZvcnVtYWwgZm9yIHRoZSAqKm5vcm1hbCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiAoY2RmKSoqIGlzCgokJFAoWCBcbGUgazsgXG11LCBcc2lnbWEpID0gXGludF97LVxpbmZ0eX1ee2t9IFxmcmFjezF9e1xzaWdtYSBcc3FydHsyIFxwaX19IGVeey1cZnJhY3sxfXsyfSBcbGVmdCggXGZyYWN7eCAtIFxtdX17XHNpZ21hfSBccmlnaHQpXjJ9IGR4JCQKd2hlcmUgJGskIGlzIGNvbWUgY29udGludW91cyB2YWx1ZS4KCk5vdGljZSB0aGF0IHRoZSAqKnotc2NvcmUqKiB0ZXJtIGlzIHdyaXR0ZW4gaW4gdGhlIGZ1bmN0aW9ucyBhcwoKJCR6ID0gXGZyYWN7eCAtIFxtdX17XHNpZ21hfS4kJAoKVGhlICoqei1zY29yZSoqIGlzIGFsc28gY2FsbGVkIHRoZSBzdGFuZGFyZGl6ZWQgc2NvcmUgZGVzY3JpYmluZyB0aGUgZGlzdGFuY2UgZnJvbSBzb21lIHZhbHVlICR4JCB0byB0aGUgbWVhbiBvZiBhbnkgbm9ybWFsIGRpc3RyYnV0aW9uIHdpdGggbWVhbiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkLiBTdGFuZGFyZGl6YXRpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiBpcyB3aGVuIHdlIHRyYW5zZm9ybSB0aGUgZGF0YSBkaXN0cmlidXRpb24gdG8geWllbGQgJFxtdT0wJCBhbmQgJFxzaWdtYT0xJC4KClIgaGFzIGZvdXIgYnVpbHQtaW4gZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIG5vcm1hbCBkaXN0cmlidXRpb25zLiBUaGV5IGFyZSBkZXRhaWxlZCBmdXJ0aGVyIGRvd24gaW5jbHVkaW5nIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHNldHRpbmdzLgoKYGBgCmRub3JtKHgsIG1lYW4sIHNkKSAjIFBERgpwbm9ybSh4LCBtZWFuLCBzZCkgIyBDREYKcW5vcm0ocCwgbWVhbiwgc2QpICMgcGVyY2VudGlsZXMKcm5vcm0obiwgbWVhbiwgc2QpICMgc2ltdWxhdGlvbnMKYGBgCgogICogYHhgIGlzIGEgdmVjdG9yIG9mIG51bWJlcnMuCgogICogYHBgIGlzIGEgdmVjdG9yIG9mIHByb2JhYmlsaXRpZXMuCgogICogYG5gIGlzIG51bWJlciBvZiBvYnNlcnZhdGlvbnMoc2FtcGxlIHNpemUpLgoKICAqIGBtZWFuYCBpcyB0aGUgbWVhbiB2YWx1ZSBvZiB0aGUgc2FtcGxlIGRhdGEuIEl0J3MgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgoKICAqIGBzZGAgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4gSXQncyBkZWZhdWx0IHZhbHVlIGlzIDEuCgo8YnI+CgojIyMgTm9ybWFsIFBERiAtIGBkbm9ybWAKCkV4YW1wbGU6IFN1cHBvc2UgdGhhdCAkXG11PTEyNSQgYW5kICRcc2lnbWE9MjAkLiBXaGF0IGlzICRQKFggPSAxMDApJD8KCmBgYHtyfQptdSA8LSAxMjUKc2lnbWEgPC0gMjAKeDEgPC0gMTAwCmRub3JtKHgxLG11LHNpZ21hKQpgYGAKICAKIyMjIE5vcm1hbCBDREYgLSBgcG5vcm1gCgpFeGFtcGxlOiBTdXBwb3NlIHRoYXQgJFxtdT0xMjUkIGFuZCAkXHNpZ21hPTIwJC4gV2hhdCBpcyAkUChYIFxsZSAxMDApJD8KCmBgYHtyfQptdSA8LSAxMjUKc2lnbWEgPC0gMjAKeDIgPC0gMTAwCnBub3JtKHgxLG11LHNpZ21hKQpgYGAKClBsb3R0aW5nIHRoZSBQREYuCgpgYGB7ciBmaWcuYXNwPTF9Cm5vcm1UYWlsKG11LCBzaWdtYSwgTSA9IGMoMCx4MiksIGNvbCA9ICJyZWQiKQpgYGAKCiMjIyBOb3JtYWwgUGVyY2VudGlsZXMgLSBgcW5vcm1gCgpFeGFtcGxlOiBXaGF0IGlzIHRoZSAkeCQgdmFsdWUgd2hlbiAkUChYKSA9IDAuMjUkIHdpdGggJFxtdT0xMjUkIGFuZCAkXHNpZ21hPTIwJD8KCmBgYHtyfQpwMyA8LSAwLjI1CnFub3JtKHAzLG11LHNpZ21hKQpgYGAKCkNoZWNraW5nLgoKYGBge3J9CnBub3JtKDExMS41MTAyLG11LHNpZ21hKQpgYGAKCjxicj4KCiMjICoqTWluaSBBY3Rpdml0aWVzKioKCjxicj4KCioqTm90aWZpY2F0aW9uIG9uIGNoYW5nZXMgdG8gdGhlIEhXIGFuZCBMQiBhc3NpZ25tZW50czoqKiBUaGUgbWluaSBhY3Rpdml0aWVzIGJlbG93IGFyZSBkZXNpZ25lZCB0byBiZSBkb25lIGR1cmluZyBsYWIgdGltZS4gVGhlIGFjdHVhbCBsYWIgZXhlcmNpc2VzIGFyZSBub3cgcGFydCBvZiB5b3VyIGhvbWV3b3JrIGFzc2lnbm1lbnQsIHdoaWNoIHdpbGwgYmUgcG9zdGVkIHRvbmlnaHQgaW4gdGhlIFtIb21ld29ya3NdKGh0dHBzOi8vcmVlZC1zdGF0aXN0aWNzLmdpdGh1Yi5pby9tYXRoMTQxLWZhbGwyMDIxL2hvbWV3b3Jrcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9IHBhZ2UuIFRoaXMgbWVhbnMgdGhhdCBldmVyeSB3ZWVrIHlvdSB3aWxsIGhhdmUgYSBIVyBhbmQgTEIgYXNzaWdubWVudCB0b2dldGhlciBhcyBvbmUsIGFuZCBpdCB3aWxsIGJlIGR1ZSBpbiBvbmUgd2Vlay4KCiMjIyBCaW5vbWlhbCBEaXN0cmlidXRpb24KCkxldCB0aGUgZGlzY3JldGUgcmFuZG9tIHZhcmlhYmxlICRYJCB0byBiZSB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NlcyAtIHdpdGggcHJvYmFiaWxpdHkgJHAgPSBcZnJhY3sxfXszfSQgLSBhbmQgbGV0ICRuID0gMTAkIGJlIHRoZSBudW1iZXIgb2YgdHJpYWxzLiBBc3N1bWluZyB0aGUgcmFuZG9tIHZhcmlhYmxlIGZvbGxvd3MgYSBiaW5vbWlhbCBkaXN0cmlidXRpb24sIGNvbXB1dGUgdGhlIGZvbGxvd2luZyBwcm9iYWJpbGl0aWVzIGFuZCBoaWdobGlnaHQgdGhlIGFwcHJvcHJpYXRlIHJlZ2lvbihzKSBpbiB0aGUgcGxvdC4KCjEuICRQKFggPSAyKSQKCjIuICRQKFggXGxlIDIpJAoKMy4gJFAoWCBcZ2UgMikkCgo0LiAkUCgyIFxsZSBYIFxsZSA0KSQKCjUuICRQKFggPSAyIFxjdXAgWCA9IDQpJAoKNi4gJFAoWCA9IDIgXGNhcCBYID0gNCkkCgo3LiAkUChYIFxsZSB4KSA9IDAuMjUkCgo4LiAkUChYIFxnZSB4KSA9IDAuMjUkCgo8YnI+CgojIyMgTm9ybWFsIERpc3RyaWJ1dGlvbgoKU3VwcG9zZSB0aGF0IHRoZSByYW5kb20gdmFyaWFibGUgJFgkIGZvbGxvd3MgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggJFxtdSA9IDEwJCBhbmQgJFxzaWdtYT01JCwgY29tcHV0ZSB0aGUgZm9sbG93aW5nIHByb2JhYmlsaXRpZXMgYW5kIGhpZ2hsaWdodCB0aGUgYXBwcm9wcmlhdGUgcmVnaW9uKHMpIGluIHRoZSBwbG90LgoKMS4gJFAoWCA9IDgpJAoKMi4gJFAoWCBcbGUgMTEpJAoKMy4gJFAoWCBcZ2UgMTEpJAoKNC4gJFAoOCBcbGUgWCBcbGUgMTEpJAoKNS4gJFAoWCA9IDggXGN1cCBYID0gMTEpJAoKNi4gJFAoWCA9IDggXGNhcCBYID0gOSkkCgo3LiAkUChYIFxsZSB4KSA9IDAuMTAkCgo4LiAkUChYIFxnZSB4KSA9IDAuMTAkCgo5LiBXaGF0IGlzIHRoZSBjb3JyZXNwb25kaW5nIHotc2NvcmUgZm9yICRQKFggPSA4KSQ/CgoxMC4gV2hhdCBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgei1zY29yZXMgZm9yICRQKDggXGxlIFggXGxlIDExKSQ/Cgo8YnI+Cg==