knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)
head(World_Happiness_Report_2005_2021)                                            # 
colnames(World_Happiness_Report_2005_2021)                                        # 
 [1] "Country name"                      "Year"                             
 [3] "Life Ladder"                       "Log GDP per capita"               
 [5] "Social support"                    "Healthy life expectancy at birth" 
 [7] "Freedom to make life choices"      "Generosity"                       
 [9] "Perceptions of corruption"         "Positive affect"                  
[11] "Negative affect"                   "Confidence in national government"

Grafy

ggplot2 - knižnica pre grafy

Výber a následné triedenie

library(dplyr)
library(knitr)

udaje_czechia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Czechia") %>%
  select(`Country name`, Year, `Life Ladder`, `Log GDP per capita`, `Social support`)
# Máme naschvál rovnaké aby sme vedeli porovnať

knitr::kable(udaje_czechia, caption = "Hodnoty pre Česko podľa rokov")
Hodnoty pre Česko podľa rokov
Country name Year Life Ladder Log GDP per capita Social support
Czechia 2005 6.439257 10.32169 0.9187595
Czechia 2007 6.500194 10.43283 0.8997790
Czechia 2010 6.249618 10.41880 0.9341611
Czechia 2011 6.331491 10.43418 0.9135107
Czechia 2012 6.334149 10.42490 0.9124268
Czechia 2013 6.697656 10.42411 0.8880433
Czechia 2014 6.483730 10.44543 0.8779152
Czechia 2015 6.608017 10.49594 0.9113626
Czechia 2016 6.735627 10.51908 0.9305929
Czechia 2017 6.789568 10.56682 0.9009690
Czechia 2018 7.034165 10.59496 0.9291639
Czechia 2020 6.897091 10.55865 0.9640537
Czechia 2021 6.942497 10.58128 0.9502268

Scatter plot

# Basic scatter plot
library(ggplot2)
ggplot(udaje_czechia, aes(x = `Log GDP per capita`, y = `Life Ladder`)) +
  geom_point(color = "red", size = 3) +
  theme_minimal() +
  labs(title = "Vzťah medzi HDP na obyvateľa a indexom šťastia pre Česko",
    x = "Log GDP per capita",
    y = "Life Ladder (index šťastia)")

NA
NA

Boxplot

# Bar plot with grouping
library(ggplot2)

udaje_czechia <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Czechia")

ggplot(udaje_czechia, aes(x = factor(Year), y = `Life Ladder`)) +
  geom_boxplot(fill = "lightblue", color = "darkblue") +
  labs(
    title = " Index rokov pre Česko",
    x = "Rok",
    y = "Index Šťastia"
  ) +
  theme_minimal()


# Základné štatistiky.
# Základné štatistiky.
## knitr - tabuľka
library(dplyr)
library(ggplot2)
library(knitr)

# Filtrovanie dát pre Česko
czechia_data <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Czechia")

# Základné štatistiky
czechia_stat <- czechia_data %>%
  group_by(Year) %>%
  summarise(
    n      = n(),
    mean   = mean(`Life Ladder`, na.rm = TRUE),
    sd     = sd(`Life Ladder`, na.rm = TRUE),
    min    = min(`Life Ladder`, na.rm = TRUE),
    q25    = quantile(`Life Ladder`, 0.25, na.rm = TRUE),
    median = median(`Life Ladder`, na.rm = TRUE),
    q75    = quantile(`Life Ladder`, 0.75, na.rm = TRUE),
    max    = max(`Life Ladder`, na.rm = TRUE),
    .groups = "drop"
  )

# Tabuľka
kable(czechia_stat, digits = 2, caption = "Základné štatistiky Indexu šťastia (2005–2021)")
Základné štatistiky Indexu šťastia (2005–2021)
Year n mean sd min q25 median q75 max
2005 1 6.44 NA 6.44 6.44 6.44 6.44 6.44
2007 1 6.50 NA 6.50 6.50 6.50 6.50 6.50
2010 1 6.25 NA 6.25 6.25 6.25 6.25 6.25
2011 1 6.33 NA 6.33 6.33 6.33 6.33 6.33
2012 1 6.33 NA 6.33 6.33 6.33 6.33 6.33
2013 1 6.70 NA 6.70 6.70 6.70 6.70 6.70
2014 1 6.48 NA 6.48 6.48 6.48 6.48 6.48
2015 1 6.61 NA 6.61 6.61 6.61 6.61 6.61
2016 1 6.74 NA 6.74 6.74 6.74 6.74 6.74
2017 1 6.79 NA 6.79 6.79 6.79 6.79 6.79
2018 1 7.03 NA 7.03 7.03 7.03 7.03 7.03
2020 1 6.90 NA 6.90 6.90 6.90 6.90 6.90
2021 1 6.94 NA 6.94 6.94 6.94 6.94 6.94

