The R code is hidden by default. Please click on Show to view all codes. Thank you.

Assignment 1

Question 1.

Import Data and load libraries from URL: https://bgreenwell.github.io/uc-bana7052/data/alumni.csv

url <- "https://bgreenwell.github.io/uc-bana7052/data/alumni.csv"
alumni <- read.csv(url)
str(alumni)
attach(alumni)
library(tidyverse)

a) Start with a basic exploratory data analysis. Show summary statistics of the response variable and predictor variable.

The summary statistics of variable Percent_of_Classes_Under_20 (X variable) is displayed below - the predictor variable (percent_of_classes_under_20) has a median of 59.5 and a mean of 55.73. Standard Deviation is 13.19. Minimum value is 29 and the maximum value is 77.

summary(percent_of_classes_under_20)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  29.00   44.75   59.50   55.73   66.25   77.00 
sd(percent_of_classes_under_20)
[1] 13.19371

The summary statistics of variable Alumni_Giving_Rate (Y variable) is displayed below - the response variable (alumni_giving_rate) has a median of 29 and a mean of 29.27. Standard deviation of 13.44. The minimum value is 7 and the maximum value is 67.

summary(alumni_giving_rate)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   7.00   18.75   29.00   29.27   38.50   67.00 
sd(alumni_giving_rate)
[1] 13.44135

b) What is the nature of the variables X and Y? Are there “outliers” in the data; how might you define an outlier in this case? What is the correlation coefficient? Draw a scatter plot. Any major comments about the data?

cor.test(percent_of_classes_under_20, alumni_giving_rate)

    Pearson's product-moment correlation

data:  percent_of_classes_under_20 and alumni_giving_rate
t = 5.7344, df = 46, p-value = 7.228e-07
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.4427365 0.7856553
sample estimates:
      cor 
0.6456504 

Based on the Pearson’s correlation test, we can see that X and Y has a positive liner correlation. The correlation value is about 0.6457. Also the p-value is less than the type 1 error threshold of 0.05, so we can see that X and Y are strongly associated.

ggplot(alumni, aes(percent_of_classes_under_20, alumni_giving_rate)) +
  geom_point() +
  geom_smooth(method = "lm") +
  labs(title = "Correlation between Percent of Class Under 20 and Giving Rate",
        x = "Percent of Class Under 20",
        y = "Alumni Giving Rate")

From the graphic above, I used a scatter point and a linear model to identify if there are outliers. we can see that there are outliers in this data. I would identify the outliers as points that are strongly deviated away from the trend line.

c) Fit a simple linear regression to the data. What is your estimated regression equation?

To fit a simple linear regression, we will need \(\beta_0\) and \(\beta_1\) as the Simple Linear Regression is \(Y\) = \(\beta_0\) + \(\beta_1\)\(X\) + \(\epsilon\).

To find \(\beta_0\) and \(\beta_1\), I will use the lm() in R.

fit <- lm(alumni_giving_rate ~ percent_of_classes_under_20, data = alumni)
summary(fit)

Call:
lm(formula = alumni_giving_rate ~ percent_of_classes_under_20, 
    data = alumni)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.053  -7.158  -1.660   6.734  29.658 

Coefficients:
                            Estimate Std. Error t value Pr(>|t|)    
(Intercept)                  -7.3861     6.5655  -1.125    0.266    
percent_of_classes_under_20   0.6578     0.1147   5.734 7.23e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.38 on 46 degrees of freedom
Multiple R-squared:  0.4169,    Adjusted R-squared:  0.4042 
F-statistic: 32.88 on 1 and 46 DF,  p-value: 7.228e-07

We can see that the intercept \(\beta_0\) is 37.1786 and the slope \(\beta_1\) is 0.6338. So the estimated regression equation could be \(\hat{Y}\) = -7.3861 + 0.66\(X\)

d) Interpret your results (e.g., how would you interpret the slope in this application?).

There is a positive linear relationship between the two variables. The average giving rate will increase by an estimated 0.6338 percent for every percentage increase on the Percent of Class Under 20.

Question 2: A Simulation Study (Simple Linear Regression). Assuming the mean response is E(Y|X)=10+5X:

**a) Generate data with X∼N(μ=2,σ=0.1), sample size n=100, and error term ϵ∼N(μ=0,σ=0.5).

