V tejto práci sa budeme zaoberať prvými krokmi v odhade regresnej funkcie. Budeme využívať databázu Life Expectancy (WHO) Fixed dataset, ktorá obsahuje ukazovatele na úrovni krajín, ako je priemerná dĺžka života, HDP, školské vzdelávanie a výdavky na zdravotníctvo.

Využívanie niektorých knižníc

rm(list=ls())
library(lmtest)   #  podpora regresie
library(outliers) # analyza odlahlych hodnot (outliers)
library(gptstudio)
library(kableExtra)
library(knitr)
library(dplyr)
library(broom)
library(corrplot)

Príprava údajov - import z csv súboru

Súbor Life_Expectancy_Data obsahuje databázu determinantov očakávanej dĺžky života. Import údajov urobíme nasledovne

# import the dataset and create a data.frame udaje
#
udaje_svet <- read.csv("udaje/Life-Expectancy-Data-Updated.csv",header=TRUE,sep=",",dec=".",check.names = TRUE)
head(udaje_svet)
#

Databáza obsahuje údaje o 2938 pozorovaniach a 22 premenných. V tejto práci sa budeme zaoberať len časťou z nich, konkrétne tými, ktoré súvisia s dĺžkou dožitia. Na zažiatku si vyberieme krajinu, ktorej zdravotný stav chceme analyzovať. V tomto prípade ide o Rakúsko (Slovensko v databáze nemá zastúpenie):

# z databázy udaje_svet si vyberieme len tie pozorovania, ktoré sa týkajú Rakuska 
udaje <- subset(udaje_svet, Country == "Austria")

Tabuľka uvedená nižšie nám poskuytuje základné popisné štatistiky vybraných kvantitatívnych premenných.

# niektoré štatistiky a ich prehľad v tabuľke KableExtra
library(kableExtra)
udaje %>%
  select(Adult_mortality,Alcohol_consumption, Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling) %>%
  summary() %>%
  kable() %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Adult_mortality Alcohol_consumption Hepatitis_B Measles BMI Polio Diphtheria GDP_per_capita Population_mln Life_expectancy Schooling
Min. :64.69 Min. :11.60 Min. :33.00 Min. :34.00 Min. :25.00 Min. :71.00 Min. :81.00 Min. :38843 Min. :8.010 Min. :78.10 Min. : 9.00
1st Qu.:71.15 1st Qu.:12.07 1st Qu.:83.00 1st Qu.:46.75 1st Qu.:25.18 1st Qu.:83.00 1st Qu.:83.00 1st Qu.:40442 1st Qu.:8.158 1st Qu.:79.08 1st Qu.: 9.75
Median :77.31 Median :12.12 Median :84.00 Median :61.50 Median :25.30 Median :84.50 Median :84.50 Median :42995 Median :8.310 Median :80.25 Median :11.55
Mean :78.31 Mean :12.23 Mean :81.06 Mean :60.94 Mean :25.29 Mean :86.00 Mean :86.75 Mean :42376 Mean :8.296 Mean :79.97 Mean :10.83
3rd Qu.:85.53 3rd Qu.:12.36 3rd Qu.:89.75 3rd Qu.:74.25 3rd Qu.:25.43 3rd Qu.:89.75 3rd Qu.:89.75 3rd Qu.:44258 3rd Qu.:8.400 3rd Qu.:80.92 3rd Qu.:11.80
Max. :94.88 Max. :13.35 Max. :98.00 Max. :88.00 Max. :25.50 Max. :98.00 Max. :98.00 Max. :44550 Max. :8.640 Max. :81.50 Max. :12.10

Vyššie uvedená tabuľka nám poskytuje prehľad o základných štatistických charakteristikách vybraných premenných, ako sú priemerné hodnoty, rozptyl, minimum a maximum. Tieto informácie nám pomáhajú lepšie pochopiť rozdelenie a rozsah hodnôt v našich dátach. Na druhej strane je zaujímavá aj informácia o vzájomných vzťahoch medzi týmito premennými, čo môžeme merať pomocou korelačnej matice.

# grafický prehľad o korelačných vzťahoch vyjadruje nasledovný obrázok

cor_matrix <- cor(udaje %>% select(Adult_mortality,Alcohol_consumption
,Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling), use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", tl.col =
"black", tl.srt = 45, title = "Korelačná matica vybraných premenných", mar = c(0,0,1,0))

Uvedený graf nám poskytuje vizuálny prehľad o korelačných vzťahoch medzi vybranými premennými. Farby a intenzita farieb nám umožňujú rýchlo identifikovať silné pozitívne alebo negatívne korelácie. Upozorňujeme, že korelácia neznamená kauzalitu.

V nasledovnom je uvedený graf vývoja očakávanej dĺžky dožitia v Rakúsku v rokoch 2000-2015. Vidíme, že očakávaná dĺžka života sa zvyšovala, čo je pozitívny trend.

#  graf vývoja očakávanej dĺžky dožitia v Rakúsku v rokoch 2000-2015.
library(ggplot2)
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
  geom_line() +
  geom_point() +
  labs(title = "Vývoj očakávanej dĺžky dožitia v Rakúsku (2000-2015)",
       x = "Rok",
       y = "Očakávaná dĺžka dožitia") +
  theme_minimal()

Na začiatku sa pokúsme o vyrovnanie priebehu tejto premennej v čase pomocou lineárnej regresie, kde nezávislou premennou bude rok a závislou premennou bude očakávaná dĺžka dožitia. Odhadneme koeficienty tejto regresie a posúdime kvalitu vyrovnania pomocou ukazovateľov, ako je R-squared a p-value.

# vyrovnanie priebehu očakávanej dĺžky dožitia v čase
model <- lm(Life_expectancy ~ Year, data = udaje)

library(broom)
library(knitr)
library(kableExtra)

# koeficienty regresie
tidy(model) %>%
  kable(digits = 3, caption = "Odhadnuté koeficienty regresie") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie
term estimate std.error statistic p.value
(Intercept) -368.170 25.474 -14.453 0
Year 0.223 0.013 17.592 0

# kvalita vyrovnania
glance(model) %>%
  kable(digits = 3, caption = "Ukazovatele kvality vyrovnania") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Ukazovatele kvality vyrovnania
r.squared adj.r.squared sigma statistic p.value df logLik AIC BIC deviance df.residual nobs
0.957 0.954 0.234 309.495 0 1 1.606 2.789 5.106 0.766 14 16
NA

Výsledky regresie nám ukazujú, že koeficient pre rok je pozitívny a štatisticky významný, čo naznačuje, že očakávaná dĺžka dožitia v Rakúsku sa zvyšovala v priebehu rokov 2000-2015. Jej priemerný ročný nárast dosahoval až takmer štvrť roka. Hodnota R-squared hodnota nám hovorí, že model vysvetľuje 95 % variability modelu. Podľa hodnoty p-value môžeme povedať, že model ako celok je štatisticky významný.

# teraz vyššie uvedený obrázok doplníme o regresnú priamku
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
  geom_line() +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  labs(title = "Vývoj očakávanej dĺžky dožitia v Rakúsku (2000-2015) s regresnou priamkou",
       x = "Rok",
       y = "Očakávaná dĺžka dožitia") +
  theme_minimal()

Vývoj spotreby alkoholu

Alkohol je predpokladaný negatívz faktor….

model_alkohol <-lm(Alcohol_consumption ~ Year, data = udaje)
tidy(model_alkohol) %>%
  kable(digits = 3, caption = "Odhadnuté koeficienty regresie pre spotrebu alkoholu") %>%
  kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie pre spotrebu alkoholu
term estimate std.error statistic p.value
(Intercept) 107.022 35.895 2.982 0.010
Year -0.047 0.018 -2.641 0.019
# and now the model quality statistics - just R sqared
r2 <- summary(model_alkohol)$r.squared
adj_r2 <- summary(model_alkohol)$adj.r.squared
# printujeme koeficient determinácie a upravený koeficient determinácie
cat("R-squared:", round(r2, 3), "\n")
R-squared: 0.333 
cat("Adjusted R-squared:", round(adj_r2, 3), "\n")
Adjusted R-squared: 0.285 

Obrázok o skutočných vyrovnaných hodnotách spotreby alkoholu

fitted_vals <- fitted(model_alkohol)
# vykreslenie skutočných a vyrovnaných hodnôt - Alcohol_consumption a fitted_values
ggplot(udaje, aes(x = Year)) +
  geom_line(aes(y = Alcohol_consumption), color = "blue", size = 1) +
  geom_line(aes(y = fitted_vals), color = "red", size = 1, linetype = "dashed") +
  labs(title = "Skutočné vs. Vyrovnané hodnoty spotreby alkoholu v Rakúsku (2000-2015)",
       x = "Rok",
       y = "Spotreba alkoholu") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, max(udaje$Alcohol_consumption, fitted_vals) * 1.1)) +
  theme(legend.position = "none")

LS0tCnRpdGxlOiAiUHLDoWNhIHMgcmVncmVzaW91IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBWbGFkaW3DrXIgR2F6ZGEgKHMgcG9tb2NvdSB2eWJyYW7DvWNoIHpkcm9qb3YpCi0tLQoKViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBwcnbDvW1pIGtyb2ttaSB2IG9kaGFkZSByZWdyZXNuZWogZnVua2NpZS4gQnVkZW1lIHZ5dcW+w612YcWlIGRhdGFiw6F6dSAKW0xpZmUgRXhwZWN0YW5jeSAoV0hPKSBGaXhlZCBkYXRhc2V0XShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2xhc2hhZ29jaC9saWZlLWV4cGVjdGFuY3ktd2hvLXVwZGF0ZWQpLAprdG9yw6Egb2JzYWh1amUgdWthem92YXRlbGUgbmEgw7pyb3ZuaSBrcmFqw61uLCBha28gamUgcHJpZW1lcm7DoSBkxLrFvmthIMW+aXZvdGEsIEhEUCwgxaFrb2xza8OpIHZ6ZGVsw6F2YW5pZSBhIHbDvWRhdmt5IG5hIHpkcmF2b3Ruw61jdHZvLgoKCiMjIFZ5dcW+w612YW5pZSBuaWVrdG9yw71jaCBrbmnFvm7DrWMKCmBgYHtyfQpybShsaXN0PWxzKCkpCmxpYnJhcnkobG10ZXN0KSAgICMgIHBvZHBvcmEgcmVncmVzaWUKbGlicmFyeShvdXRsaWVycykgIyBhbmFseXphIG9kbGFobHljaCBob2Rub3QgKG91dGxpZXJzKQpsaWJyYXJ5KGdwdHN0dWRpbykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGNvcnJwbG90KQpgYGAKCgoKIyMgUHLDrXByYXZhIMO6ZGFqb3YgLSBpbXBvcnQgeiBjc3Ygc8O6Ym9ydQoKU8O6Ym9yIExpZmVfRXhwZWN0YW5jeV9EYXRhIG9ic2FodWplIGRhdGFiw6F6dSBkZXRlcm1pbmFudG92IG/EjWFrw6F2YW5laiBkxLrFvmt5IMW+aXZvdGEuIEltcG9ydCDDumRham92IHVyb2LDrW1lIG5hc2xlZG92bmUKCmBgYHtyfQojIGltcG9ydCB0aGUgZGF0YXNldCBhbmQgY3JlYXRlIGEgZGF0YS5mcmFtZSB1ZGFqZQojCnVkYWplX3N2ZXQgPC0gcmVhZC5jc3YoInVkYWplL0xpZmUtRXhwZWN0YW5jeS1EYXRhLVVwZGF0ZWQuY3N2IixoZWFkZXI9VFJVRSxzZXA9IiwiLGRlYz0iLiIsY2hlY2submFtZXMgPSBUUlVFKQpoZWFkKHVkYWplX3N2ZXQpCiMKYGBgCgpEYXRhYsOhemEgb2JzYWh1amUgw7pkYWplIG8gMjkzOCBwb3pvcm92YW5pYWNoIGEgMjIgcHJlbWVubsO9Y2guIFYgdGVqdG8gcHLDoWNpIHNhIGJ1ZGVtZSB6YW9iZXJhxaUgbGVuIMSNYXPFpW91IHogbmljaCwga29ua3LDqXRuZSB0w71taSwga3RvcsOpIHPDunZpc2lhIHMgZMS6xb5rb3UgZG/Fvml0aWEuIE5hIHphxb5pYXRrdSBzaSB2eWJlcmllbWUga3JhamludSwga3RvcmVqIHpkcmF2b3Ruw70gc3RhdiBjaGNlbWUgYW5hbHl6b3ZhxaUuIFYgdG9tdG8gcHLDrXBhZGUgaWRlIG8gUmFrw7pza28gKFNsb3ZlbnNrbyB2IGRhdGFiw6F6ZSBuZW3DoSB6YXN0w7pwZW5pZSk6CgpgYGB7cn0KIyB6IGRhdGFiw6F6eSB1ZGFqZV9zdmV0IHNpIHZ5YmVyaWVtZSBsZW4gdGllIHBvem9yb3ZhbmlhLCBrdG9yw6kgc2EgdMO9a2Fqw7ogUmFrdXNrYSAKdWRhamUgPC0gc3Vic2V0KHVkYWplX3N2ZXQsIENvdW50cnkgPT0gIkF1c3RyaWEiKQpgYGAKClRhYnXEvmthIHV2ZWRlbsOhIG5pxb7FoWllIG7DoW0gcG9za3V5dHVqZSB6w6FrbGFkbsOpIHBvcGlzbsOpIMWhdGF0aXN0aWt5IHZ5YnJhbsO9Y2gga3ZhbnRpdGF0w612bnljaCBwcmVtZW5uw71jaC4KCmBgYHtyfQojIG5pZWt0b3LDqSDFoXRhdGlzdGlreSBhIGljaCBwcmVoxL5hZCB2IHRhYnXEvmtlIEthYmxlRXh0cmEKbGlicmFyeShrYWJsZUV4dHJhKQp1ZGFqZSAlPiUKICBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24sIEhlcGF0aXRpc19CLCBNZWFzbGVzLCBCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSAlPiUKICBzdW1tYXJ5KCkgJT4lCiAga2FibGUoKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKVnnFocWhaWUgdXZlZGVuw6EgdGFidcS+a2EgbsOhbSBwb3NreXR1amUgcHJlaMS+YWQgbyB6w6FrbGFkbsO9Y2ggxaF0YXRpc3RpY2vDvWNoIGNoYXJha3RlcmlzdGlrw6FjaCB2eWJyYW7DvWNoIHByZW1lbm7DvWNoLCBha28gc8O6IHByaWVtZXJuw6kgaG9kbm90eSwgcm96cHR5bCwgbWluaW11bSBhIG1heGltdW0uIFRpZXRvIGluZm9ybcOhY2llIG7DoW0gcG9tw6FoYWrDuiBsZXDFoWllIHBvY2hvcGnFpSByb3pkZWxlbmllIGEgcm96c2FoIGhvZG7DtHQgdiBuYcWhaWNoIGTDoXRhY2guIE5hIGRydWhlaiBzdHJhbmUgamUgemF1asOtbWF2w6EgYWogaW5mb3Jtw6FjaWEgbyB2esOham9tbsO9Y2ggdnrFpWFob2NoIG1lZHppIHTDvW1pdG8gcHJlbWVubsO9bWksIMSNbyBtw7TFvmVtZSBtZXJhxaUgcG9tb2NvdSBrb3JlbGHEjW5laiBtYXRpY2UuCgpgYGB7cn0KIyBncmFmaWNrw70gcHJlaMS+YWQgbyBrb3JlbGHEjW7DvWNoIHZ6xaVhaG9jaCB2eWphZHJ1amUgbmFzbGVkb3Zuw70gb2Jyw6F6b2sKCmNvcl9tYXRyaXggPC0gY29yKHVkYWplICU+JSBzZWxlY3QoQWR1bHRfbW9ydGFsaXR5LEFsY29ob2xfY29uc3VtcHRpb24KLEhlcGF0aXRpc19CLCBNZWFzbGVzLCBCTUksUG9saW8sRGlwaHRoZXJpYSxHRFBfcGVyX2NhcGl0YSxQb3B1bGF0aW9uX21sbixMaWZlX2V4cGVjdGFuY3ksU2Nob29saW5nKSwgdXNlID0gImNvbXBsZXRlLm9icyIpCmNvcnJwbG90KGNvcl9tYXRyaXgsIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCB0bC5jb2wgPQoiYmxhY2siLCB0bC5zcnQgPSA0NSwgdGl0bGUgPSAiS29yZWxhxI1uw6EgbWF0aWNhIHZ5YnJhbsO9Y2ggcHJlbWVubsO9Y2giLCBtYXIgPSBjKDAsMCwxLDApKQoKYGBgClV2ZWRlbsO9IGdyYWYgbsOhbSBwb3NreXR1amUgdml6dcOhbG55IHByZWjEvmFkIG8ga29yZWxhxI1uw71jaCB2esWlYWhvY2ggbWVkemkgdnlicmFuw71taSBwcmVtZW5uw71taS4gRmFyYnkgYSBpbnRlbnppdGEgZmFyaWViIG7DoW0gdW1vxb7FiHVqw7ogcsO9Y2hsbyBpZGVudGlmaWtvdmHFpSBzaWxuw6kgcG96aXTDrXZuZSBhbGVibyBuZWdhdMOtdm5lIGtvcmVsw6FjaWUuIFVwb3pvcsWIdWplbWUsIMW+ZSBrb3JlbMOhY2lhIG5lem5hbWVuw6Ega2F1emFsaXR1LgoKCgoKIApWIG5hc2xlZG92bm9tIGplIHV2ZWRlbsO9IGdyYWYgdsO9dm9qYSBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFJha8O6c2t1IHYgcm9rb2NoIDIwMDAtMjAxNS4gVmlkw61tZSwgxb5lIG/EjWFrw6F2YW7DoSBkxLrFvmthIMW+aXZvdGEgc2EgenZ5xaFvdmFsYSwgxI1vIGplIHBveml0w612bnkgdHJlbmQuCgpgYGB7cn0KIyAgZ3JhZiB2w712b2phIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgdiByb2tvY2ggMjAwMC0yMDE1LgpsaWJyYXJ5KGdncGxvdDIpCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBZZWFyLCB5ID0gTGlmZV9leHBlY3RhbmN5KSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgKDIwMDAtMjAxNSkiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKTmEgemHEjWlhdGt1IHNhIHBva8O6c21lIG8gdnlyb3ZuYW5pZSBwcmllYmVodSB0ZWp0byBwcmVtZW5uZWogdiDEjWFzZSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUsIGtkZSBuZXrDoXZpc2xvdSBwcmVtZW5ub3UgYnVkZSByb2sgYSB6w6F2aXNsb3UgcHJlbWVubm91IGJ1ZGUgb8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEuIE9kaGFkbmVtZSBrb2VmaWNpZW50eSB0ZWp0byByZWdyZXNpZSBhIHBvc8O6ZGltZSBrdmFsaXR1IHZ5cm92bmFuaWEgcG9tb2NvdSB1a2F6b3ZhdGXEvm92LCBha28gamUgUi1zcXVhcmVkIGEgcC12YWx1ZS4KCmBgYHtyfQojIHZ5cm92bmFuaWUgcHJpZWJlaHUgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiDEjWFzZQptb2RlbCA8LSBsbShMaWZlX2V4cGVjdGFuY3kgfiBZZWFyLCBkYXRhID0gdWRhamUpCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIGtvZWZpY2llbnR5IHJlZ3Jlc2llCnRpZHkobW9kZWwpICU+JQogIGthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiT2RoYWRudXTDqSBrb2VmaWNpZW50eSByZWdyZXNpZSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMga3ZhbGl0YSB2eXJvdm5hbmlhCmdsYW5jZShtb2RlbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJVa2F6b3ZhdGVsZSBrdmFsaXR5IHZ5cm92bmFuaWEiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCgpgYGAKClbDvXNsZWRreSByZWdyZXNpZSBuw6FtIHVrYXp1asO6LCDFvmUga29lZmljaWVudCBwcmUgcm9rIGplIHBveml0w612bnkgYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgxI1vIG5hem5hxI11amUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSB2IFJha8O6c2t1IHNhIHp2ecWhb3ZhbGEgdiBwcmllYmVodSByb2tvdiAyMDAwLTIwMTUuIEplaiBwcmllbWVybsO9IHJvxI1uw70gbsOhcmFzdCBkb3NhaG92YWwgYcW+IHRha21lciDFoXR2csWlIHJva2EuIEhvZG5vdGEgUi1zcXVhcmVkIGhvZG5vdGEgbsOhbSBob3ZvcsOtLCDFvmUgbW9kZWwgdnlzdmV0xL51amUgOTUgXCUgdmFyaWFiaWxpdHkgbW9kZWx1LiBQb2TEvmEgaG9kbm90eSBwLXZhbHVlIG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgbW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKYGBge3J9CiMgdGVyYXogdnnFocWhaWUgdXZlZGVuw70gb2Jyw6F6b2sgZG9wbG7DrW1lIG8gcmVncmVzbsO6IHByaWFta3UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIsIHkgPSBMaWZlX2V4cGVjdGFuY3kpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUmFrw7pza3UgKDIwMDAtMjAxNSkgcyByZWdyZXNub3UgcHJpYW1rb3UiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgojIyMgVsO9dm9qIHNwb3RyZWJ5IGFsa29ob2x1CgpBbGtvaG9sIGplIHByZWRwb2tsYWRhbsO9IG5lZ2F0w612eiBmYWt0b3IuLi4uCgpgYGB7cn0KbW9kZWxfYWxrb2hvbCA8LWxtKEFsY29ob2xfY29uc3VtcHRpb24gfiBZZWFyLCBkYXRhID0gdWRhamUpCnRpZHkobW9kZWxfYWxrb2hvbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPZGhhZG51dMOpIGtvZWZpY2llbnR5IHJlZ3Jlc2llIHByZSBzcG90cmVidSBhbGtvaG9sdSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKIyBhbmQgbm93IHRoZSBtb2RlbCBxdWFsaXR5IHN0YXRpc3RpY3MgLSBqdXN0IFIgc3FhcmVkCnIyIDwtIHN1bW1hcnkobW9kZWxfYWxrb2hvbCkkci5zcXVhcmVkCmFkal9yMiA8LSBzdW1tYXJ5KG1vZGVsX2Fsa29ob2wpJGFkai5yLnNxdWFyZWQKIyBwcmludHVqZW1lIGtvZWZpY2llbnQgZGV0ZXJtaW7DoWNpZSBhIHVwcmF2ZW7DvSBrb2VmaWNpZW50IGRldGVybWluw6FjaWUKY2F0KCJSLXNxdWFyZWQ6Iiwgcm91bmQocjIsIDMpLCAiXG4iKQpjYXQoIkFkanVzdGVkIFItc3F1YXJlZDoiLCByb3VuZChhZGpfcjIsIDMpLCAiXG4iKQpgYGAKCiMgT2Jyw6F6b2sgbyBza3V0b8SNbsO9Y2ggdnlyb3ZuYW7DvWNoIGhvZG5vdMOhY2ggc3BvdHJlYnkgYWxrb2hvbHUgICAgIApgYGB7cn0KZml0dGVkX3ZhbHMgPC0gZml0dGVkKG1vZGVsX2Fsa29ob2wpCiMgdnlrcmVzbGVuaWUgc2t1dG/EjW7DvWNoIGEgdnlyb3ZuYW7DvWNoIGhvZG7DtHQgLSBBbGNvaG9sX2NvbnN1bXB0aW9uIGEgZml0dGVkX3ZhbHVlcwpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gWWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBBbGNvaG9sX2NvbnN1bXB0aW9uKSwgY29sb3IgPSAiYmx1ZSIsIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZml0dGVkX3ZhbHMpLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiU2t1dG/EjW7DqSB2cy4gVnlyb3ZuYW7DqSBob2Rub3R5IHNwb3RyZWJ5IGFsa29ob2x1IHYgUmFrw7pza3UgKDIwMDAtMjAxNSkiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJTcG90cmViYSBhbGtvaG9sdSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIG1heCh1ZGFqZSRBbGNvaG9sX2NvbnN1bXB0aW9uLCBmaXR0ZWRfdmFscykgKiAxLjEpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGA=