Linear regression, a very simple approach for supervised learning. A useful tool for predicting a quantitative response.

3.1 Simple Linear Regression

Regression Equation:

YB0 + B1(X)

B0 and B1 represent the intercept and slope terms in the linear model. They are the model coefficients or parameters.

3.1.1 Estimating the Coefficients

Fitting a line is typically done by minimizing the least squares criterion.

Residual– is the difference between the ith observed response value and the ith response value that is predicted by our linear model.

Thus, the Residual Sum of Squares (RSS) is simply the sum of the squared residuals.

RSS = e21 + e22 + … + e2n

3.1.2 Assessing the Accuracy of the Coefficient Estimates

Approximating f as a linear function, we can write this relationship as:

Y = B0 + B1(X) + E

Where: B0 is the intercept term–the expected value of Y when X = 0.

and

B1 is the slope–the average increase in Y associated with a one-unit increase in X.

The error is a catch-all for what we miss with this simple model: the true relationship is probably not linear, there may be other variables that cause variation in Y, and there may be measurement error.

"An unbiased estimator does not systematically over- or under-estimate the true parameter.

The standard error tells us approximately how much our estimate of a given parameter, mean, etc.is an over/under estimation.

It is equal to the standard deviation divided by the sample size.

Thus, the simplest and most effective way to reduce the standard error is to increase the sample size.

Standard errors are used to compute confidence intervals.

P-value:

“Roughly speaking, we interpret the p-value as follows: a small p-value indicates that it is unlikely to observe such a substantial association between the predictor and the response due to chance, in the absence of any real association between the predictor and the response. Hence, if we see a small p-value, then we can infer that there is an association between the predictor and the response.”

3.1.3 Assessing the Accuracy of the Model

“How well does the model fit the data?”

"The quality of a linear regression fit is typically assessed using two related quantities:

  1. Residual Standard Error
  2. R2 Statistic

Residual Standard Error

Is an estimate of the standard deviation of E. Roughly speaking, it is the average amount that the response will deviate from the true regression line.

It is a measure of lack of fit of the model to the data.

R2 Statistic

The R2 statistic takes the form of a proportion–the proportion of variance explained.

R2 = 1 - (RSS/TSS)

3.2 Multiple Linear Regression

“Extends the simple linear regression model so that it can directly accomodate multiple predictors.”

The multiple linear regression model:

Y = B0 + B1X1 + B2X2 + … BpXp + E

Where Xj represents the jth predictor and Bj quantifies the association between that variable and the response. We interpret Bj as the average effect on Y of a one unit increase in Xj, holding all other predictors fixed.

3.2.1 Estimating the Regression Coefficients

3.2.2 Some Important Questions

  1. Is at least one of the predictors X1, X2, …, Xp useful in predicting the response?
  2. Do all the predictors help to explain Y, or is only a subset of the predictors useful?*
  3. How well does the model fit the data?
  4. Given a set of predictor values, what response value should we predict, and how accurate is our prediction?

One: Is There a Relationship Between the Response and Predictors?

Are all the regression coefficients zero?

Ho: B1 = B2 = … = Bp = 0

Ha: at least one Bj is non-zero.

__This hypothesis test is performed by computing the F-statistic,

If there is no relationship between the response and predictors, one would expect the F-statistic to take on a value close to 1. If Ha is true, then we expect F to be greater than 1.

Two: Deciding on Important Variables

Three Classical Approaches for model selection

Three: Model Fit

What is happening with the R2 and the RSE?

Four: Predictions

*Three sorts of uncertainty associated with predicted the response Y based on our estimated parameters.

  1. The coefficients are only estimates of the true population coefficients and thus is only an estimate of the true population regression line.

  2. There is also potentially reducible error associated with model selection referred to as, model bias.

  3. There is always random error e in the model.

3.3 Other Considerations in the Regression Model

3.3.1 Qualitative Predictors

Predictors with Only Two Levels

A dummy variable is used (a variable that takes on only two possible numerical values).

For example:

xi = 1 if ith person is female and xi = 0 if ith person is male

Resulting in the model

*yi = B0 + B1xi + Ei

Where B1 = 0 if MALE

Qualitative Predictors with More than Two Levels

“When a qualitative predictor has more than two levels, a single dummy variable cannot represent all possible values. In this situation, we can create additional dummy variables. For example, for the ethnicity variable we create two dummy variables.”

For example:

xi1 = 1 –> if ith person is Asian and 0 if ith person is not Asian,

and the second could be

xi2 = 1 if ith person is Caucasian and 0 if ith person is not Caucasian.

The level with no dummy variable is the baseline.

3.3.2 Extensions of the Linear Model

Two important assumptions of the linear regression model:

  1. The additive assumption means that the effect of changes in a predictor Xj on the response Y is independent of the values of the other predictors.

  2. The linear assumption states that the change in the response Y due to a one-unit change in Xj is constant, regardless of the value of Xj.

Removing the Additive Assumption

There may be synergistic cases, where an increase in one variable has a >1 effect on another variable (it increases its slope). Using an interaction term, allows us to incorporte this in linear models.

Non-linear relationships

You can use polynomials in linear models to better capture relationships with some curvature .

Polynomial regression

3.3.3 Potential Problems

  1. Non-linearity of the response-predictor relationships
  2. Correlation of error terms
  3. Non-constant variance of error terms
  4. Outliers
  5. High-leverage points
  6. Collinearity

1. Non-linearity of the Data

Residual plots are a useful graphical tool for identifying non-linearity.

2. Correlation of Error Terms

“If there is correlation among the error terms, then the estimated standard errors will tend to underestimate the true standard errors… In short, if the error terms are correlated, we may have an unwarranted sense of confidence in our model.”

Correlations in the context of time series data frequently occur in the context of time series data.

3. Non-constant Variance of Error Terms

Heteroscedasticity: non-constant variances in the errors. A funnel shape in the residual plot is an easy way to identify its presence.

Heteroscedasticity occurs when the magnitude of the residuals tends to increase with the fitted values.

4. Outliers

An outlier is a point for which yi is far from the value predicted by the model.

Plotting the studentized residuals helps identify outliers.

-Observations whose studentized residuals are greater than 3 in absolute value are possible outliers.

Important to remember that Outliers refer to observations for which the response yi is unusual given the predictor xi.

5. High Leverage Points

Observations with high leverage have an unusual value for xi.

6. Collinearity

Refers to the situation in which two or more predictor variables are closely related to one another.

The presence of collinearity can make it difficult to separate out the individual effects of collinear variables on the response.

The power of the hypothesis test–the probability of correctly detecting a non-zero coefficient–is reduced by collinearity.

Multicollinearity can occur even if no pair of variables has a particularly high correlation, but if collinearity exists between three or more variables.

The Variance Inflation Factor (VIF) is a better way of assessing multicollinearity.

As a rule of thumb, a VIF value that exceeds 5 or 10 indicates a problematic amount of collinearity.

Two simple solutions:

  1. Drop one of the problematic variables from the regression.

  2. Combine the collinear variables together into a single predictor.

3.4 The Marketing Plan

(Basically just a review of everything above)

3.5 Comparison of Linear Regression with K-Nearest Neighbors

K-nearest neighbors regression (KNN regression).

__3.6 Lab: Linear Regression

3.6.1 Libraries

library(MASS)

Attaching package: 㤼㸱MASS㤼㸲

The following object is masked _by_ 㤼㸱.GlobalEnv㤼㸲:

    Boston
library(ISLR)

Attaching package: 㤼㸱ISLR㤼㸲

The following objects are masked _by_ 㤼㸱.GlobalEnv㤼㸲:

    Auto, College
fix(Boston)
names(Boston)
 [1] "crim"    "zn"      "indus"   "chas"   
 [5] "nox"     "rm"      "age"     "dis"    
 [9] "rad"     "tax"     "ptratio" "black"  
[13] "lstat"   "medv"   
lm.fit=lm(medv~lstat,Boston)
attach(Boston)
lm.fit

Call:
lm(formula = medv ~ lstat, data = Boston)

Coefficients:
(Intercept)        lstat  
      34.55        -0.95  
summary(lm.fit)

Call:
lm(formula = medv ~ lstat, data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.168  -3.990  -1.318   2.034  24.500 

Coefficients:
            Estimate Std. Error t value
(Intercept) 34.55384    0.56263   61.41
lstat       -0.95005    0.03873  -24.53
            Pr(>|t|)    
(Intercept)   <2e-16 ***
lstat         <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.216 on 504 degrees of freedom
Multiple R-squared:  0.5441,    Adjusted R-squared:  0.5432 
F-statistic: 601.6 on 1 and 504 DF,  p-value: < 2.2e-16
names(lm.fit)
 [1] "coefficients"  "residuals"    
 [3] "effects"       "rank"         
 [5] "fitted.values" "assign"       
 [7] "qr"            "df.residual"  
 [9] "xlevels"       "call"         
[11] "terms"         "model"        
confint(lm.fit)
                2.5 %     97.5 %
(Intercept) 33.448457 35.6592247
lstat       -1.026148 -0.8739505
predict(lm.fit,data.frame(lstat=c(5,10,15)),interval="confidence")
       fit      lwr      upr
1 29.80359 29.00741 30.59978
2 25.05335 24.47413 25.63256
3 20.30310 19.73159 20.87461
predict(lm.fit,data.frame(lstat=c(5,10,15)),interval="prediction")
       fit       lwr      upr
1 29.80359 17.565675 42.04151
2 25.05335 12.827626 37.27907
3 20.30310  8.077742 32.52846
plot(lstat,medv)
abline(lm.fit)

plot(lstat,medv)
abline(lm.fit)
abline(lm.fit,lwd=3)
abline(lm.fit,lwd=3,col="red")

plot(lstat,medv,col="red")

plot(lstat,medv,pch=20)

plot(lstat,medv,pch="+")

plot(1:20,1:20,pch=1:20)

par(mfrow=c(2,2))
plot(lm.fit)

plot(predict(lm.fit),residuals(lm.fit))

plot(predict(lm.fit),rstudent(lm.fit))

plot(hatvalues(lm.fit))

which.max(hatvalues(lm.fit))
375 
375 

3.6.3 Multiple Linear Regression

lm.fit=lm(medv~lstat+age,data=Boston)
summary(lm.fit)

Call:
lm(formula = medv ~ lstat + age, data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.981  -3.978  -1.283   1.968  23.158 

Coefficients:
            Estimate Std. Error t value
(Intercept) 33.22276    0.73085  45.458
lstat       -1.03207    0.04819 -21.416
age          0.03454    0.01223   2.826
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
lstat        < 2e-16 ***
age          0.00491 ** 
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.173 on 503 degrees of freedom
Multiple R-squared:  0.5513,    Adjusted R-squared:  0.5495 
F-statistic:   309 on 2 and 503 DF,  p-value: < 2.2e-16
lm.fit=lm(medv~.,data=Boston)
summary(lm.fit)

Call:
lm(formula = medv ~ ., data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.595  -2.730  -0.518   1.777  26.199 

Coefficients:
              Estimate Std. Error t value
(Intercept)  3.646e+01  5.103e+00   7.144
crim        -1.080e-01  3.286e-02  -3.287
zn           4.642e-02  1.373e-02   3.382
indus        2.056e-02  6.150e-02   0.334
chas         2.687e+00  8.616e-01   3.118
nox         -1.777e+01  3.820e+00  -4.651
rm           3.810e+00  4.179e-01   9.116
age          6.922e-04  1.321e-02   0.052
dis         -1.476e+00  1.995e-01  -7.398
rad          3.060e-01  6.635e-02   4.613
tax         -1.233e-02  3.760e-03  -3.280
ptratio     -9.527e-01  1.308e-01  -7.283
black        9.312e-03  2.686e-03   3.467
lstat       -5.248e-01  5.072e-02 -10.347
            Pr(>|t|)    
(Intercept) 3.28e-12 ***
crim        0.001087 ** 
zn          0.000778 ***
indus       0.738288    
chas        0.001925 ** 
nox         4.25e-06 ***
rm           < 2e-16 ***
age         0.958229    
dis         6.01e-13 ***
rad         5.07e-06 ***
tax         0.001112 ** 
ptratio     1.31e-12 ***
black       0.000573 ***
lstat        < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.745 on 492 degrees of freedom
Multiple R-squared:  0.7406,    Adjusted R-squared:  0.7338 
F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16
lm.fit1=lm(medv~.-age,data=Boston)
summary(lm.fit1)

Call:
lm(formula = medv ~ . - age, data = Boston)

Residuals:
     Min       1Q   Median       3Q      Max 
-15.6054  -2.7313  -0.5188   1.7601  26.2243 

Coefficients:
              Estimate Std. Error t value
(Intercept)  36.436927   5.080119   7.172
crim         -0.108006   0.032832  -3.290
zn            0.046334   0.013613   3.404
indus         0.020562   0.061433   0.335
chas          2.689026   0.859598   3.128
nox         -17.713540   3.679308  -4.814
rm            3.814394   0.408480   9.338
dis          -1.478612   0.190611  -7.757
rad           0.305786   0.066089   4.627
tax          -0.012329   0.003755  -3.283
ptratio      -0.952211   0.130294  -7.308
black         0.009321   0.002678   3.481
lstat        -0.523852   0.047625 -10.999
            Pr(>|t|)    
(Intercept) 2.72e-12 ***
crim        0.001075 ** 
zn          0.000719 ***
indus       0.737989    
chas        0.001863 ** 
nox         1.97e-06 ***
rm           < 2e-16 ***
dis         5.03e-14 ***
rad         4.75e-06 ***
tax         0.001099 ** 
ptratio     1.10e-12 ***
black       0.000544 ***
lstat        < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.74 on 493 degrees of freedom
Multiple R-squared:  0.7406,    Adjusted R-squared:  0.7343 
F-statistic: 117.3 on 12 and 493 DF,  p-value: < 2.2e-16

3.6.4 Interaction terms

summary(lm(medv~lstat*age,data=Boston))

Call:
lm(formula = medv ~ lstat * age, data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.806  -4.045  -1.333   2.085  27.552 

Coefficients:
              Estimate Std. Error t value
(Intercept) 36.0885359  1.4698355  24.553
lstat       -1.3921168  0.1674555  -8.313
age         -0.0007209  0.0198792  -0.036
lstat:age    0.0041560  0.0018518   2.244
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
lstat       8.78e-16 ***
age           0.9711    
lstat:age     0.0252 *  
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.149 on 502 degrees of freedom
Multiple R-squared:  0.5557,    Adjusted R-squared:  0.5531 
F-statistic: 209.3 on 3 and 502 DF,  p-value: < 2.2e-16

3.6.5 Non-linear Transformations of the Predictors

lm.fit2=lm(medv~lstat+I(lstat^2))
summary(lm.fit)

Call:
lm(formula = medv ~ ., data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-15.595  -2.730  -0.518   1.777  26.199 

Coefficients:
              Estimate Std. Error t value
(Intercept)  3.646e+01  5.103e+00   7.144
crim        -1.080e-01  3.286e-02  -3.287
zn           4.642e-02  1.373e-02   3.382
indus        2.056e-02  6.150e-02   0.334
chas         2.687e+00  8.616e-01   3.118
nox         -1.777e+01  3.820e+00  -4.651
rm           3.810e+00  4.179e-01   9.116
age          6.922e-04  1.321e-02   0.052
dis         -1.476e+00  1.995e-01  -7.398
rad          3.060e-01  6.635e-02   4.613
tax         -1.233e-02  3.760e-03  -3.280
ptratio     -9.527e-01  1.308e-01  -7.283
black        9.312e-03  2.686e-03   3.467
lstat       -5.248e-01  5.072e-02 -10.347
            Pr(>|t|)    
(Intercept) 3.28e-12 ***
crim        0.001087 ** 
zn          0.000778 ***
indus       0.738288    
chas        0.001925 ** 
nox         4.25e-06 ***
rm           < 2e-16 ***
age         0.958229    
dis         6.01e-13 ***
rad         5.07e-06 ***
tax         0.001112 ** 
ptratio     1.31e-12 ***
black       0.000573 ***
lstat        < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.745 on 492 degrees of freedom
Multiple R-squared:  0.7406,    Adjusted R-squared:  0.7338 
F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16
lm.fit=lm(medv~lstat,data=Boston)
anova(lm.fit,lm.fit2)
Analysis of Variance Table

Model 1: medv ~ lstat
Model 2: medv ~ lstat + I(lstat^2)
  Res.Df   RSS Df Sum of Sq     F    Pr(>F)    
1    504 19472                                 
2    503 15347  1    4125.1 135.2 < 2.2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
par(mfrow=c(2,2))
plot(lm.fit2)

lm.fit5=lm(medv~poly(lstat,5))
summary(lm.fit5)

Call:
lm(formula = medv ~ poly(lstat, 5))

Residuals:
     Min       1Q   Median       3Q      Max 
-13.5433  -3.1039  -0.7052   2.0844  27.1153 

Coefficients:
                 Estimate Std. Error t value
(Intercept)       22.5328     0.2318  97.197
poly(lstat, 5)1 -152.4595     5.2148 -29.236
poly(lstat, 5)2   64.2272     5.2148  12.316
poly(lstat, 5)3  -27.0511     5.2148  -5.187
poly(lstat, 5)4   25.4517     5.2148   4.881
poly(lstat, 5)5  -19.2524     5.2148  -3.692
                Pr(>|t|)    
(Intercept)      < 2e-16 ***
poly(lstat, 5)1  < 2e-16 ***
poly(lstat, 5)2  < 2e-16 ***
poly(lstat, 5)3 3.10e-07 ***
poly(lstat, 5)4 1.42e-06 ***
poly(lstat, 5)5 0.000247 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.215 on 500 degrees of freedom
Multiple R-squared:  0.6817,    Adjusted R-squared:  0.6785 
F-statistic: 214.2 on 5 and 500 DF,  p-value: < 2.2e-16
summary(lm(medv~log(rm),data=Boston))

Call:
lm(formula = medv ~ log(rm), data = Boston)

Residuals:
    Min      1Q  Median      3Q     Max 
-19.487  -2.875  -0.104   2.837  39.816 

Coefficients:
            Estimate Std. Error t value
(Intercept)  -76.488      5.028  -15.21
log(rm)       54.055      2.739   19.73
            Pr(>|t|)    
(Intercept)   <2e-16 ***
log(rm)       <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.915 on 504 degrees of freedom
Multiple R-squared:  0.4358,    Adjusted R-squared:  0.4347 
F-statistic: 389.3 on 1 and 504 DF,  p-value: < 2.2e-16

3.6.6 Qualitative Predictors

fix(Carseats)
names(Carseats)
 [1] "Sales"       "CompPrice"   "Income"     
 [4] "Advertising" "Population"  "Price"      
 [7] "ShelveLoc"   "Age"         "Education"  
[10] "Urban"       "US"         
lm.fit=lm(Sales~.+Income:Advertising+Price:Age,data=Carseats)
summary(lm.fit)

Call:
lm(formula = Sales ~ . + Income:Advertising + Price:Age, data = Carseats)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.9208 -0.7503  0.0177  0.6754  3.3413 

Coefficients:
                     Estimate Std. Error
(Intercept)         6.5755654  1.0087470
CompPrice           0.0929371  0.0041183
Income              0.0108940  0.0026044
Advertising         0.0702462  0.0226091
Population          0.0001592  0.0003679
Price              -0.1008064  0.0074399
ShelveLocGood       4.8486762  0.1528378
ShelveLocMedium     1.9532620  0.1257682
Age                -0.0579466  0.0159506
Education          -0.0208525  0.0196131
UrbanYes            0.1401597  0.1124019
USYes              -0.1575571  0.1489234
Income:Advertising  0.0007510  0.0002784
Price:Age           0.0001068  0.0001333
                   t value Pr(>|t|)    
(Intercept)          6.519 2.22e-10 ***
CompPrice           22.567  < 2e-16 ***
Income               4.183 3.57e-05 ***
Advertising          3.107 0.002030 ** 
Population           0.433 0.665330    
Price              -13.549  < 2e-16 ***
ShelveLocGood       31.724  < 2e-16 ***
ShelveLocMedium     15.531  < 2e-16 ***
Age                 -3.633 0.000318 ***
Education           -1.063 0.288361    
UrbanYes             1.247 0.213171    
USYes               -1.058 0.290729    
Income:Advertising   2.698 0.007290 ** 
Price:Age            0.801 0.423812    
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.011 on 386 degrees of freedom
Multiple R-squared:  0.8761,    Adjusted R-squared:  0.8719 
F-statistic:   210 on 13 and 386 DF,  p-value: < 2.2e-16
attach(Carseats)
contrasts(ShelveLoc)
       Good Medium
Bad       0      0
Good      1      0
Medium    0      1

3.7 Exercises

Conceptual

  1. The Null hypothesis –> H0: B1 = 0 is that there is no relationship between our predictor (sales) and our corresponding coefficient advertising on (TV, radio, and newspaper). The coefficient, B, represents the slope of the change in Y given a change in X. Thus, if the slope = 0, there is no change.

3a.

Female: 85 + 20(GPA) + .07(IQ) + .01(GPA:IQ) -10(GPA)

Male: 50 + 20(GPA) + .07(IQ) + .01(GPA:IQ)

If GPA is 3.5, Males and Females have the same starting salary. If below 3.5, females will have a higher starting salary. If above 3.5, males will have a higher starting salary.

3b.

Female: 85 + 20(4) + .07(110) + .01(4:110) -10(4) = 137.1

3c.

False, a small coefficient simply tells us the slope of the relationship between our parameter and response variable. A large p-value would indicate little evidence of an interaction effect.

4a.

We would expect the training Residual Sum of Squares for the cubic regression to be less because the model would be able to fit the data more accurately. However, this is complicated if the true form of the data is linear.

4b.

Again, it depends on the true form of the data, but in the case that the cubic regression in the training data “overfit” the data, then we would expect it to have low applicability to the real “test” data and thus would expect the RSS to be higher for the cubic regression in this case.

4c. Again, we would expect the cubic regression to have a lower RSS.

4d. It depends on how close to linear the true model is. If the model is closer to linear, then the linear regression is better. However, if the true model is not very close to linear at all then the cubic regression is much more appropriate.

  1. Note in the case of simple linear regression, the least squares line always passes through the means of the predictor and the response.

Applied

8a.

lm.auto=lm(mpg~horsepower,data=Auto)
summary(lm.auto)

Call:
lm(formula = mpg ~ horsepower, data = Auto)

Residuals:
     Min       1Q   Median       3Q      Max 
-13.5710  -3.2592  -0.3435   2.7630  16.9240 

Coefficients:
             Estimate Std. Error t value
(Intercept) 39.935861   0.717499   55.66
horsepower  -0.157845   0.006446  -24.49
            Pr(>|t|)    
(Intercept)   <2e-16 ***
horsepower    <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.906 on 390 degrees of freedom
Multiple R-squared:  0.6059,    Adjusted R-squared:  0.6049 
F-statistic: 599.7 on 1 and 390 DF,  p-value: < 2.2e-16
  1. The F-statistic validates the model and the p-value demonstrates the statistical significance of the coefficient.

  2. There is an inverse relationship between the predictor and response. An increase in horsepower of 100 leads to a reduction in mpg of 15. Accordingly, our adjusted R-Squared tells us that about 60% of the variation in our mpg can be explained by horsepower.

  3. Negative

predict(lm.auto,data.frame(horsepower=c(98)),interval="confidence")
       fit      lwr      upr
1 24.46708 23.97308 24.96108
predict(lm.auto,data.frame(horsepower=c(98)),interval="prediction")
       fit     lwr      upr
1 24.46708 14.8094 34.12476
attach(Auto)
The following objects are masked from Auto (pos = 3):

    acceleration, cylinders, displacement,
    horsepower, mpg, name, origin, weight,
    year
plot(horsepower,mpg)
abline(lm.auto,col="red")

par(mfrow=c(2,2))
plot(lm.auto)

Examining the Residuals vs Fitted plot demonstrates that our residuals are tracking our fitted values. This demonstrates an issue of non-linearity of the data. We could potentially resolve this by plotting adding horsepower^2 as the plot of our relationship demonstrates a non-linear relationship. We also appear to have some high leverage points that can potentially be further fleshed out via the studentized residuals. The plot below shows

plot(predict(lm.auto),rstudent(lm.auto),col=ifelse(rstudent(lm.auto)>=3,"red","black"))+
text(predict(lm.auto),rstudent(lm.auto),labels=ifelse(rstudent(lm.auto)>=2.5,names(which(rstudent(lm.auto)>=3)),""),pos=4)
integer(0)

plot(hatvalues(lm.auto),col=ifelse(hatvalues(lm.auto)>.028,"red","black"))+text(hatvalues(lm.auto),labels=ifelse(hatvalues(lm.auto)>.028,names(which.max(hatvalues(lm.auto)>.028)),""),cex=.7,pos=4)
integer(0)

pairs(~.,data=Auto)

cor(Auto[,-9])
                    mpg  cylinders displacement
mpg           1.0000000 -0.7776175   -0.8051269
cylinders    -0.7776175  1.0000000    0.9508233
displacement -0.8051269  0.9508233    1.0000000
horsepower   -0.7784268  0.8429834    0.8972570
weight       -0.8322442  0.8975273    0.9329944
acceleration  0.4233285 -0.5046834   -0.5438005
year          0.5805410 -0.3456474   -0.3698552
origin        0.5652088 -0.5689316   -0.6145351
             horsepower     weight acceleration
mpg          -0.7784268 -0.8322442    0.4233285
cylinders     0.8429834  0.8975273   -0.5046834
displacement  0.8972570  0.9329944   -0.5438005
horsepower    1.0000000  0.8645377   -0.6891955
weight        0.8645377  1.0000000   -0.4168392
acceleration -0.6891955 -0.4168392    1.0000000
year         -0.4163615 -0.3091199    0.2903161
origin       -0.4551715 -0.5850054    0.2127458
                   year     origin
mpg           0.5805410  0.5652088
cylinders    -0.3456474 -0.5689316
displacement -0.3698552 -0.6145351
horsepower   -0.4163615 -0.4551715
weight       -0.3091199 -0.5850054
acceleration  0.2903161  0.2127458
year          1.0000000  0.1815277
origin        0.1815277  1.0000000
lm.auto2=lm(mpg~.-name,data=Auto)
summary(lm.auto2)

Call:
lm(formula = mpg ~ . - name, data = Auto)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.5903 -2.1565 -0.1169  1.8690 13.0604 

Coefficients:
               Estimate Std. Error t value
(Intercept)  -17.218435   4.644294  -3.707
cylinders     -0.493376   0.323282  -1.526
displacement   0.019896   0.007515   2.647
horsepower    -0.016951   0.013787  -1.230
weight        -0.006474   0.000652  -9.929
acceleration   0.080576   0.098845   0.815
year           0.750773   0.050973  14.729
origin         1.426141   0.278136   5.127
             Pr(>|t|)    
(Intercept)   0.00024 ***
cylinders     0.12780    
displacement  0.00844 ** 
horsepower    0.21963    
weight        < 2e-16 ***
acceleration  0.41548    
year          < 2e-16 ***
origin       4.67e-07 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.328 on 384 degrees of freedom
Multiple R-squared:  0.8215,    Adjusted R-squared:  0.8182 
F-statistic: 252.4 on 7 and 384 DF,  p-value: < 2.2e-16
  1. Yes, excluding cylinders, horsepower and acceleration. The F-statistic validates the model. The model acounts for about 82% of the variation in mpg.

  2. Every ten years, the average mpg increases by 7.5

par(mfrow=c(2,2))
plot(lm.auto2)

The data appears to be pretty linear. The residuals seem to be pretty equally distributed along both sides of the line of fit so there does not appear to be evidence of correlation among sequential residuals. We may have some outliers and residuals which are labeled in the plot.

lm.auto3=lm(mpg~.-name+horsepower:acceleration-cylinders-displacement,data=Auto)
summary(lm.auto3)

Call:
lm(formula = mpg ~ . - name + horsepower:acceleration - cylinders - 
    displacement, data = Auto)

Residuals:
    Min      1Q  Median      3Q     Max 
-8.9104 -1.8819 -0.0609  1.8141 12.4503 

Coefficients:
                          Estimate Std. Error
(Intercept)             -3.150e+01  4.692e+00
horsepower               1.127e-01  2.035e-02
weight                  -4.515e-03  4.994e-04
acceleration             9.307e-01  1.511e-01
year                     7.601e-01  4.793e-02
origin                   1.151e+00  2.459e-01
horsepower:acceleration -1.123e-02  1.530e-03
                        t value Pr(>|t|)    
(Intercept)              -6.715 6.77e-11 ***
horsepower                5.538 5.67e-08 ***
weight                   -9.041  < 2e-16 ***
acceleration              6.159 1.84e-09 ***
year                     15.856  < 2e-16 ***
origin                    4.680 3.98e-06 ***
horsepower:acceleration  -7.339 1.29e-12 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.141 on 385 degrees of freedom
Multiple R-squared:  0.8405,    Adjusted R-squared:  0.838 
F-statistic: 338.1 on 6 and 385 DF,  p-value: < 2.2e-16
lm.auto4=lm(mpg~horsepower+I(horsepower^2),data=Auto)
summary(lm.auto4)

Call:
lm(formula = mpg ~ horsepower + I(horsepower^2), data = Auto)

Residuals:
     Min       1Q   Median       3Q      Max 
-14.7135  -2.5943  -0.0859   2.2868  15.8961 

Coefficients:
                  Estimate Std. Error t value
(Intercept)     56.9000997  1.8004268   31.60
horsepower      -0.4661896  0.0311246  -14.98
I(horsepower^2)  0.0012305  0.0001221   10.08
                Pr(>|t|)    
(Intercept)       <2e-16 ***
horsepower        <2e-16 ***
I(horsepower^2)   <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.374 on 389 degrees of freedom
Multiple R-squared:  0.6876,    Adjusted R-squared:  0.686 
F-statistic:   428 on 2 and 389 DF,  p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(lm.auto4)

attach(Carseats)

10a.

summary(Carseats)
     Sales          CompPrice  
 Min.   : 0.000   Min.   : 77  
 1st Qu.: 5.390   1st Qu.:115  
 Median : 7.490   Median :125  
 Mean   : 7.496   Mean   :125  
 3rd Qu.: 9.320   3rd Qu.:135  
 Max.   :16.270   Max.   :175  
     Income        Advertising    
 Min.   : 21.00   Min.   : 0.000  
 1st Qu.: 42.75   1st Qu.: 0.000  
 Median : 69.00   Median : 5.000  
 Mean   : 68.66   Mean   : 6.635  
 3rd Qu.: 91.00   3rd Qu.:12.000  
 Max.   :120.00   Max.   :29.000  
   Population        Price        ShelveLoc  
 Min.   : 10.0   Min.   : 24.0   Bad   : 96  
 1st Qu.:139.0   1st Qu.:100.0   Good  : 85  
 Median :272.0   Median :117.0   Medium:219  
 Mean   :264.8   Mean   :115.8               
 3rd Qu.:398.5   3rd Qu.:131.0               
 Max.   :509.0   Max.   :191.0               
      Age          Education    Urban    
 Min.   :25.00   Min.   :10.0   No :118  
 1st Qu.:39.75   1st Qu.:12.0   Yes:282  
 Median :54.50   Median :14.0            
 Mean   :53.32   Mean   :13.9            
 3rd Qu.:66.00   3rd Qu.:16.0            
 Max.   :80.00   Max.   :18.0            
   US     
 No :142  
 Yes:258  
          
          
          
          
contrasts(ShelveLoc)
       Good Medium
Bad       0      0
Good      1      0
Medium    0      1
lm.cars=lm(Sales~Price+Urban+US,data=Carseats)
summary(lm.cars)

Call:
lm(formula = Sales ~ Price + Urban + US, data = Carseats)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.9206 -1.6220 -0.0564  1.5786  7.0581 

Coefficients:
             Estimate Std. Error t value
(Intercept) 13.043469   0.651012  20.036
Price       -0.054459   0.005242 -10.389
UrbanYes    -0.021916   0.271650  -0.081
USYes        1.200573   0.259042   4.635
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
Price        < 2e-16 ***
UrbanYes       0.936    
USYes       4.86e-06 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.472 on 396 degrees of freedom
Multiple R-squared:  0.2393,    Adjusted R-squared:  0.2335 
F-statistic: 41.52 on 3 and 396 DF,  p-value: < 2.2e-16
  1. Price has a negative relationship with Sales. Thus, a one-unit increase in the sale price of carseats results in a reduction in sales by .05. UrbanYes I’m assuming is a measure of whether or not it is sold in an area and while although not statistically significant, the relationship suggests that sales of carseats in urban areas are .02 lower than their baseline counterpart of not in urban areas. I believe USYEs is similar. If it is sold in the US it’s sales are 1.2 higher than their baseline of not equivalent or stores in the US do about $1200 better in terms of sales.

  2. Sales = 13.04 - .05(Price) - 02(IfUrban) + 1.2(IfUS) if Urban and US “NO” then Sales = 13.04 -.05(Price)

  3. Price and USYes

lm.cars2=lm(Sales~Price+US,data=Carseats)
summary(lm.cars2)

Call:
lm(formula = Sales ~ Price + US, data = Carseats)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.9269 -1.6286 -0.0574  1.5766  7.0515 

Coefficients:
            Estimate Std. Error t value
(Intercept) 13.03079    0.63098  20.652
Price       -0.05448    0.00523 -10.416
USYes        1.19964    0.25846   4.641
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
Price        < 2e-16 ***
USYes       4.71e-06 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.469 on 397 degrees of freedom
Multiple R-squared:  0.2393,    Adjusted R-squared:  0.2354 
F-statistic: 62.43 on 2 and 397 DF,  p-value: < 2.2e-16
  1. After removing “Urban” we note that there was almost no change in the R-Squared value demonstrating that Urban was not useful in explaining variation in sales. Furthermore, we note a greater F-Statistic and the Residual Standard Error actually decreased (although not by much) in our newer model.

confint(lm.cars2)
                  2.5 %      97.5 %
(Intercept) 11.79032020 14.27126531
Price       -0.06475984 -0.04419543
USYes        0.69151957  1.70776632
par(mfrow=c(2,2))
plot(lm.cars2)

The plots look pretty good. No evident issues of non-linearity or correlated residuals, but the plot of residuals vs leverage demonstrates that we likely have some high leverage points.

set.seed(1)
x=rnorm(100)
y=2*x+rnorm(100)
lm.equat=lm(y~x+0)
summary(lm.equat)

Call:
lm(formula = y ~ x + 0)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9154 -0.6472 -0.1771  0.5056  2.3109 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
x   1.9939     0.1065   18.73   <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9586 on 99 degrees of freedom
Multiple R-squared:  0.7798,    Adjusted R-squared:  0.7776 
F-statistic: 350.7 on 1 and 99 DF,  p-value: < 2.2e-16
lm.equat2=lm(x~y+0)
summary(lm.equat2)

Call:
lm(formula = x ~ y + 0)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.8699 -0.2368  0.1030  0.2858  0.8938 

Coefficients:
  Estimate Std. Error t value Pr(>|t|)    
y  0.39111    0.02089   18.73   <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4246 on 99 degrees of freedom
Multiple R-squared:  0.7798,    Adjusted R-squared:  0.7776 
F-statistic: 350.7 on 1 and 99 DF,  p-value: < 2.2e-16
  1. The results are the same except for the estimates of the coefficients and the residuals. They have the same R-squareds, F-statistics and p-values.

lm.equat=lm(y~x)
summary(lm.equat)

Call:
lm(formula = y ~ x)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8768 -0.6138 -0.1395  0.5394  2.3462 

Coefficients:
            Estimate Std. Error t value
(Intercept) -0.03769    0.09699  -0.389
x            1.99894    0.10773  18.556
            Pr(>|t|)    
(Intercept)    0.698    
x             <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9628 on 98 degrees of freedom
Multiple R-squared:  0.7784,    Adjusted R-squared:  0.7762 
F-statistic: 344.3 on 1 and 98 DF,  p-value: < 2.2e-16
lm.equat2=lm(x~y)
summary(lm.equat2)

Call:
lm(formula = x ~ y)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.90848 -0.28101  0.06274  0.24570  0.85736 

Coefficients:
            Estimate Std. Error t value
(Intercept)  0.03880    0.04266    0.91
y            0.38942    0.02099   18.56
            Pr(>|t|)    
(Intercept)    0.365    
y             <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4249 on 98 degrees of freedom
Multiple R-squared:  0.7784,    Adjusted R-squared:  0.7762 
F-statistic: 344.3 on 1 and 98 DF,  p-value: < 2.2e-16
  1. (Skipped)

set.seed(1)
x=rnorm(100,0,1)
eps=rnorm(100,0,.25)
y=-1+.5*x+eps
length(y)
[1] 100

B0 = -1 and B1 = .5

scatter.smooth(x,y)

The relationship is perfectly linear.

lm.equat3=lm(y~x)
summary(lm.equat3)

Call:
lm(formula = y ~ x)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.46921 -0.15344 -0.03487  0.13485  0.58654 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.00942    0.02425  -41.63   <2e-16 ***
x            0.49973    0.02693   18.56   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2407 on 98 degrees of freedom
Multiple R-squared:  0.7784,    Adjusted R-squared:  0.7762 
F-statistic: 344.3 on 1 and 98 DF,  p-value: < 2.2e-16

The predicted values of B0 and B1 are almost identical to the actual values.

coef(lm.equat3)
(Intercept)           x 
 -1.0094232   0.4997349 
plot(x,y,pch=20)
abline(coef=c(-1,0.5),col="red")
abline(coef(lm.equat3),col="green")
legend("bottomright",legend=c("Population Regression","Least Square"),col=c("red","green"),lty=c(1,1))

lm.equat4=lm(y~x+I(x^2))
summary(lm.equat4)

Call:
lm(formula = y ~ x + I(x^2))

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4913 -0.1563 -0.0322  0.1451  0.5675 

Coefficients:
            Estimate Std. Error t value
(Intercept) -0.98582    0.02941 -33.516
x            0.50429    0.02700  18.680
I(x^2)      -0.02973    0.02119  -1.403
            Pr(>|t|)    
(Intercept)   <2e-16 ***
x             <2e-16 ***
I(x^2)         0.164    
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2395 on 97 degrees of freedom
Multiple R-squared:  0.7828,    Adjusted R-squared:  0.7784 
F-statistic: 174.8 on 2 and 97 DF,  p-value: < 2.2e-16

No, our predictive power (in terms of R-squared) didn’t improve and the strength of our F-statistic decreased. It is still significant, but worse.

set.seed(1)
x1=runif(100)
x2=0.5*x1+rnorm(100)/10
y=2+2*x1+.3*x2+rnorm(100)

The regression coefficients: B0 = 2 B1 = 2 B2 = .3

cor(x1,x2)
[1] 0.8351212
plot(x1,x2,col="black")

lm.equat4=lm(y~x1+x2)
summary(lm.equat4)

Call:
lm(formula = y ~ x1 + x2)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.8311 -0.7273 -0.0537  0.6338  2.3359 

Coefficients:
            Estimate Std. Error t value
(Intercept)   2.1305     0.2319   9.188
x1            1.4396     0.7212   1.996
x2            1.0097     1.1337   0.891
            Pr(>|t|)    
(Intercept) 7.61e-15 ***
x1            0.0487 *  
x2            0.3754    
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.056 on 97 degrees of freedom
Multiple R-squared:  0.2088,    Adjusted R-squared:  0.1925 
F-statistic:  12.8 on 2 and 97 DF,  p-value: 1.164e-05

B0 = 2.13 B1 = 1.4 B2 = 1

These predicted coefficients are different from their population regression values. The most different is the coefficient of x2 which is likely due to its low level of statistical significance. We can reject the null H0:B1=0, but not the null H0:B2=0.

lm.equat5=lm(y~x1)
summary(lm.equat5)

Call:
lm(formula = y ~ x1)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.89495 -0.66874 -0.07785  0.59221  2.45560 

Coefficients:
            Estimate Std. Error t value
(Intercept)   2.1124     0.2307   9.155
x1            1.9759     0.3963   4.986
            Pr(>|t|)    
(Intercept) 8.27e-15 ***
x1          2.66e-06 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.055 on 98 degrees of freedom
Multiple R-squared:  0.2024,    Adjusted R-squared:  0.1942 
F-statistic: 24.86 on 1 and 98 DF,  p-value: 2.661e-06
lm.equat6=lm(y~x2)
summary(lm.equat6)

Call:
lm(formula = y ~ x2)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.62687 -0.75156 -0.03598  0.72383  2.44890 

Coefficients:
            Estimate Std. Error t value
(Intercept)   2.3899     0.1949   12.26
x2            2.8996     0.6330    4.58
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
x2          1.37e-05 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.072 on 98 degrees of freedom
Multiple R-squared:  0.1763,    Adjusted R-squared:  0.1679 
F-statistic: 20.98 on 1 and 98 DF,  p-value: 1.366e-05
  1. The results obtain in (c)-(e) do not contradict each other. It is entirely possible that two variables are not jointly significant, but can be independently significant. What is likely occurring is that x1 and x2 are highly correlated and thus when the two are included together, x2 does not provide any new information that x1 does not already account for.

  2. (Skipped)

15.

attach(Boston)
The following objects are masked from Boston (pos = 3):

    age, black, chas, crim, dis, indus,
    lstat, medv, nox, ptratio, rad, rm,
    tax, zn
names(Boston)
 [1] "crim"    "zn"      "indus"   "chas"   
 [5] "nox"     "rm"      "age"     "dis"    
 [9] "rad"     "tax"     "ptratio" "black"  
[13] "lstat"   "medv"   
lm.b1=lm(crim~zn)
summary(lm.b1)

Call:
lm(formula = crim ~ zn)

Residuals:
   Min     1Q Median     3Q    Max 
-4.429 -4.222 -2.620  1.250 84.523 

Coefficients:
            Estimate Std. Error t value
(Intercept)  4.45369    0.41722  10.675
zn          -0.07393    0.01609  -4.594
            Pr(>|t|)    
(Intercept)  < 2e-16 ***
zn          5.51e-06 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.435 on 504 degrees of freedom
Multiple R-squared:  0.04019,   Adjusted R-squared:  0.03828 
F-statistic:  21.1 on 1 and 504 DF,  p-value: 5.506e-06
lm.b2=lm(crim~indus)
summary(lm.b2)

Call:
lm(formula = crim ~ indus)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.972  -2.698  -0.736   0.712  81.813 

Coefficients:
            Estimate Std. Error t value
(Intercept) -2.06374    0.66723  -3.093
indus        0.50978    0.05102   9.991
            Pr(>|t|)    
(Intercept)  0.00209 ** 
indus        < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.866 on 504 degrees of freedom
Multiple R-squared:  0.1653,    Adjusted R-squared:  0.1637 
F-statistic: 99.82 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b3=lm(crim~chas)
summary(lm.b3)

Call:
lm(formula = crim ~ chas)

Residuals:
   Min     1Q Median     3Q    Max 
-3.738 -3.661 -3.435  0.018 85.232 

Coefficients:
            Estimate Std. Error t value
(Intercept)   3.7444     0.3961   9.453
chas         -1.8928     1.5061  -1.257
            Pr(>|t|)    
(Intercept)   <2e-16 ***
chas           0.209    
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.597 on 504 degrees of freedom
Multiple R-squared:  0.003124,  Adjusted R-squared:  0.001146 
F-statistic: 1.579 on 1 and 504 DF,  p-value: 0.2094
lm.b4=lm(crim~nox)
summary(lm.b4)

Call:
lm(formula = crim ~ nox)

Residuals:
    Min      1Q  Median      3Q     Max 
-12.371  -2.738  -0.974   0.559  81.728 

Coefficients:
            Estimate Std. Error t value
(Intercept)  -13.720      1.699  -8.073
nox           31.249      2.999  10.419
            Pr(>|t|)    
(Intercept) 5.08e-15 ***
nox          < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.81 on 504 degrees of freedom
Multiple R-squared:  0.1772,    Adjusted R-squared:  0.1756 
F-statistic: 108.6 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b5=lm(crim~rm)
summary(lm.b5)

Call:
lm(formula = crim ~ rm)

Residuals:
   Min     1Q Median     3Q    Max 
-6.604 -3.952 -2.654  0.989 87.197 

Coefficients:
            Estimate Std. Error t value
(Intercept)   20.482      3.365   6.088
rm            -2.684      0.532  -5.045
            Pr(>|t|)    
(Intercept) 2.27e-09 ***
rm          6.35e-07 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.401 on 504 degrees of freedom
Multiple R-squared:  0.04807,   Adjusted R-squared:  0.04618 
F-statistic: 25.45 on 1 and 504 DF,  p-value: 6.347e-07
lm.b6=lm(crim~age)
summary(lm.b6)

Call:
lm(formula = crim ~ age)

Residuals:
   Min     1Q Median     3Q    Max 
-6.789 -4.257 -1.230  1.527 82.849 

Coefficients:
            Estimate Std. Error t value
(Intercept) -3.77791    0.94398  -4.002
age          0.10779    0.01274   8.463
            Pr(>|t|)    
(Intercept) 7.22e-05 ***
age         2.85e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.057 on 504 degrees of freedom
Multiple R-squared:  0.1244,    Adjusted R-squared:  0.1227 
F-statistic: 71.62 on 1 and 504 DF,  p-value: 2.855e-16
lm.b7=lm(crim~dis)
summary(lm.b7)

Call:
lm(formula = crim ~ dis)

Residuals:
   Min     1Q Median     3Q    Max 
-6.708 -4.134 -1.527  1.516 81.674 

Coefficients:
            Estimate Std. Error t value
(Intercept)   9.4993     0.7304  13.006
dis          -1.5509     0.1683  -9.213
            Pr(>|t|)    
(Intercept)   <2e-16 ***
dis           <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.965 on 504 degrees of freedom
Multiple R-squared:  0.1441,    Adjusted R-squared:  0.1425 
F-statistic: 84.89 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b8=lm(crim~rad)
summary(lm.b8)

Call:
lm(formula = crim ~ rad)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.164  -1.381  -0.141   0.660  76.433 

Coefficients:
            Estimate Std. Error t value
(Intercept) -2.28716    0.44348  -5.157
rad          0.61791    0.03433  17.998
            Pr(>|t|)    
(Intercept) 3.61e-07 ***
rad          < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.718 on 504 degrees of freedom
Multiple R-squared:  0.3913,    Adjusted R-squared:   0.39 
F-statistic: 323.9 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b9=lm(crim~tax)
summary(lm.b9)

Call:
lm(formula = crim ~ tax)

Residuals:
    Min      1Q  Median      3Q     Max 
-12.513  -2.738  -0.194   1.065  77.696 

Coefficients:
             Estimate Std. Error t value
(Intercept) -8.528369   0.815809  -10.45
tax          0.029742   0.001847   16.10
            Pr(>|t|)    
(Intercept)   <2e-16 ***
tax           <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.997 on 504 degrees of freedom
Multiple R-squared:  0.3396,    Adjusted R-squared:  0.3383 
F-statistic: 259.2 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b10=lm(crim~ptratio)
summary(lm.b10)

Call:
lm(formula = crim ~ ptratio)

Residuals:
   Min     1Q Median     3Q    Max 
-7.654 -3.985 -1.912  1.825 83.353 

Coefficients:
            Estimate Std. Error t value
(Intercept) -17.6469     3.1473  -5.607
ptratio       1.1520     0.1694   6.801
            Pr(>|t|)    
(Intercept) 3.40e-08 ***
ptratio     2.94e-11 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 8.24 on 504 degrees of freedom
Multiple R-squared:  0.08407,   Adjusted R-squared:  0.08225 
F-statistic: 46.26 on 1 and 504 DF,  p-value: 2.943e-11
lm.b11=lm(crim~black)
summary(lm.b11)

Call:
lm(formula = crim ~ black)

Residuals:
    Min      1Q  Median      3Q     Max 
-13.756  -2.299  -2.095  -1.296  86.822 

Coefficients:
             Estimate Std. Error t value
(Intercept) 16.553529   1.425903  11.609
black       -0.036280   0.003873  -9.367
            Pr(>|t|)    
(Intercept)   <2e-16 ***
black         <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.946 on 504 degrees of freedom
Multiple R-squared:  0.1483,    Adjusted R-squared:  0.1466 
F-statistic: 87.74 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b12=lm(crim~lstat)
summary(lm.b12)

Call:
lm(formula = crim ~ lstat)

Residuals:
    Min      1Q  Median      3Q     Max 
-13.925  -2.822  -0.664   1.079  82.862 

Coefficients:
            Estimate Std. Error t value
(Intercept) -3.33054    0.69376  -4.801
lstat        0.54880    0.04776  11.491
            Pr(>|t|)    
(Intercept) 2.09e-06 ***
lstat        < 2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.664 on 504 degrees of freedom
Multiple R-squared:  0.2076,    Adjusted R-squared:  0.206 
F-statistic:   132 on 1 and 504 DF,  p-value: < 2.2e-16
lm.b13=lm(crim~medv)
summary(lm.b13)

Call:
lm(formula = crim ~ medv)

Residuals:
   Min     1Q Median     3Q    Max 
-9.071 -4.022 -2.343  1.298 80.957 

Coefficients:
            Estimate Std. Error t value
(Intercept) 11.79654    0.93419   12.63
medv        -0.36316    0.03839   -9.46
            Pr(>|t|)    
(Intercept)   <2e-16 ***
medv          <2e-16 ***
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.934 on 504 degrees of freedom
Multiple R-squared:  0.1508,    Adjusted R-squared:  0.1491 
F-statistic: 89.49 on 1 and 504 DF,  p-value: < 2.2e-16

The only simple linear regression model that failed to generate a statistically significant association between the predictor and the response was the relationship between chas and crim.

par(mfrow=c(2,2))
plot(zn,crim)
plot(indus,crim)
plot(nox,crim)
plot(rm,crim)

lm.Boston=lm(crim~.,data=Boston)
summary(lm.Boston)

Call:
lm(formula = crim ~ ., data = Boston)

Residuals:
   Min     1Q Median     3Q    Max 
-9.924 -2.120 -0.353  1.019 75.051 

Coefficients:
              Estimate Std. Error t value
(Intercept)  17.033228   7.234903   2.354
zn            0.044855   0.018734   2.394
indus        -0.063855   0.083407  -0.766
chas         -0.749134   1.180147  -0.635
nox         -10.313535   5.275536  -1.955
rm            0.430131   0.612830   0.702
age           0.001452   0.017925   0.081
dis          -0.987176   0.281817  -3.503
rad           0.588209   0.088049   6.680
tax          -0.003780   0.005156  -0.733
ptratio      -0.271081   0.186450  -1.454
black        -0.007538   0.003673  -2.052
lstat         0.126211   0.075725   1.667
medv         -0.198887   0.060516  -3.287
            Pr(>|t|)    
(Intercept) 0.018949 *  
zn          0.017025 *  
indus       0.444294    
chas        0.525867    
nox         0.051152 .  
rm          0.483089    
age         0.935488    
dis         0.000502 ***
rad         6.46e-11 ***
tax         0.463793    
ptratio     0.146611    
black       0.040702 *  
lstat       0.096208 .  
medv        0.001087 ** 
---
Signif. codes:  
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.439 on 492 degrees of freedom
Multiple R-squared:  0.454, Adjusted R-squared:  0.4396 
F-statistic: 31.47 on 13 and 492 DF,  p-value: < 2.2e-16

Our F-statistic is pretty low (31.47). The p-value on our F-test indicates a significant model, but we can do better. After accounting for everything in the model we have only explained 44% of the variation in crim. Using a 95% confidence threshold we note that the following variables are not statistically significant: indus, chas, nox, rm, age, tax, ptration and lstat.

In the first model only chas failed as to provide any statistical significance regarding a relationship between the predictor and response. However, when all of our variables are included in the model we note that many more are excluded as viable predictors. This signifies a great deal of collinearity within our model. Fundamentally, many of our variables are highly correlated and thus become redundant when explaining variation in crim.

LS0tDQp0aXRsZTogIkNoYXB0ZXJfM19MaW5lYXJfUmVncmVzc2lvbiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCl9fKkxpbmVhciByZWdyZXNzaW9uKl9fLCBhIHZlcnkgc2ltcGxlIGFwcHJvYWNoIGZvciBzdXBlcnZpc2VkIGxlYXJuaW5nLiBBIHVzZWZ1bCB0b29sIGZvciBwcmVkaWN0aW5nIGEgcXVhbnRpdGF0aXZlIHJlc3BvbnNlLg0KDQoNCiMjIyMgX18zLjEgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uX18NCg0KLSBQcmVkaWN0cyBhIHF1YW50aXRhdGl2ZSByZXNwb25zZSAqWSogb24gdGhlIGJhc2lzIG9mIGEgc2luZ2xlIHByZWRpY3RvciB2YXJpYWJsZSAqWCouDQoNCi0gQXNzdW1lcyBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiAqWCogYW5kICpZKi4NCg0KX19SZWdyZXNzaW9uIEVxdWF0aW9uOl9fDQoNCipZKiDiiYggKkIqfjB+ICsgKkIqfjF+KFgpDQoNCipCKn4wfiBhbmQgKkIqfjF+IHJlcHJlc2VudCB0aGUgKmludGVyY2VwdCogYW5kICpzbG9wZSogdGVybXMgaW4gdGhlIGxpbmVhciBtb2RlbC4gVGhleSBhcmUgdGhlIG1vZGVsICpjb2VmZmljaWVudHMqIG9yICpwYXJhbWV0ZXJzKi4NCg0KDQojIyMjIF9fMy4xLjEgRXN0aW1hdGluZyB0aGUgQ29lZmZpY2llbnRzX18NCg0KRml0dGluZyBhIGxpbmUgaXMgdHlwaWNhbGx5IGRvbmUgYnkgbWluaW1pemluZyB0aGUgKmxlYXN0IHNxdWFyZXMqIGNyaXRlcmlvbi4NCg0KKlJlc2lkdWFsKi0tIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlICppKnRoIG9ic2VydmVkIHJlc3BvbnNlIHZhbHVlIGFuZCB0aGUgKmkqdGggcmVzcG9uc2UgdmFsdWUgdGhhdCBpcyBwcmVkaWN0ZWQgYnkgb3VyIGxpbmVhciBtb2RlbC4NCg0KVGh1cywgdGhlIF9fKlJlc2lkdWFsIFN1bSBvZiBTcXVhcmVzIChSU1MpKl9fIGlzIHNpbXBseSB0aGUgc3VtIG9mIHRoZSBzcXVhcmVkIHJlc2lkdWFscy4NCg0KX19SU1NfXyA9ICplKl4yXn4xfiArICplKl4yXn4yfiArIC4uLiArICplKl4yXn4qbip+DQoNCiMjIyMgX18zLjEuMiBBc3Nlc3NpbmcgdGhlIEFjY3VyYWN5IG9mIHRoZSBDb2VmZmljaWVudCBFc3RpbWF0ZXNfXw0KDQpBcHByb3hpbWF0aW5nICpmKiBhcyBhIGxpbmVhciBmdW5jdGlvbiwgd2UgY2FuIHdyaXRlIHRoaXMgcmVsYXRpb25zaGlwIGFzOg0KDQoqWSogPSAqQip+MH4gKyAqQip+MX4oWCkgKyAqRSoNCg0KV2hlcmU6DQpfXypCKn4wfl9fIGlzIHRoZSBpbnRlcmNlcHQgdGVybS0tdGhlIGV4cGVjdGVkIHZhbHVlIG9mICpZKiB3aGVuICpYKiA9IDAuDQoNCmFuZA0KDQpfXypCKn4xfl9fIGlzIHRoZSBzbG9wZS0tdGhlIGF2ZXJhZ2UgaW5jcmVhc2UgaW4gKlkqIGFzc29jaWF0ZWQgd2l0aCBhIG9uZS11bml0IGluY3JlYXNlIGluICpYKi4NCg0KX19UaGUgZXJyb3IgaXMgYSBjYXRjaC1hbGwgZm9yIHdoYXQgd2UgbWlzcyB3aXRoIHRoaXMgc2ltcGxlIG1vZGVsOiB0aGUgdHJ1ZSByZWxhdGlvbnNoaXAgaXMgcHJvYmFibHkgbm90IGxpbmVhciwgdGhlcmUgbWF5IGJlIG90aGVyIHZhcmlhYmxlcyB0aGF0IGNhdXNlIHZhcmlhdGlvbiBpbiAqWSosIGFuZCB0aGVyZSBtYXkgYmUgbWVhc3VyZW1lbnQgZXJyb3IuX18NCg0KX18iQW4gdW5iaWFzZWQgZXN0aW1hdG9yIGRvZXMgbm90ICpzeXN0ZW1hdGljYWxseSogb3Zlci0gb3IgdW5kZXItZXN0aW1hdGUgdGhlIHRydWUgcGFyYW1ldGVyLl9fDQoNClRoZSBfXypzdGFuZGFyZCBlcnJvcipfXyB0ZWxscyB1cyBhcHByb3hpbWF0ZWx5IGhvdyBtdWNoIG91ciBlc3RpbWF0ZSBvZiBhIGdpdmVuIHBhcmFtZXRlciwgbWVhbiwgZXRjLmlzIGFuIG92ZXIvdW5kZXIgZXN0aW1hdGlvbi4NCg0KSXQgaXMgZXF1YWwgdG8gdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBkaXZpZGVkIGJ5IHRoZSBzYW1wbGUgc2l6ZS4NCg0KVGh1cywgdGhlIHNpbXBsZXN0IGFuZCBtb3N0IGVmZmVjdGl2ZSB3YXkgdG8gcmVkdWNlIHRoZSBzdGFuZGFyZCBlcnJvciBpcyB0byBpbmNyZWFzZSB0aGUgc2FtcGxlIHNpemUuDQoNCipTdGFuZGFyZCBlcnJvcnMqIGFyZSB1c2VkIHRvIGNvbXB1dGUgX19jb25maWRlbmNlIGludGVydmFsc19fLg0KDQpfXypQLXZhbHVlKl9fOg0KDQo+ICJSb3VnaGx5IHNwZWFraW5nLCB3ZSBpbnRlcnByZXQgdGhlIHAtdmFsdWUgYXMgZm9sbG93czogYSBzbWFsbCBwLXZhbHVlIGluZGljYXRlcyB0aGF0IGl0IGlzIHVubGlrZWx5IHRvIG9ic2VydmUgc3VjaCBhIHN1YnN0YW50aWFsIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIHByZWRpY3RvciBhbmQgdGhlIHJlc3BvbnNlIGR1ZSB0byBjaGFuY2UsIGluIHRoZSBhYnNlbmNlIG9mIGFueSByZWFsIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIHByZWRpY3RvciBhbmQgdGhlIHJlc3BvbnNlLiBIZW5jZSwgaWYgd2Ugc2VlIGEgc21hbGwgcC12YWx1ZSwgdGhlbiB3ZSBjYW4gaW5mZXIgdGhhdCB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBwcmVkaWN0b3IgYW5kIHRoZSByZXNwb25zZS4iDQoNCiMjIyMgX18zLjEuMyBBc3Nlc3NpbmcgdGhlIEFjY3VyYWN5IG9mIHRoZSBNb2RlbF9fDQoNCiJIb3cgd2VsbCBkb2VzIHRoZSBtb2RlbCBmaXQgdGhlIGRhdGE/Ig0KDQoiVGhlIHF1YWxpdHkgb2YgYSBsaW5lYXIgcmVncmVzc2lvbiBmaXQgaXMgdHlwaWNhbGx5IGFzc2Vzc2VkIHVzaW5nIHR3byByZWxhdGVkIHF1YW50aXRpZXM6DQoNCjEuIF9fUmVzaWR1YWwgU3RhbmRhcmQgRXJyb3JfXw0KMi4gX19SXjJeIFN0YXRpc3RpY19fDQoNCg0KX19SZXNpZHVhbCBTdGFuZGFyZCBFcnJvcl9fDQoNCklzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgKkUqLiBSb3VnaGx5IHNwZWFraW5nLCBpdCBpcyB0aGUgYXZlcmFnZSBhbW91bnQgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBkZXZpYXRlIGZyb20gdGhlIHRydWUgcmVncmVzc2lvbiBsaW5lLiANCg0KSXQgaXMgYSBtZWFzdXJlIG9mICpsYWNrIG9mIGZpdCogb2YgdGhlIG1vZGVsIHRvIHRoZSBkYXRhLg0KDQpfX1JeMl4gU3RhdGlzdGljX18NCg0KVGhlICpSKl4yXiBzdGF0aXN0aWMgdGFrZXMgdGhlIGZvcm0gb2YgYSAqcHJvcG9ydGlvbiotLXRoZSBwcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGV4cGxhaW5lZC4NCg0KX18qUipeMl4gPSAxIC0gKFJTUy9UU1MpX18NCg0KDQojIyMjIF9fMy4yIE11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uX18NCg0KIkV4dGVuZHMgdGhlIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBzbyB0aGF0IGl0IGNhbiBkaXJlY3RseSBhY2NvbW9kYXRlIG11bHRpcGxlIHByZWRpY3RvcnMuIg0KDQpUaGUgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6DQoNCl9fKlkgPSBCfjB+ICsgQn4xflh+MX4gKyBCfjJ+WH4yfiArIC4uLiBCfnB+WH5wfiArIEUqX18NCg0KX19XaGVyZV9fICpYfmp+KiByZXByZXNlbnRzIHRoZSAqaip0aCBwcmVkaWN0b3IgYW5kICpCfmp+KiBxdWFudGlmaWVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoYXQgdmFyaWFibGUgYW5kIHRoZSByZXNwb25zZS4gV2UgaW50ZXJwcmV0ICpCfmp+KiBhcyB0aGUgKmF2ZXJhZ2UqIGVmZmVjdCBvbiAqWSogb2YgYSBvbmUgdW5pdCBpbmNyZWFzZSBpbiAqWH5qfiosICpob2xkaW5nIGFsbCBvdGhlciBwcmVkaWN0b3JzIGZpeGVkKi4NCg0KIyMjIyBfXzMuMi4xIEVzdGltYXRpbmcgdGhlIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzX18NCg0KIyMjIyBfXzMuMi4yIFNvbWUgSW1wb3J0YW50IFF1ZXN0aW9uc19fDQoNCjEuIElzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcHJlZGljdG9ycyAqWH4xfiwgWH4yfiwgLi4uLCBYfnB+KiB1c2VmdWwgaW4gcHJlZGljdGluZyB0aGUgcmVzcG9uc2U/DQoyLiBEbyBhbGwgdGhlIHByZWRpY3RvcnMgaGVscCB0byBleHBsYWluIFksIG9yIGlzIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHByZWRpY3RvcnMgdXNlZnVsPyoNCjMuIEhvdyB3ZWxsIGRvZXMgdGhlIG1vZGVsIGZpdCB0aGUgZGF0YT8NCjQuIEdpdmVuIGEgc2V0IG9mIHByZWRpY3RvciB2YWx1ZXMsIHdoYXQgcmVzcG9uc2UgdmFsdWUgc2hvdWxkIHdlIHByZWRpY3QsIGFuZCBob3cgYWNjdXJhdGUgaXMgb3VyIHByZWRpY3Rpb24/DQoNCl9fT25lOiBJcyBUaGVyZSBhIFJlbGF0aW9uc2hpcCBCZXR3ZWVuIHRoZSBSZXNwb25zZSBhbmQgUHJlZGljdG9ycz9fXw0KDQpBcmUgYWxsIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyB6ZXJvPw0KDQpIfm9+OiAqQn4xfiA9IEJ+Mn4gPSAuLi4gPSBCfnB+ID0qIDANCg0KSH5hfjogYXQgbGVhc3Qgb25lICpCfmp+KiBpcyBub24temVyby4NCg0KX19UaGlzIGh5cG90aGVzaXMgdGVzdCBpcyBwZXJmb3JtZWQgYnkgY29tcHV0aW5nIHRoZSAqRi1zdGF0aXN0aWMqLA0KDQpJZiB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcmVzcG9uc2UgYW5kIHByZWRpY3RvcnMsIG9uZSB3b3VsZCBleHBlY3QgdGhlIEYtc3RhdGlzdGljIHRvIHRha2Ugb24gYSB2YWx1ZSBjbG9zZSB0byAxLiBJZiAqSH5hfiogaXMgdHJ1ZSwgdGhlbiB3ZSBleHBlY3QgKkYqIHRvIGJlIGdyZWF0ZXIgdGhhbiAxLg0KDQpfX1R3bzogRGVjaWRpbmcgb24gSW1wb3J0YW50IFZhcmlhYmxlc19fDQoNCl9fVGhyZWUgQ2xhc3NpY2FsIEFwcHJvYWNoZXMgZm9yIG1vZGVsIHNlbGVjdGlvbl9fDQoNCiogKkZvcndhcmQgc2VsZWN0aW9uKi4gQnVpbGQgdGhlIG1vZGVsIGZyb20gYW4gaW50ZXJjZXB0IGJ5IGFkZGluZyBwYXJhbWV0ZXJzIG9uZSBieSBvbmUgdW50aWwgd2UgZ2V0IHRoZSBvbmUgd2l0aCB0aGUgbG93ZXN0IFJTUy4NCg0KKiAqQmFja3dhcmQgc2VsZWN0aW9uKi4gU3RhcnQgd2l0aCBhbGwgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgbW9kZWwsIGFuZCByZW1vdmUgdGhlIHZhcmlhYmxlIHdpdGggdGhlIGxhcmdlc3QgcC12YWx1ZS4gV2UgY29udGludWUgdG8gcmVtb3ZlIHAtdmFsdWVzIHVudGlsIGEgc3RvcHBpbmcgcnVsZSBpcyByZWFjaGVkLiBGb3IgZXhhbXBsZSwgYWxsIHJlbWFpbmluZyB2YXJpYWJsZXMgaGF2ZSBhIHAtdmFsdWUgYmVsb3cgc29tZSB0aHJlc2hvbGQuDQoNCiogKk1peGVkIFNlbGVjdGlvbio6IENvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSB0d28gbWV0aG9kcy4NCg0KX19UaHJlZTogTW9kZWwgRml0X18NCg0KX1doYXQgaXMgaGFwcGVuaW5nIHdpdGggdGhlIFJeMl4gYW5kIHRoZSBSU0U/Xw0KDQpfX0ZvdXI6IFByZWRpY3Rpb25zX18NCg0KKlRocmVlIHNvcnRzIG9mIHVuY2VydGFpbnR5IGFzc29jaWF0ZWQgd2l0aCBwcmVkaWN0ZWQgdGhlIHJlc3BvbnNlIFkgYmFzZWQgb24gb3VyIGVzdGltYXRlZCBwYXJhbWV0ZXJzLg0KDQoxLiBUaGUgY29lZmZpY2llbnRzIGFyZSBvbmx5IGVzdGltYXRlcyBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIGNvZWZmaWNpZW50cyBhbmQgdGh1cyBpcyBvbmx5IGFuICplc3RpbWF0ZSBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHJlZ3Jlc3Npb24gbGluZSouDQoNCjIuIFRoZXJlIGlzIGFsc28gcG90ZW50aWFsbHkgcmVkdWNpYmxlIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBtb2RlbCBzZWxlY3Rpb24gcmVmZXJyZWQgdG8gYXMsICptb2RlbCBiaWFzKi4NCg0KMy4gVGhlcmUgaXMgYWx3YXlzIHJhbmRvbSBlcnJvciAqZSogaW4gdGhlIG1vZGVsLiANCg0KIyMjIyBfXzMuMyBPdGhlciBDb25zaWRlcmF0aW9ucyBpbiB0aGUgUmVncmVzc2lvbiBNb2RlbF9fDQoNCl9fMy4zLjEgUXVhbGl0YXRpdmUgUHJlZGljdG9yc19fDQoNCipQcmVkaWN0b3JzIHdpdGggT25seSBUd28gTGV2ZWxzKg0KDQpBICpkdW1teSB2YXJpYWJsZSogaXMgdXNlZCAoYSB2YXJpYWJsZSB0aGF0IHRha2VzIG9uIG9ubHkgdHdvIHBvc3NpYmxlIG51bWVyaWNhbCB2YWx1ZXMpLg0KDQpfX0ZvciBleGFtcGxlOl9fDQoNCip4fml+KiA9IDEgaWYgKmkqdGggcGVyc29uIGlzIGZlbWFsZQ0KYW5kDQoqeH5pfiogPSAwIGlmICppKnRoIHBlcnNvbiBpcyBtYWxlDQoNCl9fUmVzdWx0aW5nIGluIHRoZSBtb2RlbF9fDQoNCip5fml+ID0gQn4wfiArIEJ+MX54fml+ICsgRX5pfg0KDQpXaGVyZSAqQn4xfiogPSAwIGlmIE1BTEUNCg0KX19RdWFsaXRhdGl2ZSBQcmVkaWN0b3JzIHdpdGggTW9yZSB0aGFuIFR3byBMZXZlbHNfXw0KDQo+ICJXaGVuIGEgcXVhbGl0YXRpdmUgcHJlZGljdG9yIGhhcyBtb3JlIHRoYW4gdHdvIGxldmVscywgYSBzaW5nbGUgZHVtbXkgdmFyaWFibGUgY2Fubm90IHJlcHJlc2VudCBhbGwgcG9zc2libGUgdmFsdWVzLiBJbiB0aGlzIHNpdHVhdGlvbiwgd2UgY2FuIGNyZWF0ZSBhZGRpdGlvbmFsIGR1bW15IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsIGZvciB0aGUgKmV0aG5pY2l0eSogdmFyaWFibGUgd2UgY3JlYXRlIHR3byBkdW1teSB2YXJpYWJsZXMuIg0KDQpGb3IgZXhhbXBsZToNCg0KKnh+aTF+KiA9IDEgLS0+IGlmICppKnRoIHBlcnNvbiBpcyBBc2lhbg0KYW5kIDAgaWYgKmkqdGggcGVyc29uIGlzIG5vdCBBc2lhbiwNCg0KYW5kIHRoZSBzZWNvbmQgY291bGQgYmUNCg0KKnh+aTJ+KiA9IDEgaWYgKmkqdGggcGVyc29uIGlzIENhdWNhc2lhbg0KYW5kIDAgaWYgKmkqdGggcGVyc29uIGlzIG5vdCBDYXVjYXNpYW4uDQoNClRoZSBsZXZlbCB3aXRoIG5vIGR1bW15IHZhcmlhYmxlIGlzIHRoZSAqYmFzZWxpbmUqLg0KDQojIyMjIF9fMy4zLjIgRXh0ZW5zaW9ucyBvZiB0aGUgTGluZWFyIE1vZGVsX18NCg0KVHdvIGltcG9ydGFudCBhc3N1bXB0aW9ucyBvZiB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWw6DQoNCjEuIFRoZSAqYWRkaXRpdmUgYXNzdW1wdGlvbiogbWVhbnMgdGhhdCB0aGUgZWZmZWN0IG9mIGNoYW5nZXMgaW4gYSBwcmVkaWN0b3IgWH5qfiBvbiB0aGUgcmVzcG9uc2UgWSBpcyBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWVzIG9mIHRoZSBvdGhlciBwcmVkaWN0b3JzLiANCg0KMi4gVGhlICpsaW5lYXIgYXNzdW1wdGlvbiogc3RhdGVzIHRoYXQgdGhlIGNoYW5nZSBpbiB0aGUgcmVzcG9uc2UgWSBkdWUgdG8gYSBvbmUtdW5pdCBjaGFuZ2UgaW4gWH5qfiBpcyBjb25zdGFudCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgWCpqKi4gDQoNCl9fUmVtb3ZpbmcgdGhlIEFkZGl0aXZlIEFzc3VtcHRpb25fXw0KDQpUaGVyZSBtYXkgYmUgc3luZXJnaXN0aWMgY2FzZXMsIHdoZXJlIGFuIGluY3JlYXNlIGluIG9uZSB2YXJpYWJsZSBoYXMgYSA+MSBlZmZlY3Qgb24gYW5vdGhlciB2YXJpYWJsZSAoaXQgaW5jcmVhc2VzIGl0cyBzbG9wZSkuIFVzaW5nIGFuICppbnRlcmFjdGlvbiB0ZXJtKiwgYWxsb3dzIHVzIHRvIGluY29ycG9ydGUgdGhpcyBpbiBsaW5lYXIgbW9kZWxzLg0KDQpfX05vbi1saW5lYXIgcmVsYXRpb25zaGlwc19fDQoNCllvdSBjYW4gdXNlIHBvbHlub21pYWxzIGluIGxpbmVhciBtb2RlbHMgdG8gYmV0dGVyIGNhcHR1cmUgcmVsYXRpb25zaGlwcyB3aXRoIHNvbWUgY3VydmF0dXJlIC4NCg0KKlBvbHlub21pYWwgcmVncmVzc2lvbioNCg0KIyMjIyBfXzMuMy4zIFBvdGVudGlhbCBQcm9ibGVtc19fDQoNCjEuIE5vbi1saW5lYXJpdHkgb2YgdGhlIHJlc3BvbnNlLXByZWRpY3RvciByZWxhdGlvbnNoaXBzDQoyLiBDb3JyZWxhdGlvbiBvZiBlcnJvciB0ZXJtcw0KMy4gTm9uLWNvbnN0YW50IHZhcmlhbmNlIG9mIGVycm9yIHRlcm1zDQo0LiBPdXRsaWVycw0KNS4gSGlnaC1sZXZlcmFnZSBwb2ludHMNCjYuIENvbGxpbmVhcml0eQ0KDQpfXzEuIE5vbi1saW5lYXJpdHkgb2YgdGhlIERhdGFfXw0KDQoqUmVzaWR1YWwgcGxvdHMqIGFyZSBhIHVzZWZ1bCBncmFwaGljYWwgdG9vbCBmb3IgaWRlbnRpZnlpbmcgbm9uLWxpbmVhcml0eS4NCg0KX18yLiBDb3JyZWxhdGlvbiBvZiBFcnJvciBUZXJtc19fDQoNCiJJZiB0aGVyZSBpcyBjb3JyZWxhdGlvbiBhbW9uZyB0aGUgZXJyb3IgdGVybXMsIHRoZW4gdGhlIGVzdGltYXRlZCBzdGFuZGFyZCBlcnJvcnMgd2lsbCB0ZW5kIHRvIHVuZGVyZXN0aW1hdGUgdGhlIHRydWUgc3RhbmRhcmQgZXJyb3JzLi4uIEluIHNob3J0LCBpZiB0aGUgZXJyb3IgdGVybXMgYXJlIGNvcnJlbGF0ZWQsIHdlIG1heSBoYXZlIGFuIHVud2FycmFudGVkIHNlbnNlIG9mIGNvbmZpZGVuY2UgaW4gb3VyIG1vZGVsLiINCg0KQ29ycmVsYXRpb25zIGluIHRoZSBjb250ZXh0IG9mICp0aW1lIHNlcmllcyogZGF0YSBmcmVxdWVudGx5IG9jY3VyIGluIHRoZSBjb250ZXh0IG9mICp0aW1lIHNlcmllcyogZGF0YS4gDQoNCl9fMy4gTm9uLWNvbnN0YW50IFZhcmlhbmNlIG9mIEVycm9yIFRlcm1zX18NCg0KKkhldGVyb3NjZWRhc3RpY2l0eSo6IG5vbi1jb25zdGFudCB2YXJpYW5jZXMgaW4gdGhlIGVycm9ycy4gQSAqZnVubmVsIHNoYXBlKiBpbiB0aGUgcmVzaWR1YWwgcGxvdCBpcyBhbiBlYXN5IHdheSB0byBpZGVudGlmeSBpdHMgcHJlc2VuY2UuIA0KDQpIZXRlcm9zY2VkYXN0aWNpdHkgb2NjdXJzIHdoZW4gdGhlIG1hZ25pdHVkZSBvZiB0aGUgcmVzaWR1YWxzIHRlbmRzIHRvIGluY3JlYXNlIHdpdGggdGhlIGZpdHRlZCB2YWx1ZXMuDQoNCl9fNC4gT3V0bGllcnNfXyANCg0KQW4gKm91dGxpZXIqIGlzIGEgcG9pbnQgZm9yIHdoaWNoICp5fml+KiBpcyBmYXIgZnJvbSB0aGUgdmFsdWUgcHJlZGljdGVkIGJ5IHRoZSBtb2RlbC4NCg0KUGxvdHRpbmcgdGhlICpzdHVkZW50aXplZCByZXNpZHVhbHMqIGhlbHBzIGlkZW50aWZ5IG91dGxpZXJzLg0KDQotT2JzZXJ2YXRpb25zIHdob3NlIHN0dWRlbnRpemVkIHJlc2lkdWFscyBhcmUgZ3JlYXRlciB0aGFuIDMgaW4gYWJzb2x1dGUgdmFsdWUgYXJlIHBvc3NpYmxlIG91dGxpZXJzLg0KDQpJbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCBPdXRsaWVycyByZWZlciB0byBvYnNlcnZhdGlvbnMgZm9yIHdoaWNoIHRoZSByZXNwb25zZSAqeX5pfiogaXMgdW51c3VhbCBnaXZlbiB0aGUgcHJlZGljdG9yICp4fml+Ki4NCg0KX181LiBIaWdoIExldmVyYWdlIFBvaW50c19fDQoNCk9ic2VydmF0aW9ucyB3aXRoICpoaWdoIGxldmVyYWdlKiBoYXZlIGFuIHVudXN1YWwgdmFsdWUgZm9yICp4fml+Ki4NCg0KX182LiBDb2xsaW5lYXJpdHlfXw0KDQpSZWZlcnMgdG8gdGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0d28gb3IgbW9yZSBwcmVkaWN0b3IgdmFyaWFibGVzIGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8gb25lIGFub3RoZXIuIA0KDQpUaGUgcHJlc2VuY2Ugb2YgY29sbGluZWFyaXR5IGNhbiBtYWtlIGl0IGRpZmZpY3VsdCB0byBzZXBhcmF0ZSBvdXQgdGhlIGluZGl2aWR1YWwgZWZmZWN0cyBvZiBjb2xsaW5lYXIgdmFyaWFibGVzIG9uIHRoZSByZXNwb25zZS4NCg0KVGhlICpwb3dlciogb2YgdGhlIGh5cG90aGVzaXMgdGVzdC0tdGhlIHByb2JhYmlsaXR5IG9mIGNvcnJlY3RseSBkZXRlY3RpbmcgYSAqbm9uLXplcm8qIGNvZWZmaWNpZW50LS1pcyByZWR1Y2VkIGJ5IGNvbGxpbmVhcml0eS4NCg0KKk11bHRpY29sbGluZWFyaXR5KiBjYW4gb2NjdXIgZXZlbiBpZiBubyBwYWlyIG9mIHZhcmlhYmxlcyBoYXMgYSBwYXJ0aWN1bGFybHkgaGlnaCBjb3JyZWxhdGlvbiwgYnV0IGlmIGNvbGxpbmVhcml0eSBleGlzdHMgYmV0d2VlbiB0aHJlZSBvciBtb3JlIHZhcmlhYmxlcy4NCg0KVGhlICpWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yKiBfXyhWSUYpX18gaXMgYSBiZXR0ZXIgd2F5IG9mIGFzc2Vzc2luZyBtdWx0aWNvbGxpbmVhcml0eS4NCg0KQXMgYSBydWxlIG9mIHRodW1iLCBhIFZJRiB2YWx1ZSB0aGF0IGV4Y2VlZHMgNSBvciAxMCBpbmRpY2F0ZXMgYSBwcm9ibGVtYXRpYyBhbW91bnQgb2YgY29sbGluZWFyaXR5Lg0KDQpfX1R3byBzaW1wbGUgc29sdXRpb25zOl9fDQoNCjEuIERyb3Agb25lIG9mIHRoZSBwcm9ibGVtYXRpYyB2YXJpYWJsZXMgZnJvbSB0aGUgcmVncmVzc2lvbi4NCg0KMi4gQ29tYmluZSB0aGUgY29sbGluZWFyIHZhcmlhYmxlcyB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHByZWRpY3Rvci4gDQoNCiMjIyMgX18zLjQgVGhlIE1hcmtldGluZyBQbGFuX18NCg0KKEJhc2ljYWxseSBqdXN0IGEgcmV2aWV3IG9mIGV2ZXJ5dGhpbmcgYWJvdmUpDQoNCiMjIyMgX18zLjUgQ29tcGFyaXNvbiBvZiBMaW5lYXIgUmVncmVzc2lvbiB3aXRoIEstTmVhcmVzdCBOZWlnaGJvcnNfXw0KDQpLLW5lYXJlc3QgbmVpZ2hib3JzIHJlZ3Jlc3Npb24gKEtOTiByZWdyZXNzaW9uKS4NCg0KDQoNCiMjIyMgX18zLjYgTGFiOiBMaW5lYXIgUmVncmVzc2lvbg0KDQpfXzMuNi4xIExpYnJhcmllc19fDQoNCmBgYHtyfQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShJU0xSKQ0KYGBgDQoNCmBgYHtyfQ0KZml4KEJvc3RvbikNCm5hbWVzKEJvc3RvbikNCmBgYA0KDQpgYGB7cn0NCmxtLmZpdD1sbShtZWR2fmxzdGF0LEJvc3RvbikNCmF0dGFjaChCb3N0b24pDQpsbS5maXQNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkobG0uZml0KQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMobG0uZml0KQ0KYGBgDQoNCmBgYHtyfQ0KY29uZmludChsbS5maXQpDQpgYGANCg0KYGBge3J9DQpwcmVkaWN0KGxtLmZpdCxkYXRhLmZyYW1lKGxzdGF0PWMoNSwxMCwxNSkpLGludGVydmFsPSJjb25maWRlbmNlIikNCmBgYA0KDQpgYGB7cn0NCnByZWRpY3QobG0uZml0LGRhdGEuZnJhbWUobHN0YXQ9Yyg1LDEwLDE1KSksaW50ZXJ2YWw9InByZWRpY3Rpb24iKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChsc3RhdCxtZWR2KQ0KYWJsaW5lKGxtLmZpdCkNCmBgYA0KDQpgYGB7cn0NCnBsb3QobHN0YXQsbWVkdikNCmFibGluZShsbS5maXQpDQphYmxpbmUobG0uZml0LGx3ZD0zKQ0KYWJsaW5lKGxtLmZpdCxsd2Q9Myxjb2w9InJlZCIpDQpwbG90KGxzdGF0LG1lZHYsY29sPSJyZWQiKQ0KcGxvdChsc3RhdCxtZWR2LHBjaD0yMCkNCnBsb3QobHN0YXQsbWVkdixwY2g9IisiKQ0KcGxvdCgxOjIwLDE6MjAscGNoPTE6MjApDQpgYGANCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChsbS5maXQpDQpgYGANCg0KYGBge3J9DQpwbG90KHByZWRpY3QobG0uZml0KSxyZXNpZHVhbHMobG0uZml0KSkNCnBsb3QocHJlZGljdChsbS5maXQpLHJzdHVkZW50KGxtLmZpdCkpDQpgYGANCg0KYGBge3J9DQpwbG90KGhhdHZhbHVlcyhsbS5maXQpKQ0Kd2hpY2gubWF4KGhhdHZhbHVlcyhsbS5maXQpKQ0KYGBgDQoNCiMjIyMgX18zLjYuMyBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbl9fDQoNCmBgYHtyfQ0KbG0uZml0PWxtKG1lZHZ+bHN0YXQrYWdlLGRhdGE9Qm9zdG9uKQ0Kc3VtbWFyeShsbS5maXQpDQpgYGANCg0KYGBge3J9DQpsbS5maXQ9bG0obWVkdn4uLGRhdGE9Qm9zdG9uKQ0Kc3VtbWFyeShsbS5maXQpDQpgYGANCg0KYGBge3J9DQpsbS5maXQxPWxtKG1lZHZ+Li1hZ2UsZGF0YT1Cb3N0b24pDQpzdW1tYXJ5KGxtLmZpdDEpDQpgYGANCg0KIyMjIyBfXzMuNi40IEludGVyYWN0aW9uIHRlcm1zX18NCg0KYGBge3J9DQpzdW1tYXJ5KGxtKG1lZHZ+bHN0YXQqYWdlLGRhdGE9Qm9zdG9uKSkNCmBgYA0KDQojIyMjIF9fMy42LjUgTm9uLWxpbmVhciBUcmFuc2Zvcm1hdGlvbnMgb2YgdGhlIFByZWRpY3RvcnNfXw0KDQpgYGB7cn0NCmxtLmZpdDI9bG0obWVkdn5sc3RhdCtJKGxzdGF0XjIpKQ0Kc3VtbWFyeShsbS5maXQpDQpgYGANCg0KYGBge3J9DQpsbS5maXQ9bG0obWVkdn5sc3RhdCxkYXRhPUJvc3RvbikNCmFub3ZhKGxtLmZpdCxsbS5maXQyKQ0KYGBgDQoNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QobG0uZml0MikNCmBgYA0KDQpgYGB7cn0NCmxtLmZpdDU9bG0obWVkdn5wb2x5KGxzdGF0LDUpKQ0Kc3VtbWFyeShsbS5maXQ1KQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShsbShtZWR2fmxvZyhybSksZGF0YT1Cb3N0b24pKQ0KYGBgDQoNCiMjIyMgX18zLjYuNiBRdWFsaXRhdGl2ZSBQcmVkaWN0b3JzX18NCg0KYGBge3J9DQpmaXgoQ2Fyc2VhdHMpDQpuYW1lcyhDYXJzZWF0cykNCmBgYA0KDQpgYGB7cn0NCmxtLmZpdD1sbShTYWxlc34uK0luY29tZTpBZHZlcnRpc2luZytQcmljZTpBZ2UsZGF0YT1DYXJzZWF0cykNCnN1bW1hcnkobG0uZml0KQ0KYGBgDQoNCmBgYHtyfQ0KYXR0YWNoKENhcnNlYXRzKQ0KY29udHJhc3RzKFNoZWx2ZUxvYykNCmBgYA0KDQojIyMjIF9fMy43IEV4ZXJjaXNlc19fDQoNCipDb25jZXB0dWFsKg0KDQoxLiBUaGUgTnVsbCBoeXBvdGhlc2lzIC0tPiBfX0h+MH46X18gKkJ+MX4qID0gMCBpcyB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG91ciBwcmVkaWN0b3IgKHNhbGVzKSBhbmQgb3VyIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgYWR2ZXJ0aXNpbmcgb24gKFRWLCByYWRpbywgYW5kIG5ld3NwYXBlcikuIFRoZSBjb2VmZmljaWVudCwgQiwgcmVwcmVzZW50cyB0aGUgc2xvcGUgb2YgdGhlIGNoYW5nZSBpbiBZIGdpdmVuIGEgY2hhbmdlIGluIFguIFRodXMsIGlmIHRoZSBzbG9wZSA9IDAsIHRoZXJlIGlzIG5vIGNoYW5nZS4gDQoNCjIuIA0KDQozYS4NCg0KX19GZW1hbGU6X18gODUgKyAyMChHUEEpICsgLjA3KElRKSArIC4wMShHUEE6SVEpIC0xMChHUEEpDQoNCl9fTWFsZTpfXyA1MCArIDIwKEdQQSkgKyAuMDcoSVEpICsgLjAxKEdQQTpJUSkNCg0KSWYgR1BBIGlzIDMuNSwgTWFsZXMgYW5kIEZlbWFsZXMgaGF2ZSB0aGUgc2FtZSBzdGFydGluZyBzYWxhcnkuIElmIGJlbG93IDMuNSwgZmVtYWxlcyB3aWxsIGhhdmUgYSBoaWdoZXIgc3RhcnRpbmcgc2FsYXJ5LiBJZiBhYm92ZSAzLjUsIG1hbGVzIHdpbGwgaGF2ZSBhIGhpZ2hlciBzdGFydGluZyBzYWxhcnkuDQoNCjNiLg0KDQpfX0ZlbWFsZTpfXyA4NSArIDIwKDQpICsgLjA3KDExMCkgKyAuMDEoNDoxMTApIC0xMCg0KSA9IDEzNy4xDQoNCjNjLg0KDQpGYWxzZSwgYSBzbWFsbCBjb2VmZmljaWVudCBzaW1wbHkgdGVsbHMgdXMgdGhlIHNsb3BlIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBvdXIgcGFyYW1ldGVyIGFuZCByZXNwb25zZSB2YXJpYWJsZS4gQSBsYXJnZSBwLXZhbHVlIHdvdWxkIGluZGljYXRlIGxpdHRsZSBldmlkZW5jZSBvZiBhbiBpbnRlcmFjdGlvbiBlZmZlY3QuIA0KDQo0YS4NCg0KV2Ugd291bGQgZXhwZWN0IHRoZSB0cmFpbmluZyBSZXNpZHVhbCBTdW0gb2YgU3F1YXJlcyBmb3IgdGhlIGN1YmljIHJlZ3Jlc3Npb24gdG8gYmUgbGVzcyBiZWNhdXNlIHRoZSBtb2RlbCB3b3VsZCBiZSBhYmxlIHRvIGZpdCB0aGUgZGF0YSBtb3JlIGFjY3VyYXRlbHkuIEhvd2V2ZXIsIHRoaXMgaXMgY29tcGxpY2F0ZWQgaWYgdGhlIHRydWUgZm9ybSBvZiB0aGUgZGF0YSBpcyBsaW5lYXIuDQoNCjRiLg0KDQpBZ2FpbiwgaXQgZGVwZW5kcyBvbiB0aGUgdHJ1ZSBmb3JtIG9mIHRoZSBkYXRhLCBidXQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgY3ViaWMgcmVncmVzc2lvbiBpbiB0aGUgdHJhaW5pbmcgZGF0YSAib3ZlcmZpdCIgdGhlIGRhdGEsIHRoZW4gd2Ugd291bGQgZXhwZWN0IGl0IHRvIGhhdmUgbG93IGFwcGxpY2FiaWxpdHkgdG8gdGhlIHJlYWwgInRlc3QiIGRhdGEgYW5kIHRodXMgd291bGQgZXhwZWN0IHRoZSBSU1MgdG8gYmUgaGlnaGVyIGZvciB0aGUgY3ViaWMgcmVncmVzc2lvbiBpbiB0aGlzIGNhc2UuDQoNCjRjLiBBZ2Fpbiwgd2Ugd291bGQgZXhwZWN0IHRoZSBjdWJpYyByZWdyZXNzaW9uIHRvIGhhdmUgYSBsb3dlciBSU1MuDQoNCjRkLiBJdCBkZXBlbmRzIG9uIGhvdyBjbG9zZSB0byBsaW5lYXIgdGhlIHRydWUgbW9kZWwgaXMuIElmIHRoZSBtb2RlbCBpcyBjbG9zZXIgdG8gbGluZWFyLCB0aGVuIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBpcyBiZXR0ZXIuIEhvd2V2ZXIsIGlmIHRoZSB0cnVlIG1vZGVsIGlzIG5vdCB2ZXJ5IGNsb3NlIHRvIGxpbmVhciBhdCBhbGwgdGhlbiB0aGUgY3ViaWMgcmVncmVzc2lvbiBpcyBtdWNoIG1vcmUgYXBwcm9wcmlhdGUuDQoNCjUuDQoNCjYuIF9fTm90ZV9fIGluIHRoZSBjYXNlIG9mIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiwgdGhlIGxlYXN0IHNxdWFyZXMgbGluZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhlIG1lYW5zIG9mIHRoZSBwcmVkaWN0b3IgYW5kIHRoZSByZXNwb25zZS4NCg0KNy4NCg0KX18qQXBwbGllZCpfXw0KDQoNCjhhLg0KYGBge3J9DQpsbS5hdXRvPWxtKG1wZ35ob3JzZXBvd2VyLGRhdGE9QXV0bykNCnN1bW1hcnkobG0uYXV0bykNCmBgYA0KDQppLiBUaGUgRi1zdGF0aXN0aWMgdmFsaWRhdGVzIHRoZSBtb2RlbCBhbmQgdGhlIHAtdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgdGhlIGNvZWZmaWNpZW50Lg0KDQppaS4gVGhlcmUgaXMgYW4gaW52ZXJzZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcHJlZGljdG9yIGFuZCByZXNwb25zZS4gQW4gaW5jcmVhc2UgaW4gaG9yc2Vwb3dlciBvZiAxMDAgbGVhZHMgdG8gYSByZWR1Y3Rpb24gaW4gbXBnIG9mIDE1LiBBY2NvcmRpbmdseSwgb3VyIGFkanVzdGVkIFItU3F1YXJlZCB0ZWxscyB1cyB0aGF0IGFib3V0IDYwJSBvZiB0aGUgdmFyaWF0aW9uIGluIG91ciBtcGcgY2FuIGJlIGV4cGxhaW5lZCBieSBob3JzZXBvd2VyLg0KDQppaWkuIE5lZ2F0aXZlDQoNCml2Lg0KDQoNCmBgYHtyfQ0KcHJlZGljdChsbS5hdXRvLGRhdGEuZnJhbWUoaG9yc2Vwb3dlcj1jKDk4KSksaW50ZXJ2YWw9ImNvbmZpZGVuY2UiKQ0KcHJlZGljdChsbS5hdXRvLGRhdGEuZnJhbWUoaG9yc2Vwb3dlcj1jKDk4KSksaW50ZXJ2YWw9InByZWRpY3Rpb24iKQ0KYGBgDQoNCmBgYHtyfQ0KYXR0YWNoKEF1dG8pDQpgYGANCmBgYHtyfQ0KcGxvdChob3JzZXBvd2VyLG1wZykNCmFibGluZShsbS5hdXRvLGNvbD0icmVkIikNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KGxtLmF1dG8pDQpgYGANCg0KRXhhbWluaW5nIHRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QgZGVtb25zdHJhdGVzIHRoYXQgb3VyIHJlc2lkdWFscyBhcmUgdHJhY2tpbmcgb3VyIGZpdHRlZCB2YWx1ZXMuIFRoaXMgZGVtb25zdHJhdGVzIGFuIGlzc3VlIG9mIG5vbi1saW5lYXJpdHkgb2YgdGhlIGRhdGEuIFdlIGNvdWxkIHBvdGVudGlhbGx5IHJlc29sdmUgdGhpcyBieSBwbG90dGluZyBhZGRpbmcgaG9yc2Vwb3dlcl4yIGFzIHRoZSBwbG90IG9mIG91ciByZWxhdGlvbnNoaXAgZGVtb25zdHJhdGVzIGEgbm9uLWxpbmVhciByZWxhdGlvbnNoaXAuIFdlIGFsc28gYXBwZWFyIHRvIGhhdmUgc29tZSBoaWdoIGxldmVyYWdlIHBvaW50cyB0aGF0IGNhbiBwb3RlbnRpYWxseSBiZSBmdXJ0aGVyIGZsZXNoZWQgb3V0IHZpYSB0aGUgc3R1ZGVudGl6ZWQgcmVzaWR1YWxzLiBUaGUgcGxvdCBiZWxvdyBzaG93cyANCg0KYGBge3J9DQpwbG90KHByZWRpY3QobG0uYXV0bykscnN0dWRlbnQobG0uYXV0byksY29sPWlmZWxzZShyc3R1ZGVudChsbS5hdXRvKT49MywicmVkIiwiYmxhY2siKSkrDQp0ZXh0KHByZWRpY3QobG0uYXV0bykscnN0dWRlbnQobG0uYXV0byksbGFiZWxzPWlmZWxzZShyc3R1ZGVudChsbS5hdXRvKT49Mi41LG5hbWVzKHdoaWNoKHJzdHVkZW50KGxtLmF1dG8pPj0zKSksIiIpLHBvcz00KQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChoYXR2YWx1ZXMobG0uYXV0byksY29sPWlmZWxzZShoYXR2YWx1ZXMobG0uYXV0byk+LjAyOCwicmVkIiwiYmxhY2siKSkrdGV4dChoYXR2YWx1ZXMobG0uYXV0byksbGFiZWxzPWlmZWxzZShoYXR2YWx1ZXMobG0uYXV0byk+LjAyOCxuYW1lcyh3aGljaC5tYXgoaGF0dmFsdWVzKGxtLmF1dG8pPi4wMjgpKSwiIiksY2V4PS43LHBvcz00KQ0KYGBgDQoNCmBgYHtyfQ0KcGFpcnMofi4sZGF0YT1BdXRvKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKEF1dG9bLC05XSkNCmBgYA0KDQppLg0KDQpgYGB7cn0NCmxtLmF1dG8yPWxtKG1wZ34uLW5hbWUsZGF0YT1BdXRvKQ0Kc3VtbWFyeShsbS5hdXRvMikNCmBgYA0KDQppaS4gWWVzLCBleGNsdWRpbmcgY3lsaW5kZXJzLCBob3JzZXBvd2VyIGFuZCBhY2NlbGVyYXRpb24uIFRoZSBGLXN0YXRpc3RpYyB2YWxpZGF0ZXMgdGhlIG1vZGVsLiBUaGUgbW9kZWwgYWNvdW50cyBmb3IgYWJvdXQgODIlIG9mIHRoZSB2YXJpYXRpb24gaW4gbXBnLg0KDQppaWkuIEV2ZXJ5IHRlbiB5ZWFycywgdGhlIGF2ZXJhZ2UgbXBnIGluY3JlYXNlcyBieSA3LjUNCg0KZC4NCg0KYGBge3J9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChsbS5hdXRvMikNCmBgYA0KDQpUaGUgZGF0YSBhcHBlYXJzIHRvIGJlIHByZXR0eSBsaW5lYXIuIFRoZSByZXNpZHVhbHMgc2VlbSB0byBiZSBwcmV0dHkgZXF1YWxseSBkaXN0cmlidXRlZCBhbG9uZyBib3RoIHNpZGVzIG9mIHRoZSBsaW5lIG9mIGZpdCBzbyB0aGVyZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgZXZpZGVuY2Ugb2YgY29ycmVsYXRpb24gYW1vbmcgc2VxdWVudGlhbCByZXNpZHVhbHMuIFdlIG1heSBoYXZlIHNvbWUgb3V0bGllcnMgYW5kIHJlc2lkdWFscyB3aGljaCBhcmUgbGFiZWxlZCBpbiB0aGUgcGxvdC4gDQoNCmBgYHtyfQ0KbG0uYXV0bzM9bG0obXBnfi4tbmFtZStob3JzZXBvd2VyOmFjY2VsZXJhdGlvbi1jeWxpbmRlcnMtZGlzcGxhY2VtZW50LGRhdGE9QXV0bykNCnN1bW1hcnkobG0uYXV0bzMpDQpgYGANCg0KYGBge3J9DQpsbS5hdXRvND1sbShtcGd+aG9yc2Vwb3dlcitJKGhvcnNlcG93ZXJeMiksZGF0YT1BdXRvKQ0Kc3VtbWFyeShsbS5hdXRvNCkNCmBgYA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KGxtLmF1dG80KQ0KYGBgDQoNCmBgYHtyfQ0KYXR0YWNoKENhcnNlYXRzKQ0KYGBgDQoNCjEwYS4NCg0KYGBge3J9DQpzdW1tYXJ5KENhcnNlYXRzKQ0KY29udHJhc3RzKFNoZWx2ZUxvYykNCmBgYA0KDQpgYGB7cn0NCmxtLmNhcnM9bG0oU2FsZXN+UHJpY2UrVXJiYW4rVVMsZGF0YT1DYXJzZWF0cykNCnN1bW1hcnkobG0uY2FycykNCmBgYA0KDQpiLiBQcmljZSBoYXMgYSBuZWdhdGl2ZSByZWxhdGlvbnNoaXAgd2l0aCBTYWxlcy4gVGh1cywgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiB0aGUgc2FsZSBwcmljZSBvZiBjYXJzZWF0cyByZXN1bHRzIGluIGEgcmVkdWN0aW9uIGluIHNhbGVzIGJ5IC4wNS4gVXJiYW5ZZXMgSSdtIGFzc3VtaW5nIGlzIGEgbWVhc3VyZSBvZiB3aGV0aGVyIG9yIG5vdCBpdCBpcyBzb2xkIGluIGFuIGFyZWEgYW5kIHdoaWxlIGFsdGhvdWdoIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB0aGUgcmVsYXRpb25zaGlwIHN1Z2dlc3RzIHRoYXQgc2FsZXMgb2YgY2Fyc2VhdHMgaW4gdXJiYW4gYXJlYXMgYXJlIC4wMiBsb3dlciB0aGFuIHRoZWlyIGJhc2VsaW5lIGNvdW50ZXJwYXJ0IG9mIG5vdCBpbiB1cmJhbiBhcmVhcy4gSSBiZWxpZXZlIFVTWUVzIGlzIHNpbWlsYXIuIElmIGl0IGlzIHNvbGQgaW4gdGhlIFVTIGl0J3Mgc2FsZXMgYXJlIDEuMiBoaWdoZXIgdGhhbiB0aGVpciBiYXNlbGluZSBvZiBub3QgZXF1aXZhbGVudCBvciBzdG9yZXMgaW4gdGhlIFVTIGRvIGFib3V0ICQxMjAwIGJldHRlciBpbiB0ZXJtcyBvZiBzYWxlcy4NCg0KYy4gU2FsZXMgPSAxMy4wNCAtIC4wNShQcmljZSkgLSAwMihJZlVyYmFuKSArIDEuMihJZlVTKSBfX2lmX18gVXJiYW4gYW5kIFVTICJOTyIgdGhlbiBTYWxlcyA9IDEzLjA0IC0uMDUoUHJpY2UpDQoNCmQuIFByaWNlIGFuZCBVU1llcw0KDQplLg0KDQpgYGB7cn0NCmxtLmNhcnMyPWxtKFNhbGVzflByaWNlK1VTLGRhdGE9Q2Fyc2VhdHMpDQpzdW1tYXJ5KGxtLmNhcnMyKQ0KYGBgDQoNCmYuIEFmdGVyIHJlbW92aW5nICJVcmJhbiIgd2Ugbm90ZSB0aGF0IHRoZXJlIHdhcyBhbG1vc3Qgbm8gY2hhbmdlIGluIHRoZSBSLVNxdWFyZWQgdmFsdWUgZGVtb25zdHJhdGluZyB0aGF0IFVyYmFuIHdhcyBub3QgdXNlZnVsIGluIGV4cGxhaW5pbmcgdmFyaWF0aW9uIGluIHNhbGVzLiBGdXJ0aGVybW9yZSwgd2Ugbm90ZSBhIGdyZWF0ZXIgRi1TdGF0aXN0aWMgYW5kIHRoZSBSZXNpZHVhbCBTdGFuZGFyZCBFcnJvciBhY3R1YWxseSBkZWNyZWFzZWQgKGFsdGhvdWdoIG5vdCBieSBtdWNoKSBpbiBvdXIgbmV3ZXIgbW9kZWwuDQoNCmcuIA0KYGBge3J9DQpjb25maW50KGxtLmNhcnMyKQ0KYGBgDQoNCmguDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KGxtLmNhcnMyKQ0KYGBgDQoNClRoZSBwbG90cyBsb29rIHByZXR0eSBnb29kLiBObyBldmlkZW50IGlzc3VlcyBvZiBub24tbGluZWFyaXR5IG9yIGNvcnJlbGF0ZWQgcmVzaWR1YWxzLCBidXQgdGhlIHBsb3Qgb2YgcmVzaWR1YWxzIHZzIGxldmVyYWdlIGRlbW9uc3RyYXRlcyB0aGF0IHdlIGxpa2VseSBoYXZlIHNvbWUgaGlnaCBsZXZlcmFnZSBwb2ludHMuDQoNCjExLg0KDQpgYGB7cn0NCnNldC5zZWVkKDEpDQp4PXJub3JtKDEwMCkNCnk9Mip4K3Jub3JtKDEwMCkNCmBgYA0KDQphLg0KYGBge3J9DQpsbS5lcXVhdD1sbSh5fngrMCkNCnN1bW1hcnkobG0uZXF1YXQpDQpgYGANCg0KYi4NCmBgYHtyfQ0KbG0uZXF1YXQyPWxtKHh+eSswKQ0Kc3VtbWFyeShsbS5lcXVhdDIpDQpgYGANCg0KYy4gVGhlIHJlc3VsdHMgYXJlIHRoZSBzYW1lIGV4Y2VwdCBmb3IgdGhlIGVzdGltYXRlcyBvZiB0aGUgY29lZmZpY2llbnRzIGFuZCB0aGUgcmVzaWR1YWxzLiBUaGV5IGhhdmUgdGhlIHNhbWUgUi1zcXVhcmVkcywgRi1zdGF0aXN0aWNzIGFuZCBwLXZhbHVlcy4NCg0KZC4NCg0KZS4gDQoNCmYuDQoNCmBgYHtyfQ0KbG0uZXF1YXQ9bG0oeX54KQ0Kc3VtbWFyeShsbS5lcXVhdCkNCmBgYA0KDQpgYGB7cn0NCmxtLmVxdWF0Mj1sbSh4fnkpDQpzdW1tYXJ5KGxtLmVxdWF0MikNCmBgYA0KDQoxMi4gKFNraXBwZWQpDQoNCjEzLiANCg0KYS4NCg0KYGBge3J9DQpzZXQuc2VlZCgxKQ0KeD1ybm9ybSgxMDAsMCwxKQ0KYGBgDQoNCmIuDQoNCmBgYHtyfQ0KZXBzPXJub3JtKDEwMCwwLC4yNSkNCmBgYA0KDQpjLg0KDQpgYGB7cn0NCnk9LTErLjUqeCtlcHMNCmBgYA0KDQpgYGB7cn0NCmxlbmd0aCh5KQ0KYGBgDQoNCl9fKkJ+MH4qX18gPSAtMSBhbmQgX18qQn4xfipfXyA9IC41DQoNCmQuDQpgYGB7cn0NCnNjYXR0ZXIuc21vb3RoKHgseSkNCmBgYA0KDQpUaGUgcmVsYXRpb25zaGlwIGlzIHBlcmZlY3RseSBsaW5lYXIuDQoNCmUuDQpgYGB7cn0NCmxtLmVxdWF0Mz1sbSh5fngpDQpzdW1tYXJ5KGxtLmVxdWF0MykNCmBgYA0KDQpUaGUgcHJlZGljdGVkIHZhbHVlcyBvZiBCfjB+IGFuZCBCfjF+IGFyZSBhbG1vc3QgaWRlbnRpY2FsIHRvIHRoZSBhY3R1YWwgdmFsdWVzLg0KDQpmLg0KYGBge3J9DQpjb2VmKGxtLmVxdWF0MykNCmBgYA0KDQpgYGB7cn0NCnBsb3QoeCx5LHBjaD0yMCkNCmFibGluZShjb2VmPWMoLTEsMC41KSxjb2w9InJlZCIpDQphYmxpbmUoY29lZihsbS5lcXVhdDMpLGNvbD0iZ3JlZW4iKQ0KbGVnZW5kKCJib3R0b21yaWdodCIsbGVnZW5kPWMoIlBvcHVsYXRpb24gUmVncmVzc2lvbiIsIkxlYXN0IFNxdWFyZSIpLGNvbD1jKCJyZWQiLCJncmVlbiIpLGx0eT1jKDEsMSkpDQpgYGANCg0KZy4NCg0KYGBge3J9DQpsbS5lcXVhdDQ9bG0oeX54K0koeF4yKSkNCnN1bW1hcnkobG0uZXF1YXQ0KQ0KYGBgDQoNCk5vLCBvdXIgcHJlZGljdGl2ZSBwb3dlciAoaW4gdGVybXMgb2YgUi1zcXVhcmVkKSBkaWRuJ3QgaW1wcm92ZSBhbmQgdGhlIHN0cmVuZ3RoIG9mIG91ciBGLXN0YXRpc3RpYyBkZWNyZWFzZWQuIEl0IGlzIHN0aWxsIHNpZ25pZmljYW50LCBidXQgd29yc2UuDQoNCjE0Lg0KDQpgYGB7cn0NCnNldC5zZWVkKDEpDQp4MT1ydW5pZigxMDApDQp4Mj0wLjUqeDErcm5vcm0oMTAwKS8xMA0KeT0yKzIqeDErLjMqeDIrcm5vcm0oMTAwKQ0KYGBgDQoNCmEuDQoNClRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50czoNCl9fKkJ+MH4qX18gPSAyIF9fKkJ+MX4qX18gPSAyIF9fKkJ+Mn4qX18gPSAuMw0KDQpiLg0KDQpgYGB7cn0NCmNvcih4MSx4MikNCnBsb3QoeDEseDIsY29sPSJibGFjayIpDQpgYGANCg0KYy4NCmBgYHtyfQ0KbG0uZXF1YXQ0PWxtKHl+eDEreDIpDQpzdW1tYXJ5KGxtLmVxdWF0NCkNCmBgYA0KDQpfXypCfjB+Kl9fID0gMi4xMyBfXypCfjF+Kl9fID0gMS40IF9fKkJ+Mn4qX18gPSAxDQoNClRoZXNlIHByZWRpY3RlZCBjb2VmZmljaWVudHMgYXJlIGRpZmZlcmVudCBmcm9tIHRoZWlyIHBvcHVsYXRpb24gcmVncmVzc2lvbiB2YWx1ZXMuIFRoZSBtb3N0IGRpZmZlcmVudCBpcyB0aGUgY29lZmZpY2llbnQgb2YgeDIgd2hpY2ggaXMgbGlrZWx5IGR1ZSB0byBpdHMgbG93IGxldmVsIG9mIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZS4gV2UgY2FuIHJlamVjdCB0aGUgbnVsbCBfX0h+MH46KkJ+MX4qPTBfXywgYnV0IG5vdCB0aGUgbnVsbCBfX0h+MH46KkJ+Mn4qPTBfXy4NCg0KZC4NCg0KYGBge3J9DQpsbS5lcXVhdDU9bG0oeX54MSkNCnN1bW1hcnkobG0uZXF1YXQ1KQ0KYGBgDQoNCmUuDQpgYGB7cn0NCmxtLmVxdWF0Nj1sbSh5fngyKQ0Kc3VtbWFyeShsbS5lcXVhdDYpDQpgYGANCg0KZi4gVGhlIHJlc3VsdHMgb2J0YWluIGluIChjKS0oZSkgZG8gbm90IGNvbnRyYWRpY3QgZWFjaCBvdGhlci4gSXQgaXMgZW50aXJlbHkgcG9zc2libGUgdGhhdCB0d28gdmFyaWFibGVzIGFyZSBub3Qgam9pbnRseSBzaWduaWZpY2FudCwgYnV0IGNhbiBiZSBpbmRlcGVuZGVudGx5IHNpZ25pZmljYW50LiBXaGF0IGlzIGxpa2VseSBvY2N1cnJpbmcgaXMgdGhhdCB4MSBhbmQgeDIgYXJlIGhpZ2hseSBjb3JyZWxhdGVkIGFuZCB0aHVzIHdoZW4gdGhlIHR3byBhcmUgaW5jbHVkZWQgdG9nZXRoZXIsIHgyIGRvZXMgbm90IHByb3ZpZGUgYW55IG5ldyBpbmZvcm1hdGlvbiB0aGF0IHgxIGRvZXMgbm90IGFscmVhZHkgYWNjb3VudCBmb3IuDQoNCmcuIChTa2lwcGVkKQ0KDQpfXzE1Ll9fDQoNCmEuDQoNCmBgYHtyfQ0KYXR0YWNoKEJvc3RvbikNCm5hbWVzKEJvc3RvbikNCmBgYA0KDQpgYGB7cn0NCmxtLmIxPWxtKGNyaW1+em4pDQpzdW1tYXJ5KGxtLmIxKQ0KYGBgDQoNCmBgYHtyfQ0KbG0uYjI9bG0oY3JpbX5pbmR1cykNCnN1bW1hcnkobG0uYjIpDQpgYGANCg0KYGBge3J9DQpsbS5iMz1sbShjcmltfmNoYXMpDQpzdW1tYXJ5KGxtLmIzKQ0KYGBgDQoNCmBgYHtyfQ0KbG0uYjQ9bG0oY3JpbX5ub3gpDQpzdW1tYXJ5KGxtLmI0KQ0KYGBgDQoNCmBgYHtyfQ0KbG0uYjU9bG0oY3JpbX5ybSkNCnN1bW1hcnkobG0uYjUpDQpgYGANCg0KYGBge3J9DQpsbS5iNj1sbShjcmltfmFnZSkNCnN1bW1hcnkobG0uYjYpDQpgYGANCg0KYGBge3J9DQpsbS5iNz1sbShjcmltfmRpcykNCnN1bW1hcnkobG0uYjcpDQpgYGANCg0KYGBge3J9DQpsbS5iOD1sbShjcmltfnJhZCkNCnN1bW1hcnkobG0uYjgpDQpgYGANCg0KYGBge3J9DQpsbS5iOT1sbShjcmltfnRheCkNCnN1bW1hcnkobG0uYjkpDQpgYGANCg0KYGBge3J9DQpsbS5iMTA9bG0oY3JpbX5wdHJhdGlvKQ0Kc3VtbWFyeShsbS5iMTApDQpgYGANCg0KYGBge3J9DQpsbS5iMTE9bG0oY3JpbX5ibGFjaykNCnN1bW1hcnkobG0uYjExKQ0KYGBgDQoNCmBgYHtyfQ0KbG0uYjEyPWxtKGNyaW1+bHN0YXQpDQpzdW1tYXJ5KGxtLmIxMikNCmBgYA0KDQoNCmBgYHtyfQ0KbG0uYjEzPWxtKGNyaW1+bWVkdikNCnN1bW1hcnkobG0uYjEzKQ0KYGBgDQoNClRoZSBvbmx5IHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB0aGF0IGZhaWxlZCB0byBnZW5lcmF0ZSBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgcHJlZGljdG9yIGFuZCB0aGUgcmVzcG9uc2Ugd2FzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBjaGFzIGFuZCBjcmltLg0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDIsMikpDQpwbG90KHpuLGNyaW0pDQpwbG90KGluZHVzLGNyaW0pDQpwbG90KG5veCxjcmltKQ0KcGxvdChybSxjcmltKQ0KYGBgDQoNCmIuDQpgYGB7cn0NCmxtLkJvc3Rvbj1sbShjcmltfi4sZGF0YT1Cb3N0b24pDQpzdW1tYXJ5KGxtLkJvc3RvbikNCmBgYA0KDQpPdXIgRi1zdGF0aXN0aWMgaXMgcHJldHR5IGxvdyAoMzEuNDcpLiBUaGUgcC12YWx1ZSBvbiBvdXIgRi10ZXN0IGluZGljYXRlcyBhIHNpZ25pZmljYW50IG1vZGVsLCBidXQgd2UgY2FuIGRvIGJldHRlci4gQWZ0ZXIgYWNjb3VudGluZyBmb3IgZXZlcnl0aGluZyBpbiB0aGUgbW9kZWwgd2UgaGF2ZSBvbmx5IGV4cGxhaW5lZCA0NCUgb2YgdGhlIHZhcmlhdGlvbiBpbiBjcmltLiBVc2luZyBhIDk1JSBjb25maWRlbmNlIHRocmVzaG9sZCB3ZSBub3RlIHRoYXQgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50OiBpbmR1cywgY2hhcywgbm94LCBybSwgYWdlLCB0YXgsIHB0cmF0aW9uIGFuZCBsc3RhdC4NCg0KYy4NCg0KSW4gdGhlIGZpcnN0IG1vZGVsIG9ubHkgY2hhcyBmYWlsZWQgYXMgdG8gcHJvdmlkZSBhbnkgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHJlZ2FyZGluZyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBwcmVkaWN0b3IgYW5kIHJlc3BvbnNlLiBIb3dldmVyLCB3aGVuIGFsbCBvZiBvdXIgdmFyaWFibGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgd2Ugbm90ZSB0aGF0IG1hbnkgbW9yZSBhcmUgZXhjbHVkZWQgYXMgdmlhYmxlIHByZWRpY3RvcnMuIFRoaXMgc2lnbmlmaWVzIGEgZ3JlYXQgZGVhbCBvZiBjb2xsaW5lYXJpdHkgd2l0aGluIG91ciBtb2RlbC4gRnVuZGFtZW50YWxseSwgbWFueSBvZiBvdXIgdmFyaWFibGVzIGFyZSBoaWdobHkgY29ycmVsYXRlZCBhbmQgdGh1cyBiZWNvbWUgcmVkdW5kYW50IHdoZW4gZXhwbGFpbmluZyB2YXJpYXRpb24gaW4gY3JpbS4NCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==