# Graf vývoja indexu šťastia
ggplot(czechia_data, aes(x = Year, y = `Life Ladder`)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "darkblue") +
  labs(
    title = "Vývoj indexu šťastia v Česku (2005–2021)",
    x = "Rok",
    y = "Index šťastia (Life Ladder)"
  ) +
  theme_minimal()

``
Error: attempt to use zero-length variable name

alebo krajšie tabuľky s pomocou .kableExtra.:


library(dplyr)
library(knitr)
library(kableExtra)

# Filtrovanie dát pre Českú republiku a roky 2005:2021
czechia_stats <- World_Happiness_Report_2005_2021 %>%
  filter(`Country name` == "Czechia", Year %in% 2005:2021) %>%
  group_by(Year) %>%
  summarise(
    n      = n(),
    mean   = mean(`Life Ladder`, na.rm = TRUE),
    sd     = sd(`Life Ladder`, na.rm = TRUE),
    min    = min(`Life Ladder`, na.rm = TRUE),
    q25    = quantile(`Life Ladder`, 0.25, na.rm = TRUE),
    median = median(`Life Ladder`, na.rm = TRUE),
    q75    = quantile(`Life Ladder`, 0.75, na.rm = TRUE),
    max    = max(`Life Ladder`, na.rm = TRUE),
    .groups = "drop"
  )

# Vytvorenie tabuľky pomocou kableExtra
czechia_stats %>%
  kable(digits = 2, caption = "Základné štatistiky indexu šťastia v Česku (2005-2021)") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  add_header_above(c(" " = 2, "Štatistiky Life Ladder" = 7))
Základné štatistiky indexu šťastia v Česku (2005-2021)
Štatistiky Life Ladder
Year n mean sd min q25 median q75 max
2005 1 6.44 NA 6.44 6.44 6.44 6.44 6.44
2007 1 6.50 NA 6.50 6.50 6.50 6.50 6.50
2010 1 6.25 NA 6.25 6.25 6.25 6.25 6.25
2011 1 6.33 NA 6.33 6.33 6.33 6.33 6.33
2012 1 6.33 NA 6.33 6.33 6.33 6.33 6.33
2013 1 6.70 NA 6.70 6.70 6.70 6.70 6.70
2014 1 6.48 NA 6.48 6.48 6.48 6.48 6.48
2015 1 6.61 NA 6.61 6.61 6.61 6.61 6.61
2016 1 6.74 NA 6.74 6.74 6.74 6.74 6.74
2017 1 6.79 NA 6.79 6.79 6.79 6.79 6.79
2018 1 7.03 NA 7.03 7.03 7.03 7.03 7.03
2020 1 6.90 NA 6.90 6.90 6.90 6.90 6.90
2021 1 6.94 NA 6.94 6.94 6.94 6.94 6.94

Testovanie hypotéz

t-test


# Porovnanie 2010 - 2015 vs 2016 - 2021
group1 <- czechia_data$`Life Ladder`[czechia_data$Year %in% 2010:2015]
group2 <- czechia_data$`Life Ladder`[czechia_data$Year %in% 2016:2021]

t_test_result <- t.test(group1, group2)
print(t_test_result)

    Welch Two Sample t-test

data:  group1 and group2
t = -4.7912, df = 8.7198, p-value = 0.001077
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.6325683 -0.2254575
sample estimates:
mean of x mean of y 
 6.450777  6.879790 

Porovnanie 2010 - 2015 vs 2016 - 2021

# Na základe Welchovho dvojvýberového t-testu (t = -4.79; p = 0.001) možno konštatovať, že priemerná hodnota indikátora Life Ladder sa medzi obdobiami 2010–2015 a 2016–2021 štatisticky významne líšila. Priemerná úroveň spokojnosti so životom bola v druhej perióde vyššia (6.88) ako v prvej (6.45), čo naznačuje zlepšenie subjektívnej kvality života v Českej republike. (Zamietame H₀ a akceptujeme H₁.)

ANOVA: Comparing Reading Scores Across Programs

# vytvoríme spoločný dataset pre ANOVU
anova_data <- data.frame(
  LifeLadder = c(group1, group2),
  Period = factor(c(
    rep("2010-2015", length(group1)),
    rep("2016-2021", length(group2))
  ))
)

# vykonanie ANOVA
anova_result <- aov(LifeLadder ~ Period, data = anova_data)
summary(anova_result)
            Df Sum Sq Mean Sq F value  Pr(>F)   
Period       1  0.502  0.5020    21.3 0.00126 **
Residuals    9  0.212  0.0236                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Na základe výsledkov jednofaktorovej analýzy rozptylu (ANOVA) s hodnotami F = 21.3 a p = 0.00126 možno konštatovať, že priemerná hodnota indikátora Life Ladder sa medzi obdobiami 2010–2015 a 2016–2021 štatisticky významne líšila. Priemerná úroveň spokojnosti so životom bola v druhej perióde vyššia, čo poukazuje na zlepšenie subjektívnej kvality života v Českej republike po roku 2015. (Zamietame H₀ a akceptujeme H₁.)

Linear Regression: Predicting Life Ladder (Czechia)

# ZÁKLADNÝ OLS MODEL
model <- lm(
  `Life Ladder` ~ 
    `Log GDP per capita` +
    `Social support` +
    `Healthy life expectancy at birth` +
    `Freedom to make life choices` +
    `Perceptions of corruption` +
    `Confidence in national government`,
  data = czechia_data,
  na.action = na.omit
)
summary(model)

Call:
lm(formula = `Life Ladder` ~ `Log GDP per capita` + `Social support` + 
    `Healthy life expectancy at birth` + `Freedom to make life choices` + 
    `Perceptions of corruption` + `Confidence in national government`, 
    data = czechia_data, na.action = na.omit)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.16256 -0.05590 -0.03232  0.06707  0.16231 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)  
(Intercept)                         -2.46791    9.12851  -0.270   0.7959  
`Log GDP per capita`                 1.14921    1.35473   0.848   0.4288  
`Social support`                     0.75092    2.40004   0.313   0.7650  
`Healthy life expectancy at birth`   0.02884    0.17651   0.163   0.8756  
`Freedom to make life choices`      -0.38647    1.16196  -0.333   0.7507  
`Perceptions of corruption`         -5.62889    2.47385  -2.275   0.0632 .
`Confidence in national government` -0.70058    0.68668  -1.020   0.3470  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1332 on 6 degrees of freedom
Multiple R-squared:  0.8615,    Adjusted R-squared:  0.7229 
F-statistic: 6.219 on 6 and 6 DF,  p-value: 0.02136
# install.packages(c("broom", "kableExtra", "dplyr", "stringr"))
library(broom)
library(dplyr)
library(kableExtra)
library(stringr)

# Prehľad koeficientov s konfidenčnými intervalmi a hviezdičkami významnosti
coef.tbl <- tidy(model, conf.int = TRUE) %>%
  mutate(
    term = recode(term,
      "(Intercept)" = "Intercept",
      "`Log GDP per capita`" = "Log GDP per capita",
      "`Social support`" = "Social support",
      "`Healthy life expectancy at birth`" = "Healthy life expectancy at birth",
      "`Freedom to make life choices`" = "Freedom to make life choices",
      "`Perceptions of corruption`" = "Perceptions of corruption",
      "`Confidence in national government`" = "Confidence in national government"
    ),
    stars = case_when(
      p.value < 0.001 ~ "***",
      p.value < 0.01  ~ "**",
      p.value < 0.05  ~ "*",
      p.value < 0.1   ~ "·",
      TRUE            ~ ""
    )
  ) %>%
  transmute(
    Term = term,
    Estimate = estimate,
    `Std. Error` = std.error,
    `t value` = statistic,
    `p value` = p.value,
    `95% CI` = str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
    Sig = stars
  )

coef.tbl %>%
  kable(
    digits = 3,
    caption = "OLS Regression Coefficients (Life Ladder ~ predictors)"
  ) %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(1, bold = TRUE) %>%
  row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
  footnote(
    general = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.",
    threeparttable = TRUE
  )
OLS Regression Coefficients (Life Ladder ~ predictors)
Term Estimate Std. Error t value p value 95% CI Sig
Intercept -2.468 9.129 -0.270 0.796 [-24.805, 19.869]
Log GDP per capita 1.149 1.355 0.848 0.429 [-2.166, 4.464]
Social support 0.751 2.400 0.313 0.765 [-5.122, 6.624]
Healthy life expectancy at birth 0.029 0.177 0.163 0.876 [-0.403, 0.461]
Freedom to make life choices -0.386 1.162 -0.333 0.751 [-3.23, 2.457]
Perceptions of corruption -5.629 2.474 -2.275 0.063 [-11.682, 0.424] ·
Confidence in national government -0.701 0.687 -1.020 0.347 [-2.381, 0.98]
Note:
Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.
# ŠTATISTIKY KVALITY MODELU
fit.tbl <- glance(model) %>%
  transmute(
    `R-squared` = r.squared,
    `Adj. R-squared` = adj.r.squared,
    `F-statistic` = statistic,
    `F p-value` = p.value,
    `AIC` = AIC,
    `BIC` = BIC,
    `Num. obs.` = nobs
  )

fit.tbl %>%
  kable(digits = 3, caption = "Model Fit Statistics") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("condensed"))
Model Fit Statistics
R-squared Adj. R-squared F-statistic F p-value AIC BIC Num. obs.
0.861 0.723 6.219 0.021 -9.575 -5.056 13

Môj komentár

Výsledky viacnásobnej lineárnej regresie ukázali, že model dosahuje veľmi dobrú úroveň vysvetľovacej schopnosti (R² = 0.861; upravené R² = 0.723), pričom model ako celok je štatisticky významný (F = 6.219; p = 0.021). To znamená, že súhrnne socioekonomické faktory dokážu významne vysvetliť variabilitu spokojnosti so životom v Českej republike.

Pri pohľade na jednotlivé premenné sa ukázalo, že žiadna z nich nedosiahla štatistickú významnosť na hladine α = 0.05. Premenná „Perceptions of corruption“ vykazuje hranične nevýznamný vplyv (p = 0.063), čo naznačuje, že hoci vnímanie korupcie môže mať istý negatívny vzťah k spokojnosti so životom, tento vzťah nie je štatisticky potvrdený na bežne používanej hladine významnosti. Ostatné premenné, ako Log GDP per capita, Social support, Healthy life expectancy at birth, Freedom to make life choices a Confidence in national government, sa taktiež neprejavili ako štatisticky významné.

Na základe týchto výsledkov nebolo možné zamietnuť nulovú hypotézu (H₀), ktorá predpokladala, že jednotlivé socioekonomické premenné nemajú štatisticky významný vplyv na spokojnosť so životom. Napriek tomu však model ako celok poukazuje na silnú koreláciu medzi uvedenými faktormi a celkovou úrovňou subjektívnej kvality života v Českej republike.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIMWgdGFzdGllIHYgxIxSIgphdXRob3I6ICJJZ29yIFplbGVuYXkgPGJyPgoocyB2eXXFvml0w61tIHZlcmVqbmUgZG9zdHVwbsO9Y2gga8OzZG92IGEgQ2hhdEdQVCkiCmRhdGU6ICJTZXB0ZW1iZXIgMjAyNSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgpgYGB7cn0KaGVhZChXb3JsZF9IYXBwaW5lc3NfUmVwb3J0XzIwMDVfMjAyMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgCmNvbG5hbWVzKFdvcmxkX0hhcHBpbmVzc19SZXBvcnRfMjAwNV8yMDIxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIApgYGAKCiMgR3JhZnkKCgojIyMgZ2dwbG90MiAtIGtuacW+bmljYSBwcmUgZ3JhZnkKClbDvWJlciBhIG7DoXNsZWRuw6kgdHJpZWRlbmllCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQoKdWRhamVfY3plY2hpYSA8LSBXb3JsZF9IYXBwaW5lc3NfUmVwb3J0XzIwMDVfMjAyMSAlPiUKICBmaWx0ZXIoYENvdW50cnkgbmFtZWAgPT0gIkN6ZWNoaWEiKSAlPiUKICBzZWxlY3QoYENvdW50cnkgbmFtZWAsIFllYXIsIGBMaWZlIExhZGRlcmAsIGBMb2cgR0RQIHBlciBjYXBpdGFgLCBgU29jaWFsIHN1cHBvcnRgKQojIE3DoW1lIG5hc2NodsOhbCByb3ZuYWvDqSBhYnkgc21lIHZlZGVsaSBwb3Jvdm5hxaUKCmtuaXRyOjprYWJsZSh1ZGFqZV9jemVjaGlhLCBjYXB0aW9uID0gIkhvZG5vdHkgcHJlIMSMZXNrbyBwb2TEvmEgcm9rb3YiKQpgYGAKCiMjIyMgU2NhdHRlciBwbG90CgpgYGB7cn0KIyBCYXNpYyBzY2F0dGVyIHBsb3QKbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QodWRhamVfY3plY2hpYSwgYWVzKHggPSBgTG9nIEdEUCBwZXIgY2FwaXRhYCwgeSA9IGBMaWZlIExhZGRlcmApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJyZWQiLCBzaXplID0gMykgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJWesWlYWggbWVkemkgSERQIG5hIG9ieXZhdGXEvmEgYSBpbmRleG9tIMWhxaVhc3RpYSBwcmUgxIxlc2tvIiwKICAgIHggPSAiTG9nIChIRFApL29ieXZhdGXEvmEiLAogICAgeSA9ICJJbmRleCDFoMWlYXN0aWEiKQoKCmBgYAoKIyMjIyBCb3hwbG90CgpgYGB7cn0KIyBCYXIgcGxvdCB3aXRoIGdyb3VwaW5nCmxpYnJhcnkoZ2dwbG90MikKCnVkYWplX2N6ZWNoaWEgPC0gV29ybGRfSGFwcGluZXNzX1JlcG9ydF8yMDA1XzIwMjEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5IG5hbWVgID09ICJDemVjaGlhIikKCmdncGxvdCh1ZGFqZV9jemVjaGlhLCBhZXMoeCA9IGZhY3RvcihZZWFyKSwgeSA9IGBMaWZlIExhZGRlcmApKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiZGFya2JsdWUiKSArCiAgbGFicygKICAgIHRpdGxlID0gIiBJbmRleCByb2tvdiBwcmUgxIxlc2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSW5kZXggxaDFpWFzdGlhIgogICkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgoKCmBgYHtyfQojIFrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kuCiMjIGtuaXRyIC0gdGFidcS+a2EKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGtuaXRyKQoKIyBGaWx0cm92YW5pZSBkw6F0IHByZSDEjGVza28KY3plY2hpYV9kYXRhIDwtIFdvcmxkX0hhcHBpbmVzc19SZXBvcnRfMjAwNV8yMDIxICU+JQogIGZpbHRlcihgQ291bnRyeSBuYW1lYCA9PSAiQ3plY2hpYSIpCgojIFrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kKY3plY2hpYV9zdGF0IDwtIGN6ZWNoaWFfZGF0YSAlPiUKICBncm91cF9ieShZZWFyKSAlPiUKICBzdW1tYXJpc2UoCiAgICBuICAgICAgPSBuKCksCiAgICBtZWFuICAgPSBtZWFuKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBzZCAgICAgPSBzZChgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgbWluICAgID0gbWluKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBxMjUgICAgPSBxdWFudGlsZShgTGlmZSBMYWRkZXJgLCAwLjI1LCBuYS5ybSA9IFRSVUUpLAogICAgbWVkaWFuID0gbWVkaWFuKGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICBxNzUgICAgPSBxdWFudGlsZShgTGlmZSBMYWRkZXJgLCAwLjc1LCBuYS5ybSA9IFRSVUUpLAogICAgbWF4ICAgID0gbWF4KGBMaWZlIExhZGRlcmAsIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKIyBUYWJ1xL5rYQprYWJsZShjemVjaGlhX3N0YXQsIGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiWsOha2xhZG7DqSDFoXRhdGlzdGlreSBJbmRleHUgxaHFpWFzdGlhICgyMDA14oCTMjAyMSkiKQoKIyBHcmFmIHbDvXZvamEgaW5kZXh1IMWhxaVhc3RpYQpnZ3Bsb3QoY3plY2hpYV9kYXRhLCBhZXMoeCA9IFllYXIsIHkgPSBgTGlmZSBMYWRkZXJgKSkgKwogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImRhcmtibHVlIikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJWw712b2ogaW5kZXh1IMWhxaVhc3RpYSB2IMSMZXNrdSAoMjAwNeKAkzIwMjEpIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSW5kZXggxaHFpWFzdGlhIChMaWZlIExhZGRlcikiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgCmBgYAoKYWxlYm8ga3JhasWhaWUgdGFidcS+a3kgcyBwb21vY291IC5rYWJsZUV4dHJhLjoKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBGaWx0cm92YW5pZSBkw6F0IHByZSDEjGVza8O6IHJlcHVibGlrdSBhIHJva3kgMjAwNToyMDIxCmN6ZWNoaWFfc3RhdHMgPC0gV29ybGRfSGFwcGluZXNzX1JlcG9ydF8yMDA1XzIwMjEgJT4lCiAgZmlsdGVyKGBDb3VudHJ5IG5hbWVgID09ICJDemVjaGlhIiwgWWVhciAlaW4lIDIwMDU6MjAyMSkgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKAogICAgbiAgICAgID0gbigpLAogICAgbWVhbiAgID0gbWVhbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgICAgID0gc2QoYExpZmUgTGFkZGVyYCwgbmEucm0gPSBUUlVFKSwKICAgIG1pbiAgICA9IG1pbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgcTI1ICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC4yNSwgbmEucm0gPSBUUlVFKSwKICAgIG1lZGlhbiA9IG1lZGlhbihgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgcTc1ICAgID0gcXVhbnRpbGUoYExpZmUgTGFkZGVyYCwgMC43NSwgbmEucm0gPSBUUlVFKSwKICAgIG1heCAgICA9IG1heChgTGlmZSBMYWRkZXJgLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCiMgVnl0dm9yZW5pZSB0YWJ1xL5reSBwb21vY291IGthYmxlRXh0cmEKY3plY2hpYV9zdGF0cyAlPiUKICBrYWJsZShkaWdpdHMgPSAyLCBjYXB0aW9uID0gIlrDoWtsYWRuw6kgxaF0YXRpc3Rpa3kgaW5kZXh1IMWhxaVhc3RpYSB2IMSMZXNrdSAoMjAwNS0yMDIxKSIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpICU+JQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUUlVFKSAlPiUKICByb3dfc3BlYygwLCBib2xkID0gVFJVRSwgYmFja2dyb3VuZCA9ICIjZjJmMmYyIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsICLFoHRhdGlzdGlreSBMaWZlIExhZGRlciIgPSA3KSkKYGBgCgoKIyBUZXN0b3ZhbmllIGh5cG90w6l6CgojIyMjIHQtdGVzdAoKYGBge3J9CiMgSOKCgCAobnVsb3bDoSBoeXBvdMOpemEpOiBNZWR6aSBwcmllbWVybm91IGhvZG5vdG91IHVrYXpvdmF0ZcS+YSBMaWZlIExhZGRlciB2IHJva29jaCAyMDEw4oCTMjAxNSBhIDIwMTbigJMyMDIxIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSByb3pkaWVsLgojSOKCgSAoYWx0ZXJuYXTDrXZuYSBoeXBvdMOpemEpOiBNZWR6aSBwcmllbWVybm91IGhvZG5vdG91IHVrYXpvdmF0ZcS+YSBMaWZlIExhZGRlciB2IHJva29jaCAyMDEw4oCTMjAxNSBhIDIwMTbigJMyMDIxIGV4aXN0dWplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHJvemRpZWwuCgojIFBvcm92bmFuaWUgMjAxMCAtIDIwMTUgdnMgMjAxNiAtIDIwMjEKZ3JvdXAxIDwtIGN6ZWNoaWFfZGF0YSRgTGlmZSBMYWRkZXJgW2N6ZWNoaWFfZGF0YSRZZWFyICVpbiUgMjAxMDoyMDE1XQpncm91cDIgPC0gY3plY2hpYV9kYXRhJGBMaWZlIExhZGRlcmBbY3plY2hpYV9kYXRhJFllYXIgJWluJSAyMDE2OjIwMjFdCgp0X3Rlc3RfcmVzdWx0IDwtIHQudGVzdChncm91cDEsIGdyb3VwMikKcHJpbnQodF90ZXN0X3Jlc3VsdCkKCmBgYAojIyMgIFBvcm92bmFuaWUgMjAxMCAtIDIwMTUgdnMgMjAxNiAtIDIwMjEKYGBge3J9CiMgTmEgesOha2xhZGUgV2VsY2hvdmhvIGR2b2p2w71iZXJvdsOpaG8gdC10ZXN0dSAodCA9IC00Ljc5OyBwID0gMC4wMDEpIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgcHJpZW1lcm7DoSBob2Rub3RhIGluZGlrw6F0b3JhIExpZmUgTGFkZGVyIHNhIG1lZHppIG9iZG9iaWFtaSAyMDEw4oCTMjAxNSBhIDIwMTbigJMyMDIxIMWhdGF0aXN0aWNreSB2w716bmFtbmUgbMOtxaFpbGEuIFByaWVtZXJuw6Egw7pyb3ZlxYggc3Bva29qbm9zdGkgc28gxb5pdm90b20gYm9sYSB2IGRydWhlaiBwZXJpw7NkZSB2ecWhxaFpYSAoNi44OCkgYWtvIHYgcHJ2ZWogKDYuNDUpLCDEjW8gbmF6bmHEjXVqZSB6bGVwxaFlbmllIHN1Ympla3TDrXZuZWoga3ZhbGl0eSDFvml2b3RhIHYgxIxlc2tlaiByZXB1Ymxpa2UuIChaYW1pZXRhbWUgSOKCgCBhIGFrY2VwdHVqZW1lIEjigoEuKQpgYGAKCiMjIyMgQU5PVkE6IENvbXBhcmluZyBSZWFkaW5nIFNjb3JlcyBBY3Jvc3MgUHJvZ3JhbXMKCmBgYHtyfQojIHZ5dHZvcsOtbWUgc3BvbG/EjW7DvSBkYXRhc2V0IHByZSBBTk9WVQphbm92YV9kYXRhIDwtIGRhdGEuZnJhbWUoCiAgTGlmZUxhZGRlciA9IGMoZ3JvdXAxLCBncm91cDIpLAogIFBlcmlvZCA9IGZhY3RvcihjKAogICAgcmVwKCIyMDEwLTIwMTUiLCBsZW5ndGgoZ3JvdXAxKSksCiAgICByZXAoIjIwMTYtMjAyMSIsIGxlbmd0aChncm91cDIpKQogICkpCikKCiMgdnlrb25hbmllIEFOT1ZBCmFub3ZhX3Jlc3VsdCA8LSBhb3YoTGlmZUxhZGRlciB+IFBlcmlvZCwgZGF0YSA9IGFub3ZhX2RhdGEpCnN1bW1hcnkoYW5vdmFfcmVzdWx0KQoKYGBgCgpgYGB7cn0KIyBOYSB6w6FrbGFkZSB2w71zbGVka292IGplZG5vZmFrdG9yb3ZlaiBhbmFsw716eSByb3pwdHlsdSAoQU5PVkEpIHMgaG9kbm90YW1pIEYgPSAyMS4zIGEgcCA9IDAuMDAxMjYgbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBwcmllbWVybsOhIGhvZG5vdGEgaW5kaWvDoXRvcmEgTGlmZSBMYWRkZXIgc2EgbWVkemkgb2Jkb2JpYW1pIDIwMTDigJMyMDE1IGEgMjAxNuKAkzIwMjEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSBsw63FoWlsYS4gUHJpZW1lcm7DoSDDunJvdmXFiCBzcG9rb2pub3N0aSBzbyDFvml2b3RvbSBib2xhIHYgZHJ1aGVqIHBlcmnDs2RlIHZ5xaHFoWlhLCDEjW8gcG91a2F6dWplIG5hIHpsZXDFoWVuaWUgc3ViamVrdMOtdm5laiBrdmFsaXR5IMW+aXZvdGEgdiDEjGVza2VqIHJlcHVibGlrZSBwbyByb2t1IDIwMTUuIChaYW1pZXRhbWUgSOKCgCBhIGFrY2VwdHVqZW1lIEjigoEuKQpgYGAKCiMjIyMgTGluZWFyIFJlZ3Jlc3Npb246IFByZWRpY3RpbmcgTGlmZSBMYWRkZXIgKEN6ZWNoaWEpCgpgYGB7cn0KIyBaw4FLTEFETsOdIE9MUyBNT0RFTAptb2RlbCA8LSBsbSgKICBgTGlmZSBMYWRkZXJgIH4gCiAgICBgTG9nIEdEUCBwZXIgY2FwaXRhYCArCiAgICBgU29jaWFsIHN1cHBvcnRgICsKICAgIGBIZWFsdGh5IGxpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aGAgKwogICAgYEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXNgICsKICAgIGBQZXJjZXB0aW9ucyBvZiBjb3JydXB0aW9uYCArCiAgICBgQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50YCwKICBkYXRhID0gY3plY2hpYV9kYXRhLAogIG5hLmFjdGlvbiA9IG5hLm9taXQKKQpzdW1tYXJ5KG1vZGVsKQpgYGAKCgoKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcyhjKCJicm9vbSIsICJrYWJsZUV4dHJhIiwgImRwbHlyIiwgInN0cmluZ3IiKSkKbGlicmFyeShicm9vbSkKbGlicmFyeShkcGx5cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHN0cmluZ3IpCgojIFByZWjEvmFkIGtvZWZpY2llbnRvdiBzIGtvbmZpZGVuxI1uw71taSBpbnRlcnZhbG1pIGEgaHZpZXpkacSNa2FtaSB2w716bmFtbm9zdGkKY29lZi50YmwgPC0gdGlkeShtb2RlbCwgY29uZi5pbnQgPSBUUlVFKSAlPiUKICBtdXRhdGUoCiAgICB0ZXJtID0gcmVjb2RlKHRlcm0sCiAgICAgICIoSW50ZXJjZXB0KSIgPSAiSW50ZXJjZXB0IiwKICAgICAgImBMb2cgR0RQIHBlciBjYXBpdGFgIiA9ICJMb2cgR0RQIHBlciBjYXBpdGEiLAogICAgICAiYFNvY2lhbCBzdXBwb3J0YCIgPSAiU29jaWFsIHN1cHBvcnQiLAogICAgICAiYEhlYWx0aHkgbGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoYCIgPSAiSGVhbHRoeSBsaWZlIGV4cGVjdGFuY3kgYXQgYmlydGgiLAogICAgICAiYEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXNgIiA9ICJGcmVlZG9tIHRvIG1ha2UgbGlmZSBjaG9pY2VzIiwKICAgICAgImBQZXJjZXB0aW9ucyBvZiBjb3JydXB0aW9uYCIgPSAiUGVyY2VwdGlvbnMgb2YgY29ycnVwdGlvbiIsCiAgICAgICJgQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50YCIgPSAiQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50IgogICAgKSwKICAgIHN0YXJzID0gY2FzZV93aGVuKAogICAgICBwLnZhbHVlIDwgMC4wMDEgfiAiKioqIiwKICAgICAgcC52YWx1ZSA8IDAuMDEgIH4gIioqIiwKICAgICAgcC52YWx1ZSA8IDAuMDUgIH4gIioiLAogICAgICBwLnZhbHVlIDwgMC4xICAgfiAiwrciLAogICAgICBUUlVFICAgICAgICAgICAgfiAiIgogICAgKQogICkgJT4lCiAgdHJhbnNtdXRlKAogICAgVGVybSA9IHRlcm0sCiAgICBFc3RpbWF0ZSA9IGVzdGltYXRlLAogICAgYFN0ZC4gRXJyb3JgID0gc3RkLmVycm9yLAogICAgYHQgdmFsdWVgID0gc3RhdGlzdGljLAogICAgYHAgdmFsdWVgID0gcC52YWx1ZSwKICAgIGA5NSUgQ0lgID0gc3RyX2MoIlsiLCByb3VuZChjb25mLmxvdywgMyksICIsICIsIHJvdW5kKGNvbmYuaGlnaCwgMyksICJdIiksCiAgICBTaWcgPSBzdGFycwogICkKCmNvZWYudGJsICU+JQogIGthYmxlKAogICAgZGlnaXRzID0gMywKICAgIGNhcHRpb24gPSAiT0xTIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzIChMaWZlIExhZGRlciB+IHByZWRpY3RvcnMpIgogICkgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkgJT4lCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUpICU+JQogIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFLCBiYWNrZ3JvdW5kID0gIiNmMmYyZjIiKSAlPiUKICBmb290bm90ZSgKICAgIGdlbmVyYWwgPSAiU2lnbmlmLiBjb2RlczogKioqIHA8MC4wMDEsICoqIHA8MC4wMSwgKiBwPDAuMDUsIMK3IHA8MC4xLiIsCiAgICB0aHJlZXBhcnR0YWJsZSA9IFRSVUUKICApCmBgYAoKYGBge3J9CiMgxaBUQVRJU1RJS1kgS1ZBTElUWSBNT0RFTFUKZml0LnRibCA8LSBnbGFuY2UobW9kZWwpICU+JQogIHRyYW5zbXV0ZSgKICAgIGBSLXNxdWFyZWRgID0gci5zcXVhcmVkLAogICAgYEFkai4gUi1zcXVhcmVkYCA9IGFkai5yLnNxdWFyZWQsCiAgICBgRi1zdGF0aXN0aWNgID0gc3RhdGlzdGljLAogICAgYEYgcC12YWx1ZWAgPSBwLnZhbHVlLAogICAgYEFJQ2AgPSBBSUMsCiAgICBgQklDYCA9IEJJQywKICAgIGBOdW0uIG9icy5gID0gbm9icwogICkKCmZpdC50YmwgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJNb2RlbCBGaXQgU3RhdGlzdGljcyIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoImNvbmRlbnNlZCIpKQpgYGAKCiMjIyBNw7RqIGtvbWVudMOhcgoKVsO9c2xlZGt5IHZpYWNuw6Fzb2JuZWogbGluZcOhcm5laiByZWdyZXNpZSB1a8OhemFsaSwgxb5lIG1vZGVsIGRvc2FodWplIHZlxL5taSBkb2Jyw7ogw7pyb3ZlxYggdnlzdmV0xL5vdmFjZWogc2Nob3Bub3N0aSAoUsKyID0gMC44NjE7IHVwcmF2ZW7DqSBSwrIgPSAwLjcyMyksIHByacSNb20gbW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChGID0gNi4yMTk7IHAgPSAwLjAyMSkuIFRvIHpuYW1lbsOhLCDFvmUgc8O6aHJubmUgc29jaW9la29ub21pY2vDqSBmYWt0b3J5IGRva8Ohxb51IHbDvXpuYW1uZSB2eXN2ZXRsacWlIHZhcmlhYmlsaXR1IHNwb2tvam5vc3RpIHNvIMW+aXZvdG9tIHYgxIxlc2tlaiByZXB1Ymxpa2UuCgpQcmkgcG9oxL5hZGUgbmEgamVkbm90bGl2w6kgcHJlbWVubsOpIHNhIHVrw6F6YWxvLCDFvmUgxb5pYWRuYSB6IG5pY2ggbmVkb3NpYWhsYSDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpSBuYSBobGFkaW5lIM6xID0gMC4wNS4gUHJlbWVubsOhIOKAnlBlcmNlcHRpb25zIG9mIGNvcnJ1cHRpb27igJwgdnlrYXp1amUgaHJhbmnEjW5lIG5ldsO9em5hbW7DvSB2cGx5diAocCA9IDAuMDYzKSwgxI1vIG5hem5hxI11amUsIMW+ZSBob2NpIHZuw61tYW5pZSBrb3J1cGNpZSBtw7TFvmUgbWHFpSBpc3TDvSBuZWdhdMOtdm55IHZ6xaVhaCBrIHNwb2tvam5vc3RpIHNvIMW+aXZvdG9tLCB0ZW50byB2esWlYWggbmllIGplIMWhdGF0aXN0aWNreSBwb3R2cmRlbsO9IG5hIGJlxb5uZSBwb3XFvsOtdmFuZWogaGxhZGluZSB2w716bmFtbm9zdGkuIE9zdGF0bsOpIHByZW1lbm7DqSwgYWtvIExvZyBHRFAgcGVyIGNhcGl0YSwgU29jaWFsIHN1cHBvcnQsIEhlYWx0aHkgbGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoLCBGcmVlZG9tIHRvIG1ha2UgbGlmZSBjaG9pY2VzIGEgQ29uZmlkZW5jZSBpbiBuYXRpb25hbCBnb3Zlcm5tZW50LCBzYSB0YWt0aWXFviBuZXByZWphdmlsaSBha28gxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kuCgpOYSB6w6FrbGFkZSB0w71jaHRvIHbDvXNsZWRrb3YgbmVib2xvIG1vxb5uw6kgemFtaWV0bnXFpSBudWxvdsO6IGh5cG90w6l6dSAoSOKCgCksIGt0b3LDoSBwcmVkcG9rbGFkYWxhLCDFvmUgamVkbm90bGl2w6kgc29jaW9la29ub21pY2vDqSBwcmVtZW5uw6kgbmVtYWrDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5diBuYSBzcG9rb2pub3PFpSBzbyDFvml2b3RvbS4gTmFwcmllayB0b211IHbFoWFrIG1vZGVsIGFrbyBjZWxvayBwb3VrYXp1amUgbmEgc2lsbsO6IGtvcmVsw6FjaXUgbWVkemkgdXZlZGVuw71taSBmYWt0b3JtaSBhIGNlbGtvdm91IMO6cm92xYhvdSBzdWJqZWt0w612bmVqIGt2YWxpdHkgxb5pdm90YSB2IMSMZXNrZWogcmVwdWJsaWtlLgoKCgoKCgo=