Načítanie dát:
library(dplyr)
udaje <- read.csv("World Happiness Report 2005-2021.csv",
sep = ",", header = TRUE)
# vyberieme Krajinu, Rok a 4 premenné
cluster_data <- udaje %>%
select(
Country.name,
Year,
Life.Ladder,
Log.GDP.per.capita,
Social.support,
Freedom.to.make.life.choices
) %>%
na.omit()
# vytvoríme ID "Krajina_Rok" – bude slúžiť ako názov riadku
labels_id <- paste(cluster_data$Country.name, cluster_data$Year, sep = "_")
# dátový rámec len s numerickými premennými
X <- cluster_data %>%
select(Life.Ladder,
Log.GDP.per.capita,
Social.support,
Freedom.to.make.life.choices)
rownames(X) <- labels_id
# škálovanie
udaje_scaled <- scale(X)
Boxploty všetkých škálovaných premenných:
num_vars <- as.data.frame(udaje_scaled)
num_plots <- ncol(num_vars)
par(mfrow = c(2, 2))
par(mar = c(4,4,2,1))
for (col in names(num_vars)) {
boxplot(num_vars[[col]],
main = col,
col = "lightblue",
horizontal = TRUE)
}
mtext("Boxploty numerických premenných (všetky roky WHR)",
outer = TRUE, cex = 1.2, font = 2)

Korelačná matica:
cor_mat <- round(cor(udaje_scaled), 2)
cor_mat
Life.Ladder Log.GDP.per.capita Social.support
Life.Ladder 1.00 0.78 0.71
Log.GDP.per.capita 0.78 1.00 0.69
Social.support 0.71 0.69 1.00
Freedom.to.make.life.choices 0.53 0.36 0.41
Freedom.to.make.life.choices
Life.Ladder 0.53
Log.GDP.per.capita 0.36
Social.support 0.41
Freedom.to.make.life.choices 1.00
Korelačná matica ukazuje, že medzi všetkými premennými existujú
pozitívne a štatisticky významné vzťahy, čo je v súlade s teóriou World
Happiness Report. Najsilnejšia korelácia je medzi Life Ladder a Log GDP
per capita (r = 0.78), čo naznačuje, že vyšší ekonomický rozvoj je
spojený s vyššou spokojnosťou so životom. Rovnako silná je aj väzba
medzi Life Ladder a Social support (r = 0.71), čo potvrdzuje, že
sociálne väzby predstavujú kľúčový faktor šťastia. Premenná Freedom to
make life choices vykazuje strednú koreláciu so všetkými ukazovateľmi
(0.36–0.53), čo znamená, že prispieva k celkovej spokojnosti, no menej
než ekonomické a sociálne faktory. Keďže žiadna korelácia nepresahuje
hodnotu 0.90, nevzniká problém multikolinearity a žiadnu z premenných
nie je potrebné vylúčiť.
Matica vzdialenosti nedávala zmysel.
Preto pokračujeme s hierarchickým zhlukovaním a dendrogramom
hc <- hclust(dist_mat, method = "ward.D2")
plot(hc,
labels = FALSE, # žiadne mená
hang = -1,
main = "Hierarchical clustering (Ward.D2) – všetky roky",
xlab = "",
sub = "")
k <- 3
h_cut <- hc$height[length(hc$height) - (k - 1)]
abline(h = h_cut, col = "red", lwd = 2, lty = 2)

Na grafe je zobrazený dendrogram vytvorený pomocou aglomeratívnej
hierarchickej metódy zhlukovania (Ward.D2). Na vertikálnej osi je
znázornená tzv. výška (Height), ktorá reprezentuje mieru nehomogenity
vznikajúcu pri spájaní jednotlivých objektov do väčších celkov. Čím je
výška spojenia vyššia, tým sú zlučované zhluky od seba odlišnejšie.
Dendrogram ukazuje typickú hierarchickú štruktúru – na spodnej úrovni
sa nachádzajú jednotlivé pozorovania (krajina v konkrétnom roku), ktoré
sa postupne zlučujú na základe ich podobnosti vo štyroch sledovaných
premenných: Life Ladder, Log GDP per capita, Social support a Freedom to
make life choices.
Červená prerušovaná čiara predstavuje rez dendrogramu, ktorý určuje
počet výsledných klastrov. V našom prípade bola zvolená hodnota rezu
približne na úrovni Height ≈ 40, čo prirodzene rozdeľuje celý súbor
pozorovaní do troch výrazných klastrov. Tento počet je v súlade aj s
rozptylom medzi-klastrovej variability (BSS) a s interpretáciou
centroidov.
Pri danom reze je dobre viditeľné, že:
prvý, najrozsiahlejší klaster pozostáva z pozorovaní s nižšou úrovňou
šťastia a ekonomického rozvoja,
druhý klaster tvorí stredne rozvinuté krajiny,
tretí klaster združuje najvyspelejšie a najšťastnejšie krajiny
sveta.
Dendrogram tak poskytuje vizuálne potvrdenie výsledkov numerickej
analýzy – zhlukovanie prebieha stabilne, klastre sú pomerne dobre
oddelené a hierarchická štruktúra odráža prirodzené rozdiely medzi
krajinami v úrovni ekonomického a sociálneho rozvoja.
Zoznam krajín v klastri:
klastre <- data.frame(
ID = labels_id,
Country = cluster_data$Country.name,
Year = cluster_data$Year,
Cluster = factor(klaster_membership)
)
klastre
NA
TSS–WSS–BSS variability
ssq <- function(x, m) sum((x - m)^2)
var_names <- colnames(udaje_scaled)
# Total sum of squares
TSS <- sapply(var_names, function(v)
ssq(udaje_scaled[, v], mean(udaje_scaled[, v]))
)
# Within-cluster sum of squares
WSS <- sapply(var_names, function(v) {
x <- udaje_scaled[, v]
tapply(x, klaster_membership,
function(z) ssq(z, mean(z))) |> sum()
})
# Between-cluster sum of squares
BSS <- TSS - WSS
ss_table <- data.frame(
Variable = var_names,
TSS = TSS,
WSS = WSS,
BSS = BSS,
Prop_Between = BSS / TSS
)
ss_table
NA
Na základe tabuľky TSS, WSS a BSS možno konštatovať, že najvyšší
podiel medzi-klastrovej variability dosahuje premenná Life.Ladder, ktorá
je zároveň najlepším separátorom zhlukov. Nasleduje premenná
Log.GDP.per.capita, čo naznačuje, že ekonomická úroveň krajín významne
ovplyvňuje ich zaradenie do klastrov. Strednú separačnú silu vykazuje
premenná Social.support, zatiaľ čo premenná Freedom.to.make.life.choices
disponuje najnižším podielom medzi-klastrovej variability. Táto premenná
teda neprispieva k tvorbe zhlukov tak výrazne a jej prípadné odstránenie
by štruktúru klasifikácie pravdepodobne podstatne nezmenilo.
Centroidy:
centroidy <- data.frame(
X,
Cluster = factor(klaster_membership)
) %>%
group_by(Cluster) %>%
summarise(
across(
.cols = where(is.numeric),
.fns = list(mean = ~ mean(.x)),
.names = "{.col}_{.fn}"
)
)
centroidy
NA
Zhluková analýza na základe centroidov identifikovala tri výrazne
odlišné skupiny krajín. Prvý klaster združuje krajiny s nízkym HDP,
slabou sociálnou oporou a najnižšou mierou životnej spokojnosti. Druhý
klaster tvoria stredne rozvinuté krajiny, ktoré dosahujú priemerné
hodnoty vo všetkých ukazovateľoch. Tretí klaster zahŕňa najvyspelejšie
ekonomiky s najvyššími hodnotami Life Ladder, silnou sociálnou oporou a
vysokou mierou slobody rozhodovania. Tieto výsledky potvrdzujú, že
ekonomický rozvoj a sociálne inštitúcie významne súvisia so subjektívnym
hodnotením spokojnosti so životom.
LS0tCnRpdGxlOiAiWmhsdWtvdsOhIGFuYWzDvXphIgphdXRob3I6ICJJZ29yIFplbGVuYXkgKHphIHBvbW9jaSBDaGF0R1BUKSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCk5hxI3DrXRhbmllIGTDoXQ6CmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKdWRhamUgPC0gcmVhZC5jc3YoIldvcmxkIEhhcHBpbmVzcyBSZXBvcnQgMjAwNS0yMDIxLmNzdiIsCiAgICAgICAgICAgICAgICAgIHNlcCA9ICIsIiwgaGVhZGVyID0gVFJVRSkKCiMgdnliZXJpZW1lIEtyYWppbnUsIFJvayBhIDQgcHJlbWVubsOpCmNsdXN0ZXJfZGF0YSA8LSB1ZGFqZSAlPiUKICBzZWxlY3QoCiAgICBDb3VudHJ5Lm5hbWUsCiAgICBZZWFyLAogICAgTGlmZS5MYWRkZXIsCiAgICBMb2cuR0RQLnBlci5jYXBpdGEsCiAgICBTb2NpYWwuc3VwcG9ydCwKICAgIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMKICApICU+JQogIG5hLm9taXQoKQoKIyB2eXR2b3LDrW1lIElEICJLcmFqaW5hX1JvayIg4oCTIGJ1ZGUgc2zDusW+acWlIGFrbyBuw6F6b3YgcmlhZGt1CmxhYmVsc19pZCA8LSBwYXN0ZShjbHVzdGVyX2RhdGEkQ291bnRyeS5uYW1lLCBjbHVzdGVyX2RhdGEkWWVhciwgc2VwID0gIl8iKQoKIyBkw6F0b3bDvSByw6FtZWMgbGVuIHMgbnVtZXJpY2vDvW1pIHByZW1lbm7DvW1pClggPC0gY2x1c3Rlcl9kYXRhICU+JQogIHNlbGVjdChMaWZlLkxhZGRlciwKICAgICAgICAgTG9nLkdEUC5wZXIuY2FwaXRhLAogICAgICAgICBTb2NpYWwuc3VwcG9ydCwKICAgICAgICAgRnJlZWRvbS50by5tYWtlLmxpZmUuY2hvaWNlcykKCnJvd25hbWVzKFgpIDwtIGxhYmVsc19pZAoKIyDFoWvDoWxvdmFuaWUKdWRhamVfc2NhbGVkIDwtIHNjYWxlKFgpCmBgYApCb3hwbG90eSB2xaFldGvDvWNoIMWha8OhbG92YW7DvWNoIHByZW1lbm7DvWNoOgpgYGB7cn0KbnVtX3ZhcnMgIDwtIGFzLmRhdGEuZnJhbWUodWRhamVfc2NhbGVkKQpudW1fcGxvdHMgPC0gbmNvbChudW1fdmFycykKCnBhcihtZnJvdyA9IGMoMiwgMikpCnBhcihtYXIgPSBjKDQsNCwyLDEpKQoKZm9yIChjb2wgaW4gbmFtZXMobnVtX3ZhcnMpKSB7CiAgYm94cGxvdChudW1fdmFyc1tbY29sXV0sCiAgICAgICAgICBtYWluID0gY29sLAogICAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgICAgICBob3Jpem9udGFsID0gVFJVRSkKfQoKbXRleHQoIkJveHBsb3R5IG51bWVyaWNrw71jaCBwcmVtZW5uw71jaCAodsWhZXRreSByb2t5IFdIUikiLAogICAgICBvdXRlciA9IFRSVUUsIGNleCA9IDEuMiwgZm9udCA9IDIpCgpgYGAKS29yZWxhxI1uw6EgbWF0aWNhOgpgYGB7cn0KY29yX21hdCA8LSByb3VuZChjb3IodWRhamVfc2NhbGVkKSwgMikKY29yX21hdApgYGAKS29yZWxhxI1uw6EgbWF0aWNhIHVrYXp1amUsIMW+ZSBtZWR6aSB2xaFldGvDvW1pIHByZW1lbm7DvW1pIGV4aXN0dWrDuiBwb3ppdMOtdm5lIGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6kgdnrFpWFoeSwgxI1vIGplIHYgc8O6bGFkZSBzIHRlw7NyaW91IFdvcmxkIEhhcHBpbmVzcyBSZXBvcnQuIE5hanNpbG5lasWhaWEga29yZWzDoWNpYSBqZSBtZWR6aSBMaWZlIExhZGRlciBhIExvZyBHRFAgcGVyIGNhcGl0YSAociA9IDAuNzgpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHZ5xaHFocOtIGVrb25vbWlja8O9IHJvenZvaiBqZSBzcG9qZW7DvSBzIHZ5xaHFoW91IHNwb2tvam5vc8Wlb3Ugc28gxb5pdm90b20uIFJvdm5ha28gc2lsbsOhIGplIGFqIHbDpHpiYSBtZWR6aSBMaWZlIExhZGRlciBhIFNvY2lhbCBzdXBwb3J0IChyID0gMC43MSksIMSNbyBwb3R2cmR6dWplLCDFvmUgc29jacOhbG5lIHbDpHpieSBwcmVkc3RhdnVqw7oga8S+w7rEjW92w70gZmFrdG9yIMWhxaVhc3RpYS4gUHJlbWVubsOhIEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXMgdnlrYXp1amUgc3RyZWRuw7oga29yZWzDoWNpdSBzbyB2xaFldGvDvW1pIHVrYXpvdmF0ZcS+bWkgKDAuMzbigJMwLjUzKSwgxI1vIHpuYW1lbsOhLCDFvmUgcHJpc3BpZXZhIGsgY2Vsa292ZWogc3Bva29qbm9zdGksIG5vIG1lbmVqIG5lxb4gZWtvbm9taWNrw6kgYSBzb2Npw6FsbmUgZmFrdG9yeS4gS2XEj8W+ZSDFvmlhZG5hIGtvcmVsw6FjaWEgbmVwcmVzYWh1amUgaG9kbm90dSAwLjkwLCBuZXZ6bmlrw6EgcHJvYmzDqW0gbXVsdGlrb2xpbmVhcml0eSBhIMW+aWFkbnUgeiBwcmVtZW5uw71jaCBuaWUgamUgcG90cmVibsOpIHZ5bMO6xI1pxaUuCgpNYXRpY2EgdnpkaWFsZW5vc3RpIG5lZMOhdmFsYSB6bXlzZWwuCgpQcmV0byBwb2tyYcSNdWplbWUgcyBoaWVyYXJjaGlja8O9bSB6aGx1a292YW7DrW0gYSBkZW5kcm9ncmFtb20KYGBge3J9CmhjIDwtIGhjbHVzdChkaXN0X21hdCwgbWV0aG9kID0gIndhcmQuRDIiKQoKcGxvdChoYywKICAgICBsYWJlbHMgPSBGQUxTRSwgICAjIMW+aWFkbmUgbWVuw6EKICAgICBoYW5nICAgPSAtMSwKICAgICBtYWluICAgPSAiSGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgKFdhcmQuRDIpIOKAkyB2xaFldGt5IHJva3kiLAogICAgIHhsYWIgICA9ICIiLAogICAgIHN1YiAgICA9ICIiKQoKayA8LSAzCmhfY3V0IDwtIGhjJGhlaWdodFtsZW5ndGgoaGMkaGVpZ2h0KSAtIChrIC0gMSldCmFibGluZShoID0gaF9jdXQsIGNvbCA9ICJyZWQiLCBsd2QgPSAyLCBsdHkgPSAyKQpgYGAKCk5hIGdyYWZlIGplIHpvYnJhemVuw70gZGVuZHJvZ3JhbSB2eXR2b3JlbsO9IHBvbW9jb3UgYWdsb21lcmF0w612bmVqIGhpZXJhcmNoaWNrZWogbWV0w7NkeSB6aGx1a292YW5pYSAoV2FyZC5EMikuIE5hIHZlcnRpa8OhbG5laiBvc2kgamUgem7DoXpvcm5lbsOhIHR6di4gdsO9xaFrYSAoSGVpZ2h0KSwga3RvcsOhIHJlcHJlemVudHVqZSBtaWVydSBuZWhvbW9nZW5pdHkgdnpuaWthasO6Y3UgcHJpIHNww6FqYW7DrSBqZWRub3RsaXbDvWNoIG9iamVrdG92IGRvIHbDpMSNxaHDrWNoIGNlbGtvdi4gxIzDrW0gamUgdsO9xaFrYSBzcG9qZW5pYSB2ecWhxaFpYSwgdMO9bSBzw7ogemx1xI1vdmFuw6kgemhsdWt5IG9kIHNlYmEgb2RsacWhbmVqxaFpZS4KCkRlbmRyb2dyYW0gdWthenVqZSB0eXBpY2vDuiBoaWVyYXJjaGlja8O6IMWhdHJ1a3TDunJ1IOKAkyBuYSBzcG9kbmVqIMO6cm92bmkgc2EgbmFjaMOhZHphasO6IGplZG5vdGxpdsOpIHBvem9yb3ZhbmlhIChrcmFqaW5hIHYga29ua3LDqXRub20gcm9rdSksIGt0b3LDqSBzYSBwb3N0dXBuZSB6bHXEjXVqw7ogbmEgesOha2xhZGUgaWNoIHBvZG9ibm9zdGkgdm8gxaF0eXJvY2ggc2xlZG92YW7DvWNoIHByZW1lbm7DvWNoOiBMaWZlIExhZGRlciwgTG9nIEdEUCBwZXIgY2FwaXRhLCBTb2NpYWwgc3VwcG9ydCBhIEZyZWVkb20gdG8gbWFrZSBsaWZlIGNob2ljZXMuCgrEjGVydmVuw6EgcHJlcnXFoW92YW7DoSDEjWlhcmEgcHJlZHN0YXZ1amUgcmV6IGRlbmRyb2dyYW11LCBrdG9yw70gdXLEjXVqZSBwb8SNZXQgdsO9c2xlZG7DvWNoIGtsYXN0cm92LiBWIG5hxaFvbSBwcsOtcGFkZSBib2xhIHp2b2xlbsOhIGhvZG5vdGEgcmV6dSBwcmlibGnFvm5lIG5hIMO6cm92bmkgSGVpZ2h0IOKJiCA0MCwgxI1vIHByaXJvZHplbmUgcm96ZGXEvnVqZSBjZWzDvSBzw7pib3IgcG96b3JvdmFuw60gZG8gdHJvY2ggdsO9cmF6bsO9Y2gga2xhc3Ryb3YuIFRlbnRvIHBvxI1ldCBqZSB2IHPDumxhZGUgYWogcyByb3pwdHlsb20gbWVkemkta2xhc3Ryb3ZlaiB2YXJpYWJpbGl0eSAoQlNTKSBhIHMgaW50ZXJwcmV0w6FjaW91IGNlbnRyb2lkb3YuCgpQcmkgZGFub20gcmV6ZSBqZSBkb2JyZSB2aWRpdGXEvm7DqSwgxb5lOgoKcHJ2w70sIG5hanJvenNpYWhsZWrFocOtIGtsYXN0ZXIgcG96b3N0w6F2YSB6IHBvem9yb3ZhbsOtIHMgbmnFvsWhb3Ugw7pyb3bFiG91IMWhxaVhc3RpYSBhIGVrb25vbWlja8OpaG8gcm96dm9qYSwKCmRydWjDvSBrbGFzdGVyIHR2b3LDrSBzdHJlZG5lIHJvenZpbnV0w6kga3JhamlueSwKCnRyZXTDrSBrbGFzdGVyIHpkcnXFvnVqZSBuYWp2eXNwZWxlasWhaWUgYSBuYWrFocWlYXN0bmVqxaFpZSBrcmFqaW55IHN2ZXRhLgoKRGVuZHJvZ3JhbSB0YWsgcG9za3l0dWplIHZpenXDoWxuZSBwb3R2cmRlbmllIHbDvXNsZWRrb3YgbnVtZXJpY2tlaiBhbmFsw716eSDigJMgemhsdWtvdmFuaWUgcHJlYmllaGEgc3RhYmlsbmUsIGtsYXN0cmUgc8O6IHBvbWVybmUgZG9icmUgb2RkZWxlbsOpIGEgaGllcmFyY2hpY2vDoSDFoXRydWt0w7pyYSBvZHLDocW+YSBwcmlyb2R6ZW7DqSByb3pkaWVseSBtZWR6aSBrcmFqaW5hbWkgdiDDunJvdm5pIGVrb25vbWlja8OpaG8gYSBzb2Npw6FsbmVobyByb3p2b2phLgoKClpvem5hbSBrcmFqw61uIHYga2xhc3RyaToKYGBge3J9CmtsYXN0cmUgPC0gZGF0YS5mcmFtZSgKICBJRCAgICAgID0gbGFiZWxzX2lkLAogIENvdW50cnkgPSBjbHVzdGVyX2RhdGEkQ291bnRyeS5uYW1lLAogIFllYXIgICAgPSBjbHVzdGVyX2RhdGEkWWVhciwKICBDbHVzdGVyID0gZmFjdG9yKGtsYXN0ZXJfbWVtYmVyc2hpcCkKKQoKa2xhc3RyZQpgYGAKVFNT4oCTV1NT4oCTQlNTIHZhcmlhYmlsaXR5CmBgYHtyfQpzc3EgPC0gZnVuY3Rpb24oeCwgbSkgc3VtKCh4IC0gbSleMikKdmFyX25hbWVzIDwtIGNvbG5hbWVzKHVkYWplX3NjYWxlZCkKCiMgVG90YWwgc3VtIG9mIHNxdWFyZXMKVFNTIDwtIHNhcHBseSh2YXJfbmFtZXMsIGZ1bmN0aW9uKHYpCiAgc3NxKHVkYWplX3NjYWxlZFssIHZdLCBtZWFuKHVkYWplX3NjYWxlZFssIHZdKSkKKQoKIyBXaXRoaW4tY2x1c3RlciBzdW0gb2Ygc3F1YXJlcwpXU1MgPC0gc2FwcGx5KHZhcl9uYW1lcywgZnVuY3Rpb24odikgewogIHggPC0gdWRhamVfc2NhbGVkWywgdl0KICB0YXBwbHkoeCwga2xhc3Rlcl9tZW1iZXJzaGlwLAogICAgICAgICBmdW5jdGlvbih6KSBzc3EoeiwgbWVhbih6KSkpIHw+IHN1bSgpCn0pCgojIEJldHdlZW4tY2x1c3RlciBzdW0gb2Ygc3F1YXJlcwpCU1MgPC0gVFNTIC0gV1NTCgpzc190YWJsZSA8LSBkYXRhLmZyYW1lKAogIFZhcmlhYmxlICAgICA9IHZhcl9uYW1lcywKICBUU1MgICAgICAgICAgPSBUU1MsCiAgV1NTICAgICAgICAgID0gV1NTLAogIEJTUyAgICAgICAgICA9IEJTUywKICBQcm9wX0JldHdlZW4gPSBCU1MgLyBUU1MKKQoKc3NfdGFibGUKYGBgCk5hIHrDoWtsYWRlIHRhYnXEvmt5IFRTUywgV1NTIGEgQlNTIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgbmFqdnnFocWhw60gcG9kaWVsIG1lZHppLWtsYXN0cm92ZWogdmFyaWFiaWxpdHkgZG9zYWh1amUgcHJlbWVubsOhIExpZmUuTGFkZGVyLCBrdG9yw6EgamUgesOhcm92ZcWIIG5hamxlcMWhw61tIHNlcGFyw6F0b3JvbSB6aGx1a292LiBOYXNsZWR1amUgcHJlbWVubsOhIExvZy5HRFAucGVyLmNhcGl0YSwgxI1vIG5hem5hxI11amUsIMW+ZSBla29ub21pY2vDoSDDunJvdmXFiCBrcmFqw61uIHbDvXpuYW1uZSBvdnBseXbFiHVqZSBpY2ggemFyYWRlbmllIGRvIGtsYXN0cm92LiBTdHJlZG7DuiBzZXBhcmHEjW7DuiBzaWx1IHZ5a2F6dWplIHByZW1lbm7DoSBTb2NpYWwuc3VwcG9ydCwgemF0aWHEviDEjW8gcHJlbWVubsOhIEZyZWVkb20udG8ubWFrZS5saWZlLmNob2ljZXMgZGlzcG9udWplIG5ham5pxb7FocOtbSBwb2RpZWxvbSBtZWR6aS1rbGFzdHJvdmVqIHZhcmlhYmlsaXR5LiBUw6F0byBwcmVtZW5uw6EgdGVkYSBuZXByaXNwaWV2YSBrIHR2b3JiZSB6aGx1a292IHRhayB2w71yYXpuZSBhIGplaiBwcsOtcGFkbsOpIG9kc3Ryw6FuZW5pZSBieSDFoXRydWt0w7pydSBrbGFzaWZpa8OhY2llIHByYXZkZXBvZG9ibmUgcG9kc3RhdG5lIG5lem1lbmlsby4KCkNlbnRyb2lkeToKYGBge3J9CmNlbnRyb2lkeSA8LSBkYXRhLmZyYW1lKAogIFgsCiAgQ2x1c3RlciA9IGZhY3RvcihrbGFzdGVyX21lbWJlcnNoaXApCikgJT4lCiAgZ3JvdXBfYnkoQ2x1c3RlcikgJT4lCiAgc3VtbWFyaXNlKAogICAgYWNyb3NzKAogICAgICAuY29scyAgPSB3aGVyZShpcy5udW1lcmljKSwKICAgICAgLmZucyAgID0gbGlzdChtZWFuID0gfiBtZWFuKC54KSksCiAgICAgIC5uYW1lcyA9ICJ7LmNvbH1fey5mbn0iCiAgICApCiAgKQpgYGAKWmhsdWtvdsOhIGFuYWzDvXphIG5hIHrDoWtsYWRlIGNlbnRyb2lkb3YgaWRlbnRpZmlrb3ZhbGEgdHJpIHbDvXJhem5lIG9kbGnFoW7DqSBza3VwaW55IGtyYWrDrW4uIFBydsO9IGtsYXN0ZXIgemRydcW+dWplIGtyYWppbnkgcyBuw616a3ltIEhEUCwgc2xhYm91IHNvY2nDoWxub3Ugb3Bvcm91IGEgbmFqbmnFvsWhb3UgbWllcm91IMW+aXZvdG5laiBzcG9rb2pub3N0aS4gRHJ1aMO9IGtsYXN0ZXIgdHZvcmlhIHN0cmVkbmUgcm96dmludXTDqSBrcmFqaW55LCBrdG9yw6kgZG9zYWh1asO6IHByaWVtZXJuw6kgaG9kbm90eSB2byB2xaFldGvDvWNoIHVrYXpvdmF0ZcS+b2NoLiBUcmV0w60ga2xhc3RlciB6YWjFlcWIYSBuYWp2eXNwZWxlasWhaWUgZWtvbm9taWt5IHMgbmFqdnnFocWhw61taSBob2Rub3RhbWkgTGlmZSBMYWRkZXIsIHNpbG5vdSBzb2Npw6Fsbm91IG9wb3JvdSBhIHZ5c29rb3UgbWllcm91IHNsb2JvZHkgcm96aG9kb3ZhbmlhLiBUaWV0byB2w71zbGVka3kgcG90dnJkenVqw7osIMW+ZSBla29ub21pY2vDvSByb3p2b2ogYSBzb2Npw6FsbmUgaW7FoXRpdMO6Y2llIHbDvXpuYW1uZSBzw7p2aXNpYSBzbyBzdWJqZWt0w612bnltIGhvZG5vdGVuw61tIHNwb2tvam5vc3RpIHNvIMW+aXZvdG9tLgo=