How to use this document. Run the code along with me. Comments start with #. This additional-practice script uses the CollegeDistance dataset and mirrors the structure of the PS4 P3 (Olken experiment) analysis.

Today’s plan

  1. Clean environment + setup
  2. Load & explore the CollegeDistance data
  3. Sample mean, standard error, and 95% CI
  4. One-sample and one-sided t-tests
  5. Difference in means (female vs. male)
  6. Multiple regression
  7. Regression with an interaction term

1 Clean Environment + Setup

rm(list = ls())   # clean environment

# Load the required packages
library(AER)
library(ggplot2)
library(dplyr)

In the live session we set the working directory with setwd(...). Here the CollegeDistance data ships inside the AER package, so no working directory or external file is needed.

2 Load & Explore the Dataset

# Load CollegeDistance dataset from the AER package
data("CollegeDistance")
college <- CollegeDistance
remove(CollegeDistance)   # two identical copies load; keep one

# Inspect the dataset
str(college)
#> 'data.frame':    4739 obs. of  14 variables:
#>  $ gender   : Factor w/ 2 levels "male","female": 1 2 1 1 2 1 2 2 1 2 ...
#>  $ ethnicity: Factor w/ 3 levels "other","afam",..: 1 1 1 2 1 1 1 1 1 1 ...
#>  $ score    : num  39.2 48.9 48.7 40.4 40.5 ...
#>  $ fcollege : Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 2 1 ...
#>  $ mcollege : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
#>  $ home     : Factor w/ 2 levels "no","yes": 2 2 2 2 1 2 2 2 2 2 ...
#>  $ urban    : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 1 1 2 2 ...
#>  $ unemp    : num  6.2 6.2 6.2 6.2 5.6 ...
#>  $ wage     : num  8.09 8.09 8.09 8.09 8.09 ...
#>  $ distance : num  0.2 0.2 0.2 0.2 0.4 ...
#>  $ tuition  : num  0.889 0.889 0.889 0.889 0.889 ...
#>  $ education: num  12 12 12 12 13 12 13 15 13 15 ...
#>  $ income   : Factor w/ 2 levels "low","high": 2 1 1 1 1 1 1 1 1 1 ...
#>  $ region   : Factor w/ 2 levels "other","west": 1 1 1 1 1 1 1 1 1 1 ...
#>  - attr(*, "datalabel")= chr ""
#>  - attr(*, "time.stamp")= chr "25 Oct 2002 16:44"
#>  - attr(*, "formats")= chr [1:14] "%9.0g" "%9.0g" "%9.0g" "%9.0g" ...
#>  - attr(*, "types")= int [1:14] 102 102 102 102 102 102 102 102 102 102 ...
#>  - attr(*, "val.labels")= chr [1:14] "" "" "" "" ...
#>  - attr(*, "var.labels")= chr [1:14] "" "" "" "" ...
#>  - attr(*, "version")= int 6
#>  - attr(*, "label.table")=List of 14
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
#>   ..$ : NULL
knitr::kable(head(college), caption = "First rows of the CollegeDistance data")
First rows of the CollegeDistance data
gender ethnicity score fcollege mcollege home urban unemp wage distance tuition education income region
male other 39.15 yes no yes yes 6.2 8.09 0.2 0.88915 12 high other
female other 48.87 no no yes yes 6.2 8.09 0.2 0.88915 12 low other
male other 48.74 no no yes yes 6.2 8.09 0.2 0.88915 12 low other
male afam 40.40 no no yes yes 6.2 8.09 0.2 0.88915 12 low other
female other 40.48 no no no yes 5.6 8.09 0.4 0.88915 13 low other
male other 54.71 no no yes yes 5.6 8.09 0.4 0.88915 12 low other

3 Practice: PS4-Style Analysis

In this section we practice computing means, standard errors, and 95% CIs; running one-sample t-tests; running difference-in-means tests; running regressions; and including interaction terms.

# Create simplified binary variables for practice
college$female_bi   <- ifelse(college$gender == "female", 1, 0)
college$high_income <- ifelse(college$income == "high", 1, 0)

# Outcome variable: test score
y <- college$score

4 Sample Mean, Standard Error & 95% CI

Compute the mean, SE, and confidence interval manually.

mean_y <- mean(y)
sd_y   <- sd(y)
n      <- length(y)
se_y   <- sd_y / sqrt(n)

CI_lower <- mean_y - 1.96 * se_y
CI_upper <- mean_y + 1.96 * se_y

mean_y
#> [1] 50.88903
se_y
#> [1] 0.126407
c(CI_lower, CI_upper)
#> [1] 50.64127 51.13679

5 One-Sample & One-Sided t-tests

One-sample t-test (\(H_0: \mu = 0\) vs. \(H_1: \mu \neq 0\)).

t.test(y, mu = 0)
#> 
#>  One Sample t-test
#> 
#> data:  y
#> t = 402.58, df = 4738, p-value < 2.2e-16
#> alternative hypothesis: true mean is not equal to 0
#> 95 percent confidence interval:
#>  50.64121 51.13685
#> sample estimates:
#> mean of x 
#>  50.88903

One-sided t-test (\(H_0: \mu \geq 50\) vs. \(H_1: \mu < 50\)).

t.test(y, mu = 50, alternative = "less")
#> 
#>  One Sample t-test
#> 
#> data:  y
#> t = 7.0331, df = 4738, p-value = 1
#> alternative hypothesis: true mean is less than 50
#> 95 percent confidence interval:
#>      -Inf 51.09699
#> sample estimates:
#> mean of x 
#>  50.88903

6 Difference in Means (Female vs. Male)

Compute the difference in mean scores manually, two ways.

# Method 1: index the score vector directly
mean_female <- mean(college$score[college$female_bi == 1])
mean_male   <- mean(college$score[college$female_bi == 0])
diff_means  <- mean_female - mean_male
diff_means
#> [1] -1.401749
# Method 2: subset()
mean_female2 <- mean(subset(college, female_bi == 1)$score)
mean_male2   <- mean(subset(college, female_bi == 0)$score)
diff_means2  <- mean_female2 - mean_male2
diff_means2
#> [1] -1.401749

Two-sample t-test for the difference in means by gender (\(H_0: \mu_\text{female} - \mu_\text{male} = 0\)).

t.test(college$score ~ college$female_bi)
#> 
#>  Welch Two Sample t-test
#> 
#> data:  college$score by college$female_bi
#> t = 5.5096, df = 4472.2, p-value = 3.798e-08
#> alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
#> 95 percent confidence interval:
#>  0.9029613 1.9005360
#> sample estimates:
#> mean in group 0 mean in group 1 
#>        51.65808        50.25633

7 Multiple Regression

Regression of score on gender and high income.

m1 <- lm(score ~ female_bi + high_income, data = college)
summary(m1)
#> 
#> Call:
#> lm(formula = score ~ female_bi + high_income, data = college)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -24.993  -6.739   0.207   6.647  23.437 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)  50.5953     0.2042 247.737  < 2e-16 ***
#> female_bi    -1.2223     0.2498  -4.893 1.03e-06 ***
#> high_income   3.3481     0.2745  12.197  < 2e-16 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 8.543 on 4736 degrees of freedom
#> Multiple R-squared:  0.03669,    Adjusted R-squared:  0.03628 
#> F-statistic: 90.18 on 2 and 4736 DF,  p-value: < 2.2e-16

8 Regression with an Interaction Term

In R, female_bi * high_income expands to female_bi + high_income + female_bi:high_income — the two main effects plus their interaction.

m2 <- lm(score ~ female_bi * high_income, data = college)
summary(m2)
#> 
#> Call:
#> lm(formula = score ~ female_bi * high_income, data = college)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -24.7725  -6.7071   0.2154   6.6654  23.5154 
#> 
#> Coefficients:
#>                       Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)            50.6980     0.2236 226.772  < 2e-16 ***
#> female_bi              -1.4034     0.2968  -4.728 2.33e-06 ***
#> high_income             3.0245     0.3968   7.622 2.99e-14 ***
#> female_bi:high_income   0.6205     0.5495   1.129    0.259    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 8.542 on 4735 degrees of freedom
#> Multiple R-squared:  0.03694,    Adjusted R-squared:  0.03633 
#> F-statistic: 60.55 on 3 and 4735 DF,  p-value: < 2.2e-16

The fully written-out form gives the identical fit:

m3 <- lm(score ~ female_bi + high_income + female_bi:high_income, data = college)
summary(m3)
#> 
#> Call:
#> lm(formula = score ~ female_bi + high_income + female_bi:high_income, 
#>     data = college)
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -24.7725  -6.7071   0.2154   6.6654  23.5154 
#> 
#> Coefficients:
#>                       Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)            50.6980     0.2236 226.772  < 2e-16 ***
#> female_bi              -1.4034     0.2968  -4.728 2.33e-06 ***
#> high_income             3.0245     0.3968   7.622 2.99e-14 ***
#> female_bi:high_income   0.6205     0.5495   1.129    0.259    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 8.542 on 4735 degrees of freedom
#> Multiple R-squared:  0.03694,    Adjusted R-squared:  0.03633 
#> F-statistic: 60.55 on 3 and 4735 DF,  p-value: < 2.2e-16

Using the estimated coefficients, the predicted mean test score for each of the four groups in the interaction model:

Group Predicted mean score
Male & Low-income 50.70
Male & High-income 53.72
Female & Low-income 49.30
Female & High-income 52.94

9 Wrap-up

Key takeaways

  • t.test() handles one-sample and two-sample tests.
  • Manual CI computation reinforces the core inference ideas.
  • Difference-in-means replicates the treatment–control logic.
  • Regression lets us control for covariates.
  • Interaction terms test heterogeneous (group-varying) effects.
  • In R: x1 * x2 = x1 + x2 + x1:x2 (main effects plus the interaction).

Thank you all for your hard work this semester. You’ve done an amazing job throughout the course!

LS0tCnRpdGxlOiAiTGFiIDExIOKAlCBaL1QtdGVzdHMsIERpZmZlcmVuY2UgaW4gTWVhbnMgJiBJbnRlcmFjdGlvbiBFZmZlY3RzIgpzdWJ0aXRsZTogIlF1YW50aXRhdGl2ZSBSZWFzb25pbmcgwrcgTEFCIDQxMyIKYXV0aG9yOiAiSW5zdHJ1Y3RvcjogU3ViaW4gTmEiCmRhdGU6ICJOb3ZlbWJlciAxOSwgMjAyNSIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gNC4yLAogIGNvbW1lbnQgPSAiIz4iCikKYGBgCgo+ICoqSG93IHRvIHVzZSB0aGlzIGRvY3VtZW50LioqIFJ1biB0aGUgY29kZSBhbG9uZyB3aXRoIG1lLiBDb21tZW50cyBzdGFydCB3aXRoIGAjYC4KPiBUaGlzIGFkZGl0aW9uYWwtcHJhY3RpY2Ugc2NyaXB0IHVzZXMgdGhlIGBDb2xsZWdlRGlzdGFuY2VgIGRhdGFzZXQgYW5kIG1pcnJvcnMKPiB0aGUgc3RydWN0dXJlIG9mIHRoZSBQUzQgUDMgKE9sa2VuIGV4cGVyaW1lbnQpIGFuYWx5c2lzLgoKKipUb2RheSdzIHBsYW4qKgoKMS4gQ2xlYW4gZW52aXJvbm1lbnQgKyBzZXR1cAoyLiBMb2FkICYgZXhwbG9yZSB0aGUgYENvbGxlZ2VEaXN0YW5jZWAgZGF0YQozLiBTYW1wbGUgbWVhbiwgc3RhbmRhcmQgZXJyb3IsIGFuZCA5NSUgQ0kKNC4gT25lLXNhbXBsZSBhbmQgb25lLXNpZGVkICp0Ki10ZXN0cwo1LiBEaWZmZXJlbmNlIGluIG1lYW5zIChmZW1hbGUgdnMuIG1hbGUpCjYuIE11bHRpcGxlIHJlZ3Jlc3Npb24KNy4gUmVncmVzc2lvbiB3aXRoIGFuIGludGVyYWN0aW9uIHRlcm0KCi0tLQoKIyBDbGVhbiBFbnZpcm9ubWVudCArIFNldHVwCgpgYGB7ciBjbGVhbi1zZXR1cH0Kcm0obGlzdCA9IGxzKCkpICAgIyBjbGVhbiBlbnZpcm9ubWVudAoKIyBMb2FkIHRoZSByZXF1aXJlZCBwYWNrYWdlcwpsaWJyYXJ5KEFFUikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCj4gSW4gdGhlIGxpdmUgc2Vzc2lvbiB3ZSBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdpdGggYHNldHdkKC4uLilgLiBIZXJlIHRoZQo+IGBDb2xsZWdlRGlzdGFuY2VgIGRhdGEgc2hpcHMgaW5zaWRlIHRoZSBgQUVSYCBwYWNrYWdlLCBzbyBubyB3b3JraW5nIGRpcmVjdG9yeQo+IG9yIGV4dGVybmFsIGZpbGUgaXMgbmVlZGVkLgoKIyBMb2FkICYgRXhwbG9yZSB0aGUgRGF0YXNldAoKYGBge3IgbG9hZH0KIyBMb2FkIENvbGxlZ2VEaXN0YW5jZSBkYXRhc2V0IGZyb20gdGhlIEFFUiBwYWNrYWdlCmRhdGEoIkNvbGxlZ2VEaXN0YW5jZSIpCmNvbGxlZ2UgPC0gQ29sbGVnZURpc3RhbmNlCnJlbW92ZShDb2xsZWdlRGlzdGFuY2UpICAgIyB0d28gaWRlbnRpY2FsIGNvcGllcyBsb2FkOyBrZWVwIG9uZQoKIyBJbnNwZWN0IHRoZSBkYXRhc2V0CnN0cihjb2xsZWdlKQpgYGAKCmBgYHtyIGhlYWR9CmtuaXRyOjprYWJsZShoZWFkKGNvbGxlZ2UpLCBjYXB0aW9uID0gIkZpcnN0IHJvd3Mgb2YgdGhlIENvbGxlZ2VEaXN0YW5jZSBkYXRhIikKYGBgCgojIFByYWN0aWNlOiBQUzQtU3R5bGUgQW5hbHlzaXMKCkluIHRoaXMgc2VjdGlvbiB3ZSBwcmFjdGljZSBjb21wdXRpbmcgbWVhbnMsIHN0YW5kYXJkIGVycm9ycywgYW5kIDk1JSBDSXM7CnJ1bm5pbmcgb25lLXNhbXBsZSAqdCotdGVzdHM7IHJ1bm5pbmcgZGlmZmVyZW5jZS1pbi1tZWFucyB0ZXN0czsgcnVubmluZwpyZWdyZXNzaW9uczsgYW5kIGluY2x1ZGluZyBpbnRlcmFjdGlvbiB0ZXJtcy4KCmBgYHtyIGJpbmFyaWVzfQojIENyZWF0ZSBzaW1wbGlmaWVkIGJpbmFyeSB2YXJpYWJsZXMgZm9yIHByYWN0aWNlCmNvbGxlZ2UkZmVtYWxlX2JpICAgPC0gaWZlbHNlKGNvbGxlZ2UkZ2VuZGVyID09ICJmZW1hbGUiLCAxLCAwKQpjb2xsZWdlJGhpZ2hfaW5jb21lIDwtIGlmZWxzZShjb2xsZWdlJGluY29tZSA9PSAiaGlnaCIsIDEsIDApCgojIE91dGNvbWUgdmFyaWFibGU6IHRlc3Qgc2NvcmUKeSA8LSBjb2xsZWdlJHNjb3JlCmBgYAoKIyBTYW1wbGUgTWVhbiwgU3RhbmRhcmQgRXJyb3IgJiA5NSUgQ0kKCkNvbXB1dGUgdGhlIG1lYW4sIFNFLCBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbCBtYW51YWxseS4KCmBgYHtyIG1hbnVhbC1jaX0KbWVhbl95IDwtIG1lYW4oeSkKc2RfeSAgIDwtIHNkKHkpCm4gICAgICA8LSBsZW5ndGgoeSkKc2VfeSAgIDwtIHNkX3kgLyBzcXJ0KG4pCgpDSV9sb3dlciA8LSBtZWFuX3kgLSAxLjk2ICogc2VfeQpDSV91cHBlciA8LSBtZWFuX3kgKyAxLjk2ICogc2VfeQoKbWVhbl95CnNlX3kKYyhDSV9sb3dlciwgQ0lfdXBwZXIpCmBgYAoKIyBPbmUtU2FtcGxlICYgT25lLVNpZGVkICp0Ki10ZXN0cwoKKipPbmUtc2FtcGxlICp0Ki10ZXN0KiogKCRIXzA6IFxtdSA9IDAkIHZzLiAkSF8xOiBcbXUgXG5lcSAwJCkuCgpgYGB7ciB0dGVzdC0wfQp0LnRlc3QoeSwgbXUgPSAwKQpgYGAKCioqT25lLXNpZGVkICp0Ki10ZXN0KiogKCRIXzA6IFxtdSBcZ2VxIDUwJCB2cy4gJEhfMTogXG11IDwgNTAkKS4KCmBgYHtyIHR0ZXN0LWxlc3N9CnQudGVzdCh5LCBtdSA9IDUwLCBhbHRlcm5hdGl2ZSA9ICJsZXNzIikKYGBgCgojIERpZmZlcmVuY2UgaW4gTWVhbnMgKEZlbWFsZSB2cy4gTWFsZSkKCkNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbiBzY29yZXMgbWFudWFsbHksIHR3byB3YXlzLgoKYGBge3IgZGlmZi1tZWFuc30KIyBNZXRob2QgMTogaW5kZXggdGhlIHNjb3JlIHZlY3RvciBkaXJlY3RseQptZWFuX2ZlbWFsZSA8LSBtZWFuKGNvbGxlZ2Ukc2NvcmVbY29sbGVnZSRmZW1hbGVfYmkgPT0gMV0pCm1lYW5fbWFsZSAgIDwtIG1lYW4oY29sbGVnZSRzY29yZVtjb2xsZWdlJGZlbWFsZV9iaSA9PSAwXSkKZGlmZl9tZWFucyAgPC0gbWVhbl9mZW1hbGUgLSBtZWFuX21hbGUKZGlmZl9tZWFucwoKIyBNZXRob2QgMjogc3Vic2V0KCkKbWVhbl9mZW1hbGUyIDwtIG1lYW4oc3Vic2V0KGNvbGxlZ2UsIGZlbWFsZV9iaSA9PSAxKSRzY29yZSkKbWVhbl9tYWxlMiAgIDwtIG1lYW4oc3Vic2V0KGNvbGxlZ2UsIGZlbWFsZV9iaSA9PSAwKSRzY29yZSkKZGlmZl9tZWFuczIgIDwtIG1lYW5fZmVtYWxlMiAtIG1lYW5fbWFsZTIKZGlmZl9tZWFuczIKYGBgCgoqKlR3by1zYW1wbGUgKnQqLXRlc3QqKiBmb3IgdGhlIGRpZmZlcmVuY2UgaW4gbWVhbnMgYnkgZ2VuZGVyCigkSF8wOiBcbXVfXHRleHR7ZmVtYWxlfSAtIFxtdV9cdGV4dHttYWxlfSA9IDAkKS4KCmBgYHtyIHR0ZXN0LWdlbmRlcn0KdC50ZXN0KGNvbGxlZ2Ukc2NvcmUgfiBjb2xsZWdlJGZlbWFsZV9iaSkKYGBgCgojIE11bHRpcGxlIFJlZ3Jlc3Npb24KClJlZ3Jlc3Npb24gb2YgYHNjb3JlYCBvbiBnZW5kZXIgYW5kIGhpZ2ggaW5jb21lLgoKYGBge3IgbTF9Cm0xIDwtIGxtKHNjb3JlIH4gZmVtYWxlX2JpICsgaGlnaF9pbmNvbWUsIGRhdGEgPSBjb2xsZWdlKQpzdW1tYXJ5KG0xKQpgYGAKCiMgUmVncmVzc2lvbiB3aXRoIGFuIEludGVyYWN0aW9uIFRlcm0KCkluIFIsIGBmZW1hbGVfYmkgKiBoaWdoX2luY29tZWAgZXhwYW5kcyB0bwpgZmVtYWxlX2JpICsgaGlnaF9pbmNvbWUgKyBmZW1hbGVfYmk6aGlnaF9pbmNvbWVgIOKAlCB0aGUgdHdvIG1haW4gZWZmZWN0cyBwbHVzCnRoZWlyIGludGVyYWN0aW9uLgoKYGBge3IgbTJ9Cm0yIDwtIGxtKHNjb3JlIH4gZmVtYWxlX2JpICogaGlnaF9pbmNvbWUsIGRhdGEgPSBjb2xsZWdlKQpzdW1tYXJ5KG0yKQpgYGAKClRoZSBmdWxseSB3cml0dGVuLW91dCBmb3JtIGdpdmVzIHRoZSBpZGVudGljYWwgZml0OgoKYGBge3IgbTN9Cm0zIDwtIGxtKHNjb3JlIH4gZmVtYWxlX2JpICsgaGlnaF9pbmNvbWUgKyBmZW1hbGVfYmk6aGlnaF9pbmNvbWUsIGRhdGEgPSBjb2xsZWdlKQpzdW1tYXJ5KG0zKQpgYGAKClVzaW5nIHRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnRzLCB0aGUgcHJlZGljdGVkIG1lYW4gdGVzdCBzY29yZSBmb3IgZWFjaCBvZiB0aGUKZm91ciBncm91cHMgaW4gdGhlIGludGVyYWN0aW9uIG1vZGVsOgoKfCBHcm91cCB8IFByZWRpY3RlZCBtZWFuIHNjb3JlIHwKfC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBNYWxlICYgTG93LWluY29tZSB8IDUwLjcwIHwKfCBNYWxlICYgSGlnaC1pbmNvbWUgfCA1My43MiB8CnwgRmVtYWxlICYgTG93LWluY29tZSB8IDQ5LjMwIHwKfCBGZW1hbGUgJiBIaWdoLWluY29tZSB8IDUyLjk0IHwKCiMgV3JhcC11cAoKKipLZXkgdGFrZWF3YXlzKioKCi0gYHQudGVzdCgpYCBoYW5kbGVzIG9uZS1zYW1wbGUgYW5kIHR3by1zYW1wbGUgdGVzdHMuCi0gTWFudWFsIENJIGNvbXB1dGF0aW9uIHJlaW5mb3JjZXMgdGhlIGNvcmUgaW5mZXJlbmNlIGlkZWFzLgotIERpZmZlcmVuY2UtaW4tbWVhbnMgcmVwbGljYXRlcyB0aGUgdHJlYXRtZW504oCTY29udHJvbCBsb2dpYy4KLSBSZWdyZXNzaW9uIGxldHMgdXMgY29udHJvbCBmb3IgY292YXJpYXRlcy4KLSBJbnRlcmFjdGlvbiB0ZXJtcyB0ZXN0IGhldGVyb2dlbmVvdXMgKGdyb3VwLXZhcnlpbmcpIGVmZmVjdHMuCi0gSW4gUjogYHgxICogeDIgPSB4MSArIHgyICsgeDE6eDJgIChtYWluIGVmZmVjdHMgKipwbHVzKiogdGhlIGludGVyYWN0aW9uKS4KCj4gVGhhbmsgeW91IGFsbCBmb3IgeW91ciBoYXJkIHdvcmsgdGhpcyBzZW1lc3Rlci4gWW91J3ZlIGRvbmUgYW4gYW1hemluZyBqb2IKPiB0aHJvdWdob3V0IHRoZSBjb3Vyc2UhCg==