library(tidyverse)
library(openintro)
library(ggplot2)
library(ggpubr)
library(rstatix)
library(GGally)

Exercise 1

This is an observational study. There are no variables that are tested nor the reviewers are not given a treatment for this to be a experiment.

There might be a clarity problem with the question, as how do we scale beauty or if other identifiers effect the beauty scale. We can rephrase the question as “If there is a correlation between the professor’s scaled beauty and the professor’s overall score?”.

Exercise 2

The score histogram is left-skewed. Generally, students given more positive reviews of their professors. I did expected it to be more right-skewed in reviews, as students might warn others about a professor’s performance before registration day.

ggplot(data = evals, aes(x = score)) +geom_histogram()+theme_classic()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Exercise 3

Lets see how professors dress depending on gender. It appears that the majority of the two genders listed do not wear formal outfits in class.

ggplot(data=evals,aes(x=gender,y=pic_outfit,fill=pic_outfit))+geom_bar(stat="identity")+theme_minimal()+theme(axis.text.y = element_blank())

Exercise 4

The initial leaves out the density of the beauty average points compared to the score. We can see more closely how the scores cluster around 4.5 in ratings.

Also, there appears to be a cluster of the beauty rating of 4 where its score is a 4.5.

g1<-ggplot(data = evals, aes(x = bty_avg, y = score)) +
  geom_point()
g2<-ggplot(data = evals, aes(x = bty_avg, y = score)) +
  geom_jitter()
ggarrange(g1,g2,ncol=2)

Exercise 5

Using lm(), we retrieve the y-intercept at 3.8804 and the slope of bty_avg at .06664. Our linear regression line is y=.0664x+3.8804.

We can interpret that there is positive trend between the beauty average and score. There statistically significant between beauty average and score, as the p value is close to zero.

For practically significant, it varies across the beauty average. There are too many negligible effect sizes to confidently say its practically significant.

m_bty<-lm(score~bty_avg,data=evals)
summary(m_bty)
## 
## Call:
## lm(formula = score ~ bty_avg, data = evals)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.9246 -0.3690  0.1420  0.3977  0.9309 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.88034    0.07614   50.96  < 2e-16 ***
## bty_avg      0.06664    0.01629    4.09 5.08e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5348 on 461 degrees of freedom
## Multiple R-squared:  0.03502,    Adjusted R-squared:  0.03293 
## F-statistic: 16.73 on 1 and 461 DF,  p-value: 5.083e-05
ggplot(data = evals, aes(x = bty_avg, y = score)) +geom_jitter() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula 'y ~ x'

d<-evals %>% cohens_d(bty_avg ~ score, var.equal = TRUE)
summary(d$magnitude)
## negligible      small   moderate      large       NA's 
##         74        103         79         94          1

Exercise 6

The least squares regression conditions are met: the residuals have a linear trend, passed nearly normal histogram, passed normal probability plot.

g3<-ggplot(data = m_bty, aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")+theme_classic()
g4<-ggplot(data = m_bty, aes(x = .resid)) +
    geom_histogram(binwidth = 25) +
    xlab("Residuals")+theme_classic()
g5<-ggplot(data = m_bty, aes(sample = .resid)) +
  stat_qq()+theme_classic()
ggarrange(g3,g4,g5)

Exercise 7

Beauty average with gender is statistically significant like beauty average alone, as its P values leads towards zero. We can also verify these results with the testings for least squares regression.

m_bty_gen <- lm(score ~ bty_avg + gender, data = evals)
summary(m_bty_gen)
## 
## Call:
## lm(formula = score ~ bty_avg + gender, data = evals)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.8305 -0.3625  0.1055  0.4213  0.9314 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.74734    0.08466  44.266  < 2e-16 ***
## bty_avg      0.07416    0.01625   4.563 6.48e-06 ***
## gendermale   0.17239    0.05022   3.433 0.000652 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5287 on 460 degrees of freedom
## Multiple R-squared:  0.05912,    Adjusted R-squared:  0.05503 
## F-statistic: 14.45 on 2 and 460 DF,  p-value: 8.177e-07
g6<-ggplot(data = m_bty_gen , aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")+theme_classic()
g7<-ggplot(data = m_bty_gen , aes(x = .resid)) +
    geom_histogram(binwidth = 25) +
    xlab("Residuals")+theme_classic()
g8<-ggplot(data = m_bty_gen , aes(sample = .resid)) +
  stat_qq()+theme_classic()
ggarrange(g3,g4,g5)

Exercise 8

The beauty average predictor is not as accurate as the new addition with gender. Its new estimate is 3.74734+ 0.07416* (bty_avg)+ 0.17239*(gendermale).

The estimate means with the average score of 3.7, there is a bonus of .07 given from the beauty average and .17 by the gender of the professor.

Exercise 9

The professor pictures who had black and white pictures had a higher slope for their lines compared to color picture. It is the assumption that the students cannot accurately distinguish the professor’s feature in black and white compared to color.

Exercise 10

R cannot handle levels above a 2, It did not retrieve data for professors ranked as teaching.

m_bty_rank <- lm(score ~ bty_avg + rank
, data = evals)
summary(m_bty_rank)
## 
## Call:
## lm(formula = score ~ bty_avg + rank, data = evals)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.8713 -0.3642  0.1489  0.4103  0.9525 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       3.98155    0.09078  43.860  < 2e-16 ***
## bty_avg           0.06783    0.01655   4.098 4.92e-05 ***
## ranktenure track -0.16070    0.07395  -2.173   0.0303 *  
## ranktenured      -0.12623    0.06266  -2.014   0.0445 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5328 on 459 degrees of freedom
## Multiple R-squared:  0.04652,    Adjusted R-squared:  0.04029 
## F-statistic: 7.465 on 3 and 459 DF,  p-value: 6.88e-05

Exercise 11

For my guess, I believe outfits do not have a effect on the professor’s score. From the previous chart in exercise two, the majority of them do not wear formal clothes.

m_full <- lm(score ~ rank + gender + ethnicity + language + age + cls_perc_eval 
             + cls_students + cls_level + cls_profs + cls_credits + bty_avg 
             + pic_outfit + pic_color, data = evals)

Exercise 12

The chart above confirms that non formal outfits do not effect the scores. It makes the variable not statically significant with the p score above a zero. There are few other variables which do not make the cut: ranktenured and ethnicitynot minority.

Exercise 13

I assume the coefficient of ethnicitynot minority means that if the professor is white, their score is not effect by their race.

Exercise 14

The removal of P values greater than 1 shifted upwards all the remaining p values. For comparison, the previous p value of age is 0.00427 and the new is 0.02551.

m_expect <- lm(score ~  gender  + language + age + cls_perc_eval + cls_credits + bty_avg 
+ pic_color, data = evals)
summary(m_expect)
## 
## Call:
## lm(formula = score ~ gender + language + age + cls_perc_eval + 
##     cls_credits + bty_avg + pic_color, data = evals)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.81919 -0.32035  0.09272  0.38526  0.88213 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            3.967255   0.215824  18.382  < 2e-16 ***
## gendermale             0.221457   0.049937   4.435 1.16e-05 ***
## languagenon-english   -0.281933   0.098341  -2.867  0.00434 ** 
## age                   -0.005877   0.002622  -2.241  0.02551 *  
## cls_perc_eval          0.004295   0.001432   2.999  0.00286 ** 
## cls_creditsone credit  0.444392   0.100910   4.404 1.33e-05 ***
## bty_avg                0.048679   0.016974   2.868  0.00432 ** 
## pic_colorcolor        -0.216556   0.066625  -3.250  0.00124 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.5014 on 455 degrees of freedom
## Multiple R-squared:  0.1631, Adjusted R-squared:  0.1502 
## F-statistic: 12.67 on 7 and 455 DF,  p-value: 6.996e-15

Exercise 15

I used the step function eliminate the terms which raised the AIC score. The results of that function created the new lm called black_list.

y= 3.9+gendermale* (0.2)+ ethnicitynot minority* (0.16)+languagenon-english * (-0.25)+age* (-0.01)+cls_perc_eval * (0.004)+ cls_creditsone credit* (0.51)+bty_avg* (0.05)+ pic_outfitnot formal* (-0.11)+pic_colorcolor* (-0.18)

step(m_full,direction = "backward")
## Start:  AIC=-630.9
## score ~ rank + gender + ethnicity + language + age + cls_perc_eval + 
##     cls_students + cls_level + cls_profs + cls_credits + bty_avg + 
##     pic_outfit + pic_color
## 
##                 Df Sum of Sq    RSS     AIC
## - cls_profs      1    0.0197 111.11 -632.82
## - cls_level      1    0.2740 111.36 -631.76
## - cls_students   1    0.3599 111.44 -631.40
## - rank           2    0.8930 111.98 -631.19
## <none>                       111.08 -630.90
## - pic_outfit     1    0.5768 111.66 -630.50
## - ethnicity      1    0.6117 111.70 -630.36
## - language       1    1.0557 112.14 -628.52
## - bty_avg        1    1.2967 112.38 -627.53
## - age            1    2.0456 113.13 -624.45
## - pic_color      1    2.2893 113.37 -623.46
## - cls_perc_eval  1    2.9698 114.06 -620.69
## - gender         1    4.1085 115.19 -616.09
## - cls_credits    1    4.6495 115.73 -613.92
## 
## Step:  AIC=-632.82
## score ~ rank + gender + ethnicity + language + age + cls_perc_eval + 
##     cls_students + cls_level + cls_credits + bty_avg + pic_outfit + 
##     pic_color
## 
##                 Df Sum of Sq    RSS     AIC
## - cls_level      1    0.2752 111.38 -633.67
## - cls_students   1    0.3893 111.49 -633.20
## - rank           2    0.8939 112.00 -633.11
## <none>                       111.11 -632.82
## - pic_outfit     1    0.5574 111.66 -632.50
## - ethnicity      1    0.6728 111.78 -632.02
## - language       1    1.0442 112.15 -630.49
## - bty_avg        1    1.2872 112.39 -629.49
## - age            1    2.0422 113.15 -626.39
## - pic_color      1    2.3457 113.45 -625.15
## - cls_perc_eval  1    2.9502 114.06 -622.69
## - gender         1    4.0895 115.19 -618.08
## - cls_credits    1    4.7999 115.90 -615.24
## 
## Step:  AIC=-633.67
## score ~ rank + gender + ethnicity + language + age + cls_perc_eval + 
##     cls_students + cls_credits + bty_avg + pic_outfit + pic_color
## 
##                 Df Sum of Sq    RSS     AIC
## - cls_students   1    0.2459 111.63 -634.65
## - rank           2    0.8140 112.19 -634.30
## <none>                       111.38 -633.67
## - pic_outfit     1    0.6618 112.04 -632.93
## - ethnicity      1    0.8698 112.25 -632.07
## - language       1    0.9015 112.28 -631.94
## - bty_avg        1    1.3694 112.75 -630.02
## - age            1    1.9342 113.31 -627.70
## - pic_color      1    2.0777 113.46 -627.12
## - cls_perc_eval  1    3.0290 114.41 -623.25
## - gender         1    3.8989 115.28 -619.74
## - cls_credits    1    4.5296 115.91 -617.22
## 
## Step:  AIC=-634.65
## score ~ rank + gender + ethnicity + language + age + cls_perc_eval + 
##     cls_credits + bty_avg + pic_outfit + pic_color
## 
##                 Df Sum of Sq    RSS     AIC
## - rank           2    0.7892 112.42 -635.39
## <none>                       111.63 -634.65
## - ethnicity      1    0.8832 112.51 -633.00
## - pic_outfit     1    0.9700 112.60 -632.65
## - language       1    1.0338 112.66 -632.38
## - bty_avg        1    1.5783 113.20 -630.15
## - pic_color      1    1.9477 113.57 -628.64
## - age            1    2.1163 113.74 -627.96
## - cls_perc_eval  1    2.7922 114.42 -625.21
## - gender         1    4.0945 115.72 -619.97
## - cls_credits    1    4.5163 116.14 -618.29
## 
## Step:  AIC=-635.39
## score ~ gender + ethnicity + language + age + cls_perc_eval + 
##     cls_credits + bty_avg + pic_outfit + pic_color
## 
##                 Df Sum of Sq    RSS     AIC
## <none>                       112.42 -635.39
## - pic_outfit     1    0.7141 113.13 -634.46
## - ethnicity      1    1.1790 113.59 -632.56
## - language       1    1.3403 113.75 -631.90
## - age            1    1.6847 114.10 -630.50
## - pic_color      1    1.7841 114.20 -630.10
## - bty_avg        1    1.8553 114.27 -629.81
## - cls_perc_eval  1    2.9147 115.33 -625.54
## - gender         1    4.0577 116.47 -620.97
## - cls_credits    1    6.1208 118.54 -612.84
## 
## Call:
## lm(formula = score ~ gender + ethnicity + language + age + cls_perc_eval + 
##     cls_credits + bty_avg + pic_outfit + pic_color, data = evals)
## 
## Coefficients:
##           (Intercept)             gendermale  ethnicitynot minority  
##              3.907030               0.202597               0.163818  
##   languagenon-english                    age          cls_perc_eval  
##             -0.246683              -0.006925               0.004942  
## cls_creditsone credit                bty_avg   pic_outfitnot formal  
##              0.517205               0.046732              -0.113939  
##        pic_colorcolor  
##             -0.180870
back_list<-lm(formula = score ~ gender + ethnicity + language + age + cls_perc_eval + 
    cls_credits + bty_avg + pic_outfit + pic_color, data = evals)
summary(back_list)
## 
## Call:
## lm(formula = score ~ gender + ethnicity + language + age + cls_perc_eval + 
##     cls_credits + bty_avg + pic_outfit + pic_color, data = evals)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.8455 -0.3221  0.1013  0.3745  0.9051 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            3.907030   0.244889  15.954  < 2e-16 ***
## gendermale             0.202597   0.050102   4.044 6.18e-05 ***
## ethnicitynot minority  0.163818   0.075158   2.180 0.029798 *  
## languagenon-english   -0.246683   0.106146  -2.324 0.020567 *  
## age                   -0.006925   0.002658  -2.606 0.009475 ** 
## cls_perc_eval          0.004942   0.001442   3.427 0.000666 ***
## cls_creditsone credit  0.517205   0.104141   4.966 9.68e-07 ***
## bty_avg                0.046732   0.017091   2.734 0.006497 ** 
## pic_outfitnot formal  -0.113939   0.067168  -1.696 0.090510 .  
## pic_colorcolor        -0.180870   0.067456  -2.681 0.007601 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4982 on 453 degrees of freedom
## Multiple R-squared:  0.1774, Adjusted R-squared:  0.161 
## F-statistic: 10.85 on 9 and 453 DF,  p-value: 2.441e-15

Exercise 16

It passes all its test!

g9<-ggplot(data = back_list , aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")+theme_classic()
g10<-ggplot(data = back_list , aes(x = .resid)) +
    geom_histogram(binwidth = 25) +
    xlab("Residuals")+theme_classic()
g11<-ggplot(data = back_list , aes(sample = .resid)) +
  stat_qq()+theme_classic()
ggarrange(g3,g4,g5)

Exercise 17

Yes, the new information influences the results given. The students who had took their courses will have a stronger opnion compared to students who will make assumptions at face value

Exercise 18

Professors who were white men with a education in a non speaking country who teaches one credit courses has higher evulations and rated with a higher beauty score.

Exercise 19

No, I would not generalized for all professors. Theses results are only relevant to the University At Austin professors, where the professor pool reflect these results. Other schools in Texas may have varying professor pools which will have different lm lines than UAA.

LS0tDQp0aXRsZTogIkxhYiA5Ig0KYXV0aG9yOiAiVnlhbm5hIEhpbGwiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KHJzdGF0aXgpDQpsaWJyYXJ5KEdHYWxseSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpUaGlzIGlzIGFuIG9ic2VydmF0aW9uYWwgc3R1ZHkuIFRoZXJlIGFyZSBubyB2YXJpYWJsZXMgdGhhdCBhcmUgdGVzdGVkIG5vciB0aGUgcmV2aWV3ZXJzIGFyZSBub3QgZ2l2ZW4gYSB0cmVhdG1lbnQgZm9yIHRoaXMgdG8gYmUgYSBleHBlcmltZW50Lg0KDQpUaGVyZSBtaWdodCBiZSBhIGNsYXJpdHkgcHJvYmxlbSB3aXRoIHRoZSBxdWVzdGlvbiwgYXMgaG93IGRvIHdlIHNjYWxlIGJlYXV0eSBvciBpZiBvdGhlciBpZGVudGlmaWVycyBlZmZlY3QgdGhlIGJlYXV0eSBzY2FsZS4gV2UgY2FuIHJlcGhyYXNlIHRoZSBxdWVzdGlvbiBhcyAiSWYgdGhlcmUgaXMgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBwcm9mZXNzb3IncyBzY2FsZWQgYmVhdXR5IGFuZCB0aGUgcHJvZmVzc29yJ3Mgb3ZlcmFsbCBzY29yZT8iLg0KDQoNCiMjIyAgRXhlcmNpc2UgMg0KDQpUaGUgc2NvcmUgaGlzdG9ncmFtIGlzIGxlZnQtc2tld2VkLiBHZW5lcmFsbHksIHN0dWRlbnRzIGdpdmVuIG1vcmUgcG9zaXRpdmUgcmV2aWV3cyBvZiB0aGVpciBwcm9mZXNzb3JzLiBJIGRpZCBleHBlY3RlZCBpdCB0byBiZSBtb3JlIHJpZ2h0LXNrZXdlZCBpbiByZXZpZXdzLCBhcyBzdHVkZW50cyBtaWdodCB3YXJuIG90aGVycyBhYm91dCBhIHByb2Zlc3NvcidzIHBlcmZvcm1hbmNlIGJlZm9yZSByZWdpc3RyYXRpb24gZGF5LiAgDQoNCmBgYHtyIGNvZGUtY2h1bmstbGFiZWx9DQpnZ3Bsb3QoZGF0YSA9IGV2YWxzLCBhZXMoeCA9IHNjb3JlKSkgK2dlb21faGlzdG9ncmFtKCkrdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMw0KDQpMZXRzIHNlZSBob3cgcHJvZmVzc29ycyBkcmVzcyBkZXBlbmRpbmcgb24gZ2VuZGVyLiBJdCBhcHBlYXJzIHRoYXQgdGhlIG1ham9yaXR5IG9mIHRoZSB0d28gZ2VuZGVycyBsaXN0ZWQgZG8gbm90IHdlYXIgZm9ybWFsIG91dGZpdHMgaW4gY2xhc3MuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9ZXZhbHMsYWVzKHg9Z2VuZGVyLHk9cGljX291dGZpdCxmaWxsPXBpY19vdXRmaXQpKStnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpK3RoZW1lX21pbmltYWwoKSt0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNA0KDQpUaGUgaW5pdGlhbCBsZWF2ZXMgb3V0IHRoZSBkZW5zaXR5IG9mIHRoZSBiZWF1dHkgYXZlcmFnZSBwb2ludHMgY29tcGFyZWQgdG8gdGhlIHNjb3JlLiBXZSBjYW4gc2VlIG1vcmUgY2xvc2VseSBob3cgdGhlIHNjb3JlcyBjbHVzdGVyIGFyb3VuZCA0LjUgaW4gcmF0aW5ncy4gDQoNCkFsc28sIHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBjbHVzdGVyIG9mIHRoZSBiZWF1dHkgcmF0aW5nIG9mIDQgd2hlcmUgaXRzIHNjb3JlIGlzIGEgNC41Lg0KDQpgYGB7cn0NCmcxPC1nZ3Bsb3QoZGF0YSA9IGV2YWxzLCBhZXMoeCA9IGJ0eV9hdmcsIHkgPSBzY29yZSkpICsNCiAgZ2VvbV9wb2ludCgpDQpnMjwtZ2dwbG90KGRhdGEgPSBldmFscywgYWVzKHggPSBidHlfYXZnLCB5ID0gc2NvcmUpKSArDQogIGdlb21faml0dGVyKCkNCmdnYXJyYW5nZShnMSxnMixuY29sPTIpDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDUNCg0KVXNpbmcgbG0oKSwgd2UgcmV0cmlldmUgdGhlIHktaW50ZXJjZXB0IGF0IDMuODgwNCBhbmQgdGhlIHNsb3BlIG9mIGJ0eV9hdmcgYXQgLjA2NjY0LiBPdXIgbGluZWFyIHJlZ3Jlc3Npb24gbGluZSBpcyB5PS4wNjY0eCszLjg4MDQuDQoNCldlIGNhbiBpbnRlcnByZXQgdGhhdCB0aGVyZSBpcyBwb3NpdGl2ZSB0cmVuZCBiZXR3ZWVuIHRoZSBiZWF1dHkgYXZlcmFnZSBhbmQgc2NvcmUuIFRoZXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYmV0d2VlbiBiZWF1dHkgYXZlcmFnZSBhbmQgc2NvcmUsIGFzIHRoZSBwIHZhbHVlIGlzIGNsb3NlIHRvIHplcm8uDQoNCkZvciBwcmFjdGljYWxseSBzaWduaWZpY2FudCwgaXQgdmFyaWVzIGFjcm9zcyB0aGUgYmVhdXR5IGF2ZXJhZ2UuIFRoZXJlIGFyZSB0b28gbWFueSBuZWdsaWdpYmxlIGVmZmVjdCBzaXplcyB0byBjb25maWRlbnRseSBzYXkgaXRzIHByYWN0aWNhbGx5IHNpZ25pZmljYW50Lg0KDQpgYGB7cn0NCm1fYnR5PC1sbShzY29yZX5idHlfYXZnLGRhdGE9ZXZhbHMpDQpzdW1tYXJ5KG1fYnR5KQ0KDQpnZ3Bsb3QoZGF0YSA9IGV2YWxzLCBhZXMoeCA9IGJ0eV9hdmcsIHkgPSBzY29yZSkpICtnZW9tX2ppdHRlcigpICsNCmdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpDQoNCmQ8LWV2YWxzICU+JSBjb2hlbnNfZChidHlfYXZnIH4gc2NvcmUsIHZhci5lcXVhbCA9IFRSVUUpDQpzdW1tYXJ5KGQkbWFnbml0dWRlKQ0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KVGhlIGxlYXN0IHNxdWFyZXMgcmVncmVzc2lvbiBjb25kaXRpb25zIGFyZSBtZXQ6IHRoZSByZXNpZHVhbHMgaGF2ZSBhIGxpbmVhciB0cmVuZCwgcGFzc2VkIG5lYXJseSBub3JtYWwgaGlzdG9ncmFtLCBwYXNzZWQgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QuDQoNCmBgYHtyfQ0KZzM8LWdncGxvdChkYXRhID0gbV9idHksIGFlcyh4ID0gLmZpdHRlZCwgeSA9IC5yZXNpZCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKw0KICB5bGFiKCJSZXNpZHVhbHMiKSt0aGVtZV9jbGFzc2ljKCkNCmc0PC1nZ3Bsb3QoZGF0YSA9IG1fYnR5LCBhZXMoeCA9IC5yZXNpZCkpICsNCiAgICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDI1KSArDQogICAgeGxhYigiUmVzaWR1YWxzIikrdGhlbWVfY2xhc3NpYygpDQpnNTwtZ2dwbG90KGRhdGEgPSBtX2J0eSwgYWVzKHNhbXBsZSA9IC5yZXNpZCkpICsNCiAgc3RhdF9xcSgpK3RoZW1lX2NsYXNzaWMoKQ0KZ2dhcnJhbmdlKGczLGc0LGc1KQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA3DQoNCkJlYXV0eSBhdmVyYWdlIHdpdGggZ2VuZGVyIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbGlrZSBiZWF1dHkgYXZlcmFnZSBhbG9uZSwgYXMgaXRzDQpQIHZhbHVlcyBsZWFkcyB0b3dhcmRzIHplcm8uIFdlIGNhbiBhbHNvIHZlcmlmeSB0aGVzZSByZXN1bHRzIHdpdGggdGhlIHRlc3RpbmdzIGZvciBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24uDQoNCmBgYHtyfQ0KbV9idHlfZ2VuIDwtIGxtKHNjb3JlIH4gYnR5X2F2ZyArIGdlbmRlciwgZGF0YSA9IGV2YWxzKQ0Kc3VtbWFyeShtX2J0eV9nZW4pDQoNCmc2PC1nZ3Bsb3QoZGF0YSA9IG1fYnR5X2dlbiAsIGFlcyh4ID0gLmZpdHRlZCwgeSA9IC5yZXNpZCkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICB4bGFiKCJGaXR0ZWQgdmFsdWVzIikgKw0KICB5bGFiKCJSZXNpZHVhbHMiKSt0aGVtZV9jbGFzc2ljKCkNCmc3PC1nZ3Bsb3QoZGF0YSA9IG1fYnR5X2dlbiAsIGFlcyh4ID0gLnJlc2lkKSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMjUpICsNCiAgICB4bGFiKCJSZXNpZHVhbHMiKSt0aGVtZV9jbGFzc2ljKCkNCmc4PC1nZ3Bsb3QoZGF0YSA9IG1fYnR5X2dlbiAsIGFlcyhzYW1wbGUgPSAucmVzaWQpKSArDQogIHN0YXRfcXEoKSt0aGVtZV9jbGFzc2ljKCkNCmdnYXJyYW5nZShnMyxnNCxnNSkNCg0KYGBgDQoNCiMjIyBFeGVyY2lzZSA4DQoNClRoZSBiZWF1dHkgYXZlcmFnZSBwcmVkaWN0b3IgaXMgbm90IGFzIGFjY3VyYXRlIGFzIHRoZSBuZXcgYWRkaXRpb24gd2l0aCBnZW5kZXIuIEl0cyBuZXcgZXN0aW1hdGUgaXMgMy43NDczNCsgMC4wNzQxNiogKGJ0eV9hdmcpKyAwLjE3MjM5KihnZW5kZXJtYWxlKS4NCg0KVGhlIGVzdGltYXRlIG1lYW5zIHdpdGggdGhlIGF2ZXJhZ2Ugc2NvcmUgb2YgMy43LCB0aGVyZSBpcyBhIGJvbnVzIG9mIC4wNyBnaXZlbiBmcm9tIHRoZSBiZWF1dHkgYXZlcmFnZSBhbmQgLjE3IGJ5IHRoZSBnZW5kZXIgb2YgdGhlIHByb2Zlc3Nvci4gDQoNCiMjIyBFeGVyY2lzZSA5DQoNClRoZSBwcm9mZXNzb3IgcGljdHVyZXMgd2hvIGhhZCBibGFjayBhbmQgd2hpdGUgcGljdHVyZXMgaGFkIGEgaGlnaGVyIHNsb3BlIGZvciB0aGVpciBsaW5lcyBjb21wYXJlZCB0byBjb2xvciBwaWN0dXJlLiBJdCBpcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBzdHVkZW50cyBjYW5ub3QgYWNjdXJhdGVseSBkaXN0aW5ndWlzaCB0aGUgcHJvZmVzc29yJ3MgZmVhdHVyZSBpbiBibGFjayBhbmQgd2hpdGUgY29tcGFyZWQgdG8gY29sb3IuDQoNCiMjIyBFeGVyY2lzZSAxMA0KDQpSIGNhbm5vdCBoYW5kbGUgbGV2ZWxzIGFib3ZlIGEgMiwgSXQgZGlkIG5vdCByZXRyaWV2ZSBkYXRhIGZvciBwcm9mZXNzb3JzIHJhbmtlZCBhcyB0ZWFjaGluZy4NCg0KYGBge3J9DQptX2J0eV9yYW5rIDwtIGxtKHNjb3JlIH4gYnR5X2F2ZyArIHJhbmsNCiwgZGF0YSA9IGV2YWxzKQ0Kc3VtbWFyeShtX2J0eV9yYW5rKQ0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDExDQoNCkZvciBteSBndWVzcywgSSBiZWxpZXZlIG91dGZpdHMgZG8gbm90IGhhdmUgYSBlZmZlY3Qgb24gdGhlIHByb2Zlc3NvcidzIHNjb3JlLiBGcm9tIHRoZSBwcmV2aW91cyBjaGFydCBpbiBleGVyY2lzZSB0d28sIHRoZSBtYWpvcml0eSBvZiB0aGVtIGRvIG5vdCB3ZWFyIGZvcm1hbCBjbG90aGVzLiANCg0KYGBge3J9DQptX2Z1bGwgPC0gbG0oc2NvcmUgfiByYW5rICsgZ2VuZGVyICsgZXRobmljaXR5ICsgbGFuZ3VhZ2UgKyBhZ2UgKyBjbHNfcGVyY19ldmFsIA0KICAgICAgICAgICAgICsgY2xzX3N0dWRlbnRzICsgY2xzX2xldmVsICsgY2xzX3Byb2ZzICsgY2xzX2NyZWRpdHMgKyBidHlfYXZnIA0KICAgICAgICAgICAgICsgcGljX291dGZpdCArIHBpY19jb2xvciwgZGF0YSA9IGV2YWxzKQ0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDEyDQoNClRoZSBjaGFydCBhYm92ZSBjb25maXJtcyB0aGF0IG5vbiBmb3JtYWwgb3V0Zml0cyBkbyBub3QgZWZmZWN0IHRoZSBzY29yZXMuIEl0IG1ha2VzIHRoZSB2YXJpYWJsZSBub3Qgc3RhdGljYWxseSBzaWduaWZpY2FudCB3aXRoIHRoZSBwIHNjb3JlIGFib3ZlIGEgemVyby4gVGhlcmUgYXJlIGZldyBvdGhlciB2YXJpYWJsZXMgd2hpY2ggZG8gbm90IG1ha2UgdGhlIGN1dDogcmFua3RlbnVyZWQgYW5kIGV0aG5pY2l0eW5vdCBtaW5vcml0eS4NCg0KIyMjIEV4ZXJjaXNlIDEzDQoNCkkgYXNzdW1lIHRoZSBjb2VmZmljaWVudCBvZiBldGhuaWNpdHlub3QgbWlub3JpdHkgbWVhbnMgdGhhdCBpZiB0aGUgcHJvZmVzc29yIGlzIHdoaXRlLCB0aGVpciBzY29yZSBpcyBub3QgZWZmZWN0IGJ5IHRoZWlyIHJhY2UuDQoNCiMjIyBFeGVyY2lzZSAxNCANCg0KVGhlIHJlbW92YWwgb2YgUCB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEgc2hpZnRlZCB1cHdhcmRzICBhbGwgdGhlIHJlbWFpbmluZyBwIHZhbHVlcy4gRm9yIGNvbXBhcmlzb24sIHRoZSBwcmV2aW91cyBwIHZhbHVlIG9mIGFnZSBpcyAwLjAwNDI3IGFuZCB0aGUgbmV3IGlzIDAuMDI1NTEuICANCg0KYGBge3J9DQptX2V4cGVjdCA8LSBsbShzY29yZSB+ICBnZW5kZXIgICsgbGFuZ3VhZ2UgKyBhZ2UgKyBjbHNfcGVyY19ldmFsICsgY2xzX2NyZWRpdHMgKyBidHlfYXZnIA0KKyBwaWNfY29sb3IsIGRhdGEgPSBldmFscykNCnN1bW1hcnkobV9leHBlY3QpDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDE1DQoNCkkgdXNlZCB0aGUgc3RlcCBmdW5jdGlvbiBlbGltaW5hdGUgdGhlIHRlcm1zIHdoaWNoIHJhaXNlZCB0aGUgQUlDIHNjb3JlLiBUaGUgcmVzdWx0cyBvZiB0aGF0IGZ1bmN0aW9uIGNyZWF0ZWQgdGhlIG5ldyBsbSBjYWxsZWQgYmxhY2tfbGlzdC4NCg0KeT0gMy45K2dlbmRlcm1hbGUqICgwLjIpKyBldGhuaWNpdHlub3QgbWlub3JpdHkqICgwLjE2KStsYW5ndWFnZW5vbi1lbmdsaXNoICAgKiAoLTAuMjUpK2FnZSogKC0wLjAxKStjbHNfcGVyY19ldmFsICAgICAqICgwLjAwNCkrIGNsc19jcmVkaXRzb25lIGNyZWRpdCogKDAuNTEpK2J0eV9hdmcqICgwLjA1KSsgcGljX291dGZpdG5vdCBmb3JtYWwqICgtMC4xMSkrcGljX2NvbG9yY29sb3IqICgtMC4xOCkNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN0ZXAobV9mdWxsLGRpcmVjdGlvbiA9ICJiYWNrd2FyZCIpDQpiYWNrX2xpc3Q8LWxtKGZvcm11bGEgPSBzY29yZSB+IGdlbmRlciArIGV0aG5pY2l0eSArIGxhbmd1YWdlICsgYWdlICsgY2xzX3BlcmNfZXZhbCArIA0KICAgIGNsc19jcmVkaXRzICsgYnR5X2F2ZyArIHBpY19vdXRmaXQgKyBwaWNfY29sb3IsIGRhdGEgPSBldmFscykNCnN1bW1hcnkoYmFja19saXN0KQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAxNg0KDQoNCkl0IHBhc3NlcyBhbGwgaXRzIHRlc3QhIA0KDQpgYGB7cn0NCg0KZzk8LWdncGxvdChkYXRhID0gYmFja19saXN0ICwgYWVzKHggPSAuZml0dGVkLCB5ID0gLnJlc2lkKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIHhsYWIoIkZpdHRlZCB2YWx1ZXMiKSArDQogIHlsYWIoIlJlc2lkdWFscyIpK3RoZW1lX2NsYXNzaWMoKQ0KZzEwPC1nZ3Bsb3QoZGF0YSA9IGJhY2tfbGlzdCAsIGFlcyh4ID0gLnJlc2lkKSkgKw0KICAgIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMjUpICsNCiAgICB4bGFiKCJSZXNpZHVhbHMiKSt0aGVtZV9jbGFzc2ljKCkNCmcxMTwtZ2dwbG90KGRhdGEgPSBiYWNrX2xpc3QgLCBhZXMoc2FtcGxlID0gLnJlc2lkKSkgKw0KICBzdGF0X3FxKCkrdGhlbWVfY2xhc3NpYygpDQpnZ2FycmFuZ2UoZzMsZzQsZzUpDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDE3DQoNClllcywgdGhlIG5ldyBpbmZvcm1hdGlvbiBpbmZsdWVuY2VzIHRoZSByZXN1bHRzIGdpdmVuLiBUaGUgc3R1ZGVudHMgd2hvIGhhZCB0b29rIHRoZWlyIGNvdXJzZXMgd2lsbCBoYXZlIGEgc3Ryb25nZXIgb3BuaW9uIGNvbXBhcmVkIHRvIHN0dWRlbnRzIHdobyB3aWxsIG1ha2UgYXNzdW1wdGlvbnMgYXQgZmFjZSB2YWx1ZQ0KDQojIyMgRXhlcmNpc2UgMTgNCg0KUHJvZmVzc29ycyB3aG8gd2VyZSB3aGl0ZSBtZW4gd2l0aCBhIGVkdWNhdGlvbiBpbiBhIG5vbiBzcGVha2luZyBjb3VudHJ5IHdobyB0ZWFjaGVzIG9uZSBjcmVkaXQgY291cnNlcyBoYXMgaGlnaGVyIGV2dWxhdGlvbnMgYW5kIHJhdGVkIHdpdGggYSBoaWdoZXIgYmVhdXR5IHNjb3JlLg0KDQojIyMgRXhlcmNpc2UgMTkNCg0KTm8sIEkgd291bGQgbm90IGdlbmVyYWxpemVkIGZvciBhbGwgcHJvZmVzc29ycy4gVGhlc2VzIHJlc3VsdHMgYXJlIG9ubHkgcmVsZXZhbnQgdG8gdGhlIFVuaXZlcnNpdHkgQXQgQXVzdGluIHByb2Zlc3NvcnMsIHdoZXJlIHRoZSBwcm9mZXNzb3IgcG9vbCByZWZsZWN0IHRoZXNlIHJlc3VsdHMuIE90aGVyIHNjaG9vbHMgaW4gVGV4YXMgbWF5IGhhdmUgdmFyeWluZyBwcm9mZXNzb3IgcG9vbHMgd2hpY2ggd2lsbCBoYXZlIGRpZmZlcmVudCBsbSBsaW5lcyB0aGFuIFVBQS4=