Data

This time we are going to use a typical credit scoring data with predefined “default” variables and personal demografic and income data. Please take a look closer at headers and descriptions of each variable.

Scatterplots

First let’s visualize our quantitative relationships using scatterplots.

Normalizing the skewed distribution of incomes using log & Plot

Creating a scatter plot with the logarithmically transformed data

Scatterplots by groups

Estimated Density Plotes

To see more closely if there any differences between those two distributions adding their estimated density plots

Plots Together:

Giving Density Curves to Scatterplots

## `geom_smooth()` using formula = 'y ~ x'

Correlation coefficients - P.L correlation:

## [1] -0.02677729

Percentage of the explained variability:

## [1] 0.07170234

Difference between that one and the S-P coefficient:

## [1] 0.6018467

How can we interpret the obtained partial correlation coefficient? What is the difference between that one and the semi-partial coefficient:

## [1] 0.6018467

Rank correlation

For 2 different scales - like for example this pair of variables: income vs. education levels - we cannot use Pearson’s coefficient. The only possibility is to rank also incomes… and lose some more detailed information about them.

First, let’s see boxplots of income by education levels.

Kendal’s coefficient of rank correlation:

#(robust for ties))

## [1] -0.01224209

Point-biserial correlation

Comparing QVar and DVar

## [1] -0.07096966

Eta Coefficient:

## [1] 0.708378

Correlation matrix

Correlation matrix with scatterplots

## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## [[1]]

## 
## [[2]]

## 
## [[3]]

## 
## [[4]]

## 
## [[5]]

## 
## [[6]]

## 
## [[7]]

## Warning in warn_if_args_exist(list(...)): Extra arguments: "aes_string" are
## being ignored.  If these are meant to be aesthetics, submit them using the
## 'mapping' variable within ggpairs with ggplot2::aes or ggplot2::aes_string.

Exercise 1. Contingency analysis.

##         Believe
## Gender   Yes  No
##   Female 435 375
##   Male   147 134

## Call: cohen.kappa1(x = x, w = w, n.obs = n.obs, alpha = alpha, levels = levels, 
##     w.exp = w.exp)
## 
## Cohen Kappa and Weighted Kappa correlation coefficients and confidence boundaries 
##                   lower estimate upper
## unweighted kappa -0.043    0.011 0.065
## weighted kappa   -0.043    0.011 0.065
## 
##  Number of subjects = 1091
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  dane
## X-squared = 0.11103, df = 1, p-value = 0.739
##         Believe
## Gender         Yes        No
##   Female 0.3987168 0.3437214
##   Male   0.1347388 0.1228231
## [1] 0.01218871

Exercise 2. Contingency analysis for the ‘Titanic’ data.

Dropping rows:

# Function to Drop NA
titanic <- titanic %>% drop_na()

titanic$Status <- as.factor(titanic$Status)
titanic$Gender <- as.factor(titanic$Gender)

# Create Contingency Table and Perform Chi-Square Test
contingency_table <- table(titanic$Gender, titanic$Status)
chi_square_test <- chisq.test(contingency_table)
## Warning in chisq.test(contingency_table): Chi-squared approximation may be
## incorrect

Creating Contingency Table

Phi(contingency_table)
## [1] 0.5257638
ContCoef(contingency_table)
## [1] 0.4653638
CramerV(contingency_table)
## [1] 0.5257638
TschuprowT(contingency_table)
## [1] 0.4421129

Ploting mosaicplot:

mosaicplot(contingency_table)

Ploting bar plot:

barplot(contingency_table)

### According to the data, we can see it was better to be a woman.

LS0tDQp0aXRsZTogIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MiDQpzdWJ0aXRsZTogJ0JpdmFyaWF0ZSBBbmFseXNpcyAtIFJlcG9ydF80OiBSJw0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0KYXV0aG9yOiAiTWFyaXVzeiBHb2RsZXdza2ksIElnbmFjeSBIaXJzeiwgSGFzYW4gQmFyxLHFnyBHw7ZrIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgZm9udHNpemU6IDEwcHQNCiAgICB0b2M6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogbm8NCiAgICBkZl9wcmludDogZGVmYXVsdA0KICAgIHRvY19kZXB0aDogNQ0KLS0tDQoNCmBgYHtyIHNldHVwLAltZXNzYWdlID0gRkFMU0UsCXdhcm5pbmcgPSBGQUxTRSwJaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShIU0FVUjMpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHBwY29yKSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBwYXJ0aWFsIGFuZCBzZW1pcGFydGlhbCBjb3JyZWxhdGlvbnMuDQpsaWJyYXJ5KGx0bSkgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgcG9pbnQtYmlzZXJpYWwgY29ycmVsYXRpb25zLg0KbGlicmFyeShkZXZ0b29scykgDQojaW5zdGFsbF9naXRodWIoIm1hcmtoZWNrbWFubi9yeW91cmVhZHkiKSAjIHBsZWFzZSBpbnN0YWxsIHBhY2thZ2UgInJ5b3VyZWFkeSIgZnJvbSBnaXRodWIhICh0aGVuICMgaXQpDQpsaWJyYXJ5KHJ5b3VyZWFkeSkgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgbm9ubGluZWFyICJldGEiIGNvcnJlbGF0aW9ucy4NCmxpYnJhcnkoR0dhbGx5KSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBjb3JyZWxhdGlvbiBtYXRyaXguDQpsaWJyYXJ5KHBzeWNoKSAjIHRoaXMgcGFja2FnZSBjb21wdXRlcyBxdWFsaXRhdGl2ZSBjb3JyZWxhdGlvbnMuDQpsaWJyYXJ5KERlc2NUb29scykgIyB0aGlzIHBhY2thZ2UgY29tcHV0ZXMgcXVhbGl0YXRpdmUgY29ycmVsYXRpb25zLg0KYGBgDQoNCg0KDQojIyBEYXRhDQoNClRoaXMgdGltZSB3ZSBhcmUgZ29pbmcgdG8gdXNlIGEgdHlwaWNhbCBjcmVkaXQgc2NvcmluZyBkYXRhIHdpdGggcHJlZGVmaW5lZCAiZGVmYXVsdCIgdmFyaWFibGVzIGFuZCBwZXJzb25hbCBkZW1vZ3JhZmljIGFuZCBpbmNvbWUgZGF0YS4gUGxlYXNlIHRha2UgYSBsb29rIGNsb3NlciBhdCBoZWFkZXJzIGFuZCBkZXNjcmlwdGlvbnMgb2YgZWFjaCB2YXJpYWJsZS4NCg0KYGBge3IgbG9hZC1kYXRhLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpkb3dubG9hZC5maWxlKCJodHRwczovL2dpdGh1Yi5jb20va2ZsaXNpa293c2tpL2RzL2Jsb2IvbWFzdGVyL2JhbmtfZGVmYXVsdHMuc2F2P3Jhdz10cnVlIiwgZGVzdGZpbGUgPSJiYW5rX2RlZmF1bHRzLnNhdiIsbW9kZT0id2IiKQ0KYmFua19kZWZhdWx0cyA8LSByZWFkX3NhdigiYmFua19kZWZhdWx0cy5zYXYiKQ0KYmFuazwtbmEub21pdChiYW5rX2RlZmF1bHRzKQ0KYmFuayRkZWY8LWFzLmZhY3RvcihiYW5rJGRlZmF1bHQpDQpiYW5rJGVkdWM8LWFzLmZhY3RvcihiYW5rJGVkKQ0KYGBgDQoNCiMjIFNjYXR0ZXJwbG90cw0KDQpGaXJzdCBsZXQncyB2aXN1YWxpemUgb3VyIHF1YW50aXRhdGl2ZSByZWxhdGlvbnNoaXBzIHVzaW5nIHNjYXR0ZXJwbG90cy4gDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IiwgeGxhYiA9ICJJbmNvbWUiLCB5bGFiID0gIkRlYnQiKQ0KDQpgYGANCg0KIyMgTm9ybWFsaXppbmcgdGhlIHNrZXdlZCBkaXN0cmlidXRpb24gb2YgaW5jb21lcyB1c2luZyBsb2cgJiBQbG90DQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCiMgQmFzaWMgc2NhdHRlciBwbG90IHdpdGggdGhlIGxvZyBvZiBpbmNvbWUNCmJhbmskbG9nX2luY29tZSA8LSBsb2coYmFuayRpbmNvbWUpDQpiYW5rJGxvZ19kZWJ0aW5jIDwtIGxvZyhiYW5rJGRlYnRpbmMpDQoNCnBsb3QoeCA9IGJhbmskbG9nX2luY29tZSwgeSA9IGJhbmskbG9nX2RlYnRpbmMsIG1haW4gPSAiTG9nYXJpdGhtaWMgSW5jb21lIHZzLiBMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIsIHhsYWIgPSAiTG9nYXJpdGhtaWMgSW5jb21lIiwgeWxhYiA9ICJMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIpDQpgYGANCg0KIyMgQ3JlYXRpbmcgYSBzY2F0dGVyIHBsb3Qgd2l0aCB0aGUgbG9nYXJpdGhtaWNhbGx5IHRyYW5zZm9ybWVkIGRhdGENCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KYmFuayRsb2dfaW5jb21lIDwtIGxvZyhiYW5rJGluY29tZSkNCmJhbmskbG9nX2RlYnRpbmMgPC0gbG9nKGJhbmskZGVidGluYykNCg0KcGxvdCh4ID0gYmFuayRsb2dfaW5jb21lLCB5ID0gYmFuayRsb2dfZGVidGluYywgbWFpbiA9ICJMb2dhcml0aG1pYyBJbmNvbWUgdnMuIExvZ2FyaXRobWljIERlYnQgSW5jb21lIiwgeGxhYiA9ICJMb2dhcml0aG1pYyBJbmNvbWUiLCB5bGFiID0gIkxvZ2FyaXRobWljIERlYnQgSW5jb21lIikNCg0KbG1fbW9kZWwgPC0gbG0obG9nX2RlYnRpbmMgfiBsb2dfaW5jb21lLCBkYXRhID0gYmFuaykNCmFibGluZShsbV9tb2RlbCwgY29sID0gInJlZCIpDQoNCmBgYA0KDQojIyBTY2F0dGVycGxvdHMgYnkgZ3JvdXBzDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KDQojIEdyb3VwaW5nIHRoZSBkYXRhIGJ5IGVkdWNhdGlvbiBsZXZlbA0KZ3JvdXBlZF9kYXRhIDwtIHNwbGl0KGJhbmssIGJhbmskZWR1YykNCg0KIyBDcmVhdGluZyBzZXBhcmF0ZSBzY2F0dGVycGxvdHMgZm9yIGVhY2ggZWR1Y2F0aW9uIGxldmVsDQpmb3IgKGkgaW4gMTpsZW5ndGgoZ3JvdXBlZF9kYXRhKSkgew0KICBwbG90KHggPSBncm91cGVkX2RhdGFbW2ldXSRsb2dfaW5jb21lLCB5ID0gZ3JvdXBlZF9kYXRhW1tpXV0kbG9nX2RlYnRpbmMsIA0KICAgICAgIG1haW4gPSBwYXN0ZSgiTG9nYXJpdGhtaWMgSW5jb21lIHZzLiBMb2dhcml0aG1pYyBEZWJ0IEluY29tZSAoRWR1Y2F0aW9uIExldmVsOiIsIG5hbWVzKGdyb3VwZWRfZGF0YSlbaV0sICIpIiksIA0KICAgICAgIHhsYWIgPSAiTG9nYXJpdGhtaWMgSW5jb21lIiwgeWxhYiA9ICJMb2dhcml0aG1pYyBEZWJ0IEluY29tZSIpDQogIGxtX21vZGVsIDwtIGxtKGxvZ19kZWJ0aW5jIH4gbG9nX2luY29tZSwgZGF0YSA9IGdyb3VwZWRfZGF0YVtbaV1dKQ0KICBhYmxpbmUobG1fbW9kZWwsIGNvbCA9ICJyZWQiKQ0KfQ0KDQpgYGANCg0KIyMgRXN0aW1hdGVkIERlbnNpdHkgUGxvdGVzDQpUbyBzZWUgbW9yZSBjbG9zZWx5IGlmIHRoZXJlIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRob3NlIHR3byBkaXN0cmlidXRpb25zIGFkZGluZyB0aGVpciBlc3RpbWF0ZWQgZGVuc2l0eSBwbG90cw0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIHNjYXR0ZXIgcGxvdCBvZiB4IGFuZCB5IHZhcmlhYmxlcw0KIyBjb2xvdXIgYnkgZ3JvdXBzDQoNCg0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIGNvbCA9IGJhbmskZWR1YywgDQogICAgIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsIA0KICAgICB4bGFiID0gIkluY29tZSIsIHlsYWIgPSAiRGVidCBJbmNvbWUiKQ0KDQoNCiMgTWFyZ2luYWwgZGVuc2l0eSBwbG90IG9mIGFnZSAodG9wIHBhbmVsKQ0KZGVuc2l0eV9hZ2UgPC0gZGVuc2l0eShiYW5rJGFnZSkNCnBsb3QoZGVuc2l0eV9hZ2UsIG1haW4gPSAiRGVuc2l0eSBQbG90IG9mIEFnZSIsIHhsYWIgPSAiQWdlIikNCg0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB5IChyaWdodCBwYW5lbCkNCg0KZGVuc2l0eV95IDwtIGRlbnNpdHkoYmFua19kZWZhdWx0cyRhZ2UpDQpwbG90KGRlbnNpdHlfeSwgbWFpbiA9ICJEZW5zaXR5IFBsb3Qgb2YgWSIsIHhsYWIgPSAiWSIpDQoNCmBgYA0KDQojIyBQbG90cyBUb2dldGhlcjoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIFNldCB1cCB0aGUgbGF5b3V0DQpwYXIobWZyb3cgPSBjKDIsIDIpKSAgIyAyIHJvd3MsIDIgY29sdW1ucw0KDQojIFNjYXR0ZXIgcGxvdA0KcGxvdCh4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIGNvbCA9IGJhbmskZWR1YywgDQogICAgIG1haW4gPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsIA0KICAgICB4bGFiID0gIkluY29tZSIsIHlsYWIgPSAiRGVidCBJbmNvbWUiKQ0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiBhZ2UgKHRvcCBwYW5lbCkNCmRlbnNpdHlfYWdlIDwtIGRlbnNpdHkoYmFuayRhZ2UpDQpwbG90KGRlbnNpdHlfYWdlLCBtYWluID0gIkRlbnNpdHkgUGxvdCBvZiBBZ2UiLCB4bGFiID0gIkFnZSIpDQoNCiMgQ3JlYXRlIHNwYWNlIGZvciB0aGUgdGhpcmQgcGxvdA0KcGxvdC5uZXcoKQ0KDQojIE1hcmdpbmFsIGRlbnNpdHkgcGxvdCBvZiB5IChyaWdodCBwYW5lbCkNCmRlbnNpdHlfeSA8LSBkZW5zaXR5KGJhbmtfZGVmYXVsdHMkYWdlKQ0KcGxvdChkZW5zaXR5X3ksIG1haW4gPSAiRGVuc2l0eSBQbG90IG9mIFkiLCB4bGFiID0gIlkiKQ0KDQoNCmBgYA0KDQojIyBHaXZpbmcgRGVuc2l0eSBDdXJ2ZXMgdG8gU2NhdHRlcnBsb3RzDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KI0knbSBub3Qgc3VyZSEhDQoNCiMgU2NhdHRlciBwbG90DQpwbG90KHggPSBiYW5rJGluY29tZSwgeSA9IGJhbmskZGVidGluYywgY29sID0gYmFuayRlZHVjLCANCiAgICAgbWFpbiA9ICJJbmNvbWUgdnMuIERlYnQgSW5jb21lIiwgDQogICAgIHhsYWIgPSAiSW5jb21lIiwgeWxhYiA9ICJEZWJ0IEluY29tZSIpDQoNCiMgQWRkIGRlbnNpdHkgcGxvdCBmb3IgaW5jb21lDQpsaW5lcyhkZW5zaXR5KGJhbmskaW5jb21lKSwgY29sID0gImJsdWUiKQ0KDQojIEFkZCBkZW5zaXR5IHBsb3QgZm9yIGRlYnRpbmMNCmxpbmVzKGRlbnNpdHkoYmFuayRkZWJ0aW5jKSwgY29sID0gInJlZCIpDQoNCiNBbHNvOg0KZ2dwbG90KGJhbmssIGFlcyh4ID0gaW5jb21lLCB5ID0gZGVidGluYywgY29sb3IgPSBmYWN0b3IoZWR1YykpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsgICMgQWRkIGxpbmVhciB0cmVuZCBsaW5lDQogIGxhYnModGl0bGUgPSAiSW5jb21lIHZzLiBEZWJ0IEluY29tZSIsDQogICAgICAgeCA9ICJJbmNvbWUiLCB5ID0gIkRlYnQgSW5jb21lIikgKw0KICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIkVkdWNhdGlvbiIpICsgICMgUmVuYW1lIGxlZ2VuZA0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCiMjIENvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyAtIFAuTCBjb3JyZWxhdGlvbjoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQoNCiMgQ2FsY3VsYXRlIFBlYXJzb24ncyBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KY29ycmVsYXRpb24gPC0gY29yKHggPSBiYW5rJGluY29tZSwgeSA9IGJhbmskZGVidGluYywgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcHJpbnQoY29ycmVsYXRpb24pDQoNCg0KYGBgDQoNCiMjIFBlcmNlbnRhZ2Ugb2YgdGhlIGV4cGxhaW5lZCB2YXJpYWJpbGl0eToNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIENhbGN1bGF0ZSBQZWFyc29uJ3MgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCmNvcnJlbGF0aW9uIDwtIGNvcih4ID0gYmFuayRpbmNvbWUsIHkgPSBiYW5rJGRlYnRpbmMsIG1ldGhvZCA9ICJwZWFyc29uIikNCg0KIyBDYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgZXhwbGFpbmVkIHZhcmlhYmlsaXR5DQpleHBsYWluZWRfdmFyaWFiaWxpdHkgPC0gY29ycmVsYXRpb25eMiAqIDEwMA0KDQojIHByaW50KGNvcnJlbGF0aW9uKQ0KDQojIFByaW50IHRoZSBwZXJjZW50YWdlIG9mIGV4cGxhaW5lZCB2YXJpYWJpbGl0eQ0KcHJpbnQoZXhwbGFpbmVkX3ZhcmlhYmlsaXR5KQ0KYGBgDQoNCiMjIERpZmZlcmVuY2UgYmV0d2VlbiB0aGF0IG9uZSBhbmQgdGhlIFMtUCBjb2VmZmljaWVudDoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBFbnN1cmUgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSB2YXJpYWJsZXMNCmNvbXBsZXRlX2Nhc2VzIDwtIGNvbXBsZXRlLmNhc2VzKGJhbmskbG9nX2luY29tZSwgYmFuayRhZ2UsIGJhbmskZW1wbG95KQ0KbG9nX2luY29tZSA8LSBiYW5rJGxvZ19pbmNvbWVbY29tcGxldGVfY2FzZXNdDQphZ2UgPC0gYmFuayRhZ2VbY29tcGxldGVfY2FzZXNdDQp0ZW51cmUgPC0gYmFuayRlbXBsb3lbY29tcGxldGVfY2FzZXNdDQoNCiMgQ29tcHV0ZSBwYXJ0aWFsIGNvcnJlbGF0aW9uDQpwYXJ0aWFsX2NvcnIgPC0gcGNvci50ZXN0KGxvZ19pbmNvbWUsIGFnZSwgeSA9IHRlbnVyZSwgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBwYXJ0aWFsIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQpwcmludChwYXJ0aWFsX2NvcnIkZXN0aW1hdGUpDQoNCmBgYA0KDQpIb3cgY2FuIHdlIGludGVycHJldCB0aGUgb2J0YWluZWQgcGFydGlhbCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudD8gV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoYXQgb25lIGFuZCB0aGUgc2VtaS1wYXJ0aWFsIGNvZWZmaWNpZW50Og0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDb21wdXRlIHNlbWktcGFydGlhbCBjb3JyZWxhdGlvbg0Kc2VtaV9wYXJ0aWFsX2NvcnIgPC0gcGNvci50ZXN0KGxvZ19pbmNvbWUsIGFnZSwgeCA9IHRlbnVyZSwgbWV0aG9kID0gInBlYXJzb24iKQ0KDQojIFByaW50IHRoZSBzZW1pLXBhcnRpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCnByaW50KHNlbWlfcGFydGlhbF9jb3JyJGVzdGltYXRlKQ0KYGBgDQoNCiMjIFJhbmsgY29ycmVsYXRpb24gDQoNCkZvciAyIGRpZmZlcmVudCBzY2FsZXMgLSBsaWtlIGZvciBleGFtcGxlIHRoaXMgcGFpciBvZiB2YXJpYWJsZXM6IGluY29tZSB2cy4gZWR1Y2F0aW9uIGxldmVscyAtIHdlIGNhbm5vdCB1c2UgUGVhcnNvbidzIGNvZWZmaWNpZW50LiBUaGUgb25seSBwb3NzaWJpbGl0eSBpcyB0byByYW5rIGFsc28gaW5jb21lcy4uLiBhbmQgbG9zZSBzb21lIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlbS4gDQoNCkZpcnN0LCBsZXQncyBzZWUgYm94cGxvdHMgb2YgaW5jb21lIGJ5IGVkdWNhdGlvbiBsZXZlbHMuDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KYm94cGxvdChpbmNvbWUgfiBlZCwgZGF0YSA9IGJhbmssIA0KICAgICAgICBtYWluID0gIkluY29tZSBieSBFZHVjYXRpb24gTGV2ZWxzIiwNCiAgICAgICAgeGxhYiA9ICJFZHVjYXRpb24gTGV2ZWwiLCB5bGFiID0gIkluY29tZSIsDQogICAgICAgIGNvbCA9ICJsaWdodGJsdWUiKQ0KYGBgDQoNCiMjIEtlbmRhbCdzIGNvZWZmaWNpZW50IG9mIHJhbmsgY29ycmVsYXRpb246DQojKHJvYnVzdCBmb3IgdGllcykpDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIENhbGN1bGF0ZSBLZW5kYWxsJ3MgY29lZmZpY2llbnQgb2YgcmFuayBjb3JyZWxhdGlvbg0Ka2VuZGFsbF9jb3JyIDwtIGNvcih4ID0gYmFuayRpbmNvbWUsIHk9YmFuayRkZWJ0aW5jLCBtZXRob2QgPSAia2VuZGFsbCIpDQoNCiMgUHJpbnQgdGhlIEtlbmRhbGwncyBjb2VmZmljaWVudCBvZiByYW5rIGNvcnJlbGF0aW9uDQpwcmludChrZW5kYWxsX2NvcnIpDQoNCmBgYA0KDQoNCiMjIFBvaW50LWJpc2VyaWFsIGNvcnJlbGF0aW9uDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9VFJVRX0NCg0KIyBEZWZpbmUgcmlza19zdGF0dXMgYmFzZWQgb24gZGVidGluYyB0aHJlc2hvbGRzDQpiYW5rJHJpc2tfc3RhdHVzIDwtIGlmZWxzZShiYW5rJGRlYnRpbmMgPD0gMTUsICdMb3cnLCAnSGlnaCcpDQoNCiMgQ3JlYXRlIHRoZSBib3hwbG90DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoYmFuaywgYWVzKHg9cmlza19zdGF0dXMsIHk9aW5jb21lLCBmaWxsPXJpc2tfc3RhdHVzKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJsaWdodGJsdWUiLCAibGlnaHRncmVlbiIpKSArICAjIEN1c3RvbSBjb2xvciBwYWxldHRlDQogIGxhYnModGl0bGU9J0luY29tZSBieSBSaXNrIFN0YXR1cycsIHg9J1Jpc2sgU3RhdHVzJywgeT0nSW5jb21lJykgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSAgIyBSZW1vdmUgbGVnZW5kDQoNCiMgU2hvdyB0aGUgcGxvdA0KYGBgDQoNCiMjIENvbXBhcmluZyBRVmFyIGFuZCBEVmFyDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgQ2FsY3VsYXRlIHRoZSBwb2ludC1iaXNlcmlhbCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcG9pbnRfYmlzZXJpYWxfY29yciA8LSBjb3IoYmFuayRpbmNvbWUsIGJhbmskZGVmYXVsdCkNCg0KIyBQcmludCB0aGUgcG9pbnQtYmlzZXJpYWwgY29ycmVsYXRpb24gY29lZmZpY2llbnQNCnByaW50KHBvaW50X2Jpc2VyaWFsX2NvcnIpDQoNCmBgYA0KDQoNCiMjIEV0YSBDb2VmZmljaWVudDogDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyBDYWxjdWxhdGUgUGVhcnNvbidzIGxpbmVhciBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KcGVhcnNvbl9jb3JyIDwtIGNvcih4ID0gYmFuayRjcmVkZGVidCwgeT0gYmFuayRvdGhkZWJ0LCBtZXRob2QgPSAicGVhcnNvbiIpDQoNCiMgQ2FsY3VsYXRlIEtlbmRhbGwncyByYW5rIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQprZW5kYWxsX2NvcnIgPC0gY29yKHg9YmFuayRjcmVkZGVidCwgeT1iYW5rJG90aGRlYnQsIG1ldGhvZCA9ICJrZW5kYWxsIikNCg0KIyBDYWxjdWxhdGUgdGhlIGV0YSBjb2VmZmljaWVudA0KZXRhX2NvZWZmaWNpZW50IDwtIHNxcnQoMSAtIChrZW5kYWxsX2NvcnJeMiAvIHBlYXJzb25fY29ycl4yKSkNCg0KIyBQcmludCB0aGUgZXRhIGNvZWZmaWNpZW50DQpwcmludChldGFfY29lZmZpY2llbnQpDQoNCg0KYGBgDQoNCiMjIENvcnJlbGF0aW9uIG1hdHJpeA0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPVRSVUV9DQojIEVuc3VyaW5nIGFsbCB2YXJpYWJsZXMgYXJlIG51bWVyaWMNCm51bWVyaWNfY29sdW1ucyA8LSBiYW5rWywgc2FwcGx5KGJhbmssIGlzLm51bWVyaWMpXQ0KDQojIENhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gbWF0cml4IGZvciBxdWFudGl0YXRpdmUgdmFyaWFibGVzDQpjb3JyZWxhdGlvbl9tYXRyaXggPC0gY29yKG51bWVyaWNfY29sdW1ucykNCg0KIyBQbG90IHRoZSBjb3JyZWxhdGlvbiBtYXRyaXgNCmdnY29ycihjb3JyZWxhdGlvbl9tYXRyaXgpDQpgYGANCiAgDQoNCiMjIENvcnJlbGF0aW9uIG1hdHJpeCB3aXRoIHNjYXR0ZXJwbG90cyANCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1UUlVFfQ0KDQojIE1ha2Ugc3VyZSB0aGUgJ2RlZmF1bHRfc3RhdHVzJyB2YXJpYWJsZSBleGlzdHMgYW5kIGlzIGEgZmFjdG9yDQpiYW5rJGRlZmF1bHQgPC0gYXMuZmFjdG9yKGJhbmskZGVmYXVsdCkNCg0KIyBQbG90IGRpc3RyaWJ1dGlvbnMgYnkgZ3JvdXANCnZhcmlhYmxlcyA8LSBjKCJhZ2UiLCAibG9nX2luY29tZSIsICJlbXBsb3kiLCAiYWRkcmVzcyIsICJkZWJ0aW5jIiwgImNyZWRkZWJ0IiwgIm90aGRlYnQiKQ0KDQoNCg0KcGxvdF9kaXN0cmlidXRpb24gPC0gZnVuY3Rpb24odmFyKSB7DQogIGdncGxvdChiYW5rLCBhZXNfc3RyaW5nKHggPSB2YXIsIGZpbGwgPSBiYW5rJGRlZmF1bHQpKSArDQogICAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArDQogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJEaXN0cmlidXRpb24gb2YiLCB2YXIsICJieSBEZWZhdWx0IFN0YXR1cyIpKSArDQogICAgdGhlbWVfbWluaW1hbCgpDQp9DQoNCg0KZGlzdHJpYnV0aW9uX3Bsb3RzIDwtIGxhcHBseSh2YXJpYWJsZXMsIHBsb3RfZGlzdHJpYnV0aW9uKQ0KZGlzdHJpYnV0aW9uX3Bsb3RzDQoNCg0KIyBDcmVhdGUgdGhlIGdncGFpcnMgcGxvdA0KZ2dwYWlycyhiYW5rLCANCiAgICAgICAgY29sdW1ucyA9IDE6NywgDQogICAgICAgIG1hcHBpbmcgPSBhZXMoY29sb3IgPSBkZWZhdWx0KSwgDQogICAgICAgIHVwcGVyID0gbGlzdChjb250aW51b3VzID0gd3JhcCgic21vb3RoIiwgbWV0aG9kID0gImxtIikpLCANCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAicG9pbnRzIiksIA0KICAgICAgICBhZXNfc3RyaW5nID0gbGlzdChjb250aW51b3VzID0gImRlbnNpdHkiKSkgKyANCiAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdCBNYXRyaXggd2l0aCBDb3JyZWxhdGlvbiBhbmQgVHJlbmRzIGJ5IERlZmF1bHQgU3RhdHVzIikNCg0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgMS4gQ29udGluZ2VuY3kgYW5hbHlzaXMuDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KeD1jKDQzNSwxNDcsMzc1LDEzNCkNCmRpbSh4KT1jKDIsMikNCmRhbmU8LWFzLnRhYmxlKHgpDQpkaW1uYW1lcyhkYW5lKT1saXN0KEdlbmRlcj1jKCdGZW1hbGUnLCdNYWxlJyksQmVsaWV2ZT1jKCdZZXMnLCdObycpKQ0KZGFuZQ0KZm91cmZvbGRwbG90KGRhbmUpDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp5ZXM8LWMoNDM1LDE0NykNCm5vPC1jKDM3NSwxMzQpDQpjb2hlbi5rYXBwYShjYmluZCh5ZXMsbm8pKQ0KY2hpc3EudGVzdChkYW5lKQ0KcHJvcC50YWJsZShkYW5lKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NClBoaShkYW5lKQ0KIz9Db250Q29lZg0KI0NvbnRDb2VmKGRhbmUpDQojQ3JhbWVyVihkYW5lKQ0KI1RzY2h1cHJvd1QoZGFuZSkNCm1vc2FpY3Bsb3QoZGFuZSkNCmJhcnBsb3QoZGFuZSkNCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDIuIENvbnRpbmdlbmN5IGFuYWx5c2lzIGZvciB0aGUgJ1RpdGFuaWMnIGRhdGEuDQoNCg0KYGBge3IgbG9hZC1kYXRhMiwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly9naXRodWIuY29tL2tmbGlzaWtvd3NraS9kcy9ibG9iL21hc3Rlci90aXRhbmljLmNzdj9yYXc9dHJ1ZSIsIGRlc3RmaWxlID0idGl0YW5pYy5jc3YiLG1vZGU9IndiIikNCnRpdGFuaWMgPC0gcmVhZC5jc3YoInRpdGFuaWMuY3N2Iixyb3cubmFtZXM9MSxzZXA9IjsiKQ0KYGBgDQoNCkRyb3BwaW5nIHJvd3M6DQpgYGB7cn0NCiMgRnVuY3Rpb24gdG8gRHJvcCBOQQ0KdGl0YW5pYyA8LSB0aXRhbmljICU+JSBkcm9wX25hKCkNCg0KdGl0YW5pYyRTdGF0dXMgPC0gYXMuZmFjdG9yKHRpdGFuaWMkU3RhdHVzKQ0KdGl0YW5pYyRHZW5kZXIgPC0gYXMuZmFjdG9yKHRpdGFuaWMkR2VuZGVyKQ0KDQojIENyZWF0ZSBDb250aW5nZW5jeSBUYWJsZSBhbmQgUGVyZm9ybSBDaGktU3F1YXJlIFRlc3QNCmNvbnRpbmdlbmN5X3RhYmxlIDwtIHRhYmxlKHRpdGFuaWMkR2VuZGVyLCB0aXRhbmljJFN0YXR1cykNCmNoaV9zcXVhcmVfdGVzdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlKQ0KDQpgYGANCg0KQ3JlYXRpbmcgQ29udGluZ2VuY3kgVGFibGUNCmBgYHtyfQ0KUGhpKGNvbnRpbmdlbmN5X3RhYmxlKQ0KYGBgDQoNCmBgYHtyfQ0KQ29udENvZWYoY29udGluZ2VuY3lfdGFibGUpDQpgYGANCg0KYGBge3J9DQpDcmFtZXJWKGNvbnRpbmdlbmN5X3RhYmxlKQ0KYGBgDQoNCmBgYHtyfQ0KVHNjaHVwcm93VChjb250aW5nZW5jeV90YWJsZSkNCmBgYA0KDQpQbG90aW5nIG1vc2FpY3Bsb3Q6DQpgYGB7cn0NCm1vc2FpY3Bsb3QoY29udGluZ2VuY3lfdGFibGUpDQpgYGANCg0KUGxvdGluZyBiYXIgcGxvdDoNCmBgYHtyfQ0KYmFycGxvdChjb250aW5nZW5jeV90YWJsZSkNCmBgYA0KIyMjIEFjY29yZGluZyB0byB0aGUgZGF0YSwgd2UgY2FuIHNlZSBpdCB3YXMgYmV0dGVyIHRvIGJlIGEgd29tYW4u