set.seed(7052)
x <- rnorm(100, mean = 2, sd = 0.1)
error <- rnorm(100, mean = 0, sd = 0.5)
y <- 10 + 5 * x + error
data <- data.frame(x, y)
head(data)

b) Show summary statistics of the response variable and predictor variable. Are there outliers? What is the correlation coefficient? Draw a scatter plot.

Below are the summary statistics of response variable y and predictor variable x.

summary(data)
       x               y        
 Min.   :1.725   Min.   :18.09  
 1st Qu.:1.923   1st Qu.:19.67  
 Median :2.001   Median :20.11  
 Mean   :2.004   Mean   :20.17  
 3rd Qu.:2.070   3rd Qu.:20.70  
 Max.   :2.243   Max.   :21.80  
ggplot(data, aes(x, y)) +
  geom_point() +
  geom_smooth(method = "lm") 

From the graph above, we can see there are a few outliers, some points are far away from the trend line.

cor(x, y, method = "pearson")
[1] 0.8042198

The correlation coefficient is 0.8042.

c) Fit a simple linear regression. What is the estimated model? Report the estimated coefficients. What is the model mean squared error (MSE)?

The fitted SLR model and coefficients are below. The coefficients intercept is 9.022, and the slope is 5.565.

fit2 <- lm( y ~ x, data)
print(fit2)

Call:
lm(formula = y ~ x, data = data)

Coefficients:
(Intercept)            x  
      9.022        5.565  
coef(fit2)
(Intercept)           x 
   9.021796    5.565160 
sigma(fit2)^2
[1] 0.2032934

The MSE is 0.203.

d) What is the sample mean of both X and Y? Plot the fitted regression line and the point \((\bar{X}, \bar{Y})\). What do you find?

summary(data)
       x               y        
 Min.   :1.725   Min.   :18.09  
 1st Qu.:1.923   1st Qu.:19.67  
 Median :2.001   Median :20.11  
 Mean   :2.004   Mean   :20.17  
 3rd Qu.:2.070   3rd Qu.:20.70  
 Max.   :2.243   Max.   :21.80  

From the summary statistics, we can see the sample mean of X is 2.004, and the sample mean for Y is 20.17.

plot(x, y, pch = 19)
abline(fit2, col = "darkorange", lwd = 2)
xbar <- mean(data$x)
ybar <- mean(data$y)
points(xbar, ybar, pch = 19, col = "blue", cex = 1.5)
text(xbar, ybar, label = expression(paste("(", xbar, ",", ybar, ")")), pos = 4, col = "blue")

From the graph above, we can find that the LS regression line passes through the point (xbar, ybar).

Question 3. Ordinary least squares (OLS) is typically used to estimate the regression coefficients β_0 and β_1 in the simple linear regression model by minimizing the residual sum of squares (RSS)

a) How about minimizing \(\sum_{i=1}^n (Y_i - \beta_0 - \beta_1 X_i) = \sum_{i-1}^n \epsilon_i\)

Minimizing the sum of residuals doesn’t work well for regression because the residuals can cancel each other out. For example, when one of the residuals is positive and another one is positive, it can cancel each other out.

b) How about minimizing \(\sum_{i=1}^n |Y_i - \beta_0 - \beta_1 X_i| = \sum_{i-1}^n |\epsilon_i|\)

While it is an alternative to OLS, it’s not recommended because it leads to non-differentiable objective functions and makes the optimization process more complex.

c) Why is OLS a popular choice for estimating \(\beta_0\) and \(\beta_1\)?

The reason to use the OLS for estimating \(\beta_0\) and \(\beta_1\) is that it’s the best unbiased linear estimator, we also call it BLUE.

Question 4: Establish the following relationships for the simple linear regression model.

a) The fitted line passes through the point \((\bar{X},\bar{Y})\)

substitude \(X = \bar{X}\) to the fitted regression line: \(\hat{Y_i} = \hat{\beta_0} + \hat{\beta_1} X_i\).

$ = + X = + _{X}

\(\hat{Y} = \bar{Y}\)

b) \(\sum_{i=1}^n e_i = 0\)

Fitted regression line: \(\hat{Y_i} = \hat{\beta_0} + \hat{\beta_1} X_i\)

each point i is: \(e_i = Y_i - \hat{Y_i} = Y_i - (\hat{\beta_0} + \hat{\beta_1} X_i)\)

to show if the sum of \(e_i\) is zero, substitute the expression for \(\hat{Y_i}\)

\(\sum_{i=1}^n e_i = \sum_{i=1}^n Y_i - n \hat{\beta_0} - \hat{\beta_1} n \bar{X}\) \(\hat{\beta_0} = \bar{Y} - \hat{\beta_1} \bar{X}\)

so: \(\sum_{i=1}^n e_i =n \bar{Y} - n \bar{Y} + \hat{\beta_1} n \bar{X} - \hat{\beta_1} n \bar{X} = 0\)

c) \(\sum_{i=1}^n Y_i = \sum_{i=1}^n \hat{Y_i}\)

Fitted regression line: \(\hat{Y_i} = \hat{\beta_0} + \hat{\beta_1} X_i\)

\(\sum_{i=1}^n Y_i = \sum_{i=1}^n (\hat{\beta_0} + \hat{\beta_1} X+i) = \hat{\beta_0} \sum_{i=1}^n 1 + \hat{\beta_1} \sum_{i=1}^n X_i\)

\(\sum_{i=1}^n Y_i = n \hat{\beta_0} + \hat{\beta_1} n \bar{X}\)

\(\hat{\beta_0} = \bar{Y} - \hat{\beta_1} \bar{X}\)

\(\sum_{i=1}^n Y_i = n \bar{Y} - \hat{\beta_1} n \bar{X} + \hat{\beta_1} n \bar{X} = n \bar{Y}\)

since \(\bar{Y}\) is the mean of the observed \(Y_i\) values, so:

\(\sum_{i=1}^n Y_i = n \bar{Y} = \sum_{i=1}^n \bar{Y_i}\)

d) \(\sum_{i=1}^n X_i e_i = 0\)

We already approved that \(\sum_{i=1}^n e_i = 0\).

\(\sum_{i=1}^n X_i e_i = X_i \sum_{i=1}^n e_i = X_i * 0 = 0\)

e) \(\sum_{i=1}^n \hat{Y_i} e_i = 0\)

We already approved that \(\sum_{i=1}^n e_i = 0\). \(\sum_{i=1}^n Y_i e_i = Y_i \sum_{i=1}^n e_i = Y_i * 0 = 0\)

f) \(\sum_{i=1}^n e_i^2\) is minimized

The regression line is the best linear approximation of the data, the least squares approach provides the best linear unbiased estimators under the assumption of the linear regression model.

LS0tCnRpdGxlOiAiQkFOQTcwNTJfQXNzaWdubWVudDFfUkZpc2NoZXIiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKVGhlIFIgY29kZSBpcyBoaWRkZW4gYnkgZGVmYXVsdC4gUGxlYXNlIGNsaWNrIG9uIFNob3cgdG8gdmlldyBhbGwgY29kZXMuIFRoYW5rIHlvdS4KCiMjIyBBc3NpZ25tZW50IDEKCiMjIyMgUXVlc3Rpb24gMS4KSW1wb3J0IERhdGEgYW5kIGxvYWQgbGlicmFyaWVzIGZyb20gVVJMOiBodHRwczovL2JncmVlbndlbGwuZ2l0aHViLmlvL3VjLWJhbmE3MDUyL2RhdGEvYWx1bW5pLmNzdgpgYGB7ciBJbXBvcnQgRGF0YSBBbHVtbml9CnVybCA8LSAiaHR0cHM6Ly9iZ3JlZW53ZWxsLmdpdGh1Yi5pby91Yy1iYW5hNzA1Mi9kYXRhL2FsdW1uaS5jc3YiCmFsdW1uaSA8LSByZWFkLmNzdih1cmwpCnN0cihhbHVtbmkpCmF0dGFjaChhbHVtbmkpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCioqYSkgU3RhcnQgd2l0aCBhIGJhc2ljIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzaXMuIFNob3cgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBhbmQgcHJlZGljdG9yIHZhcmlhYmxlLioqCgpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHZhcmlhYmxlIFBlcmNlbnRfb2ZfQ2xhc3Nlc19VbmRlcl8yMCAoWCB2YXJpYWJsZSkgaXMgZGlzcGxheWVkIGJlbG93IC0gdGhlIHByZWRpY3RvciB2YXJpYWJsZSAocGVyY2VudF9vZl9jbGFzc2VzX3VuZGVyXzIwKSBoYXMgYSBtZWRpYW4gb2YgNTkuNSBhbmQgYSBtZWFuIG9mIDU1LjczLiBTdGFuZGFyZCBEZXZpYXRpb24gaXMgMTMuMTkuIE1pbmltdW0gdmFsdWUgaXMgMjkgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDc3LgoKYGBge3Igc3VtbWFyeSBzdGF0aXN0aWNzIHN1bW1hcnkgeH0Kc3VtbWFyeShwZXJjZW50X29mX2NsYXNzZXNfdW5kZXJfMjApCnNkKHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCkKYGBgCgpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHZhcmlhYmxlIEFsdW1uaV9HaXZpbmdfUmF0ZSAoWSB2YXJpYWJsZSkgaXMgZGlzcGxheWVkIGJlbG93IC0gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChhbHVtbmlfZ2l2aW5nX3JhdGUpIGhhcyBhIG1lZGlhbiBvZiAyOSBhbmQgYSBtZWFuIG9mIDI5LjI3LiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgMTMuNDQuIFRoZSBtaW5pbXVtIHZhbHVlIGlzIDcgYW5kIHRoZSBtYXhpbXVtIHZhbHVlIGlzIDY3LgoKYGBge3Igc3VtbWFyeSB5fQpzdW1tYXJ5KGFsdW1uaV9naXZpbmdfcmF0ZSkKc2QoYWx1bW5pX2dpdmluZ19yYXRlKQpgYGAKCioqYikgV2hhdCBpcyB0aGUgbmF0dXJlIG9mIHRoZSB2YXJpYWJsZXMgWCBhbmQgWT8gQXJlIHRoZXJlIOKAnG91dGxpZXJz4oCdIGluIHRoZSBkYXRhOyBob3cgbWlnaHQgeW91IGRlZmluZSBhbiBvdXRsaWVyIGluIHRoaXMgY2FzZT8gV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQ/IERyYXcgYSBzY2F0dGVyIHBsb3QuIEFueSBtYWpvciBjb21tZW50cyBhYm91dCB0aGUgZGF0YT8qKgoKYGBge3IgY29ycmVsYXRpb24gYmV0d2VlbiB4IGFuZCB5fQpjb3IudGVzdChwZXJjZW50X29mX2NsYXNzZXNfdW5kZXJfMjAsIGFsdW1uaV9naXZpbmdfcmF0ZSkKYGBgCgpCYXNlZCBvbiB0aGUgUGVhcnNvbidzIGNvcnJlbGF0aW9uIHRlc3QsIHdlIGNhbiBzZWUgdGhhdCBYIGFuZCBZIGhhcyBhIHBvc2l0aXZlIGxpbmVyIGNvcnJlbGF0aW9uLiBUaGUgY29ycmVsYXRpb24gdmFsdWUgaXMgYWJvdXQgMC42NDU3LiBBbHNvIHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgdHlwZSAxIGVycm9yIHRocmVzaG9sZCBvZiAwLjA1LCBzbyB3ZSBjYW4gc2VlIHRoYXQgWCBhbmQgWSBhcmUgc3Ryb25nbHkgYXNzb2NpYXRlZC4KCmBgYHtyIGZpZzEsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJ30KZ2dwbG90KGFsdW1uaSwgYWVzKHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCwgYWx1bW5pX2dpdmluZ19yYXRlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIGxhYnModGl0bGUgPSAiQ29ycmVsYXRpb24gYmV0d2VlbiBQZXJjZW50IG9mIENsYXNzIFVuZGVyIDIwIGFuZCBHaXZpbmcgUmF0ZSIsCiAgICAgICAgeCA9ICJQZXJjZW50IG9mIENsYXNzIFVuZGVyIDIwIiwKICAgICAgICB5ID0gIkFsdW1uaSBHaXZpbmcgUmF0ZSIpCmBgYAoKRnJvbSB0aGUgZ3JhcGhpYyBhYm92ZSwgSSB1c2VkIGEgc2NhdHRlciBwb2ludCBhbmQgYSBsaW5lYXIgbW9kZWwgdG8gaWRlbnRpZnkgaWYgdGhlcmUgYXJlIG91dGxpZXJzLiB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgYXJlIG91dGxpZXJzIGluIHRoaXMgZGF0YS4gSSB3b3VsZCBpZGVudGlmeSB0aGUgb3V0bGllcnMgYXMgcG9pbnRzIHRoYXQgYXJlIHN0cm9uZ2x5IGRldmlhdGVkIGF3YXkgZnJvbSB0aGUgdHJlbmQgbGluZS4KCioqYykgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIHRvIHRoZSBkYXRhLiBXaGF0IGlzIHlvdXIgZXN0aW1hdGVkIHJlZ3Jlc3Npb24gZXF1YXRpb24/KioKClRvIGZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiwgd2Ugd2lsbCBuZWVkICRcYmV0YV8wJCBhbmQgJFxiZXRhXzEkIGFzIHRoZSBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24gaXMgJFkkID0gJFxiZXRhXzAkICsgJFxiZXRhXzEkJFgkICsgJFxlcHNpbG9uJC4KClRvIGZpbmQgJFxiZXRhXzAkIGFuZCAkXGJldGFfMSQsIEkgd2lsbCB1c2UgdGhlIGBsbSgpYCBpbiBSLgpgYGB7ciBsaW5lYXIgbW9kZWwgMX0KZml0IDwtIGxtKGFsdW1uaV9naXZpbmdfcmF0ZSB+IHBlcmNlbnRfb2ZfY2xhc3Nlc191bmRlcl8yMCwgZGF0YSA9IGFsdW1uaSkKc3VtbWFyeShmaXQpCmBgYApXZSBjYW4gc2VlIHRoYXQgdGhlIGludGVyY2VwdCAkXGJldGFfMCQgaXMgMzcuMTc4NiBhbmQgdGhlIHNsb3BlICRcYmV0YV8xJCBpcyAwLjYzMzguIFNvIHRoZSBlc3RpbWF0ZWQgcmVncmVzc2lvbiBlcXVhdGlvbiBjb3VsZCBiZSAkXGhhdHtZfSQgPSAtNy4zODYxICsgMC42NiRYJAoKKipkKSBJbnRlcnByZXQgeW91ciByZXN1bHRzIChlLmcuLCBob3cgd291bGQgeW91IGludGVycHJldCB0aGUgc2xvcGUgaW4gdGhpcyBhcHBsaWNhdGlvbj8pLioqCgpUaGVyZSBpcyBhIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gVGhlIGF2ZXJhZ2UgZ2l2aW5nIHJhdGUgd2lsbCBpbmNyZWFzZSBieSBhbiBlc3RpbWF0ZWQgMC42MzM4IHBlcmNlbnQgZm9yIGV2ZXJ5IHBlcmNlbnRhZ2UgaW5jcmVhc2Ugb24gdGhlIFBlcmNlbnQgb2YgQ2xhc3MgVW5kZXIgMjAuCgojIyMgUXVlc3Rpb24gMjogQSBTaW11bGF0aW9uIFN0dWR5IChTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24pLiBBc3N1bWluZyB0aGUgbWVhbiByZXNwb25zZSBpcyBFKFl8WCk9MTArNVg6CgoqKmEpIEdlbmVyYXRlIGRhdGEgd2l0aCBY4oi8TijOvD0yLM+DPTAuMSksIHNhbXBsZSBzaXplIG49MTAwLCBhbmQgZXJyb3IgdGVybSDPteKIvE4ozrw9MCzPgz0wLjUpLiAKCmBgYHtyIGdlbmVyYXRlIGRhdGFzZXR9CnNldC5zZWVkKDcwNTIpCnggPC0gcm5vcm0oMTAwLCBtZWFuID0gMiwgc2QgPSAwLjEpCmVycm9yIDwtIHJub3JtKDEwMCwgbWVhbiA9IDAsIHNkID0gMC41KQp5IDwtIDEwICsgNSAqIHggKyBlcnJvcgpkYXRhIDwtIGRhdGEuZnJhbWUoeCwgeSkKaGVhZChkYXRhKQpgYGAKCioqYikgU2hvdyBzdW1tYXJ5IHN0YXRpc3RpY3Mgb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGFuZCBwcmVkaWN0b3IgdmFyaWFibGUuIEFyZSB0aGVyZSBvdXRsaWVycz8gV2hhdCBpcyB0aGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQ/IERyYXcgYSBzY2F0dGVyIHBsb3QuKioKCkJlbG93IGFyZSB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHJlc3BvbnNlIHZhcmlhYmxlIHkgYW5kIHByZWRpY3RvciB2YXJpYWJsZSB4LgoKYGBge3Igc3VtbWFyeSBvZiB0aGUgZGF0YX0Kc3VtbWFyeShkYXRhKQpgYGAKCmBgYHtyIHBsb3QgdGhlIGRhdGFzZXQgdXNpbmcgZ2dwbG90LCBvdXQud2lkdGg9JzY1JScsIGZpZy5hbGlnbj0iY2VudGVyIn0KZ2dwbG90KGRhdGEsIGFlcyh4LCB5KSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgCmBgYAoKRnJvbSB0aGUgZ3JhcGggYWJvdmUsIHdlIGNhbiBzZWUgdGhlcmUgYXJlIGEgZmV3IG91dGxpZXJzLCBzb21lIHBvaW50cyBhcmUgZmFyIGF3YXkgZnJvbSB0aGUgdHJlbmQgbGluZS4KCmBgYHtyIGNvcnJlbGF0aW9uIGJldHdlZW4geCBhbmQgeSBpbiBkYXRhfQpjb3IoeCwgeSwgbWV0aG9kID0gInBlYXJzb24iKQpgYGAKClRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBpcyAwLjgwNDIuCgoqKmMpIEZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbi4gV2hhdCBpcyB0aGUgZXN0aW1hdGVkIG1vZGVsPyBSZXBvcnQgdGhlIGVzdGltYXRlZCBjb2VmZmljaWVudHMuIFdoYXQgaXMgdGhlIG1vZGVsIG1lYW4gc3F1YXJlZCBlcnJvciAoTVNFKT8qKgoKVGhlIGZpdHRlZCBTTFIgbW9kZWwgYW5kIGNvZWZmaWNpZW50cyBhcmUgYmVsb3cuIFRoZSBjb2VmZmljaWVudHMgaW50ZXJjZXB0IGlzIDkuMDIyLCBhbmQgdGhlIHNsb3BlIGlzIDUuNTY1LgoKYGBge3IgbGluZWFyIHJlZ3Jlc3Npb24gZm9yIGRhdGF9CmZpdDIgPC0gbG0oIHkgfiB4LCBkYXRhKQpwcmludChmaXQyKQpjb2VmKGZpdDIpCmBgYAoKYGBge3IgTVNFIG9mIGRhdGF9CnNpZ21hKGZpdDIpXjIKYGBgCgpUaGUgTVNFIGlzIDAuMjAzLgoKKipkKSBXaGF0IGlzIHRoZSBzYW1wbGUgbWVhbiBvZiBib3RoIFggYW5kIFk/IFBsb3QgdGhlIGZpdHRlZCByZWdyZXNzaW9uIGxpbmUgYW5kIHRoZSBwb2ludCAkKFxiYXJ7WH0sIFxiYXJ7WX0pJC4gV2hhdCBkbyB5b3UgZmluZD8qKgoKYGBge3J9CnN1bW1hcnkoZGF0YSkKYGBgCgpGcm9tIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MsIHdlIGNhbiBzZWUgdGhlIHNhbXBsZSBtZWFuIG9mIFggaXMgMi4wMDQsIGFuZCB0aGUgc2FtcGxlIG1lYW4gZm9yIFkgaXMgMjAuMTcuCgpgYGB7ciBhYmxpbmUgZGF0YSwgb3V0LndpZHRoPSc2NSUnLCBmaWcuYWxpZ249ImNlbnRlciJ9CnBsb3QoeCwgeSwgcGNoID0gMTkpCmFibGluZShmaXQyLCBjb2wgPSAiZGFya29yYW5nZSIsIGx3ZCA9IDIpCnhiYXIgPC0gbWVhbihkYXRhJHgpCnliYXIgPC0gbWVhbihkYXRhJHkpCnBvaW50cyh4YmFyLCB5YmFyLCBwY2ggPSAxOSwgY29sID0gImJsdWUiLCBjZXggPSAxLjUpCnRleHQoeGJhciwgeWJhciwgbGFiZWwgPSBleHByZXNzaW9uKHBhc3RlKCIoIiwgeGJhciwgIiwiLCB5YmFyLCAiKSIpKSwgcG9zID0gNCwgY29sID0gImJsdWUiKQpgYGAKCkZyb20gdGhlIGdyYXBoIGFib3ZlLCB3ZSBjYW4gZmluZCB0aGF0IHRoZSBMUyByZWdyZXNzaW9uIGxpbmUgcGFzc2VzIHRocm91Z2ggdGhlIHBvaW50ICh4YmFyLCB5YmFyKS4KCiMjIyBRdWVzdGlvbiAzLiBPcmRpbmFyeSBsZWFzdCBzcXVhcmVzIChPTFMpIGlzIHR5cGljYWxseSB1c2VkIHRvIGVzdGltYXRlIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyDOsl8wIGFuZCDOsl8xIGluIHRoZSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgYnkgbWluaW1pemluZyB0aGUgcmVzaWR1YWwgc3VtIG9mIHNxdWFyZXMgKFJTUykKCioqYSkgCUhvdyBhYm91dCBtaW5pbWl6aW5nICRcc3VtX3tpPTF9Xm4gKFlfaSAtIFxiZXRhXzAgLSBcYmV0YV8xIFhfaSkgPSBcc3VtX3tpLTF9Xm4gXGVwc2lsb25faSQqKgoKTWluaW1pemluZyB0aGUgc3VtIG9mIHJlc2lkdWFscyBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgcmVncmVzc2lvbiBiZWNhdXNlIHRoZSByZXNpZHVhbHMgY2FuIGNhbmNlbCBlYWNoIG90aGVyIG91dC4gRm9yIGV4YW1wbGUsIHdoZW4gb25lIG9mIHRoZSByZXNpZHVhbHMgaXMgcG9zaXRpdmUgYW5kIGFub3RoZXIgb25lIGlzIHBvc2l0aXZlLCBpdCBjYW4gY2FuY2VsIGVhY2ggb3RoZXIgb3V0LgoKKipiKSAJSG93IGFib3V0IG1pbmltaXppbmcgJFxzdW1fe2k9MX1ebiB8WV9pIC0gXGJldGFfMCAtIFxiZXRhXzEgWF9pfCA9IFxzdW1fe2ktMX1ebiB8XGVwc2lsb25faXwkKioKCldoaWxlIGl0IGlzIGFuIGFsdGVybmF0aXZlIHRvIE9MUywgaXQncyBub3QgcmVjb21tZW5kZWQgYmVjYXVzZSBpdCBsZWFkcyB0byBub24tZGlmZmVyZW50aWFibGUgb2JqZWN0aXZlIGZ1bmN0aW9ucyBhbmQgbWFrZXMgdGhlIG9wdGltaXphdGlvbiBwcm9jZXNzIG1vcmUgY29tcGxleC4KCioqYykgCVdoeSBpcyBPTFMgYSBwb3B1bGFyIGNob2ljZSBmb3IgZXN0aW1hdGluZyAkXGJldGFfMCQgYW5kICRcYmV0YV8xJD8qKgoKVGhlIHJlYXNvbiB0byB1c2UgdGhlIE9MUyBmb3IgZXN0aW1hdGluZyAkXGJldGFfMCQgYW5kICRcYmV0YV8xJCBpcyB0aGF0IGl0J3MgdGhlIGJlc3QgdW5iaWFzZWQgbGluZWFyIGVzdGltYXRvciwgd2UgYWxzbyBjYWxsIGl0IEJMVUUuCgojIyMgUXVlc3Rpb24gNDogRXN0YWJsaXNoIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gCgoqKmEpIAlUaGUgZml0dGVkIGxpbmUgcGFzc2VzIHRocm91Z2ggdGhlIHBvaW50ICQoXGJhcntYfSxcYmFye1l9KSQqKgoKc3Vic3RpdHVkZSAkWCA9IFxiYXJ7WH0kIHRvIHRoZSBmaXR0ZWQgcmVncmVzc2lvbiBsaW5lOiAkXGhhdHtZX2l9ID0gXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWF9pJC4KCiRcaGF0e1l9ID0gXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWCA9IFxoYXR7XGJldGFfMH0gKyBcaGF0e1xiZXRhXzF9IFxiYXJfe1h9CgokXGhhdHtZfSA9IFxiYXJ7WX0kCgoqKmIpICRcc3VtX3tpPTF9Xm4gZV9pID0gMCQgKioKCkZpdHRlZCByZWdyZXNzaW9uIGxpbmU6ICRcaGF0e1lfaX0gPSBcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBYX2kkCgplYWNoIHBvaW50IGkgaXM6ICRlX2kgPSBZX2kgLSBcaGF0e1lfaX0gPSBZX2kgLSAoXGhhdHtcYmV0YV8wfSArIFxoYXR7XGJldGFfMX0gWF9pKSQKCnRvIHNob3cgaWYgdGhlIHN1bSBvZiAkZV9pJCBpcyB6ZXJvLCBzdWJzdGl0dXRlIHRoZSBleHByZXNzaW9uIGZvciAkXGhhdHtZX2l9JAoKJFxzdW1fe2k9MX1ebiBlX2kgPSBcc3VtX3tpPTF9Xm4gWV9pIC0gbiBcaGF0e1xiZXRhXzB9IC0gXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0kCiRcaGF0e1xiZXRhXzB9ID0gXGJhcntZfSAtIFxoYXR7XGJldGFfMX0gXGJhcntYfSQKCnNvOiAkXHN1bV97aT0xfV5uIGVfaSA9biBcYmFye1l9IC0gbiBcYmFye1l9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0gLSBcaGF0e1xiZXRhXzF9IG4gXGJhcntYfSA9IDAkCgoqKmMpICRcc3VtX3tpPTF9Xm4gWV9pID0gXHN1bV97aT0xfV5uIFxoYXR7WV9pfSQqKgoKRml0dGVkIHJlZ3Jlc3Npb24gbGluZTogJFxoYXR7WV9pfSA9IFxoYXR7XGJldGFfMH0gKyBcaGF0e1xiZXRhXzF9IFhfaSQKCiRcc3VtX3tpPTF9Xm4gWV9pID0gXHN1bV97aT0xfV5uIChcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBYK2kpID0gXGhhdHtcYmV0YV8wfSBcc3VtX3tpPTF9Xm4gMSArIFxoYXR7XGJldGFfMX0gXHN1bV97aT0xfV5uIFhfaSQKCiRcc3VtX3tpPTF9Xm4gWV9pID0gbiBcaGF0e1xiZXRhXzB9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0kCgokXGhhdHtcYmV0YV8wfSA9IFxiYXJ7WX0gLSBcaGF0e1xiZXRhXzF9IFxiYXJ7WH0kCgokXHN1bV97aT0xfV5uIFlfaSA9IG4gXGJhcntZfSAtIFxoYXR7XGJldGFfMX0gbiBcYmFye1h9ICsgXGhhdHtcYmV0YV8xfSBuIFxiYXJ7WH0gPSBuIFxiYXJ7WX0kCgpzaW5jZSAkXGJhcntZfSQgaXMgdGhlIG1lYW4gb2YgdGhlIG9ic2VydmVkICRZX2kkIHZhbHVlcywgc286CgokXHN1bV97aT0xfV5uIFlfaSA9IG4gXGJhcntZfSA9IFxzdW1fe2k9MX1ebiBcYmFye1lfaX0kCgoKKipkKSAkXHN1bV97aT0xfV5uIFhfaSBlX2kgPSAwJCoqCgpXZSBhbHJlYWR5IGFwcHJvdmVkIHRoYXQgJFxzdW1fe2k9MX1ebiBlX2kgPSAwJC4KCiRcc3VtX3tpPTF9Xm4gWF9pIGVfaSA9IFhfaSBcc3VtX3tpPTF9Xm4gZV9pID0gWF9pICogMCA9IDAkCgoqKmUpICRcc3VtX3tpPTF9Xm4gXGhhdHtZX2l9IGVfaSA9IDAkKioKCldlIGFscmVhZHkgYXBwcm92ZWQgdGhhdCAkXHN1bV97aT0xfV5uIGVfaSA9IDAkLgokXHN1bV97aT0xfV5uIFlfaSBlX2kgPSBZX2kgXHN1bV97aT0xfV5uIGVfaSA9IFlfaSAqIDAgPSAwJAoKKipmKSAkXHN1bV97aT0xfV5uIGVfaV4yJCBpcyBtaW5pbWl6ZWQqKgoKVGhlIHJlZ3Jlc3Npb24gbGluZSBpcyB0aGUgYmVzdCBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiB0aGUgZGF0YSwgdGhlIGxlYXN0IHNxdWFyZXMgYXBwcm9hY2ggcHJvdmlkZXMgdGhlIGJlc3QgbGluZWFyIHVuYmlhc2VkIGVzdGltYXRvcnMgdW5kZXIgdGhlIGFzc3VtcHRpb24gb2YgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLgoKCgoKCgo=