library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.3.2
US_Admission = read.csv("US Admission.csv")
US_Admission
US_Admission_data = US_Admission[ , c(1, 2, 3, 4, 5, 6, 7, 8, 9)]
US_Admission_data

ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) + 
  geom_boxplot() +
  labs(title = "This plot is created using ggplot",
       x = "Class",
       y = "GRE Score",
       caption = "Source: US Admission dataset")


ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) + 
  geom_boxplot() +
  labs(title = "This plot is created using ggplot",
       x = "Class",
       y = "GRE Score",
       caption = "Source: US Admission dataset")

ggplot(data = US_Admission, aes(x= Chance.of.Admit, y = GRE.Score, fill = Chance.of.Admit)) + 
  geom_violin() +
  labs(title = "This plot is created using ggplot",
       x = "Class",
       y = "Gre Score",
       caption = "Source: US Admission dataset")

summary(US_Admission)
   Serial.No.      GRE.Score      TOEFL.Score    University.Rating      SOP           LOR       
 Min.   :  1.0   Min.   :290.0   Min.   : 92.0   Min.   :1.000     Min.   :1.0   Min.   :1.000  
 1st Qu.:100.8   1st Qu.:308.0   1st Qu.:103.0   1st Qu.:2.000     1st Qu.:2.5   1st Qu.:3.000  
 Median :200.5   Median :317.0   Median :107.0   Median :3.000     Median :3.5   Median :3.500  
 Mean   :200.5   Mean   :316.8   Mean   :107.4   Mean   :3.087     Mean   :3.4   Mean   :3.453  
 3rd Qu.:300.2   3rd Qu.:325.0   3rd Qu.:112.0   3rd Qu.:4.000     3rd Qu.:4.0   3rd Qu.:4.000  
 Max.   :400.0   Max.   :340.0   Max.   :120.0   Max.   :5.000     Max.   :5.0   Max.   :5.000  
      CGPA          Research      Chance.of.Admit 
 Min.   :6.800   Min.   :0.0000   Min.   :0.3400  
 1st Qu.:8.170   1st Qu.:0.0000   1st Qu.:0.6400  
 Median :8.610   Median :1.0000   Median :0.7300  
 Mean   :8.599   Mean   :0.5475   Mean   :0.7244  
 3rd Qu.:9.062   3rd Qu.:1.0000   3rd Qu.:0.8300  
 Max.   :9.920   Max.   :1.0000   Max.   :0.9700  
cor(US_Admission$GRE.Score, US_Admission$Chance.of.Admit)
[1] 0.8026105
cor(US_Admission$GRE.Score, US_Admission$Chance.of.Admit)
[1] 0.8026105
cor_matrix = cor([ ,1:9])
Error: unexpected '[' in "cor_matrix = cor(["
library(ggcorrplot)
Warning: package ‘ggcorrplot’ was built under R version 4.3.2
ggcorrplot(cor_matrix)
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, type = "lower")
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, type = "upper")
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, 
           type = "lower",
           colors = c("purple", "white", "red"))
Error: object 'cor_matrix' not found
ggcorrplot(cor_matrix, 
           type = "lower",
           colors = c("purple", "white", "red"),
           lab = TRUE)
Error: object 'cor_matrix' not found
library(GGally)
Warning: package ‘GGally’ was built under R version 4.3.2Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
ggpairs(US_Admission, aes(colour = Chance.of.Admit))
Error in ggally_statistic(data = data, mapping = mapping, na.rm = na.rm,  : 
  `mapping` color column must be categorical, not numeric

Interactive plots

library(plotly)
Warning: package ‘plotly’ was built under R version 4.3.2Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
fig = US_Admission %>%
  plot_ly(y = ~GRE.Score, type = 'violin')
  
fig

library(plotly)
plot_ly(US_Admission, y = ~GRE.Score, type = 'violin')
plot_ly(US_Admission, y = ~GRE.Score, type = 'box')
plot_ly(US_Admission, y = ~GRE.Score, type = 'histogram')
plot_ly(US_Admission, y = ~GRE.Score, type = 'box')

Principal Component Analysis (PCA)

# dimension = axis = features
library(stats)

US_Admission_pca = prcomp(US_Admission[ , -5], scale = TRUE, center = TRUE)
US_Admission_pca
Standard deviations (1, .., p=8):
[1] 2.2448897 1.0147558 0.8159866 0.7174349 0.5497783 0.4215816 0.3921441 0.3412182

Rotation (n x k) = (8 x 8):
                         PC1         PC2         PC3         PC4         PC5         PC6         PC7
Serial.No.         0.0522962  0.97239831 -0.05516732  0.02516041  0.11826286  0.18053185  0.01360579
GRE.Score         -0.4008352  0.01577663  0.14494210 -0.35298064 -0.16372872  0.32176541 -0.72921638
TOEFL.Score       -0.3973989 -0.05095482 -0.02307034 -0.42528893 -0.10456264  0.46649795  0.65477384
University.Rating -0.3733997 -0.11605801 -0.25765128  0.16415311  0.85869402  0.08727854 -0.06603407
LOR               -0.3386775 -0.01537971 -0.41482054  0.68312815 -0.43137705  0.24444101 -0.02098251
CGPA              -0.4158514  0.07432586 -0.10144202 -0.16633583 -0.07287889 -0.39114789 -0.05727696
Research          -0.2909253  0.03559183  0.85096897  0.40868850  0.06649445  0.03006554  0.11376525
Chance.of.Admit   -0.4086206  0.17634946 -0.05017154 -0.07481135 -0.12287811 -0.65190902  0.13529827
                           PC8
Serial.No.        -0.035597656
GRE.Score          0.177149898
TOEFL.Score        0.028148682
University.Rating  0.066628227
LOR                0.006562243
CGPA              -0.788667593
Research          -0.068214708
Chance.of.Admit    0.579159882
summary(US_Admission_pca)
Importance of components:
                          PC1    PC2     PC3     PC4     PC5     PC6     PC7     PC8
Standard deviation     2.2449 1.0148 0.81599 0.71743 0.54978 0.42158 0.39214 0.34122
Proportion of Variance 0.6299 0.1287 0.08323 0.06434 0.03778 0.02222 0.01922 0.01455
Cumulative Proportion  0.6299 0.7587 0.84189 0.90623 0.94401 0.96622 0.98545 1.00000
pc_12 = data.frame(US_Admission_pca$x[ , 1:2])
head(pc_12)

pc_12_class = cbind(pc_12, Chance.of.Admit= US_Admission$Chance.of.Admit)
pc_12_class
ggplot(pc_12_class, aes(PC1, PC2, color=Chance.of.Admit)) + 
  geom_point() + 
  theme_minimal()

library(factoextra)
Warning: package ‘factoextra’ was built under R version 4.3.2Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_eig(US_Admission_pca, addlabels = TRUE)

fviz_pca_var(US_Admission_pca,
             col.var = "contrib")

library("corrplot")
Warning: package ‘corrplot’ was built under R version 4.3.2corrplot 0.92 loaded
var = get_pca_var(US_Admission_pca)
corrplot(var$cos2)

fviz_pca_ind(US_Admission_pca,
             geom.ind = "point",
             col.ind = US_Admission$Chance.of.Admit,
             addEllipses = TRUE)
Error in `train_continuous()`:
! Discrete value supplied to a continuous scale
Backtrace:
  1. base (local) `<fn>`(x)
  2. ggplot2:::print.ggplot(x)
  4. ggplot2:::ggplot_build.ggplot(x)
  5. base::lapply(data, scales_train_df, scales = npscales)
  6. ggplot2 (local) FUN(X[[i]], ...)
     ...
 10. ggplot2 (local) train_df(..., self = self)
 11. self$train(df[[aesthetic]])
 12. ggplot2 (local) train(..., self = self)
 13. self$range$train(x)
 14. scales::train_continuous(x, self$range)

Regression


library(datasets)
data(US_Admission)
Warning: data set ‘US_Admission’ not found
lm_model = lm(GRE.Score ~ TOEFL.Score, data = US_Admission)
summary(lm_model)

Call:
lm(formula = GRE.Score ~ TOEFL.Score, data = US_Admission)

Residuals:
    Min      1Q  Median      3Q     Max 
-21.419  -3.910   0.273   3.421  18.903 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  147.067      5.594   26.29   <2e-16 ***
TOEFL.Score    1.580      0.052   30.39   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.304 on 398 degrees of freedom
Multiple R-squared:  0.6989,    Adjusted R-squared:  0.6981 
F-statistic: 923.6 on 1 and 398 DF,  p-value: < 2.2e-16
# p < 0.05

x = US_Admission$GRE.Score
y = US_Admission$TOEFL.Score

plot(x, y)

pred = predict(lm_model)
ix = sort(x, index.return = T)$ix # sort and return index not the acrtual values

plot(x, y)
lines(x[ix], pred[ix])

NA
NA
ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score)) + 
  geom_point() +
  geom_smooth(method = "lm", level = 0.95)

ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score, color = Chance.of.Admit)) + 
  geom_point() +
  geom_smooth(method = "lm", level = 0.95)

ggplot(US_Admission, aes(x = GRE.Score, y = TOEFL.Score, color = Chance.of.Admit)) + 
  geom_point() +
  geom_smooth(method = "lm", formula = y~poly(x, 2), level = 0.95)

Clustering

kmeans_result = kmeans(US_Admission[ , 1:6], centers = 3 )
kmeans_result
K-means clustering with 3 clusters of sizes 133, 134, 133

Cluster means:
  Serial.No. GRE.Score TOEFL.Score University.Rating      SOP      LOR
1       67.0  317.3835    107.9398          3.315789 3.571429 3.492481
2      333.5  314.9254    105.8955          2.776119 3.115672 3.242537
3      200.0  318.1278    108.4060          3.172932 3.515038 3.624060

Clustering vector:
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [49] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [97] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3
[145] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[193] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[241] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[289] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[337] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[385] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Within cluster sum of squares by cluster:
[1] 221793.8 222220.4 215766.1
 (between_SS / total_SS =  87.8 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"   
[7] "size"         "iter"         "ifault"      
library(cluster)
clusplot(US_Admission, kmeans_result$cluster)

Classification

library(lattice)
library(e1071)
library(caret)

train_ix = createDataPartition(US_Admission$Chance.of.Admit, p = 0.8, list = FALSE)
train_data = US_Admission[train_ix, ]
test_data = US_Admission[-train_ix, ]

train_data
test_data


svm_model = svm(Chance.of.Admit ~ GRE.Score+TOEFL.Score+University.Rating+SOP+LOR+CGPA+Research, data = train_data, kernel = "linear")
test_data[24, ]

predict(svm_model, newdata = test_data[24, -9])
      108 
0.9365611 
predictions = predict(svm_model, newdata = test_data)
conf_max = confusionMatrix(predictions, test_data$Chance.of.Admit)
Error: `data` and `reference` should be factors with the same levels.

cm = as.data.frame(conf_max$table)
Error: object 'conf_max' not found
LS0tDQpuYW1lOiAiYWZyb3phX3BhcnZpbiINCmFmZmlsaWF0aW9uOiAic3NvX2Jjc2lyIg0KdGl0bGU6IOKAnGRhdGEtc2NpZW5jZS1wcm9qZWN0LXBhcnQy4oCdDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpVU19BZG1pc3Npb24gPSByZWFkLmNzdigiVVMgQWRtaXNzaW9uLmNzdiIpDQpVU19BZG1pc3Npb24NCmBgYA0KDQoNCg0KYGBge3J9DQpVU19BZG1pc3Npb25fZGF0YSA9IFVTX0FkbWlzc2lvblsgLCBjKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpXQ0KVVNfQWRtaXNzaW9uX2RhdGENCmBgYA0KDQoNCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gVVNfQWRtaXNzaW9uLCBhZXMoeD0gQ2hhbmNlLm9mLkFkbWl0LCB5ID0gR1JFLlNjb3JlLCBmaWxsID0gQ2hhbmNlLm9mLkFkbWl0KSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIlRoaXMgcGxvdCBpcyBjcmVhdGVkIHVzaW5nIGdncGxvdCIsDQogICAgICAgeCA9ICJDbGFzcyIsDQogICAgICAgeSA9ICJHUkUgU2NvcmUiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBVUyBBZG1pc3Npb24gZGF0YXNldCIpDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpnZ3Bsb3QoZGF0YSA9IFVTX0FkbWlzc2lvbiwgYWVzKHg9IENoYW5jZS5vZi5BZG1pdCwgeSA9IEdSRS5TY29yZSwgZmlsbCA9IENoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJUaGlzIHBsb3QgaXMgY3JlYXRlZCB1c2luZyBnZ3Bsb3QiLA0KICAgICAgIHggPSAiQ2xhc3MiLA0KICAgICAgIHkgPSAiR1JFIFNjb3JlIiwNCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogVVMgQWRtaXNzaW9uIGRhdGFzZXQiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IFVTX0FkbWlzc2lvbiwgYWVzKHg9IENoYW5jZS5vZi5BZG1pdCwgeSA9IEdSRS5TY29yZSwgZmlsbCA9IENoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fdmlvbGluKCkgKw0KICBsYWJzKHRpdGxlID0gIlRoaXMgcGxvdCBpcyBjcmVhdGVkIHVzaW5nIGdncGxvdCIsDQogICAgICAgeCA9ICJDbGFzcyIsDQogICAgICAgeSA9ICJHcmUgU2NvcmUiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBVUyBBZG1pc3Npb24gZGF0YXNldCIpDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoVVNfQWRtaXNzaW9uKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmNvcihVU19BZG1pc3Npb24kR1JFLlNjb3JlLCBVU19BZG1pc3Npb24kQ2hhbmNlLm9mLkFkbWl0KQ0KY29yKFVTX0FkbWlzc2lvbiRHUkUuU2NvcmUsIFVTX0FkbWlzc2lvbiRDaGFuY2Uub2YuQWRtaXQpDQpgYGANCg0KDQpgYGB7cn0NCmNvcl9tYXRyaXggPSBjb3IoWyAsMTo5XSkNCmNvcl9tYXRyaXgNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ2NvcnJwbG90KQ0KZ2djb3JycGxvdChjb3JfbWF0cml4KQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIHR5cGUgPSAibG93ZXIiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIHR5cGUgPSAidXBwZXIiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ2NvcnJwbG90KGNvcl9tYXRyaXgsIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwNCiAgICAgICAgICAgY29sb3JzID0gYygicHVycGxlIiwgIndoaXRlIiwgInJlZCIpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdnY29ycnBsb3QoY29yX21hdHJpeCwgDQogICAgICAgICAgIHR5cGUgPSAibG93ZXIiLA0KICAgICAgICAgICBjb2xvcnMgPSBjKCJwdXJwbGUiLCAid2hpdGUiLCAicmVkIiksDQogICAgICAgICAgIGxhYiA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoR0dhbGx5KQ0KZ2dwYWlycyhVU19BZG1pc3Npb24sIGFlcyhjb2xvdXIgPSBDaGFuY2Uub2YuQWRtaXQpKQ0KYGBgDQoNCg0KIyBJbnRlcmFjdGl2ZSBwbG90cw0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCg0KZmlnID0gVVNfQWRtaXNzaW9uICU+JQ0KICBwbG90X2x5KHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ3Zpb2xpbicpDQogIA0KZmlnDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpsaWJyYXJ5KHBsb3RseSkNCnBsb3RfbHkoVVNfQWRtaXNzaW9uLCB5ID0gfkdSRS5TY29yZSwgdHlwZSA9ICd2aW9saW4nKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnBsb3RfbHkoVVNfQWRtaXNzaW9uLCB5ID0gfkdSRS5TY29yZSwgdHlwZSA9ICdib3gnKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdF9seShVU19BZG1pc3Npb24sIHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ2hpc3RvZ3JhbScpDQpgYGANCg0KDQoNCmBgYHtyfQ0KcGxvdF9seShVU19BZG1pc3Npb24sIHkgPSB+R1JFLlNjb3JlLCB0eXBlID0gJ2JveCcpDQpgYGANCg0KDQojIFByaW5jaXBhbCBDb21wb25lbnQgQW5hbHlzaXMgKFBDQSkNCg0KYGBge3J9DQojIGRpbWVuc2lvbiA9IGF4aXMgPSBmZWF0dXJlcw0KbGlicmFyeShzdGF0cykNCg0KVVNfQWRtaXNzaW9uX3BjYSA9IHByY29tcChVU19BZG1pc3Npb25bICwgLTVdLCBzY2FsZSA9IFRSVUUsIGNlbnRlciA9IFRSVUUpDQpVU19BZG1pc3Npb25fcGNhDQpgYGANCg0KDQpgYGB7cn0NCnN1bW1hcnkoVVNfQWRtaXNzaW9uX3BjYSkNCmBgYA0KDQpgYGB7cn0NCnBjXzEyID0gZGF0YS5mcmFtZShVU19BZG1pc3Npb25fcGNhJHhbICwgMToyXSkNCmhlYWQocGNfMTIpDQoNCnBjXzEyX2NsYXNzID0gY2JpbmQocGNfMTIsIENoYW5jZS5vZi5BZG1pdD0gVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCkNCnBjXzEyX2NsYXNzDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KHBjXzEyX2NsYXNzLCBhZXMoUEMxLCBQQzIsIGNvbG9yPUNoYW5jZS5vZi5BZG1pdCkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZmFjdG9leHRyYSkNCmZ2aXpfZWlnKFVTX0FkbWlzc2lvbl9wY2EsIGFkZGxhYmVscyA9IFRSVUUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KZnZpel9wY2FfdmFyKFVTX0FkbWlzc2lvbl9wY2EsDQogICAgICAgICAgICAgY29sLnZhciA9ICJjb250cmliIikNCmBgYA0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KCJjb3JycGxvdCIpDQp2YXIgPSBnZXRfcGNhX3ZhcihVU19BZG1pc3Npb25fcGNhKQ0KY29ycnBsb3QodmFyJGNvczIpDQpgYGANCg0KDQpgYGB7cn0NCmZ2aXpfcGNhX2luZChVU19BZG1pc3Npb25fcGNhLA0KICAgICAgICAgICAgIGdlb20uaW5kID0gInBvaW50IiwNCiAgICAgICAgICAgICBjb2wuaW5kID0gVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCwNCiAgICAgICAgICAgICBhZGRFbGxpcHNlcyA9IFRSVUUpDQpgYGANCg0KDQojIFJlZ3Jlc3Npb24NCg0KYGBge3J9DQoNCmxpYnJhcnkoZGF0YXNldHMpDQpkYXRhKFVTX0FkbWlzc2lvbikNCg0KbG1fbW9kZWwgPSBsbShHUkUuU2NvcmUgfiBUT0VGTC5TY29yZSwgZGF0YSA9IFVTX0FkbWlzc2lvbikNCnN1bW1hcnkobG1fbW9kZWwpDQpgYGANCg0KDQpgYGB7cn0NCiMgcCA8IDAuMDUNCg0KeCA9IFVTX0FkbWlzc2lvbiRHUkUuU2NvcmUNCnkgPSBVU19BZG1pc3Npb24kVE9FRkwuU2NvcmUNCg0KcGxvdCh4LCB5KQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkID0gcHJlZGljdChsbV9tb2RlbCkNCml4ID0gc29ydCh4LCBpbmRleC5yZXR1cm4gPSBUKSRpeCAjIHNvcnQgYW5kIHJldHVybiBpbmRleCBub3QgdGhlIGFjcnR1YWwgdmFsdWVzDQoNCnBsb3QoeCwgeSkNCmxpbmVzKHhbaXhdLCBwcmVkW2l4XSkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChVU19BZG1pc3Npb24sIGFlcyh4ID0gR1JFLlNjb3JlLCB5ID0gVE9FRkwuU2NvcmUpKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KDQoNCmBgYHtyfQ0KZ2dwbG90KFVTX0FkbWlzc2lvbiwgYWVzKHggPSBHUkUuU2NvcmUsIHkgPSBUT0VGTC5TY29yZSwgY29sb3IgPSBDaGFuY2Uub2YuQWRtaXQpKSArIA0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBsZXZlbCA9IDAuOTUpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChVU19BZG1pc3Npb24sIGFlcyh4ID0gR1JFLlNjb3JlLCB5ID0gVE9FRkwuU2NvcmUsIGNvbG9yID0gQ2hhbmNlLm9mLkFkbWl0KSkgKyANCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHl+cG9seSh4LCAyKSwgbGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCiMgQ2x1c3RlcmluZw0KDQpgYGB7cn0NCmttZWFuc19yZXN1bHQgPSBrbWVhbnMoVVNfQWRtaXNzaW9uWyAsIDE6Nl0sIGNlbnRlcnMgPSAzICkNCmttZWFuc19yZXN1bHQNCmBgYA0KDQoNCmBgYHtyfQ0KbGlicmFyeShjbHVzdGVyKQ0KY2x1c3Bsb3QoVVNfQWRtaXNzaW9uLCBrbWVhbnNfcmVzdWx0JGNsdXN0ZXIpDQpgYGANCg0KDQojIENsYXNzaWZpY2F0aW9uDQpgYGB7cn0NCmxpYnJhcnkobGF0dGljZSkNCmxpYnJhcnkoZTEwNzEpDQpsaWJyYXJ5KGNhcmV0KQ0KDQp0cmFpbl9peCA9IGNyZWF0ZURhdGFQYXJ0aXRpb24oVVNfQWRtaXNzaW9uJENoYW5jZS5vZi5BZG1pdCwgcCA9IDAuOCwgbGlzdCA9IEZBTFNFKQ0KdHJhaW5fZGF0YSA9IFVTX0FkbWlzc2lvblt0cmFpbl9peCwgXQ0KdGVzdF9kYXRhID0gVVNfQWRtaXNzaW9uWy10cmFpbl9peCwgXQ0KDQp0cmFpbl9kYXRhDQp0ZXN0X2RhdGENCg0KDQpzdm1fbW9kZWwgPSBzdm0oQ2hhbmNlLm9mLkFkbWl0IH4gR1JFLlNjb3JlK1RPRUZMLlNjb3JlK1VuaXZlcnNpdHkuUmF0aW5nK1NPUCtMT1IrQ0dQQStSZXNlYXJjaCwgZGF0YSA9IHRyYWluX2RhdGEsIGtlcm5lbCA9ICJsaW5lYXIiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KdGVzdF9kYXRhWzI0LCBdDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQpwcmVkaWN0KHN2bV9tb2RlbCwgbmV3ZGF0YSA9IHRlc3RfZGF0YVsyNCwgLTldKQ0KYGBgDQoNCg0KYGBge3J9DQpwcmVkaWN0aW9ucyA9IHByZWRpY3Qoc3ZtX21vZGVsLCBuZXdkYXRhID0gdGVzdF9kYXRhKQ0KY29uZl9tYXggPSBjb25mdXNpb25NYXRyaXgocHJlZGljdGlvbnMsIHRlc3RfZGF0YSRDaGFuY2Uub2YuQWRtaXQpDQpjb25mX21heA0KYGBgDQoNCmBgYHtyfQ0KDQpjbSA9IGFzLmRhdGEuZnJhbWUoY29uZl9tYXgkdGFibGUpDQoNCmdncGxvdChjbSwgYWVzKFByZWRpY3Rpb24sIFJlZmVyZW5jZSwgZmlsbCA9IEZyZXEpKSArIA0KICBnZW9tX3RpbGUoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBGcmVxKSkgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9IndoaXRlIiwgaGlnaD0ic2t5Ymx1ZSIpDQpgYGANCg0KDQo=